취미로 음악을 하는 개발자

[Spring Framework] 엔티티(Entity), 엔티티 매니저(EntityManager), 영속 컨텍스트(Persistence Context) 본문

공대인/Spring[Boot]

[Spring Framework] 엔티티(Entity), 엔티티 매니저(EntityManager), 영속 컨텍스트(Persistence Context)

영월특별시 2019. 9. 28. 21:35
728x90

참고 : "초급 개발자들을 위한 가볍고 넓은 스프링 부트, 스타트 스프링 부트"


엔티티 (Entity)

: 데이터베이스 상에서 데이터로 관리하는 대상을 뜻함. 


- 상품, 회사, 직원 등과 같이 명사이면서 업무와 관련된 데이터를 엔티티로 규정

- 데이터베이스에서는 엔티티를 위해서 일반적으로 테이블을 설계하고 데이터를 추가함

- 이렇게 추가된 데이터는 인스턴스 or 레코드라는 용어로 호칭


JPA에서는 Java를 이용해서 이러한 엔티티들을 관리하기 때문에 엔티티 타입의 존재는 클래스가 된다. 따라서 하나의 엔티티 타입을 생성한다는 것은 하나의 클래스를 작성한다는 의미가 된다.




여기서는 엔티티가 인스턴스를 의미하지만 때로는 클래스를 의미할 경우도 있다. 예를 들어 Member 엔티티가 클래스를 의미하는 경우도 있고, 클래스에 생성된 인스턴스를 의미하는 경우도 있다. 


 * 물론 Member 엔티티 클래스, Member 엔티티 인스턴스, Member 엔티티 객체라는 표현이 정확하지만 혼용되는 경우가 많이 있다.




엔티티 매니저 (EntityManager)


: 여러 엔티티 객체들을 관리하는 역할을 함. 여기서 말하는 관리생명주기 (Life Cycle)라고 할 수 있다. 엔티티 매니저는 자신이 관리해야 하는 엔티티 객체들을 영속 컨텍스트 (Persistence Context)라는 곳에 넣어두고, 객체들의 생사를 관리한다.




영속 컨텍스트 (Persistence Context)


: JPA가 엔티티 객체들을 모아두는 공간이라고 표현할 수 있다. 컨텍스트라는 하나의 공간이나 울타리라고 보면 된다.




위 그림에서 화살표에 있는 메소드는 엔티티 매니저를 통해서 실행하는 메소드이다. 타원으로 표현된 부분을 정리하면 아래와 같다.


  New (비영속) 

 Java 영역에 객체만 존재하고, 데이터베이스와 연동된 적이 없는 상태.

 엔티티 매니저의 관리하에 있는 것이 아니기 때문에 순수한 Java 객체

  Managed (영속)

 데이터베이스에 저장되고, 메모리상에서도 같은 상태로 존재하는 상태. 객체는 영속 컨텍스트 내에 들어가게 되고 id(PK) 값을 통해서 필요한 엔티티 객체를 꺼내 사용할 수 있게 된다.

  Removed (삭제)

 데이터베이스 상에서 삭제된 상태. 객체는 더 이상 영속 컨텍스트에 존재하지 않는다.

  Detached (준영속)

 영속 컨테스트에서 엔티티 객체를 꺼내서 사용하는 상태. 준영속 상태의 객체는 고유한 id(PK)를 가지고 있지만, 아직 데이터베이스와 동기화가 이루어지지 않은 상태. 



JPA에서는 EntityManager라는 존재를 이용해서 영속성이라는 것을 관리하게 된다. 

다음은 예외처리를 하지 않은 최소한의 코드를 보여준다. (이런식으로 흘러간다는 정도로만 보면 될 것 같다.)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
EntityManagerFactory emfactory = Persistence.createEntityManagerFactory("My_JPA");
 
    EntityManager entitymanager = emfactory.createEntityManager();
    entitymanager.getTransaction().begin();
 
    Employee employee = ....
 
    // -- 중략 ---
 
    entitymanager.persist(employee);
    entitymanager.getTransaction().commit();
 
    entitymanager.close();
    emfactory.close();
cs


코드 내용을 요약해보면 EntityManager라는 것을 이용해서 객체를 보관(persist())한다. 이 때 트랜잭션에 대한 관리가 필요하고, close() 메소드로 사용한 자원을 정리해야 한다. 여기서 사용할 Spring Data JPA의 경우에는 이러한 처리 없이 다음과 같은 형태의 개발을 목표로 한다.


1
2
3
4
5
6
7
import java.util.List;
 
import org.springframework.data.repository.CrudRepository;
 
public interface CustomerRepository extends CrudRepository<Customer, Long> {
    List<Customer> findByLastName(String lastName);
}
cs


기존에 Java를 공부할 때, Java에서 인터페이스를 설계하고 이를 구현하는 클래스를 만드는 것이 일반적이지만, 

Spring Data JPA는 동적으로 인터페이스를 구현하는 클래스를 만들어 내는 방식(동적 프록시, Dynamic Proxy)을 이용해서 

실제 클래스를 작성하지 않아도 자동으로 만들어지기 때문에 별도의 코드를 작성할 필요가 없다.



Comments