영원히 남는 기록, 재밌게 쓰자

영속성 컨텍스트 본문

springboot/JPA

영속성 컨텍스트

youngjae-kim 2024. 2. 20. 21:13
728x90
반응형

영속성 컨텍스트는 애플리케이션과 데이터 베이스 사이에서 데이터를 관리하는 징검다리 역할을 한다.

즉, 객체와 관계형 데이터 베이스를 매핑 해주는 역할을 한다.

 

이런 역할을 수행하는 것이 영속성 컨텍스트이다

 

위 두 가지는 JPA에서 가장 중요한 2가지이다.

영속성 컨텍스트를 알아 보기 전에 JPA의 기본적인 동작 방식을 알아야 한다.

 

엔티티 매니저 팩토리와 엔티티 매니저의 관계를 먼저 알 필요가 있다.

 

EntityManagerFactory는 애플리케이션이 띄워지는 시점에서 DB당 딱 하나만 생성이 된다.

EntityManager는 고객의 요청이 올 때마다 생성되고 요청이 마무리 될 때 트랜잭션이 종료될 때 함께 종료된다는 것을 기억하자.

또한 EntityManager는 스레드 간 절대 공유하면 안된다.. 사용하고 버려야 된다!

이 때 요청들 중 DB와 통신을 해야하는 서비스 로직 등이 존재할 것이다. DB와 상호작용을 하는 엔티티 매니저는 영속성 컨텍스트라는 것을 사용한다.

 

영속성 컨텍스트를 사용하면 발생하는 이점들에 대해서 하나씩 살펴보자

 

영속성 컨텍스트

영속성 컨텍스트는 엔티티를 영구 저장하는 환경이라는 뜻을 가진다.

영속성 컨텍스트는 동작이 눈에 보이지 않기 때문에 이해가 잘 안될 수 있다. 동작원리를 알고 싶다면 직접 프로젝트를 생성해서 실습을 해보면서 그림으로 이해를 하는 것이 제일 좋은 것 같다.

 

엔티티의 생명 주기

엔티티 생명주기는 4개로 나뉜다.

  • 비영속(new/transient)
    • 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태를 말한다. (영속성 컨텍스트에 의해 생성되거나 조회된 엔티티가 아니라는 뜻)
    • 조금 다른 말로 해보면 생성된 객체가 영속성 컨텍스트가 관리하는 컨테이너?에 등록이 안 된 상태라고 생각하면 된다.
  • 영속(merged)
    • 영속성 컨텍스트에 관리되는 상태
    • 생성한 객체를 엔티티 매니저의 영속 컨텍스트 안에 persist() 메서드로 등록하거나 DB의 엔티티(객체)를 영속 컨텍스트의 find() 메서드를 통해 조회하여 등록하는 경우 영속 상태가 된다.
  • 준영속(detached)
    • 영속성 컨텍스트에 저장 되었다가 분리된 상태
  • 삭제(removed)
    • 삭제된 상태

 

영속성 컨텍스트의 이점

이렇게 영속성 컨텍스트에 의해 관리되어 지면 이점이 있는데 그 이점에 대해서도 알아보자

1차캐시

 

// 객체를 생성만 하지 않고 영속성 컨텍스트가 관리할 수 있도록 persist()로 영속으로 만듦
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
//엔티티를 영속
em.persist(member);

 

영속 엔티티의 동일성 보장

앞서 1차 캐시를 사용하는 것으로 인해 자바의 컬렉션 처럼 객체의 참조를 읽어오는 것과 같기 때문에

반복 가능한 읽기 등급의 격리 수준을 애플리케이션 단에서 사용할 수 있게 해준다.

 

엔티티 등록 및 트랜잭션을 지원하는 쓰기 지연

 

파란색 화살표를 보면 insert sql을 생성한 다음 트랜잭션이 끝나고 엔티티 매니저가 커밋을 하는 시점이 올 때 까지 쓰기 지연 저장소에 쿼리 명령어들을 모두 버퍼처럼 담아두고 커밋이 발생했을 때 엔티티 매니저에 저장 되어 있던 모든 sql이 한번에 DB에 반영된다.

 

DB에 반영되는 시점 동작

 

변경 감지(Dirty Checking)

수정의 경우도 따로 persist()나 update() (실제로 이런 메서드는 없음)와 같이 추가적인 영속 컨텍스트의 동작이 있어야 한다고 생각하지만 최초 1차 캐시에 수정하기전의 엔티티 상태를 스냅샷을 저장해 놓고 엔티티의 변경이 있고 트랜잭션이 끝난 뒤 flush()를 할 때에 엔티티와 스냅샷을 비교하여 변경 지점을 체크한다. 그에 따른 update SQL을 생성하고 flush() 때 쿼리를 날리게 된다.

 

정리

엔티티 매니저 팩토리, 엔티티 매니저(영속성 컨텍스트), 영속성 컨텍스트의 이점들을 한번 정리해 볼 수 있었다.

또한 영속성 컨텍스트의 동작이 트랜잭션과 연관이 많은 것을 알 수 있었다.

 

 

김영한 - JPA 프로그래밍 기본편 참고

728x90
반응형