@initBinder, @DateTimeFormat, BindingResult, propertyEditor, converter, Formatter

Web Development assistant·2022년 2월 13일
0

# spring

목록 보기
12/32

@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에 적용할 수있는 프로퍼티에디터 메서드의 종류를 더 알고싶다면...

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/propertyeditors/package-summary.html

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.데이터 검증(화면에서 넘어온 값을 서버에서 검사할 때 사용)

0개의 댓글