09. Request Parameter
์คํ๋ง์ผ๋ก HTTP ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์.
1๏ธโฃ ย ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ์
ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ์์ ๋ฐ๋ผ ์กฐํํ๋ ๋ฐฉ๋ฒ์ด ๋ฌ๋ผ์ง ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋จผ์ ์ ๋ฌ ๋ฐฉ์์ ์์๋ณด์. ํฌ๊ฒ ์๋ 3๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๋๋๋ค.
์์ฒญ ํ๋ผ๋ฏธํฐ ๋ฐฉ์๊ณผ HTML Form ์ ์ฌ์ฉํ ์ ๋ฌ๋ฐฉ์์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์๋ค.
์ ๋ฌ ๋ฐฉ์ | ์ค๋ช | ์์ธ | ์กฐํ ๋ฉ์๋ |
---|---|---|---|
์์ฒญ ํ๋ผ๋ฏธํฐ | URL์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ์ ๋ฐ์ดํฐ๋ฅผ ํฌํจํด์ ์ ๋ฌ | http://localhost:8080/request-param-v2?username=hello&age=10 | @RequestParam, @ModelAttribute |
HTML Form | ๋ฉ์์ง ๋ฐ๋์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ํ์์ผ๋ก ์ ๋ฌ | ํด๋ผ์ด์ธํธ๊ฐ HTML Form ์์ ๊ฐ์ ์ ๋ ฅํ๊ณ ์ ์ก ๋ฒํผ์ ๋๋ฅผ ๋ ๋ฐ์ดํฐ๊ฐ ๋์ด์ค๋ ๊ฒ์ ๋งํ๋ค. | ไธๅ |
HTTP API | message body ์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ๋ด์์ ์ ๋ฌ | ์ฃผ๋ก JSONํ์์ ์ฌ์ฉํ๋ค. | HttpEntityยซT>T>, @RequestBody |
2๏ธโฃ ย ์์ฒญ ํ๋ผ๋ฏธํฐ - @RequestParam
ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ผ๋ก ๋ฐ์ธ๋ฉํด์ค๋ค. ๋ณ์๋ช ์ด ํ๋ผ๋ฏธํฐ ์ด๋ฆ๊ณผ ๊ฐ๋ค๋ฉด name ์์ฑ์ ์๋ตํด๋ ๋๋ค.
ํ๋ผ๋ฏธํฐ๋ฅผ Map, MultiValueMap ์ผ๋ก ์กฐํํ ์ ์๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ชจ๋ ์์ฒญ ํ๋ผ๋ฏธํฐ๊ฐ Map ์ ๋ด๊ธด๋ค. ๋ค๋ง ํ๋์ key์ ์ฌ๋ฌ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ๋ด๊ธธ ๊ฒฝ์ฐ๋ฅผ ์์ ํ๋ค๋ฉด (key=userIds, value=[id1,id2]) MultiValueMap ์ ์ฌ์ฉํด์ผ ํ๋ค.
@Slf4j
@Controller
public class RequestParamController {
@ResponseBody
@RequestMapping("/request-param-v3")
public String requestParamV3(@RequestParam String username,
@RequestParam int age)
{
log.info("username = {}, age = {}", username, age);
return "ok";
}
@ResponseBody
@RequestMapping("request-param-map")
public String requestPatamMap(@RequestParam Map<String, Object> paramMap) {
log.info("username = {}, age = {}", paramMap.get("username"), paramMap.get("age"));
return "ok";
}
}
3๏ธโฃ ย ์์ฒญ ํ๋ผ๋ฏธํฐ - @ModelAttribute
์ค์ ๊ฐ๋ฐ์ ํ๋ฉด ์์ฒญ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์์ ๊ฐ์ฒด์ ๊ทธ ๊ฐ์ ๋ฃ์ด์ค์ผํ๋ค. ์ด ๊ณผ์ ์ ์๋ํํ ๊ฒ์ด @ModelAttribute ์ด๋ค.
@ModelAttribute ์ด๋ ธํ ์ด์ ์ ์์ ์๋ตํด๋ ๋์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ๊ถ์ฅ๋์ง๋ ์๋ ๋ชจ์์ด๋ค.
์ฐ์ ํ ์คํธ๋ก ์ฌ์ฉํ HelloData ํด๋์ค๋ฅผ ๋ง๋ ๋ค.
import lombok.Data;
@Data
public class HelloData {
private String username;
private int age;
}
- @ModelAttribute ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํด์ ๋ฐ๋ก ๊ฐ์ฒด์ ๊ฐ์ ์ฃผ์ ํ ์ ์๋ค.
@Slf4j
@Controller
public class RequestParamController {
@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@ModelAttribute HelloData helloData) {
log.info("username = {}, age = {}", helloData.getUsername(), helloData.getAge());
log.info("heloData = {}", helloData);
return "ok";
}
}
โก๏ธ ย @ModelAttribute ์ ํน๋ณํ ์ฌ์ฉ๋ฒ !
- @ModelAttribute ์ด๋ ธํ ์ด์ ์ ๋ฉ์๋ ๋จ์์ ์ฌ์ฉํ๋ฉด, ํด๋น ์ปจํธ๋กค๋ฌ๋ฅผ ์์ฒญํ ๋, ๋ฉ์๋์ return ๊ฐ์ด Model์ ์๋์ผ๋ก ๋ด๊ธฐ๊ฒ ๋๋ค.
@Controller
public class FormItemController {
@ModelAttribute("regions")
public Map<String, String> regions() {
Map<String, String> regions = new LinkedHashMap<>();
regions.put("SEOUL", "์์ธ");
regions.put("BUSAN", "๋ถ์ฐ");
regions.put("JEJU", "์ ์ฃผ");
return regions;
}
}
4๏ธโฃ ย HTTP API (๋จ์ ํ ์คํธ) - HttpEntityยซT>T>
์์ฒญ ํ๋ผ๋ฏธํฐ์ ๋ค๋ฅด๊ฒ HTTP ๋ฉ์์ง ๋ฐ๋๋ฅผ ํตํด ๋ฐ์ดํฐ๊ฐ ์ง์ ๋์ด์ค๋ ๊ฒฝ์ฐ๋ @RequestParam, @ModelAttribute ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๊ทธ๋์ ์คํ๋งMVC ์์๋ HTTP header, body ์ ๋ณด๋ฅผ ๊ฐํธํ๊ฒ ์กฐํํ ์ ์๋ HttpEntity ๋ผ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๊ณตํ๋ค.
HttpEntity ๊ฐ ์ ๊ณตํ๋ getBody, getHeader ๋ฑ์ ๋ฉ์๋๋ฅผ ํตํด HTTP ์ ๋ณด๋ฅผ ์ป์ด๋ผ ์ ์๋ค.
๋ฉ์์ง ์ปจ๋ฒํฐ๊ฐ HTTP header ์ Content-Type ์ ๋ณด๊ณ ํด๋นํ๋ ํ์ ์ผ๋ก ์๋์ผ๋ก ๋ณํํด์ค๋ค.
@Slf4j
@Controller
public class RequestBodyStringController {
@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");
}
}
5๏ธโฃ ย HTTP API (๋จ์ ํ ์คํธ) - @RequestBody
HttpEntity ๋ฅผ ๋ ๋จ์ํ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํ ์ด๋ ธํ ์ด์ ์ด ์๋ค.
@RequestBody ๋ HTTP ์ ๋ฐ๋ ์ ๋ณด๋ง์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
@Slf4j
@Controller
public class RequestBodyStringController {
@ResponseBody
@PostMapping("request-body-string-v4")
public String requestBodyStringV4(@RequestBody String messageBody) {
log.info("messagebody = {}", messageBody);
return "ok";
}
}
6๏ธโฃ ย HTTP API (JSON)
- JSON Type ์ผ๋ก ๋์ด์ค๋ ๋ฐ์ดํฐ ์ญ์ HttpEntityยซT>T>, @RequestBody ๋ฐฉ์์ผ๋ก ์กฐํํ ์ ์๋ค.
@Slf4j
@Controller
public class RequestBodyJsonController {
@ResponseBody
@PostMapping("request-body-json-v4")
public String requestBodyJsonV4(HttpEntity<HelloData> helloData) {
HelloData data = helloData.getBody();
log.info("username = {}, age = {}", data.getUsername(), data.getAge());
return "ok";
}
@ResponseBody
@PostMapping("/request-body-json-v3")
public String requestBodyJsonV3(@RequestBody HelloData helloData) {
log.info("username = {}, age = {}", helloData.getUsername(), helloData.getAge());
return "ok";
}
}