작성
·
848
·
수정됨
0
JPQL는 데이터베이스에 SQL을 날려 데이터를 가져오지만 영속성 컨텍스트에 동일한 값이 있다면 DB에서 가져온 값을 버리게 되는데, QueryDSL은 내부적으로 JPQL을 사용하기 때문에, JPQL 처럼 DB 먼저 조회한 후 영속성 컨텍스트에 동일한 값이 있다면 DB에서 가져온 값을 버리게 되나요?
1번과 같이 조회 상황이 아닌 수정, 삭제, 추가하는 경우에도 JPQL의 경우, 영속성 컨텍스트에 먼저 데이터를 수정, 삭제, 추가 하기 보다 DB에 먼저 쿼리를 날린 후에 영속성 컨텍스트에 반영하는건가요?
JPA는 영속성 컨텍스트를 먼저 확인하는 거와 달리, JPQL은 DB 조회 부터 하는데, 어떤 이유 때문에 둘이 다르게 동작하는 걸까요?
답변 1
0
안녕하세요, 인프런 AI 인턴이에요. JPQL과 QueryDSL의 내부 동작에 대한 질문이네요.
먼저, JPQL은 SQL을 활용하여 데이터베이스에서 데이터를 가져옵니다. 하지만 JPQL은 영속성 컨텍스트에 이미 동일한 값이 존재한다면, DB에서 가져온 값을 버리고 영속성 컨텍스트에 있는 값을 사용합니다.
반면, QueryDSL은 JPQL을 내부적으로 사용하기 때문에 JPQL과 동일한 동작을 합니다. 그렇기 때문에 QueryDSL 역시 영속성 컨텍스트에 이미 동일한 값이 있다면, DB에서 가져온 값을 버리고 영속성 컨텍스트에 있는 값을 사용합니다.
조회 상황이 아닌 수정, 삭제, 추가하는 경우에도 JPQL의 경우, 영속성 컨텍스트에 먼저 데이터를 수정, 삭제, 추가하지 않고 DB에 먼저 쿼리를 날린 후에 영속성 컨텍스트에 반영합니다.
JPA는 영속성 컨텍스트를 먼저 확인하는 반면, JPQL은 DB 조회부터 하는데 이는 각각의 동작 방식과 사용 목적에 따라 다릅니다. JPA는 객체 중심의 개발을 지향하며 영속성 컨텍스트를 통해 데이터의 변경 사항을 추적하고 반영합니다. 반면, JPQL은 주로 복잡한 조회 기능을 사용하기 위해 SQL에 가까운 문법을 제공합니다.
이러한 차이는 JPA와 JPQL의 설계 철학과 목적 차이에서 비롯됩니다. JPA는 객체와 관계형 데이터베이스를 매핑하기 위한 ORM 프레임워크로써 객체 중심의 개발을 지원하며, JPQL은 객체를 조회하기 위한 질의 언어로서 SQL과 유사한 문법을 제공합니다.
따라서, JPA는 영속성 컨텍스트를 통해 데이터를 관리하고 적절하게 DB와의 동기화를 처리하며, JPQL은 복잡한 객체 조회를 위해 SQL과 유사한 기능을 제공하는 것이 주된 목적입니다.
이렇게 다른 동작 방식은 각각의 목적과 사용 방법에 따라서 선택되고 사용됩니다. 감사합니다.