Spring/Spring MVC

[์Šคํ”„๋ง MVC] - 15. HTTP ์‘๋‹ต / HttpMessageConverter / ArgumentResolver

hello_u 2023. 2. 17. 15:59

 

 

์Šคํ”„๋ง(์„œ๋ฒ„)์—์„œ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

 

์ •์  ๋ฆฌ์†Œ์Šค


์˜ˆ
) ์›น ๋ธŒ๋ผ์šฐ์ €์— ์ •์ ์ธ HTML, css, js๋ฅผ ์ œ๊ณตํ•  ๋•Œ๋Š”, ์ •์  ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

๋ทฐ ํ…œํ”Œ๋ฆฟ ์‚ฌ์šฉ


์˜ˆ
) ์›น ๋ธŒ๋ผ์šฐ์ €์— ๋™์ ์ธ HTML์„ ์ œ๊ณตํ•  ๋•Œ๋Š” ๋ทฐ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

HTTP ๋ฉ”์‹œ์ง€ ์‚ฌ์šฉ


HTTP API๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” HTML์ด ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ,

 

HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— JSON ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์–ด ๋ณด๋‚ธ๋‹ค.

 

 

 

HTTP ์‘๋‹ต - ์ •์  ๋ฆฌ์†Œ์Šค, ๋ทฐ ํ…œํ”Œ๋ฆฟ

 

์ •์  ๋ฆฌ์†Œ์Šค

 

์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ํด๋ž˜์ŠคํŒจ์Šค์˜ ๋‹ค์Œ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ์ •์  ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

 

/static , /public , /resources , /META-INF/resources src/main/resources 

 

 

๋ทฐ ํ…œํ”Œ๋ฆฟ

 

๋ทฐ ํ…œํ”Œ๋ฆฟ์„ ๊ฑฐ์ณ์„œ HTML์ด ์ƒ์„ฑ๋˜๊ณ , ๋ทฐ๊ฐ€ ์‘๋‹ต์„ ๋งŒ๋“ค์–ด์„œ ์ „๋‹ฌํ•œ๋‹ค.

 

๋ทฐ ํ…œํ”Œ๋ฆฟ ๊ฒฝ๋กœ : src/main/resources/templates

 

 

 

<p th:text="${data}">empty</p>

 

๋ Œ๋”๋งํ• ๋•Œ ๋ชจ๋ธ์—์„œ data ๋ผ๋Š” ํ‚ค์˜ ๊ฐ’์„ ๊บผ๋‚ด์–ด  empty ์น˜ํ™˜

 

 

๋ทฐ ํ…œํ”Œ๋ฆฟ์„ ํ˜ธ์ถœ

 

 

ModelAndView

@RequestMapping("/response-view-v1")
public ModelAndView responseViewV1() {
    ModelAndView mav = new ModelAndView("response/hello");
    mav.addObject("data", "hello");
    return mav;
}

 

๋ทฐ ๋„ค์ž„์„ ์ƒ์„ฑ์ž๋กœ ์ „๋‹ฌ

 

์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ModelAndView ๋ฅผ ํ†ตํ•ด Model ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” addObject() ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

 

 

Model

@RequestMapping("/response-view-v2")
public String responseViewV2(Model model) {
    model.addAttribute("data","hello!");
    return "response/hello";
}

 

Model ์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์Œ 

 

model.addAttribute("key" , "value") : ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ view ์— ์ „๋‹ฌํ•  ๋ฐ์ดํ„ฐ๋ฅผ key,value ์Œ์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค 

 

 

 

HTTP ์‘๋‹ต - HTTP API, ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ์ง์ ‘ ์ž…๋ ฅ

 

@ResponseBody
@GetMapping("/response-body-string-v3")
public String responseBodyV3() {
    return "OK";
}

 

 

@ResponseStatus(HttpStatus.OK)
@ResponseBody
@GetMapping("/response-body-json-v2")
public HelloData responseBodyJsonV2() {
    HelloData helloData = new HelloData();
    helloData.setUsername("userA");
    helloData.setAge(20);

    return helloData;
}

 

 

 

 

HTTP ๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ

 

@ResponseBody ์‚ฌ์šฉ ์›๋ฆฌ

 

HTTP์˜ BODY์— ๋ฌธ์ž ๋‚ด์šฉ์„ ์ง์ ‘ ๋ฐ˜ํ™˜

 

viewResolver ๋Œ€์‹ ์— HttpMessageConverter ๊ฐ€ ๋™์ž‘

 

 

 

 

์Šคํ”„๋ง MVC๋Š” ๋‹ค์Œ์˜ ๊ฒฝ์šฐ์— HTTP ๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ๋ฅผ ์ ์šฉํ•œ๋‹ค.

 

  • HTTP ์š”์ฒญ: @RequestBody , HttpEntity(RequestEntity) 
  • HTTP ์‘๋‹ต: @ResponseBody , HttpEntity(ResponseEntity) 

 

 

๋Œ€์ƒ ํด๋ž˜์Šค ํƒ€์ž…๊ณผ ๋ฏธ๋””์–ด ํƒ€์ž… ๋‘˜์„ ์ฒดํฌํ•ด์„œ ์‚ฌ์šฉ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

 

๋งŒ์•ฝ ๋งŒ์กฑํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ ๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ๋กœ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋„˜์–ด๊ฐ„๋‹ค.

 

 

HTTP ์š”์ฒญ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ

 

๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด canRead() ๋ฅผ ํ˜ธ์ถœ

 

๋Œ€์ƒ ํด๋ž˜์Šค ํƒ€์ž…์„ ์ง€์›ํ•˜๋Š”๊ฐ€.

 

HTTP ์š”์ฒญ์˜ Content-Type ๋ฏธ๋””์–ด ํƒ€์ž…์„ ์ง€์›ํ•˜๋Š”๊ฐ€.

 

canRead() ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด read() ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ณ , ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

content/type ์€ ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— ์‘๋‹ตํ• ๋•Œ ๋ณด๋‚ด๋Š” ์ •๋ณด๋กœ,

 

"์ด ๋ฆฌ์†Œ์Šค๋Š” text/html ์ด์•ผ. html ๋กœ ํ•ด์„ํ•ด์ค˜" ๋ผ๊ณ  ์•Œ๋ฆฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 

HTTP ์‘๋‹ต ๋ฐ์ดํ„ฐ ์ƒ์„ฑ

 

๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด canWrite() ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

 

๋Œ€์ƒ ํด๋ž˜์Šค ํƒ€์ž…์„ ์ง€์›ํ•˜๋Š”๊ฐ€.

 

HTTP ์š”์ฒญ์˜ Accept ๋ฏธ๋””์–ด ํƒ€์ž…์„ ์ง€์›ํ•˜๋Š”๊ฐ€

 

canWrite() ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด write() ๋ฅผ ํ˜ธ์ถœํ•ด์„œ HTTP ์‘๋‹ต ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

 

 

Accpet๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญํ• ๋•Œ ๋ณด๋‚ด๋Š” ์ •๋ณด๋กœ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ฌด์—‡์ธ์ง€๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

"๋‚˜๋Š” text/html, text/xml ์„ ํ•ด์„ํ•  ์ˆ˜ ์žˆ์–ด!" ํ•˜๊ณ  ์„œ๋ฒ„์—๊ฒŒ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

 

 

 

 

์š”์ฒญ ๋งคํ•‘ ํ—จ๋“ค๋Ÿฌ ์–ด๋Žํ„ฐ ๊ตฌ์กฐ

 

SpringMVC ๊ตฌ์กฐ

 

 

HTTP ๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ๋Š” ์Šคํ”„๋ง MVC ์–ด๋””์ฏค์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ผ๊นŒ?

 

๋ชจ๋“  ๋น„๋ฐ€์€ ์• ๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์˜ ์ปจํŠธ๋กค๋Ÿฌ, ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ @RequestMapping ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ์ธ

 

RequestMappingHandlerAdapter (์š”์ฒญ ๋งคํ•‘ ํ—จ๋“ค๋Ÿฌ ์–ด๋Žํ„ฐ)์— ์žˆ๋‹ค.

 

 

 

 

RequestMapping ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๊ฐ€ Argument Resolver ํ•œํ…Œ 

 

์ปจํŠธ๋กค๋Ÿฌ(ํ•ธ๋“ค๋Ÿฌ)๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋‹ค์–‘ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’(๊ฐ์ฒด)์„ ๊ฐ€์ ธ๋‹ค์ค„ ์ˆ˜ ์žˆ๋ƒ๊ณ  ์š”์ฒญํ•œ๋‹ค 

 

Argument Resolver ๊ฐ€ ์ƒ์„ฑํ•ด์ค€๋‹ค 

 

๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ ํŒŒ๋ฆฌ๋ฏธํ„ฐ์˜ ๊ฐ’์ด ๋ชจ๋‘ ์ค€๋น„๋˜๋ฉด ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ๊ฐ’์„ ๋„˜๊ฒจ์ค€๋‹ค.

 

 

๋™์ž‘ ๋ฐฉ์‹

 

ArgumentResolver ์˜ supportsParameter() ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ํ•ด๋‹น ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง€์›ํ•˜๋Š”์ง€ ์ฒดํฌํ•˜๊ณ ,

 

์ง€์›ํ•˜๋ฉด resolveArgument() ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์‹ค์ œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ์‹œ ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ์ด๋‹ค.

 

 

 

ReturnValueHandler

 

ArgumentResolver ์™€ ๋น„์Šทํ•œ๋ฐ, ์ด๊ฒƒ์€ ์‘๋‹ต ๊ฐ’์„ ๋ณ€ํ™˜ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

 

 

 

HTTP ๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ ์œ„์น˜

 

์š”์ฒญ์˜ ๊ฒฝ์šฐ @RequestBody ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ArgumentResolver ๊ฐ€ ์žˆ๊ณ , HttpEntity ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ArgumentResolver ๊ฐ€ ์žˆ๋‹ค.

 

์ด ArgumentResolver ๋“ค์ด HTTP ๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

 

์‘๋‹ต์˜ ๊ฒฝ์šฐ @ResponseBody ์™€ HttpEntity ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ReturnValueHandler ๊ฐ€ ์žˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์—์„œ HTTP ๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์‘๋‹ต ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ ๋‹ค.

 

 

 

 

 

 

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

 

์Šคํ”„๋ง MVC 1ํŽธ - ๋ฐฑ์—”๋“œ ์›น ๊ฐœ๋ฐœ ํ•ต์‹ฌ ๊ธฐ์ˆ  - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ ํ•„์š”ํ•œ ๋ชจ๋“  ์›น ๊ธฐ์ˆ ์„ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์ดํ•ดํ•˜๊ณ , ์™„์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง MVC์˜ ํ•ต์‹ฌ ์›๋ฆฌ์™€ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ , ๋” ๊นŠ์ด์žˆ๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., -

www.inflearn.com