이번 DailycluB 프로젝트에서는 프로그램 등록할 때 시작 날짜가 Request body에 담겨 있어야 하고, 그러면 Response body에 프로그램 시작 날짜와 프로그램 등록 날짜와 시간을 담아줘야 한다. 또한 프로그램 리스트 조회할 때 프로그램 시작 날짜가 검색/필터링 조건 중 하나라서 Query parameter로도 프로그램 시작 날짜 정보를 넘겨줘야 한다.
이를 어떻게 하면 편리하게 할 수 있을지 알아보자.
날짜 정보를 주고받을 때 매번 String <-> LocalDate(LocalDateTime)으로 직접 바꿔줘야 하는 건가 싶었다. 찾아보니 jackson이 제공하는 @JsonFormat과 Spring이 제공하는 @DateTimeFormat을 적절하게 사용하면 이런 작업을 직접할 필요가 없다.
1. @RequestBody로 JSON에 있는 데이터를 LocalDate(LocalDateTime)형 필드에 바인딩하고 싶으면 yyyy-MM-ddTHH:mm:ss형태로 보내면 된다. 본인이 원하는 다른 형태가 있다면 @JsonFormat에 지정한다.
2. @RequestParam, @ModelAttribue, @PathVariable 등으로 바인딩하고 싶으면 @DateTimeFormat에 원하는 형태를 지정한다.
3. @ResponseBody로 LocalDate(LocalDateTime)형 필드를 JSON으로 보낼 때, 아무 설정이 없으면 yyyy-MM-ddTHH:mm:ss형태로 전달되고 본인이 원하는 다른 형태가 있으면 @JsonFormat에 지정한다.
@ResponseBody에 담길 ProgramDto.Response 클래스에서 프로그램 시작 날짜는 LocalDate 클래스, 프로그램 등록 날짜는 LocalDateTime 클래스로 지정했다. 프로그램 작성시간 형태는 시간 앞에 T보다 빈칸을 두는 것이 가시성이 좋아보여서 @JsonFormat에 원하는 형태로 바꿔줬다.
참고로 Swagger에서는 @JsonFormat에 원하는 형태를 pattern으로 지정해줘도 기본형으로 나오기 때문에 @Schema에 원하는 형태의 example을 적어주고, 꼭 type = "string"까지 적어줘야 반영이 된다.
public class ProgramDto {
@Schema(name = "프로그램 응답 API 스펙", title = "프로그램 응답 API 스펙")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public static class Response {
...
@Schema(description = "프로그램 시작 날짜", pattern = "yyyy-MM-dd")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul")
private LocalDate programDate;
@Schema(description = "프로그램 작성 시간", example = "2022-09-18 10:11:22", pattern = "yyyy-MM-dd HH:mm:ss", type = "string")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime createdDate;
}
}
@ModelAttribute로 바인딩할 SearchFilterDto 클래스에서 프로그램 시작 날짜는 LocalDate 클래스로 지정했다. @RequestBody / @ResponseBody가 아니기 때문에 원하는 형태를 @DateTimeFormat에 지정해줬다.
@Schema(name = "프로그램 검색/필터 API 스펙", title = "프로그램 검색/필터 API 스펙")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class SearchFilterDto {
...
@Schema(description = "프로그램 시작 날짜", name = "program-date", pattern = "yyyy-MM-dd", example = "2022-09-18")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate programDate;
}
참고
'프로젝트 > DailycluB' 카테고리의 다른 글
Entity와 DTO의 사용 범위는 어떻게 해야 할까? (0) | 2022.09.22 |
---|---|
지역 정보를 Enum으로 할까 테이블로 할까? (@Converter) (0) | 2022.09.19 |
프로그램/유저 이미지 업로드 (0) | 2022.09.17 |
Springdoc Swagger로 API 문서 작업하기 + 이슈 핸들링 (0) | 2022.09.16 |
[회고] Pre Project를 마치고 (0) | 2022.09.10 |
댓글