| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
Tags
- 김영한
- 프로그래머스
- java
- 백엔드
- Til
- redis
- lv1
- 디자인 패턴
- 계산기
- 이펙티브 자바
- Spring Batch
- spring boot
- 스케줄러
- 트러블슈팅
- 토스
- DB
- 추상클래스
- 성능 개선
- 배치
- 로드밸런서
- 스프링 배치
- 템플릿 메서드 패턴
- 스프링
- 코드카타
- GoF 23
- Spring
- 프록시 패턴
- 자바
- Effective Java
- 빌더 패턴
Archives
- Today
- Total
김코딩
프로퍼티 바인딩이 뭔데 자꾸 헷갈려? 본문
김영한님의 스프링 입문 강의를 듣다가 갑자기 막혀버렸다…
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는 진짜 저장되고 비즈니스 로직에서 쓰이는 도메인 객체다.
- 입력용, 저장용 역할을 분리하면 코드가 더 유연하고 유지보수하기 쉬워진다.
'스프링' 카테고리의 다른 글
| 반복되는 로그인 체크, 필터 하나로 끝내기(Filter 사용법) (0) | 2025.05.22 |
|---|---|
| 여긴 못지나간다.(@Valid) (0) | 2025.05.19 |
| Spring Container와 Bean이 헷갈리는 이들에게 (0) | 2025.05.15 |
| 의존성 주입(Dependency Injection)이란? (0) | 2025.05.08 |
| 스프링이란? (0) | 2024.03.28 |