nathan_H

[JPA] 영속성 컨텍스트 란? 본문

Web/Spring

[JPA] 영속성 컨텍스트 란?

nathan_H 2020. 3. 23. 23:21

자바 스프링을 활용하다 보면은 데이터 베이스를 통한 데이터 관리를 할때 항상 마주치는 도구로 JPA가 있다. 그리고 JPA의 개념중 일부인 "영속성 컨택스트"라는 용어를 자주 접하게 될텐데, 나 또한 처음 JPA를 사용할때는 제대로 이해하지 않은 상태에서 코드만 짜기 바빴다. 그러다 보니 나중에 에러나 디버깅을 할때 빠르게 문제점을 찾지 못했고, 제대로된 개념이 부족하다고 생각이 들어 이번 글을 통해 JPA의 매커니즘인 영속성 컨택스트에 대해 정리해볼까 한다.

 

 

Persistence Context


https://slideplayer.com/slide/11663617/ &  https://www.slideshare.net/RakeshKCherukuri/java-persistence-api-21

 

 

  • JPA 는 Persistence Context을 통해서 entity 에 대한 application의 lifecycle을 관리.
    • 그리고 EntityManager API 를 통해 entity instance의 영속성을 관리하는데, EntityManager에 있는 다양한 API 를 통해 Entity의 영속성을 생성, 삭제 하고 해당 Entity에 대한 Query 문을 생성해 조회, 수정에 대한 모든 Entity에 대한 생명주기를 관리하게 된다.
  • Persistence Context에 올라간 entity들을 데이터베이스에 저장하거나 가져오는 역활을 하는 1차 캐시 역활을 하는것이다.
    • Entity 란? 데이터 베이스 테이블과 매핑하는 하나의 객체.
  • 즉, JPA 는 Persistence Context라는 Layer를 만들어 데이터 베이스의 테이블과 그에 매핑 되는 Entity에 대해 관리한다고 보면 된다.
    • Persistence Context는 눈에 보이지 않는 하나의 논리적 개념이라고 보면 된다.

Entity Life Cycle


https://slideplayer.com/slide/11663617/

 

  • 앞서 말한 거 처럼 application에서의 Entity는 Persistance context에 의해 생명주기가 관리가 되는데, Entity의 생명 주기는 크게 4가지 구성되어 있다.
  1. 비영속

    • 영속성 컨텍스트와 전혀 관계없는 형태.
      • 엔티티 객체가 생성된 순수 객체 상태로 영속성 컨텍스트 그리고 데이터 베이스와 전혀 관계가 없는 상태이다.
  2. 영속

    EntityManager.persist(user)
    • 영속성 컨텍스트에 의해 관리되는 상태
      • 엔티티 매니저를 통해 영속성 컨텍스트가 엔티티를 관리하는 상태.
  3. 준영속

    • 영속성 컨텍스트에 저장되었다가 분리된 상태
      • 관리하던 엔티티를 영속성 컨텍스트에서 더이상 관리하지 않는 상태

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

        EntityManager.detach(entity) EntityManager.close() EntityManager.clear()

  4. 삭제

    • 삭제된 상태

      EntityManager.remove(entity)

그리고 참고로 영속성 컨텍스트가 관리하는 엔티티에 대한 정보가 데이터 베이스가 들어가는 시점 트랜잭션이 커밋 혹은 flush를 직접 해야 한영이 된다. 즉 영속성 컨텍스트 안에서 있는 상태에서는 데이터 베이스에 반영되지 않는다는 점을 주의해야 한다.

 

영속성 컨텍스트의 장점


 

1차 캐시


  • EntityManager API 를 통해 엔티티를 조회하는 경우 디비에서 바로 직접 찾는 것이 아니라 1차 캐시에서 먼저 조회를 시도하는데, 이때 1차 캐시에 해당 엔티티가 존재하면 데이터 베이스의 쿼리가 안나가고 캐시에서 바로 반환해서 값을 조회한다.
  • 또한 데이터 베이스에서 한번 조회된 값 또한 1차 캐시를 통해 저장된 후 반한되기 때문에 영속성 컨택스트 안에 캐시가 보장된 상태에서 다시 똑같은 값을 조회하는 경우 바로 1차 캐시에서 조회 함으로 성능의 이점을 가져다 줄 수 있다.
  • 그러나 실제 어플리케이션에서의 비즈니스 로직은 하나 끝나면 바로 엔티티 영속성은 날라가기 때문에 그때 캐시도 함께 날라가 실제 큰 성능에서의 이점을 주지는 않는다.

1차 캐시란? 영속성 컨택스트는 내부에 캐시를 가지고 있는데 이것을 바로 1차 캐시라고 함.

 

동일성 보장


  • 영속성 컨택스트는 1차 캐시를 통해 영속상태의 엔티티를 이곳에 모두 저장하고 관리하는데, 이때 반복 가능한 읽기 등급의 격리 수준을 데이터베이스가 아닌 애플리케이션에서 관리하기 때문에 영속 엔티티에 대한 "동일성"이 보장이 된다.

    • 영속성 컨텍스트 내부에 Map 을 통해 키는 @Id 로 매핑한 식별자고 값은 엔티티 컨텍스트 인 것이다.

     

  • 위 예시에서 식별자가 같은 엔티티를 2번 조회시 영속성 컨택스트에 1차 캐시를 통해 같은 엔티티를 반환해 같은 인스턴스로 취급해 동일성이 보장이 된다.

User a = em.find(User.class, "user1"); User b = em.find(User.class, "user1");

System.out.println(a == b);

 

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


https://happyer16.tistory.com/entry/영속성-관리-persistence

 

  • 영속성 컨텍스트는 1차 캐시와 SQL 저장소를 통해 엔티티에 대한 캐시와 sql 문을 관리해 바로바로 실제 디비에 반영하는 것이 아니라 트랜잭션 커밋이 일어나는 시점에 한번에 반영이 된다. 이로 인해 DB의 성능을 높일 수 있고 캐시에서 변경된 내용도 감지도 할 수 있다.

변경 감지 (Dirty Checking)


https://happyer16.tistory.com/entry/영속성-관리-persistence

 

 

User a = em.find(User.class, "user1");
a.setName("nathan"); 
a.setAge(20);
  • 그리고 실제 자바 Collection 처럼 값만 바꿨지만 실제 디비에 대한 Update 문을 만들지 않아도 수정이 알아서 이루어진다.

    • 참고로 이때 Persist를 호출 안하는게 맞다. 왜냐하면 엔티티 값이 변경이 되면 JPA는 트랜잭션 커밋하는 시점에 알아서 UPDATE 문을 날리기 때문이다.

 

참고 자료

JPA 3장. 영속성 관리 ( persistence )

 

JPA 3장. 영속성 관리 ( persistence )

JPA에서 제공해주는 기능은 크게 2가지이다. @Entity와 Table을 매핑하는 설계 부분 매핑한 @Entity를 실제로 사용하는 부분 ( CRUD ) Spring Boot 프로젝트를 할 때 @Entity 어노테이션을 명시만 해봤는데, 이번..

happyer16.tistory.com

Data Persistence Layer - ppt download

 

Data Persistence Layer - ppt download

Content: Persistence I. Introduction to data persistence Where to store data How to work with data (Persistence technologies in Java EE) Architecture of data persistence layer Introduction to ORM What is ORM Basic Principles JPA Introduction Entities in JP

slideplayer.com

[Spring JPA] 영속 환경 ( Persistence Context )

 

[Spring JPA] 영속 환경 ( Persistence Context )

영속성 컨텍스트 ( Persistence Context ) persistence context는 엔티티를 영구 저장하는 환경으로, 논리적인 개념입니다. 엔티티 매니저( Entity Manager )로 엔티티를 저장( persist() ) , 조회( find() 또는 J..

victorydntmd.tistory.com

인프런 - 로그인이 필요합니다

 

인프런 - 로그인이 필요합니다

지식공유자 되기 많은 사람들에게 배움의 기회를 주고, 경제적 보상을 받아보세요. 지식공유참여

www.inflearn.com

 

'Web > Spring' 카테고리의 다른 글

[JPA] Proxy & CASCADE  (0) 2020.03.25
Comments