날짜 시간 데이터 요청/응답 - ZonedDateTime

2022. 12. 29. 23:14프로젝트/[Sleeper] 수면관리 어플리케이션

728x90

이번 프로젝트에서는 날짜 시간 데이터를 많이 다루고 있습니다.

저저번 포스팅과 마찬가지로, Postman을 이용하여서 요청을 받다가 아래와 같은 에러가 발생하였습니다.

 

현재 상황

@Getter
@RequiredArgsConstructor
@Builder
public class SetTimeRequestForm {

    @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
    private final ZonedDateTime setSleepTime;
    @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
    private final ZonedDateTime setWakeTime;

    public static Sleep toEntity(ZonedDateTime setSleepTime, ZonedDateTime setWakeTime){
        return Sleep.builder()
                .setSleepTime(setSleepTime)
                .setWakeTime(setWakeTime)
                .build();
    }
}

SetTimeRequestForm이라는 dto로 요청을 받아서 각각 setSleepTIme과 setWakeTime으로 바인딩될 예정입니다.

 

문제 발생

 

 

"Failed to convert value of type 'java.lang.String' to required type 'java.time.ZonedDateTime';
nested exception is org.springframework.core.convert.ConversionFailedException:
Failed to convert from type [java.lang.String] to type [@org.springframework.format.annotation.DateTimeFormat java.time.ZonedDateTime] for value '2022-12-29T09:34:35';
nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2022-12-29T09:34:35]"

그러나 바인딩이 위와 같은 에러로 인해 잘 되지 않았습니다.

 

문제 분석

오류메세지에서 나온 듯이 String 타입에서 ZonedDateTime으로 형변환을 실패한 것이다.

 

 

문제 해결

 

해결 방안의 열쇠는 어떻게 형변환을 할 것이다.

 

첫 번째 해결 방법은 요청을 LocalDateTime으로 요청을 받은 다음에, ZoneDateTime으로 zoneId를 사용해서 변환하는 것이다.

public class SetTimeRequestForm {

    @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
    private final LocalDateTime setSleepTime;

    @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
    private final LocalDateTime setWakeTime;
}

 

public static ZonedDateTime convertToZoneDateTime(LocalDateTime localDateTime){
    ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("Asia/Seoul"));
    return zonedDateTime;
}

 

 

두 번째 해결 방법은 String으로 요청을 받은 다음에, ZoneDateTime으로 변환을 하는 것이다.

 

public class ZonedDateTimeConverter implements Converter<String, ZonedDateTime> {

    private final DateTimeFormatter formatter;

    public ZonedDateTimeConverter(ZoneId zoneId) {
        this.formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm").withZone(zoneId);
    }

    @Override
    public ZonedDateTime convert(String source) {
        return ZonedDateTime.parse(source, this.formatter);
    }
}

 

 

이상입니다~~!!

728x90