Spring Boot์์ ํ์ ๋ชฉ๋ก ์กฐํ ํด๋ณด๊ธฐ!
- ์ฌ์ฉ IDE : IntelliJ IDEA Ultimate
- ์ฌ์ฉ DB : MySQL
- ์ฌ์ฉ ์ธ์ด & SDK : Java & Amazon correto 11
- thymeleaf ์ฌ์ฉ์ ๊ฐ๊ธ์ ์ค์ธ ์์ ์ ๋๋ค.
- ์ ๋ฆฌ๋ณธ์ ๋๋ค ์ฐธ๊ณ ์ฉ์ผ๋ก๋ง ๋ด์ฃผ์ธ์!
- ํ์๋ชฉ๋ก ์ ๋ฆฌ๋ณธ์ ๋๋ค, ์์ธ์กฐํ & ์ญ์ ๋ ๋ค์์๊ฐ์ :D
์ด์ ๊ธ
ฮธ Spring Boot ์์ 1 (ํ์๊ด๋ฆฌ)
์์
html์์ Controller๋ก ์์ฒญ
Controller์์ Service๋ก ์์ฒญ
Service์์ Repository(JPA)๋ก ์์ฒญ
Repository์์ Entityํ์ ์ผ๋ก ์ ๋ฌ
Service์์ Entityํ์ ์ DTOํ์ ์ผ๋ก ๋ณํ ํ Controller๋ก ์ ๋ฌ
Controller์์ model์ ๋ด์ ๋ค ์ฌ์ฉ์๊ฐ ์ง์ ํ ์์ ์ํ
์ด์ ๋ง๋ค์ด ๋์ index.html์ ํ์๋ชฉ๋ก์ผ๋ก ๊ฐ๋ ๋งํฌ๋ฅผ ๋ง๋ญ์๋ค.
REST API ํ์์ผ๋ก ๋ง๋ค๊ฒ์ด๊ธฐ ๋๋ฌธ์ /member ๋ก ์ฃผ์๋ฅผ ์ค์ ํด์ค๋๋ค.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>index.html</h2>
<a href="/member/save">ํ์๊ฐ์
</a>
<a href="/member/login">๋ก๊ทธ์ธ</a>
<!-- ํ์๋ชฉ๋ก์ผ๋ก ๊ฐ๋ ๋งํฌ ์ถ๊ฐ -->
<a href="/member/">ํ์๋ชฉ๋ก</a>
</body>
</html>
ํ์ ๋ชฉ๋ก์กฐํ ๋ฐ ์์ธ์กฐํ์ฉ DTO๋ฅผ ํ๋ ๋ง๋ค์ด์ผํฉ๋๋ค.
๋๋ค ์กฐํ๋ผ๋ ๋น์ทํ ๊ฐ๋ ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ DTO๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@Data
@NoArgsConstructor // ๊ธฐ๋ณธ ์์ฑ์
@AllArgsConstructor // ๋ชจ๋ ํ๋๋ฅผ ๋งค๊ฐ๋ณ์๋ก ํ๋ ์์ฑ์
// ์์ฑ์๋ ์ฐ์ด๋ ์ผ์ด ์๋๋ผ๋ ๋ง๋ค์ด๋์๋ ๋ฌธ์ ์์.
public class MemberDetailDTO {
private Long memberId;
private String memberEmail;
private String memberPassword;
private String memberName;
}
์์์ ๋งํ๊ฒ์ฒ๋ผ ์ฃผ์๊ฐ ์๊ธฐ๋๋ฌธ์ @GetMapping ๋ค์ ์ฃผ์๋ฅผ ์๋ต.
๋๋จธ์ง๋ ์คํ๋ง ํ๋ ์์ํฌ์์์ฒ๋ผ ๋ฆฌ์คํธ๋ก ๋ฐ์์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฆฌ์คํธ ์ ์ธ ๋ฐ Service ํธ์ถ
// ํ์๋ชฉ๋ก ์กฐํ
@GetMapping
public String findAll(Model model) {
List<MemberDetailDTO> memberList = ms.findAll();
model.addAttribute("memberList", memberList);
return "member/findAll";
}
Service์์ ์ฒ๋ฆฌ ์์
jpa์ findAll๋ฉ์๋ ํธ์ถ (๋ฉ์๋ ์ด๋ฆ ๋ฐ๋์ ์ง์ผ์ผํจ!)
Entityํ์ ์ผ๋ก ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์. (Entityํ์ ์ผ๋ก๋ ์ฌ์ฉ ๊ฐ๋ฅํ์ง๋ง, ์ฌ๊ธฐ์๋ DTO๋ก ๋ณํ)
Entity -> DTO ํ์ ์ผ๋ก ๋ณํ ํ Controller์ ์ ๋ฌ.
// Interface์ ์๋ ์ฝ๋ ์ถ๊ฐ
List<MemberDetailDTO> findAll();
@Override
public List<MemberDetailDTO> findAll() {
// findAll์ด๋ผ๋ ๋ฉ์๋ ํธ์ถ ๋ฐ Entityํ์
์ List์ ํธ์ถ ๊ฒฐ๊ณผ ์ ์ฅ
List<MemberEntity> memberEntityList = mr.findAll();
// Entityํ์
์ List๋ฅผ DTOํ์
์ List๋ก ๋ณํ
// ์์์ ๋งํ๋ค์ํผ ๋ฐ๋์ ๋ณํํด ์ค ํ์๋ ์์.
List<MemberDetailDTO> memberDetailDTOList = MemberDetailDTO.change(memberEntityList);
return memberDetailDTOList;
}
// MemberEntity -> MemberDetailDTO
// ๋ฆฌํดํ์
: MemberDetailDTO
// ๋งค๊ฐ๋ณ์ํ์
: MemberEntity
public static MemberDetailDTO toMemberDetailDTO(MemberEntity memberEntity) {
MemberDetailDTO memberDetailDTO = new MemberDetailDTO();
memberDetailDTO.setMemberId(memberEntity.getId());
memberDetailDTO.setMemberEmail(memberEntity.getMemberEmail());
memberDetailDTO.setMemberPassword(memberEntity.getMemberPassword());
memberDetailDTO.setMemberName(memberEntity.getMemberName());
return memberDetailDTO;
}
// Entityํ์
์ List๋ฅผ DTOํ์
์ List๋ก ๋ณํํ๋ ๋ฉ์๋.
// ์์ ์๋ Entity๋ฅผ DTO๋ก ๋ณํํด์ฃผ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ๋ ๊ฐ๋จํ๊ฒ ๊ตฌํ
public static List<MemberDetailDTO> change(List<MemberEntity> memberEntityList) {
List<MemberDetailDTO> memberDetailDTOList = new ArrayList<>();
for (MemberEntity m: memberEntityList) {
memberDetailDTOList.add(toMemberDetailDTO(m));
}
return memberDetailDTOList;
}
์ค๋น๊ฐ ๋๋ฌ์ผ๋ ์ด์ ์ถ๋ ฅ์ ํด๋ด ์๋ค.
<!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>
</tr>
</thead>
<tbody>
<!-- ์คํ๋ง ํ๋ ์์ํฌ์ <c:forEach items="${mList}" var="m"> ์ ๊ฐ์ ์ญํ -->
<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>
</tr>
</tbody>
</table>
</body>
</html>