본문 바로가기
개발/Spring

Querydsl

by BellOne4222 2024. 2. 27.

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