2023. 5. 1. 16:46ㆍSpring Framework/Web on Servlet Stack
📌 WebDataBinder란?
WebDataBinder
는 웹 요청 파라미터를 JavaBean 객체로 바인딩하는 특별한 DataBinder입니다.
📌 서블릿 API에 종속되지 않으며, ServletRequestDataBinder
와 같은 구체적인 변형 클래스의 기본 역할을 합니다.
📌 주요 사용 사례:
- 컨트롤러에서 폼 데이터를 객체로 자동 변환
- JSON 데이터를 Java 객체로 변환
- 데이터 유효성 검사 수행
- 커스텀 변환기 적용 가능
⚠️ 보안 경고:
데이터 바인딩을 사용할 때 외부 클라이언트가 특정 객체 그래프를 조작할 위험이 있으므로,
허용되지 않은 필드 바인딩을 막고 적절한 보안 조치를 취해야 합니다.
✅ WebDataBinder의 주요 기능
1️⃣ 데이터 바인딩 (HTTP 요청 → Java 객체)
WebDataBinder
는 HTTP 요청 파라미터를 Java 객체의 속성에 자동으로 바인딩합니다.
📌 예를 들어, HTML 폼 데이터를 @ModelAttribute
객체에 매핑할 수 있습니다.
@PostMapping("/submit")
public String handleForm(@ModelAttribute("formObject") FormObject formObject, BindingResult result) {
if (result.hasErrors()) {
return "errorPage";
}
return "successPage";
}
💡 @ModelAttribute
를 사용하면 폼 데이터를 자동으로 Java 객체(FormObject
)에 매핑할 수 있습니다.
2️⃣ 유효성 검사 (Validation)
📌 @Valid
또는 @Validated
애노테이션과 함께 사용하면 입력 데이터의 유효성을 검증할 수 있습니다.
📌 BindingResult
를 활용하면 유효성 검사가 실패한 경우 에러를 처리할 수 있습니다.
@PostMapping("/submit")
public String handleForm(@Valid @ModelAttribute("formObject") FormObject formObject, BindingResult result) {
if (result.hasErrors()) {
return "errorPage";
}
return "successPage";
}
✔️ @Valid
를 사용하면 FormObject
의 유효성 검사가 자동으로 수행됩니다.
✔️ BindingResult
에 검증 오류 정보가 저장되며, 오류가 있으면 "errorPage"
를 반환합니다.
3️⃣ 커스텀 변환기 설정
📌 WebDataBinder
는 PropertyEditor
또는 Converter
를 등록하여 특정 데이터 타입을 변환할 수 있습니다.
📌 대표적으로, 날짜(String → Date) 변환기를 설정하는 경우가 많습니다.
📍 방법 1: PropertyEditor 사용
@Controller
public class MyController {
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
}
}
✔️ "yyyy-MM-dd" 형식의 문자열을 Date
객체로 변환할 수 있습니다.
✔️ false
는 빈 문자열을 null
로 처리하도록 설정하는 옵션입니다.
📍 방법 2: Converter 사용 (Spring 방식)
📌 PropertyEditor
보다 최신 방식으로, Spring의 Converter
인터페이스를 사용할 수도 있습니다.
@Component
public class StringToDateConverter implements Converter<String, Date> {
private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
@Override
public Date convert(String source) {
try {
return dateFormat.parse(source);
} catch (ParseException e) {
throw new IllegalArgumentException("날짜 형식이 잘못되었습니다: " + source);
}
}
}
그리고 WebMvcConfigurer
에서 등록하면 전역적으로 적용할 수 있습니다.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new StringToDateConverter());
}
}
✔️ 모든 컨트롤러에서 자동으로 날짜 변환이 적용됩니다!
4️⃣ 바인딩 허용/제한 필드 설정
📌 WebDataBinder
를 활용하면 특정 필드만 허용하거나 제한할 수 있습니다.
📌 클라이언트가 임의의 필드를 바인딩하는 것을 방지할 때 유용합니다.
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAllowedFields("name", "email", "phone"); // 허용된 필드만 바인딩
}
✔️ "name"
, "email"
, "phone"
필드만 바인딩을 허용하며, 나머지는 무시됩니다.
✔️ 예를 들어, 관리자 권한이 필요한 isAdmin
필드를 클라이언트가 조작하는 것을 막을 수 있음!
🚀 WebDataBinder 활용 예제 (실전 코드)
📌 UserForm
데이터를 받아서 유효성 검사 후 처리하는 예제입니다.
📌 DTO (데이터 전송 객체)
@Data
public class UserForm {
@NotBlank(message = "이름은 필수 입력값입니다.")
private String name;
@Email(message = "유효한 이메일 주소를 입력하세요.")
private String email;
@Past(message = "생년월일은 과거 날짜여야 합니다.")
private Date birthDate;
}
📌 컨트롤러 (WebDataBinder 활용)
@Controller
public class UserController {
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
}
@PostMapping("/register")
public String registerUser(@Valid @ModelAttribute("userForm") UserForm userForm, BindingResult result) {
if (result.hasErrors()) {
return "registrationForm"; // 오류 발생 시 다시 폼 페이지로
}
return "successPage"; // 성공 페이지로 이동
}
}
✔️ 사용자가 yyyy-MM-dd
형식의 생년월일을 입력하면 Date
객체로 변환됩니다.
✔️ @Valid
와 BindingResult
를 활용해 유효성 검사를 수행하고 오류가 있으면 폼 페이지를 다시 렌더링합니다.
🎯 정리
✅ WebDataBinder
는 웹 요청 데이터를 Java 객체로 바인딩하는 핵심 기능을 수행합니다.
✅ @InitBinder
를 사용하여 커스텀 변환기(PropertyEditor, Converter) 적용 가능
✅ @Valid
와 함께 사용하여 데이터 유효성 검사를 수행할 수 있음
✅ setAllowedFields()
를 사용하여 불필요한 필드 바인딩을 차단하여 보안 강화
💡 한 줄 요약:
WebDataBinder는 데이터 바인딩과 변환을 손쉽게 처리할 수 있도록 도와주는 Spring MVC의 강력한 도구!
🛠️ 이제 WebDataBinder를 활용하여 더욱 견고한 웹 애플리케이션을 개발하세요! 🚀
'Spring Framework > Web on Servlet Stack' 카테고리의 다른 글
Annotated Controllers[3] - @CookieValue (0) | 2024.10.09 |
---|---|
@RequestHeader (0) | 2024.10.09 |
Annotated Controllers[1] (1) | 2024.10.06 |
Filter (0) | 2023.05.19 |
Servlet (0) | 2023.04.17 |