@initBinder (어노테이션)
해당 컨트롤러로 들어오는 요청에 대해 추가적인 설정을 할때 사용.
모든 요청 전에 initBinder를 선언한 메소드를 먼저 실행.
유효범위는 이 어노테이션을 선언한 해당 컨트롤러에서 만 적용된다.
//WebBindingInitializer : 모든 컨트롤러 내에서의 변환
Formatter - @DateTimeFormat("#");, @NumberFormat("###,###");
vo의 필드 위에 어노테이션이며 @initBinder와 동일한 기능을 가진다.
유효범위는 이 vo객체를 사용하는 모든 컨트롤러에 적용된다.
BindingResult ( 컨트롤러 매게변수)
객체에 바인딩 되는 값이 에러가 날 경우 에러 화면을 띄우는 대신 콘솔에 에러 로그를 띄우고 바인딩 값엔 null.
객체 바로 뒤에 적어야 한다.
Example
//VO : 1.예제로 사용될 객체인 user는 Date 타입의 생일 필드를 가지고있다.
@Data
public User{
@DateTimeFormat(pattern="yyyy-MM-dd") //* 어노테이션을 사용할 수도 있다.(initBiner 메서드 생략할 수 있음)
private Date birthDay; //*Date 타입
private String name;
private int age;
pirvate String[] hobby; //*배열 타입
}
//html : 2.화면에서 생일 input에 문자열을 넣어준 상황
<form action="/login" method="post">
<input name="name" value="hej_han">
<input name="age" value="10">
<input name="birthDay" value="2022-02-13">
<input name="hobby" value="soccer#game#swimming">
//"2022/02/13"... '/'를 이용하면 스프링 에서 날짜타입으로 자동 맵핑을 해줌
//하지만 현재는 '-'를 이용하여 문자열로 들어가기 때문에 셋팅을 해줘야 한다.
//hobby인 경우도 배열타입이지만 input태그에 1개의 문자열이 '#'으로 나눠져있을 뿐이다.
</form>
//controller
@initBinder //모든 요청 전에 가장 먼저 실행
public void toDate(WebDataBinder binder){
SimpleDataForm sdf = new SimpleDataForm("yyyy-MM-dd");
binder.registerCustomEditor(Data.class, new CustomEditor(sdf, false); //문자열 => 날짜타입
binder.registerCustomEditor(String[].class,"hobby", new StringArrayPropertyEditor("#"); //문자열 => 배열타입
//"hobby"와 같이 필드명을 지정하지 않을 경우 전체 적용
//CustomDateEditor() :스프링이 제공하는 날짜 변환 메서드
//registerCustomEditor
(타입, 필드명, 파싱문자열);
//@initBinder가 있으면 먼저 확인하고 없으면 스프링의 디폴트 변환기를 사용
//WebDataBinder 매게변수는 고정으로 사용
}
@PostMapping("/login")
public void login(User user, BindingResult result, Model m){
//생략...
}
registerCustomEditor에 적용할 수있는 프로퍼티에디터 메서드의 종류를 더 알고싶다면...
converter // 30.스프링의 정석 데이터의 변환과 검증(1) 35:50
propertyEditor는 iv(인스턴스 변수 = 필드)를 바꿀때 사용된다.
양방향 타입 변환
statefull 하다.(iv변수를 사용한다, )싱글톤 사용 불가. 변환 할 때마다 새로운 객체를 만든다.
Formatter == 양방향
converter 는 stateless하다. 싱글톤 사용 가능.
단방향 타입 변환( 만약 양뱡향이 필요한 경우 한 번더 converter해주면 된다.)
따라서 converter를 쓰는것이 더 바람직함.
컨버터 종류를 알고 싶다면...
@initBinder
public void toDate(WebDataBinder binder){
ConversionService conService = binder.getConversionService();
System.out.println(conService);
}
WebDataBinder의 역할
1.타입변환
2.데이터 검증(화면에서 넘어온 값을 서버에서 검사할 때 사용)