[스프링부트 #5] 영속성 컨텍스트

김지현·2023년 11월 13일
0
post-thumbnail

Entity

Entity(엔티티)란 JPA에서 관리되는 클래스 즉 객체를 의미한다. 엔티티 클래스는 DB의 테이블과매핑되어 JPA에 의해 관리된다. @Entity 애너테이션을 사용하면 엔티티 클래스로 지정할 수 있다.

Entity 애너테이션

@Table : 매핑할 테이블 지정
@Column : 컬럼 속성 설정
@Id : 기본키 지정
@GeneratedValue : 기본키 생성을 DB에 위임하여 자동 생성 가능

영속성 컨텍스트

영속성(Persistence)은 객체가 생명(객체 유지 시간)이나 공간(객체 위치)을 자유롭게 유지하고 이동할 수 있는 객체의 성질을 의미한다. 영속성 컨텍스트는 엔티티 객체를 효율적으로 쉽게 관리하기 위해 만들어진 공간이다. 또한 엔티티를 영구 저장하는 환경이라는 뜻이기도 하다. 영속성 컨텍스트는 애플리케이션과 DB 사이에서 객체를 보관하는 가상의 DB 역할을 하며 엔티티 매니저(Entity Mangager)를 통해 엔티티를 보관하고 관리하게 된다.

EntityManager는 EntityManagerFactory를 통해 생성하여 사용할 수 있다. EntityManagerFactory는 일반적으로 DB 하나에 하나만 생성되어 애플리케이션이 동작하는 동안 사용되며 이를 만들기 위해서는 DB에 대한 정보를 전달해야 한다. 전달을 위해서는 persistence.xml 파일에 DB에 대한 정보를 넣어두면 된다.

EntityManagerFactory emf = Persistence.createEntityManagerFactory("Entity");
EntityManager em = emf.createEntityManager();

JPA의 트랜잭션

영속성 컨텍스트에 엔티티 객체들을 저장했다고 해서 DB에 바로 반영되지는 않는다. JPA에서는 영속성 컨텍스트로 관리하고 있는 변경이 발생한 객체들의 정보를 쓰기 지연 저장소(ActionQueue)에 가지고 있다가 마지막에 SQL을 한 번에 DB에 요청하여 반영한다.

변경 감지(Dirty Checking)
영속성 컨텍스트에 저장된 엔티티가 변경될때마다 UPDATE SQL이 쓰기 지연 저장소에 저장된다면 비효율적이게 된다. JPA에서는 이를 효율적으로 처리하기 위해 영속성 컨텍스트에 엔티티를 저장할 때 최초 상태를 저장하고, 트랜젝션 commit시에 현재 상태와 최초 상태를 비교하여 UPDATE SQL을 생성한다. 이러한 과정을 변경감지라고 부른다.

Entity의 상태

  • 비영속(Transient)
    쉽게 new 연산자를 통해 인스턴스화 된 Entity 객체를 의미한다. 아직 영속성 컨텍스트에 저장되지 않았기 때문에 JPA의 관리를 받지 않으며 이를 비영속 상태라 한다.

  • 영속(Managed)
    비영속 Entity를 EntityManager를 통해 영속성 컨텍스트에 저장하여 관리받게 되면 영속 상태가 된다.

  • 준영속(Detached)
    준영속 상태는 영속성 컨텍스트에 저장되어 관리되다가 분리된 상태를 의미한다.

  • 삭제(Removed)
    영속 상태의 Entity를 삭제 상태로 전환한다.

0개의 댓글