엔티티 매니저 팩토리(EntityManagerFactory)
이름 그대로 엔티티 매니저를 만드는 공장인데, 이 공장을 만드는 비용이 매우 크다. 따라서, 한 개만 만들어서 애플리케이션 전체에서 공유하도록 설계되어 있다.
데이터베이스를 하나만 사용하는 애플리케이션에서는 일반적으로 EntityManagerFactory 하나만 생성한다.
여러 스레드가 동시에 접근해도 안전하므로 서로 다른 스레드 간에 공유가 가능하다.
엔티티 매니저(EntityManager)
엔티티 매니저는 엔티티를 저장하고, 수정하고, 삭제하고 조회하는 등 엔티티와 관련된 모든 일을 처리한다.
이름 그대로 엔티티를 관리하는 관리자이다.
엔티티 매니저 팩토리와 다르게 엔티티 매니저는 여러 스레드가 동시에 접근하면 동시성 문제가 발생하므로 스레드 간에 절대 공유를 하면 안된다.
데이터베이스 연결이 꼭 필요한 시점까지 커넥션을 얻지 않고 트랜잭션을 시작할 때 커넥션을 획득한다.
영속성 컨텍스트 (Persistence Context)
JPA를 이해하는 데 가장 중요한 용어이다.
엔티티를 영구 저장/관리하는 가상의 메모리 공간
엔티티 매네저를 생성할 때 하나가 생성되며, `em`을 통해 접근한다.
엔티티가 저장되거나 조회되면 DB에서 바로 가져오는게 아니라 먼저 영속성 컨텍스트에서 관리된다.
엔티티 생명주기
1. 비영속(transient) : 단순히 new로 객체만 생성된 상태
2. 영속 (managed) : `em.persist(entity)` 호출 시 영속성 컨텍스트에 저장됨. JPA가 해당 엔티티를 추적 관리 시작
3. 준영속 (detached) : 원래 영속 상태였지만, 더 이상 컨텍스트에서 관리하지 않음
4. 삭제 (removed) : DB에서도 삭제 예정

영속성 컨텍스트의 장점
1) 1차 캐시
영속성 컨텍스트는 내부에 캐시를 가지고 있는데, 이것을 1차 캐시라고 한다. 아래 그림은 1차 캐시에 회원 엔티티를 저장하면 보이는 상황이다. 아직 데이터베이스에 저장되지 않았다.

1차 캐시에서의 조회


2) 동일성 보장
식별자가 같은 엔티티 인스턴스를 조회해 비교해보면, 같은 엔티티 인스턴스를 반환한다.
3) 쓰기 지연
엔티티 매니저를 사용해서 엔티티를 영속성 컨텍스트에 등록하면 엔티티 매니저는 트랜잭션을 커밋하기 직전까지 데이터베이스에 엔티티를 저장하지 않고 내부 쿼리 저장소에 INSERT SQL을 모아둔다. 그리고 트랜잭션을 커밋할 때 모아둔 쿼리를 데이터베이스에 보내는데 이것을 트랜잭션을 지원하는 쓰기 지연이라고 한다.
4) 변경 감지
엔티티를 수정할 때에는 단순히 엔티티를 조회해서 데이터만 변경하면 된다.
JPA는 엔티티를 영속성 컨텍스트에 보관할 때, 최초 상태를 복사해서 저장해두는데 이것을 스냅샷이라고 한다. 그리고 플러시 시점에서 스냅샷과 엔티티를 비교해서 변경된 엔티티를 찾는다. 변경된 엔티티가 있으면 수정 쿼리를 생성해서 쓰기 지연 SQL 저장소에 보내고 쓰기 지연 저장소의 SQL을 데이터베이스에 보낸다.
5) 지연 로딩
연관된 엔티티를 처음부터 다 불러오지 않고, 실제 접근 시점에 SQL을 실행한다.
Flush (플러시)
영속성 컨텍스트의 변경 내용을 데이터베이스에 반영한다.
플러시를 실행하면,
1. 변경 감지가 동작해서 영속성 컨텍스트에 있는 모든 엔티티를 스냅샷과 비교해서 수정된 엔티티를 찾는다.
2. 수정된 엔티티는 수정 쿼리를 만들어 쓰기 지연 SQL 저장소에 등록한다.
3. 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다.
'Spring' 카테고리의 다른 글
| [Spring] 프록시(Proxy) (0) | 2025.08.13 |
|---|---|
| [Spring] AOP(Aspect Oriented Programming) (0) | 2025.08.11 |
| [Spring] ORM과 JPA(Java Persistence API) (3) | 2025.08.11 |
| [Spring] IoC(Inversion of Control)와 DI(Dependency Injection) (2) | 2025.08.08 |
| [Spring] 레이어드 아키텍처(Layered Architecture)와 Spring MVC (0) | 2025.08.05 |