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

영속성 컨텍스트?

영속성 컨텍스트는 JPA안에 존재하는 개념인데,
우리가 만든 컨트롤러에서 save메소드를 호출하게 되면,

영속성 컨텍스트에 1차 캐시라는 것이 생성되고,
1차 캐시에 우리가 save메소드의 인자로 보낸 객체가 쌓인다.
이 과정을 영속화 되었다고 한다.

이렇게 영속화된 객체를 실제 DB에 저장하는 행위를 flush라고 한다.
근데 flush이후에 1차 캐시에는 여전히 해당 객체가 남아있다.
나중에 영속화된 객체를 select하는 경우, 데이터베이스에 가지 않고 JPA의 1차 캐시에서 가져오기 때문이다.

update하는 경우에도 비슷하다.
DB에서 원하는 데이터를 1차 캐쉬에 영속화시키고,
컨트롤러가 가져와 수정한다.
수정이 끝난 객체를 다시 1차 캐쉬에 영속화 시켜야 하는데,

이때, 1차 캐쉬에는 이미 변경 전 데이터가 영속화되어있다.
그리고 변경 후 데이터를 영속화(save메소드)시키려 할 때, 변경 전 데이터와 id값이 같으므로,
그냥 변경 전 데이터를 변경 후 데이터처럼 수정 시키는 것으로 영속화를 대신한다.

@Transaction 어노테이션

해당 메소드가 종료되면 자동으로 commit한다! (변경 여부를 파악하고 변경된 경우만 DB에 업데이트!)
=> 이 기능이 바록 더티 체크
일반적으로 DB에서는 변경사항을 모았다가 한번에 반영하는 것을 의미하지만,
JPA에서는 변경사항을 인식해서 반영하는 것을 의미한다.
[더티체크_예시]

Share