본문 바로가기
프로그래밍/Spring

[JPA] 영속성 관리

by YuminK 2023. 8. 10.

JPA에서 중요한 2가지

1. 객체와 관계형 데이터베이스 매핑하기

2. 영속성 컨텍스트

 

영속성 컨텍스트

1. EntityManager.persist(entity)

2. JPA를 이해하는 가장 중요한 용어

3. "엔티티를 영구 저장하는 환경"

4. 영속성 컨텍스트는 논리적인 개념이다. (눈에 보이지 않음)

5. 엔티티 메지저를 통해 영속성 컨텍스트에 접근한다. 

 

엔티티의 생명주기

1. 비영속(new/transient)

영속성 컨텍스트와 전혀 관계가 없는 새로운 상태

 

2. 영속(managed)

영속성 컨텍스트에 관리되는 상태

 

3. 준영속(detached)

영속성 컨텍스트에 저장되었다가 분리된 상태

 

4. 삭제(removed)

삭제된 상태

영속성 컨텍스트의 이점

1. 1차 캐시 사용(같은 트랜잭션 내에서)

2. 동일성 보장

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

4. 변경 감지

5. 지연 로딩

커밋하는 시점에 모아다가 쿼리처리

객체지향스럽게 코드를 작성하고 commit하면 끝.

조회한 시점의 스냅샷을 비교하여 변경이 일어났다면 처리하는 메커니즘이 있다.

 

플러시(flush)

1. 변경 감지(dirty checking)

2. 수정된 엔티티, 쓰기 지연 SQL 저장소에 등록

3. 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송 (등록, 수정, 삭제 쿼리)

 

영속성 컨텍스트를 flush하는 방법

em.flush() - 직접 호출

트랜잭션 커밋 - 플러시 자동 호출

JPQL 쿼리 실행 - 플러시 자동 호출

 

JPQL을 사용하는 시점에 어떤 테이블을 조회할지 모르기 때문에, 일단 flush를 통해 데이터부터 처리한다. 

 

플러시 모드에는 FlusshModeType.AUTO와 FlushModeType.COMMIT이 있는데, 그냥 AUTO로 쓰자. 

 

준영속 상태

1. 영속이었다가 준영속 상태가 되는 경우

2. 영속 상태의 엔티티가 연속성 컨텍스트에서 분리(detached)

3. 영속성 컨텍스트가 제공하는 기능을 사용하지 못함

 

준영속 상태로 만드는 방법

1. em.detach(entity)

특정 엔티티만 준영속 상태로 전환

 

2. em.clear()

영속성 컨텍스트를 완전히 초기화

 

3. em.close()

영속성 컨텍스트를 종료

 

출처: 자바 ORM 표준 JPA 프로그래밍(김영한)

'프로그래밍 > Spring' 카테고리의 다른 글

[JPA] 프록시와 연관관계  (0) 2023.08.11
[JPA] 상속관계 매핑  (0) 2023.08.10
[JPA] 왜 JPA를 사용해야 하는가?  (0) 2023.08.10
[Spring] 스프링 MVC 구조  (0) 2023.08.10
[JPA] 테이블 연관관계 정리  (0) 2023.08.06

댓글