Bibi's DevLog ๐ค๐
[Spring] ์ธํ๋ฐ ์คํ๋ง ์ ๋ฌธ(๊น์ํ ๋) - ์น MVC ๊ฐ๋ฐ(ํ์๊ด๋ฆฌ ์์ ) : ํ์ ๋ฑ๋ก ๋ฐ ์กฐํ ๋ณธ๋ฌธ
[Spring] ์ธํ๋ฐ ์คํ๋ง ์ ๋ฌธ(๊น์ํ ๋) - ์น MVC ๊ฐ๋ฐ(ํ์๊ด๋ฆฌ ์์ ) : ํ์ ๋ฑ๋ก ๋ฐ ์กฐํ
๋น๋น bibi 2021. 3. 5. 00:01์ด ๊ธ์ ์ธํ๋ฐ ๊น์ํ ๋์ ์คํ๋ง ์ ๋ฌธ ๊ฐ์ ๋ฅผ ๋ฃ๊ณ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
ํ์ ๊ด๋ฆฌ ์์ - ์น MVC ๊ฐ๋ฐ
ํ์ ์น ๊ธฐ๋ฅ - ํ ํ๋ฉด ์ถ๊ฐ
์์ฃผ ๋จ์ํ 1.ํ์ ๋ฑ๋ก ๋ฐ 2.ํ์ ์กฐํ ๊ธฐ๋ฅ์ ํ๋ ํ๋ฉด์ ๋ง๋ค์ด ๋ณธ๋ค.
@GetMapping("/")
: URL์์/
๋ ๋๋ฉ์ธ์ผ๋ก ์ฒ์ ๋ค์ด์์ ๋์ ํ์ด์ง๋ฅผ ๋งํจ. (ํ ํ์ด์ง)index.html
๊ณผ์ ์ฐจ์ด๋?? (src/main/java/resources/static/index.html
)(๋ณต์ต) ์น ๋ธ๋ผ์ฐ์ ์์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด, ํฐ์บฃ ์๋ฒ๋ ์คํ๋ง ์ปจํ ์ด๋์์ ๊ด๋ จ ์ปจํธ๋กค๋ฌ๋ฅผ ๋จผ์ ์ฐพ๊ณ , ๊ด๋ จ ์ปจํธ๋กค๋ฌ๊ฐ ์์ผ๋ฉด ๊ทธ ๋ staticํด๋๋ฅผ ์ฐพ๋๋ค. ๊ทธ๋์ static์ ์๋
index.html
๋ณด๋ค@GetMapping("/")
์ด ๋จผ์ ์ฐพ์์ง๋ค.
@GetMapping()
๋ฉ์๋์ ๋ฆฌํด๊ฐ์src/main/java/resources/templates
์์ ์ฐพ๋๋ค.
src/main/java/ํ๋ก์ ํธ๋ช
/controller/HomeController.java
package hello.hellospring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@GetMapping("/")
public String home() {
return "home";
}
}
src/main/java/resource/templates/home.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div class="container">
<div>
<h1>Hello Spring</h1>
<p>ํ์ ๊ธฐ๋ฅ</p>
<p>
<a href="/members/new">ํ์ ๊ฐ์
</a>
<a href="/members">ํ์ ๋ชฉ๋ก</a>
</p>
</div>
</div>
</body>
</html>
ํ์ ์น ๊ธฐ๋ฅ - ๋ฑ๋ก
์ด์ ์ ๋ง๋ค์ด ๋ MemberController๋ฅผ ํ์ฉํด ๋ง๋ ๋ค.
home.html
์ ์ฐ๊ฒฐํด ๋ ํ์๊ฐ์
url์ธ /members/new
ํ๋ฉด์ ๋ง๋ค๊ณ ๋์ํ๊ฒ ํ๋ค.
MemberController.java
์๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ค.
@GetMapping("/members/new")
public String createForm() {
return "members/createMemberForm";
}
members/createMemberForm
์ด๋ฐ url์src/main/java/resources/templates
์์๋ถํฐ์ ๊ฒฝ๋ก๋ก ์๊ฐํ๋ฉด ๋๋ค.- ์ฆ
templates
๋๋ ํ ๋ฆฌ์members
๋ผ๋ ํ์ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ํ์ ๋๋ ํ ๋ฆฌ ์์createMemberForm.html
์ ๋ง๋ค๋ฉด ๋ฆฌํด์ ํด๋น htmlํ์ผ๋ก ์ฐ๊ฒฐ๋๋ค.
- ์ฆ
createMemberForm.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div class="container">
<form action="/members/new" method="post">
<div class="form-group">
<label for="name">์ด๋ฆ</label>
<input type="text" id="name" name="name" placeholder="์ด๋ฆ์ ์
๋ ฅํ์ธ์">
</div>
<button type="submit">๋ฑ๋ก</button>
</form>
</div>
</body>
</html>
<form action="/members/new" method="post">
<form>
์ ๊ฐ์ ์ ๋ ฅํ ์ ์๋ htmlํ๊ทธaction="/members/new" method="post"
<input type="text" id="name" name="name" placeholder="์ด๋ฆ์ ์ ๋ ฅํ์ธ์">
์ฌ๊ธฐ์์
name="name"
์ด ์๋ฒ์ ๋์ด์ฌ ๋์ ํคkey๊ฐ ๋๋ค.
๋ฑ๋ก ๋ฒํผ์ ๋๋ฅด๋ฉด
action="/members/new" method="post"
์ ๋ฐ๋ผ,/members/new
URL๋ก POST๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๋์ด๊ฐ๋ค.- ๋ฐ์ดํฐ๋
@PostMapping("/members/new")
๋ก ๋์ด๊ฐ๋ค. (์๋ ์ฐธ๊ณ )
ํ์์ ๋ฑ๋กํ๋ ์ปจํธ๋กค๋ฌ MemberForm.java
๋ฅผ src/main/java/ํ๋ก์ ํธ๋ช
/controller
์ ๋ง๋ ๋ค
MemberForm.java
package hello.hellospring.controller;
public class MemberForm {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
MemberController.java
์๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ค
@PostMapping("/members/new")
public String create(MemberForm form) {
Member member = new Member();
member.setName(form.getName());
memberService.join(member);
return "redirect:/";
}
return "redirect:/";
: ํด๋น ๋ฉ์๋๊ฐ ๋๋๋ฉดredirect:
์ดํ๋ก ์ฐ๊ฒฐํด ์ค. ์ฌ๊ธฐ์๋/
์ด๋ฏ๋ก ํ ํ๋ฉด์ผ๋ก ๋์๊ฐ.@PostMapping()
(POST๋ฐฉ์) : ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ(๋ฑ๋ก)ํ ๋ ์ฌ์ฉํจ.@GetMapping()
(GET ๋ฐฉ์) : ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋ ์ฌ์ฉํจ. URL์ ์ง์ ์ ๋ ฅ์ ํตํด ๋์.์ฆ URL์ ๊ฐ์ง๋ง GET / POST ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋งตํํ ์ ์๋ค.
- ViewResolver(๋ทฐ ๋ฆฌ์กธ๋ฒ)๊ฐ ๋ฆฌํด ๊ฐ์ templates์์ ์ฐพ์ ํด๋น htmlํ์ผ์ ์ ํํ๊ณ , Thymeleaf ํ ํ๋ฆฟ์์ง์ด ํ์ผ์ ๋ ๋๋งํ๋ค. ์ฆ ํ๋ฉด์ html์ด ๋ฟ๋ ค์ง๋ค.
action="/members/new" method="post"
์ ๋ฐ๋ผ ๋์ด์จ ๋ฐ์ดํฐname="name"
์ ,create(MemberForm form)
์์ MemberForm๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋์ ์ธ์คํด์ค๋ณ์private String name;
์ผ๋ก ์ง์ ๋๋ค (์คํ๋ง์ดsetName(String name)
์ ํตํดname="name"
์ ๋งตํํด์ค๋ค)
HTML GET / POST ๋ฐฉ์ ๋ฐ <form>
ํ๊ทธ์ ๋ํด ๋ ๊ฒ์ ๋ฐ ๊ณต๋ถํด๋ณด๋ฉด ์ดํด๊ฐ ๋ ๊ฒ์ด๋ค.
ํ์ ์น ๊ธฐ๋ฅ - ์กฐํ
์ด์ ํ์ ๋ชฉ๋ก์ ์กฐํํ๋ ๊ธฐ๋ฅ๋ง ๊ตฌํํ๋ฉด ๋๋ค.
MemberController.java
์๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ค.
@GetMapping("/members")
public String list(Model model) {
List<Member> members = memberService.findMembers();
model.addAttribute("members", members); // ํค "members", ๊ฐ members๋ก Model์ ์ ์ฅ
return "members/memberList";
}
memberList.html
(src/main/java/resources/templates
์ ์์ฑ)
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div class="container">
<div>
<table>
<thead>
<tr>
<th>#</th>
<th>์ด๋ฆ</th>
</tr>
</thead>
<tbody>
<tr th:each="member : ${members}">
<td th:text="${member.id}"></td>
<td th:text="${member.name}"></td>
</tr>
</tbody>
</table>
</div>
</div>
</body>
</html>
th
: thymeleaf ํ
ํ๋ฆฟ์์ง์ ์ฌ์ฉํ๋ ๋ถ๋ถ.
ํ ํ๋ฆฟ์์ง์ ์ญํ ์ ๋ ๋๋ง์ด๋ค.
<tr th:each="member : ${members}">
<td th:text="${member.id}"></td>
<td th:text="${member.name}"></td>
</tr>
th:each="member : ${members}"
์์..th:each
๋ Thymeleaf์ ๋ฐ๋ณต๋ฌธ ๋ฌธ๋ฒ์ด๋ค. ๋ฃจํ๋ฅผ ๋๋ฉฐ ํด๋น ํ๊ทธ ๋ด์ ํ๊ทธ๋ค์ ์คํํ๋ค.member
๋ ๋ฐ๋ณต๋๋ ๊ฐ์ฒด ํ๋์ ๋ํ ์์๋ณ์๋ช ์ด๋ค.${members}
๋ Model์์members
๋ผ๋ ํค๋ฅผ ๊ฐ์ง๋ ๊ฐ์ ์ฐพ์ ๊ฐ์ง๊ณ ์จ๋ค.MemberController.java
์์model.addAttribute("members", members);
๋ก members(List)๋ฅผ ์ ์ฅํด ๋์๊ธฐ ๋๋ฌธ์ ๋ถ๋ฌ์ฌ ์ ์๋ ๊ฒ.
th:text="${member.id}"
,th:text="${member.name}"
th:each
์ ์์๋ณ์member
์id
์name
์ ๊ฐ๊ฐ ๋ถ๋ฌ์จ๋ค.id
์name
์ private์ธ๋ฐ ์ด๋ป๊ฒ ๊ฐ์ ธ์๋๊ฐ?: Memberํด๋์ค์ ์ ์๋ getter, setter์ ์ ๊ทผํด ๊ฐ์ ๊ฐ์ ธ์จ ๊ฒ์ด๋ค. (์ด๋ฅผ 'ํ๋กํผํฐ๋ฐฉ์์ ์ ๊ทผ'์ด๋ผ๊ณ ํ๋ค)
์ฌ๊ธฐ๊น์ง ์ ๋์์ง๋ง, ํ์ฌ ๋ฐ์ดํฐ๋ค์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ ์คํ๋ง ์๋ฒ๋ฅผ ๋๋ฉด ํ์ ๋ฐ์ดํฐ๊ฐ ๋ค ์ฌ๋ผ์ง๋ค.
์ด์ ํ์ผ์ด๋ DB์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด์ผ ํ๋ค.
๋ค์ ์๊ฐ์ ์คํ๋ง ๋ฐ์ดํฐ ์์ธ์ค (๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ)์ ๋ํด ๋ฐฐ์ ๋ณผ ๊ฒ์ด๋ค.