https://sundaland.tistory.com/333
[ ▶ @InitBinder ]
@InitBinder 어노테이션은 스프링 MVC에서 WebDataBinder를 초기화하고 사용자 정의 바인딩 로직을 설정하는 데 사용된다. WebDataBinder는 HTTP 요청에서 전달된 파라미터를 특정 객체에 바인딩할 때 사용되는 중요한 역할을 담당한다.
[ ▷ @InitBinder의 주요 역할 ]
- 요청 파라미터를 객체에 바인딩: HTTP 요청에서 전달된 데이터를 모델 객체에 바인딩할 때 데이터 형 변환 및 유효성 검사에 관여한다.
- 문자열 데이터를 객체 속성 유형으로 변환: 요청에서 전달된 값(일반적으로 문자열)을 모델 객체의 속성 유형에 맞게 변환한다. 예를 들어, 날짜 형식의 문자열을 Date 객체로 변환하는 등의 작업을 수행한다.
- HTML 폼을 렌더링할 때 객체 속성을 문자열로 변환: 객체 데이터를 문자열로 변환하여 HTML 폼에 출력할 수 있도록 도와준다.
@InitBinder 메서드는 특정 컨트롤러에만 적용되거나, @ControllerAdvice를 사용하여 여러 컨트롤러에서 공통적으로 적용될 수도 있다.
[ ▷ @InitBinder 사용 예시 ]
[ ▷ 기본 사용 예시 (날짜 형식 변환) ]
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 타입의 필드를 변환할 때 사용할 사용자 정의 변환기를 등록한다.
[ ▷ 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를 설정할 수 있다.
[ ▷ 특정 필드만 허용하기 ]
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"라는 필드만 허용되며, 다른 필드가 요청에 포함되어도 무시됩니다.
[ ▷ 특정 필드 허용 및 생성자 바인딩 사용 ]
생성자 바인딩을 사용하면 객체의 생성자에 필요한 필드만 바인딩되고, 다른 요청 파라미터는 무시됩니다. 이를 통해 데이터 바인딩의 보안성을 높일 수 있다.
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 엔티티)을 직접 바인딩하지 말고, 폼에서 필요한 필드만을 가진 전용 모델 객체를 사용하는 것이 좋다. 이는 불필요하거나 민감한 데이터가 바인딩되는 것을 방지한다.
[ ▷ 폼 객체 설계 ]
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
'Web on Servlet Stack' 카테고리의 다른 글
Exceptions (0) | 2024.10.14 |
---|---|
Validation (0) | 2024.10.14 |
Model (0) | 2024.10.14 |
Handler Method : Jackson JSON (0) | 2024.10.11 |
Redirect Attributes (0) | 2024.10.11 |