티스토리 뷰

안녕하세요 강정호입니다. 오늘은 영속성 컨텍스트에 대해 공부해 볼게요.

JPA를 이해하기 위해서는 영속성 컨텍스트와 엔티티 매니저에 대한 이해가 필수입니다.




영속성 컨텍스트란?


- Server side와 Database 사이에 엔티티를 저장하는 논리적인 영역이라고 할 수 있다. 엔티티 매니저로 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.


- 영속성 컨텍스트는 엔티티 매니저(Session)를 생성할 때 하나 만들어진다. 그리고 엔티티 매니저(Session)을 통해서 영속성 컨텍스트에 접근할 수 있고 영속성 컨텍스트를 관리할 수 있다.





영속성 컨텍스트가 왜 좋은가?


1차 캐시

- Map 객체로 저장 : 엔티티를 식별자 값(@Id 맵핑)으로 구분한다. Key-value로 관리하는데 이때 key 값이 @Id 값이 된다.

- 식별자 값 필요 : 영속상태의 엔티티는 반드시 식별자 값이 있어야 한다.


동일성 보장

- 동일한 객체 반환 : Collection에서 객체를 빼오듯이 같은 객체를 반환하게 되면 새로운 객체가 나오는 것이 아니라 동일한 객체가 반환된다.


변경 감지

- 자동 Update : 영속성 상태의 객체는 객체의 데이터가 변경이 되면, 자동 update 된다.

- EntityManager에서 flush가 되고, commit이 됩니다.


** flush가 되는 시점

1) 강제 Flush : EntityManager.flush()

2) 트랜잭션 종료시 : 영속성 컨텍스트는 트랜잭션 범위로 만들어지기 때문이다.

3) JPQL 쿼리 실행 : JPQL은 실제 Database side에서 데이터를 가져오기 때문에 동기화를 위해 JPQL 쿼리가 실행 전에 flush 된다.


트랜잭션으로 인한 쓰기 지연

- 쓰기 지연 : 영속성 컨텍스트는 트랜잭션 범위 안에서 동작한다. 그래서 트랜잭션이 끝나야 Commit이 이루어지고 반영된다.


Lazy 로딩

- N+1 쿼리라고 부른다. 엔티티와 관계가 맺어진 엔티티의 데이터를 가져올 수 있다.

** 성능저하의 원인이 될 수도 있다.




참고 링크 : 엔티티 매니저



엔티티 매니저란 무엇인가?



댓글