-
JPA & SpringBoot 개념 및 정리Spring & SpringBoot 2023. 3. 24. 13:35
* '스프링부트와 AWS로 혼자 구현하는 웹 서비스' 를 공부하며 정리한 내용입니다.
ㅁ JPA 는 "인터페이스"이므로 구현체가 필요함
: 대표적으로 JPA ← Hibernate ← Spring Data JPA
Hibernate 를 직접 쓰지 않는 이유는 구현체, 저장소가 교체될 때 유용하려고
ㅁ Entity 클래스에 Setter 메소드를 무작정 생성하지 말 것.
-> 해당 필드의 값 변경이 필요하면 @Builder 를 통해 지정하여 변경하기.
Spring 웹 계층

Web 계층
: 컨트롤러(@Controller) 와 JSP 등의 뷰 템플릿 영역
: 필터, 인터셉터, 컨트롤러 어드바이스 등 외부 요청과 응답에 대한 전반적인 영역
Service 계층
: @Service 에 사용되는 서비스 영역
: 일반적으로 Controller, Dao 중간 영역에서 사용
: @Transactional 이 사용되어야 하는 영역.
즉 , 트랜잭션과 도메인 간의 순서만 보장!!!
Repository 계층
: Database 등 데이터 저장소에 접근하는 영역 (Dao)
Dtos 계층
: 계층 간 데이터 교환을 위한 객체의 영역
: 뷰 템플릿 엔진에 사용될 객체 & Repository Layer에서 결과로 넘겨준 객체 등
Domain Model 계층
: 도메인이라 불리는 개발 대상을 모든 사람이 동일한 관점에서 이해할 수 있고 공유할 수 있도록 단순화 시킨 것
: @Entity 가 사용된 영역
: 무조건 database 의 테이블과 관계가 있어야하는 것은 아님.
JPA 데이터 영속성 컨텍스트
: 엔티티를 영구 저장하는 환경
: JPA의 엔티티 매니저가 활성화된 상태로 (Spring Data Jpa를 쓴다면 기본 옵션임) 트랜잭션 안에서 데이터베이스에서 데이터를 가져오면 이 데이터는 영속성 컨텍스트가 유지된 상태임
→ 이 상태에서 데이터 값을 변경하면 트랜잭션이 끝나는 시점에서 해당 테이블에 변경분을 반영함
즉, Entity 객체의 값만 변경하면 별도록 update 쿼리를 날릴 필요가 없음 : 더티 체킹
: 객체 지향적인 특성
Service
@Transactional public Long update(Long id, PostsUpdateRequestDto requestDto){ Posts posts = postsRepository.findById(id).orElseThrow( ()-> new IllegalArgumentException("해당 게시글이 없습니다. id : " + id )); posts.update(requestDto.getTitle(), requestDto.getContent()); return id; }Entity
@Getter @NoArgsConstructor @Entity public class Posts { // 중략 public void update(String title, String content){ this.title = title; this.content = content; } }이렇게 쿼리를 날리지 않아도 값이 update 된다.
서버 템플릿 엔진 VS 클라이언트 템플릿 엔진
템플릿 엔진이란?
: 지정된 템플릿 양식과 데이터가 합쳐져 HTML 문서를 출력하는 소프트웨어
서버 템플릿 엔진
: 서버에서 JAVA 코드로 문자열을 만든 뒤에 이 문자열을 HTML로 변환하여 브라우저로 전달
ex) JSP, Freemaker, Thymeleaf, mustache
클라이언트 템플릿 엔진
: 브라우저에서 화면을 생성. 즉 서버에서 이미 코드가 벗어난 경우
서버에서 Json / Xml 형식의 데이터만 전달하고 클라이언트에서 조립한다.
ex) React, Vue
'Spring & SpringBoot' 카테고리의 다른 글
로그에서 sql 쿼리 파라미터 확인 하는 법 (1) 2023.10.22