[TIL #6] 항해99 2023.02.11

강민규·2023년 2월 12일
0
post-thumbnail

어제 적었던 TIL 주제에서 JPA를 다뤘는데
JPA(Java Persistence API)의 풀네임에서 Persistence는 영속성을 의미합니다.
즉, 영속성을 알고 넘어가지 않으면 JPA를 완벽하게 이해하지 못할것 같아서

오늘은 "영속성"에 대하여 끄적여 보려고 합니다.


🤔 영속성 ?

사전적 의미를 찾아보면

영속성이란, 영원히 계속되는 성질이나 능력 이라고 합니다.

사전적 의미를 응용하여 접근한다면, 데이터를 생성한 프로그램이 종료되어도 사라지지 않는 데이터의 특성이라고 생각하면 될것 같습니다.

영속성을 갖지 않으면 데이터는 메모리에서만 존재하게 되고 프로그램이 종료되면 해당 데이터는 모두 사라지게 됩니다.

그래서 우리는 데이터를 파일이나 DB에 영구 저장함으로써 데이터에 영속성을 부여합니다.


📌 JPA에서의 영속성

JPA의 핵심 내용은 엔티티가 영속성 컨텍스트에 포함되어 있냐 아니냐로 갈립니다.

JPA의 엔티티 매니저가 활성화된 상태로 트랜잭션(@Transactional) 안에서 DB에서 데이터를 가져오면 이 데이터는 영속성 컨텍스트가 유지된 상태입니다.

이 상태에서 해당 데이터 값을 변경하면 트랜잭션이 끝나는 시적에 해당 테이블에 변경 내용을 반영하게 된다. 따라서 우리는 엔티티 객체의 필드 값만 변경해주면 별도로 update()쿼리를 날릴 필요가 없게 됩니다.! 이 개념을 더티 체킹이라고 합니다.

더티체킹에 대해서는 다음 TIL에 작성해보도록 하겠습니다.


📌 영속성 컨텍스트란 ?

위에서도 말했다시피 영속성 컨텍스트(Persistence Context)는 "엔티티를 영구 저장하는 환경" 이라는 뜻으로 사용됩니다.

  • 엔티티 매니저로 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에
    엔티티를 보관하고 관리합니다.

  • 엔티티 매니저를 생성할 때 하나가 만들어집니다.

  • 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 DB에 반영합니다
    == flush()

  • 영속 상태의 엔티티는 모두 영속성 컨텍스트의 내부 캐시(1차 캐시) 에 저장합니다.

  • 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스와 같은 역할을 합니다.

  • 조회한 엔티티만 영속성 컨텍스트가 관리하게 됩니다.

🟢 영속성 컨텍스트의 장점

  • 1차 캐시로써의 저장
  • 동일성 보장
  • 트랜잭션을 지원하는 쓰기 지연
  • 변경(커밋) 감지
  • 지연로딩

■ 비영속
: 영속성 컨텍스트와 전혀 관계가 없는 상태 (순수한 객체 상태)

■ 영속
: 엔티티 매니저를 통해 엔티티를 영속성 컨텍스트에 저장 (영속성 컨텍스트에 의해 관리)

■ 준영속
: 영속성 컨텍스트에 저장되엇다가 분리 및 해제된 상태

📌 엔티티를 준영속 상태로 전환하는 방법

em.detach(entity) : 특정 엔티티만 준영속 상태로 전환, 영속성 컨텍스트로부터 분리

  • 1차 캐시, 쓰기 지연 SQL 저장소 정보 제거

  • 영속 상태였다가 더는 영속성 컨텍스트가관리하지 않는 상태

  • 쓰기 지연 SQL 저장소의 Insert SQL 도 제거되어 DB에 저장되지 않음

em.clear() : 영속성 컨텍스트를 완전히 초기화

  • 영속성 컨텍스트를 초기화해서 해당 영속성 컨텍스트의 모든 엔티티를 준영속 상태로 만듦

  • 영속성 컨텍스트를 제거하고 새로 만든 것과 같음

em.close() : 영속성 컨텍스트를 종료

  • 해당 영속성 컨텍스트가 관리하던 영속 상태의 엔티티가 모두 준영속 상태로


📌 엔티티를 영속 상태로 전환하는 방법

em.merge(entity), 병합 : 준영속 상태의 엔티티를 다시 영속 상태로 변경, 새로운 영속 상태의 엔티티를 반환

  • 파라미터로 넘어온 엔티티의 식별자 값으로 영속성 컨텍스트를 조회하고 찾는 엔티티가 없으면,

    데이터베이스에서 조회.

  • 만약 데이터베이스에서도 발견하지 못하면 새로운 엔티티를 생성해서 병합

  • 병합은 준영속, 비영속을 신경쓰지 않고, 식별자 값으로 엔티티를 조회할 수 있으면

    불러서 병합하고 조회할 수 없으면 새로 생성해서 병합,

  • 병합은 save or update 기능 수행

0개의 댓글