[Spring] 스프링 날짜 타입

개발할 때

좋든 싫든 항상 날짜 형식을 보게 될 것입니다.

이 기사에서는 프로세스를 조사했습니다.

@JsonFormat 사용 LocalDateTime 및

또한 Jackson을 사용하여 날짜 형식과 사용자 정의 주석을 작성했습니다.

LocalDateTime 형식

{
  "name": "hello",
  "startAt": "2023-02-26T15:12:17.536Z",
  "endAt": "2023-02-26T15:12:17.536Z"
}

LocalDateTime의 경우

기본적으로 알파벳은 중간에 섞입니다.

답장과 함께 보내드립니다.

{
    "name": "hello",
    "startAt": "2023.03.20 12:00",
    "endAt": "2023.03.20 13:30"
}

응답 형식 지정

우리는 그런 요청과 답변을 할 수 없습니까?

@JsonFormat

Jackson에서 제공하는 @JsonFormat을 사용하는 경우

요청 또는 응답 필드의 날짜 형식을 JSON으로 변환할 수 있습니다.

내 요청

@Getter
@RequiredArgsConstructor
public class MyRequest {
    private String name;
    
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy.MM.dd HH:mm", timezone = "Asia/Seoul")
    private LocalDateTime startAt;
}

@JsonFormat의 샘플 필드에 원하는 날짜 형식을 입력하기만 하면 됩니다.

{
  "name": "HI",
  "startAt": "2023.03.20 12:00"
}

DTO 요청 필드에 @JsonFormat이 사용된 경우

필드를 사용하여 원하는 형식을 사용자 정의할 수 있습니다!

이렇게 하면 컨트롤러에서 문자열 형식으로 가져올 수 있습니다.

힘들게 개조할 필요가 없다는 큰 장점이 있습니다.

기본 답변

@Getter
@Builder
public class BasicResponse {
    private String name;
    
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy.MM.dd HH:mm", timezone = "Asia/Seoul")
    private LocalDateTime startAt;
    
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy.MM.dd HH:mm", timezone = "Asia/Seoul")
    private LocalDateTime endAt;
}

응답 DTO에도 동일하게 적용됩니다.

이 패턴을 준수하는 형식으로 자동 직렬화됩니다.

@DateTimeFormat

Spring에서 지원하는 주석인 @DateTimeFormat도 있습니다.

기본적으로 기본 JSON 변환기는 Spring Jackson의 것이므로 우선 순위에서 밀려납니다.

하지만 @DateTimeFormat을 사용해야 하는 곳이 있습니다.

JSON을 직렬화하지 않는 요청 매개변수 또는 모델 속성에서,

이 주석을 사용할 수 있습니다.

JSON에 @JsonFormat을 사용하세요!

맞춤 주석 @DateFormat


프로젝트 내에서 날짜 형식을 통합하려면

이렇게 모든 필드를 붙여넣어야 합니다.

코드의 길이가 길면

매개변수가 3개라서 오타가 있을 가능성이 있었습니다.

그래서 단순화하고 싶었습니다.

날짜 형식

@JacksonAnnotationsInside
@Retention(RetentionPolicy.RUNTIME)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy.MM.dd HH:mm", timezone = "Asia/Seoul")
public @interface DateFormat {}

이것은 @DateFormat 사용자 지정 주석입니다.

의도된 용도는 모든 @JsonFormat을 통합하는 것입니다.

재사용성을 높이기 위해.

중요한 점은 @JacksonAnnotationsInside를 추가해야 한다는 것입니다.

이 주석은 Jackson 관련 주석이 상속되어 사용됨을 의미합니다.


그것을 사용하면 매우 쉽습니다.

가독성이 높아집니다!

그러나 사용자 지정 주석의 이름을 명시적으로 지정하지 않으면

팀원들이 헷갈릴 수 있기 때문에

제대로 파악하고 팀원들과 소통해야 합니다.