쿼리 dsl
쿼리 dsl은 쿼리를 자바 코드로 작성할 수 있도록 해준다. 이를 통해 아래 두가지 이점을 얻을 수 있다.
1. 컴파일 시점에 문법 에러를 잡아줌
2. 동적 쿼리 문제 해결!
쿼리 dsl은 jpql의 빌더 역할을 한다. 쿼리 dsl 코드는 결국 jpql로 번역된다.
앞서 jqpl에는 몇가지 불편사항, 문제점이 있었다.
String name = "james";
em.createQuery("select m from Member m where m.name = :name", Member.class)
.setParameter("name",name).getResultList();
쿼리에 오타가 있을 경우에 잡아내지 못한다. (jpql 처음 사용해서 개발할 때에 이걸로 시간 엄청 까먹었다...)
String name = "james";
String query = " ~~~~~ " +
" ~~~~~~~ "
em.createQuery(query, Member.class)
.setParameter("name",name).getResultList();
쿼리가 길어질 경우 위와 같이 작성해야하는데 띄어쓰기 신경쓰는것이 매우 불편하다.
위의 예시를 QueryDSL로 해보면
String name = "james";
List<Member> result = queryFactory
.select(member)
.from(member)
.where(member.name.eq(name))
.fetch();
이렇게 쿼리를 자바 코드로 짜기 때문에 오타가 있을 경우 컴파일 시점에 다 잡아내준다. 쿼리문 작성시 인텔리제이의 코드 자동완성의 도움을 받을 수 있다.
사용해보기
@BeforeEach
public void before() {
Team a = new Team("team1");
Team b = new Team("team2");
em.persist(a);
em.persist(b);
em.persist(new Member("m1", 10, a));
em.persist(new Member("m2", 15, a));
em.persist(new Member("m3", 12, b));
}
@Test
public void startQueryDSL() {
JPAQueryFactory qf = new JPAQueryFactory(em);
QMember m = new QMember("m"); //어떤 q멤버인지 구분
Member find = qf.select(m)
.from(m)
.where(m.username.eq("m1"))
.fetchOne();
Assertions.assertThat(find.getUsername()).isEqualTo("m1");
}
쿼리 dsl에서 쿼리를 만들기 위해서는 사전에 쿼리 dsl 컴파일러가 만든 Q타입의 클래스들이 필요하다.
쿼리 dsl은 Q타입의 클래스를 대상으로 쿼리를 만들어낸다. Q타입에는 위의 eq 함수 말고도 많은 함수가 구현되어있다.
저 중에 눈에 띄는 함수 하나만 사용해봤다.
@Test
public void startQueryDSL() {
JPAQueryFactory qf = new JPAQueryFactory(em);
QMember m = new QMember("m"); //어떤 q멤버인지 구분
List<Member> res = qf.select(m)
.from(m)
.where(m.username.contains("m"))
.fetch();
for (Member member : res) {
System.out.println("member.getUsername() = " + member.getUsername());
}
}
마무리
스프링 데이터 jpa와 쿼리 dsl을 활용하면서 여러 단순한 반복의 개발 코드가 줄어들어서 핵심 비즈니스 로직에 집중할 수 있게 된다.
관련글
https://www.inflearn.com/course/Querydsl-%EC%8B%A4%EC%A0%84/dashboard
'백엔드 > QueryDSL' 카테고리의 다른 글
QueryDSL - 동적 쿼리 (0) | 2021.09.01 |
---|---|
QueryDSL 프로젝션, DTO 사용 (0) | 2021.09.01 |
쿼리 dsl 기초 (0) | 2021.08.30 |