[스터디] Query DSL 기초 (1) - 개념 및 프로젝트 설정

2023. 2. 10. 12:31BackEnd/DataBase

작성자알 수 없는 사용자

728x90
반응형

안녕하세요. 기깔사에서 프로젝트를 수행하기 위해 꼭 필요한 개념을 같이 공부하게 된 제시Ca 입니다!

요즘 백엔드 개발에서 종종 쓰이고 있는 Query DSL이 무엇인지, 어떻게 사용하는 것인지 알아보려고해요.

 

Query DSL(Query Domain Specific Language)

Java ORM Framework 개체 관계형 매핑 프레임워크에서 널리 사용되고 있는 Hibernate는 sql과 유사한 쿼리 언어 HQL을 제안합니다. 이 방식의 단점은 형식의 안정성이 부족하고 정적 쿼리 검사가 없습니다. 그리고 JPA 2.0 표준은 Criteria Query API의 형태를 개선했지만, 복잡하고 알아보기 어려워 더 읽기 쉬운 API로 구현된 라이브러리 Querydsl이 등장했습니다.

 

JPQL vs Query DSL

JPQL(Java Persistence Query Lanuage)는 JPA에서 SQL을 추상화하여 만든 객체지향 쿼리 언어입니다.

특정 DB에 의존적이지 않으며 SQL 문법과 유사하여 개발자가 쉽게 사용할 수 있습니다.

이렇게 좋은데 왜, 개발자들은 오픈 소스 라이브러리인 querydsl을 굳이 사용할까요?

객체를 기준으로 모든 것이 움직이기 때문에, Table에 매핑되는 객체가 반드시 존재해야되며, 검색할때도 table이 아닌 객체를 대상으로 검색해야합니다.

문제점은 query가 string 형태이기 때문에 개발자에게 의존적이며, 컴파일 단계에서 Type-Check가 불가능합니다.그때문에, Runtime에서 오류가 발견이 가능합니다.이러한 문제를 querydsl은 보완해줍니다. 아래 예시를 통해 비교 해봅시다.

 

[예시]

JPQL

@Autowired
EntityManager em;

TypedQuery<User> tq = em.createQuery("select p from Person p where p.FirstName = :firstName and p.LastName = :lastName", Person.class);
tq.setParameter("firstName", "Jessica");
tq.setParameter("lastName", "Park");

List<Person> personList = tq.getResultList();

Querydsl

@PersistenceContext
EntityManager em;

public List<Person> selectPersonByNm(String firstNm, String lastNm){
    JPAQueryFactory jqf = new JPAQueryFactory(em);
    QPerson person = QPerson.person;

    List<Person> personList = jpf
                                .selectFrom(person)
                                .where(person.firstName.eq(firstNm)
                                    .and(person.lastName.eq(lastNm))
                                .fetch();

    return personList;
}

위 예시와 같이, querydsl은 모든 쿼리에 대한 내용이 스트링이 아니라 함수 형태로 제공됩니다.

그리고, 동적 쿼리를 가능하게 해줍니다.

또한, 오류가 있을 경우 컴파일 단계에서 확인이 가능해서 바로 처리가 가능합니다.

그렇게 되면, 실행단계에서 에러나는 JPQL보다는 훨씬 안정적으로 개발 할 수 있겠죠?

 

[참고]http://querydsl.com/

 

Querydsl - Unified Queries for Java

Unified Queries for Java. Querydsl is compact, safe and easy to learn. <!-- Querydsl Unified Queries for Java Querydsl provides a unified querying layer for multiple backends in Java. Compared to the alternatives Querydsl is more compact, safer and easier

querydsl.com

 

Querydsl 어떻게 사용할까요?

 

[초기 셋팅]

querydsl 설정 하기 위한 프로젝트를 먼저 만들어줍니다.

https://start.spring.io/

 

[참고] 만일 Spring boot 3.0 이상을 선택한다면 몇가지 달라집니다.

-java 17 사용

-javax 패키지를 jakarta로 변경

-H2 db를 2.1.214 버전 이상 사용

 

셋팅된 프로젝트를 IDE로 import해서 빌드를 하고 실행을 시켜봅니다.

 

이렇게 에러 페이지가 나온다면 정상적으로 실행된 것입니다.

 

앞서 말했듯이, querydsl은 JPA가 제공하지 않는 오픈소스라이브러리입니다.

만든 프로젝트 안의 build.gradle 파일을 열어 아래와 같이 설정해줍니다.

plugin 에 아래와 같이 해주고,

plugins {
	id 'java'
	id 'org.springframework.boot' version '2.7.8'
	id 'io.spring.dependency-management' version '1.0.15.RELEASE'
	//querydsl 추가
 	id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}

dependencies 도 아래 와 같이 추가해줍니다.

 

참고로 저는 IDE로  STS(Spring Tool Suite)를 사용하고 있습니다. 

파일 제일 하단에 아래 빌드 설정을 추가해줍니다.

 

// querydsl 설정 추가 
def querydslDir = "$buildDir/generated/querydsl"

querydsl {
	library = "com.querydsl:querydsl-apt"
    jpa = true
    querydslSourcesDir = querydslDir
}

sourceSets {
	main.java.srcDir querydslDir
}

configurations {
 compileOnly {
      extendsFrom annotationProcessor
   }
    querydsl.extendsFrom compileClasspath
}

compileQuerydsl {
    options.annotationProcessorPath = configurations.querydsl
}

 

저장을 하고 refresh 해줍니다.

 

그럼 설정이 끝났습니다. 

 

이제 Q-type class를 만들어보고, H2 DB를 이용한 CRUD를 구현 해볼거에요.

 

다음 Query DSL 기초 (2) - 실습에서 계속 됩니다.

728x90
반응형

'BackEnd > DataBase' 카테고리의 다른 글

[스터디] Query DSL 기초 (2) - 실습  (0) 2023.02.10