Loading...
Spring Framework Reference Documentation 7.0.2의 @InitBinder의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
@InitBinderSee equivalent in the Reactive stack
@Controller 또는 @ControllerAdvice 클래스는 WebDataBinder 인스턴스를 초기화하기 위한
@InitBinder 메서드를 가질 수 있으며, 이는 다음과 같은 작업을 수행할 수 있습니다:
@Controller에서 DataBinder 커스터마이제이션은 컨트롤러 내에서 로컬하게 적용되거나,
애노테이션을 통해 이름으로 참조되는 특정 모델 애트리뷰트에만 적용될 수 있습니다.
@ControllerAdvice에서는 커스터마이제이션을 모든 컨트롤러 또는 일부 컨트롤러에 적용할 수 있습니다.
DataBinder에 타입 변환을 위해 PropertyEditor, Converter, Formatter 컴포넌트를
등록할 수 있습니다. 또는
MVC 설정을 사용하여
전역적으로 공유되는 FormattingConversionService에 Converter와 Formatter 컴포넌트를 등록할 수 있습니다.
@InitBinder 메서드는 @RequestMapping 메서드와 동일한 아규먼트를 많이 가질 수 있지만,
@ModelAttribute는 눈에 띄는 예외입니다. 일반적으로 이러한 메서드는
WebDataBinder 아규먼트(등록용)와 void 반환 값을 가지며, 예를 들면 다음과 같습니다:
1@Controller 2public class FormController { 3 4 @InitBinder (1) 5 public void initBinder(WebDataBinder binder) { 6 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 7 dateFormat.setLenient(false); 8 binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false)); 9 } 10 11 // ... 12} 13// Copied!
| 1 | @InitBinder 메서드 정의. |
1@Controller 2class FormController { 3 4 @InitBinder (1) 5 fun initBinder(binder: WebDataBinder) { 6 val dateFormat = SimpleDateFormat("yyyy-MM-dd") 7 dateFormat.isLenient = false 8 binder.registerCustomEditor(Date::class.java, CustomDateEditor(dateFormat, false)) 9 } 10 11 // ... 12} 13// Copied!
| 1 | @InitBinder 메서드 정의. |
또는, 공유되는 FormattingConversionService를 통해 Formatter 기반 구성을 사용할 때,
다음 예제에서 보듯이 동일한 접근 방식을 재사용하여 컨트롤러별 Formatter
구현을 등록할 수 있습니다:
1@Controller 2public class FormController { 3 4 @InitBinder (1) 5 protected void initBinder(WebDataBinder binder) { 6 binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd")); 7 } 8 9 // ... 10} 11// Copied!
| 1 | 커스텀 포매터에 @InitBinder 메서드를 정의. |
1@Controller 2class FormController { 3 4 @InitBinder (1) 5 protected fun initBinder(binder: WebDataBinder) { 6 binder.addCustomFormatter(DateFormatter("yyyy-MM-dd")) 7 } 8 9 // ... 10} 11// Copied!
| 1 | 커스텀 포매터에 @InitBinder 메서드를 정의. |
See equivalent in the Reactive stack
웹 요청에 대한 데이터 바인딩은 요청 파라미터를 모델 객체에 바인딩하는 것을 포함합니다. 기본적으로, 요청 파라미터는 모델 객체의 모든 public 프로퍼티에 바인딩될 수 있습니다.
이는 악의적인 클라이언트가 모델 객체 그래프에 존재하지만 설정될 것으로 예상되지 않는 프로퍼티에 대해 추가 값을 제공할 수 있음을 의미합니다. 이러한 이유로 모델 객체 설계에는 신중한 고려가 필요합니다.
모델 객체와 그 중첩 객체 그래프는 커맨드 객체, 폼 백킹 객체, 또는 POJO (Plain Old Java Object)라고도 불립니다.
좋은 방법은 JPA 또는 Hibernate 엔티티와 같은 도메인 모델을 웹 데이터 바인딩에 노출하는 대신
_전용 모델 객체_를 사용하는 것입니다. 예를 들어, 이메일 주소를 변경하는 폼에서는
입력에 필요한 프로퍼티만 선언하는 ChangeEmailForm 모델 객체를 생성합니다:
1public class ChangeEmailForm { 2 3 private String oldEmailAddress; 4 private String newEmailAddress; 5 6 public void setOldEmailAddress(String oldEmailAddress) { 7 this.oldEmailAddress = oldEmailAddress; 8 } 9 10 public String getOldEmailAddress() { 11 return this.oldEmailAddress; 12 } 13 14 public void setNewEmailAddress(String newEmailAddress) { 15 this.newEmailAddress = newEmailAddress; 16 } 17 18 public String getNewEmailAddress() { 19 return this.newEmailAddress; 20 } 21 22} 23// Copied!
또 다른 좋은 방법은 생성자 바인딩을 적용하는 것으로, 이는 생성자 아규먼트에 필요한 요청 파라미터만 사용하고 그 외의 입력은 무시합니다.
이는 기본적으로 매칭 프로퍼티가 있는 모든 요청 파라미터를 바인딩하는 프로퍼티 바인딩과 대조됩니다.
전용 모델 객체와 생성자 바인딩 둘 다 충분하지 않고, 프로퍼티 바인딩을
반드시 사용해야 한다면, 예상치 못한 프로퍼티가 설정되는 것을 방지하기 위해
WebDataBinder에 allowedFields 패턴(대소문자 구분)을 등록할 것을 강력히 권장합니다.
예를 들면 다음과 같습니다:
1@Controller 2public class ChangeEmailController { 3 4 @InitBinder 5 void initBinder(WebDataBinder binder) { 6 binder.setAllowedFields("oldEmailAddress", "newEmailAddress"); 7 } 8 9 // @RequestMapping methods, etc. 10 11} 12// Copied!
disallowedFields 패턴(대소문자 구분 없음)을 등록할 수도 있습니다. 그러나
"disallowed"보다 "allowed" 구성이 더 명시적이고 실수할 가능성이 적기 때문에
선호됩니다.
기본적으로 생성자 바인딩과 프로퍼티 바인딩이 모두 사용됩니다. 생성자 바인딩만
사용하려면, @InitBinder 메서드를 통해 WebDataBinder의 declarativeBinding 플래그를
컨트롤러 내에서 로컬하게 또는 @ControllerAdvice를 통해 전역적으로 설정할 수 있습니다.
이 플래그를 켜면 생성자 바인딩만 사용되며, allowedFields 패턴이 설정되지 않는 한
프로퍼티 바인딩은 사용되지 않습니다. 예를 들면 다음과 같습니다:
1@Controller 2public class MyController { 3 4 @InitBinder 5 void initBinder(WebDataBinder binder) { 6 binder.setDeclarativeBinding(true); 7 } 8 9 // @RequestMapping methods, etc. 10 11} 12// Copied!
Model
Validation