1. Form
public class Member {
private Long id; // 시스템이 저장하는 id
private String name;
public Long getId() {
return id;
}
public String getName() {
return name;
}
public void setId(Long id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
}
public class MemberForm {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
<!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>
// 뷰 (view) 로 리턴
@Controller // 컴포넌트 스캔 + 자동 의존관계 설정 방식
public class MemberController {
private final MemberService memberService;
// @Autowired 를 쓰려면 @ 로 연결해줘야 함. 즉, MemberService 에 @Service 가 달려있어야 함.
// 혹은 SpringConfig에 @Bean으로 등록되어야 함
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
@GetMapping("/members/new")
public String createForm() {
return "members/createMemberForm";
}
@PostMapping("/members/new")
public String create(MemberForm form) {
Member member = new Member();
member.setName(form.getName());
memberService.join(member);
return "redirect:/";
}
}
Member 클래스는 DB와 바로 맞닿아있는 VO 개념인거같고
MemberForm 클래스는 중간다리를 하는 DTO 인 것 같다.
그래서 MemberForm에 값을 담고 그 값을 Member로 옮겨 담아서 DB 처리를 하는 것 같다.
재밌는(?) 점은 김영한 쌤은 MemberForm을 따로 패키지를 안만들고 controller에 넣었다는 점이다.
흠. 왜지?
DTO 처럼,
VO - DTO - DAO - Service - Controller 순으로 하면 안되나? 직관적이에
Domain - Form - Repository - Service - Controller
이러면 딱 맞아떨어지는데~~
2. Thymeleaf
@GetMapping("/members")
public String list(Model model) {
List<Member> members = memberService.findMembers();
model.addAttribute("members", members);
return "members/memberList";
}
<div class="container">
<div>
<table>
<thead>
<tr>
<th>#</th>
<th>이름</th>
</tr>
</thead>
<tbody>
<!-- ${} : Model 안에 있는 값 꺼내기 -->
<!-- th:each : 루프를 돌면서 순서대로 값을 꺼냄 -->
<!-- 객체 클래스에서 정의한 Getter로 값을 꺼냄 -->
<tr th:each="member : ${members}">
<td th:text="${member.id}"></td>
<td th:text="${member.name}"></td>
</tr>
</tbody>
</table>
</div>
</div>