JPA - @PersistenceContext
0.서론
- JPA는 ORM(Object–relational mapping)이며 객체 지향과 Database간 발생하는 차이를 매핑
(SQL중심적 개발에서 객체 중심으로 개발할 수 있게 됨)
- JPA는 JDBC API를 통해서 DB에 접근(java application과 JDBC API 사이에 존재)
- JPA는 인터페이스의 모음이며 HIbernates는 그 구현체 (Hibernates를 제외하고도 , EclipseLink, DataNucleus존재)
- Entity는 DB 테이블과 매핑되는 객체같은 개념
- 영속성 컨텍스트(Persistence Context)는 엔티티의 영속화에 관여하며, 엔티티들이 DB로 바로 가지 않고, 엔티티를 저장하는 환경으로서의 역할을 함
- 영속성 컨텍스트의 장점
>>
1. 성능 향상: 엔티티를 메모리에 캐시함으로서 빈번하게 데이터베이스에 접근하는것을 줄일 수 있고, 데이터베이스 로드 또한 줄어듬
2. DB 접근 단순화: 엔티티를 관리하기 위한 단순화된 API를 제공해서 DB접근을 단순화
(쿼리보다 애플리케이션의 비즈니스 로직에 집중할 수 있음)
3. 데이터 일관성 향상: 엔티티 라이프사이클, 즉 엔티티의 상태에 대한 관리를 자동적으로 관리함으로서 엔티티가 일관성있도록 보장
@PersistenceContext: EntityManager를 빈으로 주입할 때 사용하는 어노테이션
(JPA 스펙에서 제공, 영속성 컨텍스트를 주입하는 표준 어노테이션)
- 스프링에서는 영속성 관리를 위해 EntityManager가 존재
- 스프링 컨테이너가 시작될 때 EntityManager를 만들어서 빈으로 등록
- 이 때 스프링이 만들어둔 EntityManager를 주입받을 때 @PersistenceContext 사용
( 팩토리를 만들고 그걸로 엔티티매니저를 반환하는 과정을 스프링부트가 모두 자동화함 )
+@
- EntityManagerFactory는 고객의 요청이 올 때마다 (thread가 하나 생성될 때마다) EntityManager를 생성
- EntityManager는 내부적으로 DB connection pool을 사용해서 DB에 접근
주입을 위해 아래 두가지들을 프로퍼티로 사용 가능
- EntityManagerFactory에서 새로운 EntityManager를 생성
- Transaction에 의해 기존에 생성된 EntityManager를 반환
// 1.EntityManagerFactory
// JPA 는 EntityManagerFactory 를 만들어야 함
// application loading 시점에 DB 당 딱 하나만 생성되어야 함
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("hi");
entityManagerFactory.close();
// WAS(웹 어플리케이션 서버) 가 종료되는 시점에 EntityManagerFactory 를 닫음
// 이 시점에 닫아야 내부적으로 Connection pooling 에 대한 Resource 가 Release 됨
// 2.EntityManager
// 실제 트랜잭션 단위를 수행할 때마다 생성(고객의 요청이 올 때마다 사용하고 닫음)
// thread간에 공유하면 안됨
entitymanager.close();
// 트랜잭션 수행 후 반드시! 엔티티매니저를 닫아야 함!
// 위 과정을 거쳐야 내부적으로 DB Connection을 반환함
// 3.EntityTranscation
// 데이터를 변경하는 작업은 반드시 트랜잭션 안에서 이루어져야 함(조회는 상관없음)
EntityTransacton tx = entityManager.getTransaction();
// tx.begin(); : Transaction 시작
// tx.commit(); : Transaction 수행
// tx.rollback(); : 작업에 문제가 생겼을 시
- EntityManagerFactory는 Entity Manager를 만들고 구성하는법을 제공하는 interface
( JPA의 구현체인 Hibernate나 EclipseLink에 의해서 생성되며 Entity Manager 인스턴스를 생성하는데 사용됨 )
- EntityManager는 DB table과 mapping된 객체인 Entity에 대한 CRUD 작업을 수행하기 위한 method들을 제공하며
Entity의 라이프 사이클과 영속성 관리등을 담당
EntityManager를 사용할 때 주의해야 할 점은 여러 쓰레드가 동시에 접근하면 동시성 문제가 발생하여
쓰레드 간에는 EntityManager를 공유해서는 안되는데, 동시성 문제가 발생하지 않음
>>
스프링 컨테이너가 초기화되면서 @PersistenceContext으로 주입받은 EntityManager를 Proxy로 감싸고
, EntityManager 호출 시 마다 Proxy를 통해 EntityManager를 생성하여 Thread-Safe를 보장
( 일반적으로 스프링은 싱글톤 기반으로 동작하기에 빈은 모든 쓰레드가 공유
But, @PersistenceContext으로 EntityManager를 주입받아도 동시성 문제가 발생하지 않음 )
참고글
https://gmlwjd9405.github.io/2019/08/06/persistence-context.html
[JPA] 영속성 컨텍스트(Persistence Context)란 - Heee's Development Blog
Step by step goes a long way.
gmlwjd9405.github.io
https://batory.tistory.com/497
@PersistenceContext
개인 공부 목적으로 작성한 글입니다. 아래 출처를 참고하여 작성하였습니다. 목차 @PersistenceContext 란? @PersistenceContext를 사용해야 하는 이유 1. @PersistenceContext 란? EntityManager를 빈으로 주입할 때
batory.tistory.com
어노테이션 관련 질문드립니다. - 인프런 | 질문 & 답변
7분 즘에 MemberRepository 클래스르 만들고@PersistenceContext 어노테이션을private EntityManager em;에 붙였는데 원래 정석대로라면 팩토리를 만들고 그걸로 엔티티매니저를 반환받는거였는데이 어노테이션
www.inflearn.com
https://colevelup.tistory.com/21
[JPA] Persistence context(영속성 컨텍스트)와 EntityManager
JPA와 ORM에 대한 간략한 정의와 JPA에서 중요한 영속성 컨텍스트(Persistence Context)와 엔티티 매니저(Entity Manager), 영속성 컨텍스트 타입(Persistence Context type), 영속성 컨텍스트(Persistence Context)의 장점
colevelup.tistory.com