쟈미로그
[JPA] 영속성 관리 - 1 본문
서론
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); // 객체 삭제
'JPA' 카테고리의 다른 글
[JPA] 영속성 관리 - 2 (0) | 2023.05.30 |
---|---|
[Spring Boot][JPA] nativeQuery 사용 시 NullPointerException 문제 (1) | 2023.03.19 |
[JPA] @Modifying과 영속성 컨텍스트 (0) | 2023.03.02 |