์ ๋ฒ์ ์ด์ด์ ์ค๋๋ ๊ธฐ์ด๋ฅผ ๋ฐฐ์ ๋ค!
์ค๋ ๋ฐฐ์ด ๋ด์ฉ์ ์ ์ ์ปจํ ์ธ , MVC, api์ ๊ด๋ จ๋ ๋ด์ฉ์ด๋ค.
์์ฃผ ์คํ๋ง ๊ฑธ์๋ง๋ฅผ ์ค๋นํ๋ ๊ฒ ๊ฐ์ ๊ธฐ๋ถ๋๋ค ํงํ (เนหฬตแดหฬต)ู โก
1. ์ ์ ์ปจํ ์ธ
์ ์ ์ปจํ ์ธ ๋ ๊ทธ๋ฅ ํ์ผ์ ๊ทธ๋๋ก ๋ณด์ฌ์ฃผ๋ ๋ฐฉ์์ด๋ค.
resources์ staticํ์ผ์ hello-static.html ํ์ผ์ ๋ง๋ค์๋ค.
<!DOCTYPE HTML>
<html>
<head>
<title>static content</title>
<meta http-equiv="Content-Type" content="text/html; charset = UTF-8"/>
</head>
<body>
์ ์ ์ปจํ
์ธ ์
๋๋ค.
</body>
</html>
์ด๊ฑธ ์น๋ธ๋ผ์ฐ์ ์ ์คํ์์ผ๋ณด๋ฉด body๋ฌธ์ ์จ ์๋ ๋ฌธ์ฅ์ด ๊ทธ๋๋ก ๋์ค๊ฒ ๋๋ค.
์คํ๊ณผ์
- ์น๋ธ๋ผ์ฐ์ ์์ localhlost:8080/hello-static.html ์ฃผ์๋ฅผ ํฐ์บฃ ์๋ฒ์ ๋ณด๋ธ๋ค.
- ํฐ์บฃ ์๋ฒ๋ ์คํ๋ง์๊ฒ ๋ณด๋ด๊ณ , ์คํ๋ง์์๋ hello-static ๊ด๋ จ ์ปจํธ๋กค๋ฌ๋ฅผ ๋จผ์ ์ฐพ๊ณ ์์ผ๋ฉด, resources์ ์๋ html์ ์ฐพ๋๋ค. (์ปจํธ๋กค๋ฌ์์ ์ฐพ๋๊ฒ ์ฐ์ ์์์ด๋ค.)
- ๋ค์ ์น๋ธ๋ผ์ฐ์ ์ html์ ๋ณด๋ด์ ํ๋ฉด์ ๋ณด์ฌ์ค๋ค.
ํ์ง๋ง ์ ์ ์ปจํ ์ธ ๋ ํ๋ก๊ทธ๋๋ฐ์ ์ธ ์ฝ๋ฉ์ ๋ชปํ๋ค! ๊ทธ๋์ mvc์ api๋ฅผ ์ฌ์ฉํ๋ค!
2. MVC
MVC๋ ํ ํ๋ฆฟ ์์ง์ Model, View, Controller ๋ฐฉ์์ผ๋ก ์ชผ๊ฐ์, view๋ฅผ ํ ํ๋ฆฟ ์์ง์ผ๋ก html์ ์ข ๋ ํ๋ก๊ทธ๋๋ฐํ ๊ฒ์ ๋ ๋๋งํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๋๋งํ html์ ํด๋ผ์ด์ธํธ์๊ฒ ๋๊ฒจ์ฃผ๋ ๋ฐฉ์์ด๋ค.
๊ณผ๊ฑฐ์๋ view๋ controller๊ฐ ๋ถ๋ฅ๋ผ์์ง๋ ์์๋ค๊ณ ํ๋ค.
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam( "name") String name, Model model){
model.addAttribute("name", name);
return "hello-template";
}
๊ธฐ์กด์ ์๋ HelloController ์๋ฐ ํ์ผ์ ์๋ ํด๋์ค์ ์ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฑธ ์น๋ธ๋ผ์ฐ์ ์ ๋ณด์ฌ์ค view ์ฝ๋๋ฅผ ์์ฑํ๋ค.
<html xmlns:th="http://www.thymeleaf.org">
<!-- template์์ง ๊ผญ ์จ์ค์ผ ๋ฐ์ ์๋ ํ์๋ฆฌํth๊ฐ ์๋๋จ-->
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
html์ฝ๋๋ templatesํ์ผ์ hello-tamplate.html์ ์์ฑํด์คฌ๋ค.
์ฌ๊ธฐ์ hello! empty๋ผ๊ณ ๋ฏธ๋ฆฌ ์จ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์๋ค! ๊ฐ๋ฐ์ ํ ๋ ๊ทธ๋ฅ ์ด๊ฒ ๋ฌด์จ ํ์ผ์ธ์ง๋ง ์ค๋ช ? ํ๋ ์ฉ๋๋ผ๊ณ ํ๋ค. ํ ํ๋ฆฟ ์์ง์ด ์๋ํ๋ฉด ์ด ๋ด์ฉ์ ์์ด์ง๊ณ ์์ ์๋ ์ฝ๋๋ก ์นํ์ด ๋๋ค๊ณ ํ๋คใ ใ
์ ๊ทธ๋ฆฌ๊ณ ์ ๊ธฐํ ์ฌ์ค!
thymeleaf ํ ํ๋ฆฟ ์์ง์ ์ฌ์ฉํ๋ฉด ์๋ฒ ์์ด ๊ทธ ํ์ด์ง๋ฅผ ๋ณผ ์ ์๋ค๊ณ ํ๋ค.
htmlํ์ผ์ ์ฐํด๋ฆญํ๊ณ , Copy Path -> Absolute Path ํ ๋ค์์ ์ฃผ์์ฐฝ์ ๋ถ์ฌ๋ฃ๊ธฐ๋ฅผ ํ๋ฉด ์นํ๋์ง ์์ hello! empty๊ฐ ํ์ด์ง์ ๋ณด์ธ๋ค ์ ๊ธฐํ๊ตฐ
๊ทผ๋ฐ ์ฌ๊ธฐ์ ์คํ์ํค๊ณ localhost:8080/hello-mvc๋ฅผ ์ฃผ์์ฐฝ์ ์น๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
์ ๋ ๊ฒ ์น๋ฉด ์๋๊ณ , name์ ์ค์ ํด์ค์ผํ๋ค.
์ฃผ์์ฐฝ์ ์๋ก localhost:8080/hello-mvc?name=spring์ด๋ผ๊ณ ์น๋ค.
์ฌ๊ธฐ์ spring์ ์ด๋ฆ์ด๋ค! ์ 'name=' ๋ค์ ์ํ๋ ๊ฒ์ ์น๋ฉด ๊ทธ๊ฒ ์นํ๋ผ์ ๋ฐ๋๋ค.
์น๋ธ๋ผ์ฐ์ ์์ค์ฝ๋๋ฅผ ๋ณด๋ฉด ๋ฐ๋ ๊ฒ์ ์ ์ ์๋ค!
์คํ๊ณผ์
- localhost:8080/hello-mvc๋ก ์ ์์ ํ๋ฉด ๋ด์ฅ ํฐ์ผ ์๋ฒ๊ฐ ์คํ๋งํํ ๋๊ฒจ์ค๋ค. ์ฌ๊ธฐ์ hello-mvc์ ๋ง๋ ๊ฒ์ ์ฐพ์์ name๊ณผ ํจ๊ป model์ ๋ง๋ค์ด์ ๋๊ธด๋ค.
- viewResolver๊ฐ ๋์์ ํ๊ฒ ๋๋๋ฐ, ์ด๊ฒ์ ํ๋ฉด๊ณผ ๊ด๋ จ๋ ํด๊ฒฐ์๊ฐ ๋์ํ๋ ๊ฒ์ด๋ค. view๋ฅผ ์ฐพ์์ฃผ๊ณ template ์์ง์ ์ฐ๊ฒฐ์์ผ์ค๋ค.
- viewResolver๊ฐ hello-template.html์ ์ฐพ๊ณ thymeleaf ํ ํ๋ฆฟ ์์ง์ด ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๊ณ ๋ ๋๋ง์ ํ๋ค. ์ด ๋ณํ๋ html์ ์น๋ธ๋ผ์ฐ์ ์ ๋ค์ ๋๊ฒจ์ฃผ๋ฉด ๋์ด๋ค. (์ฌ๊ธฐ์ ์ ์ ํ๋ฉด์ผ ๋๋ ๋ณํ์ ํ์ง ์๋๋ค)
3. API
API๋ ๋๋ถ๋ถ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๊ฒ์ด๋ค.
API๋ MVC์ฒ๋ผ ๋ง ๋ณต์กํ ๊ณผ์ ์ ๊ฐ์ง๊ณ ์์ง๋ ์์์ ๊ฐ๋จํ๊ฒ ์ธ ์ ์๋ค๊ณ ํ๋ค.
API ์์๋ ๋ฌธ์ฅ์ ๋์์ฃผ๊ฑฐ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋๋ฐ, ๋จผ์ ๋ฌธ์ฅ์ ๋ฐํํ๋ ์์ ๋ถํฐ ์จ ๋ณผ ๊ฒ์ด๋ค.
@GetMapping("hello-string")
@ResponseBody //http์์ body๋ถ์ ๋ฐ์ ๋ด์ฉ์ ์ง์ ๋ฃ์ด์ฃผ๊ฒ ๋ค๋ ๋ป
public String helloString(@RequestParam("name") String name){
return "hello " + name; //name์ spring์ผ๋ก ์์ฒญํ๋ฉด name์ด ๊ทธ๋๋ก ๋ฐ๋
}
API๋ viewResolver๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ @ResponseBody๋ฅผ ๊ผญ ์จ์ค์ผ๋๋ค!! ์ ๊ฑธ ์ฐ๋ฉด http์์ body๋ถ๋ถ์ ์ง์ ๋ฐ๋ก ๋ด์ฉ์ ๋ฃ๊ฒ ๋ค๋ ๋ป์ด๋ค.
์ด๊ฒ๋ ์์ ?name=spring์ ํด์ผ ๋์จ๋ค!
mvc๋ฐฉ์๊ณผ ์น๋ธ๋ผ์ฐ์ ์๋ ๋ชจ์์ด ๋๊ฐ์ด ๋์ค์ง๋ง ์ด ์นํ์ด์ง์ ์์ค์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด ํ์ฐํ ๋ค๋ฅด๋ค.
์ ๋ง ์ค๋ช ํด์ฃผ์ ๋๋ก ์ ๋ ๊ฒ ๋ฐ๋ก ์์ฑ์ด ๋์ด์์๋ค..(เน•ฬo•ฬเน)
์ด๋ฒ์๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํด๋ดค๋ค!
@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์ผ๋ก ๋ณํ๋๋ค.
json์ ํ๊ต์์ ๊ฐ๋จํ ๋ฐฐ์ด ์ ์ด ์์๋ค, key์ value๋ก ํ๊ธฐ๋๋ค.
์ด๋ฒ์๋ ์คํ์ ํด๋ดค๋ค!
์ด๋ฒ์๋ ๋๊ฐ์ด name์ spring์ผ๋ก ์ค์ ํด์ ์ฃผ์์ฐฝ์ ์ ์๋ค.
์๊น์๋ ๋ค๋ฅด๊ฒ๋์๋ค! ์ ํ๊ธฐ ๋ฐฉ์์ด json ๋ฐฉ์์ด๋ค. name์ด key๊ฐ์ด๊ณ , spring์ด value๊ฐ์ด๋ค!!
์คํ๊ณผ์
- localholst:8080/hello-api๋ฅผ ํฐ์บฃ ๋ด์ฅ ์๋ฒ์ ๋ณด๋ด๊ณ ํฐ์บฃ์์ ์คํ๋ง์ผ๋ก ๋์ง๋ค.
- ์คํ๋ง์์ helloController์์ ์ฐพ์๋ค์์ @ResponseBody๋ฅผ ํ์ธํ๋ค.
- ๋ง์ฝ ์ด๊ฒ ๊ฐ์ฒด์ด๋ฉด MappingJackson2HttpMessageConverter๊ฐ ๋์ํ๊ณ , ๋ฌธ์๋ฉด StringHttpMessageConverter๊ฐ ๋์ํ๊ฒ ๋๋ค.
- ๊ฐ์ฒด๋ฉด json ์คํ์ผ๋ก ๋ฐ๊พธ๊ณ , ๋ฌธ์๋ฉด ๊ทธ๋๋ก ์น๋ธ๋ผ์ฐ์ ์ ๋๊ฒจ์ค๋ค.
// @ResponseBody
์ด ํ๊ธฐ๊ฐ ์ ๋ถ์ด์์ผ๋ฉด mvc์์์ฒ๋ผ viewResolver์๊ฒ ๋์ง๋ค. ํ์ง๋ง ๋ถ์ด์์ผ๋ฉด http์๋ต์ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ๋๊ฒจ์ผ ํ๋ค.
๋ฌธ์๋ฉด ๊ทธ๋ฅ ๋๊ฒจ์ ์ฃผ๋๋ฐ ๊ฐ์ฒด์ผ๋๋ ๊ธฐ๋ณธ ๋ํดํธ๊ฐ json๋ฐฉ์์ผ๋ก data๋ฅผ ๋ง๋ค์ด์ http์๋ต์ ๋ฐํ์ ํ๋ ๊ฒ์ด๋ค.
๊ฐ์ฒด๋ฅผ json์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ๋ํ์ ์ผ๋ก Jackson์ด๋ Gson์ด ์๋๋ฐ, ์คํ๋ง์์๋ Jackson์ด ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฌ๋์ด์๋ค๊ณ ํ๋ค.
๊ฐ์ฌ๋์ด ์ค๋ช ์ ์ ํด์ฃผ์ จ๋๋ฐ ๋ด๊ฐ ์ ๋ชป์์ ๋ค์ ๊ฒ์ด ์๋๊น ๊ฑฑ์ ์ด๋๋ค...( •ฬ ฬฏ•ฬ )
๊ทธ๋๋ ์ด์ฌํ ๋ฐ๋ผ๊ฐ์ผ์ง!
# ์ด ํฌ์คํ ์ ์ธํ๋ฐ์์ ๊น์ํ๋ ์คํ๋ง๊ฐ์๋ฅผ ๋ฃ๊ณ ์์ฑ๋ ๋ณต์ต ํฌ์คํ ์ ๋๋น
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
H2 DB ๋ค์ด๋ก๋ [์ค์น / ์๋ฒ ์คํ] (0) | 2021.06.27 |
---|---|
Spring [ ํ์ ๋ฑ๋ก/์กฐํ/ํ์ ๊ด๋ฆฌ ์์ /์คํ๋ง] (0) | 2021.06.25 |
Spring [์คํ๋ง ๋น๊ณผ ์์กด๊ด๊ณ / ํ์ ์๋น์ค ์คํ๋ง๋น ๋ฑ๋ก] (0) | 2021.06.25 |
Spring [ํ์ ๊ด๋ฆฌ / ๋ฐฑ์๋] (0) | 2021.06.21 |
Spring ํ๋ก์ ํธ ํ๊ฒฝ์ค์ [ํ๋ก์ ํธ ์์ฑ / ๋น๋ ์คํ] (0) | 2021.06.05 |