이제 JSON 형식 요청 데이터를 자바 객체로 변환해보자.
POST, PUT 방식을 사용하면name=이름&age=17
같은 쿼리 문자열 형식이 아닌
아래와 같은 JSON 형식의 데이터를 요청 데이터에 전송해보자.
{ "name": "이름", "age": 17 }
커맨드 객체에
@RequestBody
를 붙이면 끝!
@PostMapping("/api/members")
public void newMember(
@RequestBody RegisterRequest regReq,
HttpServletResponse response) throws IOException{
try{
Long newMemberId = registerService.regist(regReq);
response.setHeader("Location", "/api/members" + newMemberId);
response.setStatus(HttpServletResponse.SC_CREATED);
} catch(DuplicateMemberException dupEx){
response.sendError(HttpServletResponse.SC_CONFLICT);
}
}
즉, JSON 형식 문자열을 RegisterRequest 객체로 변환 가능!
{ "email": "bkchoi@bkchoi.com", "password": "1234", "confirmPassword": "1234","name": "최범균" }
JSON 형식 데이터를 날짜 형식으로 변환해보자.
별도 설정이 없으면,
(시간대가 없는) JSR-8601 의 문자열을 LocalDateTime과 Date로 변환함.
yyyy-MM-ddTHH:mm:ss
@JsonFormat
의 pattern
속성을 사용.@JsonFormat(pattern = "yyyyMMddHHmmss")
private LocalDateTime birthDateTime;
@JsonFormat(pattern = "yyyyMMdd HHmmss")
private Date birthDate;
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
ObjectMapper objectMapper = Jackson2ObjectMapperBuilder
.json()
.featuresToDisable(
SerializationFeature.INDENT_OUTPUT)
.deserializersByType(LocalDateTime.class,
new LocalDateTimeDeserializer(formatter))
.simpleDateFormat("yyyyMMdd HHmmss")
.build();
converters.add(0,
new MappingJackson2HttpMessageConverter(objectMapper));
}
deserializerByType()
: JSON 데이터를 LocalDateTime 타입으로 변환할 때 사용할 패턴을 지정.simpleDateFormat()
: Date 타입을 변환할 때 사용할 패턴을 지정.newMember()
에는 regReq 파라미터 앞에 @Valid
붙어 있음.@PostMapping("/api/members")
public void newMember(
@RequestBody @Valid RegisterRequest regReq,
HttpServletResponse response) throws IOException{
@Valid
나 Validator
를 통해 검증 가능.