작성
·
6.7K
2
예제를 따라 보고 하다가 문의가 있습니다.
강사님의 경우 UPDATE를 테스트 코드에 작성을 하실때 아래와 같이 하셨습니다,
Post save = savePost();save.setTitle("hibernate");
List<Post> posts = postRepository.findAll();
assertThat(posts.get(0).getTitle()).isEqualTo("hibernate");
위 의 경우 발생되는 쿼리를 보면 UPDATE & SELECT 쿼리가 모두 발생합니다.
저는 아래와 같이 findAll() 대신에 findById() 메서드를 통해 테스트 해보았습니다.
Post save = savePost();<p>save.setTitle("hibernate");Optional<Post> post = postRepository.findById(save.getId());
assertThat(post.get().getTitle()).isEqualTo("hibernate");
테스트 결과는 Pass이나 발생되는 쿼리를 보면 실제 DB쪽으로는 UPDATE, SELECT 쿼리 모두 발생하지 않습니다.
JPA Query 메서드인 findAll() 와 findById()가 차이가 있는 것인지 궁금합니다.
늘 빠르게 피드백 주셔서 감사드립니다.
답변 1
5
findAll을 하면 해당 테이블에 있는 모든걸 가져와야 하니까 update를 해야되요. 이 트랜잭션 밖에서 무슨일이 벌어져서 해당 테이블에 무슨 변화가 있었는지 모를 일이니까요. 그러니까 그전에 update도 발생합니다. 현재 트랜잭션 안에서 벌어진 일도 반영하고 select를 해야 현재 가장 최신 상태의 데이터를 가져오는 것이니까요.
그런데 findById는 한건에 대한 데이터자나요. 그리고 또 그 한건이 현재 트랜잭션 안에서 변경중인 데이터구요. 해당 변경 사항은 이미 persistent context가 추적하는 중이었기 때문에 update나 select가 발생할 필요없이, persistent context 안에서 캐싱하고 있던 객체를 찾아주기 때문에 update와 select 모두 발생하진 않았지만, 해당 코드가 테스트가 아니라 일반 애플리케이션 코드였다면 아마 트랜잭션 끝나고 update는 발생했을 겁니다.