

package com.hello.hellospring.controller;
import com.hello.hellospring.domain.Member;
import com.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;
import java.util.List;
@Controller
public class MemberController {
private MemberService memberService;
// 의존성 주입
@Autowired
public MemberController(MemberService memberService){
this.memberService = memberService;
}
// Get방식 매필
@GetMapping("/members/join")
public String join(){
return "members/join";
}
// Post방식 매핑
// 클라이언트가 입력한 데이터를 받아올 폼이 필요하다.
// 클라이언트가 서버에 데이터를 "ninckname"이라는 name으로 보냄
// 클라이언트로부터 전달받은 데이터를 저장할 Form이 필요함
// MemberForm에는 "nickname"이라는 변수가 있다.
@PostMapping("/members/join")
// 매개변수 member는 클라이언트가 입력한 데이터
public String join(MemberForm member){
Member member1 = new Member();
// 클라이언트가 입력한 데이터를 member1 인스턴스에 저장해주고
member1.setName(member.getNickname());
// member1 인스턴스를 join한다 (아직 db가 연결되지 않았기때문에 가상의 메모리 공간에 저장됨)
memberService.join(member1);
// 루트 경로로 리다이렉트
return "redirect:/";
}
// 회원목록을 조회한다
@GetMapping("/members")
public String memberList(Model model){
// 멤버를 조회한 후
List<Member> member = memberService.findMembers();
// 모델에 담아준다. (why? 모델에 담아주어야 view에서 불러올 수 있음)
model.addAttribute("member", member);
return "members/list";
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/members/join" method="post">
<label for="id">이름</label>
<input type="text" name="nickname" id="id"/>
<button type="submit">등록</button>
</form>
</body>
</html>
form태그의name속성은 서버로 전달되는 데이터를 의미함
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<ul th:each="member : ${member}">
<li th:text="${member.id}"></li>
<li th:text="${member.name}"></li>
</ul>
</body>
</html>
model객체에 저장된${member}는 리스트 타입이다. 여기서th:each는 타임리프가 제공하는 속성으로서, 자바의for each문과 비슷한 기능이다.
package com.hello.hellospring.controller;
public class MemberForm {
private String
nickname;
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
}



회원가입과 회원목록을 조회한 결과이다.
아직 DB에 연결하지 않았으므로 저장된 데이터는 가상메모리에 저장된다. 따라서 서버가 재시작하게 되면 기존에 저장되어있던 데이터는 사라진다. 데이터를 유지하기 위해서 DB를 연결해야한다.