쟈미로그

[JPA] 영속성 관리 - 1 본문

JPA

[JPA] 영속성 관리 - 1

쟈미 2023. 5. 3. 01:37

서론

Spring Data JPA를 주로 사용하면서, 단순 CRUD 프로젝트를 할 때는 큰 의문을 갖지 않고 개발했던 것 같다. 그만큼 Spring Data JPA는 추상화가 잘돼서 사용하기 편리한 기술이었다..! 하지만 JPA 관련 에러를 만나서 서칭해볼 때면 설명을 잘 이해할 수 없었고, 그건 JPA 기술에대한 기초 지식 부족 때문이었다.

그래서 이번엔 <자바 ORM 표준 JPA 프로그래밍 - 김영한> 책의 3장을 읽으면서 JPA 기초를 공부해보고자한다!

(구현은 하이버네이트 기준이다.)

 

 

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

엔티티 매니저 팩토리

엔티티 매니저를 생성하는 공장. persistence.xml(or application.yml 등)에 기재한 DB 정보를 바탕으로 생성된다.

생성될 때 비용이 커서, 처음 설정 파일 기준으로 생성된 이후부턴 여러 스레드들에서 공유되어 사용된다.

JPA 구현체들은 엔티티 매니저 팩토리를 생성할 때 커넥션풀도 만든다. (커넥션풀 프레임워크들도 꼭 알아보잣..)

 

persistence.xml? application.yml?
application.yml은 스프링 부트가 사용하는 설정 파일, persistence.xml은 JPA가 사용하는 설정 파일이다.
그런데 스프링 부트가 내부에서 JPA를 만들 때 persistence.xml 없이도 동작하도록 구현되어 있다. 따라서 스프링과 JPA를 함께 사용한다면, application.yml을 사용하는 것이 낫다.

엔티티 매니저

엔티티 매니저를 통해 영속성 컨텍스트에 접근, 관리할 수 있다.

팩토리에서 엔티티 매니저를 생성하는 비용은 거의 안든다. 팩토리와 다르게 한 엔티티 매니저를 여러 스레드가 접근하면 동시성 이슈가 생긴다.

 

영속성 컨텍스트 (Persistence Context)

엔티티를 영구 저장하는 환경. 논리적 개념에 가깝다. JPA를 이해하는 데 매우 중요한 개념이다..!

엔티티를 저장/조회하려고 하면, 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관/관리한다.

 

 

엔티티의 생명주기

엔티티엔 4가지 상태가 존재한다.

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

 

비영속

엔티티 객체가 생성만 된, 순수한 객체 상태. 영속성 컨텍스트나 DB완 전혀 관련없다.

Member member = new Member();
member.setId("1");
member.setUsername("회원1");

 

영속

엔티티 매니저를 통해서 영속성 컨텍스트에 저장된 상태의 엔티티. 이제 이 엔티티는 영속성 컨텍스트에 의해 관리된다!

엔티티 매니저에 의해 조회하거나, JPQL로 조회한 엔티티도 영속 상태가 된다.

em.persist(member); // 저장
em.find(); // 조회

 

준영속

영속 상태의 엔티티가 영속성 컨텍스트에 의해 관리되지 않게된 상태.

아래 상황들에서 준영속 상태가 된다.

em.detach(member);
em.close(); // 영속성 컨텍스트 닫음
em.clear(); // 영속성 컨텍스트 초기화

 

삭제

엔티티를 영속성 컨텍스트 & DB에서 삭제한다.

em.remove(member); // 객체 삭제
Comments