이전 포스팅에서는 WebDataBinder에 커스텀 프로퍼티 에디터와 컨버전 서비스를 등록하는 방법을 소개했다.
https://kimcoder.tistory.com/521
이번에는 WebDataBinder에 지정할 수 있는 더 많은 유용한 바인딩 옵션들을 살펴볼 것이다.
WebDataBinder은 DataBinder 클래스를 상속받기 때문에, 아래 두 문서를 같이 보면서 이해하면 좋을 것 같다.
- WebDataBinder 문서 : https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/WebDataBinder.html
- DataBinder 문서 : https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/validation/DataBinder.html
1. allowedFields, disallowedFields
- 보안을 위해 폼의 특정 필드가 오브젝트의 프로퍼티에 바인딩되지 않도록 제한할 때 쓰인다. 악의적인 사용자가 관례적으로 많이 사용되는 프로퍼티의 이름을 추측해서 해당 이름으로 요청 파라미터를 추가해서 보내버리면 중요한 정보까지 변경되어 버릴 수도 있다.
- DataBinder.setAllowedFields() 메소드로 바인딩을 허용할 필드 목록을 지정할 수 있으며, 해당 목록 외의 모든 요청 파라미터는 다 무시한다.
- DataBinder.setDisAllowedFields() 메소드로 바인딩을 금지할 필드 목록을 지정할 수 있으며, 해당 목록 외의 모든 요청 파라미터는 다 허용한다.
- allowedFields, disAllowedFields 중 하나를 선택해서 설정하면 된다.
사용 예시
@InitBinder
public void initBinder(WebDataBinder webDataBinder) {
webDataBinder.setAllowedFields("*point", "auth"); // *(와일드카드)도 활용 가능하다.
}
2. requiredFields
- 필수로 전달받아야 하는 필드다.
- DataBinder.setRequiredFields() 메소드를 통해 필수 필드들을 지정할 수 있다.
- DataBinder.getRequiredFields() 메소드를 통해 모든 필수 필드를 조회할 수 있다.
- ServletRequestUtils.getRequiredStringParameter() 메소드를 통해 요청 내용에 특정 파라미터가 존재하지 않으면 예외를 발생시킬 수도 있다.
※ ServletRequestUtils에 관해서는 https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/ServletRequestUtils.html 문서를 참고하자.
3. fieldMarkerPrefix
- 필드마커를 통해 필드의 존재를 알기 위한 용도로 사용된다.
- HTML 폼의 체크박스에 체크가 되어 있다면 해당 필드는 "on"이라는 값으로 전달되지만, 체크가 되어 있지 않다면 해당 필드가 아예 서버로 전송되지 않는다. 코드에서 수동 바인딩을 해준다면 별 문제가 되지 않겠지만, 자동 바인딩 방식에서는 수정 폼의 체크 박스에서 체크를 해제하더라도 변경 내용이 반영되지 않는 등의 심각한 문제가 발생할 수 있다. 이를 위해 Spring은 히든 필드 이름 앞에 필드마커를 추가하는 방식을 사용하며, 필드마커의 기본값은 밑줄(_)이다.
<input type="checkbox" name="autoLogin" />
<input type="hidden" name="_autoLogin" value="on" />
- Spring은 필드마커가 붙은 요청 파라미터를 발견하면 필드마커를 제외한 이름의 필드가 폼에 존재한다고 간주하는데, 만약 존재하지 않는다면 체크박스가 해제되었다고 간주하고 해당 프로퍼티 값을 false, null 또는 빈 배열로 세팅해준다.
- WebDataBinder.setFieldMarkerPrefix() 메소드를 통해 밑줄이 아닌 다른 필드마커를 사용할 수도 있다.
4. fieldDefaultPrefix
- 히든 필드를 이용해 체크박스에 대한 디폴트 값을 지정하기 위해 사용되며, 기본값은 "!"이다.
- 체크박스에 대응되는 프로퍼티 타입이 boolean 타입이 아닌 경우에 사용할 수 있다. 아래 예시에서는 체크박스에 체크가 되어있지 않았다면 type 필드에 대응되는 프로퍼티 값이 "member"로 바인딩된다.
<input type="checkbox" name="type" value="admin" />
<input type="hidden" name="!type" value="member" />
- WebDataBinder.setFieldDefaultPrefix() 메소드를 통해 fieldDefaultPrefix 값을 변경할 수도 있다.
● 참고 자료 : 토비의 스프링 3.1 Vol.2
'Spring Series > Spring Framework' 카테고리의 다른 글
[Spring] 프로퍼티 파일에서 BindingResult 메시지 관리하기 (0) | 2022.09.25 |
---|---|
[Spring] JSR-303 Bean 검증 방식 (0) | 2022.09.25 |
[Spring] 프로퍼티 바인딩 방식(2) - Converter와 Formatter (0) | 2022.09.21 |
[Spring] 프로퍼티 바인딩 방식(1) - PropertyEditor (0) | 2022.09.17 |
[Spring] @SessionAttributes와 SessionStatus (0) | 2022.09.14 |
댓글