김영한의 ORM 표준 JPA 프로그래밍(기본편) - 영속성 컨텍스트와 플러시

2025. 2. 5. 14:55·김영한의 ORM 표준 JPA 프로그래밍(기본편)

Question

  • 영속성 컨텍스트의 1차캐시에 대해 설명하시오
  • 영속성 컨텍스트의 변경 감지에 대해 설명하시오
  • 플러시 호출 방법 3가지를 설명하시오

 

영속성 컨텍스트

  • 엔티티를 영구 저장하는 환경
  • EntityManager.persist(entity) 이런식으로 사용

 

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

  • 비영속(new/transient): 영속성 컨텍스트와는 전혀 관계가 없는 새로운 상태
  • 영속(managed): 영속성 컨텍스트에 관리되는 상태
  • 준영속(detached): 영속성 컨텍스트에 저장되었다가 분리된 상태
  • 삭제(removed): 삭제된 상태

 

영속성 컨텍스트의 이점

  • 1차 캐시 역할
    • 값 조회시 영속성 컨텍스트에 값이 있으면 DB를 갔다오지 않고 영속성 컨텍스트에서 캐싱 가능
    • 이 캐싱은 트랜잭션 내에서만 유효하므로 엄청난 이점까지는 아님

  • 영속 엔티티의 동일성 보장
    • 위 그림과 같이 영속성 컨텍스트에서 꺼낸 객체의 동일성을 보장함
  • 트랜잭션을 지원하는 쓰기 지연
    • DB에 써야 하는 요청에 대해 쓰기 지연 SQL 저장소에 모아놓고 트랜잭션 커밋시 한 번에 모아서 보냄
    • 이는, IO 작업의 빈도를 줄여 성능을 높임
  • 변경 감지
    • 영속석 컨텍스트 안에 있는 엔티티의 상태를 지속적으로 추적하며, 발생하는 모든 변경 사항은 JPA에 의해 자동으로 추적됨
    • 따라서, em.update와 같은 작업을 해주지 않아도 자동으로 영속성 컨텍스트가 동기화되며 추후 자동으로 DB를 업데이트 시킴
  • 지연 로딩

 

플러시

  • 영속성 컨텍스트의 변경 사항와 DB를 동기화시키는 작업
  • 영속성 컨텍스트를 비우는 것은 아님(flush라는 용어 때문에 헷갈리면 안됨)
  • 호출 방법
    • em.flush()로 직접 호출
    • 트랜잭션 커밋시 자동 호출
    • JPQL 쿼리 실행시 자동 호출
  • JPQL 쿼리 실행시 플러시 자동 호출 이유
    • JPQL 쿼리 실행시 영속성 컨텍스트와 DB간 불일치가 있을 수 있기 때문에 플러시 이후 JPQL 쿼리 수행을 위해
  • 플러시 모드 옵션
    • em.setFlushMode(FlushModeType.AUTO): 커밋이나 JPQL 쿼리를 실행할 때 플러시(기본)
    • em.setFlushMode(FlushModeType.COMMIT): 트랜잭션이 커밋될 때만 플러시가 발생 (JPQL 때 플러시 X)
    • 일반적으로 AUTO 모드로 사용함

 

준영속 상태

  • 준영속 상태로 만드는 명령어
    • em.detach(entity): 특정 엔티티만 준영속 상태로 전환
    • em.clear(): 영속성 컨텍스트를 완전히 초기화
    • em.close() 영속성 컨텍스트를 종료
  • 실제로 준영속 상태를 활용할 일은 많지 않음.

 

 

'김영한의 ORM 표준 JPA 프로그래밍(기본편)' 카테고리의 다른 글

김영한의 ORM 표준 JPA 프로그래밍(기본편) - 상속관계 맵핑과 - @MappedSuperclass  (1) 2025.02.06
김영한의 ORM 표준 JPA 프로그래밍(기본편) - 다대일, 일대다, 일대일, 다대다  (1) 2025.02.05
김영한의 ORM 표준 JPA 프로그래밍(기본편) - 연관관계 단방향 맵핑, 양방향 맵핑  (1) 2025.02.05
김영한의 ORM 표준 JPA 프로그래밍(기본편) - 연관관계맵핑과 Primary Key  (2) 2025.02.05
김영한의 ORM 표준 JPA 프로그래밍(기본편) - JPA, Hibernate, JPQL  (4) 2025.02.04
'김영한의 ORM 표준 JPA 프로그래밍(기본편)' 카테고리의 다른 글
  • 김영한의 ORM 표준 JPA 프로그래밍(기본편) - 다대일, 일대다, 일대일, 다대다
  • 김영한의 ORM 표준 JPA 프로그래밍(기본편) - 연관관계 단방향 맵핑, 양방향 맵핑
  • 김영한의 ORM 표준 JPA 프로그래밍(기본편) - 연관관계맵핑과 Primary Key
  • 김영한의 ORM 표준 JPA 프로그래밍(기본편) - JPA, Hibernate, JPQL
5jyan5
5jyan5
  • 5jyan5
    jyan
    5jyan5
  • 전체
    오늘
    어제
    • 분류 전체보기 (242)
      • 김영한의 스프링 핵심 원리(기본편) (8)
      • 김영한의 스프링 핵심 원리 - 고급편 (11)
      • 김영한의 스프링 MVC 1편 (1)
      • 김영한의 스프링 DB 1편 (3)
      • 김영한의 스프링 MVC 2편 (3)
      • 김영한의 ORM 표준 JPA 프로그래밍(기본편) (9)
      • 김영한의 스프링 부트와 JPA 활용2 (2)
      • 김영한의 실전 자바 - 중급 1편 (1)
      • 김영한의 실전 자바 - 고급 1편 (9)
      • 김영한의 실전 자바 - 고급 2편 (9)
      • Readable Code: 읽기 좋은 코드를 작성.. (2)
      • 김영한의 실전 자바 - 고급 3편 (9)
      • CKA (118)
      • 개발 (37)
      • 경제 (4)
      • 리뷰 (1)
      • 정보 (2)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      Thread
      @discriminatorvalue
      hibernate5module
      양방향 맵핑
      스레드
      조회 성능 최적화
      Target
      JPQL
      log trace
      jdk 동적 프록시
      requset scope
      프록시
      단방향 맵핑
      @within
      reentarantlock
      gesingleresult
      버퍼
      WAS
      프록시 팩토리
      고급
      typequery
      @args
      페치 조인
      @discriminatorcolumn
      락
      jpq
      cglib
      빈 후처리기
      자바
      김영한
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.2
    5jyan5
    김영한의 ORM 표준 JPA 프로그래밍(기본편) - 영속성 컨텍스트와 플러시
    상단으로

    티스토리툴바