2024. 10. 9. 17:28ㆍSpring Framework/Web on Servlet Stack
@InitBinder
어노테이션은 스프링 MVC에서 WebDataBinder를 초기화하고 사용자 정의 바인딩 로직을 설정하는 데 사용됩니다. WebDataBinder는 HTTP 요청에서 전달된 파라미터를 특정 객체에 바인딩할 때 사용되는 중요한 역할을 담당합니다.
@InitBinder
의 주요 역할
- 요청 파라미터를 객체에 바인딩: HTTP 요청에서 전달된 데이터를 모델 객체에 바인딩할 때 데이터 형 변환 및 유효성 검사에 관여합니다.
- 문자열 데이터를 객체 속성 유형으로 변환: 요청에서 전달된 값(일반적으로 문자열)을 모델 객체의 속성 유형에 맞게 변환합니다. 예를 들어, 날짜 형식의 문자열을
Date
객체로 변환하는 등의 작업을 수행합니다. - HTML 폼을 렌더링할 때 객체 속성을 문자열로 변환: 객체 데이터를 문자열로 변환하여 HTML 폼에 출력할 수 있도록 도와줍니다.
@InitBinder
메서드는 특정 컨트롤러에만 적용되거나, @ControllerAdvice
를 사용하여 여러 컨트롤러에서 공통적으로 적용될 수도 있습니다.
@InitBinder
사용 예시
1. 기본 사용 예시: 날짜 형식 변환
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.beans.propertyeditors.CustomDateEditor;
@Controller
public class FormController {
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false); // 엄격한 날짜 형식 사용
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
}
@RequestMapping("/submitForm")
public String submitForm(Date date) {
System.out.println("Submitted Date: " + date);
return "success";
}
}
코드 설명:
@InitBinder
메서드: 이 메서드는WebDataBinder
를 초기화하여 요청 파라미터로 전달된 문자열을Date
객체로 변환할 수 있도록CustomDateEditor
를 등록합니다. 이 방식으로 사용자는 "yyyy-MM-dd" 형식의 문자열을Date
로 변환하여 사용할 수 있습니다.registerCustomEditor
:Date
타입의 필드를 변환할 때 사용할 사용자 정의 변환기를 등록합니다.
2. Formatter
를 사용한 변환
Formatter
를 사용하면 좀 더 직관적인 형식 변환기를 사용할 수 있습니다. 이를 통해 문자열을 특정 형식으로 쉽게 변환할 수 있습니다.
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.format.datetime.DateFormatter;
@Controller
public class FormController {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
}
@RequestMapping("/submitForm")
public String submitForm(Date date) {
System.out.println("Formatted Date: " + date);
return "success";
}
}
코드 설명:
DateFormatter
: 스프링이 제공하는Formatter
로, 날짜 형식의 문자열을 자동으로Date
객체로 변환합니다.addCustomFormatter
:DateFormatter
를 등록하여 날짜 형식의 변환을 담당합니다.
필드 바인딩 제어
때로는 HTTP 요청에서 전달된 값들이 모델 객체에 자동으로 바인딩되는 것을 제한할 필요가 있습니다. 예를 들어, 민감한 정보나 의도하지 않은 값들이 바인딩되지 않도록 하기 위해 allowedFields
를 설정할 수 있습니다.
3. 특정 필드만 허용하기
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.stereotype.Controller;
@Controller
public class ChangeEmailController {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAllowedFields("oldEmailAddress", "newEmailAddress");
}
// 이메일 변경 요청 처리
}
코드 설명:
setAllowedFields
: 이 메서드는 요청 파라미터로부터 어떤 필드들만 바인딩할지 지정합니다."oldEmailAddress"
와"newEmailAddress"
라는 필드만 허용되며, 다른 필드가 요청에 포함되어도 무시됩니다.
4. 특정 필드 허용 및 생성자 바인딩 사용
생성자 바인딩을 사용하면 객체의 생성자에 필요한 필드만 바인딩되고, 다른 요청 파라미터는 무시됩니다. 이를 통해 데이터 바인딩의 보안성을 높일 수 있습니다.
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.stereotype.Controller;
@Controller
public class MyController {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setDeclarativeBinding(true); // 생성자 바인딩 사용
}
// 생성자 바인딩을 통해 특정 필드만 처리하는 메서드
}
코드 설명:
setDeclarativeBinding(true)
: 생성자 바인딩을 사용하면 객체의 생성자를 통해 바인딩되며, 그 외의 속성들은 바인딩되지 않습니다. 이를 통해 의도하지 않은 필드가 설정되는 것을 방지할 수 있습니다.
모델 객체 설계와 데이터 바인딩
모델 객체에 요청 파라미터를 바인딩할 때, 보안과 유효성 검사를 고려해야 합니다. 도메인 모델(예: JPA 엔티티)을 직접 바인딩하지 말고, 폼에서 필요한 필드만을 가진 전용 모델 객체를 사용하는 것이 좋습니다. 이는 불필요하거나 민감한 데이터가 바인딩되는 것을 방지합니다.
5. 폼 객체 설계
public class ChangeEmailForm {
private String oldEmailAddress;
private String newEmailAddress;
public String getOldEmailAddress() {
return oldEmailAddress;
}
public void setOldEmailAddress(String oldEmailAddress) {
this.oldEmailAddress = oldEmailAddress;
}
public String getNewEmailAddress() {
return newEmailAddress;
}
public void setNewEmailAddress(String newEmailAddress) {
this.newEmailAddress = newEmailAddress;
}
}
코드 설명:
- 폼 객체 설계: 도메인 모델 대신, 요청 파라미터와 직접적으로 매핑되는 폼 객체를 사용합니다. 이는 불필요한 데이터 바인딩을 방지할 수 있습니다.
요약
@InitBinder
는 WebDataBinder를 초기화하고 사용자 정의 바인딩 로직을 설정하는 데 사용됩니다.- 주로 요청에서 전달된 데이터를 특정 형식으로 변환하거나, 특정 필드만 바인딩하는 용도로 사용됩니다.
- Formatter나 PropertyEditor를 사용해 데이터 형 변환을 처리할 수 있으며, 필드 제어를 통해 보안성을 높일 수 있습니다.
- 폼 객체를 설계하여 필요한 데이터만 바인딩하고, 도메인 모델 객체에 직접 바인딩하지 않는 것이 좋은 관행입니다.
이 방식은 보안성을 유지하면서 요청 데이터를 모델 객체에 효과적으로 바인딩할 수 있도록 도와줍니다.
참고 : [https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-initbinder.html]
'Spring Framework > Web on Servlet Stack' 카테고리의 다른 글
Exceptions (0) | 2024.10.09 |
---|---|
Validation (0) | 2024.10.09 |
Model (0) | 2024.10.09 |
Handler Method : Jackson JSON (0) | 2024.10.09 |
Handler Method : ResponseEntity (1) | 2024.10.09 |