QueryDsl은 Java에서 관계형 데이터베이스를 쿼리하기 위한 타입 안전한 API를 제공하는 프레임워크이다. SQL과 매우 유사한 구문을 사용하여 복잡한 데이터베이스 쿼리를 보다 쉽게 작성하고 구성할 수 있다.
장점
- 쿼리를 자바 코드로 작성하여 문법 오류를 컴파일 시점에 잡음
- 동적 쿼리 문제 해결
- 쉬운 SQL 스타일 문법
- 인텔리제이와 같은 IDE의 자동 완성 기능
여기서 말하는 컴파일 시점이란? 프로그램이 실행되어 동작중인 상태(런타임)이 아닌 프로그램을 빌드하는 시점을 말한다.
그럼 Querydsl은 무조건 좋다!!! 꼭 쓰자!! 현업에서도 많이 쓴다더라!! 인 것일까??
아니다. Querydsl은 1차 캐시를 이용하지 않고 바로 DB를 바라보기 때문에 예상치 못한 응답이 발생하거나, 네트워크 통신이 느린 경우 오히려 성능이 저하될 수 있다.
JPA의 경우 영속성 컨텍스트를 1차캐시로 하여 정보를 이용한다. 예를 들어 여러번 db에 접근을 하려고 하는 경우에도 한번의 통신을 통해 이를 영속성 컨텍스트에 저장하고 이를 바라보는 형식으로 이용한다는 것이다.
하지만 JPQL과 Querydsl은 직접적으로 DB를 바라보며 매 쿼리마다 통신을 요구하게 된다. 또한 1차 캐시에 정보가 있는 경우 이를 우선적으로 이용하기 때문에 사용자에게 예상치 못한 결과값이 반환될 수 있다.
다음과 같은 순서가 있다고 생각해보자.
- 테이블의 모든 정보 조회
- 업데이트
- 테이블의 모든 정보 조회
다음과 같은 순서로 코드가 동작했을 때 문제가 발생한다는 것이다.
일반적으로 JPA를 사용하면 2번 동작인 업데이트가 영속성 컨텍스트 내에서 이루어지고 최종적으로 트랜잭션이 종료되며 commit이 이루어지는 시점에 테이블 업데이트가 이루어진다. 즉, 테이블 업데이트가 보이지 않는 4번에서 이루어지지만 영속성 컨텍스트 내의 정보를 이용하기 때문에 3번에서도 내가 원하는 업데이트 된 결과가 보여진다는 것이다.
하지만 Querydsl은? 직접 DB를 바라본다. 이 경우 2번에서 이루어지는 업데이트가 2번 동작이 이루어지는 순간에 직접적으로 테이블에 적용되지만, 3번 동작이 이루어질 때 이미 영속성 컨텍스트내에 존재하는 정보가 있기 때문에(아직 영속성 컨텍스트를 업데이트 한 적이 없게되는 것.) 1번에서 조회던 정보가 그대로 나갈 수 있다는 것이다.
즉, Querydsl을 이용하여 수정, 삭제의 작업이 이루어질 때 영속성 컨텍스트를 비워주는 작업이 필요할 수 있다는 것이다.
'DB > Querydsl' 카테고리의 다른 글
[Querydsl] Querydsl 적용 방법 (0) | 2024.09.02 |
---|