JSP 폼이 서버 객체로 자동 바인딩되는 원리
com.smhrd.controller, com.smhrd.service, com.smhrd.domain 패키지가 준비됨<input name="..."> 의 name 이 VO 필드명과 같을 때 — Spring 이 어떻게 데이터를 자동으로 객체에 채워주는지를 손으로 확인합니다. 마지막 단계에서는 일부러 name 을 어긋나게 만들어 「약속이 깨지면 어떻게 되는지」 도 직접 봅니다.
com.smhrd.domain.Member 클래스를 만듭니다. 폼에서 받을 칸과 같은 이름의 필드만 둡니다.
package com.smhrd.domain;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
@Data @AllArgsConstructor @NoArgsConstructor
public class Member {
private String id;
private String pwd;
private String nick;
}
@Data 가 빨간 줄 안 뜨는지 확인id, pwd, nick 인가? (대소문자 주의)src/main/webapp/WEB-INF/views/signup.jsp (혹은 프로젝트 규칙에 맞는 위치) 를 만듭니다. 모든 입력 칸의 name 을 VO 필드명과 같게 둡니다.
<%@ page contentType="text/html;charset=UTF-8" %>
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>회원가입</title></head>
<body>
<h1>회원가입</h1>
<form action="/signup" method="post">
<input name="id" placeholder="아이디"><br>
<input name="pwd" type="password" placeholder="비밀번호"><br>
<input name="nick" placeholder="닉네임 (선택)"><br>
<button>가입하기</button>
</form>
</body></html>
name 속성이 살아있는지 확인com.smhrd.controller.SignupController 를 만듭니다. 매개변수에 Member m 만 두면 끝납니다.
package com.smhrd.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import com.smhrd.domain.Member;
@Controller
public class SignupController {
// 폼 페이지 보여주기
@GetMapping("/signup")
public String form() {
return "signup"; // /WEB-INF/views/signup.jsp
}
// 폼 데이터 받기
@PostMapping("/signup")
public String signup(Member m) {
System.out.println("받은 회원: " + m);
return "redirect:/signup"; // 일단 다시 폼으로
}
}
http://localhost:8080/signup 에서 폼이 보이는가?폼에 값을 넣고 「가입하기」 를 눌러봅니다.
id : hong
pwd : mypw1234
nick : 홍길동
Eclipse 콘솔에 다음과 같은 줄이 떠야 합니다:
받은 회원: Member(id=hong, pwd=mypw1234, nick=홍길동)
id=hong&pwd=mypw1234&nick=... 가 보이는가?폼 JSP 에서 첫 번째 input 의 name 만 바꿔봅니다.
<!-- 변경 전 -->
<input name="id" placeholder="아이디">
<!-- 변경 후 -->
<input name="userId" placeholder="아이디">
저장 후 다시 폼을 작성해 가입하기 — 콘솔 출력은:
받은 회원: Member(id=null, pwd=mypw1234, nick=홍길동)
↑
아이디만 null 로 들어옴
userId=hong 으로 잘 보내졌는가? (브라우저는 잘못 없음)id=null — VO 에 userId 필드가 없으니 setter 가 호출되지 않은 것name="id" 로 되돌려 두기같은 일을 옛날 방식으로 쓰면 다음과 같습니다 (참고만 — 실제 코드는 그대로 두세요).
@PostMapping("/signup")
public String signup(HttpServletRequest req) {
String id = req.getParameter("id");
String pwd = req.getParameter("pwd");
String nick = req.getParameter("nick");
Member m = new Member();
m.setId(id); m.setPwd(pwd); m.setNick(nick);
System.out.println("받은 회원: " + m);
return "redirect:/signup";
}
Step 3 의 signup(Member m) 한 줄과 비교해보면 — 줄 수가 차이나는 게 아니라, 「데이터 꺼내기」 라는 관심사가 사라진다 는 게 핵심입니다.
Member m 한 줄만 둬도 자동으로 채워지는 것을 봤다