프로젝트를 하면서, 스프링 데이터 JPA와 영속성 컨텍스트의 개념에 대해 헷갈린 부분이 있었다.
분명, 값을 업데이트하면, 따로 update나 save()를 쓰지 않아도 자동으로 값이 변경되는 더티체킹에 대해 배웠다.
하지만 구글링 결과, 다른 사람들의 프로젝트에서 repository.save()를 해서 업데이트 된 값을 따로 저장해주는 것을 볼 수 있었다.
왜일까??
그리고 DB상에 존재하는 값을 변경할때,
1. Post객체가 있으면, post.id가 같은 것을 찾고,
2. 이 객체의 값을 변경해준다음에,
3. post.id = ? 가 맞는 것을 찾아, 값을 업데이트 해주면 될 것이라고 생각했다.
하지만 스프링 데이터 JPA에는 따로 where post_id = ?
와 같은 쿼리를 쓰는 기능은 없다. 이런식으로 where절의 조건을 붙이려면, JPQL을 쓰거나, QueryDsl을 써야 했다.
하지만, 깃허브에서 돌아다니는 많은 코드를 분석해본 결과 원래 존재하던 객체의 값을 업데이트해줄때는 해당 객체의 값을 변경해준뒤, where절 없이 그냥 repository.save()
를 사용해주는 것을 볼 수 있었다.
코드를 실행해본 결과, repository.save(객체)
를 실행한 결과 스프링 데이터 JPA에서 자동으로 where post_id = 객체.post_id 을 만족하는 것을 찾아서, 업데이트된 객체를 저장해주는 것을 알 수 있었다.