날짜 데이터 요청, 응답 처리하기 - LocalDateTime Parsing

2022. 12. 26. 10:11프로젝트/[Sleeper] 수면관리 어플리케이션

728x90

프로젝트를 진행하던 중, Controller 개발을 완료하고 테스트를 하려고 Postman으로 요청을 보냈는데..

아래와 같은 오류메세지를 마주했다.

 

문제 발생

 

아래는 내 프로젝트 소스코드 중 일부이다.

@PostMapping("/diaries")
public ResponseEntity<DiaryResponse> saveDiary(DiaryRequestForm diaryRequestForm, @SessionAttribute(SessionConst.LOGIN_USER) Object loginUser) {
    LoginUser loginUser1 = (LoginUser) loginUser;
    DiaryRequestForm diaryRequestForm1 = DiaryRequestForm.of(loginUser1.getUserId(), diaryRequestForm);
    DiaryResponse diaryResponse = diaryService.saveDiary(diaryRequestForm1);
    return new ResponseEntity<>(diaryResponse,HttpStatus.CREATED);
}

Controller에서 LocalDateTime 타입의 parameter로 받아오는 RestAPI를 만들었다.

그리고, LocalDateTime에 '2022-12-25T23:58:35Z', '2022-12-25T23:58:35', '2022-12-25T23:58:35.077714100'를 인자값으로 해서 Post 요청을 보내면 위와같은 에러가 나온다.

 

 

문제 원인

 

오류 메세지를 읽어보니 원인은 String 타입이 날짜 데이터(LocalDateTime)으로 타입 변환 실패이다.

 

 

 

 

문제 해결 

 

첫 번째 해결방법은 Controller에서 요청받는 dto안의 LocalDateTime 필드를 String타입으로 바꾸는 것입니다.

다시 말해서, String으로 받은 후 Service Layer에서 변환하는 것입니다.

 

그러나, 이 방법은 조금 번거롭습니다...

 

 

두 번째 해결방법은 직렬화 과정을 도와주는 스프링에서 제공하는 어노테이션을 사용하는 것입니다.

 

 

@DateTimeFormat - 날짜 관련 타입의 직렬화(요청 시)

 

1) @ModelAttribute를 사용하여 DTO객체를 받을 때

 

 

 2) @RequetsParameter로 필드별로 받을 때

 

 

@JsonFormat - 날짜 관련 직렬화 (응답 시)

 

 

 

 

 

이상입니다~!!

 

728x90