• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

JPQL실행 후 캐시의 엔티티에는 변경사항이 적용이 안 되는 건가요?

22.11.07 20:44 작성 조회수 363

0

[질문 내용]
강의를 보다가 의문이 생겨서 질문드립니다!

JPQL을 수행하면 자동으로 flush된다고 하셨는데,

이 때 캐시의 엔티티는 그대로 보존이 된다면

만약에 JPQL이 UPDATE쿼리일 경우 엔티티의 변경 없이 단순 쿼리로만 UPDATE를 수행하고 DB에 반영이 될 경우에는 다시 조회를 해도 캐시에 있는 변경되지 않은 엔티티를 반환하기 때문에 변경된 내용이 적용이 안 되지 않나요?

개인적으로 궁금해서 조금 실험해 본 결과로는 JPQL을 통한 데이터 변경 시 flush는 되지만 캐시의 엔티티에 변경사항이 적용되지는 않는 것 같았습니다.

 

하지만 이렇게 되면, 자신이 변경한 사항을 자신이 볼 수 없는 경우의 수가 생기는 것 아닌가요? 이 부분은 JPA의 특징이라 실제로도 조심해야 하는 부분 중에 하나일까요?

답변 1

답변을 작성해보세요.

0

y2gcoder님의 프로필

y2gcoder

2022.11.07

안녕하세요. 공부용님, 공식 서포터즈 y2gcoder입니다.

강의를 다 보게 되면 이해하시겠지만, 대다수의 경우에 JPQL은 검색용이기 때문에 SELECT 문으로 사용합니다. 이 점을 먼저 이해하시고 다음을 봐주시길 바랍니다.

보통 JPA에서 CRUD 중 CUD에 해당하는 작업들은 쓰기 지연 SQL 저장소에 모여있다가, 트랜잭션 커밋 전에 날라가게 됩니다. 근데 만약 먼저 수정하고 JPQL을 통해 해당 엔티티를 조회할 때는 당연히 우리 개발자는 미리 수정작업을 해놨으니까 수정이 반영된 데이터를 DB에서 불러오는 게 자연스럽습니다. 그런데 쓰기 지연 SQL 저장소에 있는 UPDATE SQL이 반영되지 않으면 당연히 DB에서 조회한 데이터는 수정 이전의 데이터를 불러오게 되는 괴리가 발생합니다. 그래서인지 JPQL을 수행할 때는 무조건 flush를 수행해 쓰기 지연 SQL 저장소에 있는 쿼리를 모두 DB로 보내 DB와 영속성 컨텍스트에 있는 데이터를 동기화하는 작업을 해주게 됩니다.

반면에 JPQL 중 UPDATE SQL로 변환되는 벌크 연산이라는 어찌 보면 특수한 케이스가 존재합니다. (강의 마지막에 등장하고 영한님께서 제가 앞으로 말씀드릴 모든 내용을 더 정확하게 알기 쉽게 말씀해주십니다.) 이 때는 말씀해주셨던 것처럼 UPDATE SQL이 바로 DB로 날아가지만, 영속성 컨텍스트를 무시하고 나갑니다. 즉 해당 내용이 영속성 컨텍스트에 반영되지 않습니다. 이 때는 영속성 컨텍스트를 초기화 하고 다시 불러오는 작업을 해주셔야 합니다.

덧붙여서 예를 들어 더티 체킹 후 변경한 엔티티를 JPQL로 다시 불러오는 로직이 있다면 이 때도 JPQL 로 인해 flush가 일어나 변경 내용이 DB에 반영되고 그 반영된 DB에서 해당 엔티티를 조회해오게 됩니다 ㅎㅎ


감사합니다.

공부용님의 프로필

공부용

질문자

2022.11.08

자세한 설명 감사합니다!