ํฐ์คํ ๋ฆฌ ๋ทฐ
[SPRING]์คํ๋ง ์ ๋ฌธ - ์ฝ๋๋ก ๋ฐฐ์ฐ๋ ์คํ๋ง ๋ถํธ, ์น MVC, DB ์ ๊ทผ ๊ธฐ์ ์น์ 2 (์ ์ ์ปจํ ์ธ , MVC์ ํ ํ๋ฆฟ ์์ง, API)
chaewonni 2023. 11. 7. 16:18๐ก์ ์ ์ปจํ ์ธ
์ ์ ์ปจํ ์ธ ๋ ์๋ฒ์์ ๋ญ ํด์ฃผ๋ ๊ฒ ์์ด ํ์ผ ๊ทธ๋๋ก๋ฅผ ์น๋ธ๋ผ์ฐ์ ๋ก ๋ด๋ ค์ฃผ๋ ๊ฒ์ ์๋ฏธํ๋ค.
resource/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>
์ ์ฝ๋๋ฅผ ์์ฑํด์ค ํ์
http://localhost:8080/static.html์ ์ณ์ ๋ค์ด๊ฐ๋ฉด
์์ ๊ฐ์ด ์ ์์ ์ธ ์ ์ ์ปจํ ์ธ ๊ฐ ๋ณด์ธ๋ค.
๐ก์ ์ ์ปจํ ์ธ ์๋ฆฌ
์น ๋ธ๋ผ์ฐ์ ์์ http://localhost:8080/static.html ์ฃผ์์ ๋ค์ด๊ฐ๋ฉด ๋ด์ฅ ํฐ์ผ ์๋ฒ๊ฐ ์์ฒญ์ ๋ฐ๊ณ , '๋จผ์ ' static.html ์ ์คํ๋ง ๋ถํธ๊ฐ ์ปจํธ๋กค๋ฌ์ static ๊ด๋ จ ์ปจํธ๋กค๋ฌ๊ฐ ์๋์ง ํ์ธ์ ํ๋ค. ์ด ํ๋ก์ ํธ๋ ์ปจํธ๋กค๋ฌ ํ์ผ์ด ์๊ธฐ ๋๋ฌธ์ ๋์ด๊ฐ๊ณ ๊ทธ ๋ค์์ผ๋ก static ๊ด๋ จ html ์ด ์๋ ์ง ํ์ธ์ ํ์ฌ ์ฐพ์ผ๋ฉด ์ด ํ์ผ์ ์น ๋ธ๋ผ์ฐ์ ์ ๋ฐ๋ก ๋ณด๋ด์ฃผ๋ ๊ฒ์ด ์ ์ ์ปจํ ์ธ ์ ์๋ฆฌ์ด๋ค. (์ถ์ฒ:easy00.log)
๐กMVC์ ํ ํ๋ฆฟ์์ง
MVC๋ ์๋ฒ์์ ๋ณํ์ ํด์ค์ (html์ ๋ฐ๊ฟ์) ๋ด๋ ค์ฃผ๋ ๋ฐฉ๋ฒ์ด๋ค.
์๋๋ view๋ controller๋ ๋ถ๋ฆฌ๋์ง ์๊ณ view์์ ๋ค ํ์ง๋ง ์ด์ ๋ ๋ถ๋ฆฌ๋์ด MVC(model, view, controller)๋ผ๊ณ ํ๋ค.
html์ ์๋ฒ์์ ๋์ ์ผ๋ก ํ๋ก๊ทธ๋๋ฐ ํด์ ์น๋ธ๋ผ์ฐ์ ๋ก ๋ด๋ ค์ฃผ๋ ๊ฒ์ ํ
ํ๋ฆฟ ์์ง์ด๋ผ๊ณ ํ๋ฉฐ, ํ
ํ๋ฆฟ ์์ง์ ์ฌ์ฉํ๊ธฐ ์ํ ์ปจํธ๋กค๋ฌ, ๋ชจ๋ธ, ํ
ํ๋ฆฟ ์์ง ํ๋ฉด ์ด 3๊ฐ์ง Model, View, Controller(MVC) ๋ผ๊ณ ํ๋ค.
view๋ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ๋ฐ์ ๋ชจ๋ ์ํฅ์ ์ง์คํด์ผ ํ๋ฉฐ, model๊ณผ controller๋ ๋น์ง๋์ค ๋ก์ง์ ๊ด๋ จ์ด ์๊ฑฐ๋ ๋ด๋ถ์ ์ธ ๊ฒ์ ์ฒ๋ฆฌํ๋๋ฐ ์ง์คํ๋ค. (์ถ์ฒ:easy00.log)
์ฆ, view๋ ํ๋ฉด๊ณผ ๊ด๋ จ๋ ์ผ๋ง, ๋น์ฆ๋์ค ๋ก์ง๊ณผ ์๋ฒ ๋ท๋จ์ ๊ด๋ จ๋ ๊ฑฐ๋ controller๋ ๋ท๋จ ๋น์ฆ๋์ค ๋ก์ง์์ ๋ค ์ฒ๋ฆฌํ๊ณ , model์๋ค๊ฐ ๊ด๋ จ๋ ํ๋ฉด์์ ํ์ํ ๊ฑฐ๋ฅผ ๋ด์์ ํ๋ฉด์ ๋๊ฒจ์ฃผ๋ ํจํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
@GetMapping("hello-mvc") //์น ๋ธ๋ผ์ฐ์ ์ ์น ๋ /hello-mvc๋ก ๋ค์ด์ค๋ ๊ฒ
public String helloMvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
์์ ๊ฐ์ ๋ด์ฉ์ ์ถ๊ฐํด ์ฃผ์๋ค.๋ localhost::8080/hello-mvc ๋ก ๋ค์ด๊ฐ๋ฉด helloMvc๋ผ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ฒ ๋๊ณ , ์ด ๋ name์ด๋ผ๋ ์ด๋ฆ์ param์ ๋ฐ์ attribute์ "name"์ param์ผ๋ก ๋ฐ์ ๊ฐ์ model์ ๋ฃ์ด hello-template์ returnํด์ฃผ๋ ๊ฒ์ ์๋ฏธํ๋ค.
main/resources/templates ํด๋ ์์ return ๊ฐ๊ณผ ๋๊ฐ์ ์ด๋ฆ์ ํ์ผ hello-template.htmlํ์ผ์ ๋ง๋ค์ด์ฃผ๊ณ ,
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
์ ๋ฒ์๋ ${data}์๋ค๋ฉด ์ด๋ฒ์๋ ${name}์ผ๋ก ์์ฑํด์ค๋ค.
hello! empty๊ฐ ์๋ ์ด์ ๋ ์๋ฒ์์ด ๊ทธ๋ฅ html๋ง๋ค์ด์ ๋ณผ ๋ ์ฌ์ฉ๋๋ ๊ฒ์ผ๋ก,
์ค์ ์๋ฒ๋ฅผ ํ์ ๋๋ฉด 'hello ' +${name}์ผ๋ก ๊ฐ์ด ๋ฐ๋๊ฒ ๋๋ค.
์ด์ localhost:8080/hello-mvc๋ก ๋ค์ด๊ฐ๋ฉด ์ด์ ๊ฐ์ ์๋ฌ ํ์ด์ง๊ฐ ๋จ๋๋ฐ, ์ด๋ 2023-11-07 14:45:35.563 WARN 20544 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'name' for method parameter type String is not present] ์๋ฌ๋ฉ์ธ์ง์์ ๋ณผ ์ ์๋ฏ์ด Required๋ request parameter 'name'์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ ์์ ์ธ ํ๋ก์ ํธ๋ฅผ ์คํํ๋ ค๋ฉด name์ param๊ฐ์ ์ค์ผ ํ๋ค.
๋ฐ๋ผ์ ์๋์ localhost:8080/hello-mvc๊ฐ ์๋๋ผ, http://localhost:8080/hello-mvc?name=spring!!! ์ผ๋ก name=spring!!!์ด ๋ค๋ฅธ ๊ฐ์ ์ค์ผ ์ ๋๋ก ๋ ํ๋ฉด์ด ๋ฌ๋ค.
๐กMVC ๋์์๋ฆฌ
hello-mvc?name=spring!!! ์์ name์ param์ผ๋ก ๋ฐ์ spring!!! ์ด ์๋ ์ฝ๋์ ์๋ name์ ์๋ฆฌ์ ๋ค์ด๊ฐ๊ณ , ์ด ๊ฐ๋ค์ด Model์ ๋ด๊ฒจ hello-template๋ก ๋์ด๊ฐ๋ค.
๊ทธ๋ฌ๋ฉด template์์ Model์ Key ๊ฐ์ด name์ธ ๊ฒ์ ์ฐพ์, ๊ทธ value๊ฐ์ ${name} ์ ์นํ์ ํด์ฃผ๋ฉด ๊ทธ ์๋ฆฌ์ spring!!! ์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค. (์ถ์ฒ:easy00.log)
๋จผ์ , ์น ๋ธ๋ผ์ฐ์ ์์ "localhost:8080/hello-mvc" ์ฃผ์๋ฅผ ์์ฒญํ๋ฉด ๋ด์ฅ ํฐ์บฃ ์๋ฒ๊ฐ ์์ฒญ์ ๋จผ์ ์ฒ๋ฆฌํ๋ค. ๋ด์ฅ ํฐ์บฃ ์๋ฒ๋ ์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๊ธฐ ์ํ ์น ์๋ฒ ์ญํ ์ ํ๋ค. ์ด ์๋ฒ๋ "hello-mvc" ๊ฒฝ๋ก๋ก ๋ค์ด์จ ์์ฒญ์ ์คํ๋ง ํ๋ ์์ํฌ์๊ฒ ์ ๋ฌํ๋ค.
์คํ๋ง ํ๋ ์์ํฌ๋ ํด๋น ์์ฒญ์ ์ฒ๋ฆฌํ ์ปจํธ๋กค๋ฌ(Controller)๋ฅผ ์ฐพ์์ ์คํํ๋ค. ์ด ๊ฒฝ์ฐ, "helloController"๋ผ๋ ์ปจํธ๋กค๋ฌ์ ๋งคํ(mapping)๋์ด ์๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
"helloController"์ ๋ฉ์๋๊ฐ ์คํ๋๋ฉด, ํด๋น ๋ฉ์๋์์๋ "hello-template"๋ผ๋ ๋ทฐ(View)๋ฅผ ๋ฐํํ๋ค. ๋ทฐ๋ ์ฌ์ฉ์์๊ฒ ํ์ํ ๋ด์ฉ์ ์์ฑํ๋๋ฐ ์ฌ์ฉ๋๋ฉฐ, ์ด ๊ฒฝ์ฐ "hello-template"์ ํ
ํ๋ฆฟ ์์ง์ผ๋ก ์ฒ๋ฆฌ๋๋ค.
์คํ๋ง ๋ถํธ๋ ํ
ํ๋ฆฟ ์์ง(์: Thymeleaf)์ ์ฌ์ฉํ์ฌ "hello-template"์ ๋ ๋๋งํ๋ค. ํ
ํ๋ฆฟ ์์ง์ ๋์ ๋ฐ์ดํฐ๋ฅผ HTML๋ก ๋ณํํ๋ ์ญํ ์ ํ๋ฉฐ, ์ด ๊ฒฝ์ฐ ๋ชจ๋ธ(Model)์ "name"์ด๋ผ๋ ํค(key)์ ๊ฐ(value)์ธ "spring!!"์ ์ ๋ฌํ๋ค.
ํ
ํ๋ฆฟ ์์ง์ ๋ชจ๋ธ์ ๋ฐ์ดํฐ๋ฅผ "hello-template"์ ์ฝ์
ํ๊ณ , ์ต์ข
์ ์ผ๋ก HTML์ ์์ฑํ๋ค. ๊ทธ๋ฆฌ๊ณ ์คํ๋ง ๋ถํธ๋ ์ด HTML์ ์น ๋ธ๋ผ์ฐ์ ์ ๋ฐํํ๋ฉฐ, ์น ๋ธ๋ผ์ฐ์ ๋ ํด๋น HTML์ ๋ ๋๋งํ์ฌ ์ฌ์ฉ์์๊ฒ ํ์ํ๋ค.
๐กAPI
์ ์ ์ปจํ ์ธ ๋ฅผ ์ ์ธํ๊ณ ๋ html๋ก ๋ด๋ฆฌ๋(MVC๋ฐฉ๋ฒ), API๋ผ๋ ๋ฐฉ์์ผ๋ก data๋ฅผ ๋ฐ๋ก ๋ด๋ฆฌ๋(API) ์ด๋ ๊ฒ ๋ ๊ฐ์ง์ ๋ฐฉ๋ฒ์ด ์๋ค.
API๋ json์ด๋ผ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ ํฌ๋ฉง์ผ๋ก ํด๋ผ์ด์ธํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ์์ด๋ค. ์๋ฒ๋ผ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ API๋ฐฉ์์ ์ฌ์ฉํ๋ค.
๊ธฐ์กด HelloController์
@GetMapping("hello-string")
@ResponseBody //http์ body๋ถ์ "hello" + name; ์ด ๋ฐ์ดํฐ๋ฅผ ์ง์ ๋ฃ์ด์ฃผ๊ฒ ๋ค
public String helloString(@RequestParam("name") String name){
return "hello" + name; // String name์์ name์ spring์ ๋ฃ์ผ๋ฉด "hello spring"์ผ๋ก ๋ฐ๋
//๋ฌธ์๊ฐ ์์ฒญํ client์ ๊ทธ๋ฅ ๋ด๋ ค๊ฐ (view ์ด๋ฐ๊ฒ ์์)
}
์ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด, name์ด๋ผ๋ ์ด๋ฆ์ผ๋ก param์ ๋ฐ์์ ๋ฐ์ ๊ฐ์ ๊ทธ๋๋ก returnํด์ค๋ค. ๋ฐ์ name๊ฐ์ด ๊ทธ๋๋ก ์๋ฒ์ ์ ๋ฌ๋๊ณ , http body์ name๊ฐ์ด ์ง์ ๋ค์ด๊ฐ๋ ๊ฒ์ด๋ค.
์ด์ ์ template์์ง์ ํ๋ฉด์ ๊ฐ์ง๊ณ view๋ผ๋ template์ ์กฐ์ํ๋ ๋ฐฉ์์ด๋ผ๋ฉด, api๋ data๋ฅผ ๊ทธ๋๋ก ๋ด๋ ค์ฃผ๋ ๋ฐฉ์์ด๋ค.
http://localhost:8080/hello-string?name=spring!!! ์ ๋ค์ด๊ฐ๋ฉด ์์ ๊ฐ์ ํ๋ฉด์ด ๋ฌ๋ค.
๐กAPI (JSON ๋ฐฉ์)
์ด๋ฒ์ key, value๋ก ์ด๋ฃจ์ด์ง JSON๋ฐฉ์์ ์ฌ์ฉํด ๋ณผ ๊ฒ์ด๋ค. (์ต๊ทผ์๋ JSON๋ฐฉ์์ผ๋ก ํต์ผ์ด ๋จ)
HelloContoller์
@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;
}
}
์ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด
hello-api๊ฐ @GetMapping์ผ๋ก ๋งคํ๋์ด ์์ด ์น์ localhost:8080/hello-api์ ์น๋ฉด ํด๋น ๋ฉ์๋ ํธ์ถํ๊ฒ ๋๊ณ ,
@ResponseBody๋ ์ง์ http์ body์ data๋ฅผ ๋ฃ์ด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฒ์ ์์ ๋ฌ๋ฆฌ JSON๋ฐฉ์์ด๋ฏ๋ก JSON๋ฐฉ์์ผ๋ก data๋ฅผ ๋๊ฒจ์ฃผ๊ธฐ ์ํด hello๋ผ๋ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ฃผ์๊ณ , ๊ทธ ๊ฐ์ฒด์ ๊ฐ์ ๋ฃ์ด returnํด์ฃผ์๋ค.
http://localhost:8080/hello-api?name=spring!!! ์ ์น๋ฉด ์์ ๊ฐ์ ํ๋ฉด์ด ๋ฌ๋ค.
{"key":"value"} ์ฒ๋ผ JSON ํ์์ผ๋ก data๊ฐ ์น ๋ธ๋ผ์ฐ์ ์ ๋ด๋ ค๊ฐ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๐กAPI ๋์์๋ฆฌ
์น ๋ธ๋ผ์ฐ์ ์ localhost:8080/hello-api๋ฅผ ํ์ดํํ๋ฉด ๋ด์ฅ ํฐ์ผ ์๋ฒ์์ hello-api๋ฅผ spring์ผ๋ก ๋ณด๋ด์ค๋ค. spring์ hello-api๊ฐ mapping ๋์ด ์๋ ๊ฒ์ ํ์ธํ๊ณ ๋ํ ๊ฑฐ๊ธฐ์ @ResponseBody๊ฐ ์์ด http ์๋ต์ data๋ฅผ ๊ทธ๋๋ก ๋๊ฒจ์ฃผ๋ ๋์์ ํ๊ฒ ๋๋ค.
๊ทธ๋ฌ๋ ๋ฐ๋ก ์ ํ๋ก์ ํธ์์๋ ๊ฐ์ฒด๋ฅผ ๋๊ฒจ์ฃผ๊ธฐ ๋๋ฌธ์ data ๊ทธ๋๋ก๊ฐ ์๋ JSON ๋ฐฉ์์ผ๋ก ๋ง๋ค์ด์ http ์๋ต์ ๋ฐํ์ ํด์ผํ๋ค.
์ฆ, @ResponseBody๊ฐ ์์ผ๋ฉด HttpMessageConverter๊ฐ ๋์์ ํ๊ณ , ๊ฐ์ฒด๊ฐ return ๋๊ธฐ ๋๋ฌธ์ JsonConverter๊ฐ ๋์ํ๊ฒ ๋์ด ๊ฐ์ฒด๋ฅผ JSON ํํ๋ก ๋ฐ๊พธ๊ฒ ๋์ด JSON ํํ๋ก ์๋ต์ ํ๊ฒ ๋๋ค. (์ถ์ฒ:easy00.log)
์ฆ, @ResponseBody๊ฐ ์์ผ๋ฉด viewResolverํํ ๋์ง๋ ๊ฒ์ด ์๋๋ผ, ๊ทธ๋๋ก http์๋ต์ data๋ฅผ ๋๊ธด๋ค.
๋ฌธ์๊ฐ ์๋๊ณ ๊ฐ์ฒด์ผ ๋, return๊ฐ์ ๋ฐ๋ก ๋ฃ๋ ๊ฒ์ด ์๋๋ผ JSON๋ฐฉ์์ผ๋ก data๋ฅผ ๋ง๋ค์ด์ http์๋ต์ ๋ฐํํ๋ค.
@ResponseBody๋ผ๊ณ ์ค๋ฉด, HttpMessageConverter๊ฐ ๋์ํด์ ๋ฌธ์์ผ ๋ StringConverter, ๊ฐ์ฒด์ผ ๋ JsonConverter๊ฐ ๊ธฐ๋ณธ์ผ๋ก ๋์ํ๋ค. ๊ฐ์ฒด์ผ ๋ ๊ฐ์ฒด๋ฅผ ๋ฌธ์๋ก ๋ฐ๊ฟ์ ๋ฐํํด์ผํ๋ฏ๋ก ๊ฐ์ฒด๋ฅผ Json์คํ์ผ๋ก ๋ฐ๊ฟ์ ์น๋ธ๋ผ์ฐ์ ํํ ๋ณด๋ด์ค๋ค.
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- Total
- Today
- Yesterday
- ์๋ฐ ์คํ๋ง
- ์๋ฐ
- ์คํ๋ง ์ปค๋ฎค๋ํฐ
- ์คํ๋ง๋ถํธ
- ์ธํ ๋ฆฌ์ ์ด
- ์คํ๋ง
- SQLD
- ์์
- ์นMVC
- ๋ก๊ทธ์์
- ํ์ด์ฌ
- EnumType.ORDINAL
- ์ปค๋ฎค๋ํฐ
- ๋น์์
- elasticsearch
- ํ์ํํด
- ํ๋ก ํธ์๋
- ๋ก๊น
- JPA
- ์ค์์
- SQL
- ๋ฐฑ์ค
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
- SQL ๋ ๋ฒจ์
- ์ง์ฐ๋ก๋ฉ
- ๋ฐฑ์ค ํ์ด์ฌ
- ์คํ๋ง ๋ถ๋งํฌ
- ๋ถ๋งํฌ
- DP
- ์น MVC
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |