์คํ๋ง MVC 1ํธ์ ๊ฐ์ ๋ด์ฉ์ ์ ๋ฆฌํ ํฌ์คํ ์ ๋๋ค.
์์ฒญ ๋งคํ
๋งคํ ์ ๋ณด
ํด๋์ค์ @Controller๋ฅผ ์ถ๊ฐํ ๊ฒฝ์ฐ ๋ฐํ ๊ฐ์ด String์ด๋ฉด ๋ทฐ ์ด๋ฆ์ผ๋ก ์ธ์๋๋ ๋ฐ๋ฉด, @RestController์ ๊ฒฝ์ฐ ๋ทฐ ์ด๋ฆ์ด ์๋ ํด๋น ๋ฌธ์์ด์ HTTP ๋ฐ๋์ ๋ฐ๋ก ์ ๋ ฅํ๊ฒ ๋๋ค.
๋๋ถ์ด @RequestMapping์ ์ด์ฉํจ์ผ๋ก์จ ํน์ URL๊ณผ ๋งคํ์ด ๊ฐ๋ฅํ๋ฐ, ์ฌ๋ฌ ๊ฐ์ URL์ ๋ฐฐ์ด๋ก ๋ฑ๋กํจ์ผ๋ก์จ ๋ค์ค ์ค์ ๋ ๊ฐ๋ฅํ๋ค.
HTTP ๋ฉ์๋
@RequestMapping์ ๋ฉ์๋ ์์ฑ์ ์ถ๊ฐํ์ง ์์ผ๋ฉด ๋ฉ์๋์ ๊ด๊ณ์์ด ํธ์ถ๋์ง๋ง, @RequestMapping(value = "/mapping-get", method = RequestMethod.GET)
์ ๊ฐ์ด ์์ฑ์ ์ง์ ํ ๊ฒฝ์ฐ ๋ฉ์๋๊ฐ ์ผ์นํ์ง ์์ ๋ 405 ์ํ์ฝ๋๋ฅผ ๋ฐํํ๋ค.
@RequestMapping์ ๋ฉ์๋ ์์ฑ์ ์ง์ ํ๋ ๋์ @GetMapping, @PostMapping๊ณผ ๊ฐ์ด ๋ฉ์๋ ์ข ๋ฅ์ ๋ฐ๋ฅธ ์ ๋ ธํ ์ด์ ์ ์ด์ฉํ ์๋ ์๋ค.
Path Variable
๋ฆฌ์์ค ๊ฒฝ๋ก์ ์๋ณ์๋ฅผ ๋ฃ์ ์ ์๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ๋ค์ค ์ฌ์ฉ๋ ๊ฐ๋ฅํ๋ค.
@GetMapping("/mapping/users/{userId}/orders/{orderId}")
public String mappingPath(@PathVariable String userId, @PathVariable Long orderId) {
log.info("mappingPath userId={}, orderId={}", userId, orderId);
return "ok";
}
ํน์ ํ๋ผ๋ฏธํฐ / ํค๋ ์กฐ๊ฑด ๋งคํ
ํน์ ํ๋ผ๋ฏธํฐ ๋๋ ํค๋๊ฐ ์๊ฑฐ๋ ์๋ ์กฐ๊ฑด์ ์ถ๊ฐํ ์ ์๋ค.
@GetMapping(value = "/mapping-param", params = "mode=debug") //URL์ ํ๋ผ๋ฏธํฐ ์ถ๊ฐํด์ผ ๋งคํ๋จ.
public String mappingParam() {
return "ok";
}
@GetMapping(value = "/mapping-header", headers = "mode=debug") //HTTP ํค๋์ ์ถ๊ฐํด์ผ ๋งคํ๋จ.
public String mappingHeader() {
return "ok";
}
๋ฏธ๋์ด ํ์
์กฐ๊ฑด ๋งคํ - HTTP ์์ฒญ Content-type, consumes
/ Accept, produces
consumes
๊ฐ์ HTTP ์์ฒญ์ Content-Type
ํค๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋งคํํ๋ฉฐ ์ผ์นํ์ง ์์ผ๋ฉด 415 ์ํ์ฝ๋๋ฅผ ๋ฐํํ๊ณ ,
produces
๊ฐ์ HTTP ์์ฒญ์ Accept
ํค๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋งคํํ๋ฉฐ ์ผ์นํ์ง ์์ผ๋ฉด 406 ์ํ์ฝ๋๋ฅผ ๋ฐํํ๋ค.
HTTP ์์ฒญ ํ๋ผ๋ฏธํฐ(1) - ํค๋ ์ ๋ณด ์กฐํ
@Slf4j
@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); //HTTP ๋ฉ์๋ ์กฐํ
log.info("locale={}", locale); //Locale ์ ๋ณด ์กฐํ
log.info("headerMap={}", headerMap); //๋ชจ๋ HTTP ํค๋๋ฅผ MultiValueMap ํ์์ผ๋ก ์กฐํ(ํ๋์ ํค์ ์ฌ๋ฌ ๊ฐ์ ๋ฐ์ ์ O)
log.info("header host={}", host); //ํน์ HTTP ํค๋ ์กฐํ
log.info("myCookie={}", cookie); //value ๊ฐ์ ๋ฐ๋ฅธ ํน์ ์ฟ ํค ์กฐํ
return "ok";
}
}
HTTP ์์ฒญ ํ๋ผ๋ฏธํฐ(2) - ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ, HTML Form
GET ๋ฐฉ์์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ์กฐํ์ POST ๋ฐฉ์์ HTML Form ์ ์ก ๋ฐฉ์์ ๊ณตํต์ ์ธ ์์ฒญ ํ์์ ๊ฐ์ง๊ณ ์๋ค. ๋ฐ๋ผ์ ๊ตฌ๋ถ ์์ด ์กฐํ๊ฐ ๊ฐ๋ฅํ๋ฐ, ํด๋น ์กฐํ ๋ฐฉ์์ ์์ฒญ ํ๋ผ๋ฏธํฐ ์กฐํ๋ผ๊ณ ํ๋ค. ์คํ๋ง์ ์ด์ฉํด ์์ฒญ ํ๋ผ๋ฏธํฐ๋ฅผ ์กฐํํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
1. HttpServletRequest์ getParameter()
2. @RequestParam
@ResponseBody
@RequestMapping("/request-param")
public String requestParam(
@RequestParam("username") String username,
@RequestParam("age") int age) {
log.info("username={}, age={}",username,age);
return "ok";
}
ํด๋น ์ ๋ ธํ ์ด์ ์ ์ด์ฉํ๋ฉด ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ ํตํ ๋ฐ์ธ๋ฉ์ด ๊ฐ๋ฅํ๋ค.
2-1. HTTP ํ๋ผ๋ฏธํฐ ์ด๋ฆ๊ณผ ๋ณ์ ์ด๋ฆ์ด ๊ฐ๋ค๋ฉด ์ ๋
ธํ
์ด์
๋ด name
์์ฑ์ ์๋ตํ ์ ์๋ค.
2-2. required
์์ฑ์ ํตํด ํ๋ผ๋ฏธํฐ ํ์ ์ฌ๋ถ ๋ํ ์ง์ ํ ์ ์๋๋ฐ ์ฃผ์ํด์ผ ํ ์ ์ด ์๋ค. int์ ๊ฐ์ ๊ธฐ๋ณธํ(primitive) ํ์
์ ๊ฒฝ์ฐ null์ ๋ฐ์ ์ ์๊ธฐ ๋๋ฌธ์ ์์ฑ ๊ฐ์ false๋ก ์ง์ ํ ๊ฒฝ์ฐ null์ ๋ฐ์ ์ ์๋ ์ฐธ์กฐํ(reference) ํ์
์ผ๋ก ์ ์ธํ๊ฑฐ๋, @RequestParam(required = false, defaultValue = "-1") int age
์ ๊ฐ์ด defaultValue ์์ฑ์ ์ด์ฉํด ๊ฐ์ด ๋ค์ด์ค์ง ์์์ ๋ ๊ธฐ๋ณธ์ผ๋ก ๋ฃ์ด์ค ๊ฐ์ ์ง์ ํด์ฃผ์ด์ผ ํ๋ค. ํด๋น ์์ฑ์ ๋น ๋ฌธ์๊ฐ ๋ค์ด์จ ๊ฒฝ์ฐ์๋ ์ ์ฉ๋๋ค.
2-3. @RequestParam Map<String, Object> paramMap
๊ณผ ๊ฐ์ด ํ๋ผ๋ฏธํฐ๋ฅผ Map, MultiValueMap์ผ๋ก ์กฐํํ ์ ์๋ค.
3. @ModelAttribute
์์ฒญ ํ๋ผ๋ฏธํฐ์ ๊ฐ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋ @RequestParam์ผ๋ก ๊ฐ์์ ๊ฐ์ ๋ฐ๊ณ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ค ๊ฐ์ ํ ๋นํด์ฃผ์ด์ผ ํ ๊ฒ์ด๋ค. ํ์ง๋ง ํด๋น ์ ๋ ธํ ์ด์ ์ ์ด์ฉํ๋ฉด ์ด ๊ณผ์ ์ ๊ฑฐ์น์ง ์๊ณ ๋ ๊ฐ์ ๊ฐ์ฒด๋ก ๋ฐ์ ์ ์๋ค. ๋ฐ๋ผ์ ๋ค์ ์ฝ๋๋ ์ ์์ ์ผ๋ก ๋์ํ๋ค.
@ResponseBody
@RequestMapping("/model-attribute")
public String modelAttribute(@ModelAttribute HelloData helloData) {
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
return "ok";
}
3-1. ์คํ๋ง MVC๋ ์์ ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์ณ ์คํํ๋ค.
์ฐ์ HelloData
๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์์ฒญ ํ๋ผ๋ฏธํฐ์ ์ด๋ฆ์ผ๋ก ๊ฐ์ฒด ๋ด ๋ฉค๋ฒ ๋ณ์๋ฅผ ์ฐพ์ setter๋ฅผ ํธ์ถํด ํ๋ผ๋ฏธํฐ์ ๊ฐ์ ์
๋ ฅํ๋ค. ๋ง์ฝ ์ซ์๊ฐ ๋ค์ด๊ฐ์ผ ํ๋ ๊ณณ์ ๋ฌธ์๋ฅผ ๋ฃ๋ ๊ฒ์ฒ๋ผ ํ์
์ด ๋ง์ง ์์ ๊ฒฝ์ฐ BindException
์ด ๋ฐ์ํ๋ค.
3-2. ๋ง์ฝ ์ ๋ ธํ ์ด์ ์ ์๋ตํ ์ํ๋ก ํ๋ผ๋ฏธํฐ๋ฅผ ์์ฑํ์์ ๋ String, int, Integer์ ๊ฐ์ ๋จ์ ํ์ ์ ๊ฒฝ์ฐ @RequestParam์ผ๋ก ์ฒ๋ฆฌํ๊ณ ๊ทธ ์ธ์๋ @ModelAttribute์ผ๋ก ์ฒ๋ฆฌํ๋ค.(ํน์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋, ArgumentResolver๋ก ์ง์ ๋ ์ผ๋ถ ํ์ ์ ์ธ)
HTTP ์์ฒญ ๋ฉ์์ง
์์ฒญ ํ๋ผ๋ฏธํฐ์ ๊ฒฝ์ฐ์ ๋ฌ๋ฆฌ HTTP ๋ฉ์์ง ๋ฐ๋๋ฅผ ํตํด ๋ฐ์ดํฐ๊ฐ ์ง์ ๋์ด์ค๋ ๊ฒฝ์ฐ @RequestParam๊ณผ @ModelAttribute๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉ์์ง ๋ฐ๋์ ๋ฐ์ดํฐ๋ InputStream์ ์ด์ฉํด ์ฝ์ ์ ์๋๋ฐ, ์คํ๋ง MVC๋ฅผ ์ด์ฉํ๋ฉด HttpServletRequest
, InputStream
, HttpEntity / RequestEntity
์ค ํ๋๋ฅผ ๊ณจ๋ผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์ผ๋ก์จ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์๋ ์๋ค.
ํ์ง๋ง ํค๋ ์ ๋ณด๊ฐ ํ์ ์์ ๊ฒฝ์ฐ @RequestBody ์ ๋ ธํ ์ด์ ์ ์ด์ฉํด ๋ฐ๋ ์ ๋ณด๋ฅผ ํธ๋ฆฌํ๊ฒ ์กฐํํ ์ ์๋ค.
ํนํ HTTP API์์ ์ฃผ๋ก ์ฌ์ฉํ๋ JSON ๋ฐ์ดํฐ ํ์์ ๊ฐ์ฒด๋ก ๋ณํํ๊ธฐ ์ํด์๋ ๋ฉ์์ง ๋ฐ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ฌธ์๋ก ๋ณํํ๊ณ ์๋ฐ ๊ฐ์ฒด๋ก ๋ณํํ๋ ๊ณผ์ ์ด ํ์ํ๋ฐ, ํด๋น ์ ๋
ธํ
์ด์
์ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด @RequestBody HelloData data
์ ๊ฐ์ด ๋ณ๋์ ๋ก์ง์ ์์ฑํ์ง ์๊ณ ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
ํ์ง๋ง @RequestBody๋ ์๋ต์ด ๋ถ๊ฐ๋ฅํ๋ค. ์์์๋ ์ธ๊ธํ๋ฏ์ด ์ ๋
ธํ
์ด์
์ ์๋ตํ ์ฑ ํ๋ผ๋ฏธํฐ๋ฅผ ์์ฑํ๋ฉด HTTP ๋ฉ์์ง ๋ฐ๋๊ฐ ์๋ ์์ฒญ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฒ๋ฆฌํ๊ฒ ๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋ํ HTTP ์์ฒญ ์ content-type
์ด application/json
์ด์ด์ผ JSON์ ์ฒ๋ฆฌํ ์ ์๋ค.
HTTP ์๋ต(1) - ์ ์ ๋ฆฌ์์ค, ๋ทฐ ํ ํ๋ฆฟ
์ ์ ๋ฆฌ์์ค
์ ์ ๋ฆฌ์์ค๋ ํ์ผ์ ๋ณ๊ฒฝ ์์ด ๊ทธ๋๋ก ์๋น์คํ๋ ๊ฒ์ผ๋ก, src/main/resources
์ ๋ฆฌ์์ค๋ฅผ ๋ฃ์ด๋๋ฉด ์คํ๋ง ๋ถํธ๊ฐ ์ ์ ๋ฆฌ์์ค๋ก ์๋น์ค๋ฅผ ์ ๊ณตํ๋ค.
๋ทฐ ํ ํ๋ฆฟ
์ผ๋ฐ์ ์ผ๋ก๋ HTML์ ๋์ ์ผ๋ก ์์ฑํ๋ ์ฉ๋๋ก ์ฌ์ฉํ๋ฉฐ, ๋ทฐ ํ ํ๋ฆฟ์ ๊ฑฐ์ณ HTML์ด ์์ฑ๋๊ณ ๋ทฐ๊ฐ ์๋ต์ ๋ง๋ค์ด ์ ๋ฌํ๋ค.
์คํ๋ง ๋ถํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก src/main/resources/templates
์ด๋ผ๋ ๋ทฐ ํ
ํ๋ฆฟ ๊ฒฝ๋ก๋ฅผ ์ ๊ณตํ๋ค.
HTTP ์๋ต(2) - HTTP API, ๋ฉ์์ง ๋ฐ๋์ ์ง์ ์ ๋ ฅ
HTTP ์์ฒญ ๋ฉ์์ง์ ๋ง์ฐฌ๊ฐ์ง๋ก HttpServletResponse๋ฅผ ์ด์ฉํ ์ ์์ง๋ง, HttpEntity๋ฅผ ์์๋ฐ์ ResponseEntity ๋๋ @ResponseBody ์ ๋ ธํ ์ด์ ์ ์ด์ฉํ๋ฉด HTTP ๋ฉ์์ง๋ฅผ ์ง์ ์ ๋ ฅํ ์ ์๋ค.
ResponseEntity์ @ResponseBody
HTTP ๋ฉ์์ง๋ฅผ ์ง์ ์ ๋ ฅํ ์ ์๋ค๋ ๊ณตํต์ ์ ๊ฐ์ง๊ณ ์์ง๋ง, ๋ค์๊ณผ ๊ฐ์ ์ฐจ์ด์ ๋ค์ด ์กด์ฌํ๋ค.
- ResponseEntity๋ HTTP ์๋ต ์ฝ๋๋ฅผ ์ง์ ํ๋ ๊ฒ์ด ์์ฒด์ ์ผ๋ก ๊ฐ๋ฅํ์ง๋ง, @ResponseBody๋ ์๋ต ์ฝ๋๋ฅผ ์ง์ ํ ์ ์๋ ๋ณ๋์ ์์ฑ ๊ฐ์ ์์ฒด์ ์ผ๋ก ๊ฐ์ถ๊ณ ์์ง ์์ @ResponseStatus์ ๊ฐ์ ๋ถ๊ฐ์ ์ธ ์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํด์ผ ํ๋ค. ๊ทธ๋ ๋ค๊ณ ํด์ ๋์ ์ผ๋ก ์๋ต ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ์๋ ์๊ธฐ ๋๋ฌธ์ ํ์ํ๋ค๋ฉด ์กฐ๊ฑด์ ๋ฐ๋ผ ResponseEntity๋ฅผ ์ด์ฉํ๋๋ก ์ค๊ณํ๋ฉด ๋๋ค.
HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ
๋ทฐ ํ ํ๋ฆฟ์ผ๋ก HTML์ ์์ฑํด์ ์๋ตํ๋ ๊ฒ์ด ์๋, HTTP API์ฒ๋ผ JSON ๋ฐ์ดํฐ๋ฅผ HTTP ๋ฐ๋์์ ์ง์ ์ฝ๊ฑฐ๋ ์ฐ๋ ๊ฒฝ์ฐ HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ํธ๋ฆฌํ๊ฒ ์์ ์ ์ํํ ์ ์๋ค. ์คํ๋ง MVC๋ ๋ค์์ ๊ฒฝ์ฐ์ HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ๋ฅผ ์ ์ฉํ๋ค.
HTTP ์์ฒญ: @RequestBody, HttpEntity(RequestEntity)
HTTP ์๋ต: @ResponseBody, HttpEntity(ResponseEntity)
HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ ์ธํฐํ์ด์ค๋ ํน์ ํด๋์ค ๋๋ ๋ฏธ๋์ด ํ์
์ ์ง์ํ๋์ง ์ฒดํฌํ๋ canRead()
์ canWrite()
, ๋ฉ์์ง๋ฅผ ์ฝ๊ณ ์ฐ๋ read()
, write()
๋ฉ์๋๋ฅผ ์ ์ธํด ๋์๋ค. ์คํ๋ง ๋ถํธ๋ ๋ค์ํ ๋ฉ์์ง ์ปจ๋ฒํฐ๋ฅผ ์ ๊ณตํ๋๋ฐ, ํด๋์ค ํ์
๊ณผ ๋ฏธ๋์ด ํ์
์ง์ ์ฌ๋ถ ๋ ๊ฐ์ง๋ฅผ ์ฒดํฌํ์ฌ ์ฌ์ฉ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค.(๋ง์กฑํ์ง ์์ ๊ฒฝ์ฐ ๋ค์ ์ฐ์ ์์๋ก ์ด๋ํ์ฌ ๋ค์ ์ฒดํฌ)
1. HTTP ์์ฒญ ๋ฐ์ดํฐ ์ฝ๊ธฐ
HTTP ์์ฒญ์ด ์ค๊ณ , ์ปจํธ๋กค๋ฌ์์ @RequestBody ๋๋ HttpEntity๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋ฉ์์ง ์ปจ๋ฒํฐ๊ฐ ๋ฉ์์ง๋ฅผ ์ฝ์ ์ ์๋์ง ์กฐ๊ฑด์ ํ์ธํ๋ค.(ํด๋์ค ํ์ ์ง์ ์ฌ๋ถ, ์์ฒญ์ Content-Type ๋ฏธ๋์ด ํ์ ์ง์ ์ฌ๋ถ) ์กฐ๊ฑด์ ๋ง์กฑํ๋ค๋ฉด ๊ทธ์ ๋ง๋ ๊ฐ์ฒด๋ฅผ ์์ฑํด ๋ฐํํ๋ค.
2. HTTP ์๋ต ๋ฐ์ดํฐ ์์ฑ
์ปจํธ๋กค๋ฌ์์ @ResponseBody, HttpEntity๋ฅผ ํตํด ๊ฐ์ด ๋ฐํ๋๋ค๋ฉด ๋ฉ์์ง ์ปจ๋ฒํฐ๊ฐ ๋ฉ์์ง๋ฅผ ์ธ ์ ์๋์ง ํ์ธํ๋ค.(ํด๋์ค ํ์ ์ง์ ์ฌ๋ถ, ์์ฒญ์ Accept ๋ฏธ๋์ด ํ์ ์ง์ ์ฌ๋ถ) ์กฐ๊ฑด์ ๋ง์กฑํ๋ค๋ฉด HTTP ์๋ต ๋ฉ์์ง ๋ฐ๋์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ค.
์คํ๋ง ๋ถํธ๊ฐ ์ ๊ณตํ๋ ๋ฉ์์ง ์ปจ๋ฒํฐ ์ค ์ฃผ์ํ ์ปจ๋ฒํฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
1์์ - ByteArrayHttpMessageConverter
ํด๋์ค ํ์
์ด byte[]์ธ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ค. ๋ฏธ๋์ด ํ์
์ ์ ํ์ ์๊ณ , ์๋ต ์ content-Type
์ application/octet-stream
์ด๋ค.
2์์ - StringHttpMessageConverter
ํด๋์ค ํ์
์ด String์ธ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ค. ๋ฏธ๋์ด ํ์
์ ์ ํ์ ์๊ณ , ์๋ต ์ content-Type
์ text/plain
์ด๋ค.
3์์ - MappingJackson2HttpMessageConverter
ํด๋์ค ํ์
์ด ๊ฐ์ฒด์ด๊ฑฐ๋ HashMap์ด๋ฉด์ ๋ฏธ๋์ด ํ์
์ด application/json
๊ณผ ๊ด๋ จ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ค.
์์ฒญ ๋งคํ ํธ๋ค๋ฌ ์ด๋ํฐ(RequestMappingHandlerAdapter)
HandlerMethodArgumentResolver(ArgumentResolver)
์ ๋ ธํ ์ด์ ๊ธฐ๋ฐ์ ์ปจํธ๋กค๋ฌ๋ ํ๋ผ๋ฏธํฐ๋ก ๋ค์ด์ค๋ ํ์์ ์ ํ๋ฐ์ง ์์ผ๋ฉด์ ์ฒ๋ฆฌ ๊ฐ๋ฅํ ์ ์ฐ์ฑ์ ๊ฐ์ง๊ณ ์๋๋ฐ, ์ด๋ HandlerMethodArgumentResolver ์ธํฐํ์ด์ค ๋๋ถ์ด๋ค. ๋ค์ํ ํ์์ ์ฒ๋ฆฌํ ์ ์๋๋ก ์ฌ๋ฌ ๊ตฌํ์ฒด๋ค์ ๋ง๋ค์ด๋์๊ธฐ ๋๋ฌธ์, ๋ค์ด์ค๋ ํ์์ ๋ง์ถ์ด ์ ํฉํ ArgumentResolver๋ฅผ ํธ์ถํ์ฌ ์ฒ๋ฆฌํ ์ ์๋ค.
RequestMappingHandlerAdapter(์์ฒญ ๋งคํ ํธ๋ค๋ฌ ์ด๋ํฐ) ๋์ ๋ฐฉ์
ArgumentResolver์์ ์ปจํธ๋กค๋ฌ์ ํ๋ผ๋ฏธํฐ, ์ ๋ ธํ ์ด์ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ๋ฌ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ์ฌ ํธ๋ค๋ฌ๋ฅผ ํธ์ถํ๋ค. ํธ๋ค๋ฌ์์ ๋ฐํํ ๊ฐ์ HandlerMethodReturnValueHandler(ReturnValueHandler)์์ ๋ณํํ๋ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋๋ค.
HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ ์์น
HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ๋ @RequestMapping์ ์ฒ๋ฆฌํ๋ ํธ๋ค๋ฌ ์ด๋ํฐ์ธ RequestMappingHandlerAdapter์์ ๋์ํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก๋ ArgumentResolver๊ฐ ์์
์ ์ฒ๋ฆฌํ๋๋ฐ, @RequestBody / @ResponseBody / HttpEntity
์ ๊ฐ์ด HTTP ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ ํด๋น ArgumentResolver๊ฐ HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ๋ฅผ ํธ์ถํ์ฌ ๊ด๋ จ ์์
์ ์ฒ๋ฆฌํ๋๋ก ํ๋ ๊ฒ์ด๋ค.
'Language & Framework > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์คํ๋ง MVC] ๊ฒ์ฆ(1) - Validation (0) | 2023.02.12 |
---|---|
[์คํ๋ง MVC] ๋ฉ์์ง, ๊ตญ์ ํ (0) | 2023.02.11 |
[์คํ๋ง MVC] ์คํ๋ง MVC ๊ตฌ์กฐ ์ดํด (0) | 2023.02.03 |
[์คํ๋ง MVC] MVC ํ๋ ์์ํฌ ๋ง๋ค๊ธฐ (0) | 2023.01.28 |
[์คํ๋ง MVC] ์๋ธ๋ฆฟ/JSP/MVC ํจํด (0) | 2023.01.23 |