Spring request 요청

최준호·2021년 7월 6일
0

Spring

목록 보기
17/48

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

profile
해당 주소로 이전하였습니다. 감사합니다. https://ililil9482.tistory.com

0개의 댓글