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";
}
}
templates/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>
다음과 같이 /에 해당하면 homecontroller가 처리하는 것을 확인 할 수 있다.
이미 정적 컨텐츠에서 이걸 처리하게 했는데 왜 이렇게 되었을까?
-> 순서가 있다.
컨트롤러에서 먼저 처리한다면 뒤에것들을 실행하지 않는다.
<p>
<a href="/members/new">회원 가입</a>
<a href="/members">회원 목록</a>
</p>
이것에는 단순하게 링크를 보내는 것 밖에 없다.
package hello.hellospring.controller;
import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService){
this.memberService = memberService;
}
@GetMapping("/members/new")
public String createForm() {
return "createMemberForm";
}
}
<!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>
Form 데이터를 전달 받기 위해서 다음과 같이 코드를 짜줌
package hello.hellospring.controller;
public class MemberForm {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
post방식의 members/new를 받을 컨트롤러 추가
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.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 "createMemberForm";
}
@PostMapping("/members/new")
public String create(MemberForm form){
Member member = new Member();
member.setName(form.getName());
memberService.join(member);
return "redirect:/";
}
}
이름을 입력하고 등록을 누르면 어떻게 되는가?
이름에 담긴 값이 전송이 된다.
form 방식으로 post 메소드 members/new로 간다.
스프링 컨테이너는 가지고 있는 컨트롤러에서 이를 처리하는 컨트롤러에게 보내고 값을 받는다.
값을 받은 컨트롤러에서 실행을 한다.
컨트롤러는 service에게 넘겨 받은 값을 다시 넘겨준다.
회원가입이 실행이 된다.
다음과 같이 저장이 되었다.
가입된 회원 목록들을 볼 수 있도록 할 것이다.
@GetMapping("/members")
public String list(Model model) {
List<Member> members = memberService.findMembers();
model.addAttribute("members", members);
return "members/memberList";
}
<!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> <!-- /container -->
</body>
</html>
타임리프가 리스트로 받은 애를 루트로 돌면서 로직을 실행한다.
실행이 되면 담아준다.
접근을 해서 값을 가져옵니다.
브라우저는 이렇게 된 애를 잘 뿌려준다.
회원 조회까지 다 봤다.
메모리에 있기 때문에 데이터가 다 지워질 수 있다.
메모리 내에 있기 때문에!
이제 이러한 데이터를 DB에 저장해야 한다!