Question
- 영속성 컨텍스트의 1차캐시에 대해 설명하시오
- 영속성 컨텍스트의 변경 감지에 대해 설명하시오
- 플러시 호출 방법 3가지를 설명하시오
영속성 컨텍스트
- 엔티티를 영구 저장하는 환경
- EntityManager.persist(entity) 이런식으로 사용
영속성 컨텍스트의 생명주기

- 비영속(new/transient): 영속성 컨텍스트와는 전혀 관계가 없는 새로운 상태
- 영속(managed): 영속성 컨텍스트에 관리되는 상태
- 준영속(detached): 영속성 컨텍스트에 저장되었다가 분리된 상태
- 삭제(removed): 삭제된 상태
영속성 컨텍스트의 이점
- 1차 캐시 역할
- 값 조회시 영속성 컨텍스트에 값이 있으면 DB를 갔다오지 않고 영속성 컨텍스트에서 캐싱 가능
- 이 캐싱은 트랜잭션 내에서만 유효하므로 엄청난 이점까지는 아님

- 영속 엔티티의 동일성 보장
- 위 그림과 같이 영속성 컨텍스트에서 꺼낸 객체의 동일성을 보장함
- 트랜잭션을 지원하는 쓰기 지연
- DB에 써야 하는 요청에 대해 쓰기 지연 SQL 저장소에 모아놓고 트랜잭션 커밋시 한 번에 모아서 보냄
- 이는, IO 작업의 빈도를 줄여 성능을 높임
- 변경 감지
- 영속석 컨텍스트 안에 있는 엔티티의 상태를 지속적으로 추적하며, 발생하는 모든 변경 사항은 JPA에 의해 자동으로 추적됨
- 따라서, em.update와 같은 작업을 해주지 않아도 자동으로 영속성 컨텍스트가 동기화되며 추후 자동으로 DB를 업데이트 시킴
- 지연 로딩
플러시
- 영속성 컨텍스트의 변경 사항와 DB를 동기화시키는 작업
- 영속성 컨텍스트를 비우는 것은 아님(flush라는 용어 때문에 헷갈리면 안됨)
- 호출 방법
- em.flush()로 직접 호출
- 트랜잭션 커밋시 자동 호출
- JPQL 쿼리 실행시 자동 호출
- JPQL 쿼리 실행시 플러시 자동 호출 이유
- JPQL 쿼리 실행시 영속성 컨텍스트와 DB간 불일치가 있을 수 있기 때문에 플러시 이후 JPQL 쿼리 수행을 위해
- 플러시 모드 옵션
- em.setFlushMode(FlushModeType.AUTO): 커밋이나 JPQL 쿼리를 실행할 때 플러시(기본)
- em.setFlushMode(FlushModeType.COMMIT): 트랜잭션이 커밋될 때만 플러시가 발생 (JPQL 때 플러시 X)
- 일반적으로 AUTO 모드로 사용함
준영속 상태
- 준영속 상태로 만드는 명령어
- em.detach(entity): 특정 엔티티만 준영속 상태로 전환
- em.clear(): 영속성 컨텍스트를 완전히 초기화
- em.close() 영속성 컨텍스트를 종료
- 실제로 준영속 상태를 활용할 일은 많지 않음.
'김영한의 ORM 표준 JPA 프로그래밍(기본편)' 카테고리의 다른 글
| 김영한의 ORM 표준 JPA 프로그래밍(기본편) - 상속관계 맵핑과 - @MappedSuperclass (1) | 2025.02.06 |
|---|---|
| 김영한의 ORM 표준 JPA 프로그래밍(기본편) - 다대일, 일대다, 일대일, 다대다 (1) | 2025.02.05 |
| 김영한의 ORM 표준 JPA 프로그래밍(기본편) - 연관관계 단방향 맵핑, 양방향 맵핑 (1) | 2025.02.05 |
| 김영한의 ORM 표준 JPA 프로그래밍(기본편) - 연관관계맵핑과 Primary Key (2) | 2025.02.05 |
| 김영한의 ORM 표준 JPA 프로그래밍(기본편) - JPA, Hibernate, JPQL (4) | 2025.02.04 |