상세 컨텐츠

본문 제목

JPA 영속성 관리 (컨텍스트와 생명주기)

기록 - 프로그래밍/Java

by wjjun 2024. 1. 2. 00:09

본문

 

엔티티 매니저와 팩토리 비교

엔티티 매니저

JPA 제공하고 있는 기능은 엔티티와 테이블을 매핑하는 설계, 매핑한 엔티티를 실제로 사용하는 부분, 두 가지로 나누어집니다.

엔티티 매니저는 저장, 수정, 삭제, 조회 엔티티의 모든 업무를 담당하는 관리자 역할입니다. 개발자는 엔티티 매니저를 이용하여 데이터베이스 데이터를 사용할 수 있습니다.

 

엔티티 매니저 팩토리

엔티티 매니저를 생성하는 공장으로 생각하면 됩니다. 

 

비용

공장을 생각해보면 비용이 큰 것을 예상할 수 있습니다. 실제로 엔티티 매니저 팩토리는 생성하는데 비용이 상당히 큽니다.

반면, 엔티티 매니저를 생성하는 비용은 거의 발생하지 않습니다.

 

스레드 안전성

엔티티 매니저 팩토리는 여러 스레드에서 동시 접속해도 안전성을 보장하여 서로 다른 스레드 간에 공유가 가능합니다. 하지만 엔티티 매니저는 여러 스레드가 동시에 접근하면 동시성 이슈가 발생하므로 스레드 간 공유는 해서는 안됩니다.

 

엔티티 매니저 팩토리에서 엔티티 매니저를 생성하면 실제로 데이터베이스 연결이 필요한 시점까지 데이터베이스의 커넥션을 사용하지 않습니다. 보통 트랜잭션을 시작하면 커넥션을 사용합니다.

 

 

영속성 컨텍스트 의미

엔티티를 영구적으로 저장하는 환경을 말합니다. 엔티티 매니저로 엔티티를 저장, 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관, 관리합니다.

 

엔티티 매니저 > 엔티티 저장, 조회 > 엔티티 매니저 > 영속성 컨텍스트에 엔티티 관리

 

entityManager.persist(member);

persist() 메소드는 단순히 저장하는 것이 압니다.

엔티티 매니저를 사용하여 Member 엔티티를 영속성 컨텍스트에 저장합니다.

실제 코드상으로 눈에 보이진 않지만 논리적으로 처리되는 과정을 위와 같습니다.

 

영속성 컨텍스트 생성은 엔티티 매니저를 생성할 때 하나가 만들어 집니다. 그리고 엔티티 매니저를 통해 영속성 컨텍스트에 접근, 관리할 수 있습니다. 추가로, 여러 엔티티 매니저는 하나의 영속성 컨텍스트에 접근이 가능합니다.

 

 

엔티티 생명주기 

비영속 : 영속성 컨텍스트와 관리하지 않는 상태입니다.

영속 : 영속성 컨텍스트에서 관리되고 있는 상태입니다.

준영속 : 영속성 컨텍스트에 저장되었다 분리된 상태입니다.

삭제 : 삭제된 상태입니다.

 

비영속 상태

엔티티 객체를 생성했고, 순수한 객체 상태로 있습니다. 아직 영속성 컨텍스트나 데이터베이스와 전혀 관련이 없는 상태입니다.

Member member = new Member();
member.setId("member");

 

영속 상태

엔티티 매니저를 이용하여 엔티티를 영속성 컨텍스트에 저장하여 관리되고 있는 상태입니다.

entityManager.find("member");

 

준영속 상태

영속성 컨텍스트에서 관리되었던 엔티티가 현재는 관리되지 않는 상태입니다.

entityManager.detach() 컨텍스트에서 분리

entityManager.close() 컨텍스트 종료

entityManager.clear() 초기화

 

삭제 상태

entityManager.remove(member);

 

 

영속성 컨텍스트 특징

영속성 컨텍스트와 식별자 값

영속성 컨텍스트는 엔티티를 식별자 값으로 구분합니다. 테이블의 기본키와 매핑한 값을 의미합니다. @Id

그렇기 때문에 영속 상태는 식별자 값이 필수입니다.

 

영속성 컨텍스트와 데이터베이스 저장

엔티티가 실제 데이터베이스에 저장되는 시점은 JPA는 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 데이터베이스에 반영합니다. 이것은 플러시(flush)라 합니다.

 

영속성 컨텍스트의 엔티티 관리 장점

1차 캐시를 이용할 수 있습니다. 동일성을 보장합니다. 트랜잭션을 지원하는 쓰기 지연이 가능합니다. 변경을 감지합니다. 지연 로딩이 가능합니다.

 

 

관련글 더보기

댓글 영역