실전! 스프링 데이터 JPA - 섹션7. 나머지 기능들
CS/김영한 스프링 강의

실전! 스프링 데이터 JPA - 섹션7. 나머지 기능들

나머지 기능들인 이유는 잘 안써서. 가끔 유용하게 쓰는 정도

 

- Specifications (명세)

- Query By Example

- Projections

- 네이티브 쿼리

 

Specifications은 JPA Creteria인데 사용 금지. QueryDSL을 써라.

 

query by example은 새로 생긴 data-jpa의 기능임. 객체를 넘겨줘서 찾는다.

join을 하고싶으면 join을 하는 걸 같이 넣어줘야 한다. 또 null이 될 수 없는 기본 타입은 0이 되기 때문에 이건 무시하라고 조건을 내보내야 함.

 

 

 

Projections 프로젝션

엔티티의 특정 속성만 불러오고 싶다면? 원래는 일단 객체 전체를 sql문으로 가져와서 그것을 가져오는 형식으로 했지만 원하는 속성 부분만 sql문 써서 가져오게 하는 방법을 만들어주었다.

조금 복잡한데, 내가 가져오고자 하는 속성의 인터페이스 이름을 똑같이 만들어주고 반환 타입도 이걸로 지정한 다음에 불러오면 된다. 인터페이스는 뭐 상속할 필요 없이 그냥 하면 스프링이 알아서 해준다.

 

 

이렇게 원하는 속성만 sql문으로 불러오게 하는걸 closed projections이라고 함. @Value해서 여기에 결과를 더 붙일 수 있는데 이러면 어떤걸 사용할지 몰라 그냥 sql문 전체를 다 가져온 다음 결과에 붙임. 이래서 open projections라고 함.

 

유용한게 Dto에도 가능하다. 하지만 변수 이름을 반드시 속성 이름과 같게 해야 한다.

 

그럼 변수명에 해당 타입만 들어가게 된다.

 

제너릭을 줘서 더 범용적으로도 사용 가능함.

 

한계점은 중첩할 때 나오는데, 루트(최상위)에 있는 속성은 걸러내지만 중첩된 것 까지는 뭐가 필요한지 감지를 못하기에 그 이하는 다 가져온다.

이런 한계점도 결국은 querydsl쓰면 다 해결된다...

 

 

 

네이티브는 진짜 진짜 최후의 방법으로 쓰자.

왠만하면 권장하지 않고 쓸거면 차라리 jdbcTemplate나 mybatis를 써라.

 

근데 사실 소개한 이유가 최근에 projection이랑 같이 사용하는 기능이 생겨서 페이지도 지원 가능해짐.