김영한 스프링 부트 강의를 듣는 중 예제를 따라하다가 의문이 생겼다.
input 태그의 name 값을 이용해서 post 메서드 방식으로 입력한 값을 컨트롤러에 전달해준다는데 아무리 봐도 html과 java 파일을 연결해주는 코드가 없었다.
결론부터 말하자면, 우리의 눈에 보이지 않을 뿐 스프링 프레임 워크 내부에서 자체적으로 처리해주는 것이었다.
<!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>
사용자가 값을 입력하는 html이다.
package hello.hellospring.controller;
public class MemberForm {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
html에서 넘어온 값을 받을 폼이 존재한다.
(어노테이션이 없어도 html에서 값이 넘어가는 이유는 컨트롤러에서 Post 방식으로 값을 받을 때 인자값의 타입을 MemberForm으로 받았기 때문이다.)
...
@PostMapping("members/new")
public String create(MemberForm form) {
Member member = new Member();
member.setName(form.getName());
memberService.join(member);
return "redirect:/";
}
}
form을 받아서 바로 getName을 찍는데, setName을 하는 코드는 존재하지 않는다.
처음에는 어떤 방식인지 이해가 되지 않아서 변수명을 하나하나 다 변경해봤다.
- 변수명, getter는 이름을 바꿔도 상관이 없다.
- 그러나 스프링이 setName을 통해서 (Private이기 때문) 값을 세팅하기 때문에 setter의 이름을 html의 name 값과 통일시켜줘야 한다.
Controller 메서드를 호출하기 전 DispatcherServlet을 거치게 되는데 이 단에서 어떤 파라미터를 넘기는지 확인하고 처리한다고 한다. 만약 name="name"이라면 setter를 사용하여 name이라는 값을 찾아서 집어넣는다는 것.
반응형
'Web Project > Spring Boot' 카테고리의 다른 글
오류: org.hibernate.PersistentObjectException (0) | 2024.08.19 |
---|---|
[김영한 - 스프링 부트] 1. 프로젝트 환경설정 - View 환경설정 (0) | 2024.04.01 |