-
spring [17] request 요청개인 공부/spring 2021. 6. 19. 11:18728x90반응형
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")
- @RequestMapping("url") : url 호출이 오면 해당 메서드가 실행된다. 또한 배열로 제공하여 다중 설정이 가능하다
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"; }
- /mapping/userA or /users/1 과 같이 사용하는 방식이다.
- required : 필수값 여부
- defaultVlaue : 값이 null일때 default값
- @PathVariable : 최근 API 방식은 리소스 경로에 식별자를 넣는 스타일을 선호한다.
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가지를 주로 사용한다.
- GET - 쿼리 파라미터
- /url?username=hello&age=20
- 메세지 바디 없이 url에 쿼리 파라미터로 데이터를 포함해서 전달
- 검색, 필터, 페이징등에 주로 사용됨
- POST - HTML Form
- content-type:application/x-www-form-urlencoded
- 메세지 바디에 쿼리 파라미터 형식으로 전달
- 회원가입, 상품주문, form 데이터 전달에 사용
- HTTP message body에 데이터를 직접 담아서 요청
- HTTP API에 주로 사용
- JSON, XML, TEXT의 데이터를 전달
위 방식중 GET과 HTML Form 방식은 사용방법을 이미 알고 있으므로(실무에서 너무 많이 씀...) message body에 데이터 전달하는 방법(API에서 많이 사용되는 방식)만 정리하려고 한다.
JSON으로 요청하기
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로 디코딩하여 메세지 바디의 내용을 뽑아오는 방식이다.
@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에 직접 내용을 전달할 수 있게 된다.
@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 컨버터에 대해서는 다시 정리해놓겠다.
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를 직접사용해서 사용할 수 있다.
728x90반응형'개인 공부 > spring' 카테고리의 다른 글
spring[19] Spring의 요청과 응답 과정 (0) 2021.06.19 spring[18] Response 응답 (0) 2021.06.19 spring[16] Spring MVC 실제 사용법 (0) 2021.06.13 spring[15] 직접 만든 MVC Framework와 Spring MVC Framework 비교 (0) 2021.06.13 spring[14] Servlet의 MVC Framework 만들기 (0) 2021.06.12