Daily Dev Q&A: 영속성 컨텍스트

2026. 1. 9. 08:58·Archive/Daily Dev Q&A

Topic (오늘의 주제)

JPA 영속성 컨텍스트 (Persistence Context)

Why (왜 사용하는가? 왜 중요한가?)

  • 실무: 데이터베이스와 애플리케이션 사이의 중간 버퍼(Buffer) 역할을 하여, 쿼리 성능을 최적화하고 데이터 일관성을 보장해 줍니다.
  • 구조적 의미: JPA를 사용하는 가장 큰 이유인 1차 캐시, 변경 감지(Dirty Checking), 쓰기 지연 등의 마법 같은 기능이 바로 이 영속성 컨텍스트 안에서 일어납니다.
  • 면접 의도: 단순히 JPA 사용법을 아는지를 넘어, JPA의 내부 동작 원리와 트랜잭션의 관계를 정확히 이해하고 있는지 확인하는 필수 질문입니다.

Core Concept (핵심 개념 정리)

요소 내용
개념 정의 "엔티티를 영구 저장하는 논리적인 환경".

눈에 보이지 않는 메모리 저장소로, EntityManager를 통해 접근하고 관리됩니다.
생명 주기 (Lifecycle) 1. 비영속 (New): 객체만 생성된 상태 (JPA와 관련 없음).

2. 영속 (Managed): 영속성 컨텍스트에 저장된 상태 (관리 받음).

3. 준영속 (Detached): 관리되다가 분리된 상태.

4. 삭제 (Removed): 삭제된 상태.
핵심 기능 3가지 1. 1차 캐시: DB 조회 전 메모리에서 먼저 찾음 (성능 향상).

2. 변경 감지 (Dirty Checking): 객체 값만 바꾸면 알아서 UPDATE 쿼리 생성.

3. 쓰기 지연 (Write-behind): 쿼리를 모았다가 커밋 순간에 한 번에 보냄 (네트워크 부하 감소).
동일성 보장 같은 트랜잭션 안에서 조회한 객체는 주소값이 같음을 보장 (a == b is True).

Interview Answer Version (면접 답변식 요약)

"영속성 컨텍스트는 엔티티를 영구 저장하는 논리적인 환경으로, 애플리케이션과 DB 사이에서 객체를 보관하는 가상의 계층입니다.

이를 통해 1차 캐시를 활용한 조회 성능 최적화, 쓰기 지연을 통한 배치 처리, 그리고 객체의 수정을 자동으로 반영해주는 변경 감지(Dirty Checking) 기능을 제공합니다.

보통 트랜잭션이 시작될 때 생성되고, 트랜잭션이 종료될 때 같이 사라지며 데이터의 정합성을 보장합니다."

Practical Tip (사용시 주의할 점 or 활용 예)

1. 변경 감지 (Dirty Checking) 활용

  • 실무에서 데이터를 수정할 때 repository.save()를 호출하지 않는 것이 정석입니다.
  • Why? 트랜잭션 안에서 엔티티를 조회하고 값을 바꾸면, 트랜잭션 커밋 시점에 JPA가 알아서 변경 사항을 체크해 UPDATE 쿼리를 날려줍니다. 굳이 save를 부르면 불필요한 로직이 탈 수 있습니다.
  • Java
    @Transactional
    public void updateMember(Long id, String newName) {
        // 1. 영속 상태 진입 (DB 조회 -> 1차 캐시 저장)
        Member member = memberRepository.findById(id).orElseThrow();
    
        // 2. 값 변경 (비즈니스 로직)
        member.setName(newName);
    
        // 3. repository.save(member); // <-- 이거 안 해도 됩니다! (자동 반영)
    }
    

2. Flush와 Commit의 차이

  • Flush: 영속성 컨텍스트의 변경 내용(SQL)을 **DB에 반영(전송)**하는 과정. (아직 확정은 아님)
  • Commit: DB에 보낸 쿼리를 확정하는 과정. (트랜잭션 종료)
  • 보통 commit()이 일어날 때 자동으로 flush()가 먼저 실행됩니다.

3. 준영속 상태 주의

  • 트랜잭션이 끝난 후(컨트롤러 등)에 엔티티를 수정해도 DB에 반영되지 않습니다. 이미 영속성 컨텍스트의 관리에서 벗어났기(Detached) 때문입니다.

예상 꼬리질문 정리

  1. Q: 변경 감지(Dirty Checking)는 구체적으로 어떻게 동작하나요?
    • 핵심 키워드: 스냅샷(Snapshot). 1차 캐시에 들어온 최초 시점의 상태를 떠두고, 커밋 시점에 현재 엔티티와 스냅샷을 비교해서 다르면 UPDATE 쿼리를 생성함.
  2. Q: @Transactional이 없으면 영속성 컨텍스트는 어떻게 되나요?
    • 핵심 키워드: 기본적으로 JPA의 모든 데이터 변경은 트랜잭션 안에서 실행되어야 함. 없으면 TransactionRequiredException이 발생하거나 변경 감지가 동작하지 않음.
  3. Q: 1차 캐시는 전체 서비스가 공유하나요? (Redis랑 차이점)
    • 핵심 키워드: 아닙니다. 쓰레드(요청) 하나당, 트랜잭션 하나당 별도로 생기는 아주 짧은 생명주기의 캐시입니다. 전역 캐시는 '2차 캐시'라고 따로 있습니다.

'Archive > Daily Dev Q&A' 카테고리의 다른 글

Daily Dev Q&A: Spring MVC  (0) 2026.01.13
Daily Dev Q&A: JPA vs MyBatis  (0) 2026.01.09
Daily Dev Q&A: ORM (Object-Relational Mapping)의 개념과 한계(Trade-off)  (0) 2026.01.07
Daily Dev Q&A: Web Server vs WAS (Web Application Server)  (1) 2026.01.06
Daily Dev Q&A: JPA  (0) 2026.01.05
'Archive/Daily Dev Q&A' 카테고리의 다른 글
  • Daily Dev Q&A: Spring MVC
  • Daily Dev Q&A: JPA vs MyBatis
  • Daily Dev Q&A: ORM (Object-Relational Mapping)의 개념과 한계(Trade-off)
  • Daily Dev Q&A: Web Server vs WAS (Web Application Server)
tlsgkstj
tlsgkstj
짱구의 성장 일기
  • tlsgkstj
    코딩하는 짱구
    tlsgkstj
  • 전체
    오늘
    어제
    • 분류 전체보기 (159)
      • About (1)
      • Projects (35)
        • Personal Projects (21)
        • Team Projects (14)
      • Engineering (20)
        • CS & Tools (0)
        • Backend Core (15)
        • Frontend (1)
        • Infra & Cloud (2)
        • AI & Tools (1)
      • Trouble Shooting & Issues (0)
      • Growth & Career (38)
        • Interview Prep (0)
        • Retrospectives (38)
      • Archive (65)
        • TIL (8)
        • Daily Dev Q&A (56)
  • 블로그 메뉴

    • 홈
    • About
    • Projects
    • Tech Stack
    • Dev Log
    • GitHub
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    데브페스트
    java
    network
    OrphanRemova
    Spring비교
    devlog
    클로드코드
    til
    경기기후바이브코딩
    SpringBoot
    프로젝트회고
    Project_Review
    spring
    프로덕트개발자
    jpa
    aws_s3
    REACT
    DevFestIncheon2025
    backend
    커리어리셋
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
tlsgkstj
Daily Dev Q&A: 영속성 컨텍스트
상단으로

티스토리툴바