Jun's note

직접 JPQL로 update문을 수행하면 안되는 이유 본문

Programming/JPA

직접 JPQL로 update문을 수행하면 안되는 이유

junning 2022. 12. 13. 02:53
728x90

JPQL은 1차캐시를 확인하지 않고 바로 DB에 쿼리문을 날린다.

JPA의 큰 장점에는 1차캐시와 변경감지 기능이 있었다.

우리가 값을 조회할때 먼저 DB를 확인하지 않고 1차캐시부터 확인한다. 1차캐시에 찾던 값이 존재하면 1차캐시만 확인하고, 1차캐시에 없을 경우에 DB를 조회한다.

만약 직접 JPQL로 update문을 수행하면 어떤일이 일어날까?

1. JPQL 수행
2. 트랜잭션이 커밋되면, 쿼리문이 DB에 반영된다. (DB에는 변경된 값이 업데이트됨)
이 때, 값을 조회하면 (1차캐시에 있는)
3. 1차캐시를 확인하여 값을 넘겨준다.
4. 넘겨받은 값은 수정안된 값이었다. -> 문제발생

문제점: JPQL로 직접 update했기때문에 1차캐시랑 DB에 저장된 값이 서로 다른 상황

만약 1차캐시에 없던 값을 조회했으면, 1차캐시에 값이 없기때문에 DB를 조회해서 변경된 값이 1차캐시에 반영되었을것이다.

결론: 직접 JPQL로 update문을 수행하지말자

추가로, 값을 변경하고 싶을때는 영속상태인 엔티티의 필드를 변경하여 알아서 jpa가 변경감지하도록 구현해야한다. (영속상태인 엔티티: 레파지토리를 통해 조회한 값을 의미)


JPQL을 통해 직접 조회할경우 과정 (select문)
1. DB에서 직접 값을 조회
2. 조회한 값이 1차캐시에 존재할경우, DB에서 조회한 값을 버리고 1차캐시에 존재하는 값을 반환

Comments