[ 회원 관리 예제를 이용한 웹 MVC 개발 ]
1. 진행 과정
- 홈 화면을 작성해, 회원 등록, 회원 조회 버튼을 생성
- 회원 등록 화면에서는 이름을 입력하고, 등록하면 홈 화면으로 이동
- 회원 조회 화면에서는 1.(이름), 2(이름) 형태로 조회
2. 코드 작성
2-1. 홈 화면
[ HomeController ]
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";
}
}
- home.html로 이동
- GetMapping은 보통 조회할 때 사용. url을 통해 이동하기위해 버튼누름
[ 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>
</body>
</html>
- @GetMapping("/") -> localhost:8080
- return "home" -> home.html로 이동해서 home.html에 작성한 화면 나옴
- HomeController에 매핑된 것이 있으면 바로 호출됨 -> 기존 /static/index.html은 무시됨
2-2. 회원 등록
[ MemberController ]
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;
@Controller
public class MemberController {
private final MemberService memberService;
@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:/";
}
}
package hello.hellospring.controller;
public class MemberForm {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- createMemberForm.html의 id="name"과 매칭이 되면서 값이 들어옴
- MemberForm의 name에 setName을 통해 MemberContoller에서 gayoung이라는 데이터 들어감
<!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>
</body>
</html>
- home.html에서 회원 가입 버튼을 누르면 /members/new로 이동
<a href="/members/new">회원 가입</a>
- MemberController에서 @GetMapping("/members/new")에 의해 members/createMemberForm으로 이동(createMemberForm.html) = 화면이동
- createMemberForm.html에서
<input type="text" id="name" name="name" placeholder="이름을 입력하세요">
의 id="name"에 의해 "name"이 서버로 넘어올 때 key가 됨
- createMemberForm.html에서
<form action="/members/new" method="post">
이므로 내가 이름gayoung을 입력하면 입력하고 등록누르는 순간 /members/new에 post방식으로 넘어감 -> MemberController에서 @PostMapping("/members/new")에 의해 데이터가 넘어감
- 데이터가 넘어간 후에 home.html로 화면 이동
2-3. 회원 조회
[ MemberController ]
@GetMapping("/members")
public String list(Model model) {
List<Member> members = memberService.findMembers();
model.addAttribute("members", members);
return "members/memberList";
}
[ 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>
</body>
</html>
- model에서 attributeName의 두번째 members가 th:each="member : ${members}"의 members임