2. ์คํ๋ง ์น ๊ฐ๋ฐ ๊ธฐ์ด
๋ชฉ์ฐจ
์๊ฐ ์ฝ์ค๋ ์ธํ๋ฐ ์คํ๋ง ์ ๋ฌธ ๊ฐ์๋ฅผ ๋ฃ๊ณ ์์ต๋๋ค.
์น ๊ฐ๋ฐ
์น๊ฐ๋ฐ์ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
-
- ์ ์ ์ปจํ ์ธ
- ํ์ผ์ ๊ทธ๋๋ก ๋ด๋ ค์ฃผ๋ ๊ฒ, ๊ฐ๋ น html ํ์ผ๋ก๋ง ์ด๋ฃจ์ด์ง ์น.
-
- MVC์ ํ ํ๋ฆฟ ์์ง
- ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค. ๊ณผ๊ฑฐ์ jsp, php์ ๊ฐ์ ๊ฒ์ด ํ
ํ๋ฆฟ ์์ง์ด๋ค. html์ ๊ทธ๋๋ก ์ฃผ๋ ๊ฒ์ด ์๋๋ผ, ์๋ฒ์์ ํ๋ก๊ทธ๋๋ฐ์ ํด์ ๋์ ์ผ๋ก ๋ณํํ์ฌ ์ฃผ๋ ๊ฒ์ด๋ฉฐ, ์ด๋ฅผ ์ํด์๋
๋ชจ๋ธ-๋ทฐ-์ปจํธ๋กค๋ฌ(MVC)
๊ฐ ํ์ํ๋ค.
-
- API
- ์๋๋ก์ด๋, ์์ดํฐ ํด๋ผ์ด์ธํธ์ ๊ฐ๋ฐํ๋ค๊ณ ๊ฐ์ ํ๋ค. ์์๋ ๋ฐ์ดํฐ๋ฅผ json ๋ฐ์ดํฐ ๊ตฌ์กฐ ํฌ๋งท์ผ๋ก ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํ๋๋ฐ, ์ด๋ฅผ API ๋ฐฉ์์ด๋ค ํ๋ค. vue, react ๋ฑ์ ์ธ ๋ ํ๋ฉด์ ํด๋ผ์ด์ธํธ๊ฐ ์์์ ๊ทธ๋ฆฌ๊ฑฐ๋, ์๋ฒ๋ผ๋ฆฌ ํต์ ํ ๋ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค.
์ ์ ์ปจํ ์ธ
- main>resources>static ํด๋์ html ํ์ผ์ ์์ฑํ๋ ๊ฒ. url์ htmlํ์ผ๋ช ๊ทธ๋๋ก ์ฌ๋ผ์ค๊ฒ ๋๋ค.
- ๋์
- ์น ๋ธ๋ผ์ฐ์ ์์
localost:8080/hello-static.html
์ ๋ด์ฅ ํฐ์บฃ ์๋ฒ๋ก ๋๊ฒจ์ค๋ค. - ํฐ์บฃ ์๋ฒ๊ฐ ์์ฒญ์ ๋ฐ์ ์คํ๋ง ์ปจํ
์ด๋์๊ฒ ๋๊ธด๋ค.
2.1. ์ปจํธ๋กค๋ฌ์์ hello-static ๊ด๋ จ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ์ผ๋ ์ฐพ์ ์ ์๋ค. 2.2.resources: static/hello-static.html
์ ์ฐพ๋๋ค. - ์น ๋ธ๋ผ์ฐ์ ์
hello-static.html
์ ๋์์ค๋ค.
- ์น ๋ธ๋ผ์ฐ์ ์์
MVC์ ํ ํ๋ฆฟ ์์ง
- MVC๋ Model, View, Controller๋ฅผ ์๋ฏธํ๋ค. ๊ณผ๊ฑฐ์๋ ๋ชจ๋ธ, ๋ทฐ, ์ปจํธ๋กค๋ฌ๊ฐ ๋ถ๋ฆฌ๋์ด์์ง ์๊ณ , DB์ ๊ทผ ๋ฑ๊น์ง ๋ทฐ์ ๋ชจ๋ ๊ฑธ ๋ค ํ์๋ค. ์ด๋ฅผ Model-one ๋ฐฉ์์ด๋ผ ๋ถ๋ฅด๋ฉฐ, ์์๋ MVC ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
- View : ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ๋ฐ์ ๋ชจ๋ ์ญ๋์ ์ง์ค
- Controller, Model : ๋ด๋ถ์ ์ธ ๊ฑธ ์ฒ๋ฆฌํ๊ฑฐ๋, ๋น์ฆ๋์ค ๋ก์ง ๋ฑ๊ณผ ๊ด๋ จ์ด ๋๋ค.
์ปจํธ๋กค๋ฌ
package hello.hellospring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class HelloController {
@GetMapping("hello") // ์น ์ดํ๋ฆฌ์ผ์ด์
์์ '/hello'๊ฐ ๋ค์ด์ค๋ฉด ์ด ๋ฉ์๋๋ฅผ ํธ์ถํด์ค๋ค.
public String hello(Model model) {
model.addAttribute("data", "hello!!");
return "hello";
}
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
}
๋ทฐ (hello-template.html)
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
-
hello! empty๋ ์์จ๋ ์๊ด์์ง๋ง, ํ์๋ฆฌํ ํน์ฑ์ ์ ๋๊ฒฝ๋ก๋ก html์ ๋ฐ๋ก ์ด์ด๋ณผ ์๋ ์๋ค. ํ ํ๋ฆฟ ์์ง์ผ๋ก ๋์ํ ๊ฒฝ์ฐ์๋ hello! empty์ ๋ด์ฉ์ด ์์
'hello ' + ${name}
์ผ๋ก ์นํ๋์ด ๋ํ๋๊ฒ ๋๋ค. -
์ดํ
http://localhost:8080/hello-mvc?name=spring!!!
์ผ๋ก ์ ์ํด์ฃผ๋ฉด โhello spring!!!โ์ด๋ผ๋ ํ๋ฉด์ด ๋ฌ๋ค. -
๋์ ๋ฐฉ์
- ์น๋ธ๋ผ์ฐ์ ๋ name=โspringโ์ผ๋ก ๋ฐ์์ ๋ด์ฅ ํฐ์บฃ์๋ฒ๋ก ๋๊ธด๋ค.
- ๋ด์ฅํฐ์บฃ์๋ฒ๋ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์์ฒญํ๋ค.
- helloController๋ helloMvc์์ name์ โspringโ์ผ๋ก ๋ฐ๊พธ๊ณ , model(name:spring)๊ณผ hello-template์ returnํ๋ค.
- viewResolver๋ ๋ชจ๋ธ์์
${name}
์ผ๋ก ๋ฐ์์ ์ถ๋ ฅํ๊ฒ ๋๋ค.- ์ด๋ฅผ ํ์๋ฆฌํ ํ ํ๋ฆฟ ์์ง์ HTML์ผ๋ก ๋ณํํ์ฌ ์ฒ๋ฆฌํ๋ค.
API
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
- ResponseBody๋ Body๋ถ์ ํด๋น ๋ด์ฉ์ ์ง์ ๋ฃ์ด์ฃผ๊ฒ ๋ค๋ ์๋ฏธ์ด๋ค. name=โSpringโ์ด ๋ค์ด๊ฐ๋ค๋ฉด, ํด๋น ๋ฌธ์๊ฐ โhello Springโ์ผ๋ก ๋ฐ๋์ด ๋ค์ด๊ฐ๊ฒ ๋ ๊ฒ์ด๋ค.
- view ์์ด ํด๋น ๋ฌธ์๊ฐ ๊ทธ๋๋ก ๋ค์ด๊ฐ๊ฒ ๋๋ ๊ฒ์.
- ์์ค๋ณด๊ธฐ๋ฅผ ํ๋ฉด html์์ค ์์ด, ํด๋น ๋ฌธ์๊ฐ ๊ทธ๋๋ก ๋ ์๋ค.
@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;
}
}
-
http://localhost:8080/hello-api?name=spring!!!
๋ก ๋ค์ด๊ฐ๋ฉด{"name":"spring!!!"}
์ด ๋์จ๋ค. ์ด๋ json์ด๋ผ๋ ๋ฐฉ์์ด๋ค. key๋ name, value๋ spring!!!์ด ๋ค์ด๊ฐ๋ค. json์ด ๋ค๋ฅธ ๋ฐฉ์์ ๋นํ์ฌ ๊ฐ๋จํ๋ค. ResponseBody๋ฅผ ์ฌ์ฉํ๋ฉด ๊ทธ๋์ ๊ธฐ๋ณธ์ผ๋ก json์ผ๋ก ๋ฐํํ๋ค.- json : key-value๋ก ์ด๋ฃจ์ด์ง ๊ตฌ์กฐ
-
getter์ setter
: Java Bean ํ์ค ๋ฐฉ์์ด๋ผ ์นญํ๋ค. property ์ ๊ทผ ๋ฐฉ์์ด๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค. ๋ฉ์๋๋ฅผ ํตํด ์ ๊ทผํ๋ค.
ResponseBody ์ฌ์ฉ ์๋ฆฌ
- ์น ๋ธ๋ผ์ฐ์ ์์ localhost:8080/hello-api๋ฅผ ๋ด์ฅํฐ์บฃ์๋ฒ๋ก ๋ณด๋ธ๋ค.
- ํฐ์บฃ์๋ฒ์์ ์คํ๋ง์ ๋์ง๋ค.
-
@ResponseBody
๊ฐ ์์ผ๋ฉด http์๋ต์ ์ด ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ๋๊ธด๋ค. ๊ทผ๋ฐ ๋ฌธ์๊ฐ ์๋๋ผ ๊ฐ์ฒด๊ฐ ์ค๋ฉด, ๊ธฐ๋ณธ์ ์ผ๋ก json ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ค. - ๊ธฐ์กด์ ๋์ํ๋ฉด viewResolver๊ฐ ์๋๋ผ,
HttpMessageConverter
๋ฅผ ์ด์ฉํ๊ฒ ๋๋ค. ๋จ์ ๋ฌธ์์ด์ด๋ฉดStringConverter
๊ฐ ๋์ํ๊ณ , ๊ฐ์ฒด๋ฉดJsonConverter
(MappingJackson2HttpMessageConverter)๊ฐ ๋์ํ๋ค. => ์ด๋ฅผ ํตํด Json ์คํ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ฟ ์น๋ธ๋ผ์ฐ์ ๋ก ๋๊ฒจ์ค๋ค.- MappingJackson2HttpMessageConverter : ์ญ์จ์ json์ผ๋ก ๋ณํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ผ์ข ์ธ๋ฐ, ์คํ๋ง์ ์ด๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๋ค.
-
ํด๋ผ์ด์ธํธ์ HTTP Accept ํค๋์ ์๋ฒ์ ์ปจํธ๋กค๋ฌ ๋ฐํ ํ์ ์ ๋ณด ๋์ ์กฐํฉํด์ HttpMessageConverter๊ฐ ์ ํ๋๋ค๊ณ ํ๋ค. (์ ์ดํด๊ฐ ์๊ฐ๋ค. ๊ทธ๋ฅ json์ ์ด๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค๊ณ ํ์ ๋ค.)
IntelliJ ๋จ์ถํค
-
Alt
+Insert
: Generate => Getter and Setter๋ฅผ ๋น ๋ฅด๊ฒ ๋ง๋ค ์ ์๋ค. -
Ctrl
+ Shift + Enter : ๋์ ์ธ๋ฏธ์ฝ๋ก ์ ๋ถ์ฌ์ฃผ๋ฉฐ ์์ฑ ํ ์ํฐ