시작하며…
Date 타입에 따라 Converter를 이용하는 방식이 몇가지 있는데 오늘은 Config 클래스를 통해서 Coverter를 사용 하는 방식을 보도록 하겠습니다.
작업 환경
springBootVersion = ‘1.5.9.RELEASE’
Converter 제작
일단 사용 할 Date 타입에 대한 Converter를 만들어 줍니다.
LocalDateConverter
public final class LocalDateConverter implements Converter<String, LocalDate> {
private final DateTimeFormatter formatter;
public LocalDateConverter(String dateFormat) {
this.formatter = DateTimeFormatter.ofPattern(dateFormat);
}
@Override
public LocalDate convert(String source) {
if (source == null || source.isEmpty()) {
return null;
}
return LocalDate.parse(source, formatter);
}
}
LocalDateTimeConverter
public final class LocalDateTimeConverter implements Converter<String, LocalDateTime> {
private final DateTimeFormatter formatter;
public LocalDateTimeConverter(String dateFormat) {
this.formatter = DateTimeFormatter.ofPattern(dateFormat);
}
@Override
public LocalDateTime convert(String source) {
if (source == null || source.isEmpty()) {
return null;
}
return LocalDateTime.parse(source, formatter);
}
}
LocalDateTime
, LocalDate
둘 다 만드는 방식은 같습니다. 예제로 두개 다 제작 했지만 자신이 필요한 타입만 만드셔도 됩니다.
Converter를 Config를 통해 등록
WebMvcConfig
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new LocalDateConverter("yyyy-MM-dd"));
registry.addConverter(new LocalDateTimeConverter("yyyy-MM-dd'T'HH:mm"));
}
Config에서 Converter를 등록 할 때 사용된 dateFormat
형식으로 날짜를 받아 오게 됩니다. 그렇기 때문에 자신이 사용 하려는 날짜 형식을 고려해서 작성 하셔야 합니다.
yyyy-MM-dd’T’HH:mm -> 2018-04-03T12:12
yyyy-MM-dd’‘T’‘HH : mm : ss.SSSX -> 2018-04-03T14:18:13.105+01:00
yyyy-MM-dd HH.mm -> 2018-04-03 13.44
yyyy-MM-dd -> 2018-04-03
한가지 주의하셔야 할 것은 YYYY와 yyyy는 다른 결과를 나타낼 수 있습니다. 일반적이라면 yyyy를 사용하시는걸 추천드립니다.(참고1, 참고2)
참고로 패턴이 다른 형식으로 입력이 들어오면 정상 작동하지 않습니다.
테스트 코드 작성시
@Test
public void createMilestone() {
String subject = "mysubject";
HttpEntity<MultiValueMap<String, Object>> request = HtmlFormDataBuilder.urlEncodedForm()
.addParameter("subject", subject)
.addParameter("startDate", "2018-04-02T10:10")
.addParameter("endDate", "2018-04-11T12:12").build();
ResponseEntity<String> response =
basicAuthTemplate(findDefaultUser()).postForEntity("/milestones", request, String.class);
assertThat(response.getStatusCode(), is(HttpStatus.FOUND));
assertThat(milestoneRepository.findBySubject(subject).get().getSubject(), is(subject));
assertThat(response.getHeaders().getLocation().getPath(), is("/milestones/list"));
}
Milestone의 필드는 아래와 같고, Post 방식을 이용하여 Milestone 생성을 요청 합니다.
public class Milestone extends AbstractEntity {
private String subject;
private LocalDateTime startDate;
private LocalDateTime endDate;
}
사실 날짜만 있는게 아니라 조금 복잡해 보일 수도 있지만…파라미터로 Date를 추가하는 방식이 몇가지 있지만 보여 드리고 싶었던 부분은 저렇게 String 형태로 작성해도 정상적으로 작동 합니다.