우당탕탕
[Spring] JPA 영속성 컨텍스트 (Persistence Context) 란? 본문
JPA 영속성 컨텍스트 쉽게 알아보기
이번 포스팅에서는 JPA를 처음 접하는 분들도 쉽게 이해할 수 있도록, 영속성 컨텍스트(Persistence Context)가 뭔지 알아보도록 하겠습니다.
영속성 컨텍스트란?
영속성 컨텍스트는 말 그대로 "엔티티(객체)를 영구적으로 저장하고 관리하는 공간"입니다.
조금 더 쉽게 말하면,
JPA가 엔티티를 직접 데이터베이스(DB)에 바로 저장하지 않고,
중간에 잠깐 보관하고 관리하는 "임시 창고"라고 생각하시면 됩니다.
왜 이런 창고가 필요할까?
JPA는 단순히 DB에 바로 데이터를 넣고 빼는 게 아니라, "엔티티 매니저 (EntityManager)"라는 친구를 통해 이 창고(영속성 컨텍스트)에 먼저 엔티티를 넣고 관리합니다.
이렇게 하는 이유는
1. 성능을 높이고 ( 캐시 효과 )
2. 엔티티의 상태를 추적하고
3. 여러 장점 ( 아래에서 설명! )을 얻기 위해서입니다.
영속성 컨텍스트의 주요 특징
1. 1차 캐시
영속성 컨텍스트는 1차 캐시를 가지고 있습니다.
예를 들어, 같은 엔티티를 여러 번 조회하면 DB에 계속 다녀오는 게 아니라 한 번만 DB에서 가져오고, 그다음부터는 창고 (1차 캐시)에서 꺼내주게 됩니다. 덕분에 여러 번 DB에 접근하는 것보다 성능이 빨라지게 됩니다.
2. 엔티티의 동일성 보장
같은 엔티티를 두 번 조회해도 항상 같은 객체를 반환해 줍니다.
예시 코드
Member a = em.find(Member.class, 1L);
Member b = em.find(Member.class, 1L);
System.out.println(a == b); // true!
즉, 같은 PK(기본키)로 조회하면 항상 같은 인스턴스가 반환됩니다.
3. 트랜잭션을 지원하는 쓰기 지연
em.persist()로 엔티티를 저장해도 바로 DB에 저장하지 않고, 일단 창고에 쌓아뒀다가, 트랜잭션이 커밋될 때 한꺼번에 DB에 저장합니다. 이걸 "쓰기 지연 (Write-behind)"라고 합니다.
4. 변경 감지 (Dirty Checking)
영속성 컨텍스트에 들어간 엔티티의 값이 바뀌면 JPA가 자동으로 변경된 내용을 감지해서 트랜잭션이 끝날 때 UPDATE 쿼리를 자동으로 날려줍니다. ( 직접 Update SQL을 작성하지 않아도 돼서 편리합니다 )
5. 지연 로딩 (Lazy Loading)
연관된 엔티티(예: 게시글의 작성자)를 실제로 사용할 때까지 DB에서 조회하지 않고 기다립니다. 필요할 때만 DB에서 데이터를 가져오니까, 불필요한 쿼리를 줄일 수 있습니다.
영속성 컨텍스트는 언제 만들어지고, 사라질까?
보통 트랜잭션이 시작될 때 만들어지고, 트랜잭션이 끝나면 사라집니다.
즉, 한 번의 요청-응답 ( ex: API 한 번 호출 ) 동안만 살아 있다고 보면 됩니다.
정리
영속성 컨텍스트는 JPA가 엔티티를 관리하는 임시 창고!
1차 캐시, 동일성 보장, 쓰기 지연, 변경 감지, 지연 로딩 등 여러 가지 편리한 기능을 제공합니다.
덕분에 개발자는 SQL을 직접 많이 작성하지 않아도 객체만 다루면서도 DB와 연동된 다양한 기능을 쉽게 사용할 수 있습니다.
'Tech > Spring' 카테고리의 다른 글
[Spring] QueryDSL vs MyBatis vs JPA, 실무에서 언제 쓰는게 좋을까? (0) | 2025.04.29 |
---|---|
[Spring] JPA Auditing을 활용한 생성일, 수정일 자동 관리하기 (0) | 2025.04.27 |
[Spring] 대용량 트래픽을 위한 스프링 튜닝 팁 feat. 실무에서 바로 쓰는 전략 (0) | 2025.04.26 |
[Spring] JPA N+1 문제 해결법 ( 원인부터 해결까지 ) (0) | 2025.04.25 |
스프링 외부 API 호출 방법 비교: RestTemplate, WebClient, FeignClient, RestClient (0) | 2025.04.14 |