본문 바로가기
Framework and Tool/JPA

JPA - 영속성 관리 - 엔티티의 생명주기

by ocwokocw 2021. 6. 23.

- 참조: 자바 ORM 표준 JPA 프로그래밍

- 엔티티 매니저 팩토리와 엔티티 매니저

엔티티 매니저는 말 그대로 엔티티를 관리하는 관리자다. 엔티티를 저장, 수정, 삭제, 조회하며 개발자가 엔티티를 저장하는 가상의 데이터베이스라고 할 수 있다.

 

엔티티 매니저 팩토리는 용어에서도 알 수 있듯이, 엔티티 매니저를 생산하는 공장이다. 엔티티 매니저 팩토리를 생성하는 비용은 크지만 팩토리에서 엔티티 매니저를 생성할때에는 비용이 거의 들지 않는다.

 

엔티티 매니저 팩토리는 스레드-세이프 설계가 되어있어 어플리케이션에서 1개를 생성하여 공유해도 되지만, 엔티티 매니저는 스레드간 공유를 하면 안된다.

 

엔티티 매니저 팩토리는 생성시에 커넥션 풀을 만들며, 엔티티 매니저는 DB 커넥션을 사용하는데 DB 연결이 필요한 시점에만 얻는다. (ex - 트랜잭션의 시작)


- 영속성 컨텍스트

영속성 컨텍스트는 JPA 를 이해하는데 있어서 핵심이라고 할 수 있다. 

 

em.persist(member);

 

우리가 위와 같이 엔티티 매니저에서 persist 메소드를 호출하면 DB 에 바로 저장한다고 생각했겠지만, 사실은 엔티티를 영속성 컨텍스트에 저장한다.


- 엔티티의 생명주기

아래 그림은 엔티티의 생명주기를 나타낸 그림이다.

엔티티에는 4 가지 상태가 있다.

  • 비영속(new/transient): 영속성 컨텍스트와 전혀 관계 없는 상태
  • 영속(managed): 영속성 컨텍스트에 저장된 상태
  • 준영속(detached): 영속성 컨텍스트에 저장되었다가 분리된 상태
  • 삭제(removed): 삭제된 상태

비영속 상태는 순수한 객체 상태이며 New 로 생성을 하고 아직 EntityManager 와 어떤 관련도 없는 상태라고 할 수 있다. 아래 코드에서 em.persist 메소드 호출전까지는 단지 Member의 인스턴스를 생성하여 id, 이름, 나이까지만 set 했을 뿐 비영속 상태라고 할 수 있다.

 

Member member = new Member();
		member.setId(id);
		member.setUserName("ocwokocw");
		member.setAge(33);
		
		em.persist(member);

 

영속 상태는 영속성 컨텍스트가 엔티티를 관리하고 있는 상태라고 볼 수 있다. 위에서 EntityManager의 persist 메소드를 호출하는 순간 해당 엔티티는 영속성 컨텍스트가 관리하고 있는 상태가 된것이다. find나 JPQL 로 가져온 객체도 영속 상태이다.

 

준영속 상태는 영속 상태에서 detach, clear, close 메소드를 호출하여 영속성 컨텍스트가 관리하고 있지 않은 상태이다. 자세한 예제는 이후에 알아본다.

 

삭제 상태는 엔티티를 영속성 컨텍스트와 데이터베이스에서 삭제한다.

댓글