TIL 33 [ 과제 끝 + 스탠다드반 ( 영속성 컨텍스트 ) ]

2025. 4. 4. 22:43·[내일배움캠프-Sparta]/Spring 6기
반응형

14:00 ~ 15:30 과제 해설 세션 ( 박성규 튜터님 ) 

18:00 ~ 19:00 QR 출결 관리 세션 

 

과제가 끝나고 입문/숙련주차가 마무리가 되어가는 날이다.

어제 들었던 수준별 학습반에서 영속성 컨텍스트에 대해 포스팅 하고자 한다.

📣 스탠다드반 ( 영속성 컨텍스트 )

1️⃣ 영속성 컨텍스트란?

엔티티를 관리하는 JPA의 메모리 공간

EntityManager가 엔티티를 저장하는 1차 캐시 역할

 

❗ 핵심

DB가 아닌, 애플리케이션 내부 메모리에서 엔티티를 관리

2️⃣ 엔티티의 상태 변화

✅ 비영속 (new): EntityManager에 의해 관리되지 않는 상태

✅영속 (managed) : 영속성 컨텍스트에 의해 저장되어 JPA가 관리하는 상태

✅ 준영속 (detached) : 영속성 컨텍스트에서 분리된 상태 ( 더 이상 관리 되지 않음 )

✅ 삭제 (removed) : 삭제가 예정된 상태 ( 트랜잭션 커밋시 삭제됨 )

3️⃣ 영속성 컨텍스트의 역할 ( 특징 ) 

  • 1차 캐시 : 동일한 엔티티는 1번만 DB에서 조회해 메모리에 저장
  • 변경 감지 : 엔티티 필드가 변경되면 트랜잭션 커밋 시 자동으로 UPDATE 쿼리 실행
  • 쓰기 지연 : SQL 쿼리를 모아뒀다가 트랜잭션 종료 시 일괄 실행하여 성능 최적화
  • 동일성 보장 : 같은 ID를 가진 엔티티는 동일한 객체로 유지 ( == 비교시 true )

4️⃣ 1차 캐시 예시

Member m1 = em.find(Member.class, 1L); // DB 조회
Member m2 = em.find(Member.class, 1L); // 1차 캐시에서 조회
System.out.println(m1 == m2); // true (동일성 보장)

처음에는 member1을 조회 하려고 할때, 저장된 값이 없기 때문에 DB에서 조회를 하고 영속성 컨텍스트(1차 캐시)에 저장이 된후, 결과값을 반환해 조회한다. 

이후 똑같은 엔티티를 조회 할때는 영속성 컨텍스트 역할인 1차 캐시에서 조회 된다. ( DB를 거치지 않음 )

이때 entity값이 같으니 m1과 m2는 동일하므로 true가 출력되며, 동일성이 보장된다.

Member m3 = em.find(Member.class, 2L);

이후, 두번째 member2를 조회하려고 할때, 1차 캐시에 없기 때문에 DB에서 조회를 하고, 영속성 컨텍스트 ( 1차캐시 ) 에 저장이 되며, 결과 값을 반환해 조회된다.

5️⃣ 변경 감지 (Dirty Checking)

Member member = em.find(Member.class, 1L);
member.setName("newName");
// em.update(member) --> update를 해야 반영될것이야!
tx.commit(); // 자동으로 UPDATE 쿼리 실행됨

트랜잭션 커밋 시점에 변경된 필드만 감지하여 자동으로 UPDATE 해준다.

6️⃣ 쓰기 지연 (Write-Behind)

em.persist(memberA);
em.persist(memberB);
// INSERT 쿼리는 아직 실행되지 않음

tx.commit(); // 이 시점에 INSERT 쿼리 일괄 실행

성능 최적화를 위해  SQL를 모아뒀다가 커밋시 한번에 실행

7️⃣ 준영속 상태

Member member = em.find(Member.class, 1L);
em.detach(member);
member.setName("hi"); // 변경 감지되지 않음

detach(), clear(), close() 등을 통해 준영속 상태로 전환됨.

✅ flush()란?

  • flush() 는 영속성 컨텍스트의 변경 내용을 즉시 DB에 반영하는 명령어
  • 하지만 트랜잭션은 종료되지 않으며, 이후 commit() 시 또 한번 동기화됨
  • 그렇기에 영속성 컨텍스트를 비우지 않음.

✅ flush vs commit

구분 flush() commit()
시점 명시적으로 호출 트랜잭션 종료 시 자동 호출
역할 SQL 실행 (INSERT/UPDATE/DELETE) flush() 호출 후 트랜잭션 종료 처리
트랜잭션 종료 여부
❌ ✅

➡ flush는  테스트나 로깅 시점에서 SQL을 먼저 보고 싶을 때 사용

8️⃣ 영속성 컨텍스트의 생명주기

일반적으로 @Transactional 범위 내 생성 및 종료

  • 동작흐름 :
    1. 요청 수신
    2. 트랜잭션 시작 ➡ 영속성 컨텍스트 생성
    3. 트랜잭션 커밋/롤백 ➡ 영속성 컨텍스트 종료

9️⃣ 요약 ⭐

  • 영속성 컨텍스트 : JPA가 엔티티를 관리하는 메모리 공간
  • 1차 캐시 : DB 대신 메모리에서 엔티티 조회 (중복 조회 방지)
  • 변경 감지 (Dirty check) : Entity가 값이 바뀌면 트랜잭션 커밋시 자동으로 update
  • 쓰기 지연 : INSERT/UPDATE 쿼리를 모아뒀다가 트랜잭션 종료시 실행
  • 상태 변화 : 비영속 ➡ 영속 ➡ 준영속 ➡ 삭제

 장난만 치고, 부족했던 팀장 잘따라줘서 감사했습니다 !! 😥 

3주간 많이 친해졋었는데 서로 물어보고 배우고 많이 알아간 시간이었습니다. 다른 조가서도 화이팅!! 🔥🔥

(ZEP에서 뒷통수 조심하세요)

22조 마지막날 사진

 

반응형

'[내일배움캠프-Sparta] > Spring 6기' 카테고리의 다른 글

TIL 35 [ Spring 기초 프로젝트 ( Day 2 ) - 구현 (게시판 페이징 작업, 정렬), 깃 기능별 병합 ]  (0) 2025.04.08
TIL 34 [ Spring 기초 프로젝트 ( Day 1 ) - 설계( ERD, API, 와이어프레임 ) ]  (0) 2025.04.07
TIL 32 [ Spring 일정관리 앱 Lv2~5 ]  (0) 2025.04.04
TIL 31 [ Spring 일정관리 앱 Lv0 ~ 1, + 미니세션 ( 예외처리 ) ]  (0) 2025.04.02
TIL 30 [ Spring ( Data JPA ), 스탠다드반 ( Optional ) ]  (0) 2025.04.01
'[내일배움캠프-Sparta]/Spring 6기' 카테고리의 다른 글
  • TIL 35 [ Spring 기초 프로젝트 ( Day 2 ) - 구현 (게시판 페이징 작업, 정렬), 깃 기능별 병합 ]
  • TIL 34 [ Spring 기초 프로젝트 ( Day 1 ) - 설계( ERD, API, 와이어프레임 ) ]
  • TIL 32 [ Spring 일정관리 앱 Lv2~5 ]
  • TIL 31 [ Spring 일정관리 앱 Lv0 ~ 1, + 미니세션 ( 예외처리 ) ]
dimenshun
dimenshun
한 소년의 개발 일기
    반응형
  • dimenshun
    Dev Life Notes
    dimenshun
  • 전체
    오늘
    어제
    • 분류 전체보기 (268)
      • CS (23)
        • 자료구조 (0)
        • 알고리즘 (0)
        • 컴퓨터 구조 (8)
        • 네트워크 (6)
        • 운영체제 (3)
        • DB ( + SQLD ) (5)
        • SW공학 (1)
      • 프로그래밍 (3)
        • Java (0)
        • Spring (0)
        • HTML,CSS (3)
        • JavaScript (0)
      • 개발 툴 (7)
        • Git(버전관리) (1)
        • Docker (3)
        • AWS (2)
        • JSP (1)
      • 코딩테스트(Algorithm) (125)
        • 백준 (6)
        • 프로그래머스 (119)
      • [내일배움캠프-Sparta] (110)
        • Spring 6기 (106)
        • KPT 회고 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    It
    개발자
    메모리
    docker
    컴퓨터구조
    spring
    network
    Testcode
    Til
    웹
    알고리즘
    코딩테스트
    네트워크
    AWS
    SQL
    Java
    OS
    트랜잭션
    Python
    SQLD
    운영체제
    내일배움캠프
    CPU
    db
    cs
    web
    백엔드
    배포
    세션
    KPT
  • hELLO· Designed By정상우.v4.10.3
dimenshun
TIL 33 [ 과제 끝 + 스탠다드반 ( 영속성 컨텍스트 ) ]
상단으로

티스토리툴바