Spring MVC
MVC ๋์์ธ ํจํด
- MVC๋ Model-View-Controller์ ์ฝ์๋ก, ์ํํธ์จ์ด ๋์์ธ ํจํด ์ค ํ๋
- MVC ํจํด์ ์ํํธ์จ์ด๋ฅผ ๊ตฌ์ฑํ๋ ์์๋ค์ Model, View, Controller๋ก ๊ตฌ๋ถํ์ฌ ๊ฐ๊ฐ์ ์ญํ ์ ๋ถ๋ฆฌ
Model
- ๋ฐ์ดํฐ์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋น
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๋ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๋ถ๋ฌ์ค๋ ๋ฑ์ ์์ ์ ์ํ
View
- ์ฌ์ฉ์ ์ธํฐํ์ด์ค ๋ด๋น
Controller
- Model๊ณผ View ์ฌ์ด์ ์ํธ์์ฉ์ ์กฐ์ ํ๊ณ ์ ์ด
- ์ ๋ ฅ์ ๋ฐ์ Model์ ์ ๋ฌํ๊ณ , Model์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก View๋ฅผ ์ ๋ฐ์ดํธ
MVC ํจํด์ ์ํํธ์จ์ด๋ฅผ ๊ตฌ์ฑํ๋ ์์๋ค์ ๋ถ๋ฆฌํจ์ผ๋ก์จ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ด๊ณ , ๊ฐ๋ฐ์๋ค ๊ฐ์ ํ์ ์ ์ฉ์ดํ๊ฒ ํจ.
๋ฐ๋ผ์ ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ , MVC ํจํด์ ์ ์ฉํ์ฌ ๊ตฌ์กฐ๋ฅผ ์ ์ค๊ณํ๋ ๊ฒ์ด ์ค์ํจ
Spring MVC
Spring Web MVC๋ Servlet API๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋ ๋ ์ฐฝ์ ์ธ ์น ํ๋ ์์ํฌ๋ก, ์ฒ์๋ถํฐ Spring Framework์ ํฌํจ๋์ด ์์
์ค์์ ์๋ DispatcherServlet์ด ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ณต์ ์๊ณ ๋ฆฌ์ฆ์ ์ ๊ณตํ๋ Front Controller ํจํด์ ์ค์ฌ์ผ๋ก ์ค๊ณ๋์ด ์์ผ๋ฉฐ ์ด ๋ชจ๋ธ์ ์ ์ฐํ๊ณ ๋ค์ํ ์ํฌ ํ๋ก์ฐ๋ฅผ ์ง์ํจ
Servlet?
- ์๋ฐ๋ฅผ ์ฌ์ฉํ์ฌ ์น ํ์ด์ง๋ฅผ ๋์ ์ผ๋ก ์์ฑํ๋ ์๋ฒ ์ธก ํ๋ก๊ทธ๋จ ํน์ ๊ทธ ์ฌ์
- ์ฌ์ฉ์๊ฐ API ์์ฒญํ์ ๋ ์๋ฒ์ ์๋ธ๋ฆฟ์ด ๋์ํ๋ ๋ฐฉ์
- ์ฌ์ฉ์๊ฐ client๋ฅผ ํตํด ์๋ฒ์ HTTP Request ์ฆ, API ์์ฒญ
- ์์ฒญ์ ๋ฐ์ Servlet ์ปจํ
์ด๋๋ HttpServletRequest, HttpServletResponse ๊ฐ์ฒด๋ฅผ ์์ฑ
- HTTP ๊ท๊ฒฉ์ ๋ง์ถ๋ฉด์ ์ฝ๊ฒ HTTP์ ๋ด๊ธด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ๊ฐ์ฒด
- ์ค์ ๋ ์ ๋ณด๋ฅผ ํตํด ์ด๋ ํ Servlet์ ๋ํ ์์ฒญ์ธ์ง ํ์
- ํด๋น Servlet์์ service ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ค ๋ธ๋ผ์ฐ์ ์์ฒญ Method์ ๋ฐ๋ผ doGet ํน์ doPost๋ฑ์ ๋ฉ์๋๋ฅผ ํธ์ถ
- ํธ์ถํ ๋ฉ์๋์ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋๋ก ๋ฐํํ๊ฑฐ๋ ๋์ ํ์ด์ง๋ฅผ ์์ฑํ ๋ค HttpServletResponse ๊ฐ์ฒด์ ์๋ต์ ๋ด์ Client์ ๋ฐํ
- ์๋ต์ด ์๋ฃ๋๋ฉด ์์ฑํ HttpServletRequest, HttpServletResponse ๊ฐ์ฒด ์๋ฉธ
Front Controller?
- ๋ชจ๋ API ์์ฒญ์ ์์ ์ดํด๋ณธ ์๋ธ๋ฆฟ์ ๋์ ๋ฐฉ์์ ๋ง์ถฐ ์ฝ๋๋ฅผ ๊ตฌํํ๋ค๋ฉด ๋ฌด์ํ ๋ง์ Servlet ํด๋์ค๋ฅผ ๊ตฌํํด์ผ ํจ
- ๋ฐ๋ผ์ Spring์
DispatcherServlet
์ ์ฌ์ฉํ์ฌ Front Controller ํจํด ๋ฐฉ์์ผ๋ก API ์์ฒญ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌ - Front Controller ํจํด ๋์ ๊ณผ์
- Client์์ HTTP ์์ฒญ์ด ๋ค์ด์ค๋ฉด
DispatcherServlet
๊ฐ์ฒด๊ฐ ์์ฒญ์ ๋ถ์ DispatcherServlet
๊ฐ์ฒด๋ ๋ถ์ํ ๋ฐ์ดํฐ๋ฅผ ํ ๋๋กHandler mapping
์ ํตํดController
๋ฅผ ์ฐพ์ ์์ฒญ ์ ๋ฌ- API path ์ฆ, URL์ Controller์ ์์ฑํ๋ ๋ฐฉ๋ฒ์
@Controller
์ ๋ ธํ ์ด์ ์ด ๋ฌ๋ ค์๋ ํด๋์ค๋ฅผ ์์ฑํ ๋ค@GetMapping
์ฒ๋ผ ์์ฒญํ HTTP Method์ ์ผ์นํ๋ ์ ๋ ธํ ์ด์ ์ ์ถ๊ฐํ ๋ฉ์๋๋ฅผ ๊ตฌํ- ์ง์ Servlet์ ๊ตฌํํ์ง ์์๋
DispatcherServlet
์ ์ํด ๊ฐํธํ๊ฒ HTTP ์์ฒญ ์ฒ๋ฆฌ ๊ฐ๋ฅ
- ์ง์ Servlet์ ๊ตฌํํ์ง ์์๋
- API path ์ฆ, URL์ Controller์ ์์ฑํ๋ ๋ฐฉ๋ฒ์
- Controller -> DispathcerServlet
- ํด๋น Controller๋ ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ์๋ฃํ ํ ์ฒ๋ฆฌ์ ๋ํ ๊ฒฐ๊ณผ ์ฆ, ๋ฐ์ดํฐ(
Model
)์View
์ ๋ณด๋ฅผ ์ ๋ฌ
- ํด๋น Controller๋ ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ์๋ฃํ ํ ์ฒ๋ฆฌ์ ๋ํ ๊ฒฐ๊ณผ ์ฆ, ๋ฐ์ดํฐ(
- DispatcherServlet -> Client
ViewResolver
๋ฅผ ํตํด View์ Model์ ์ ์ฉํ์ฌ View๋ฅผ Client์๊ฒ ์๋ต์ ์ ๋ฌํจ
- Client์์ HTTP ์์ฒญ์ด ๋ค์ด์ค๋ฉด
์ ์ ํ์ด์ง์ ๋์ ํ์ด์ง
@Controller vs @RestController
- @Controller : ์ ํต์ ์ธ Spring MVC์ ์ปจํธ๋กค๋ฌ
- @RestController : RESTful ์น ์๋น์ค์ ์ปจํธ๋กค๋ฌ
- ์ฃผ์ํ ์ฐจ์ด์ ์ HTTP Response Body๊ฐ ์์ฑ๋๋ ๋ฐฉ์
@RestController
- @Controller์ @ResponseBody๊ฐ ์ถ๊ฐ๋ ๊ฒ
- ์ฃผ์ฉ๋๋
Json ํํ๋ก ๊ฐ์ฒด ๋ฐ์ดํฐ๋ฅผ ๋ฐํ
ํ๋ ๊ฒ
Jackson?
Jackson ๋ผ์ด๋ธ๋ฌ๋ฆฌ
JSON
๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฒ๋ฆฌํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ- Object๋ฅผ
JSON
ํ์ ์ String์ผ๋ก ๋ฐํ ๊ฐ๋ฅ
- Object๋ฅผ
- Spring 3 ์ดํ๋ก
Jackson
๊ณผ ๊ด๋ จ๋ API๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ, ์ง์ ์์ค ์ฝ๋๋ฅผ ์์ฑํ์ฌJSON
๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ์ง ์์๋ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ฃผ๊ณ ์์
Object To JSON
@Test
@DisplayName("Object To JSON : get Method ํ์")
void test1() throws JsonProcessingException {
Star star = new Star("Robbie", 95);
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(star);
System.out.println("json = " + json);
JSON To Object
@Test
@DisplayName("JSON To Object : ๊ธฐ๋ณธ ์์ฑ์ & (get or set) Method ํ์")
void test2() throws JsonProcessingException {
String json = "{\"name\":\"Robbie\",\"age\":95}";
ObjectMapper objectMapper = new ObjectMapper();
Star star = objectMapper.readValue(json, Star.class);
System.out.println("star.getName() = " + star.getName());
Path Variable๊ณผ Request Param
Path Variable
- Client์์ ์๋ฒ๋ก HTTP ์์ฒญ์ ๋ณด๋ผ ๋ ๋ฐ์ดํฐ๋ฅผ ํจ๊ป ๋ณด๋ผ ์ ์์
- ์๋ฒ์์๋ ์ด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ์ฌ์ฉํด์ผ ํ๋๋ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ ๋ฐฉ์์ด ํ ๊ฐ์ง๊ฐ ์๋๋ผ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๋ฐฉ์์ ๋ํ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ํ์ตํด์ผ ํจ
- Path Variable ๋ฐฉ์
- ์๋ฒ์ ๋ณด๋ด๋ ค๋ ๋ฐ์ดํฐ๋ฅผ URL ๊ฒฝ๋ก์ ์ถ๊ฐ ๊ฐ๋ฅ
- 'Robbie'์ '95' ๋ฐ์ดํฐ๋ฅผ ์๋ฒ์ ๋ณด๋ด๊ธฐ ์ํด URL ๊ฒฝ๋ก์ ์ถ๊ฐ
// [Request sample] // GET http://localhost:8080/hello/request/star/Robbie/age/95 @GetMapping("/star/{name}/age/{age}") @ResponseBody public String helloRequestPath(@PathVariable String name, @PathVariable int age) { return String.format("Hello, @PathVariable.<br> name = %s, age = %d", name, age); }
Request Param
GET http://localhost:8080/hello/request/form/param?name=Robbie&age=95
์๋ฒ์ ๋ณด๋ด๋ ค๋ ๋ฐ์ดํฐ๋ฅผ URL ๊ฒฝ๋ก ๋ง์ง๋ง์
?
๊ณผ&
์ ์ฌ์ฉํ์ฌ ์ถ๊ฐ ๊ฐ๋ฅ// [Request sample] // GET http://localhost:8080/hello/request/form/param?name=Robbie&age=95 @GetMapping("/form/param") @ResponseBody public String helloGetRequestParam(@RequestParam String name, @RequestParam int age) { return String.format("Hello, @RequestParam.<br> name = %s, age = %d", name, age); }