2021. 8. 14. 08:00ใBack-End ์์ ์ค/Spring Framework
์๋ ํ์ธ์? ์ฃผ๋ํ๋ ์ ๋๋ค.
์ค๋์ ํ์์ด๋ผ๋ Key word๋ก ๋ฑ๋ก๊ณผ ๋ชฉ๋ก ๋ณด๊ธฐ๋ฅผํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ณต๋ถ ํด ๋ณด๋๋ก ํ ๊ฒ์ด์์.
๋ฐ๋ก ์์ ํด ๋ณด๊ฒ ์ต๋๋ค!
์ฝ๋์ ๊ด๋ จํ ๋ด์ฉ์ ์ฃผ๋ํ๋์ Github์์ ํ์ธ ํ์ค ์ ์์ต๋๋ค!
๐ ๋ชฉ์ฐจ
01.[Spring Boot] thymeleaf์ Spring Boot
02.[Spring Boot] Spring Web ๊ฐ๋ฐ ๊ธฐ์ด
03.[Spring Boot] ํ์ ๊ด๋ฆฌ ์์ - Backend
04.[Spring Boot] Service ๊ฐ๋ฐ ๋ฐ Test Case ์์ฑ
05.[Spring Boot] Spring Bean๊ณผ ์์กด๊ด๊ณ
06.[Spring Boot] Java Code๋ก ์ง์ Spring Bean ๋ฑ๋ก
07.[Spring Boot] ๋ฑ๋ก, ๋ชฉ๋ก ๋ณด๊ธฐ ๊ตฌํํ๊ธฐ
08.[Spring Boot] ๊ธฐ์กด ์ฝ๋ ์ ์๋๊ณ , ์ค์ ์ผ๋ก ๊ตฌํ Class ๋ณ๊ฒฝ
09.[Spring Boot] ํตํฉ Test
10.[Spring Boot] JPA
11.[Spring Boot] Spring Data JPA
12.[Spring Boot] AOP
๐ ํ์ ๋ฑ๋ก
๐ ํ์ ๋ฑ๋ก Form Controller
MemberCopntroller.java
package hello.hellospring.controller;
import hello.hellospring.domain.Member;
import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import java.util.List;
// ์ปดํฌ๋ํธ ์ค์บ ๋ฐฉ์์ Controller
@Controller // ์ด ์ด๋
ธํ
์ด์
์ ์คํ๋ง์ด ๋ณด๊ณ , ํด๋น Controller Class๋ฅผ ๊ฐ์ฒด๋ก ๋ง๋ ๋ค ์คํ๋ง์ด ๊ฐ์ง๊ณ ์๋๋ค.
// ๊ทธ๊ฒ์ ์คํ๋ง ์ปจํ
์ด๋์์ ๋น์ผ๋ก ๊ด๋ฆฌ ๋๋ค๊ณ ํํํ๋ค.
public class MemberController {
// ์๋์ ๊ฐ์ด MemberService๋ฅผ new๋ฅผ ํตํด ์์ฑํ๊ฒ ๋๋ฉด ๋ค๋ฅธ Controller์์๋ ์ ๊ทผ์ด ๊ฐ๋ฅํ ๋ฌธ์
// private final MemberService memberService = new MemberService();
private final MemberService memberService;
// Dependency Injection (DI)
// @controller๊ฐ ์๋ Controller ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋, @Autowired๊ฐ ๋ถ์ ์์ฑ์๋ ์คํ๋ง์ด ์ปจํ
์ด๋์์ ๋น์ผ๋ก ๊ด๋ฆฌํ ๋, ์์ฑ์๋ฅผ ํธ์ถํ๋๋ฐ, ์ด ๋ MemberService๋ฅผ ๋ฃ์ด์ค๋ค.
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
} // ์์ฑ์ () ๋
@GetMapping("/members/new")
public String createForm() {
return "members/createMemberForm";
} // createForm() ๋
} // Class ๋
@GetMapping์ Client๊ฐ '/members/new'๋ผ๋ URI๋ฅผ ํตํด ์ ๊ทผ์ ํ๋ฉด Mapping์ ์์ผ์ฃผ๋ ๊ฒ์ด๊ณ ,
๊ทธ ํ์์ Method๋ฅผ ํธ์ถํด ์ฃผ๋ ๊ฒ์ด์์.
createForm Method๋ ๋ฐํ์ผ๋ก members ๋ฐ์ createMemberForm.html๋ก ๋ณด๋ด์ฃผ๊ฒ ๋ฉ๋๋ค.
๐ ํ์ ๋ฑ๋ก Form View
createMemberForm.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>์ฃผ๋ํ๋์ Spring Boot Study</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> <!--- /container --->
</body>
</html>
์ด ๊ณณ์์๋ thymeleaf๋ผ๋ ๊ฒ์ ์ฌ์ฉํ๊ณ ์๊ณ , xmlns๋ฅผ ํตํด thymeleaf๋ฅผ th๋ก Mapping ๋ฐ ๋ฑ๋ก์ ํ์ฌ ์ค ๊ฒ์ด์์.
input Tag์์ name์ ์ ๋ ฅํ๊ฒ ๋๋ฉด form์ Action์ ์ํด ํด๋น ์ ๋ ฅ๊ฐ์ด /member/new๋ก ์ ๋ฌ๋๊ฒ ๋๊ณ , http Method ์ค Post๋ก ์ ๋ฌ ๋๋ ๊ฒ์ด์์.
๐ ํ์ ๋ฑ๋ก Controller
๐ ์น ๋ฑ๋ก ํ๋ฉด์์ Data๋ฅผ ์ ๋ฌ ๋ฐ์ Form ๊ฐ์ฒด
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;
}
} // Class ๋
์์ createMemberForm.html์์ input Tag๋ก ์ ๋ฌ๋ Name๊ฐ์ ํด๋น Class์ ํ๋ ๋ณ์ name์ setter๋ฅผ ํตํด ์ฃผ์ ๋๊ฒ ๋๋ต๋๋ค!
๐ ํ์ Controller์์ ํ์์ ์ค์ ๋ฑ๋กํ๋ ๊ธฐ๋ฅ
MemberCopntroller.java
@PostMapping("/members/new")
public String create(MemberForm form) {
Member member = new Member();
member.setName(form.getName());
memberService.join(member);
// ํ์ ๊ฐ์
์ด ๋๋๋ฉด homeํ๋ฉด์ผ๋ก ๋ณด๋ด๊ธฐ
return "redirect:/";
} // create() ๋
์์์ ์ฃผ๋ํ๋์ createMemberForm.html์์ input Tag๋ฅผ ํตํด ์ ๋ฌ ๋ name์ด๋ผ๋ ๊ฐ์ด /members/new๋ก post ๋ฐฉ์์ผ๋ก ์ ๋ฌ ๋๋ค๊ณ ํ ๊ฒ์ด์์.
๊ทธ ๊ฐ์ @PostMapping์ ๋ณด๊ณ ๊ทธ URI์ ๋งค์นญ์ด ๋๋์ง ํ์ธ์ ํ๋ต๋๋ค.
๊ทธ๋ฐ ๋ค ํด๋น Method๊ฐ ํธ์ถ๋๊ฒ ๋๋ ๊ฒ์ด์์.
๋จผ์ ์ด Methodsms Member ๊ฐ์ฒด๋ฅผ ํ๋ ์์ฑํด์ setter๋ฅผ ํตํด ์ด๋ฆ์ ์ฃผ์ ํ๋๋ฐ, MemberForm์ด๋ผ๊ณ ๋ง๋ Class์ getter์ ์ ๋ ฅ๋ Name์ ๊ฐ์ ธ์์ ์ฃผ์ ์ ํ๋ ๊ฒ์ด์์.
๊ทธ๋ฐ ๋ค์ MemberService์ Join Method๋ฅผ ํธ์ถํ๋๋ฐ, ์ธ์๊ฐ์ผ๋ก Member ๊ฐ์ฒด (setter๋ฅผ ํตํด ์ ๋ฌ๋ name๊ฐ)์ ์ ๋ฌํ์ฌ ์์ ์ ์ํํ ๋ค redirect๋ฅผ ํตํด main Page๋ก ๊ฐ๋ผ๊ณ ์๋ ค์ฃผ๊ณ ์๋ ๊ฒ์ด์์.
์ฆ, ์์ ์ด ๋ค ๋๋๊ณ ๋ณด๋ฉด Main Page๋ก ์๋์ผ๋ก ์ด๋๋๊ฒ ํ ๊ฒ์ด๋๋๋ค.
๐ ํ์ ์กฐํ
๐ ํ์ Controller์์ ์กฐํ ๊ธฐ๋ฅ
MemberCopntroller.java
@GetMapping("/members")
public String list(Model model) {
List<Member> members = memberService.findMembers();
model.addAttribute("members", members);
return "members/memberList";
} // list () ๋
์์ Method๋ฅผ ๋ณด๋ฉด Get ๋ฐฉ์์ผ๋ก /members๋ผ๋ URI๋ฅผ ๊ฐ๊ณ ์ค๋ฉด ํด๋น Method list๋ก ์ค๊ฒ ๋๋ฉฐ, ์ต์ด List ํ์ด๋ฉฐ, ์๋ฃํ์ด Member์ธ members์ memberService์ findMembers Method์์ ์ฐพ์ ๊ฐ์ ๋ฃ์ด ์ฃผ๋ ๊ฒ์ด์์.
๊ทธ๋ผ ๋ชจ๋ ๊ฐ์ ๋ ํ์ ๋ชฉ๋ก์ด ๋ค์ด์ค๊ฒ ๋๊ฒ ์ง์?
๊ทธ๋ฐ ๋ค์ model.addAttribute๋ฅผ ํตํด View์ ์ ๋ฌํ ๊ฐ์ ์ง์ ํ๊ฒ ๋๋๋ฐ, "members"๋ Key๊ฐ ๋๊ณ , members๋ ๊ฐ์ด ๋๋ ๊ฒ์ด์์.
๐ก ์ฐธ๊ณ : Model์ด๋?
Model์ model attributes๋ฅผ ์ ์ฅํ๋ Interface. Model์ Attributes๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด ๊ณ ์๋์์ผ๋ฉฐ, Java.util.Map์ผ๋ก ๋ชจ๋ Model์ ์ ๊ทผ์ ํ์ฉ. ์ฃผ๋ก addAttribute Method๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ Model์ ์ ์ฅ.
Business Logic ๊ฒฐ๊ณผ๋ฅผ Client View์๊ฒ ์ ์กํ ๋ ์ฌ์ฉํ๋๊ฒ์ด ๋ฐ๋ก Model
๐ ํ์ List HTML
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>
model.addAttribute๋ฅผ ํตํด ์ ๋ฌ๋ ๊ฐ์ ${members}๋ฅผ ํตํด ๋ฐ์ ๊ฒ์ด์์.
Java์ For Each๋ฌธ๊ณผ ๊ฐ์ด ${members}์ ๋ด๊ธด ํ์ ๋ชฉ๋ก ์ ๋ณด๋ฅผ ํ๋์ฉ member์ ์ ๋ฌํด ์ฃผ๋ฉด์ ๋ฐ๋ณต์ด ๋๊ฒ ๋๊ณ ,
table์ member์ ๋ด๊ธด id์ name์ด text ํ์์ผ๋ก ๋ณด์ผ ์ ์๋๋ก ํด ์ค ๊ฒ์ด์์.
์ฃผ๋ํ๋์ ๊ธ์ด ๋ง์์ ๋์ จ๋์? ๊ตฌ๋ ๊ณผ ๊ณต๊ฐ! ๊ทธ๋ฆฌ๊ณ , ๋๊ธ์ ์ฃผ๋ํ๋์๊ฒ ๋ง์ ํ์ด ๋ฉ๋๋ค
'Back-End ์์ ์ค > Spring Framework' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Boot] ํตํฉ Test (0) | 2021.08.17 |
---|---|
[Spring Boot] ๊ธฐ์กด ์ฝ๋ ์ ์๋๊ณ , ์ค์ ์ผ๋ก ๊ตฌํ Class ๋ณ๊ฒฝ (0) | 2021.08.15 |
[Spring Boot] Java Code๋ก ์ง์ Spring Bean ๋ฑ๋ก (0) | 2021.08.13 |
[Spring Boot] Spring Bean๊ณผ ์์กด๊ด๊ณ (0) | 2021.08.12 |
[Spring Boot] Service ๊ฐ๋ฐ ๋ฐ Test Case ์์ฑ (0) | 2021.08.11 |