[JPA] 영속성 컨텍스트

원모어깨찰빵·2024년 2월 29일
0

스프링

목록 보기
4/17

영속성 컨텍스트와 엔티티 매니저

영속성 컨텍스트는 엔티티를 영구 저장하는 환경이다.
눈에 보이지 않는 논리적인 개념이며, 엔티티 매니저를 통하여 영속성 컨텍스트에 접근할 수 있다.

JPA는 각 요청마다 스레드를 생성하고, Entity Manager Factory에서 Entity Manager을 생성하여 연결한다.
그렇게 생성된 Entity Manager은 커넥션 풀을 사용하여 DB와 연결된다.

Spring에서 같은 트랜잭션의 범위 내에 존재하는 Entity Manager은 같은 영속성 컨텍스트에 접근한다.

엔티티의 생명주기

엔티티의 상태 4가지 상태
1. 비영속(new/transient)
2. 영속(managed)
3. 준영속(detached)
4. 삭제(removed)

영속성 컨텍스트의 이점

애플리케이션과 DB 사이에 존재하는 영속성 컨텍스트들 다음의 이점들을 가져와준다.

1. 1차캐시

영속성 컨텍스트 내부에 존재하는 1차 캐시는 key로 @ID 필드값, value로 엔티티 객체를 저장한다.
캐시에 존재하는 엔티티는 DB에 접근하지 않고 사용할 수 있다.
1차 캐시는 공유되지 않으며, 스레드당 1개씩 존재하다 스레드가 종료되면 사라진다.

2. 동일성 보장

같은 영속성 컨텍스트에서 사용하는 영속 엔티티는 동일성을 보장한다.

3. 트랜잭션을 지원하는 쓰기 지연

트랜잭션 내부에서 persist()가 발생하면 엔티티를 1차 캐시에 저장해두고, 쓰기 지연 SQL 저장소에서 INSERT쿼리를 생성하여 임시 저장해두고 flush()되는 시점에 DB에 쿼리를 보낸다.
DB와 영속성 컨텍스트의 싱크를 맞추는 과정이 flush()고, 트랜잭션이 종료되는 것이 commit()이다.
즉, 트랜잭션이 종료(커밋)되면 flush()와 commit()이 작동한다.

4. 변경 감지(엔티티 수정)

영속 상태의 엔티티에 변경사항이 생기면 따로 update()나 persist()해줄 필요 없이 트랜잭션이 commit되면 자동으로 업데이트 쿼리가 나간다.
즉, 1차 캐시에서 엔티티를 저장할 때 스냅샷을 저장해두고 commit() 혹은 flush()가 발생할 때 엔티티와 스냅샷을 비교하여 변경사항을 DB에 반영한다.

Reference : https://ict-nroo.tistory.com/130

profile
https://fuzzy-hose-356.notion.site/1ee34212ee2d42bdbb3c4a258a672612

0개의 댓글