1. 학습한 내용 정리
•
QueryDSL을 사용하여 JPQL을 타입 안전하게 대체하고, 동적 쿼리를 유연하게 작성하는 방법 학습
•
QueryDSL은 엔티티 기반 Q클래스를 자동 생성하여 자바 코드로 쿼리를 작성
•
JPAQueryFactory를 활용해 빌더 스타일로 쿼리 작성
•
fetch(), fetchOne(), fetchFirst()의 차이점 학습
◦
fetch() : 여러 개 결과를 리스트로 반환
◦
fetchOne() : 하나의 결과 반환 (두 개 이상 시 오류)
◦
fetchFirst() : 첫 번째 결과만 반환
•
BooleanExpression, BooleanBuilder를 사용하여 동적 조건(where절) 구성
•
QueryDSL 장점
◦
IDE 자동완성 지원
◦
복잡한 조건 조립 가능
◦
유지보수 용이
기본 비교 메소드 (숫자, 문자, 날짜 등)
메소드 | 의미 | 예시 코드 | JPQL 대응 연산자 | 설명 |
eq() | 같다 | course.name.eq("Java") | = | 문자열, 숫자 등 같음 비교 |
ne() | 같지 않다 | course.name.ne("Java") | != | 다른 값 비교 |
gt() | 초과 | > | greater than — 초과 | |
goe() | 이상 | course.rating.goe(3) | >= | greater or equal — 이상 |
lt() | 미만 | < | less than — 미만 | |
loe() | 이하 | course.rating.loe(3) | <= | less or equal — 이하 |
문자열 관련 메소드
메소드 | 의미 | 예시 코드 | JPQL 대응 연산자 | 설명 |
contains() | 포함 | course.name.contains("Spring") | LIKE %Spring% | 부분 일치 (양쪽 %) |
startsWith() | ~로 시작 | course.name.startsWith("Data") | LIKE Data% | 접두어 검색 |
endsWith() | ~로 끝남 | course.name.endsWith("Boot") | LIKE %Boot | 접미어 검색 |
like() | 직접 LIKE 표현 | course.name.like("%SQL%") | LIKE | 와일드카드 직접 사용 |
불리언 및 논리 연산
메소드 | 의미 | 예시 코드 | 설명 |
and() | 그리고 | course.rating.gt(3).and(course.category.eq("Spring")) | 조건 AND 연결, + and는 ,로 간략 표현 가능 |
or() | 또는 | course.rating.lt(2).or(course.category.eq("React")) | 조건 OR 연결 |
not() | 부정 | course.name.eq("Java").not() | 조건 반전 |
2. 작성한 핵심 코드 설명
BooleanExpression 메서드 예시
private BooleanExpression eqCategory(String category) {
return StringUtils.hasText(category) ? course.category.eq(category) : null;
}
private BooleanExpression goeMinRating(Integer minRating) {
return minRating != null ? course.rating.goe(minRating) : null;
}
private BooleanExpression startingWithName(String keyword) {
return StringUtils.hasText(keyword) ? course.name.startsWith(keyword) : null;
}
Java
복사
findByConditions
@Override
public List<Course> findByConditions(String category, Integer minRating, String prefix) {
return queryFactory.selectFrom(course)
.where(
eqCategory(category),
goeMinRating(minRating),
startingWithName(prefix)
)
.orderBy(course.rating.desc())
.fetch();
}
Java
복사
3. 오류 해결 과정 및 주의사항
•
fetchOne() 사용 시 조회 결과가 2개 이상이면 예외 발생 → 조건 명확히 설정 필요
•
BooleanExpression에 null 반환 시 자동 무시되지만, 논리적 순서(and, or)를 잘못 설정하면 결과가 달라질 수 있음