요청 매핑 - API 예시, HTTP 요청 파라미터

황준하·2023년 9월 10일

SpringMVC

목록 보기
17/19
post-thumbnail

요청 매핑 - API 예시

https://github.com/lay423/springmvc/commit/58688e215d2838d1f851b3fd5da9d28ef55e8946

https://github.com/lay423/springmvc/commit/1675e562c6a10c984b41d22415c14b80d14605a4

회원 관리 API

  • 회원 목록 조회: GET
  • 회원 등록: POST
  • 회원 조회: GET
  • 회원 수정: PATCH
  • 회원 삭제: DELETE

HTTP 요청 - 기본, 헤더 조회

RequestHeaderController 실행

    : request=org.apache.catalina.connector.RequestFacade@1b21625f
    : response=org.apache.catalina.connector.ResponseFacade@4920491f
    : httpMethod=GET
    : locale=ko_KR
    : headerMap={content-type=[application/json], user-agent=[PostmanRuntime/7.29.2], accept=[*/*], postman-token=[6aee894f-dc1a-491a-ab2b-733ccf7fc472], host=[localhost:8080], accept-encoding=[gzip, deflate, br], connection=[keep-alive], content-length=[32]}
    : header host=localhost:8080
    : myCookie=null
MultiValueMap<String, String>

MAP과 유사한데, 하나의 키에 여러 값을 받을 수 있다.

HTTP header, http 쿼리 파라미터와 같이 하나의 키에 여러 값을 받을 때 사용한다.

HTTP 요청 파라미터 - 쿼리 파라미터, HTML Form

HTTP 요청 데이터 조회 - 개요

  • GET - 쿼리 파라미터
  • POST - HTML Form
  • HTTP message body

요청 파라미터 - 쿼리 파라미터 HTML Form

RequestParamController 실행

http://localhost:8080/request-param-v1?username=hello&age=20

HTTP 요청 파라미터 - @RequestParam

@RequestParam(required = false) Integer age)

기본형에  null 입력

int 에 null 입력하는 것은 불가능하므로 Integer로 선언

requestParamDefault

빈 문자의 경우에도 설정한 기본 값이 적용된다.

requestParamMap

파라미터를 Map, MultiValueMap으로 조회할 수 있다.

HTTP 요청 파라미터 - @ModelAttribute

@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@ModelAttribute HelloData helloData) {
    log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
    return "ok";
}

스프링 MVC는 ModelAttribute 가 있으면 다음을 실행한다.

  1. HelloData 개체를 생성한다.
  2. 요청 파라미터의 이름으로 HelloData 객체의 프로퍼티르 ㄹ찾는다. 그리고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력한다.
  3. 파라미터 이름이 username 이면 setUsername() 메서드를 찾아서 호출하면서 값을 입력한다.
@ResponseBody
@RequestMapping("/model-attribute-v2")
public String modelAttributeV2(HelloData helloData) {
    log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
    return "ok";
}

@ModelAttribute는 생략할 수 있다.

HTTP 요청 메시지 - 단순 텍스트

HTTP message body 에 데이터를 직접 담아서 요청

  • HTTP API에서 주로 사용, JSON, XML, TEXT
  • 데이터 형식으 ㄴ주로 JSON 사용
  • POST, PUT, PATCH
@PostMapping("/request-body-string-v3")
public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) throws IOException {

    String messageBody = httpEntity.getBody();
    log.info("messageBody={}", messageBody);

    return new HttpEntity<>("ok");
}

"스프링 MVC는 다음 파라미터를 지원한다."
HttpEntity: HTTP header, body 정보를 편리하게 조회

  • 메시지 바디 정보를 직접 조회
  • 요청 파라미터를 조회하는 기능과 관계 없음

HttpEntity는 응답에도 사용 가능

  • 메시지 바디 정보 직접 반환
  • 헤더 정보 포함 가능
  • view 조회X
@ResponseBody
@PostMapping("/request-body-string-v4")
public String requestBodyStringV4(@RequestBody String messageBody) {

    log.info("messageBody={}", messageBody);

    return "ok";
}

"@RequestBody"
@RequestBody를 사용하면 HTTP  메시지 바디 정보를 편리하게 조회할 수 있다. 참고로 헤더 정보가 필요하다면 Http를 사용하거나 @RequestHeader를 사용하면 된다.
요청 파라미터를 조회하는 @RequestParam 과 @ModelAttribute와는 전혀 관계가 없다.

"요청 파라미터 vs HTTP 메시지 바디"
요청 파라미터를 조회하는 기능: @RequestParam, @ModelAttribute
HTTP 메시지 바디를 직접 조회하는 기능: @RequestBody

"@ResponseBody"
@ResponseBody를 사용하면 응답 결과를 HTTP 메시지 바디에 직접 담아서 전달할 수 있다.
물론 이 경우에도 view를 사용하지 않는다.

0개의 댓글