4. @RequestBody로 JSON 요청 처리

Veloger·2022년 11월 16일
0

spring CH16 JSON

목록 보기
3/4
  • 이제 JSON 형식 요청 데이터를 자바 객체로 변환해보자.

  • POST, PUT 방식을 사용하면name=이름&age=17같은 쿼리 문자열 형식이 아닌
    아래와 같은 JSON 형식의 데이터를 요청 데이터에 전송해보자.

    { "name": "이름", "age": 17 }

커맨드 객체에 @RequestBody 를 붙이면 끝!

-> RestMemberController.java

@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": "최범균"   	}

  • 스프링 MVC가 JSON 형식 데이터를 처리하려면, 요청 컨텐츠 타입이 application/json 이어야 함.
  • POST 방식의 데이터는 쿼리 문자열임. 이때 컨텐츠 타입은 application/x-www-form-unlencoded임.
    즉, 쿼리 문자열 대신 JSON 형식을 사용하려면 application/json 타입으로 데이터 전송할 별도 프로그램 필요.

정상적인 결과

  • newMember()에서 정상일 경우 201(CREATED)을 전송함.
  • Location 헤더가 응답 결과에 포함됬음.

중복된 결과

  • 409(CONFLICT)가 리턴됨.


4.1 JSON 데이터의 날짜 형식 다루기

  • JSON 형식 데이터를 날짜 형식으로 변환해보자.

  • 별도 설정이 없으면,
    (시간대가 없는) JSR-8601 의 문자열을 LocalDateTime과 Date로 변환함.

    	yyyy-MM-ddTHH:mm:ss

  • @JsonFormatpattern 속성을 사용.
@JsonFormat(pattern = "yyyyMMddHHmmss")
private LocalDateTime birthDateTime;

@JsonFormat(pattern = "yyyyMMdd HHmmss")
private Date birthDate;

모든 속성에 적용

  • 스프링 MVC 설정을 추가하면 됨.
@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 타입을 변환할 때 사용할 패턴을 지정.
    - Date 타입을 JSON 데이터로 변환할 때에도 사용됨!


4.2 요청 객체 검증하기

  • newMember() 에는 regReq 파라미터 앞에 @Valid 붙어 있음.
@PostMapping("/api/members")
    public void newMember(
            @RequestBody @Valid RegisterRequest regReq,
            HttpServletResponse response) throws IOException{
  • JSON 형식으로 전송한 데이터를 변환한 객체도 @ValidValidator를 통해 검증 가능.
  • 검증 실패시 400(Bad Request) 응답.

0개의 댓글

관련 채용 정보