[Spring Intro] Section 05. ํ์๊ด๋ฆฌ ์์ - ์น MVC ๊ฐ๋ฐ(ํ์ ์น ๊ธฐ๋ฅ, ํ ํ๋ฉด ์ถ๊ฐ, ๋ฑ๋ก, ์กฐํ)
ํ์ ์น ๊ธฐ๋ฅ - ํ ํ๋ฉด ์ถ๊ฐ
# HomeController
java/hello/hellospring/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";
}
}
> @GetMapping("/")์์ "/"๋ ๊ฐ์ฅ ์ฒ์์ ๋๋ฉ์ธ(localhost:8080)์ ์๋ฏธํ๋ค.
> home() ๋ฉ์๋๋ฅผ ํตํด home.html์ด ํธ์ถ๋๋ค.
# Home
resources/templates/home.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<div class="container">
<div>
<h1>Hello Spring</h1> <p>ํ์ ๊ธฐ๋ฅ</p>
<p>
<a href="/members/new">ํ์ ๊ฐ์
</a> <a href="/members">ํ์ ๋ชฉ๋ก</a>
</p>
</div>
</div> <!-- /container -->
</body>
</html>
# ์คํ

# ์ static์ index.html ํ๋ฉด์ด ๋จ์ง ์๋์?
์ง๋ ํฌ์คํ
์ฐธ๊ณ
> Section 02. ์คํ๋ง ์น ๊ฐ๋ฐ ๊ธฐ์ด - ์ ์ ์ปจํ
์ธ , MVC์ ํ
ํ๋ฆฟ ์์ง, API
๋ด์ฅ ํฐ์บฃ ์๋ฒ์์๋ ์คํ๋ง ์ปจํ ์ด๋์์ ๊ด๋ จ ์ปจํธ๋กค๋ฌ๊ฐ ์๋์ง ๋จผ์ ์ฐพ๊ณ , ์๋ค๋ฉด static ํ์ผ์ ์ฐพ๋๋ก ํ๋ค.
ํ์ฌ HomeController์์ ๋งคํ๋ home ํ๋ฉด์ด ์๊ธฐ ๋๋ฌธ์ ํด๋น ํ๋ฉด์ ํธ์ถํ๊ณ ๋๋๋ ๊ฒ์ด๋ค.
์ฆ, ์ปจํธ๋กค๋ฌ๊ฐ ์ ์ ํ์ผ๋ณด๋ค ์ฐ์ ์์๊ฐ ๋๊ธฐ ๋๋ฌธ์ home.html ํ๋ฉด์ด ๋ํ๋๋ ๊ฒ
ํ์ ์น ๊ธฐ๋ฅ - ๋ฑ๋ก
ํ์ ๋ฑ๋ก ํผ ๊ฐ๋ฐ
# ํ์ ๋ฑ๋ก ํผ ์ปจํธ๋กค๋ฌ
java/hello/hellospring/controller/MemberController.java
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
@GetMapping(value = "/members/new")
public String createForm() {
return "members/createMemberForm";
}
}
# ํ์ ๋ฑ๋ก ํผ HTML
resources/templates/members/createMemberForm.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<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> <!-- /container -->
</body>
</html>
ํ์ ๋ฑ๋ก ์ปจํธ๋กค๋ฌ
# ์น ๋ฑ๋ก ํ๋ฉด์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ ๋ฐ์ ํผ ๊ฐ์ฒด
java/hello/hellospring/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;
}
}
# ํ์ ์ปจํธ๋กค๋ฌ์์ ํ์์ ์ค์ ๋ฑ๋กํ๋ ๊ธฐ๋ฅ
java/hello/hellospring/controller/MemberController.java์ ์๋ ์ฝ๋ ์ถ๊ฐ
@PostMapping("/members/new")
public String create(MemberForm form) {
Member member = new Member();
member.setName(form.getName());
memberService.join(member);
return "redirect:/";
}
# ์คํ
์ด์ ํ๋ฉด์์ ํ์๊ฐ์ ์ ๋๋ฅด๋ฉด ์ ํ๋ฉด(/members/new)์ผ๋ก ์ด๋ํ๋ค.
์ด๋ฆ์ spring ์ ๋ ฅ ํ ๋ฑ๋ก์ ๋๋ ์ ๋ ๋ค์ ์ด์ ํ๋ฉด์ผ๋ก ๋์์ค๋ฉด ์ฑ๊ณต์ด๋ค.
ํ์ ๋ฑ๋ก ์๋ฆฌ
์ ํ๋ฉด(http://localhost:8080/members/new) ์ ์, GET ๋ฐฉ์
GET ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ memberController - createForm ๋ฉ์๋ ํธ์ถ
return์ ์ํด templates > members > createMemberForm์ผ๋ก ์ด๋
viewResolver์ ์ํด createMemberForm์ด ์ ํ๋์ด thymeleaf ํ ํ๋ฆฟ ์์ง์ด ๋ ๋๋งํ๋ฉฐ html์ด ํ๋ฉด์ ๋ฟ๋ ค์ง
์ด๋ ๊ฐ์ ์ ๋ ฅํ ์ ์๋ form ํ๊ทธ ๋ด์ input ํ๊ทธ๋ฅผ ํ์ธํด๋ณด๋ฉด, name="name" ๋ถ๋ถ์ ํ์ธํ ์ ์๋ค.
์ name์ ๋ด๊ฐ ์ ๋ ฅํ ์ด๋ฆ์ธ "spring"์ด ์ ์ฅ๋๋ฉฐ,
๋ฑ๋ก ๋ฒํผ์ ๋๋ฅด๋ฉด <form action="/members/new" method="post">์ ์ํด
action์ ์ ํ url(/members/new)์ Post ๋ฐฉ์์ผ๋ก ์ ๋ ฅํ name์ด ๋์ด๊ฐ๊ฒ ๋๋ค.
Post ๋ฐฉ์์ผ๋ก ๋๊ฒผ๊ธฐ ๋๋ฌธ์, memberController - create ๋ฉ์๋ ํธ์ถ
create์ ๋งค๊ฐ๋ณ์ MemberForm์ผ๋ก ์ด๋
MemberForm์๋ private String์ผ๋ก name์ด ์ ์ธ๋์ด ์๋ค.
์ฌ๊ธฐ์ setName์ ํตํด ์๊น ๋๊ฒจ์ค name์ธ "spring"์ด ์ ์ฅ๋๋ค.
์ดํ getName์ ํตํด ๋ด๊ฐ ์ค์ ํ ์ด๋ฆ์ ์ ๊ทผํ๋ฉด ๋๋ค.
๋ค์ create ๋ฉ์๋๋ก ๋์์๋ณด๋ฉด member ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ,
form.getName()์ ํตํด ์ด๋ฆ์ ๋ถ๋ฌ์์ member ์ด๋ฆ์ ์ค์ ํ๋ค.
์ดํ memberService.join์ ๋งค๊ฐ๋ณ์์ ๋ฐฉ๊ธ ์์ฑํ member ๊ฐ์ฒด๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๊ฐ์ ์ด ์๋ฃ๋๋ค.
์ฃผ๋ก ์๋ ๋ฐฉ์์ผ๋ก GET/POST๋ฅผ ์ฌ์ฉํ๋ค.
๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋ : GET
๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ(๋ฑ๋ก)ํ ๋ : POST
ํ์ ์น ๊ธฐ๋ฅ - ์กฐํ
# ํ์ ์ปจํธ๋กค๋ฌ์์ ์กฐํ ๊ธฐ๋ฅ
java/hello/hellospring/controller/MemberController.java์ ์๋ ์ฝ๋ ์ถ๊ฐ
@GetMapping("/members")
public String list(Model model) {
List<Member> members = memberService.findMembers();
model.addAttribute("members", members);
return "members/memberList";
}
# ํ์ ๋ฆฌ์คํธ HTML
resources/templates/members/memberList.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<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> <!-- /container -->
</body>
</html>
# ์คํ

ํ๋ก์ ํธ ์ฌ์คํ ํ ํ์๊ฐ์ ์์ spring1, spring2๋ฅผ ๋ฑ๋กํด์ค๋ค.

ํ์ ๋ชฉ๋ก์ ๋ค์ด๊ฐ๋ณด๋ฉด ๋ฑ๋กํ spring1, spring2๊ฐ ์ ์์ ์ผ๋ก ํ์ธ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์๋ถํฐ thymeleaf๊ฐ ๋ณธ๊ฒฉ์ ์ผ๋ก ๋์ํ๋ค.
ํ์ด์ง ์์ค(์ข์ธก ์ด๋ฏธ์ง)๋ฅผ ํ์ธํด๋ณด๋ฉด ํ๊ทธ ๋ด๋ถ์ spring1, spring2๊ฐ ๋ ๋๋ง ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด๋ ํ ํ๋ฆฟ ์ธ์ด์์ ์์ค์ฝ๋(์ฐ์ธก ์ด๋ฏธ์ง)์ ${members}๋ฅผ ์ฝ์ด๋ค์ด๊ธฐ ๋๋ฌธ์ด๋ค.
${members}๋ ๋ชจ๋ธ ์์ ๊ฐ์ ๊บผ๋ธ๋ค๋ ์๋ฏธ์ด๋ค.
์ฐ๋ฆฌ๋ ์ด์ ์ MemberController์์ members(List)์ ๋ชจ๋ ํ์์ ์กฐํํด์ ์ ๋ถ ์ ์ฅํ๊ณ
model.addAttribute๋ฅผ ํตํด key์ธ "members"์ members ๋ฆฌ์คํธ๋ฅผ ๋ด์๋์๋ค.
์ด members๊ฐ ์ฐ์ธก ์ด๋ฏธ์ง์ ์์ค์ฝ๋์์ ์ฌ์ฉ๋๋ ๊ฒ์ด๋ค.
๋ค์ ์์ค์ฝ๋๋ก ๋์์๋ณด๋ฉด, thymeleaf ๋ฌธ๋ฒ์ธ each๋ฌธ์ ํตํด
members ๋ด๋ถ์ ํ์ ๊ฐ์ฒด๋ฅผ ํ๋์ฉ ๊บผ๋ด์ member์ ๋์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ th:text๋ฅผ ํตํด ๊ทธ member์ id์ name์ ํ๋์ฉ ์ถ๋ ฅํ๋ ๊ฒ์ด๋ค.
์ด๋, id์ name๋ private ํ๊ธฐ ๋๋ฌธ์ Property ๋ฐฉ์(Getter/Setter๋ฅผ ํตํ ์ ๊ทผ)์ผ๋ก ๊ฐ์ ธ์จ๋ค.
# ์ฃผ์ํ ์
์ฐ๋ฆฌ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์๋ฒ๋ฅผ ๋ค์ ์คํํ๋ฉด ์ ์ฌ์ง์ฒ๋ผ ๋ฐ์ดํฐ๊ฐ ์ ๋ถ ์ฌ๋ผ์ง๋ค.
์ค๋ฌด์์ ์ด๋ฐ ์ผ์ด ๋ฐ์ํ๋ฉด ํฐ์ผ๋๊ธฐ ๋๋ฌธ์(^^), ํ์ผ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค!
๋ด์ฉ ๋ฐ ์ด๋ฏธ์ง ์ถ์ฒ : ๊น์ํ์ ์คํ๋ง ์ ๋ฌธ