Spring Boot์์ ์์ธ์กฐํ ๋ฐ ํ์ ์ญ์ ํด๋ณด๊ธฐ!
- ์ฌ์ฉ IDE : IntelliJ IDEA Ultimate
- ์ฌ์ฉ DB : MySQL
- ์ฌ์ฉ ์ธ์ด & SDK : Java & Amazon correto 11
- thymeleaf ์ฌ์ฉ์ ๊ฐ๊ธ์ ์ค์ธ ์์ ์ ๋๋ค.
- ajax๋ก ์กฐํ๋ ํ๋ ์์ํฌ์ ๋์ผํ๋ฏ๋ก ๋นผ๊ฒ ์ต๋๋ค.
- ์ ๋ฆฌ๋ณธ์ ๋๋ค ์ฐธ๊ณ ์ฉ์ผ๋ก๋ง ๋ด์ฃผ์ธ์!
์ด์ ๊ธ
ฮธ Spring Boot ์์ 1 (ํ์๊ด๋ฆฌ)
๐ Spring Boot ์์ 2 (ํ์๊ด๋ฆฌ)
์์ธ์กฐํ ์์
findAll.html์์ Controller๋ก memberId(pk๊ฐ)์ ๋ณด๋.
Controller์์ Service๋ก ์ ๋ฌ
Service์์ jpa์ findById๋ก ์ ๋ณด ์์ฒญ
๋ฐ์ Optionalํ์ ์ ์ ๋ณด๋ฅผ .get()์ ํตํด Entity ํ์ ์ผ๋ก ๋ณํ
Entityํ์ ์ DTOํ์ ์ผ๋ก ๋ณํ ํ Controller ์ ์ ๋ฌ
์ฌ์ฉ์๊ฐ ์ง์ ํ ํ๋ ์ํ
์ญ์ ์์
findAll.html์์ Controller๋ก memberId(pk๊ฐ)์ ๋ณด๋.
Controller์์ Service๋ก ์ ๋ฌ
Service์์ jpa์ delete๋ก ์ ๋ฌ
์ฌ์ฉ์๊ฐ ์ง์ ํ ํ๋ ์ํ
ํ์ ์ญ์ ๋ ์ ๋ง ๊ฐ๋จํ๊ธฐ ๋๋ฌธ์ ์์ธ์กฐํ๋ฅผ ์ค๋ช ํ๋ฉด์ ๊ฐ์ด ์ค๋ช ํ๊ฒ ์ต๋๋ค.
findAll.html์ ์์ธ์กฐํ & ์ญ์ ๋งํฌ ์ถ๊ฐ.
์ฌ์ฉ ์์์ ์คํ๊ฐ ์์๊ธฐ๊ฒ ์ฃผ์ํด์ฃผ์ธ์
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>findAll.html</h2>
<table>
<thead>
<tr>
<th>๋ฒํธ</th>
<th>์ด๋ฉ์ผ</th>
<th>๋น๋ฐ๋ฒํธ</th>
<th>์ด๋ฆ</th>
<th>์กฐํ</th>
<th>์ญ์ (get)</th>
<!-- ์๋๋ ์ฐจํ์ ๋ฐฐ์ฐ๋ฉด ์์ ํด์ ์ฌ๋ฆฌ๊ฒ ์ต๋๋ค. -->
<th>์ญ์ (delete)</th>
</tr>
</thead>
<tbody>
<tr th:each="member: ${memberList}">
<td th:text="${member.memberId}">๋ฒํธ</td>
<td th:text="${member.memberEmail}">์ด๋ฉ์ผ</td>
<td th:text="${member.memberPassword}">๋น๋ฐ๋ฒํธ</td>
<td th:text="${member.memberName}">์ด๋ฆ</td>
<!-- detail ์ฃผ์ ์ฒ๋ฆฌ๋ฐฉ์ @{|/์ฃผ์/${๊ฐ์ด ๋ณด๋ผ ๋ฐ์ดํฐ}|} -->
<td><a th:href="@{|/member/${member.memberId}|}">์กฐํ</a></td>
<td><a th:href="@{|/member/delete/${member.memberId}|}">์ญ์ </a></td>
<td></td>
</tr>
</tbody>
</table>
</body>
</html>
findAll.html์ ์ฃผ์๋ฅผ ๋ง๋ค์์ผ๋ ์ด๋ฅผ ๋ฐ๋ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด๋ด ์๋ค!
// ์์ธ์กฐํ
// /member/2, /member/15 => /member/{memberId}
// @PathVariavle : ๊ฒฝ๋ก์์ ์๋ ๋ณ์๋ฅผ ๊ฐ์ ธ์ฌ ๋ ์ฌ์ฉ
@GetMapping("{memberId}")
//public String findById(@PathVariable("memberId") Long memberId, Model model) {
// @PathVarialbe์์ ๋ฐ๋ ๊ฐ์ ์ด๋ฆ๊ณผ ๋งค๊ฐ๋ณ์์ ๊ฐ์ ์ด๋ฆ์ด ๊ฐ๋ค๋ฉด ์๋์ ๊ฐ์ด ์๋ต๊ฐ๋ฅ
public String findById(@PathVariable Long memberId, Model model) {
MemberDetailDTO memberDetailDTO = ms.findById(memberId);
model.addAttribute("member", memberDetailDTO);
return "member/findById";
}
// ํ์์ญ์ (/member/delete/5)
@GetMapping("delete/{memberId}")
public String deleteById(@PathVariable("memberId") Long memberId) {
ms.deleteById(memberId);
return "redirect:/member/";
}
์์ธ์กฐํ ์์
jpa์ findByID ๋ฉ์๋ ํธ์ถ (๋ฉ์๋ ์ด๋ฆ ์์๋ณ๊ฒฝ ๊ธ์ง!)
Entity๋ก ๋ฐ์ ๊ฐ์ DTO๋ก ๋ณํ (์ฌ๊ธฐ์๋ ๋ณํํ์ง๋ง, Entityํ์ ์ผ๋ก๋ ์ฌ์ฉ๊ฐ๋ฅ)
Controller๋ก ์ ๋ฌ.
์ญ์ ์์
// Interface์ ์๋ 2์ค ์ถ๊ฐ
MemberDetailDTO findById(Long memberId);
void deleteById(Long memberId);
@Override
public MemberDetailDTO findById(Long memberId) {
// findById๋ฅผ ํ๊ฒ ๋๋ฉด jpa์์ Optionalํ์
์ผ๋ก ์ค.
// Optional<MemberEntity> memberEntityOptional = mr.findById(memberId);
// Optional ํ์
์ Entityํ์
์ผ๋ก ๋ฐ๊พธ๊ธฐ ์ํด .get()์ ๋ถ์
// MemberEntity memberEntity = memberEntityOptional.get();
// Entity ํ์
์ DTO๋ก ํ์
์ผ๋ก ๋ฐ๊พธ๊ธฐ ์ํด ์ ์ DTO์ ๋ง๋ค์ด ๋์ ๋ฉ์๋๋ฅผ ํธ์ถํด ๋ณํ
// MemberDetailDTO memberDetailDTO = MemberDetailDTO.toMemberDetailDTO(memberEntity);
// ๋ณํ๋ DTOํ์
์ ๋ฆฌํดํจ.
// return memberDetailDTO;
// ์ ์ฝ๋๋ฅผ ์๋ ํ์ค๋ก ์์ฝ ๊ฐ๋ฅ
return MemberDetailDTO.toMemberDetailDTO(mr.findById(memberId).get());
}
@Override
public void deleteById(Long memberId) {
// jpa์ deleteBy~ ๋ฉ์๋๋ฅผ ํธ์ถ๋ง ํ๋ฉด ๋.
mr.deleteById(memberId);
}
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>findById.html</h2>
<table>
<thead>
<tr>
<th>๋ฒํธ</th>
<th>์ด๋ฉ์ผ</th>
<th>๋น๋ฐ๋ฒํธ</th>
<th>์ด๋ฆ</th>
</tr>
</thead>
<tbody>
<tr>
<td th:text="${member.memberId}"></td>
<td th:text="${member.memberEmail}"></td>
<td th:text="${member.memberPassword}"></td>
<td th:text="${member.memberName}"></td>
</tr>
</tbody>
</table>
</body>
</html>
์ฌ๊ธฐ๊น์ง ์ ๋ฐ๋ผ์ค์ จ์ผ๋ฉด ํ์ ์์ธ์กฐํ ๋ฐ ์ญ์ ๊น์ง๋ ๋๋๊ฒ๋๋ค.
์ถ๊ฐ๋ก REST API์ Delete ๋ฐฉ์์ ๋ค์ ์์ ์งํ ํ ์ ๋ฆฌํ๋๊ฑธ๋ก ํ๊ณ ๋ค์์๊ฐ์ ๋ง๋์~ :D