영속성 컨텍스트와 더티체킹

tyghu77·2021년 12월 30일
0

스프링 부트의 UPDATE

스프링 부트에서 업데이트 하는 방식은 조금 특이하다. 바로 JPA가 가진 영속성 컨텍스트의 더티체킹을 통한 업데이트인데 그것을 이해하려면 영속성 컨텍스트와 더티체킹에 대해 알아야 한다.

영속성 컨텍스트(Persistence Context)

영속성(Persistence) : 데이터를 영구적으로 저장하는 것(DB)
컨텍스트(Context) : 어떤 대상의 모든 정보를 갖고있는 것

즉, 영속성 컨텍스트는 자바가 DB에 데이터를 insert, select 등을 하는 일련의 모든 정보를 알고 있는 것이다. 그래서 자바는 항상 영속성 컨텍스트를 통해 DB에 데이터를 저장하고, DB의 데이터 또한 영속성 컨텍스트를 통해 자바쪽으로 전달된다.

영속성 컨텍스트 내부에는 1차 캐시라는 것이 있는데, 예를들어 user객체를 insert한다고 하면 1차 캐시 내부에 user객체가 만들어 진다. 이것을 영속화 되었다고 한다. 그리고 이 user객체를 영속성 컨텍스트가 DB에 밀어넣는 것을 flush라고 한다. flush를 하면 DB에 해당 정보를 밀어 넣는데 특이한 것은 1차 캐시 내부의 객체를 비우지 않는다는 것이다.

내부의 객체를 비우지 않기 때문에 SELECT를 한다고 하면 첫번째로 영속화 되었는지를 체크하고 영속화 되어있다면, DB로 가서 들고오지 않고 영속화되어있는 것을 들고온다. 이렇게 하면 DB에 접근하지 않아도 되기 때문에 부하를 덜 수 있다.

더티체킹

user 테이블

id...pwdemail
1~~~
2~~~

2번 user의 pwd와 email을 update 한다고 가정해보자.
DB에서 user 테이블의 데이터중 2번데이터를 영속성 컨텍스트에 들고오면, 2번 user 객체가 1차 캐시에 만들어지고 영속화 된다. (SELECT하여 객체를 들고올 때 영속화 됨)
pwd와 email을 변경한 뒤 save하고 함수가 종료된다. 함수 종료와 동시에 commit이 된다.
commit이 되면 영속성 컨텍스트가 처음에 있던 pwd와 email과 변경된 pwd, email을 비교하여 변경된 것을 인식하고 함수 종료 시에 DB에 flush하며 update가 된다.

즉, 객체를 영속화 시키고 그 값을 변경시키게 되면 transaction이 종료되었을 때 영속성 컨텍스트가 변경을 감지한다. 변경을 감지해서 DB에 update를 하는데, 이것을 더티체킹이라고 한다.

요약

UPDATE를 한다고 했을때,
1. SELECT를 하여 DB에서 들고와서 영속화를 시킨다.
2. user값을 변경한다.
3. 변경된 user 객체를 save한다.
4. 1차캐시 내부의 user객체와 비교한다.
5. (영속성 컨텍스트가)영속화된 객체에 변경된 부분만 update한다.
6. flush해서 밀어넣으면 자동으로 변경된다.

profile
배운것을 기록하자

0개의 댓글