URL 변수 요청

요청 예시

GET /example/user/{userId}/orders/{orderId}

PathVariable

@Slf4j
@RestController
public class MappingController {
  @GetMapping("/mapping/{userId}/orders/{orderId}")
  public String mappingMultiPath(
          @PathVariable String userId,
          @PathVariable Long orderId
  ) {
    log.info("mappingMultiPath userId={} orderId={}", userId, orderId);
    return "ok";
  }
}
  • URL에 {userId} 로 되어있는 식별자를 받아오기 위해서 사용된다.
  • @PathVariable("pathValueName") [Type] [name]
  • 매개 변수의 이름과 식별자 이름이 동일하다면 생략할 수 있다.
    • @PathVariable String userId
  • 여러 식별자를 각기 다른 매개 변수로 가져올 수 있다.

Query String, HTML Form 요청

요청 예시

Query String

GET /example?username=새우&age=27

HTML Form

POST /example
username=새우&age=27

Query String와 HTML Form의 형식이 동일하여 Spring에서 파싱할 때 동일한 로직으로 작동한다.

RequestParam

@Slf4j
@RestController
public class RequestParamController {
  @RequestMapping("/request-param")
  public String requestParam(
          @RequestParam String username,
          @RequestParam int age,
		  @RequestParam Map<String, Object> paramMap
  ) {
    log.info("username = {}, age = {}", username, age);
	log.info("username = {}, age = {}", 
				paramMap.get("username"), paramMap.get("age"));
    return "ok";
  }
}
  • @RequestParam("requestValueName") [Type] [name]
  • 매개 변수의 이름과 요청 변수의 이름이 동일한 경우, 프로퍼티를 생략할 수 있다.
  • required 프로퍼티를 설정하지 않으면 true가 설정된다.
  • Map 이나 MultiValueMap 을 이용해 모든 파라미터를 가져올 수 있다.
    • default: required = false

ModelAttribute

@Slf4j
@RestController
public class RequestModelParamController {
  @RequestMapping("/model-attribute")
  public String modelAttribute(
          @ModelAttribute HelloData helloData
  ) {
    log.info("username = {}, age = {}", helloData.getUsername(), helloData.getAge());
    return "ok";
  }
}
  • @ModelAttribute("requestValueName") [Object] [name]
  • 객체를 생성한 후, 요청 파라미터의 이름으로 객체의 setter를 찾아 값을 바인딩한다.
    • username ⇒ setUsername() 을 찾는다.
  • 매개 변수의 이름과 요청 변수의 이름이 동일한 경우, 프로퍼티를 생략할 수 있다.
  • 클라이언트에서 해당 객체의 맴버 변수의 타입에 맞지 않는 값을 넣어 보낼 경우,
    BindException 이 발생한다.
  • 기본 설정
    • required = false
    • defaultValue = null, 0

HTTP Body 요청

요청 예시

POST /example
Hello Spring
POST /example
{
  "username": "새우",
  "age": 27
}

HttpEntity

@Slf4j
@RestController
public class RequestBodyController {
  /**
   * 일반 텍스트 요청 처리
   */
  @PostMapping("/request-body-string")
  public String requestBodyString(
          HttpEntity<String> httpEntity
  ) throws IOException {
    log.info("messageBody = {}", httpEntity.getBody());
    return "echo: " + messageBody;
  }

  /**
   * JSON 요청 처리
   */
  @PostMapping("/request-body-json")
  public String requestBodyJson(
          HttpEntity<HelloData> data
  ) throws IOException {
    log.info("data = {}", data.getBody().toString());
    return data;
  }
}
  • HTTP Header와 Body 정보를 제공한다.
  • HttpMessageConverter를 통해 HttpEntity로 변환된다.
    • 이를 통해 프로그래머가 따로 문자열을 변환하는 작업을 하지 않아도 된다.
      • Text: StreamUtils.copyToString
      • Json: objectMapper.readValue
  • getBody() 메서드를 통해 직접 조회가 가능하다.
  • HttpEntity 를 상속받은 자식 객체들은 다음과 같은 기능을 제공한다.
    • RequestEntity
      • HttpMethod + URL 정보, 요청에서 사용
    • ResponseEntity
      • HTTP 상태 코드 설정 가능, 응답에서 사용

RequestBody

@Slf4j
@RestController
public class RequestBodyController {
  /**
   * 일반 텍스트 요청 처리
   */
  @PostMapping("/request-body-string")
  public String requestBodyString(
          @RequestBody String messageBody
  ) throws IOException {
    log.info("messageBody = {}", messageBody);
    return "echo: " + messageBody;
  }

  /**
   * JSON 요청 처리
   */
  @PostMapping("/request-body-json")
  public String requestBodyJson(
          @RequestBody HelloData data
  ) throws IOException {
    log.info("data = {}", data.toString());
    return "echo: " + data.toString();
  }
}
  • @RequestBody [Type] [name]
  • HTTP Body 정보를 제공한다.
  • HttpMessageConverter를 통해 HttpEntity로 변환된다.
    • 이를 통해 프로그래머가 따로 문자열을 변환하는 작업을 하지 않아도 된다.
      • Text: StreamUtils.copyToString
      • Json: objectMapper.readValue
  • 생략하면 안된다!
    • @RequestBody 를 생략하는 경우, Spring은 다음의 규칙을 적용한다.
    • 원시 타입: @RequestParam
    • 나머지: @ModelAttribute
profile
백엔드 개발자 지망생

0개의 댓글