TIL

JPA 영속성 컨텍스트 정의 및 핵심요약

빈코 2022. 5. 12. 11:13

스프링 부트와 JPA를 공부하다가 update 기능에서 데이터베이스에 쿼리를 날리지 않아도 기능이 원활하게 수행되는 코드를 보게 되었습니다. 찾다 보니 JPA의 영속성 컨텍스트와 관련이 있는 걸 알아서 이 부분에 대해 포스팅해보려 합니다.

 

jpa로고
출처 : inflearn

 

JPA 영속성 컨텍스트

JPA 영속성 컨텍스트(Persistence Context)란 엔터티를 영구 저장하는 환경이라는 뜻으로, 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할을 한다. EntityManager에 엔티티를 저장하거나 조회하면 EntityManager는 영속성 컨텍스트에 엔티티를 보관하고 관리한다. 

 

Entity를 영속성 컨텍스트에 저장하는 코드이며, 해당 코드는 DB에 저장이 안 된 상태이다.(트랜잭션이 끝나야 DB에 반영을 한다) 

entityManager.persist(entity);

 

특징

컨테이너환경
출처 : https://velog.io/@seongwon97/Spring-Boot-%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8Persistence-Context

 

  • 영속성 컨텍스트는 논리적인 개념입니다.
  • 영속성 컨텍스트는 엔티티 매니저를 생성할 때 하나 만들어지며, 엔티티 매니저를 통해서 영속성 컨텍스트에 접근하고 관리할 수 있습니다.
  • 스프링에서 EntityManager를 주입받아서 쓰면, 같은 트랜잭션의 범위에 있는 EntityManager는 동일 영속성 컨텍스트에 접근합니다.

 

영속성 컨텍스트를 사용하는 이유

  1. 1차 캐시 (조회 기능을 높여준다)
  2. 동일성 보장
  3. 트랜잭션을 지원하는 쓰기 지연

 

1차 캐시

영속성 컨텍스트 내부에는 캐시가 있는데 이를 1차 캐시라고 부릅니다. 캐시는 Map의 형태로 만들어지며 key는 id값, value는 해당 entity값이 들어 있습니다. 

Browser browser = em.find(Browser.class, "Google");

 

  • 1차 캐시에서 엔티티를 첫 번째로 찾습니다. 해당 엔티티가 있으면 바로 반환해줍니다.
  • 1차 캐시에 없을 경우 데이터베이스에서 조회합니다. 조회한 데이터로 엔티티를 생성해 1차 캐시에 저장합니다. 이후 엔티티를 반환합니다.

 

 

동일성 보장

영속성 컨텍스트는 엔티티의 동일성을 보장합니다.

동일성 비교 : 실제 인스턴스가 같고, ==을 사용해 비교한다.
동등성 비교 : 실제 인스턴스는 다를 수 있지만 인스턴스가 가지고 있는 값이 같다. equals() 메서드로 비교한다.

 

트랜잭션을 지원하는 쓰기 지연

entityManager.flush();

entity값을 변경하면 DB에 바로 업데이트하지 않습니다. 트랜젝션 내부에서 영속 상태의 entity의 값을 변경하면 Insert SQL Query들은 DB에 바로 보내지 않고 쿼리 저장소에 쿼리문들을 생성해서 쌓아둡니다. 이후 entityManager의 flush()나 트렌젝션의 commit을 통해 보내지게 됩니다.

 

 

Example

앞서 말씀드린 update에 관련된 예제 코드를 작성해보았습니다.

@Tramsactional
public Long update(Long id, PostsUpdateRequestDto requestDto) {
	Posts posts = postsRepository.findById(id).orElseThrow(() ->
    new IllegalArgumentException("해당 게시글이 없습니다. id ::"+ id));
    
    posts.update(requestDto.getTitle(), requestDto.getContent());
    
    return id;
}

 

JPA의 엔티티 매니저가 활성화된 상태로(Spring Data Jpa를 쓰고 계신다면 기본 옵션) 트랜잭션 안에서 데이터베이스에서 데이터를 가져오면 이 데이터는 영속성 컨텍스트가 유지된 상태입니다.

 

이 상태에서 해당 데이터의 값을 변경하면 트랜잭션이 끝나는 시점에 해당 테이블에 변경분을 반영합니다. 즉 Entity 객체의 값만 변경하면 별도로 Update 쿼리를 날릴 필요가 없게 되는 것입니다. 이 개념을 더티 체킹(dirty checking)이라고 합니다.

 

Drity Checking의 흐름
1. 트랜잭션을 커밋하면 entityManager의 내부에서 먼저 플러시가 호출된다.
2. 엔티티와 스냅샷을 비교하여 변경된 엔티티를 찾는다.
3. 변경된 엔티티가 있으면 수정 쿼리를 생성해서 쓰기 지연 SQL 저장소에 저장한다.
4. 쓰기 지연 저장소의 SQL을 플러시 한다.
5. 데이터베이스 트랜잭션을 커밋한다.

 

혹여나 Dto, Service 단 등 좀 더 예제에 대해 알고 싶으시다면 깃허브에 올려놓았으니 참고하시면 될 것 같습니다.

 

 

엔티티의 생명주기

생명주기
생명주기

 

비영속

엔티티 객체를 생성했지만 아직 영속성 컨텍스트에 저장하지 않은 상태를 비영속이라 한다.

Browser browser = new Browser();

 

영속

엔티티 매니저를 통해서 엔티티를 영속성 컨텍스트에 저장한 상태를 말하며 영속성 컨텍스트에 의해 관리된다는 뜻.

em.persist(browser)

 

준영속

영속성 컨텍스트가 관리하던 영속 상태의 엔티티를 더이상 관리하지 않으면 준영속 상태가 된다. 특정 엔티티를 준영속 상태로 만드려면 em.datach()를 호출하면 된다.

 

em.detach(browser); // 엔티티를 준영속 상태로 만듬
em.clear(); // 비워도 준영속 상태로 된다.
em.close(); // 종료해도 준영속 상태로 된다.

 

◈ 준영속 상태에서는 1차 캐시, 쓰기 지연, 변경 감지, 지연 로딩을 포함한 영속성 컨텍스트가 제공하는 어떠한 기능도 동작하지 않는다. 식별자 값은 가지고 있다.

 

 

삭제

엔티티를 영속성 컨텍스트와 데이터베이스에서 삭제한다.

em.remove(browser);

 

 


👨‍👩‍👦‍👦 오픈채팅방 운영

취업을 준비하는 예비 개발자분들을 위한 질문&답변할 수 있는 공간을 만들었습니다. 취업과 이직을 하기 위해서 어떤 걸 중점적으로 준비해야 하는지부터 포트폴리오&이력서 작성법 등 다양한 질문들을 받고 답변을 드립니다. 참여하셔서 다양한 정보 얻고 가시면 좋을 것 같네요😁

 

참여코드 : 456456

https://open.kakao.com/o/gVHZP8dg

 

비전공 개발자 취업 준비방(질문&답변)

#비전공 #개발자 #취업 #멘토링 #부트캠프 #국비지원 #백엔드 #프론트엔드 #중소기업 #중견기업 #자바 #Java #sql

open.kakao.com

 


👨‍💻 전자책 출간

아울러 제가  🌟비전공자에서 2년만에 보안 전문 중견기업으로 이직 한 방법들을 정리한 전자책을 출간 하게 되었습니다. 어떤 걸 공부해야 하는지, 이직을 위해서 무엇을 준비해야 하는지, 제가 받았던 기술 면접 리스트 등 다양한 목차로 구성되어 있습니다. 또한, 구매 시 1:1 채팅을 이용하여 포트폴리오 첨삭을 도와드리고 있습니다. 🐕전자책으로 얻은 모든 수익은 유기견 센터 '팅*벨 입양센터'에 후원될 예정입니다. 관심 있으신 분들은 아래 링크를 참고해주세요😁

https://kmong.com/gig/480954

 

비전공개발자 2년만에 중견기업 들어간 방법 | 14000원부터 시작 가능한 총 평점 0점의 전자책, 취

0개 총 작업 개수 완료한 총 평점 0점인 Binco의 전자책, 취업·이직 전자책 서비스를 0개의 리뷰와 함께 확인해 보세요. 전자책, 취업·이직 전자책 제공 등 14000원부터 시작 가능한 서비스

kmong.com


 

마치며

지금까지 JPA의 영속성 컨텍스트를 알아보았습니다. JPA를 사용할 때 필수로 숙지해야 하는 부분이기 때문에, JPA를 사용해야 할 예정이라면 꼭 읽어보시길 바랄게요. 

 

 

JAVA 관련 포스팅

* [ 객체 지향 프로그래밍(OOP)이란? ]

* [ 추상 클래스 VS 인터페이스 ]

* [ Java Enum Class ]

* [ JPA의 정의와 장 ·단점 ]

* [ Java MVC Pattern 바로 알기 ]

 

반응형

'TIL' 카테고리의 다른 글

Java 추상 클래스와 인터페이스 구분  (0) 2022.05.18
객체 지향 프로그래밍(OOP)이란?  (0) 2022.05.16
JPA의 정의와 장·단점  (0) 2022.05.10
가짜 데이터 생성 Faker.js 파헤치기  (0) 2022.05.03
Maven VS Gradle  (0) 2022.05.02