본문 바로가기
Spring

[Spring] JPQL로 일정 조회하기

by qoth_0 2024. 4. 2.
728x90
반응형

 

월별 일정 조회

월별 조회를 위해 year와 month를@PathVariable로 받는다.

 

로그인된 회원이 등록한 일정 중 year과 month에 해당하는 것만 가져와야 한다.

 

JPQL

JPA의 일부로, Query를 Table이 아닌 객체(=엔티티) 기준으로 작성하는 객체지향 쿼리 언어

 

일정 조회 시 startDateTime(일정 시작일자) 기준으로 검색해야 하는데, 이는 LocalDateTime 필드이다.

LocalDateTime 필드를 사용하여 특정 연월(2024-04와 같은)에 해당하는 데이터를 조회하고 싶다면, @Query 어노테이션을 사용하여 커스텀 쿼리를 작성할 수 있다.

 

@Query 어노테이션을 사용하여 Event 엔티티의 startDateTime이 2024-04~인 모든 이벤트를 조회하는 쿼리를 작성

FUNCTION 키워드를 사용하여 데이터베이스의 내장 함수를 호출

→ YEAR, MONTH 함수를 사용하여 연도와 월을 추출

→ FUNCTION('YEAR', e.startDateTime)과 FUNCTION(' MONTH ', e.startDateTime)는 각각 startDateTime 필드의 연도와 월을 반환

:year와 :month는 메서드의 파라미터로부터 전달받은 값을 사용

 

이때 @Param으로 매개변수에 설정안해주면 다음과 같은 에러가 발생한다.

java.lang.IllegalStateException: For queries with named parameters you need to provide names for method parameters; Use @Param for query method parameters, or when on Java 8+ use the javac flag -parameters

@Query 어노테이션을 사용할 때 명명된 매개변수(named parameters)를 사용하려면, 메서드 매개변수에 이름을 제공해야 하기 때문

 

이를 위해서 @Param 어노테이션을 사용하여 각 매개변수에 대해 JPQL 내에서 사용할 이름을 명시적으로 지정해줘야 한다.

  @Param("member"), @Param(" year"), @Param("month")를 통해 쿼리 내에서 :member, :year, :month로 매개변수들을 참조할 수 있음

 

월별 일정 조회 완료

주별 일정 조회

WEEK 함수를 사용하여 특정 연도의 특정 주에 속하는 일정을 조회

→ FUNCTION('YEAR', e.startDateTime)과 FUNCTION('WEEK', e.startDateTime)는 각각 startDateTime 필드의 연도와 주를 반환

 

postman으로 테스트 해보니 이런 에러가 떴다.

java.lang.IllegalStateException: Ambiguous handler methods mapped for '/api/events/2024/14': {

public org.springframework.http.ResponseEntity com.team1.moim.domain.event.controller.EventController.getMonthly(jakarta.servlet.http.HttpServletRequest,int,int), public org.springframework.http.ResponseEntity com.team1.moim.domain.event.controller.EventController.getWeekly(jakarta.servlet.http.HttpServletRequest,int,int)}

→ Spring MVC에서 동일한 경로(/api/events/2024/14)에 대해 두 개 이상의 핸들러 메소드가 매핑되어 있어서 발생

  URL 패턴이 서로 충돌하는 경우에 발생하며, Spring이 어떤 메소드를 호출해야 할지 결정할 수 없기 때문

 

변경 전

{year}/{month}와 {year}/{week}는 URL 경로상에서 구분할 수 없으므로 Spring은 두 메소드 중 어떤 것을 호출해야 하는지 결정할 수 없다.

 

변경 후

→ monthly와 weekly를 추가해서 두 메서드를 구분시켜줌

 

주별 일정 조회 완료

→ WEEK 함수의 반환값은 0부터 시작하기 때문에 1월1일의 일정은 0번째 주에 해당

 

 

728x90
반응형