본문 바로가기
  • 실행력이 모든걸 결정한다
Spring Series/Spring Framework

[Spring] 자주 사용되는 WebDataBinder 설정 항목

by 김코더 김주역 2022. 9. 22.
반응형

이전 포스팅에서는 WebDataBinder에 커스텀 프로퍼티 에디터와 컨버전 서비스를 등록하는 방법을 소개했다.

https://kimcoder.tistory.com/521

 

[Spring] 프로퍼티 바인딩 방식(1) - PropertyEditor

프로퍼티 바인딩은 텍스트 형식의 값을 적절한 타입으로 변환해서 객체의 프로퍼티에 넣어주는 것으로, 대표적으로 XML 설정이나 HTTP 요청 파라미터 처리에 필요하다. 여러 개의 포스팅에 걸쳐 S

kimcoder.tistory.com

 

이번에는 WebDataBinder에 지정할 수 있는 더 많은 유용한 바인딩 옵션들을 살펴볼 것이다.

WebDataBinder은 DataBinder 클래스를 상속받기 때문에, 아래 두 문서를 같이 보면서 이해하면 좋을 것 같다.

 

 

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

 

 

반응형

댓글