엔지니어로 가는 길

@InitBinder와 WebDataBinder의 쓰임 본문

프로그래밍/Spring

@InitBinder와 WebDataBinder의 쓰임

탐p슨 2021. 4. 11. 22:07
728x90

@InitBinder

@Controller나 @ControllerAdvice가 붙은 클래스는 @InitBinder가 붙은 메소드를 가질 수 있다. 이는 WebDataBinder라는 인스턴스를 초기화하는 메소드이다.

 

WebDataBinder

1. 요청 매개변수(form 또는 query 데이터)를 모델 객체에 바인딩한다.

spring-petclinic

 

Thymeleaf는 익숙하지 않기 때문에 다 이해할 수는 없지만 확실한 것은 owner와 관련된 정보를 input 태그를 이용하여 사용자로부터 입력받고 있다는 것이다. 사용자가 입력을 마치고 submit을 누르면 post 요청이 될 것이고 이걸 아래의 OwnerController의 메소드에서 잡을 것이다.

 

spring-petclinic

 

processCreationForm 메소드에 Owner 타입의 인자가 있다. Owner 타입의 인자를 확인해보면 앞서 사용자가 입력한 정보들이 담겨있는 Owner 객체가 있다. 바로 누군가 사용자가 입력한 값들을 Owner 객체에 바인딩해주었기 때문인데 이 일을 하는 친구가 바로 WebDataBinder였나보다.

 

2. 바인딩시 검증을 위해 Validator를 추가할 수 있다.

 

spring-petclinic

 

@InitBinder에 "pet"이란 값을 주었다. 이렇게 되면 WebDataBinder가 "pet"이라는 이름의 객체에 바인딩할 때 PetValidator를 가지고 검증을 수행한다. 검증 결과는 BindingResult에 담긴다.

 

3. 바인딩에서 제외할 필드를 명시할 수 있다.

 

spring-petclinic

 

HTML에서 넘어온 값 중에 "id"라는 이름의 값이 있어도 이를 객체에 바인딩하지 않는다.

 

4. 바인딩 하고 싶은 필드들만 명시할 수 있다.

 

5. 문자열 기반의 요청 값(요청 매개변수, path variables, 헤더, 쿠키 등)을 타겟 타입으로(컨트롤러 메소드 인자의 타입)으로 convert한다.

 

spring-petclinic

 

initUpdateOwnerForm 메소드의 ownerId를 보면 url의 경로는 문자열인데 이를 int로 받고 있다. 이것도 WebDataBinder가 해주는 것인가보다.

 

6. Formatter와 Converter를 추가할 수 있다.

 

https://docs.spring.io/spring-framework/docs/current/reference/html/web.html

 

7. HTML forms을 렌더링할 때 모델 객체의 값을 문자열로 format한다.

 

회원 정보를 수정하는 과정을 생각해보자. 회원 정보 수정 페이지는 기존에 입력했던 값들로 채워져 있는 것이 자연스럽다. 컨트롤러에서 모델에 객체를 담아 보내면, 뷰에서 모델에 있는 객체를 꺼낸 뒤 객체의 값을 사용자에게 보여준다. 모델에 있는 객체를 꺼내 사용자에게 보내줄 때 제각각인 객체의 타입을 누군가 문자열로 변환해주어야 하는데 이 일을 WebDataBinder가 한다는 의미인 것 같다.

 

spring-petclinic

 

spring-petclinic

 

* 코드 출처: spring-petclinic 프로젝트

* 참고: docs.spring.io/spring-framework/docs/current/reference/html/web.html

728x90
Comments