JPA란 자바 어플리케이션에서 관계형 데이터베이스 사용하는 방식을 정의한 인터페이스
Spring Data JPA는 Spring에서 제공하는 모듈 중 하나,
개발자가 JPA를 더 쉽고 편하게 사용할 수 있도록 도와준다.
-> JPA를 한 단계 추상화시킨 Repository 인터페이스 제공
ctrl shift b로 확인해보자..
build.gradle 의존성 추가 및 인터페이스만 정의해주게 되면 JPA CRUD를 바로 사용 가능
단, 영속성 컨텍스트 및 Dirty Checking 개념을 잘 이해하고 사용하지 않으면 데이터 손실 및 성능 이슈가 있을 수 있다.
즉, 트랜잭션 밖에서 데이터 변경은 반영X
Spring Data JPA 구현코드를 살펴보면,
변경이 일어나는 코드는 @Transactional이 이미 추가 되어있다.
즉, 구현코드를 정확히 이해하지 않고 사용시 문제가 발생할 수 있다.
영속성 컨텍스트는 entity를 저장하고 관리하는 저장소.
어플리케이션과 데이터베이스 사이에 entity를 보관하는 가상의 데이터베이스 같은 역할
Spring Data JPA에서 제공하는 save 메소드 구현 코드를 보면 em.persist를 통해 영속성 컨텍스트에 저장.
-> 이때 , entity는 영속상태
이미 영속상태인 경우 merge를 통해 덮어 쓴다.
memberA를 persist 하는 순간,
1차 캐시에 넣고 쓰기 지연 SQL 저장소에 쿼리를 만들어 쌓음.
memberB도 persist 하는 순간 동일한 과정,
commit 하는 순간 flush가 되며 DB에 반영
flush란 영속성 컨텍스트의 변경 내용을 DB에 반영하며, 1차 캐시를 지우지는 않음.
Dirty? 상태의 변화가 생긴 정도.
Dirty Checking이란, entity 상태 변경 검사
JPA에서 트랜잭션이 끝나는 시점에 변화가 있는 모든 entity 객체를 데이터 베이스에 자동으로 반영함
@MappedSuperclass // 엔티티의 공통 매핑 정보
@EntityListeners // 해당 클래스에 auditing 기능 포함
@CreatedDate // Entity가 생성되어 저장될 때 시간 자동 저장
@LastModifiedDate / Entity 값을 변경할 때 시간 Update