본문 바로가기
프로젝트/DailycluB

날짜/시간 정보 API로 주고 받기

by 넬준 2022. 9. 18.

 이번 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;
    }
}

 

type="string"을 안주니 createdDate를 swagger가 기본형으로 만들어 보여준다.
type="string"을 주니 createdDate가 example 그대로 swagger에 나온다.

 

 

 @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;
}

 


참고

 

https://swampwar.github.io/2020/03/19/LocalDateTime-%EB%B3%80%EC%88%98%EB%B0%94%EC%9D%B8%EB%94%A9.html

 

 

https://gogo-jjm.tistory.com/93

댓글