QueryDSL

[JPA 활용] QueryDSL

juble 2024. 11. 14. 12:32

인프런에서 QueryDSL 강의를 들으면서 앞으로 이 카테고리에 정리 겸 공유를 하려고 한다. 

돈을 내고 듣는 강의이기 때문에, 자세한 내용보다는 강의를 듣는 중간중간 공유할 만한 내용이나

오류가 발생했을 때 해결 방법 위주로 공유하게 될 것 같다. 

 

💻 QueryDSL 이란?

정적으로 유형화된 SQL 유사 쿼리를 구성할 수 있는 프레임워크이다.

간단하게, 복잡한 쿼리나 동적 쿼리 문제를 해결하기 위한 기술이라고 생각하면 된다. 

[ 배경 ]
Querydsl은 HQL 쿼리를 타입 안전한 방식으로 유지해야 할 필요성에서 탄생했습니다. HQL 쿼리의 증분적 구성에는 문자열 연결이 필요하고 읽기 어려운 코드가 생성됩니다. 일반 문자열을 통한 도메인 유형 및 속성에 대한 안전하지 않은 참조는 문자열 기반 HQL 구성의 또 다른 문제였습니다.
도메인 모델이 바뀌면서 유형 안전성은 소프트웨어 개발에 큰 이점을 가져다줍니다. 도메인 변경 사항은 쿼리에 직접 반영되고 쿼리 구성에서 자동 완성을 통해 쿼리 구성이 더 빠르고 안전해집니다.
Querydsl의 첫 번째 대상 언어는 Hibernate용 HQL이었지만, 요즘은 JPA, JDO, JDBC, Lucene, Hibernate Search, MongoDB, Collections, RDFBean을 백엔드로 지원합니다.

 

728x90

💻 JPQL vs QueryDSL

public void jpql(){
    String query = “select m from Member m” + 
        “where m.username =:username“;
    List<Member> result = em.createQuery(query, Member.calss)
    	.getResultList();
}

기존 쿼리는 이런 형식으로 썼을 것이다. 다만 위 코드는 문법적으로 오류가 있다. 

왜냐하면, +를 기준으로 한 줄로 이어쓴다면 select m from Member mwhere m.username =:username 이렇게 작성이 되는 셈이므로, 오류가 발생할거다. 하지만 이런 오류는 문장이 길어지면 길어질수록 발견하기 어렵다는 단점이 있다. 

 

public void querydsl(){
    queryFactory
	    .select(member)
	    .from(member)
	    .where(member.username.eq(username))
	    .fetch();
}

select m from Member m where m.username =:username 아까 작성한 코드를 QueryDSL을 사용하면 이렇게 보기 쉽게 작성할 수 있다. 또한 자바 코드이기 때문에 오타나 문법 오류도 발견해준다. 

 

 

💻 QueryDSL의 장점

  1. 쿼리를 자바 코드로 작성하여 문법 오류를 컴파일 시점에 발견할 수 있다.
  2. 동적 쿼리 문제를 해결한다.
  3. 쉬운 SQL 스타일의 문법이다.
  4. 자바 코드이기 때문에 메소드로 뽑아서 자주 사용하는 쿼리를 재사용할 수 있는 장점도 있다.

 

이제 다음 글은 프로젝트 환경 설정하는 글로 돌아오겠습니다~!

728x90
반응형