[JPA] 영속성 컨텍스트란?(feat. 영속상태, 엔티티매니저)

Intro

JPA를 공부하면서 영속성 컨텍스트라는 영역에 대해 알게 되었다. 엔티티 매니저, 엔티티 매니저 팩토리, 영속화 등 생소하고 어려운 단어와 내용들이기에 정리하고자 한다.

엔티티

영속성 컨텍스트 설명에 앞서, 엔티티라고 하는 것은 DB테이블에 보관할 대상으로 @Entity가 선언된 객체를 의미함. 예를 들어, 회원가입 시 유저 정보를 DB에 저장해야 하는데 이 때 User라는 객체를 저장할 것인데 이 때 User를 엔티티라 한다.

영속성 컨텍스트란

영속성 컨텍스트란, 엔티티를 영구적으로 보관하는 환경을 의미한다. DB에 엔티티를 저장하는 것이 아니라, 영속성 컨텍스트를 통해 엔티티를 영속화한다는 개념이다. (영속화란 영속성 컨텍스트에 관리되는 상태로 만드는 것을 의미한다.)

  • 영속성 컨텍스트는 엔티티를 식별자(@Id로 선언한 필드값 = 기본키(PK)와 매핑한 값) 값으로 구분한다. (만약, 식별자를 선언하지 않으면 예외가 발생한다.)
    • 사진과 같이 @Id를 기준으로 Entity를 구별한다!

엔티티 매니저 & 엔티티 매니저 팩토리

엔티티 매니저(EntityManager)는 요청이 들어올 때 엔티티 매니저가 DB 커넥션 풀을 얻어서 영속 컨텍스트에 접근하여 DB 작업을 처리한다. 엔티티 매니저 팩토리(EntityManager Factory)는 엔티티 매니저를 생성하는 역할을 한다.

  • 엔티티 매니저는 엔티티를 관리하고, 필요에 따라 DB의 데이터 조회, 수정, 삭제 등을 수행한다.
  • 엔티티 매니저는 persist(), detach(), remove() 등의 메서드를 사용할 수 있다.

영속 상태 vs 비영속 상태

영속성 컨텍스트 개념에서 설명한 영속 상태란 영속성 컨텍스트에 저장된 상태를 의미하며, 반대로 비영속 상태란 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태를 의미한다.

1. 영속 상태

  • 영속 상태가 위에서 설명했듯 영속성 컨텍스트에 저장된 상태를 의미한다.
  • 여기서 영속 상태가 됐다하더라도 DB에 저장되는 것이 아니다.
  • 트랜잭션 commit을 하는 시점에 영속화 된 객체가 DB로 쿼리가 날라가게 되는 것이다.
    • 여기서, 주의할 점으로는 persist() 메서드는 트랜잭션 범위 내에서 실행해야 한다. 실행시점에 영속 컨텍스트에 엔티티를 저장하고 commit() 하는 시점에 insert쿼리가 실행되기에 범위 내에서 실행되지 않는다면 실제로 DB에 반영되지 않는다.
  • 코드
    1
    2
    3
    4
    5
    6
    7
    
      // 객체 생성
      User user = new User();
    
      // EntityManager 생성 
      EntityManager em = emf.createEntityManager();
      // persist 메서드로 user 객체를 영속컨텍스트에 영속화 한다.
      em.persist(user) // user 객체는 영속화 된 것임.
    

2. 비영속 상태

  • 비영속 상태란 컨텍스트와 전혀 관계 없는 상태라고 설명하였는데, 이는 객체를 생성만 한 상태라고 할 수 있다.
  • 코드
    1
    2
    3
    
      //객체를 생성한 상태 => 비영속 상태. (영속성 컨텍스트에 저장하지 않음.)
      User user = new User();
      user.setId(1)
    

3. 준영속 상태(detach)

  • 준영속 상태란, 영속성 컨텍스트에 저장되었다가 분리된 상태를 의미한다.
  • 코드
    1
    
      em.detach(user);
    

결론

  • 영속화란 DB에 영구적으로 저장된다는 뜻이 아니라, 영속성 컨텍스트에 저장되는 상태를 의미한다!
  • 영속성 컨텍스트란 엔티티를 영구적으로 보관하는 환경임.
  • 엔티티 매니저를 통해서 영속화를 진행하고, 준영속 상태로 변환하거나 삭제할 수 있다.
  • 이후 포스팅에서는 왜 영속성 컨텍스트에 저장하고 사용하는 지에 대해서 정리한다!(Dirty Checking, 1차 캐시 등)

참고 사이트

엔티티 매니저, 엔티티 참고 게시물
영속성 컨텍스트 참고 게시물