[Spring] @Controller์ @RestController์ ์ฐจ์ด
๐ ๊ฐ์
Spring์๋ Controller๋ฅผ ์ง์ ํด ์ฃผ๊ธฐ ์ํด ๋ ๊ฐ์ง Annotaion์ด ์ค๋น ๋์ด ์๋ ๊ฒ์ด์์.
์ฒซ๋ฒ์งธ๋ `@Controller`๊ฐ ์๊ณ , ๋๋ฒ์งธ๋ `@RestController`๊ฐ ์๋ ๊ฒ์ด์์.
๋ ์น๊ตฌ์ ์ฃผ์ ์ฐจ์ด์ ์ `HTTP Response Body`๊ฐ ์์ฑ๋๋ ๋ฐฉ์์ ์๋ต๋๋ค.
๐ @Controller - Spring MVC Controller
๐ฝ Controller - View
์ ํต์ ์ธ Spring MVC Controoler์ธ `@Controller`๋ ์ฃผ๋ก View ๋ณํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ฒ์ด์์. ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ๊ณผ์ ์ ํตํด Spring MVC Controller๋ Client์ ์์ฒญ์์ View๋ฅผ ๋ฐํํ๋ ๊ฒ์ด์์.
โ Client(Front End)๋ URI ํ์์ผ๋ก Server (Back End)์ Request(์์ฒญ)์ ๋ ๋ฆฐ๋ค.
โ Mapping ๋๋ Handler์ ํด๋น Type์ ์ฐพ๋ `DispatcherServlet`์ด ํด๋น ์์ฒญ์ ๊ฐ๋ก์ฑ๋ค(Intercept).
โ Controller๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ ๋ค Response(์๋ต)์ `DispatcherServlet`์๊ฒ ๋ฐํํ๊ณ , `DispatcherServlet`์ View๋ฅผ ์ด์ฉ์์๊ฒ ๋ฐํํ๋ค.
`@Controller`๊ฐ `View`๋ฅผ ๋ฐํํ๊ธฐ ์ํด์ `ViewResolver`๊ฐ ์ด์ฉ๋๊ณ , `ViewResolver`์ค์ ์ ๋ง๊ฒ `View`๋ฅผ ์ฐพ์ Renderingํ๊ฒ ๋๋ ๊ฒ์ด์์.
๐ฝ Controller - Data
Spring MVC์ Controller์์๋ `Data ๋ฐํ`ํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด์์.
Spring MVC์ Controller์์๋ Data๋ฅผ ๋ฐํํ๊ธฐ ์ํด @ResponseBody Annotaion์ ์ด์ฉํด์ฃผ์ด์ผ ํ๋ ๊ฒ์ด์์. Controller์์๋ JSON ํํ๋ก Data๋ฅผ ์ ๋ฌ ํด ์ค ์ ์๊ฒ ๋๋ ๊ฒ์ด๋๋๋ค.
โ Client(Front End)๋ URI ํ์์ผ๋ก Server (Back End)์ ์์ฒญ์ ๋ณด๋ธ๋ค.
โ Mapping๋๋ Handler์ ํด๋น Type์ ์ฐพ๋ `DispatcherServlet`์ด ํด๋น ์์ฒญ์ ๊ฐ๋ก์ฑ๋ค(Intercept).
โ `@ResponseBody`๋ฅผ ์ด์ฉํ์ฌ Client์๊ฒ JSON ํํ๋ก Data๋ฅผ ์ ๋ฌํด ์ค๋ค.
`@RestController`๊ฐ Data๋ฅผ ๋ฐํํ๊ธฐ ์ํด์๋ `viewResolver` ๋์ `HttpMessageConverter`๊ฐ ๋์ํ๋ ๊ฒ์ด์์. HttpMessageConverter์๋ ์ฌ๋ฌ Converter(๋ณํ๊ธฐ)๊ฐ ๋ฑ๋ก๋์ด ์๋๋ฐ, ๋ฐํํด์ผ ํ๋ Data์ ๋ฐ๋ผ ์ฌ์ฉ๋๋ Converter๊ฐ ๋ฌ๋ผ์ง๋ ๊ฒ์ด์์. ๋ง์ฝ ๋จ์ ๋ฌธ์์ด์ด๋ผ๋ฉด `StringHttpMessageConverter`๊ฐ ๋์ํ๊ฒ ๋๊ณ , ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ์๋ `MappingJackson2HttpMessageConverter`๊ฐ ๋์ํ๋ฉฐ, Data ์ข ๋ฅ์ ๋ฐ๋ผ ์๋ก ๋ค๋ฅธ MessageConverter๊ฐ ๋์ํ๊ฒ ๋๋ ๊ฒ์ด์์.
Spring์ Client์ `HTTP Accept Header`์ Server Controller ๋ฐํ Type ์ ๋ณด ๋ ๊ฐ์ง๋ฅผ ์กฐํฉํ์ฌ ์ ํฉํ HttpMessageConverter๋ฅผ ์ ํํ์ฌ ์ด๋ฅผ ์ฒ๋ฆฌํ๊ฒ ๋๋ ๊ฒ์ด์์.
์์ ์ฝ๋
์์ ๊ฐ์ ์์ ์์ info๋ผ๋ Data๋ฅผ ๋ฐํํ๊ณ ์ ํ๊ณ ์๊ณ , User๋ฅผ JSON์ผ๋ก ๋ณํํ๊ธฐ ์ํด @ResponseBody๋ผ๋ Annotation์ ๋ถ์ฌ์ฃผ๊ณ ์๋ ๊ฒ์ด์์. infoView Method์์๋ View๋ฅผ ์ ๋จํด์ฃผ๊ณ ์๊ธฐ ๋๋ฌธ์ String์ ๋ฐํ๊ฐ์ผ๋ก ์ค์ ํด ์ค ๊ฒ์ด๋๋๋ค. (Data๋ฅผ ๋ฐํํ๋ RestController์ View๋ฅผ ๋ฐํํ๋ Controller๋ฅผ ๋ถ๋ฆฌํด์ ์ด์ฉํ๋ ๊ฒ์ด ์ข๋ค.)
๐ @Controller - Spring RestFul Controller
`@RestController`๋ Spring MVC Controller์ `@ResponseBody`๊ฐ ์ถ๊ฐ๋ ๊ฒ์ด๋๋๋ค. ๋น์ฐํ RestController์ ์ฃผ ์ฉ๋๋ `JSON ํํ์ ๊ฐ์ฒด๋ก Data ๋ฐํ ๋ฐ ์ ๋ฌ`ํ๋ ๊ฒ์ด์์.
์ต๊ทผ Data๋ฅผ ์๋ต์ผ๋ก ์ ๊ณตํ๋ RestFul API๋ฅผ ๊ฐ๋ฐํ ๋ ์ฃผ๋ก ์ด์ฉํ๋ ๊ฒ์ด๋๋๋ค.
โ Client(Front End)๋ URI ํ์์ผ๋ก Server (Back End)์ ์์ฒญ์ ๋ณด๋ธ๋ค.
โ Mapping๋๋ Handler์ ํด๋น Type์ ์ฐพ๋ `DispatcherServlet`์ด ํด๋น ์์ฒญ์ ๊ฐ๋ก์ฑ๋ค(Intercept).
โ `RestController`๋ ํด๋น ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , Data๋ฅผ ๋ฐํํ๋ค.
์์ ์ฝ๋
info1์ Method๋ User Data๋ฅผ ๊ทธ๋๋ก ๋ฐํํ๊ณ ์๋ ๊ฒ์ด์์. ํ์ง๋ง, ์ด๋ ๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ ๋ณด๋ค๋ info2์ ๊ฐ์ด ๊ฒฐ๊ณผ Data์ HTTP Status Code๋ฅผ ํจ๊ป ์ ์ด ํ์ฌ ๋ฐํํ๋ ๊ฒ์ด ์ข์ ๊ฒ์ด์์. ๋ํ, ๋ง์ฝ userService์์ ๋ฐํํ๋ ํํ๊ฐ `Optional`์ด๋ผ๋ฉด info3์ฒ๋ผ ๊น๋ํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ ๊ฒ์ด์์.