[ JPA ] 영속성 컨텍스트

5tr1ker·2023년 6월 13일
0

JPA

목록 보기
2/2
post-thumbnail

영속성 컨텍스트

영속성 컨텍스트란 엔티티를 영구 저장하는 환경을 말합니다. 영속성 컨텍스트는 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스와 같은 역할을 합니다. 엔티티 매니저를 통해 엔티티를 저장하거나 조회를 하면 엔티티 매니저는 영속성 컨텍스트에 해당 엔티티를 보관하고 관리합니다.

엔티티의 생명주기

  • 비영속 ( transient / new ) : 영속성 컨텍스트와 관련이 없는 상태

엔티티 객체를 생성했지만 영속성 컨텍스트가 관리되지 않는 상태를 말합니다.

  • 영속 ( managed ) : 영속성 컨텍스트에 저장된 상태

엔티티 객체를 생성하고 엔티티 매니저를 통해 엔티티를 영속성 컨텍스트에 저장된 상태를 말합니다.

  • 준영속 ( detached ) : 영속성 컨텍스트에 관리되다가 분리된 상태

영속성 컨텍스트에 의해 관리되고 있던 엔티티가 더이상 영속성 컨텍스트에 관리되지 않는 상태를 말합니다.

  • 삭제 ( removed ) : 삭제된 상태

엔티티를 영속성 컨텍스트와 데이터베이스에서 삭제합니다.

영속성 컨텍스트의 이점

영속성 컨텍스트를 이용하여 엔티티를 관리하면 다음과 같은 장점이 있습니다.

1차 캐시

영속성 컨텍스트 내부에는 1차 캐시가 존재합니다. 영속 상태의 엔티티를 보관하고 있으며, 엔티티를 탐색할 때 먼저 1차 캐시를 조회하게 되며 캐시에 존재하지 않을 경우 DB에서 조회하여 엔티티를 탐색합니다.

뿐만 아니라 1차 캐시로 반복 가능한 읽기 ( Repeatable-Read ) 수준의 트랜잭션 격리 수준을 데이터베이스가 아닌 어플리케이션에서 제공합니다.

동일성 보장

영속성 컨텍스트는 동일한 엔티티를 조회할 때 엔티티의 동일성을 보장합니다.

동일성 비교 : 인스턴스의 주소값을 비교한다. ==
동등성 비교 : 인스턴스의 내부 값을 비교한다. .equals()

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

엔티티를 조회하거나 저장할 때 DB에 바로 SQL 쿼리를 전송하는 것이 아니라, 트랜잭션을 커밋하기 전까지 쓰기 지연 SQL 저장소에 SQL 쿼리를 모아두었다가 커밋을 할 때 모아둔 SQl 쿼리를 전부 DB에 보냅니다. 이것을 트랜잭션을 지원하는 쓰기 지연이라 합니다.

변경 감지

JPA는 Flush 가 호출되었을때 영속 상태에 있는 엔티티의 스냅샷과 비교하여 변경된 필드를 탐색을 하고 적절한 Update SQL 문을 생성하여 쓰기 지연 SQL 저장소에 SQL를 저장합니다.
이 후 쓰기 지연 SQL 저장소에 있는 쿼리들을 DB에 보내어 커밋을 합니다.

지연 로딩

지연 로딩은 연관 관계에 있는 엔티티를 우선 프록시 객체를 반환하고, 실제로 사용되는 시점에 Select SQL 쿼리를 이용하여 탐색을하는 기능을 말합니다.

플러시 Flush

플러시는 영속성 컨텍스트에 변경사항을 데이터베이스에 반영합니다. 다시 말해 영속성 컨텍스트와 데이터베이스를 동기화하는 것을 말합니다.

플러시는 em.flush() 를 직접 실행하거나 , 트랜잭션이 커밋되거나 JPQL 코드가 실행되기 전에 자동으로 호출되며 플러시가 호출되었을 때 변경 감지가 동작하며 쓰기 지연 SQL 저장소에 있는 쿼리들을 데이터베이스에 전송합니다.

참고

참고 블로그 1 : https://velog.io/@neptunes032/JPA-%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8%EB%9E%80
참고 블로그 2 : https://code-lab1.tistory.com/290
참고 : 자바 ORM 표준 JPA 프로그래밍

profile
https://github.com/5tr1ker

0개의 댓글