출처:
https://www.youtube.com/watch?v=dDsI1J4QC6g&list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&index=31
Insert한다고 치면
Controller에서 user객체 만들어서 save하면
JPA 1차 캐시안에 user객체가 쌓인다.
그리고 DB에 넣는다.
만약 예를 들어 db3개가 있다면
4번째가 생긴다
그럼 1차 캐시에
user가 생긴걸
영속화라 한다
그리고 db에 넣는걸 flush라 한다.
예로 창고에 물건이 꽉차면 다른 창고에 넣어두면 비울수 있다.
대신 다른건 JPA 1차 캐쉬에 user가 날라가지 않는다.
그래서 DB로 부터 가져오지 않고 JPA에서 Controller로 바로 회신가능
여기서 2번 Update하고 싶다
그럼 2번을 JPA 1차 캐시에 가져온다.
그럼 이 상황은 위와 같다.
그리고나서 영속화된 2번user를 변경한다.
이렇게 변경한걸 다시 save하려 하면
save하려던 것과 기존 영속화된 2번 user를 비교했더니 같다.
그럼 바뀐 값만 update해준다.
그 후 flush해서 update된 2번 user를 DB 2번에 넣으면 update가 완료된다.
이 함수가 종료될때 Transactional이 뭘 하냐면
함수 종료시에 자동 commit이 됨.
이게 왜 update가 되냐면
언제 영속화 되냐면
47행 이때 영속화 된다
영속화된 후
50, 51행에서 user오브젝트 변경 (이건 영속화된 오브젝트임)
그럼 영속화된거랑 변경된걸 비교해서 자동으로 변경됐다고 인식을 함.
그 뒤 종료되면 commit으로 DB에 업데이트해 준다.
이걸 더티체킹이라한다.
'Spring > Spring boot' 카테고리의 다른 글
스프링부트 강좌 31강(블로그 프로젝트) - Exception처리하기 (0) | 2022.01.23 |
---|---|
스프링부트 강좌 30강(블로그 프로젝트) - 삭제하기 테스트 (0) | 2022.01.23 |
스프링부트 강좌 28강(블로그 프로젝트) - update 테스트 (0) | 2022.01.22 |
스프링부트 강좌 27강(블로그 프로젝트) - 전체 select 및 paging 테스트 (0) | 2022.01.22 |
스프링부트 강좌 26강(블로그 프로젝트) - id로 select 테스트 (0) | 2022.01.22 |
댓글