ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • spring [17] request 요청
    개인 공부/spring 2021. 6. 19. 11:18
    728x90
    반응형

    request 요청

    Spring에서의 요청을 알아보려고 한다. 먼저 매핑정보에 대해서 알아봐야하는데

    • class 단위의 controller 설정

      • @Controller : 반환 값이 String이면 뷰 이름으로 인식된다. 그래서 뷰를 찾고 뷰가 렌더링된다.
      • @RestController : 반환 값이 HTTP message body에 입력된다. 따라서 실행결과를 메세지로 받을 수 있다.
    • method 단위 설정

      • @RequestMapping("url") : url 호출이 오면 해당 메서드가 실행된다. 또한 배열로 제공하여 다중 설정이 가능하다
        • @RequestMapping({"url1","url2"})
        • method 속성을 명시하지 않으면 모든 요청에 호출된다. @RequestMapping(value = "url", method = mehtod)
        • method를 지정하는 @GetMapping, @PostMapping, @PutMapping 등 사용이 가능하다.
        • 특정 parameter나 headers, Content-Type, accpet에 대해 조건 매핑이 가능하다.
          • @ReqeustMapping(value = "url", params = "mode=debug")
          • @ReqeustMapping(value = "url", headers = "mode=debug")
          • @ReqeustMapping(value = "url", consumes = "application/json")
          • @ReqeustMapping(value = "url", produce = "application/json")
    • parameter 단위 설정

      • @PathVariable : 최근 API 방식은 리소스 경로에 식별자를 넣는 스타일을 선호한다.
        • /mapping/userA or /users/1 과 같이 사용하는 방식이다.
            @GetMapping("/mapping/users/{userId}/orders/{orderId}")
            public String mappingPath(@PathVariable String userId, @PathVariable Long 
            orderId) {
                log.info("mappingPath userId={}, orderId={}", userId, orderId);
                return "ok";
            }
      • required : 필수값 여부
      • defaultVlaue : 값이 null일때 default값

    header 조회하기

    @RestController
    public class RequestHeaderController {
        @RequestMapping("/headers")
        public String headers(HttpServletRequest request,
        HttpServletResponse response,
        HttpMethod httpMethod,
        Locale locale,
        @RequestHeader MultiValueMap<String, String>
        headerMap,
        @RequestHeader("host") String host,
        @CookieValue(value = "myCookie", required = false)
        String cookie
        ) {
            log.info("request={}", request);
            log.info("response={}", response);
            log.info("httpMethod={}", httpMethod);
            log.info("locale={}", locale);
            log.info("headerMap={}", headerMap);
            log.info("header host={}", host);
            log.info("myCookie={}", cookie);
            return "ok";
        }
    }
    • HttpMehtod : HTTP 메서드 조회
    • Locale : Locale 정보 조회
    • @ReqeustHeader : 모든 HTTP 헤더 정보 조회
    • @RequestHeader("헤더 요소 이름") : 특정 헤더 값 조회
    • @CookieValue : 쿠키 조회

    요청 데이터 조회

    HTTP 요청 메세지를 통해 클라이언트에서 서버로 데이터를 전달하는 방법은 3가지를 주로 사용한다.

    1. GET - 쿼리 파라미터
      • /url?username=hello&age=20
      • 메세지 바디 없이 url에 쿼리 파라미터로 데이터를 포함해서 전달
      • 검색, 필터, 페이징등에 주로 사용됨
    1. POST - HTML Form
      • content-type:application/x-www-form-urlencoded
      • 메세지 바디에 쿼리 파라미터 형식으로 전달
      • 회원가입, 상품주문, form 데이터 전달에 사용
    1. HTTP message body에 데이터를 직접 담아서 요청
      • HTTP API에 주로 사용
      • JSON, XML, TEXT의 데이터를 전달

    위 방식중 GET과 HTML Form 방식은 사용방법을 이미 알고 있으므로(실무에서 너무 많이 씀...) message body에 데이터 전달하는 방법(API에서 많이 사용되는 방식)만 정리하려고 한다.

    JSON으로 요청하기

    1. Servlet으로 받기

       @Slf4j
       @Controller
       public class RequestBodyJsonController {
           private ObjectMapper objectMapper = new ObjectMapper();
      
           @PostMapping("/request-body-json-v1")
           public void requestBodyJsonV1(HttpServletRequest request, HttpServletResponse response) throws OException {
               ServletInputStream inputStream = request.getInputStream();
               String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
               log.info("messageBody={}", messageBody);
               HelloData data = objectMapper.readValue(messageBody, HelloData.class);
               log.info("username={}, age={}", data.getUsername(), data.getAge());
               response.getWriter().write("ok");
           }
       }

      servlet의 inputStream을 가져와서 utf-8로 디코딩하여 메세지 바디의 내용을 뽑아오는 방식이다.

    2. @RequestBody 사용

       @ResponseBody
       @PostMapping("/request-body-json-v2")
       public String requestBodyJsonV2(@RequestBody String messageBody) throws IOException {
           HelloData data = objectMapper.readValue(messageBody, HelloData.class);
           log.info("username={}, age={}", data.getUsername(), data.getAge());
           return "ok";
       }

      @RequestBody를 사용하여 앞선 방식에서 Servlet을 String으로 치환하는 과정을 제거할 수 있다. 또한 @ResponseBody를 사용하여 반환되는 HTTP message body에 직접 내용을 전달할 수 있게 된다.

    1. @ReqeustBody 사용2

       @ResponseBody@PostMapping("/request-body-json-v3")
       public String requestBodyJsonV3(@RequestBody HelloData data) {
           log.info("username={}, age={}", data.getUsername(), data.getAge());
           return "ok";
       }

      위에서 사용된 방식과 동일한거 같지만 @RequestBody를 사용하여 객체를 직접 전달받아서 사용했다.

      HTTPEntity, @RequestBody를 사용하면 HTTP 메세지 컨버터가 HTTP 메세지 바디의 내용을 우리가 원하는 문자나 객체로 변환해준다. 또한 JSON 객체로도 변환해주는데 HTTP 컨버터에 대해서는 다시 정리해놓겠다.

    2. HttpEntity 사용

       @ResponseBody
       @PostMapping("/request-body-json-v4")
       public String requestBodyJsonV4(HttpEntity<HelloData> httpEntity) {
           HelloData data = httpEntity.getBody();
           log.info("username={}, age={}", data.getUsername(), data.getAge());
           return "ok";
       }

      @RequestBody와 같이 HttpEntity를 직접사용해서 사용할 수 있다.

    출처 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

    728x90
    반응형
Designed by Juno.