์ด ํฌ์คํธ๋ ์ธํ๋ฐ์ ์คํ๋ง ์ ๋ฌธ - ์ฝ๋๋ก ๋ฐฐ์ฐ๋ ์คํ๋ง ๋ถํธ, ์น MVC, DB ์ ๊ทผ ๊ธฐ์ (๋ฌด๋ฃ) ๊ฐ์ ๋ด์ฉ์ ์ ๋ฆฌํ ๊ธ์ด๋ค.
์คํ๋ง์ด ํด๋ผ์ด์ธํธ์๊ฒ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒฝ์ฐ๋ ์ธ๊ฐ์ง๊ฐ ์๋ค.
- ์ ์ ํ์ผ ์ ๊ณต (ex: test.jpeg, test.html)
- ํ ํ๋ฆฟ ์์ง(html์ ๋์ ์ผ๋ก ๋ฐ๊พธ๋ ์ ๋ค)๊ณผ MVC(Model, View, Controller)
- API - JSON ํํ๋ก ํด๋ผ์ด์ธํธ์๊ฒ ์ง์ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ค์ฃผ๋ ํ์
์ค๋์ ์ด ์ธ๊ฐ์ง์ ๋ํด ํฌ์คํ ํด๋ณด๋๋ก ํ๊ฒ ๋ค.
์ ์ ํ์ผ ์ ๊ณต
src/main/resources/static์ ์ ์ ํ์ผ abc.txt๋ฅผ ์ ์ฅํ๋ค๊ณ ํด๋ณด์.
๊ทธ๋ฌ๋ฉด URL์์ ๊ฒ์ํ ๋ localhost:8080/abc.txt๋ก ๊ทธ๋ฅ ์ ๊ทผํ๋ฉด๋๋ค. (๋จ์ํ URL์ ํ์ผ ์ ๋ ฅํ๋ฉด ๋จ)
๋ฌผ๋ก ํ๋ก๊ทธ๋จ ๊ฐ์ ๊ฑฐ ๋ง๊ณ ๋จ์ ํ์ผ๋ง ๋์์ค ์ ์๋ค!
๋ก์ง์ ๋ญ๊น?
์ผ๋จ ์น๋ธ๋ผ์ฐ์ ์์ localhost:8080/hello-spring.html๋ก ์ ๊ทผํ๋ฉด, ๋จผ์ ํฐ์บฃ ์๋ฒ๊ฐ hello-spring์ด๋ผ๋ ์ด๋ฆ์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ๋๋ฐ, ์์ผ๋ฏ๋ก static์ ๊ฐ์ ์ฐพ๊ฒ ๋๋ ๊ฒ์ด๋ค. ์ด์ฒ๋ผ ๋จผ์ ์ปจํธ๋กค๋ฌ์ ๊ฐ์ ์คํ๋ง์ ๋ง๋ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ๋๋ค.
MVC
MVC๋ Model, View, Controller์ ์ฝ์์ด๋ค. ์ด์ ์ด ์ธ๊ฐ์ง์ ํ ํ๋ฆฟ ์์ง์ด ์ด๋ค ๋ฐฉ์์ผ๋ก ๋์๊ฐ๋์ง ์์๋ณด์
๋จผ์ View vs Controller์ด๋ค.
View์ Controller๋ ๋น์ทํ ๊ธฐ๋ฅ์ ํ์ง๋ง View๋ ํ๋ฉด์ ๊ทธ๋ฆฌ๋๋ฐ ์ง์คํ๋ค๋ฉด, Controller๋ ๋น์ฆ๋์ค์ ๋ก์ง, ๋ด๋ถ์ ๋ก์ง(ex: ํ์๊ฐ์ ์ค๋ณต ๊ฒ์ฌ ๋ฑ) ์ ๊ตฌํํ๋๋ฐ ์ง์คํ๋ค.
์์ ์๋ View ํ์ผ ํ๋์๋ค ๋ค ํด์ ๋๋ฌด ๊ธธ๊ณ ๋ณต์กํด์ง๋ ๋ฉด์ด ์์ง์์ ์์๋๋ฐ ์ด๋ ๊ฒ controller๋ view๋ฅผ ์ชผ๊ฐ ๊ธฐ๋ฅ์ ๋ถ๋ฐฐํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ด์ด์ ํ์ฌ๋ view๊ณผ controller๋ฅผ ํจ๊ผ ์ฐ๊ณ ์๋ค.
@GetMapping("hello-mvc") //hello-mvc๋ผ๋ ๊ฒฝ๋ก๋ก get๋ฐฉ์์ผ๋ก ์ ์ํ์ ๋ ์ด ์ปจํธ๋กค๋ฌ ์คํ
public String helloMVC(@RequestParam("name") String name, Model model){
model.addAtrribute("name",name); //model์ {name:name}์ผ๋ก key:value ๊ฐ? ์ถ๊ฐ
return "hello-template"; //์ด๋ฌ๋ฉด hello-template.html์ ๋์์ค!
}
//@RequestParam("name") String name : ์ฌ์ฉ์๊ฐ name(์ผ์ชฝ)์ด๋ ์ด๋ฆ์ผ๋ก ๋ณด๋ด์ค ๊ฐ์ String name(์ค๋ฅธ์ชฝ)์ผ๋ก ๋ฐ๊ฒ ๋ค๋ ๋ป
//์ฌ๊ธฐ์ ๋๋ด๋ฉด Required request parameter 'name' for method parameter type String is not present ๋ผ๋ ์๋ฌ๋จ
//์๋ํ๋ฉด name์ด๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์๋ณด๋ด์คฌ๊ธฐ ๋๋ฌธ
์ ์ฝ๋๋ก localhost/hello-mvc์ ์ ๊ทผํ์ ๋๋ ์ํ๊น๊ฒ๋ ์๋ฌ๊ฐ ๋ฌ๋ค
์ด๋ ์ฟผ๋ฆฌ์คํธ๋ง์ผ๋ก name๊ฐ์ ์ฌ์ฉ์๊ฐ ์ ๋ณด๋ด์คฌ๊ธฐ ๋๋ฌธ์ ์๊ธฐ๋ ์๋ฌ์ด๋ค. (@GetRequest ์์ name์ ๋ฐ๊ธฐ๋ก ํ์์ผ๋ฏ๋ก) /hello-mvc/name=haeun ์ด๋ฐ์์ผ๋ก ์ ๊ทผํ๋ฉด ์ ํด๊ฒฐ๋๋ค.
์ฐธ๊ณ ) html ํ์ผ์ p ํ๊ทธ
<p th:text="'hello' +${name}">hello!empty</p>
//์ฌ๊ธฐ์ ํ
ํ๋ฆฟ ์์ง์ด ์๋ํ๋ฉด p ํ๊ทธ ์์ ์๋ ๊ฐ๋ค*hello+$(name)~์ด ์๋์ด ๋๊ตฌ,,,,,,
๋ง์ฝ์ ์๋ ์ํ๋ฉด hello, empty๊ฐ ์๋๋๋๊ฒ!(์ ๊ธฐํ๊ฑด ๊ทธ๋ฅ ์ ๋๊ฒฝ๋ก๋ก ์
๋ ฅํด๋ url์์ ์ ๊ทผ์ด ๋๋ค! ๊ทธ๋ฐ๋ฐ ํ
ํ๋ฆฟ ์์ง์ ์ ์ฉ ์๋๋๊ฑฐ๊ตฌ~)
API
์์์ ํ ํ๋ฆฟ ์์ง์ผ๋ก htmlํ์ผ์ ๋ ๋๋งํด์ ๋ด๋ ค์ฃผ์๋ค๋ฉด, ์ด์ API ๋ฐฉ์์ ๊ทธ๋ฅ ๋ฐ์ดํฐ ๊ทธ์์ฒด๋ง ๋ด๋ ค์ฃผ๋ ๋ฐฉ์์ด๋ค. ์ด๊ฒ ๋ญ ์๋ฆฐ๊ฐ ์์ฃผ์์ฃผ ๊ฐ๋จํ ์ค๋ช ํ๋ฉด ์๋์ ๊ฐ๋ค
@GetMapping("hello-string")
@ResponseBody //์ด๊ฑธ ์ถ๊ฐํ๋ฉด ๋ฐ์ดํฐ ์์ฒด๊ฐ ๊ทธ๋ฅ ๋ฐ๋ก http ๋ฐ๋์ ๋ค์ด๊ฐ!! ํ
ํ๋ฆฟ ์์ง์ด๋ ๋ทฐ๊ฐ์๊ฑฐ ์๊ด ์์ด!
// ์ด๊ฒ ๋ชฌ ์๋ฆฌ๋ ํ๋ฉด, ์ฟผ๋ฆฌ์คํธ๋ง์ name ๋ฃ์ด์ ์ ๊ทผํด์ ํ๋ฉด์์ ์์ค๋ณด๊ธฐ(๊ฐ๋ฐ์ ๋๊ตฌ๋ง๊ณ !) ํ๋ฉด, ๊ทธ๋ฅ ในใ
๋ก html ์ด๋ด ๊ฑฐ ์์ด ๋ฐ์ดํฐ๋ง ์ก์ผ๋ก ๋ด๋ ค๊ฐ
public String helloString(@RequestParam("name") String name){
return "hello "+name;
}
@ResponseBody๋ ์ฐ๋ฆฌ๊ฐ ๋ฐ์ดํฐ๋ฅผ HTTP Response ๋ฉ์์ง์ body ๋ถ๋ถ์ ๋ฃ์ด์ ๋ณด๋ด๊ฒ ๋ค๋ ๋ป์ด๋ค!
๋ค๋ฅธ ๋ฐฉ์๋ค์ html๋ก ๊ฐ์ธ์ ๋ค์ด๊ฐ๋ฐ๋ฉด ์ด๊ฑด ๊ทธ๋ฐ๊ฑฐ ์๋ค
์ค๋ฅธ ์ชฝ์ html ๋ฐ์ ์์ด ๋ง๊ทธ๋๋ก hello cute๋ง ์ ๋ฌ๋๊ณ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค!
์ข๋ ๋ณต์กํ๊ฒ ๊ฐ๋ณด์. ์ด์ ํด๋์ค๋ฅผ ์ ์ํด์ฃผ๊ณ ์ด ํด๋์ค๋ก ๋ง๋ ๊ฐ์ฒด๋ฅผ API๋ก ๋ด๋ณด๋ด์ค(?) ๊ฒ์ด๋ค.
static class Hello{ //ํด๋์ค Hello ์ ์
private String name;
//๊ฒํฐ์ธํฐ ์ ์~์ฌ๋ง์ด์ผใ
ใ
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
}
์์ฃผ ๊ฐ๋จํ Hello๋ผ๋ ํด๋์ค๋ฅผ ์ ์ํด์ฃผ์๋ค.
์๋ name์ด๋ผ๋ String์ ๋ฉค๋ฒ๋ก, getName(),setName()์ด๋ผ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๋ค.
@GetMapping("hello-api")
@ResponseBody
public Hello helloAPI(@RequestParam ("name") String name){ //์ด์ Hello๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ณํํ๋ ๋ฉ์๋!
//์ฐธ๊ณ ๋ก @requestParam(name)์ ์ฌ์ฉ์๊ฐ ๋ณด๋ธ ๋ณ์ 'name'(์ผ์ชฝ)์ ์ค๋ฅธ์ชฝ name์ด๋ผ๋ String์ผ๋ก ๋ฐ๋๋ค๋ ๊ฑฐ ๊ฐ๋ค
Hello hello = new Hello();
hello.setName(name);
return hello; //hello๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํ
}
//json์ key,value ํํ๋ก๋ ๊ตฌ์กฐ
}
์ฒ์์ผ๋ก String์ด ์๋๋ผ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๋ฉ์๋๊ฐ ๋์๋ค. Hello ๊ฐ์ฒด ์์ฑํ name์ ์ฌ์ฉ์๊ฐ ์ค์ ํ ๊ฐ์ผ๋ก ์ค์ ํ๋ค. ์ฌ์ฉ์๊ฐ ์ค์ ํ๋ฏ๋ก ์๋ ์ฟผ๋ฆฌ์คํธ๋ง์์ ?name=์ด์ฉ๊ตฌ ํ์์ผ๋ก ๋ณด๋ด์ ์ ๊ทผํด์ผํ๋ค.
์ด์ฒ๋ผ ๊ฐ์ฒด ๊ทธ์์ฒด๊ฐ ๋ฐํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด๋ฐ๊ฑด JSON ๋ฐฉ์์ธ๋ฐ, ์์ ์๋ XML ๋ฐฉ์์ด ๋ง์ด ์ฐ์๋ค๊ณ ํ๋ค!! (html ํ๊ทธ๊ฐ ๊ทธ๋ฐ ๋ฐฉ์์!) ๊ทธ๋ฐ๋ฐ ์ข ๋ฌด๊ฒ๊ณ , ํ๊ทธ ์ด๊ณ ๋ซ๊ณ ํด์ผ๋ผ์ ๊ท์ฐฎ์ ๋ฌธ์ ๊ฐ ์์๋ค.. ๊ทธ๋์ ์์ฆ์ JSON๋ฅผ ๋ํดํธ๋ก ์ฌ์ฉํ๋ค๊ณ ํ๋ค!
viewResolver๋ ์ฌ๊ธฐ์ ์๋์จ๋ค!!
๊ทธ๋ฆฌ๊ณ ๊ฐ์ฒด๋ ๊ธฐ๋ณธ์ผ๋ก jsonํํ๋ก ๋ฐ๊ฟ์ ๋ณด๋ด์ฃผ๋ ๊ฒ์ด ๊ธฐ๋ณธ ์ ์ฑ ์ด๋ค!!
@ResponseBody ๋ฅผ ์ฌ์ฉํ๋ฉด viewResolver ๋ง๊ณ HttpMessageConverter๊ฐ ๋์ํ๊ฒ ๋๋ค (ํ ํ๋ฆฟ ์์ง์ ์ฌ์ฉํ์ ๋๋ viewResolver๋ก ๊ฐ์ ํ ํ๋ฆฟ์ ์ฒ๋ฆฌํด์คฌ๋ค)
- ์๋ง HttpMessageConverter๋ jsonํํ๋ก ๋ฐ๊ฟ์ฃผ๋ ์ญํ ๋ ํ๋ ์ ์ธ๊ฐ…….?
- ์ค,,, HttpMessageConverter๋ ๊ฐ์ฒด๊ฐ ์ค๋ฉด JSON ํํ๋ก ๋ฐ๊ฟ์ฃผ๋ MappingJackson2HttpMessageConverter๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด์๋ค๊ณ ํ๋ค!!(Jackson์ ๋ญฅ๋ฏธ? ๊ฑ ๊ฐ์ฒด๋ฅผ json์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ jackson์ธ๋ฏํ๋ค) ๊ทธ๋ฆฌ๊ณ String์ด ์ค๋ฉด ์๋ฅผ ์ฒ๋ฆฌํด์ฃผ๋ StringHttpMessageConverter ๊ธฐ๋ฅ์ด ์๊ณ ~! ์๋ค๋ง๊ณ ๋ค๋ฅธ ์ ๋ค ex)byte ๋ ๋ค๋ค์ฃผ๋ ๋ค๋ฅธ converter๋ค๋ ์๋ค๊ตฌ ํ๋น
์๋ฌดํผ ์ค๋์ Spring์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ค ๋ฐฉ์์ผ๋ก ๋์๊ฐ๋์ง ์์๋ณด์๋ค.
๊ฐ์ ๋๊น์ง ๋ค ๋ค์๋๋ฐ,,, ์๋ก ํ์ ํ๊ณ ๊ฑฐ๊ธฐ์ ์์ฑํ๋๋ฐ ๊นํ์ ์ฌ๋ฆฌ๋ค๊ฐ ํฐ๋ฏธ๋์์ ์ค์๋ก !! ํ๋ก์ ํธ๋ฅผ ์ญ์ ํด๋ฒ๋ ค์ ๋ค์ ๋ค์ด์ผํ๋ค..... ๊ฑฐ๊ธฐ ํ๊ธฐ๋ ๋ค์์ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ