김영한님의 강의를 복습하면서 평소 애매하게 알던 부분들을 기록하려고 합니다.
JPA가 ORM 기술에 대한 표준 명세 API 입니다.
JPA의 내부 동작 원리를 알기 위해 영속성 컨텍스트에 대해 학습하여야 합니다
JPA의 원리를 이해하기 위해 강사님은 Spring 없이 JPA로만 설명 합니다.
JPA의 알아야 될 2가지
1. ORM - 자바의 객체와 DB 테이블 사이의 매핑 관계
2. 영속성 컨텍스트 - JPA의 내부 동작 원리
엔티티매니저팩토리를 통해 엔티티 매니저를 생성합니다.
엔티티 매니저를 통해 영속성 컨텍스트에 접근할 수 있습니다.
영속성 컨텍스트
📍 JPA에서 가장 중요함
📍 "엔티티를 영구 저장하는 환경"이라는 뜻
📍 EntityManager.persist(entity); → DB에 저장하는게 아니라, persist는 엔티티를 영속성 컨텍스트라는 곳에 저장한다는 것임!
📍 눈에 보이지 않음
📍 엔티티 매니저를 통해 영속성 컨텍스트에 접근함
public class Jpamain {
public static void main( String[] args ) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try{
tx.commit();
} catch(Exception e){
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
기본적인 영속성 컨텍스트 틀 입니다.
엔티티의 생명주기
📍비영속 - 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
📍영속 - 영속성 컨텍스트에 관리되는 상태
📍준영속 - 영속성 컨텍스트에 저장되었다가 분리된 상태
📍삭제 - 말 그대로 삭제
비영속
위의 코드를 보면 그저 객체를 생성하기만 한 상태여서 비영속 상태입니다.
영속
여기서는 persist()메서드를 통해 영속 컨텍스트에 member를 관리하도록 추가하였습니다.
중요한 점은!! persist를 호출한다고 해서 DB에 접근하는 것이 아닙니다. 아직 영속 컨텍스트 단에서 관리 중입니다.
준영속, 삭제
detach를 통해 엔티티를 영속성 컨텍스트에서 분리 합니다, 이를 준영속 상태라고 합니다.
remove는 말 그대로 삭제 합니다.
엔티티 조회, 1차 캐시
member를 찾을 때 먼저 DB를 조회하지 않고 1차 캐시를 조회합니다.
em.persist();
persist로 영속컨텍스트에 엔티티를 가져오고나서 1차 캐시에 저장을 합니다.
쓰기 지연 SQL 저장소에 쿼리문을 생성하여 저장합니다.
transaction.commit()
transaction.commit을 통해 DB에 데이터를 보냅니다.
엔티티 수정
변경 감지(더티 체킹) 기능으로 엔티티를 변경할 수 있습니다.
수정이라 하니까 update()와 같은 메서드가 필요할 거라고 생각하는데
필요 없습니다!
그 이유를 살펴봅시다
영속 컨텍스트에 들어온 초기 상태를 스냅샷이라고 합니다.
JPA가 Entity와 스냅샷을 비교하면서 변경 사항이 있다면 쓰기 지연 SQL 저장소에 UPDATE 쿼리문을 생성합니다.
이후 DB에 commit시 전달해줍니다.
플러시
영속성 컨텍스트의 변경내용을 데이터베이스에 반영 합니다.
여기서 많은 분이 헷갈리는 부분이 flush호출시 1차 캐시에 있는 내용이 사라진다고 생각합니다.
그냥 현재 있는 쓰기 지연 SQL 저장소에 있는 쿼리문을 db에 전달만 한다고 알아두면 됩니다!
출처 : 자바 ORM 표준 JPA 프로그래밍 - 기본편 / 영속성 관리 - 내부 동작 방식
'개발' 카테고리의 다른 글
[Spring Boot] AccessToken, RefreshToken을 이용한 로그인 구현 (0) | 2023.07.22 |
---|---|
[Spring Boot] jwt로 로그인, 회원가입 API 구현 (0) | 2023.07.07 |
[Spring Boot] Security + jwt로 인증, 인가 구현하기 (1) | 2023.07.06 |
session, cookie, jwt 관계 및 정리 (1) | 2023.07.01 |
[Spring Boot] 회원 정보 조회 및 삭제 (0) | 2023.02.12 |