Closed injoon2019 closed 2 years ago
고객의 요청이 올때마다 EntityManager를 만들고, EntityManager는 커넥션 풀을 이용한다.
EntityManager마다 영속성 컨텍스트를 가지고 있다 (나중에 스프링에서는 N:1로 이용한다)
코드에서 persist를 했을 때 실제 DB에 변경이 생기는 것이 아니라 엔티티를 영속화하는 것이다. 영속 컨텍스트 캐시에서 변경이 생긴다. 조회를 하면 우선 1차캐시에서 찾고, 없으면 DB에서 가져온다. 캐시에서 가져오므로 DB에 쿼리가 안나간다.
persist
캐시에서 꺼내기 때문에 동일성 보장이 가능해진다.
쓰기 지연 SQL 저장소에 쌓아놨다가 커밋을 하는 순간 모아뒀던 것을 한번에 날린다.
커밋하기전 엔티티와 스냅샷(영속성 컨텍스트에 최초로 들어온 상태)를 비교한다. 커밋되는 시점에 비교해서 데이터에 변경이 일어났으면 반영해준다.
1. 왜 JPA를 써야 하는가
2. JPA 구동 방식
고객의 요청이 올때마다 EntityManager를 만들고, EntityManager는 커넥션 풀을 이용한다.
3. 영속성 컨텍스트
EntityManager마다 영속성 컨텍스트를 가지고 있다 (나중에 스프링에서는 N:1로 이용한다)
3.1 엔티티의 생명주기
3.2 영속성 컨텍스트의 이점
1. 1차 캐시
코드에서
persist
를 했을 때 실제 DB에 변경이 생기는 것이 아니라 엔티티를 영속화하는 것이다. 영속 컨텍스트 캐시에서 변경이 생긴다. 조회를 하면 우선 1차캐시에서 찾고, 없으면 DB에서 가져온다. 캐시에서 가져오므로 DB에 쿼리가 안나간다.2. 동일성 보장
캐시에서 꺼내기 때문에 동일성 보장이 가능해진다.
3. 트랜잭션을 지원하는 쓰기 지연
쓰기 지연 SQL 저장소에 쌓아놨다가 커밋을 하는 순간 모아뒀던 것을 한번에 날린다.
4. 변경 감지
커밋하기전 엔티티와 스냅샷(영속성 컨텍스트에 최초로 들어온 상태)를 비교한다. 커밋되는 시점에 비교해서 데이터에 변경이 일어났으면 반영해준다.