월별 일정 조회
월별 조회를 위해 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번째 주에 해당
'Spring' 카테고리의 다른 글
[Spring] SSE + Scheduler로 실시간 알림 기능 구현(2) (0) | 2024.03.27 |
---|---|
[Spring] SSE + Scheduler로 실시간 알림 기능 구현(1) (3) | 2024.03.26 |
[Spring] 일정 등록 시 ToDoList 넣기 (0) | 2024.03.21 |