MemberController를 통해서 회원을 등록하고 조회할 수 있도록 만들어보자
HomeController.java
package hello.hellospring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@GetMapping("/") //처음 localhost:8080으로 들어오면
public String home(){
return "home"; //home.html 호출
}
}
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> <!-- /container -->
</body>
</html>

※ 참고
welcome page로 띄워주는 것엔 우선순위가 있다.
이전에 공부한 것에선 static의 index.html이 welcome page이었음. 왜 위의 코드는 home.html을 welcome page로 띄울 수 있을 까?
localhost:8080 요청이 오면 먼저 controller에서 홈 화면에 매핑된 url이 있는지 찾아본다. 있으면 해당 controller가 호출되고 끝나고 기존 index.html(정적 리소스)는 무시된다. 없으면 index.html를 띄워준다.
회원 등록하는 controller를 만들어보자.
MemberController.java
package hello.hellospring.controller;
import 생략
@Controller
public class MemberController {
private MemberService memberService;
@Autowired
public void setMemberService(MemberService memberService) {
this.memberService = memberService;
}
@GetMapping("/members/new") //http의 get방식으로 '/members/new'로 이동하면 다음이 매핑됨
public String createForm() {
return "members/createMemberForm";//view resolver를 통해 템플릿의 members/createMemberForm이 선택되고 thumeleaf 템플릿 엔진에 렌더링함
}
@PostMapping("/members/new") //http의 post방식으로 '/members/new'로 이동하면 다음이 매핑됨
public String create(MemberForm form){
Member member = new Member();
member.setName(form.getName());//name이 private이므로 setName을 통해 getName으로 꺼낸 이름을 등록하기
memberService.join(member);
return "redirect:/"; //회원가입 끝나면 home화면으로 보내기
}
}
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;
}
}
createMemberForm.html
<!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> <!-- /container -->
</body>
</html>

이름에 'spring'을 적고 등록 버튼을 누르면 어떤 일이 발생할까
<form action="/members/new" method="post">에서 post방식으로 MemberController의 @PostMapping으로 넘어와 create()가 호출된다.
createMemberForm.html의<input type="text" id="name" name="name" placeholder="이름을 입력하세요">의 name="name" 과 MemberForm.java의 private String name;이 매칭되면서 name값이 들어온다.
setName을 통해 getName으로 꺼낸 이름을 등록하고 join시킨다.
이후 home화면으로 되돌아간다.
※ PostMapping, GetMapping
같은 url(/members/new) 일지라도 post, get 장식에 따라 호출되는 함수가 달라진다.
보통 @PostMapping은 데이터를 form같은데 넣어서 등록할 때 주로 사용하고,
@GetMapping은 데이터를 조회할 때 주로 사용한다.
여기선 thymeleaf 템플릿 엔진이 본격적으로 동작한다.
MemberController.java
package hello.hellospring.controller;
import 생략
@Controller
public class MemberController {
private MemberService memberService;
...
@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}"> //$는 모델 안의 값을 꺼내는 것, members에 모든 회원이 담겨있으므로 각각 돌면서(th:each) 반복된다.
<td th:text="${member.id}"></td>
<td th:text="${member.name}"></td>
</tr>
</tbody>
</table>
</div>
</div> <!-- /container -->
</body>
</html>
회원 가입에서 'spring1', 'spring2'를 등록해주고 회원 목록을 들어가보면 다음과 같이 나온다.


위 소스를 보면 tr태그 부분에서 thymeleaf 템플릿 엔진이 렌더링 한 결과를 볼 수 있다.
현재는 메모리 안에 데이터를 저장했으므로 서버를 다시 키면 데이터가 다 지워지게 된다.