▣ PART · AUTH

회원가입 폼 — name 속성과 VO 필드 매칭

JSP 폼이 서버 객체로 자동 바인딩되는 원리

📍 지금 어디를 만지고 있나요?
브라우저
<form>
Controller
signup(Member m)
Service
Mapper
DB

핵심 용어

name 속성폼 입력 칸의 식별자. 서버에 전송될 때 key 가 됨.
VO (Value Object)데이터를 담는 그릇. 여기서는 Member.
자동 바인딩폼의 name 과 VO 의 필드명이 같으면, Spring 이 setter 를 자동 호출.
데이터 약속Front / Back 양쪽에서 같이 쓰는 이름. id, pwd, nick.

1. 문제 — 폼 칸을 한 줄씩 꺼내는 답답함

getParameter 가 칸 수만큼 늘어난다

회원가입 폼 칸이 6 개라면 — Controller 안에 request.getParameter(...) 가 6 줄, 그 다음에 m.setXxx(...) 가 또 6 줄. 본질(서비스 호출)은 한 줄인데 데이터를 꺼내는 코드가 컨트롤러를 채웁니다. 칸이 늘면 그만큼 더러워집니다.

2. 새 도구 — 같은 이름이면 자동으로 담긴다

「name 속성 ≡ VO 필드명」 의 약속

Spring Controller 의 매개변수에 VO 클래스를 두면 — 폼 데이터의 key (즉 name) 를 보고, VO 의 같은 이름 필드에 setter 로 값을 채워줍니다. 이름만 같으면 줄 수와 상관없이 자동입니다.

<input name="id">   →  m.setId(...)
<input name="pwd">  →  m.setPwd(...)
<input name="nick"> →  m.setNick(...)

3. 코드 — 폼 + VO + Controller

3.1 회원가입 폼 (signup.jsp)

<form action="/signup" method="post">
  <input name="id"   placeholder="아이디">
  <input name="pwd"  type="password" placeholder="비밀번호">
  <input name="nick" placeholder="닉네임 (선택)">
  <button>가입하기</button>
</form>

3.2 Member VO (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;
}

3.3 Controller (com.smhrd.controller.SignupController)

package com.smhrd.controller;

import org.springframework.stereotype.Controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import com.smhrd.domain.Member;
import com.smhrd.service.MemberService;

@Controller
public class SignupController {

    @Autowired private MemberService memberService;

    @PostMapping("/signup")
    public String signup(Member m) {     // ← 자동 바인딩
        System.out.println("받은 회원: " + m);
        memberService.signup(m);
        return "redirect:/login";
    }
}

4. 어떻게 자동으로 담기나 — 흐름

① 사용자가 폼 작성:   id=hong  pwd=mypw1234  nick=홍길동
② 브라우저가 POST /signup 으로 위 key=value 들을 보냄
③ Spring 이 매개변수의 타입을 본다 → Member
④ Spring 이 new Member() 한 다음:
       m.setId("hong")
       m.setPwd("mypw1234")
       m.setNick("홍길동")
   를 차례로 호출
⑤ 우리가 작성한 signup(m) 메서드 호출

5. name 이 어긋나면 — 그 필드만 null

폼만 살짝 바꿔봅니다 — name="id"name="userId" 로:

<input name="userId">    ← VO 에 userId 필드는 없음
<input name="pwd">
<input name="nick">

콘솔 출력은:

받은 회원: Member(id=null, pwd=mypw1234, nick=홍길동)
                    ↑
              아이디만 빠진다

이름이 안 맞으면 setter 가 호출되지 않으므로 그 필드만 null 입니다. DB 에 INSERT 하면 PK null 오류가 납니다.

6. 핵심 한 줄

데이터 약속

같은 데이터에 같은 이름을 쓰면, 폼과 VO 가 자동으로 합쳐진다.

이름이 곧 약속. 이름이 곧 코드. 칸이 100 개여도 같은 원리.

7. Before / After

Before

getParameter 6 줄 + setter 6 줄. Controller 가 데이터 꺼내기 코드로 가득 참.

After

signup(Member m) 한 줄. 컨트롤러는 본질(서비스 호출) 에만 집중.