-
JPA(Java Persistence API)동작 방식SPRING/JPA 2021. 10. 10. 22:57반응형
JPA에서 가장 중요한 2가지
1. 객체와 관계형 데이터베이스 매핑하기
2. 영속성 컨텍스트
엔티티 매니저 팩토리와 엔티티 매니저
- 엔티티(Entity) : 데이터베이스의 테이블에 대응하는 클래스라고 생각하면 됩니다.
- 엔티티 매니저 : 영속성 컨텍스트에 접근하여 엔티티에 대한 데이터베이스 작업을 제공합니다.
내부적으로 데이터베이스 커넥션을 사용해서 데이터베이스에 접근합니다.
- 엔티니 매니저 팩토리 : 엔티티 매니저 인스턴스를 관리하는 주체입니다. 애플리케이션 실행 시 한 개만 만들어지며 자용자로부터 요청이 오면 엔티티 매니저 팩토리로부터 엔티티 매니저를 생성합니다.
@Entity가 붙은 클래스는 JPA에서 관리합니다.
@Id: 데이터베이스 PK와 매핑
엔티티 생명주기
엔티티의 생명주기
• 비영속 (new/transient)
영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
• 영속 (managed)
엔티티가 영속성 컨텍스트에 저장된 상태로 영속성 컨텍스트에 의해 관리되는 상태 영속 상태에서 데이터베이스에 저장되지 않으며, 트랜잭션 커밋 시점에 데이터베이스에 반영
• 준영속 (detached)
영속성 컨텍스트에 저장되었다가 분리된 상태
• 삭제 (removed)
영속성 컨텍스트와 데이터베이스에서 삭제된 상태
예시 코드 보기22_Line : 영속성 컨텍스트에 저장할 상품 엔티티를 하나 생성합니다. (현재는 영속성 컨텍스트와 무관한 상태)
31_Line : EntityTransaction 인스턴스를 반환합니다.
32_Line : 엔티티 매니저는 데이터 변경 시 데이터의 무결성을 위해 반드시 트랜잭션을 시작해야 합니다.
34_Line : 생성한 상품 엔티티가 영속성 컨텍스트에 저장된 상태입니다.
35_Line : 트랜잭션을 데이터베이스에 반영합니다. , 이때 영속성 컨텍스트에 저장된 정보들을 데이터베이스에 INSERT 되면서 반영됩니다.
37,38_Line : 사용한 자원을 반환합니다.
영속성 컨텍스트의 이점
• 1차 캐시
영속성 컨텍스트에는 1차 캐시가 존재하며 Map <KEY, VALUE>로 저장됩니다.
entityManager.find() 메소드 호출 시 영속성 컨텍스트의 1차 캐시를 조회합니다.
엔티티가 존재할 경우 해당 엔티티를 반환하고, 엔티티가 없으면 데이터베이스에서 조회 후 1차 캐시에 저장 및 반환합니다.
• 동일성(identity) 보장
하나의 트랜잭션에서 같은 키값으로 영속성 컨텍스트에 저장된 엔티티 조회 시 같은 엔티티 조회를 보장합니다.
바로 1차 캐시에 저장된 엔티티를 조회하기 때문입니다.
• 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind)영속성 컨텍스트에는 쓰기 지연 SQL 저장소가 존재합니다.
entityManager.persist()를 호출하면 1차 캐시에 저장되는 것과 동시에 쓰기 지연 SQL저장소에 SQL문이 저장됩니다.
이렇게 SQL을 쌓아두고 트랜잭션을 커밋하는 시점에 저장된 SQL문들이 flush 되면서 데이터베이스에 반영됩니다.
이렇게 SQL문들을 모아서 한 번에 보내기 때문에 성능에서 이점을 볼 수 있습니다.
(네트워크 호출 한 번은 단순한 메서드를 수만 번 호출하는 것보다 더 큰 비용이 든다)
• 변경 감지(Dirty Checking)JPA는 1차 캐시에 데이터베이스에서 처음 불러온 엔티티의 스냅샷 값을 가지고 있습니다.
1차 캐시에 저장된 엔티티와 스냅샷 비교 후 변경 내용이 있다면 UPDATE SQL문을 쓰기 지연 SQL저장소에 담아둡니다. 그리고 데이터베이스에 커밋 시점에 변경 내용을 자동으로 반영합니다.
즉, 따로 update문을 호출할 필요가 없습니다.
참고 : https://www.inflearn.com/course/ORM-JPA-Basic (김영한 님의 기본 JPA) ,
https://roadbook.co.kr/260(변구훈 님)반응형'SPRING > JPA' 카테고리의 다른 글
@EntityGraph 사용법 (7) 2021.12.06 페치조인(fetch Join )이란 (6) 2021.12.03 Spring Data JPA(쿼리 메소드) (0) 2021.10.11 JPA(Java Persistence API)의 시작 (6) 2021.10.10