영속성 컨텍스트 (Persistance Context)
JPA 에서 엔티티 객체를 관리하는 메모리 상 저장소.
JPA는 영속성 컨텍스트를 통해 데이터베이스와 상호작용하며, 엔티티의 생명주기를 관리하고, 데이터베이스 작업을 효율적으로 처리한다
핵심 개념
1. 엔티티 관리
- 영속성 컨텍스트는 엔티티 객체를 생성, 읽기, 수정, 삭제 등 다양한 방식으로 관리한다
- 엔티티는 JPA에서 데이터베이스의 한 행에 해당하는 자바 객체를 말함
2. 1차 캐시
- 영속성 컨텍스트는 1차 캐시로 작동하며, 데이터베이스 접근을 최소화하기 위해 객체를 메모리에 저장한다
- 동일한 트랜잭션 내에서 같은 엔티티를 다시 조회하면, 데이터베이스에 쿼리를 보내지 않고 1차 캐시에서 데이터를 반환한다
3. 변경 감지 (Dirty Checking)
- 영속성 컨텍스트는 엔티티의 상태를 지속적으로 감시하여, 변경된 데이터를 자동으로 감지한다
- 트랜잭션 종료시 변경 내용을 데이터베이스에 반영한다
4. 동일성 보장 (Identity Guarantee)
- 같은 영속성 컨텍스트에서 동일한 엔티티를 조회하면 항상 동일한 객체를 반환한다
- 즉, == 비교로도 동일성을 확인할 수 있다
영속성 컨텍스트의 상태
1. 비영속 (New / Transient)
- 엔티티가 영속성 컨텍스트에 포함되지 않은 상태
- 아직 데이터베이스와 관련이 없다
Member member = new Member();
member.setName("John");
2. 영속 (Managed)
- 엔티티가 영속성 컨텍스트에 포함된 상태
- 데이터베이스와 연결되어 변경 사항을 추적한다
em.persist(member); // 영속 상태로 전환
3. 준영속 (Detached)
- 영속성 컨텍스트에서 관리되던 엔티티가 더이상 관리되지 않는 상태
- 데이터베이스와의 연결이 끊어졌다
em.detach(member); // 준영속 상태로 전환
4. 삭제 (Removed)
- 엔티티가 삭제될 예정인 상태
- em.remove() 를 호출하면 삭제 상태가 된다
em.remove(member);
영속성 컨텍스트의 주요 기능
1. 1차 캐시
영속성 컨텍스트는 엔티티를 메모리(1차 캐시)에 저장하여, 데이터베이스 접근을 최소화한다
Member member1 = em.find(Member.class, 1L); // DB에서 조회
Member member2 = em.find(Member.class, 1L); // 1차 캐시에서 조회
System.out.println(member1 == member2); // true (동일한 객체)
2. 동일성 보장
같은 영속성 컨텍스트에서 동일한 엔티티를 조회하면 항상 동일한 객체를 반환한다
3. 변경 감지 (Dirty Checking)
영속 상태의 엔티티가 변경되면, 트랜잭션이 커밋될때 자동으로 변경사항을 데이터베이스에 반영한다
Member member = em.find(Member.class, 1L); // 영속 상태
member.setName("New Name"); // 엔티티 변경
em.flush(); // 변경 사항 반영
4. 쓰기 지연 (Write-Behind)
persist()를 호출해도 즉시 데이터베이스에 반영되지 않고, 쓰기 지연 SQL 저장소에 쌓아둔다
트랜잭션이 커밋될때, 쌓인 SQL을 한꺼번에 실행한다
em.persist(member1);
em.persist(member2);
// 실제 INSERT 쿼리는 flush() 또는 commit() 시 실행
영속성 컨텍스트의 생명 주기
영속성 컨텍스트는 **EntityManager**에 의해 관리됩니다.
1. EntityManager 생성
- EntityManager는 영속성 컨텍스트를 관리하는 주체입니다
2. 트랜잭션 시작
- 데이터베이스 작업을 처리하기 위해 트랜잭션을 시작합니다
3. 엔티티 관리
- persist(), find() 등을 통해 엔티티를 관리하거나 조회합니다
4. 트랜잭션 커밋
- 변경 사항을 데이터베이스에 반영하고, 영속성 컨텍스트를 비웁니다
5. EntityManager 종료
- close()를 호출하여 영속성 컨텍스트를 종료합니다
장점과 단점
장점
1. 캐싱을 통한 성능 향상
- 1차 캐시를 통해 데이터베이스 접근을 줄이고 속도를 개선
2. 변경 감지 기능
- 객체의 상태를 자동으로 추적하고, 필요한 경우에만 업데이트
3. 쓰기 지연을 통한 효율적인 SQL 처리
- 트랜잭션 단위로 SQL을 모아서 실행
단점
1. 메모리 사용량 증가
- 대규모 데이터를 영속성 컨텍스트에서 관리하면 메모리 사용량이 증가
2. 준영속 상태 관리의 복잡성
- 준영속 상태의 엔티티를 다시 영속 상태로 전환하는 작업이 복잡할 수 있음
3. 초기 학습 난이도
- 영속성 컨텍스트와 관련된 동작과 설정을 이해하는 데 시간이 필요
정리
1. 영속성 컨텍스트란?
- JPA가 엔티티를 관리하는 메모리 공간
- 데이터베이스와 객체 사이의 다리 역할
2. 핵심 기능
- 1차 캐시: 동일한 트랜잭션 내에서 캐싱된 엔티티 사용
- 동일성 보장: 동일한 엔티티에 대해 같은 객체 반환
- 변경 감지: 엔티티 상태를 자동 추적하여 데이터베이스에 반영
- 쓰기 지연: SQL을 모아서 효율적으로 실행
3. 엔티티 상태
- 비영속, 영속, 준영속, 삭제 상태
4. 트랜잭션 관리
- 영속성 컨텍스트는 트랜잭션 단위로 동작
출처 : ChatGPT
'BE > Spring & Spring Boot' 카테고리의 다른 글
[Spring Boot, Java] Cascade (0) | 2024.12.26 |
---|---|
[Spring Boot, JPA] 스냅샷 (1) | 2024.12.25 |
[Spring Boot] @ManyToOne, @OneToMany (1) | 2024.12.22 |
[Spring Boot] Eager, Lazy (0) | 2024.12.21 |
[Spring Boot] IoC 컨테이너 (2) | 2024.12.21 |