오늘은 Spring 에서 지원해주는 querydsl을 사용해서 포스팅을 헤보겠다.
querydsl은 필자도 공부중이라 공부하는 내용을 포스팅할 것이다.
예전에 한번 Spring boot querydsl을 포스팅한적이 있는데 아주 기초적 및 셋팅 정도만 하였다.
오늘도 마찬가지로 기본적인 것만 하겠지만 몇편으로 나누어서 차근차근 공부를 해보겠다. querydsl의 version이 올라가면서 약간 바뀐 API도 있는듯하다. 오늘은 그것부터 공부해보겠다.
또한 Spring boot 1.3.x는 최신버전 querydsl을 지원하지 않는다. Spring boot 1.4부터 현재 나온 querydsl을 지원한다.
이 포스팅은 Spring boot 1.4 M3 버전이고 querydsl은 현재 최신버전인 4.1.2 기준으로 하였다.

먼저 셋팅 부분은 기존과 동일하니 생략 하겠다.

@Bean
public CommandLineRunner commandLineRunner() {
  return args ->
    Arrays.asList(
      new Account("wonwoo@test.com", "wonwoo", "1PassWord"),
      new Account("123@test.com", "wonwoo", "2PassWord11"),
      new Account("aaa@test.com", "kevin", "3PassWord2"),
      new Account("bbb@test.com", "ggg", "PassWord33"),
      new Account("ccc@test.com", "ggg", "PassWord44"),
      new Account("ddd@test.com", "keven", "PassWord5"),
      new Account("ggg@test.com", "qqqq", "PassWord6")
    ).forEach(accountRepository::save);
}

일단 기본적인 이런 데이터가 있다고 가정하자!.

@Override
public List<Account> findByname(String name) {
  QAccount account = QAccount.account;
  return from(account)
    .where(account.name.eq(name))
    .fetch();
}

첫 번째로 fetch()라는 함수인데 List fetch() 이와 같이 리턴이 List이다. 여러건을 조회할 떄 사용하면 될듯 싶다. 아마도 예전의 list()가 fetch로 바뀌지 않나 싶다.

@Override
public Account findByemail(String email) {
  QAccount account = QAccount.account;
  return from(account)
    .where(account.email.eq(email))
    .fetchOne();
}

두 번째는 fetchOne()이라는 함수이다. T fetchOne() 이와 같이 단건을 조회할 때 사용하면 되겠다. 만약 조회결과가 없을 시에는 null을 리턴하고 조회결과가 한건 이상이면 com.querydsl.core.NonUniqueResultException 라는 에러를 발생시킨다. 예전의 uniqueResult()와 동일한 함수로 생각된다.

@Override
public Account findByPasswordFirst(String password) {
  QAccount account = QAccount.account;
  return from(account)
    .where(account.password.like("%" + password + "%"))
    .fetchFirst();
}

이번에는 fetchFirst()라는 함수이다. T fetchFirst() 이와 같이 단건을 조회하지만 여러건이 나올 때는 처음데이터만 결과로 반환한다. 예전의 singleReuslt()와 동일한 함수로 생각된다. fetchOne()과 마찬가지로 조회 결과가 없을 때에는 null을 반환한다.

@Override
public Page<Account> findByPassword(String password, Pageable pageable) {
  QAccount account = QAccount.account;
  QueryResults<Account> accountSearchResults =
    from(account)
      .where(account.password.like("%" + password + "%"))
      .limit(pageable.getPageSize())
      .offset(pageable.getOffset())
      .fetchResults();
  return new PageImpl<>(accountSearchResults.getResults(), pageable, accountSearchResults.getTotal());
}

마지막으로 fetchResults() 이라는 함수이다. QueryResults fetchResults() 이와 같이 QueryResults를 반환한다. 페이징처리를 위한 함수라 생각하면 되겠다. 예전 API의 listResults()과 동일하고 생각하면 되겠다.

위의 예제 말고도 몇가지의 API가 더 존재한다.

long fetchCount();

CloseableIterator<T> iterate();

iterate() API는 뭐하는지 잘모르겠다. 만약 쓸일이 있다면 그때 알아봐야겠다. fetchCount()는 말그대로 count를 조회하는 함수이다.
이것으로 첫 번째 시간은 간단하게 변경된 API에 대해 알아봤다.

다음엔 동적 쿼리, join등 여러 편에 나눠서 알아보자.