-
[Spring] ๊น์ํ ์คํ๋ง ์ ๋ฌธ <์น์ 2.์คํ๋ง ์น ๊ฐ๋ฐ ๊ธฐ์ด> ์ ๋ฆฌ
2023. 10. 1.
์น์ 2. ์คํ๋ง ์น ๊ฐ๋ฐ ๊ธฐ์ด
์น ๊ฐ๋ฐ → ํฌ๊ฒ ์ธ๊ฐ์ง ๋ฐฉ์
์ ์ ์ปจํ ์ธ
- ์๋ฒ์์ ํ์ผ์ ๊ณ ๊ฐ(์น ๋ธ๋ผ์ฐ์ )์ ๊ทธ๋ฅ ์ ๋ฌํด์ฃผ๋๊ฒ (์๋ฒ์ ๋์x)
- ์คํ๋ง ๋ถํธ๊ฐ ์๋์ผ๋ก ์ ๊ณตํ๋ ๊ธฐ๋ฅ
- /resources/static์์ html ํ์ผ์ ์ฐพ์์ ๋์ ธ์ค
- ์น ๋ธ๋ผ์ฐ์ ์์ hello-static.html ์์ฒญ → ํฐ์บฃ ์๋ฒ๊ฐ ์คํ๋งํํ ๋๊น → ์คํ๋ง์ด ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐ์ ์์๋ก html์ ์ฐพ์ → ๊ด๋ จ ๋งคํ๋ ์ปจํธ๋กค๋ฌ x → resources /static ํด๋์ html์ ์ฐพ์์ ๋ฐํ
MVC์ ํ ํ๋ฆฟ ์์ง
- MVC๋?
- MVC: Model, View, Controller
- ์๋ฒ์์ html์ ๋ณํํด์ ๋์ ์ผ๋ก ๋ ๋๋ง์ด ๋ html์ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํ๋ ๊ฒ (jsp, php๊ฐ์ ํ ํ๋ฆฟ ์์ง) ↔ ์ ์ ์ปจํ ์ธ (ํ์ผ์ ๊ทธ๋๋ก ์ ๋ฌ)
- ์์ฆ ๋ค์ ์ฐ๋ ๋ฐฉ์
- ์ด์ ์๋ Controller - View ๊ฐ ๋ถ๋ฆฌ x (๋ชจ๋ธ1๋ฐฉ์) ⇒ view๋ ํ๋ฉด์ ๊ทธ๋ฆฌ๋๋ฐ ์ง์ค, ์ปจํธ๋กค๋ฌ๋ ๋น์ง๋์ค ๋ก์ง ๋ชจ๋ธ ํน์ ๋ด๋ถ์ ์ฒ๋ฆฌ์ ์ง์ค, ๋ชจ๋ธ์ view์ ํ์ํ ๊ฒ๋ค์ ๋ด์ view์ ๋๊ฒจ์ฃผ๋ mvc ๋ชจ๋ธ
- ์์ฆ์๋ ๋ถ๋ฆฌ๋๋ ๋ฐฉ์์ด ๊ธฐ๋ณธ์ . view๋ ์๋จ, controller๋ ์๋ฒ ๋ท๋จ์ ์ผ์ ์ฒ๋ฆฌ, ๋ชจ๋ธ์ ํ๋ฉด์ ํ์ํ ๊ฒ๋ค์ ๋๊ฒจ์ค
- ํ์๋ฆฌํ๋ ํ์ผ์ copy -> absolute pathํด์ url์ฐฝ์ ์คํํ๋ฉด html ํ์ผ์ ์๋ฒ ์์ด ๋ฐ๋ก ์ด์ด๋ณผ ์ ์์
Controller
@Controller public class HelloController { @GetMapping("hello-mvc") public String helloMvc(@RequestParam("name") String name, Model model) { model.addAttribute("name", name); return "hello-template"; } }
View
hello! empty
<html xmlns:th="http://www.thymeleaf.org"> <body> <p th:text="'hello ' + ${name}">hello! empty</p> //hello+ name์ ๊ฐ์ผ๋ก ๋ด์ฉ์ด ์นํ์ด ๋จ. hello! empty๋ ๋งํฌ์ ํ๋ ๋๋. </body> </html>
์คํ
- ?name= ์ httm Get ๋ฐฉ์์์ name ํ๋ผ๋ฏธํฐ๋ฅผ ๋๊ฒจ์ค ์ ์์ hello + ${name}์์ name์ ๊ฐ์ spring์ ๋๊ฒจ์ค
- ๋ทฐ์์ name=spring์ผ๋ก ๋๊ฒจ์ค → ์ปจํธ๋กค๋ฌ์์ name์ด spring์ผ๋ก ๋ฐ๋๊ณ model์ ๋ด๊น → $ ์ด ํ์๊ฐ ๋ชจ๋ธ์์ ๊ฐ์ ๊บผ๋ด๋ ๊ฒ ๋ชจ๋ธ์ ํค๊ฐ์ด name์ธ ๊ฒ์์ value๋ฅผ ๊บผ๋ด์ ์นํํด์ค → viewResolver ๋ทฐ๋ฅผ ์ฐพ์์ฃผ๊ณ ํ ํ๋ฆฟ์ ์ฐ๊ฒฐํด์ฃผ๋ ํด๊ฒฐ์๊ฐ ํ ํ๋ฆฟ์ hello-template์ ์ฐพ์์ ํ ํ๋ฆฟ์์ง์ ๋๊ฒจ์ค → ํ์๋ฆฌํ ํ ํ๋ฆฟ ์์ง์ด ๋ ๋๋ง์ ํด์ ๋ณํ์ ํ html์ ์น ๋ธ๋ผ์ฐ์ ์ ๋ฐํ (์ ์ ์ปจํ ์ธ ์์ ์ฐจ์ด์ )
API
- ๋ฆฌ์กํธ์ ์ฌ์ฉ, ์๋ฒ๋ผ๋ฆฌ์ ํต์ ๋ฑ ๋ฐ์ดํฐ๊ฐ ํ๋ฅผ ๋
- ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๊ฒ. HttpMessageConverter๋ฅผ ํตํด JSONํฌ๋งท์ผ๋ก ๋ฐํ. view ์์ด HTTP response์ ๊ฐ์ ๋ฃ์ด ๋ฐํํ๋ ๊ฒ
- ์๋๋ก์ด๋, ์์ดํฐ ํด๋ผ์ด์ธํธ์ ๊ฐ๋ฐ์ ํด์ผํ ๋) JSON ๋ฐ์ดํฐ ํฌ๋งท์ ์ฌ์ฉ. JSON ํฌ๋งท์ผ๋ก ์ ๋ฌํด์ฃผ๋ ๋ฐฉ์
@ResponseBody ๋ฌธ์ ๋ฐํ
@Controller public class HelloController { @GetMapping("hello-string") @ResponseBody //http์ body๋ถ์ return ๋ฐ์ดํฐ๋ฅผ ์ง์ ๋ฃ๊ฒ ๋ค๋ ์ด์ผ๊ธฐ. spring์ผ๋ก name์ ๋ฃ์ผ๋ฉด public String helloString(@RequestParam("name") String name){ return "hello"+name; //hello spring์ผ๋ก ๋ฐ๋. ํ ํ๋ฆฟ์์ง๊ณผ ๋ค๋ฅด๊ฒ view๊ฐ ์๊ณ ๋ฌธ์๊ฐ ํด๋ผ์ด์ธํธ์ ๊ทธ๋๋ก ๋ด๋ ค๊ฐ. } //view ์์ด ๋ฌธ์๋ฅผ ๊ทธ๋๋ก ๋ด๋ ค์ฃผ๋ ๋ฐฉ์ (๊ฑฐ์ ์ธ ์ผ ์์) }
- view ์์ด ๋ฌธ์๋ฅผ ๊ทธ๋๋ก ๋ด๋ ค์ฃผ๋ ๋ฐฉ์ (๊ฑฐ์ ์ธ ์ผ ์์)
- ๋ทฐ ๋ฆฌ์กธ๋ฒ( viewResolver )๋ฅผ ์ฌ์ฉํ์ง ์์
- ๋์ ์ HTTP์ BODY์ ๋ฌธ์ ๋ด์ฉ์ ์ง์ ๋ฐํ(HTML BODY TAG๋ฅผ ๋งํ๋ ๊ฒ์ด ์๋)
@ResponseBody ๊ฐ์ฒด ๋ฐํ
@Controller public class HelloController { @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; //key๊ฐ name public String getName() { //๊บผ๋ผ๋ return name; } public void setName(String name) { //๋ฃ์๋ this.name = name; } }
- @ResponseBody ๋ฅผ ์ฌ์ฉํ๊ณ , ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ฉด ๊ฐ์ฒด๊ฐ JSON์ผ๋ก ๋ณํ๋จ
- HTTP์ BODY์ ๋ฌธ์ ๋ด์ฉ์ ์ง์ ๋ฐํ
- ์น ๋ธ๋ผ์ฐ์ ์์ hello-api ์์ฒญ → ํฐ์บฃ ์๋ฒ๊ฐ ์คํ๋ง์ ๋๊น → helloController์ hello-api๊ฐ ์์ง๋ง ResponseBody ์ด๋ ธํ ์ด์ ํ์ธ → ์ด๋ ธํ ์ด์ ์ด ์์ผ๋ฉด viewresolver๊ฐ html์ ๋์ ธ์ฃผ๋๋ฐ,
- ResoponseBody๋ฅผ ์ฌ์ฉํ๊ณ ๋ฌธ์๊ฐ ์๋ ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ HttpMessageConverter ์ค JsonConverter๊ฐ ๋์ → ๋ํดํธ๋ก JSON ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์ด์ HTTP์ ์๋ต์ ์์ฒญํ ์ฃผ์ฒด๋ก ๋ฐํ
- HTTP Accept Header์์ ์์ฒญ์ ํ ๋ ์ด๋ฐ ํฌ๋งท์ผ๋ก ๋ฐ๊ณ ์ถ๋ค~ ์ฌ๊ธฐ์ ํฌ๋งท์ ์ง์ ํ๋ฉด ์ง์ ๋ ๊ฑธ๋ก ๋ณด๋ด๊ณ (์ด์ ํด๋นํ๋ ๋ฉ์ธ์ง ์ปจ๋ฒํฐ๊ฐ ๋์), ํฌ๋งท์ ์ง์ ํ์ง ์์ผ๋ฉด ์คํ๋ง์ด ์์์ ๋ณด๋
- viewResolver ๋์ ์ HttpMessageConverter ๊ฐ ๋์
- ๊ธฐ๋ณธ ๋ฌธ์์ฒ๋ฆฌ: StringHttpMessageConverter
- ๊ธฐ๋ณธ ๊ฐ์ฒด์ฒ๋ฆฌ: MappingJackson2HttpMessageConverter
- byte ์ฒ๋ฆฌ ๋ฑ๋ฑ ๊ธฐํ ์ฌ๋ฌ HttpMessageConverter๊ฐ ๊ธฐ๋ณธ์ผ๋ก ๋ฑ๋ก๋์ด ์์
์ฐธ๊ณ ) ํด๋ผ์ด์ธํธ์ HTTP Accept ํด๋์ ์๋ฒ์ ์ปจํธ๋กค๋ฌ ๋ฐํ ํ์ ์ ๋ณด ๋์ ์กฐํฉํด์ HttpMessageConverter ๊ฐ ์ ํ๋จ.
- Gson, Jackson(์คํ๋ง์์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฌ)→ ๊ฐ์ฒด๋ฅผ JSON์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค
๋ ์์๋ณผ ๊ฒ
- JSON vs xml
xml → html์ ํ๊ทธ ๋ฐฉ์ ๋ฌด๊ฒ๊ณ , ์ด๊ณ ๋ซ๊ณ ๋ฅผ ๋๋ฒ ์จ์ผ ํ๊ณ …spring๋ ResoponseBody์์ json์ผ๋ก ๋ฐํํ๋ ๊ฒ์ด ๋ํดํธ (๋ ๊ฑฐ์ ํ๋ก์ ํธ๋ xml..)
์ต๊ทผ์๋ ๊ฑฐ์ JSON ๋ฐฉ์์ผ๋ก ํต์ผ ⇒ ๊ทธ๋ฅ json์ผ๋ก ํ๋ฉด ๋จ
{key:value} ํํ → simpleํ ํํ
- Java bin ํ์ค ๋ฐฉ์ ⇒ private์ด๋ผ ๋ฐ๋ก ๋ชป ๊บผ๋ด๊ณ ๋ฉ์๋๋ฅผ ํตํด์ ์ ๊ทผ.
- property ์ ๊ทผ๋ฐฉ์ getter setter
์ ์ฉํ ๋จ์ถํค
command+shift+enter ํ๋ฉด ; ์น๊ณ ์ํฐ ์์ณ๋ ๊ทธ๋ฅ ์์ฑ์์ผ์ค
control+enter : generate ๋จ์ถํค
command+p ํ๋ผ๋ฏธํฐ ์ ๋ณด
* ์ด ํฌ์คํธ๋ ์ธํ๋ฐ์ ๊น์ํ ์คํ๋ง ์ ๋ฌธ ๊ฐ์ข๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋์์ต๋๋ค.*
'๐ญ Study > : Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ