본문 바로가기

백엔드/QueryDSL

쿼리 dsl 입문

쿼리 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의 기초부터 실무 활용까지 한번에 해결, 본 강의는 자바 백엔드 개발의 실전 코스를 완성하는 마지막 강의 입니다. 스프링 부트와 JPA 실무 완전 정복 로드맵을 우선 확인해주세요. 로드

www.inflearn.com

 

 

 

'백엔드 > QueryDSL' 카테고리의 다른 글

QueryDSL - 동적 쿼리  (0) 2021.09.01
QueryDSL 프로젝션, DTO 사용  (0) 2021.09.01
쿼리 dsl 기초  (0) 2021.08.30