Spring/QueryDSL
프로젝션과 결과 반환 - 기본
느리지만 꾸준하게
2022. 4. 20. 05:16
프로젝션: select 대상 지정
- 프로젝션 대상이 하나
- 단순하게 사용자의 이름만 가져오게 되면 반환타입이 String으로 나오게 된다.
- 프로젝션 대상이 하나면 타입을 명확하게 지정할 수 있다
- 프로잭션 대상이 둘 이상이면 튜플이나 DTO로 조회
- 튜플은 Querydsl이 여러개를 조회할 때 만들어 놓은 타입이 있다.
@Test
public void simpleProjection() {
// username 타입과 맞는 것만 result 에 나온다.
// List<Member> 도 프로젝션 대상의 하나다.
List<String> result = queryFactory
.select(member.username)
.from(member)
.fetch();
for (String s : result) {
System.out.println("s = " + s);
}
}
// JPQL에서 아래에 select문을 넣는 구문을 프로젝션이라고 한다.
/* select
member1.username
from
Member member1 */ select
member0_.username as col_0_0_
from
member member0_
튜플로도 한번 작성을 해보자.
@Test
public void tupleProjection() {
// 여러개가 넘어 올 때에는 반환타입을 튜플로 해준다.
List<Tuple> result = queryFactory
// member 의 username과 age를 조회하고 싶다. 그러면
.select(member.username, member.age)
.from(member)
.fetch();
for (Tuple tuple : result) {
String username = tuple.get(member.username);
Integer age = tuple.get(member.age);
System.out.println("username = " + username);
System.out.println("age = " + age);
}
}
// 원하는 데이터 컬럼 username age만 집어서 골라온다.
/* select
member1.username,
member1.age
from
Member member1 */ select
member0_.username as col_0_0_,
member0_.age as col_1_0_
from
member member0_
// 쿼리가 의도했던 대로 쭉 나오고
username = member1
age = 10
username = member2
age = 20
username = member3
age = 30
username = member4
age = 40
튜플은 com.querydsl.core 꺼다. 리포지토리 계층안에서 쓰는건 좋은데 서비스 계층이나 컨트롤러 계층까지 넘어가서 쓰는것 좋지않다.
(JDBC같은걸 쓸때는 resultset이라던가 repository나 DAO 계층안에서 쓰도록 하고 나머지 계층에서는 보여지지 않게 설계하는게 좋은 설계이다. 그렇게 해야 하부기술을 querydsl이나 다른데서 바꾸더라도 앞단 컨트롤러 서비스랑 바꿀 필요가 없는것이다.
보통 스프링이 그런식으로 다 유도를 한다. 결론은 하부 구현기술 JPA나 querydsl 쓴다는 거를 앞단에서 알면 좋지 않다.)
Tuple를 바깥 계층으로 던지는거는 DTO로 바꿔서 전달을 하는걸 권장한다.
<출처 김영한: 실전! Querydsl >
https://www.inflearn.com/course/Querydsl-%EC%8B%A4%EC%A0%84/dashboard
실전! Querydsl - 인프런 | 강의
Querydsl의 기초부터 실무 활용까지, 한번에 해결해보세요!, - 강의 소개 | 인프런...
www.inflearn.com