-
[SpringBoot] ์ ์ ์ปจํ ์ธ ์ ๋์ ์ปจํ ์ธ (feat: MVC, ํ ํ๋ฆฟ ์์ง)๐ปProgramming/SpringBoot 2024. 3. 10. 18:09
์ ์ ์ปจํ ์ธ ๋?
ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ๊ณ , ์๋ฒ์ ๋ฏธ๋ฆฌ ์ ์ฅ๋ HTML, css, js๋ฑ์ ํ์ผ์ ๊ทธ๋๋ก ์๋ตํด ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ์๋ฏธ.
๋ชจ๋ ํด๋ผ์ด์ธํธ๋ค์ ์์ฒญ์ ๋ํด "๋์ผํ ๊ฒฐ๊ณผ"๋ฅผ ๋ณด์ฌ์ค๋ค.
๋์ ์ปจํ ์ธ ๋?
์ด๋ค ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ , ์ด๋์, ์ด๋ป๊ฒ ์๋ฒ์ ์์ฒญํ๋์ง์ ๋ฐ๋ผ ๊ฐ๊ธฐ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค๋ค.
MVC์ ํ ํ๋ฆฟ ์์ง์ ์ฌ์ฉํ๋ ๋ฐฉ์๊ณผ API๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ๋๋๋ค.
์ ์ ์ปจํ ์ธ ๋ฅผ ์ด์ฉํ ์น ๊ฐ๋ฐ
์คํ๋ง๋ถํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ ์ปจํ ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฏ๋ก '/main/resources/static/'์ ํ์์ ์ ์ ํ์ผ์ ์์ฑํ ์ ์๋ค.
<!DOCTYPE HTML> <html> <head> <title>static content</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> </head> <body> ์ ์ ์ปจํ ์ธ ์ ๋๋ค. </body> </html>
์ด ํ์ผ์ ์ด๋ฆ์ hello-static.html์ด๋ผ๊ณ ์ง์ ํ์๋ค๊ณ ๊ฐ์ ํ ๊ฒฝ์ฐ, "localhost:8080/hello-static.html" ์๋ํฌ์ธํธ๋ก ์ ๊ทผํ๋ฉด
์์ ๊ฐ์ ํ๋ฉด์ ๋ณผ ์ ์๋ค.
๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ์ฐ์ ์ปจํธ๋กค๋ฌ์์ ์ผ์นํ๋ ์๋ํฌ์ธํธ๋ฅผ ์ฐพ๊ณ , ์์ ๊ฒฝ์ฐ 2์ฐจ์ ์ผ๋ก ์์(resources)๊ฒฝ๋ก๋ฅผ ํ์ํ๋ ๊ณผ์ ์ผ๋ก ์ด๋ ๊ฒ ์ฐ๋ฆฌ๊ฐ ์ด ํ๋ฉด์ ๋ณผ ์ ์๋ ๊ฒ์ด๋ค. ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ์ด๋ป๊ฒ ์ ์ ์์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์ง์ ๋ํด์ , ๋ด๊ฐ ์ด์ ์ ์์ฑํด๋์ https://suucong.tistory.com/24์ด ํฌ์คํ ์์ ๋ ์์ธํ ํ์ธ ๊ฐ๋ฅํ๋ค.
MVC ํจํด์ด๋?
Model, View, Controller๋ฅผ ์๋ฏธํ๋ ๊ฐ๋ ์ผ๋ก "์ญํ ์ ๋๋์ด" ์ผ๋ จ์ ์์ ์ ์ฒ๋ฆฌํ๋ ํจํด์ด๋ค. ๊ณผ๊ฑฐ์๋ ๋ทฐ์์ ๋ชจ๋ ๊ฒ์ ์ฒ๋ฆฌํ์์ง๋ง(ex. jsp), ํ์ฌ์๋ ๊ฐ์์ ์ญํ ์ ์ง์คํ ์ ์๋๋ก "์ญํ ์ ๋ถ๋ฆฌ"ํ ํจํด์ด๋ค.
MVC ํจํด์ ์ ์ฒด์ ์ธ ํ๋ก์ฐ
1. ์ฌ์ฉ์์ Request(์์ฒญ)์ Controller๊ฐ ๋ฐ๋๋ค.
2. Controller๋ Service์์ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ ํ, ๊ฒฐ๊ณผ๋ฅผ Model์ ๋ด๋๋ค.
3. Model์ ์ ์ฅ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก ํ๋ฉด์ ๋ด๋นํ๋ View๋ฅผ ์ ์ดํ์ฌ ์ฌ์ฉ์์๊ฒ ์ ๋ฌํ๋ค.
ํ ํ๋ฆฟ ์์ง์ ํตํด MVC ํจํด์ ์ฌ์ฉํ๋ ์์
'/main/resources/static/hello-template.html'
<html xmlns:th="http://www.thymeleaf.org"> <body> <p th:text="'hello ' + ${name}">hello! empty</p> </body> </html>
'HelloController.java'
@GetMapping("/hello-mvc") public String helloMVC(@RequestParam(value = "name", required = false) String name, Model model) { model.addAttribute("name", name); return "hello-template"; }
์ปจํธ๋กค๋ฌ์์ ๊ฒฐ๊ณผ๋ฅผ Model์ ๋ด๊ณ , Model์ ์ ์ฅ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก View๊ฐ ์ ์ด๋์ด ์ฌ์ฉ์์๊ฒ ์ ๋ฌ๋๋ ํ์์ด๋ค.
"http://localhost:8080/hello-mvc?name=์์ง์ด์์ฅ><"
๊ณผ ๊ฐ์ด ์ ๊ทผํ์์ ๊ฒฝ์ฐ
์ ๊ฐ์ ํ๋ฉด์ ๋ณผ ์ ์๋ค.
API๋ฅผ ์ด์ฉํ ์น ๊ฐ๋ฐ
์๋ฒ์ ์์ฒญ์ด ๋ค์ด์ฌ ๋ HTTP์ BODY์ ๋ฌธ์ ๋ด์ฉ์ ์ง์ ๋ฐํํ๋ค. viewResolver๋์ ์ 'HttpMessageConverter'๊ฐ ๋์ํ๋ค.
๊ธฐ๋ณธ ๋ฌธ์ ์ฒ๋ฆฌ: StringHttpMessageConverter
๊ธฐ๋ณธ ๊ฐ์ฒด ์ฒ๋ฆฌ: MappingJackson2HttpMessageConverter
Jackson2๋ ์คํ๋ง๋ถํธ์์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ ๊ฒฝ์ฐ, ์ด๊ฑธ ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉํ ์ ์๋ jsonํ์์ผ๋ก ๋ณํํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ๊ตฌ๊ธ์์ ์ ๊ณตํ๋ gson๋ ์์ง๋ง, ์คํ๋ง๋ถํธ์์๋ Jackson์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๊ณ ์๋ค.
* "ํด๋ผ์ด์ธํธ์ HTTP Accept ํค๋"์ "์๋ฒ์ ์ปจํธ๋กค๋ฌ ๋ฐํ ํ์ ์ ๋ณด"๋ฅผ ์กฐํฉํ์ฌ "HttpMessageConverter"๊ฐ ์ ํ.
๋ฌธ์ ๋ฐํ
@GetMapping("/hello-string") @ResponseBody public String helloString(@RequestParam("name") String name) { // ๋ฌธ์ ๋ฐํ return "hello " + name; }
- @ResponseBody๋ฅผ ์ฌ์ฉํ๋ฉด viewResolver๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค.
- ๋์ ์ http์ body์ ๋ฌธ์ ๋ด์ฉ์ ์ง์ ๋ฐํ
๊ฒฐ๊ณผ
๊ฐ์ฒด ๋ฐํ(Json)
@GetMapping("/hello-api") @ResponseBody public Hello helloApi(@RequestParam("name") String name) { // ๊ฐ์ฒด ๋ฐํ Hello hello = new Hello(); hello.setName(name); return hello; } static class Hello { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
@ResponseBody๋ฅผ ์ฌ์ฉํ๊ณ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ฉด ๊ฐ์ฒด๊ฐ Json ํ์ ์ผ๋ก ๋ฐํ๋๋ค.
๊ฒฐ๊ณผ
References
์ธํ๋ฐ - ๊น์ํ์ ์คํ๋ง ๊ฐ์
'๐ปProgramming > SpringBoot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ