WebDataBinder

2023. 5. 1. 16:46Spring Framework/Web on Servlet Stack

📌 WebDataBinder란?

WebDataBinder웹 요청 파라미터를 JavaBean 객체로 바인딩하는 특별한 DataBinder입니다.
📌 서블릿 API에 종속되지 않으며, ServletRequestDataBinder와 같은 구체적인 변형 클래스의 기본 역할을 합니다.
📌 주요 사용 사례:

  • 컨트롤러에서 폼 데이터를 객체로 자동 변환
  • JSON 데이터를 Java 객체로 변환
  • 데이터 유효성 검사 수행
  • 커스텀 변환기 적용 가능

⚠️ 보안 경고:
데이터 바인딩을 사용할 때 외부 클라이언트가 특정 객체 그래프를 조작할 위험이 있으므로,
허용되지 않은 필드 바인딩을 막고 적절한 보안 조치를 취해야 합니다.

WebDataBinder의 주요 기능

1️⃣ 데이터 바인딩 (HTTP 요청 → Java 객체)

WebDataBinderHTTP 요청 파라미터를 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️⃣ 커스텀 변환기 설정

📌 WebDataBinderPropertyEditor 또는 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 객체로 변환됩니다.
✔️ @ValidBindingResult를 활용해 유효성 검사를 수행하고 오류가 있으면 폼 페이지를 다시 렌더링합니다.

🎯 정리

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