spring boot : 3.3
jdk : 21
Projection객체를 사용하면 select시 필요한 컬럼만 추출할 수 있다.
현재 Member와 Team은 N:1 관계이다.
52개의 데이터를 임의로 넣어놨다.

총 104개로 member 두개당 team을 하나씩 넣어놨다.




jpa에서는 Dynamic Projection이라고 해서 클래스 타입을 지정해서 필요한 필드만 추출할 수 있도록 제공해준다. 여러 Projection 객체를 만들어 select시에 추출하는 필드를 변경시킬 수 있다.
class, record, interface로 선언이 가능하며 interface 사용시에는 객체 인터페이스를 선언해 가져올 수 있지만 record나 class 사용시에는 객체는 사용하지 못하고 단일필드로만 가져올 수 있다.















record나 class로 선언시에는 내부에 객체로 선언해도 값을 가져오지 못한다.
인터페이스 사용시에는 프록시를 통해 JPA가 자동으로 맵핑해주는데
class나 record 사용시에는 생성자 기반 맵핑을 사용하기 때문에
JPQL에서 생성자를 명시적으로 호출해줘야 한다고 한다.





team interface projection 내에 실제 team 객체가 참조하는 mebers 변수로 선언해줘야 한다.
team 객체 자체는 지정된 필드만 나오지만 member는 모든게 나오고 있다.



team 객체에서 실제로 참조하고있는 members변수를 앞에 달아줘야하고
쿼리는 한번 나오지만 list size는 member row 와 동일한 숫자로 나온다



record 와 똑같이 member의 size만큼 team size가 생성된다.



team 단건 조회시 member 데이터가 여러개라 오류가 난다.


간단하게 Spring data jpa 사용시 Projection은 단일객체 응답 이나 ManyToOne시만 사용성이 있다고 생각이 든다.
참고 링크 : https://docs.spring.io/spring-data/jpa/reference/repositories/projections.html