Querydsl
- 자바 코드(엔티티)로 부터 DB 쿼리를 생성하는 도구
- HQL 생성 라이브러리
- type-safety가 부족한 HQL의 대안
- 읽기 어려운 Criteria API의 대안
- join에 편리하다.
- 커스텀 key-join
- 스프링 Pageable, JPA Repository interface 매끄러운 연동이 가능하다.
- Spring Data JPA와 조합하여 보다 복잡한 쿼리를 type-safe 하게 작성 가능하다.
// EventRepositoryCustom
public interface EventRepositoryCustom {
Page<EventViewResponse> findEventViewPageBySearchParams(
String placeName,
String eventName,
EventStatus eventStatus,
LocalDateTime eventStartDatetime,
LocalDateTime eventEndDatetime,
Pageable pageable
);
}
// EventRepositoryCustomImpl
public class EventRepositoryCustomImpl extends QuerydslRepositorySupport implements EventRepositoryCustom {
// EventRepositoryCustomImpl의 생성자
public EventRepositoryCustomImpl() {
super(Event.class);
}
// 검색 파라미터를 이용하여 이벤트 뷰 페이지를 조회하는 메서드
@Override
public Page<EventViewResponse> findEventViewPageBySearchParams(
String placeName,
String eventName,
EventStatus eventStatus,
LocalDateTime eventStartDatetime,
LocalDateTime eventEndDatetime,
Pageable pageable
) {
QEvent event = QEvent.event;
// Querydsl을 사용하여 Event 엔티티에서 EventViewResponse로 변환하여 조회 쿼리 생성
JPQLQuery<EventViewResponse> query = from(event)
.select(Projections.constructor(
EventViewResponse.class,
event.id,
event.place.placeName,
event.eventName,
event.eventStatus,
event.eventStartDatetime,
event.eventEndDatetime,
event.currentNumberOfPeople,
event.capacity,
event.memo
));
// 검색 조건에 따라 쿼리에 조건 추가
if (placeName != null && !placeName.isBlank()) {
query.where(event.place.placeName.contains(placeName));
}
if (eventName != null && !eventName.isBlank()) {
query.where(event.eventName.contains(eventName));
}
if (eventStatus != null) {
query.where(event.eventStatus.eq(eventStatus));
}
if (eventStartDatetime != null) {
query.where(event.eventStartDatetime.goe(eventStartDatetime));
}
if (eventEndDatetime != null) {
query.where(event.eventEndDatetime.loe(eventEndDatetime));
}
// 페이지네이션 및 결과 조회
List<EventViewResponse> events = Optional.ofNullable(getQuerydsl())
.orElseThrow(() -> new GeneralException(ErrorCode.DATA_ACCESS_ERROR, "Spring Data JPA 로부터 Querydsl 인스턴스를 가져올 수 없다."))
.applyPagination(pageable, query).fetch();
// 조회 결과를 Page 객체로 변환하여 반환
return new PageImpl<>(events, pageable, query.fetchCount());
}
}
'개발 > Spring' 카테고리의 다른 글
Spring Security 구현 (0) | 2024.02.27 |
---|---|
Spring Security (0) | 2024.02.27 |
JPA 테스트 (1) | 2024.02.27 |
DataSource, TransactionManager (1) | 2024.02.27 |
Spring Data JPA 인터페이스 (0) | 2024.02.27 |