ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring MVC - 단순 텍스트으로 보낸 HTTP 요청 메시지 조회와 HTTP 응답 메시지 처리(@RequestBody, @ResponseBody)
    Spring/Spring MVC 2022. 1. 29. 19:41
    반응형

     

     

     

     

    단순 텍스트으로 보낸 HTTP 요청 메시지

     URL에 쿼리 파라미터를 통한 요청 메시지, Form을 통한 HTTP message body에 쿼리 파라미터를 담아 요청하는 방법이 아닌 단순 텍스트으로 message body에 데이터를 직접 담아 요청 메시지를 보낸 경우 해당 데이터들을 어떻게 조회하는지 알아보자.

     

     

    • HTTP API에서 주로 사용하며 데이터 형식은 JSON, XML, TEXT가 있다.
    • 보통 JSON을 사용하며 POST, PUT, PATCH 메서드로 요청 메시지를 보낸다.
    • message body를 직접 조회해야 하기 때문에
      요청 파라미터와는 달리 @RequestParam, @ModelAttribute를 사용할 수 없다.

     

    단순 텍스트 요청 메시지와 응답 메시지

     

    • HttpServletRequest, HttpServletResponse 이용
    • InputStream, OutputStream 이용
    • HttpEntity 이용
    • @RequestBody, @ResponseBody 이용

     

     위 4가지 방법이 있으며 과거에서 사용했던 방법에서부터 현재 사용 방법까지 어떻게 편리하게 되었는지 알아보자.

     

     

    HttpServletRequest, HttpServletResponse을 이용

     

    • HttpServletRequest와 HttpServletResponse의 객체를 이용하여
      텍스트 형식의 요청 메시지 조회와 텍스트 형식으로 응답 메시지 보내기

     

    Postman을 이용한 요청 메시지 보내기

    @Slf4j
    @Controller
    public class RequestBodyStringController {
    
        @PostMapping("/request-body-string-v1")
        public void requestBodyString(HttpServletRequest request,
                                      HttpServletResponse response) throws IOException {
    
            ServletInputStream inputStream = request.getInputStream();
            String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
            log.info("messageBody={}", messageBody);
    
            response.getWriter().write("ok");
        }
    }

     주의할 점은 Stream은 바이트코드이므로 항상 인코딩 설정을 해줘야 한다(StandardCharsets.UTF_8). 위 코드는 요청 메시지 바디에 'text message test'란 데이터를 조회하여 로그를 출력해주었고 응답 메시지 바디에 "ok" 텍스트를 담아 응답 메시지를 보낸 코드이다.

    로그 출력

     역시나 위 방법은 HttpServletRequest, HttpServletResponse를 주입받고, Stream으로 꺼내오고, 인코딩하는 등 여러 작업을 해야 하는 불편한 점이 있다.


     

    InputStream, OutputStream 이용

     

    • InputStream(Reader)는 HTTP 요청 메시지 바디의 내용을 직접 조회할 수 있다.
    • OutputStream(Writer)는 HTTP 응답 메시지의 바디에 텍스트를 담아 보낼 수 있다.

     

    Postman을 이용한 요청 메시지 보내기

    @Slf4j
    @Controller
    public class RequestBodyStringController {
    
        @PostMapping("/request-body-string-v2")
        public void requestBodyStringV2(InputStream inputStream, 
                                        Writer responseWriter) throws IOException {
            
            String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
            log.info("messageBody={}", messageBody);
            
            responseWriter.write("ok");
        }
    }

    로그 출력

     HttpServletRequest, HttpServletResponse보단 편리해졌지만 역시나 인코딩 작업을 하는 불편함이 있다.

     


     

     

    HttpEntity 이용

     

    • Spring MVC에서 지원해주는 클래스
    • HTTP header, body 정보를 편리하게 조회할 수 있다.
    • 응답 메시지 바디에 데이터와 헤더 정보를 직접 담을 수 있다

     

    Postman을 이용한 요청 메시지 보내기

    @Slf4j
    @Controller
    public class RequestBodyStringController {
    
        @PostMapping("/request-body-string-v3")
        public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) {
        
            String messageBody = httpEntity.getBody();
            log.info("messageBody={}", messageBody);
            
            return new HttpEntity<>("ok");
        }
    }

    로그 출력

     단순 텍스트 데이터는 문자열이기때문에 String 타입으로 조회할 수 있다. Spring MVC에서 제공하는 HttpEntity 클래스를 이용하여 쉽게 요청 메시지 바디에 있는 텍스트 데이터들을 조회할 수 있다.


     

     

    @RequestBody, @ResponseBody 이용

     

    • @RequestBody : 요청 메시지 바디를 직접 조회할 수 있는 애노테이션
    • @ResponseBody : 응답 메시지 바디에 직접 텍스트를 담을 수 있는 애노테이션
    • 헤더 정보를 조회할려면 @RequestHeader 애노테이션을 사용해야 한다.

     

    Postman을 이용한 요청 메시지 보내기

    @Slf4j
    @Controller
    public class RequestBodyStringController {
    
        @ResponseBody
        @PostMapping("/request-body-string-v4")
        public String requestBodyStringV4(@RequestBody String messageBody) {
        
            log.info("messageBody={}", messageBody);
            
            return "ok";
        }
    }

    로그 출력

     

     현재는 위 코드와 같이 @RequestBody와 @ResponseBody를 이용하여 편리하게 사용한다. 

     

     

     

     

     

     

    반응형

    댓글

Designed by Tistory.