1. BindingResult
요청이 들어오면 주소에 붙어온 파라미터를 WebDataBinder가 1. 타입변환, 2. 데이터 검증 실행 후 BindingResult에 결과나 에러를 담아서 컨트롤러로 보내준다고 했다.
BindingResult는 파라미터에서 바인딩할 객체 바로 뒤에 넣어줘야 한다.
형변활 할 수 없는 파라미터가 들어오면 오류가 뜨지만,(ex. Date 형식에 문자열) BindingResult를 파라미터로 넣어주면 형변환 실패 시 에러페이지로 넘어가지 않고 null값으로 받아와 컨트롤러가 처리할 수 있도록 해준다.
2. 데이터 변환
< @InitBinder >
어떻게 형변환 해줄 지 컨트롤러에서 @InitBinder 애노테이션을 가진 메서드를 생성해 직접 지정해 줄 수 있다. 해당 메서드가 있는 컨트롤러 내에서만 적용된다.
@InitBinder
public void toDate(WebDataBinder binder) { // 파라메터로 WebDataBinder 필수
// Date를 yyy-MM-dd 형식으로만 받아오도록 설정
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
binder.registerCustomEditor(Date.class, new CustomDateEditor(df, false));
// String[] 을 # 구분자로 구분해 받아와서 저장하도록 설정
binder.registerCustomEditor(String[].class, new StringArrayPropertyEditor("#"));
// 특정 필드(아래에선 hobby)에만 형변환 적용
binder.registerCustomEditor(String[].class, "hobby", new StringArrayPropertyEditor("#"));
}
그러면 yyyy-MM-dd 형식으로 입력하면 데이터타입을 Date로, #로 연결된 문자열을 받아와 String 배열로 형변환 해준다.
< @DateTimeFormat >
혹은 위에서 날짜 형식을 지정하는 대신, 필드에 @DateTimeFormat 애노테이션을 이용해 형식을 정의해줘도 된다.
1) PropertyEditor
지금까지 설명한 것처럼 양방향으로 타입 변환하는 것을 PropertyEditor라고 한다.
디폴트는 스프링이 기본적으로 제공하고, 사용자가 직접 구현해 커스텀으로 만들 수도 있다. 이 때는 PropertyEditorSupport를 상속하면 편리하다.
모든 컨트롤러 내에서 변환할 땐 WebBindingInitializer를 구현 후 등록하는 게, 특정 컨트롤러 내에서만 변환할 땐 컨트롤러에 @InitBinder가 붙은 메서드를 작성하는 게 좋다.
2) Converter와 ConversionService
Converter는 단방향 타입 변환이다. 인스턴스 변수로서 싱글톤 패턴이 불가한 PropertyEditor의 단점을 개선했다.
아래 예시에서 Converter<String, String[]> 으로 되어있다. 즉 String을 String[]로 변환한다는 의미이다.
위와 같이 Converter를 만들어서 ConversionService에 등록해야한다. 스프링에서는 WebDataBinder에 DefaultFormattingConversionService가 기본 등록되어 있다.
모든 컨트롤러 내에서 변환할 때는 ConfigurableWebBindingInitializer를 설정하고, 특정 컨트롤러 내에서만 변환할 때는 컨트롤러에 @InitBinder가 붙은 메서드를 이용한다.
3) Formatter
양방향 타입 변환이 되며, 바인딩할 필드에 @NumberFormat, @DateTimeFormat 등 애노테이션을 이용해 적용한다.
형변환 우선순위는 커스텀 PE -> ConversionService -> 디폴트 PE 이다.
참조
https://fastcampus.co.kr/dev_academy_nks
'3. Back-end > 3-2. Spring MVC - 남궁성' 카테고리의 다른 글
Spring MVC - [ Spring DI ] (0) | 2023.02.08 |
---|---|
Spring MVC - [ 데이터의 검증 ] (0) | 2023.02.02 |
Spring MVC - [ DispatcherServlet ] (0) | 2023.02.01 |
Spring MVC - [ 예외처리 ] (0) | 2023.01.30 |
Spring MVC - [ 로그인 시 원래 목적 페이지로 이동 ] (0) | 2023.01.29 |