Spring 입문 2주차 (3)

신성훈·2024년 5월 22일

TIL

목록 보기
22/162
post-thumbnail

오늘의 학습 키워드

  • 영속성 컨텍스트 기능
  • Entity의 상태

영속성 컨텍스트 기능

  • 영속성 컨텍스트는 Entity 객체를 효율적으로 쉽게 관리하기 위해 만들어진 공간
    -1차 캐시

    • 내부적으로 캐시 저장소를 가지고 있으며, 캐시 저장소는 Map 자료구조 형태로 되어있다.
      • key에는 @Id로 매핑한 기본 키
      • value에는 해당 Entity 클래스의 객체를 저장

    -Entity 저장

    • em.persist(memo); 메서드가 호출되면 memo Entity 객체를 캐시 저장소에 저장


    -Entity 조회

    • 캐시 저장소에 조회하는 Id가 존재하지 않은 경우
      -em.find() 호출 시, 캐시 저장소에 없다면 DB에 SELECT로 조회하여 캐시 저장소에 저장한 후 반환한다.
    • 캐시 저장소에 조회하는 Id가 존재하는 경우
      -em.find() 호출 시, 캐시 저장소에 식별자 값이 1이면서 Memo Entity 타입인 값이 있다면 해당 Entity 객체를 반환

    -1차 캐시 장점

    • DB 조회 횟수 단축
    • '1차 캐시'를 사용해 DB row 1개 당 객체 1개가 사용되는 것을 보장 (객체 동일성 보장)

    -Entity 삭제

    • em.remove(entity); 삭제할 Entity를 조회한 후 캐시 저장소에 없다면 DB에 조회해서 저장
    • em.remove(entity); 호출 시 삭제할 Entity를 DELETED 상태로 만든 후 트랜잭션 commit 후 Delete SQL이 DB에 요청된다.

    -쓰기 지연 저장소

    • 트랜잭션 commit 호출 전까지는 SQL 요청이 없다가 트랜잭션 commit 후 한번에 DB에 반영한다.

    -flush()

    • 트랜잭션 commit 후 추가적인 동작 -> em.flush(); 메서드의 호출
    • flush 메서드는 영속성 컨텍스트의 변경 내용들을 DB에 반영하는 역할을 수행
      -> 쓰기 지연 저장소의 SQL들을 DB에 요청하는 역할을 수행

    -변경감지 (Dirty Checking)

    • 변경하고 싶은 데이터가 있다면 먼저 데이터를 조회하고 해당 Entity 객체의 데이터를 변경하면 자동으로 Update SQL이 생성되고 DB에 반영된다.

Entity의 상태

  • 비영속(Transient)
    -new 연산자를 통해 인스턴스화 된 Entity 객체를 의미
    -아직 영속성 컨텍스트에 저장되지 않았기 때문에 JPA의 관리를 받지 않는다

  • 영속(Managed)
    -persist(entity) : 비영속 Entity를 EntityManager를 통해 영속성 컨텍스트에 저장하여 관리되고 있는 상태로 만든다.

  • 준영속(Detached)
    -영속성 컨텍스트에 저장되어 관리되다가 분리된 상태를 의미
    -영속 상태에서 준영속 상태로 바꾸는 법
    -> detach(entity) : 특정 Entity만 준영속 상태로 전환
    ->영속성 컨텍스트에서 관리되다(Managed)가 분리된 상태(Detached)로 전환됨

  • clear()
    -영속성 컨텍스트를 완전히 초기화
    -> 영속성 컨텍스트의 모든 Entity를 준영속 상태로 전환

  • close()
    -영속성 컨텍스트를 종료
    -> 영속성 컨텍스트가 종료되었기 때문에 계속해서 영속성 컨텍스트를 사용할 수 없다.

  • 준영속 상태에서 다시 영속 상태로 바꾸는 법
    -merge(entity)
    -> 전달받은 Entity를 사용하여 새로운 영속 상태의 Entity를 반환
    -> 비영속, 준영속 모두 파라미터로 받을 수 있으며 상황에 따라 ‘저장’을 할 수도 ‘수정’을 할 수도 있다.

  • 삭제(Removed)
    -remove(entity) : 삭제하기 위해 조회해온 영속 상태의 Entity를 파라미터로 전달받아 삭제 상태로 전환

📝오늘의 회고

화이팅!
오늘도! 쳐지지 말고 포기하지말고 힘내서 가보자고~~~

profile
조급해하지 말고, 흐름을 만들고, 기록하면서 쌓아가자.

0개의 댓글