GiYeong

JPA 영속성 컨텍스트 본문

CS/JPA

JPA 영속성 컨텍스트

gy2710 2022. 8. 31. 17:33

영속성 컨텍스트

엔티티를 영구적으로 저장하는 환경으로서, App과 DB 사이에서 객체를 보관하는 가상의 DB 역할을 한다.

엔티티 매니저가 영속성 컨텍스트에 엔티티를 보관하고 관리한다.

 

영속성 컨텍스트의 특징

  • 엔티티 매니저를 생성할 때 1개 생성된다.
  • 엔티티 매니저를 통해 영속성 컨텍스트에 접근하고 관리할 수 있다.
  • 영속성 컨텍스트는 엔티티를 식별자 값으로 구분한다.

엔티티의 생명주기

  • 비영속(new/transient) : 영속성 컨텍스트와 전혀 관계가 없는 상태
  • 영속(managed) : 영속성 컨텍스트에 저장된 상태
  • 준영속(detached) : 영속성 컨텍스트에 저장되어있다가 분리된 상태
  • 삭제(removed) : 삭제된 상태

 

영속성 컨텍스트 장점

  • 1차 캐시를 통한 성능 향상 : 엔티티 조회시 영속성 컨텍스트 내부에 있는 1차 캐시에서 먼저 조회하며, 있다면 바로 반환하지만 없으면 DB에서 조회하여 조회된 데이터로 엔티티를 생성하여 1차 캐시에 저장(영속상태로 만듦) 후 반환한다. 
  • 엔티티의 동일성 보장
  • 트랜잭션을 지원하는 쓰기 지연 : 엔티티 매니저는 트랜잭션을 커밋하기 직전까지 내부 쿼리 저장소에 INSERT, UPDATE, DELETE 쿼리를 모아두고, 커밋하는 시점에 모아둔 쿼리들을 DB에 전달한다. 이를 통해 성능을 최적화할 수 있다.
  • 변경감지 : JPA로 엔티티를 수정할 때는 단순히 엔티티를 조회해서 데이터를 변경하면 된다. 영속성 컨텍스트는 저장된 엔티티들의 변경사항을 감지하여 DB에 자동으로 반영한다.(플러시)
  • 지연로딩(Lazy Loading) : 연관관계가 매핑되어있는 엔티티를 조회할 때, 프록시를 반환하여 쿼리를 진짜 필요할 때 전송하는 기능

JPA 사용이유

  • SQL 중심적 개발에서 객체 중심적 개발이 가능하다.
  • 생산성이 증가한다 : DDL 문 자동생성, 간단한 CRUD 메서드, 반복적인 작업(SQL 작성, JDBC API 사용)을 대신 처리
  • 유지보수 및 리팩토링 용이 : JPA가 SQL을 처리하기 때문에 필드 변경이 용이
  • 객체와 RDB간의 패러다임 불일치 해결
  • 코드 가독성 증가

JPA 단점

  • 프로젝트의 규모가 크고 복잡하여 설계가 잘못되면 속도저하 및 일관성이 무너지는 문제점 발생
  • 복잡하고 무거운 쿼리는 속도를 위해 별도의 튜닝이 필요하기 때문에 SQL문을 쓰는게 유리한 상황이 발생할 수 있음

'CS > JPA' 카테고리의 다른 글

N + 1 문제  (0) 2022.08.31
JPA  (0) 2022.07.19
ORM  (0) 2022.07.19
Comments