-
Spring MVC - JSON으로 보낸 HTTP 요청 메시지 조회Spring/Spring MVC 2022. 1. 29. 20:39728x90반응형
JSON으로 보낸 HTTP 요청 메시지
URL에 쿼리 파라미터를 통한 요청 메시지, Form을 통한 HTTP message body에 쿼리 파라미터를 담아 요청하는 방법이 아닌 JSON으로 message body에 데이터를 직접 담아 요청 메시지를 보낸 경우 해당 데이터들을 어떻게 조회하는지 알아보자.
- HTTP API에서 주로 사용하며 데이터 형식은 JSON, XML, TEXT가 있다.
- 보통 JSON을 사용하며 POST, PUT, PATCH 메서드로 요청 메시지를 보낸다.
- message body를 직접 조회해야 하기 때문에
요청 파라미터와는 달리 @RequestParam, @ModelAttribute를 사용할 수 없다.
JSON 요청 메시지와 응답 메시지
- HttpServletRequest, HttpServletResponse 이용
- @RequestBody을 이용한 String 타입으로 조회
- @RequestBody을 이용한 객체 타입으로 조회
위 3가지 방법이 있으며 과거에서 사용했던 방법에서부터 현재 사용 방법까지 어떻게 편리하게 되었는지 알아보자.HttpServletRequest, HttpServletResponse 이용
- HttpServletRequest를 사용해서 직접 HTTP 메시지 바디의 데이터를 읽어와 문자로 변환
- 문자로 된 JSON 데이터를 Jackson 라이브러리인 objectMapper를 사용해서 자바 객체로 변환
@Slf4j @Controller public class RequestBodyJsonController { private ObjectMapper objectMapper = new ObjectMapper(); @PostMapping("/request-body-json-v1") public void requestBodyJsonV1(HttpServletRequest request, HttpServletResponse response) throws IOException { ServletInputStream inputStream = request.getInputStream(); String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8); log.info("messageBody={}", messageBody); UserData data = objectMapper.readValue(messageBody, UserData.class); log.info("username={}, age={}", data.getUsername(), data.getAge()); response.getWriter().write("ok"); } }
주의할 점은 Stream은 바이트코드이므로 항상 인코딩 설정을 해줘야 한다(StandardCharsets.UTF_8). 위 코드는 요청 메시지 바디에 JSON 형식으로 저장된 문자 데이터 {"username":"userA", "age":10}를 자바 객체로 변환하기 위해 objectMapper를 사용하였다.
@RequestBody을 이용한 String 타입으로 조회
- @RequestBody : 요청 메시지 바디를 직접 조회할 수 있는 애노테이션
- 헤더 정보를 조회하려면 @ReqiestHeader 애노테이션을 사용해야 한다.
@Slf4j @Controller public class RequestBodyJsonController { private ObjectMapper objectMapper = new ObjectMapper(); @ResponseBody @PostMapping("/request-body-json-v2") public String requestBodyJsonV2(@RequestBody String messageBody) throws IOException { UserData data = objectMapper.readValue(messageBody, UserData.class); log.info("username={}, age={}", data.getUsername(), data.getAge()); return "ok"; } }
@RequestBody 애노테이션을 이용하여 HttpServletRequest를 이용한 방법보다 훨씬 사용하기 편해졌다.
@RequestBody을 이용한 객체 타입으로 조회
- HTTP 메시지 컨버터는 JSON을 객체로 변환해준다.
- 따라서 매핑된 메서드의 파라미터로 객체 타입으로
요청 메시지 바디에 있는 JSON형식의 데이터를 조회할 수 있다. - @RequestBody는 생략이 불가능하다
@Slf4j @Controller public class RequestBodyJsonController { private ObjectMapper objectMapper = new ObjectMapper(); @ResponseBody @PostMapping("/request-body-json-v3") public String requestBodyJsonV3(@RequestBody UserData data) { log.info("username={}, age={}", data.getUsername(), data.getAge()); return "ok"; } }
위 코드처럼 @RequestBody를 이용하면 요청 메시지 바디에 JSON 타입으로 보내진 데이터 {"username":"userA", "age":10}를 직접 만든 객체를 이용하여 조회할 수 있게 된다.
참고
객체 타입으로 return을 해주면 응답 메시지 바디에 객체 데이터를
JSON 형태로 담아서 응답 메시지를 보낸다.@Slf4j @Controller public class RequestBodyJsonController { private ObjectMapper objectMapper = new ObjectMapper(); @ResponseBody @PostMapping("/request-body-json-v3") public UserData requestBodyJsonV3(@RequestBody UserData data) { log.info("username={}, age={}", data.getUsername(), data.getAge()); return data; } }
Postman으로 확인해보면 응답 메시지 바디에는 UserData 객체인 data가 JSON 형식으로 응답 메시지 바디에 담아서 응답 메시지를 보낸 것을 확인할 수 있다.
728x90반응형'Spring > Spring MVC' 카테고리의 다른 글
Spring MVC - HTTP 메시지 컨버터 (0) 2022.01.30 Spring MVC - 응답 메시지를 만드는 방법 (정적 리소스, 뷰 템플릿, HTTP API 메시지 바디에 직접 입력) (0) 2022.01.29 Spring MVC - 단순 텍스트으로 보낸 HTTP 요청 메시지 조회와 HTTP 응답 메시지 처리(@RequestBody, @ResponseBody) (0) 2022.01.29 Spring MVC - HTTP 헤더 조회 (0) 2022.01.28 Spring MVC - HTTP API의 요청 매핑 예시 (0) 2022.01.28