개발 일기
JPA 영속성 컨텍스트를 간과하고 있었다
Egu99
2022. 6. 16. 10:34
jpa는다 좋은데 업데이트 쿼리를 쓰려면 항상 문제가 있었다.
동적인 쿼리를 사용하고자 querydsl을 썼는데 이 querydsl은 영속성 컨텍스트를 무시하고 바로 db에 쿼리를 날려버린다.
즉, querydsl로 업데이트 쿼리를 날려서 실제 db의 entity가 변경되더라도
영속성 컨텍스트의 1차 캐시에 있는 entity는 변하지 않기 때문에
조회를 해보면 업데이트 쿼리를 날리기 전의 entity를 리턴한다.
프로젝트에서 업데이트를 사용한 대부분의 기능들이 이를 간과하고 있었는데
이는 프론트로 보내는 리턴값, 그리고 프론트에서 코드를 잘못 짰기 때문에 지금까지 눈치채지 못했다....
아, 프론트도 나니까 다 내 잘못이구나
detach를 쓰면 1차 캐시에서 entity가 준영속화가 되는데
1. 업데이트 전에 detach를 써주고
2. 업데이트 이후 다시 find하면 entity는 이미 1차 캐시에 없기 때문에 db에서 가져와 영속화를 한다.
이렇게 하면 업데이트된 entity가 영속성 컨텍스트에 담을 수 있게 된다.
그런데 이렇게 사용하는 게 맞는지 잘 모르겠다
동작 순서를 보면 merge를 사용하면 될 거 같은데 적용이 안된다.
알게 되면 다시 글을 쓰는 걸로 하고
일단 마무리 되는대로 영속성 컨텍스트에 대해 따로 정리해봐야겠다