자바 프로그래밍 10주차 학습일지

1. 학습한 내용 정리

QueryDSL을 사용하여 JPQL을 타입 안전하게 대체하고, 동적 쿼리를 유연하게 작성하는 방법 학습
QueryDSL은 엔티티 기반 Q클래스를 자동 생성하여 자바 코드로 쿼리를 작성
JPAQueryFactory를 활용해 빌더 스타일로 쿼리 작성
fetch(), fetchOne(), fetchFirst()의 차이점 학습
fetch() : 여러 개 결과를 리스트로 반환
fetchOne() : 하나의 결과 반환 (두 개 이상 시 오류)
fetchFirst() : 첫 번째 결과만 반환
BooleanExpression, BooleanBuilder를 사용하여 동적 조건(where절) 구성
QueryDSL 장점
IDE 자동완성 지원
복잡한 조건 조립 가능
유지보수 용이
기본 비교 메소드 (숫자, 문자, 날짜 등)
메소드
의미
예시 코드
JPQL 대응 연산자
설명
eq()
같다
course.name.eq("Java")
=
문자열, 숫자 등 같음 비교
ne()
같지 않다
!=
다른 값 비교
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)를 잘못 설정하면 결과가 달라질 수 있음