728x90

Spring Boot에서는 전역적으로 적용되는 날짜 및 시간 형식을 지정할 수 있습니다. 이를 통해 코드에서 중복되는 날짜 및 시간 형식 코드를 제거하고 코드의 가독성과 유지 보수성을 향상시킬 수 있습니다.

여러가지 방안이 있겠습니다만 저는 아래같은 방식으로 진행해왔으니 참고하시면 될것 같습니다.

@JsonFormat 어노테이션

@Data
public class MyDateTime {
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", timezone = "UTC")

    private Date dateTime;
}

WebMvcConfigurer 인터페이스 구현

public class WebMvcConfig implements WebMvcConfigurer {
    @Bean
    public Jackson2ObjectMapperBuilder jacksonBuilder() {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        builder.timeZone(TimeZone.getDefault());
        return builder;
    }
}

postman 으로 테스트 할 controller 를 하나 만들어보겠습니다.

@RestController
@RequestMapping("/")
public class dataController {
    @GetMapping("/dateTime")
    public MyDateTime getMyDateTime() {
        MyDateTime myDateTime = new MyDateTime();
        myDateTime.setDateTime(new Date());
        return myDateTime;
    }
}

@JsonComponent 어노테이션 사용하는 방법

CustomDateSerializer 를 작성합니다.

public class CustomDateSerializer extends JsonSerializer<Date> {
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");

    @Override
    public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
        jgen.writeString(dateFormat.format(value));
    }
}

CustomDateDeserializer를 작성 합니다.

public class CustomDateDeserializer extends JsonDeserializer<Date> {
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");

    @Override
    public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
        JsonNode node = jp.getCodec().readTree(jp);
        String dateString = node.textValue();
        try {
            return dateFormat.parse(dateString);
        } catch (ParseException e) {
            throw new IOException("Invalid date format: " + dateString, e);
        }
    }
}

새로운 응답형식으로 객체 하나 더 만들어 볼게요.

@Data
public class MyResponse {
    private String message;
    private Date timestamp;
}

마지막으로 postman 이 호출할 controller 를 하나 추가로 만들어 볼게요.

public class MyController {
    @GetMapping("/myEndpoint")
    public MyResponse getMyResponse() {
        MyResponse response = new MyResponse();
        response.setMessage("안녕! 난 블레이크야!");
        response.setTimestamp(new Date());
        return response;
    }
}

이상으로 어노테이션 하나로 전역시간에 대한 처리하는 방법을 대략적으로 알아봤습니다.


내저장소 바로가기 luxury515

+ Recent posts