김코딩

프로퍼티 바인딩이 뭔데 자꾸 헷갈려? 본문

스프링

프로퍼티 바인딩이 뭔데 자꾸 헷갈려?

김코딩딩 2025. 5. 1. 23:52

김영한님의 스프링 입문 강의를 듣다가 갑자기 막혀버렸다…

1. 처음에는 단순했다

나는 회원 정보를 저장하기 위해 Member라는 도메인 클래스를 만들었다.

package hello.hello_spring.domain;

public class Member {
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

그리고 HTML에 이런 폼을 만들어서 이름을 입력받게 했다:

    <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>

 

나는 이렇게 생각했다:

"여기서 name 입력하면, 그 값이 바로 Member 객체에 저장되겠지?"


2. 그런데 갑자기 MemberForm이 등장한다?

강의에서는 갑자기 MemberForm이라는 클래스를 따로 만들어서 입력값을 받는 것이 아닌가?

package hello.hello_spring.controller;

public class MemberForm {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

그리고 컨트롤러에서는 이렇게 사용했다:

@PostMapping("/members/new")
public String create(MemberForm form) {
    Member member = new Member();
    member.setName(form.getName());

    memberService.join(member);

    return "redirect:/";
}

 

이걸 보자마자 나는 멈칫했다.

아니, Member에 바로 값을 넣으면 되지… 왜 귀찮게 클래스를 하나 더 만들어?


3. 그래서 파고들었다. 키워드는 ‘프로퍼티 바인딩’

조금 더 찾아보다가 프로퍼티 바인딩(Property Binding)이라는 개념을 알게 되었다.
이게 바로 핵심이었다.


4. 프로퍼티 바인딩이란?

간단히 말하면:

HTML의 name="xxx" 속성과 자바 객체의 setXxx() 메서드를 자동으로 연결해주는 것.

예를 들어 위의 폼에서 name="name" 이라는 input에 "홍길동"을 입력하면,
스프링은 자동으로 이렇게 해준다:

MemberForm form = new MemberForm();
form.setName("홍길동");

 

그리고 그 완성된 form 객체를 컨트롤러 파라미터에 넣어준다.


5. 그런데 왜 굳이 MemberForm을 쓰는 걸까?

이 질문이 핵심이다. 나도 처음엔 이해가 안 갔다.
하지만 아래 표를 보고 깨달았다:

MemberForm Member
입력 전용 DTO (폼 받는 용도) 진짜 도메인 객체 (DB 저장용)
화면 요구에 따라 자주 바뀜 핵심 로직, 최대한 안정적으로 유지
검증용 어노테이션 사용 용이 비즈니스 로직에 집중해야 함

6. 결론
  • 프로퍼티 바인딩은 HTML의 name 속성과 자바 객체의 setter를 자동으로 연결해주는 기능이다.
  • MemberForm은 사용자의 입력을 받을 임시 그릇이다.
  • Member는 진짜 저장되고 비즈니스 로직에서 쓰이는 도메인 객체다.
  • 입력용, 저장용 역할을 분리하면 코드가 더 유연하고 유지보수하기 쉬워진다.