1. QueryDSL
프로젝트 진행중, 가게를 조회하는 기능을 개발하고 있었는데
page, size, 카테고리, 메뉴명, 가게명 등의 동적인 조건으로 쿼리를 해야 하는 상황이 있었다.
메뉴명과 가게명은 부분일치해도 가게 목록을 가져와야 하고,
카테고리는 categoryId가 정확히 일치해야하는 등 굉장히 복잡한 쿼리였다.
QueryDSL은 JPA와 함께 사용되는 쿼리 빌더로 , 타입 안전한 쿼리를 작성할 수 있도록 도와준다.
1 - 1. 타입 안정성
QueryDSL은 자바 코드로 쿼리르 작성하기 때문에, 컴파일 시점에 문법 오류를 잡아낼 수 있다.
이는 문자열 기반의 JPQL이나 SQL과 달리 런타임 오류를 방지할 수 있어 안정성이 높다.
// 잘못된 필드명을 사용하면 컴파일 시점에 오류가 발생
queryFactory.select(QMember.member)
.from(QMember.member)
.where(QMember.member.username.eq("test"))
.fetch();
1 - 2. IDE의 자동 완성 지원
QueryDSL은 자바 코드를 사용해 쿼리를 작성하므로 인텔리제이 같은 IDE에서 자동 완성 기능을 사용할 수 있다.
이를 통해 빠르고 정확하게 쿼리를 작성할 수 있다.
1 - 3. 문자열 기반 쿼리보다 가독성 향상
QueryDSL은 자바 코드로 쿼리를 작성하므로, 복잡한 쿼리도 더 직관적이고, 가독성도 좋아진다.
특히, 메서드 체이닝 방식으로 쿼리를 구성하기 때문에 코드가 깔끔하게 유지된다.
1- 4. 동적 쿼리 작성 용이
복잡한 동적 쿼리를 쉽게 작성할 수 있다.
BooleanBuilder 나 BooleanExpression을 활용하면 조건에 따라 동적으로 쿼리를 생성할 수 있다.
2. BooleanExpression
BooleanExpression은 QueryDSL에서 사용하는 클래스 중 하나로, 조건문을 표현하는 데 사용된다.
Predicate의 구현체로, true 또는 false를 반환한느 논리식을 나타낸다.
주로 동적 쿼리를 작성할 때 사용되고, null 일 경우 해당 조건을 무시할 수 있는 기능을 제공한다.
2 - 1. 조건 조합
BooleanExpression은 여러 조건을 and(), or() 등의 메서드를 통해 결합할 수 있다.
BooleanExpression condition = QPerson.person.age.gt(30)
.and(QPerson.person.salary.gt(50000));
2 - 2. null 처리
BooleanExpression 의 큰 장점 중 하나는 조건이 null 일 경우 해당 조건을 자동으로 무시할 수 있다는 점이다.
즉, 조건이 null 이면 그 조건은 쿼리에 포함되지 않는다.
private BooleanExpression ageCondition(Integer age) {
return age != null ? QPerson.person.age.eq(age) : null;
}
2 - 3. 가독성 및 재사용성
조건식을 메서드로 분리하여 관리할 수 있어 코드의 가독성이 높아지고,
재사용성이 좋아진다.
private BooleanExpression nameCondition(String name) {
return name != null ? QPerson.person.name.eq(name) : null;
}
private BooleanExpression combinedCondition(String name, Integer age) {
return nameCondition(name).and(ageCondition(age));
}
3. BooleanBuilder
BooleanExpression을 여러 개 묶을 수 있다.
private BooleanBuilder toBooleanBuilder(StoreCategory storeCategory, String name, String menu) {
BooleanBuilder booleanBuilder = new BooleanBuilder();
booleanBuilder.and(eqStoreCategory(storeCategory));
booleanBuilder.and(likeName(name));
booleanBuilder.and(likeMenu(menu));
booleanBuilder.and(isNotDeleted());
if (menu != null) {
booleanBuilder.and(isNotClosedMenu());
}
return booleanBuilder;
}
'자바 심화 2기' 카테고리의 다른 글
CodeBloom - AI를 활용한 주문 관리 플랫폼 프로젝트 결과물 (1) | 2024.11.19 |
---|---|
2024 11 14 TIL - Spring Data의 @PageableDefault, @SortDefault (0) | 2024.11.14 |
2024 11 12 TIL - 회원가입하려는데 왜 자꾸 인증하라고 그러는걸까? (Feat. AuditorAware) (0) | 2024.11.12 |
2024 11 11 TIL - AuditorAware 구현하기 (2) | 2024.11.11 |
[Spring 심화 2기] 9팀 코드블룸 - CH.1 AI 검증 비즈니스 프로젝트 S.A (0) | 2024.11.07 |
1. QueryDSL
프로젝트 진행중, 가게를 조회하는 기능을 개발하고 있었는데
page, size, 카테고리, 메뉴명, 가게명 등의 동적인 조건으로 쿼리를 해야 하는 상황이 있었다.
메뉴명과 가게명은 부분일치해도 가게 목록을 가져와야 하고,
카테고리는 categoryId가 정확히 일치해야하는 등 굉장히 복잡한 쿼리였다.
QueryDSL은 JPA와 함께 사용되는 쿼리 빌더로 , 타입 안전한 쿼리를 작성할 수 있도록 도와준다.
1 - 1. 타입 안정성
QueryDSL은 자바 코드로 쿼리르 작성하기 때문에, 컴파일 시점에 문법 오류를 잡아낼 수 있다.
이는 문자열 기반의 JPQL이나 SQL과 달리 런타임 오류를 방지할 수 있어 안정성이 높다.
// 잘못된 필드명을 사용하면 컴파일 시점에 오류가 발생
queryFactory.select(QMember.member)
.from(QMember.member)
.where(QMember.member.username.eq("test"))
.fetch();
1 - 2. IDE의 자동 완성 지원
QueryDSL은 자바 코드를 사용해 쿼리를 작성하므로 인텔리제이 같은 IDE에서 자동 완성 기능을 사용할 수 있다.
이를 통해 빠르고 정확하게 쿼리를 작성할 수 있다.
1 - 3. 문자열 기반 쿼리보다 가독성 향상
QueryDSL은 자바 코드로 쿼리를 작성하므로, 복잡한 쿼리도 더 직관적이고, 가독성도 좋아진다.
특히, 메서드 체이닝 방식으로 쿼리를 구성하기 때문에 코드가 깔끔하게 유지된다.
1- 4. 동적 쿼리 작성 용이
복잡한 동적 쿼리를 쉽게 작성할 수 있다.
BooleanBuilder 나 BooleanExpression을 활용하면 조건에 따라 동적으로 쿼리를 생성할 수 있다.
2. BooleanExpression
BooleanExpression은 QueryDSL에서 사용하는 클래스 중 하나로, 조건문을 표현하는 데 사용된다.
Predicate의 구현체로, true 또는 false를 반환한느 논리식을 나타낸다.
주로 동적 쿼리를 작성할 때 사용되고, null 일 경우 해당 조건을 무시할 수 있는 기능을 제공한다.
2 - 1. 조건 조합
BooleanExpression은 여러 조건을 and(), or() 등의 메서드를 통해 결합할 수 있다.
BooleanExpression condition = QPerson.person.age.gt(30)
.and(QPerson.person.salary.gt(50000));
2 - 2. null 처리
BooleanExpression 의 큰 장점 중 하나는 조건이 null 일 경우 해당 조건을 자동으로 무시할 수 있다는 점이다.
즉, 조건이 null 이면 그 조건은 쿼리에 포함되지 않는다.
private BooleanExpression ageCondition(Integer age) {
return age != null ? QPerson.person.age.eq(age) : null;
}
2 - 3. 가독성 및 재사용성
조건식을 메서드로 분리하여 관리할 수 있어 코드의 가독성이 높아지고,
재사용성이 좋아진다.
private BooleanExpression nameCondition(String name) {
return name != null ? QPerson.person.name.eq(name) : null;
}
private BooleanExpression combinedCondition(String name, Integer age) {
return nameCondition(name).and(ageCondition(age));
}
3. BooleanBuilder
BooleanExpression을 여러 개 묶을 수 있다.
private BooleanBuilder toBooleanBuilder(StoreCategory storeCategory, String name, String menu) {
BooleanBuilder booleanBuilder = new BooleanBuilder();
booleanBuilder.and(eqStoreCategory(storeCategory));
booleanBuilder.and(likeName(name));
booleanBuilder.and(likeMenu(menu));
booleanBuilder.and(isNotDeleted());
if (menu != null) {
booleanBuilder.and(isNotClosedMenu());
}
return booleanBuilder;
}
'자바 심화 2기' 카테고리의 다른 글
CodeBloom - AI를 활용한 주문 관리 플랫폼 프로젝트 결과물 (1) | 2024.11.19 |
---|---|
2024 11 14 TIL - Spring Data의 @PageableDefault, @SortDefault (0) | 2024.11.14 |
2024 11 12 TIL - 회원가입하려는데 왜 자꾸 인증하라고 그러는걸까? (Feat. AuditorAware) (0) | 2024.11.12 |
2024 11 11 TIL - AuditorAware 구현하기 (2) | 2024.11.11 |
[Spring 심화 2기] 9팀 코드블룸 - CH.1 AI 검증 비즈니스 프로젝트 S.A (0) | 2024.11.07 |