※ 이번 포스트는 <스프링부트와 AWS로 혼자 구현하는 웹서비스> 책의 3장을 공부하면서 정리한 것입니다.
JPA란?
서로 지향하는 바가 다른 객체 지향 프로그래밍 언어와 관계형 데이터베이스의 중간에서 패러다임 일치를 시켜주는 기술.
=> 개발자가 객체지향 프로그래밍을 하면, 이에 맞게 JPA가 SQL을 생성하여 실행해줌! 더는 SQL에 종속적인 개발을 하지 않아도 된다는 장점이 있다
- Spring Data JPA의 장점
1. 구현체 교체의 용이성 ( Hibernate외에 다른 구현체로 쉽게 교체 가능)
2. 저장소 교체의 용이성 (관계형 데이터베이스 외에 다른 저장소로 쉽게 교체 가능 -> 의존성만 교체하면 된다!)
JPA Entity 클래스 생성 시 주의사항
- Setter 메소드를 만들지 않는다
getter, setter를 무작정 생성할 경우 해당 클래스의 인스턴스 값들이 언제, 어디서 변해야 하는지 코드상을 명확하게 구분할 수가 없다.
=> 일반적으로는 생성자를 통해 최종값을 채운 후 DB에 삽입하고 값 변경이 필요한 경우 해당 이벤트에 맞는 public 메소드를 호출하여 변경
=> 하지만 빌더 클래스(@Builder)를 이용하는 방법도 있다!
Example.builder()
.a(a)
.b(b)
.build();
위와 같은 빌더 패턴을 사용하면 어느 필드에 어떤 값을 넣어야 할지 명확하게 알 수 있다
- Request/Response 클래스로 사용하지 않는다
Entity 클래스는 DB와 맞닿은 핵심 클래스이기 때문에 자주 변경하는 것은 옳지 않다. Request, Response용 Dto는 View를 위한 클래스이므로 자주 변경이 필요하기 때문에, Entity 클래스와 Controller에서 사용할 Dto는 분리해서 사용해야 한다.
Spring의 웹 계층

- Web Layer
컨트롤러, JSP/Freemarker 등의 뷰 템플릿 영역. 필터, 인터셉터, 컨트롤러 어드바이스 등 외부 요청과 응답에 대한 전반적인 영역을 다룬다.
- Service Layer
@Service에 사용되는 서비스 영역으로, Controller와 Dao의 중간 영역에서 주로 사용된다. @Transactional이 사용되어야 하는 영역이기도.
- Repository Layer
데이터 저장소에 접근하는 영역.
- Dtos
계층 간 데이터 교환을 위한 객체의 영역.
- Domain Model
도메인이라 불리는 개발 대상을 모든 사람이 동일한 관점에서 이해할 수 있고 공유할 수 있도록 단순화 시킨 것. @Entity가 사용된 영역 역시 도메인 모델이다. 하지만 VO처럼 값 객체들도 이 영역에 해당하기 때문에, 무조건 DB테이블과 관계가 있어야만 하는 것은 아니다.
★비즈니스 로직 또한 도메인 모델에서 처리된다!★
Spring의 Bean
- Bean이란?
Spring IoC 컨테이너가 관리하는 JAVA 객체. ApplicationContext.getBean() 메소드로 얻을 수 있다.
- Spring에서 Bean을 주입하는 방식
1. @Autowired
2. setter
3. 생성자 (가장 권장하는 방식, 생성자를 직접 쓰지 않더라도 롬북의 @RequiredArgsConstructor 어노테이션을 사용해도 무방)
JPA의 영속성 컨텍스트
영속성 컨텍스트란 엔티티를 영구 저장하는 환경으로, JPA의 핵심 내용은 Entity가 영속성 컨텍스트에 포함되어 있는지 여부로 갈린다. JPA의 EntityManager가 활성화된 상태로 트랜젝션 안에서 데이터를 가져오면 해당 데이터는 영속성 컨텍스트가 유지된 상태인 것이다. 이 상태에서 데이터의 값을 변경하면, 트랜젝션이 끝나는 시점에 해당 테이블에 변경분을 반영한다. 이는 Entity 객테의 값만 변경할 경우 별도로 Update 쿼리를 날릴 필요가 없음을 의미하고, 이 개념을 Dirty Checking이라 한다.
JPA Auditing
JPA를 사용하여 도메인을 관계형 데이터베이스 테이블에 매핑할 때, 공통적으로 도메인들이 가지고 있는 field, column들이 존재한다. (ex. 생성일자, 수정일자 ...) 이는 곧 코드가 중복됨을 의미하는데, JPA Auditing을 사용하면 도메인을 영속성 컨텍스트에 저장하거나 조회 후 Updte를 하는 경우 자동으로 시간을 매핑하여 DB 테이블에 넣어준다.
'SpringBoot' 카테고리의 다른 글
Spring Security (1) | 2023.02.04 |
---|---|
Mustache로 화면 구성하기 (0) | 2023.02.04 |