Spring boot JPA 영속성 컨텍스트

이진석·2022년 10월 9일
1

먼저, 스프링 부트에 대해서 공부하면서 궁금했던 부분이 있었는데, 바로 repository.save를 할 때 어떻게 insert 인지 아니면 update인지를 구분하는가였다. 이 궁금증이 JPA 영속성 컨텍스트에 대해 공부하면서 어느정도 해결이 되었다.

Spring boot JPA 영속성 컨텍스트란?

엔티티를 영구 저장하는 환경으로 어플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 역할을 한다.

영속성 컨텍스트 1차 캐시

영속성 컨텍스트는 내부에 (id, instance) 맵 형태를 갖고 있는 캐시를 가지고 있는데 여기에 엔티티들이 저장된다.

User firstUser = new User("user1", "홍길동", "치킨"); //각 값들은 username, nickname, favoritefood를 나타낸다.
User savedFirstUser = userRepository.save(firstUser); // 이를 통해 user1 객체를 영속화 한다.

위와 같은 과정을 통해 객체가 영속성 컨텍스트에 들어가면 1차 캐시는 이를 담는다.

  • Entity 저장

  • Entity 조회

    • 1차 캐시에 해당 id가 있을 경우

    • 1차 캐시에 해당 id가 없을 경우

1차 캐시 사용의 장점

  • DB 접근 횟수를 줄인다.
  • DB row 1개당 객체 한개가 사용되는 것을 보장한다.
    • 값 뿐만 아니라 인스턴스 자체가 같음
  • 트랜잭션을 지원하는 쓰기 지연
    • entity 값을 변경하면 DB에 바로 업데이트 하지 않는다.
    • 트랜젝션 내부에서 영속 상태의 entity 값을 변경하면 insert query들은 DB에 바로 보내지 않고 쿼리 저장소에 쌓아둔다.
    • 쿼리 저장소에 있는 쿼리들은 entityManager의 flush()나 트랜잭션의 commit을 통해 보내지게 된다.
    • flush()는 1차 캐시 값을 지우지 않고 쿼리를 DB에 보내서 DB와의 싱크를 맞추는 역할을 한다.
  • 변경을 감지한다.
    • entity 값의 변경이 일어났을 때 개발자가 영속성 컨텍스트에 따로 알려주지 않아도 알아서 변경 사항을 체크해준다. (Dirty Checking)
profile
고양이 두마리의 집사이자 행복 코딩을 추구하는 주니어 개발자입니다!

0개의 댓글

관련 채용 정보