스프링 공부/JPA

[JPA] 23. Re.Zero : JPQL : 프로젝션

장아장 2023. 1. 19. 19:32

프로젝션

Select절에서 조회 대상을 지정하는 것.

엔티티, 임베디드타입, 스칼라 타입(숫자, 문자, 기본 데이터 타입)

 

Select m from Member as m ~~; (엔티티)

Select m.username, m.age from Member as m~~; (엔티티의 스칼라 타입)

Select m.team from Member as m ~~; (연관관계의 엔티티)

Select m.address from Member asm m ~~;(임베디드 타입)

전부다 조회 가능하며, select 뒤에 distinct를 넣어 중복을 제거할 수 있다. 

 

조회를 해서 엔티티를 불러오는 방법은 알겠는데, 

우리가 조회한 엔티티의 인스턴스를 수정하면 어떻게 될까?

이러한 코드를 실행했을 때,

Select, update 쿼리가 나가는 것을 볼 수 있었다.

 

즉, select에서 조회된 엔티티들은 영속성 컨텍스트의 관리를 받는 것을 알 수 있다. 

 

엔티티에서 연관관계에 있는 엔티티들을 조회할 때, 이런 식으로 처리할 수 있다. 

 

근데 쿼리문은 이렇게 나간다. 

이게 문제가, 예측이 안되는 것이라고 한다. 

즉, 우리가 만들 때 어떤 기능을 예상하고 만드는데, 이를 벗어나는 상황이 나올 수 있다는 문제가 있다. 

그래서, 

이렇게 어떤 쿼리가 나갈지 생각해서, 명시적으로 써주는게 좋다. 

이를 명시적 조인, 앞에 썼던 것을 묵시적 조인이라고 한다.

(사실 말 들으니 그렇겠거니 싶다. 명시적으로 join이 존재하거나, 없지만 우리가 암묵적으로 join이 있을 것이라고 생각하는 것이니까…)

 

여기에서 특이한 점은, embedded로 이루어진 address의 경우이다.

이 때는 join 쿼리가 아닌, 해당 인스턴스만을 조회해온다.

이유는, 임베디드 값타입이지, 엔티티가 아니기 때문이다.