인프런에서 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의 장점
- 쿼리를 자바 코드로 작성하여 문법 오류를 컴파일 시점에 발견할 수 있다.
- 동적 쿼리 문제를 해결한다.
- 쉬운 SQL 스타일의 문법이다.
- 자바 코드이기 때문에 메소드로 뽑아서 자주 사용하는 쿼리를 재사용할 수 있는 장점도 있다.
이제 다음 글은 프로젝트 환경 설정하는 글로 돌아오겠습니다~!
728x90
반응형
'QueryDSL' 카테고리의 다른 글
[JPA 활용] QueryDSL 기본 Q-Type 활용 방법 (2) | 2024.11.18 |
---|---|
[JPA 활용] JPQL vs Querydsl - assertThat() 사용법 (2) | 2024.11.17 |
[JPA 활용] QueryDSL 환경설정 - java: Attempt to recreate a file for type 오류, 에러 해결 (2) | 2024.11.16 |