날짜 데이터를 저장하기 위해서 LocalDateTime 타입 변수를 선언하고 생성일과 수정일을 넣어주기로 했다. DB없이 테스트 할 때는 문제가 없었지만 DB를 연동하고 저장할 때 문제가 발생했다.
ResultSet의 getDate() 메서드는 java.sql.Date 타입을 반환하기 때문에 LocalDateTime으로 바로 변환할 수 없다.
ResultSet의 getTimestamp() 메서드를 사용하여 java.sql.Timestamp 타입으로 가져오면 LocalDateTime으로 변환할 수 있다.
(CREATED_DATE와 MOD_DATE가 DATETIME 또는 TIMESTAMP 타입으로 데이터베이스에 저장되어 있어야 한다.)
정상적으로 일정이 DB에 저장된다.
API를 호출할 때 @RequestParam 어노테이션을 이용해 파라미터로 날짜를 입력하도록 하였다.
http://localhost:8080/schedules?mod_date=2024-11-04 이런 방법으로 호출하면 2024년 11월 4일에 추가된 일정 목록들이 조회되도록 구현하고 싶었는데 결과는 Not Found 404가 돌아왔다.
@RequestParam LocalDateTime을 매개변수로 입력하도록 메서드를 작성해서 2024-11-04T17:59:25 이런식으로 날짜와 시간까지 입력해야 조회가 된다는 걸 알게되었다.
@GetMapping
public ResponseEntity<List<ScheduleResponseDto>> findSchedulesByDate(@RequestParam LocalDate mod_date) {
return new ResponseEntity<>(scheduleService.findSchedulesByDate(mod_date), HttpStatus.OK);
}
데이터를 응답 받을 때는 LocalDateTime 형식으로 날짜와 시간까지 디테일하게 받지만 요청을 할 때는 연월일만 입력하면 되기에 매개변수 타입을 LocalDate로 바꿔주었다.
API가 정상적으로 호출되었고 HTTP 상태메시지 200 OK를 응답받은 모습이다 !
이번에도 위에서 날짜를 기준으로 데이터를 조회하는 것 처럼 @RequestParam 을 이용해서 구현하려고 했다.
하지만 서버가 정상적으로 실행되지 않고 에러가 발생했다.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Ambiguous mapping. Cannot map 'scheduleController' method
내용을 구글링하고 찾아보니 위에 만들어놨던 날짜를 기준으로 모든 데이터를 조회하는 메서드와 맵핑된 주소가 중복되어서 발생하는 이슈였다.
같은 API를 주소를 사용하고 파라미터를 Optional로 받아와 데이터가 있고 없음에 따라 필터링을 하여 데이터를 조회하도록, 두 개의 메서드를 한 개로 합치는 방법으로 이슈를 해결하였다.
작성자와 날짜로 데이터 조회
특정 날짜로 데이터 조회
특정 작성자로 데이터 조회
파라미터 없이 디폴트로 조회