회원 등록 기능
package hello.hellospring.controller;
public class MemberForm {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
1. 컨트롤러에 MemberForm을 만들 이유가 있나요?
-> 사실 컨트롤러에 MemberForm 대신에 Member를 그대로 받아도 기술적인 문제는 없습니다. 다만 지금은 예제이지만, 실무에서는 컨트롤러에 넘어오는 정보가 Member가 필요한 데이터 이상으로 많은 데이터들이 들어옵니다. 예를 들어서 회원 정보 뿐만 아니라 약관 정보도 들어오고, 화면을 처리하기 위한 추가 정보들도 들어옵니다. 또는 Member에 필요한 정보들이 화면이 아니라 데이터베이스에 더 있을 수도 있습니다. 더 여러가지가 있지만, 주로 이런 이유 때문에 MemberForm과 Member를 분리하는 것이 좋습니다^^
2. MemberForm이라는 클래스는 어떠한 어노테이션도 없이 순수 자바코드인데 어떻게 폼에서 name값을 받아와 setName을 해주는지 궁금합니다.
-> 스프링 MVC가 기본으로 지원하는 기능입니다^^ 웹의 파라미터에 name이라는 이름이 있으면 이 이름을 보고 스프링 MVC가 setName을 호출합니다.
정확히는 getter, setter 메서드 이름을 맞추어야 합니다. 이것을 자바빈 프로퍼티 규약이라 합니다.
예를 들어서 name이면 getName(return this.name;), setName(.. this.name = param ) 이라는 메서드를 만들어야합니다.
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired//@Service된 객체를 넣어줌. Dependency Injection
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:/";
}
}
1. 회원가입을 누르면 /members/new -> controller mapping. return 값으로 템플릿에서 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>
input 의 name="name"에서 "name"에 값을 입력(ex.spring) 그러면 그것이 키값이 됨. name값을 보고 Spring이 MemberForm에 setName()을 통해 name을 넣어줌.
등록 버튼을 누르면 action url에 post방식으로 넘어감.
따라서 컨트롤러에있는 post방식의 /members/new 호출
placeholder -> default로 적히는 값.
GET방식-> 조회할때 주로씀.
POST방식-> 데이터를 폼같은 데 넣어서 전달할때, 데이터등록할때
회원 조회 기능
@GetMapping("/members")
public String list(Model model){
List<Member> result = memberService.findMembers();
model.addAttribute("members",result);
return "members/memberList";
}
조회 누르면 controller에 /members 매핑.
model 파라미터 생성후 .addAttribute()를통해 model에 조회값 다 넣어줌.(key: members, value : result) 키밸류쌍으로 저장
뷰리졸버가 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>
${members} -> model안에 있는 값을 꺼냄.
th:each -> thymeleaf 문법 for each 문과 비슷함.
'Spring > 스프링입문' 카테고리의 다른 글
[스프링입문] 섹션6-2. JPA, 스프링데이터 JPA (0) | 2023.01.17 |
---|---|
[스프링입문] 섹션6-1. 스프링 DB 접근 기술 - Jdbc, JdbcTemplate (0) | 2023.01.17 |
[스프링입문] 섹션4. 스프링 빈과 의존관계 (2) | 2023.01.16 |
[스프링입문] 섹션3.회원 관리 예제 - 웹MVC개발 (0) | 2023.01.16 |
[스프링입문] 섹션2. 스프링 웹 개발 기초 (0) | 2023.01.12 |