일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 자바
- gradle
- 메이븐
- 토비의스프링
- Immutable
- beanfactory
- 프록시
- 링커
- 컴퓨터시스템
- ORM
- 토비의스프링3.1
- IOC
- DesignPattern
- 링킹
- DispatcherServlet
- 빌드툴
- java
- springboot
- String
- hibernate
- AutoConfiguration
- Spring
- FunctionalInterfaces
- 클린코드
- exception
- Kotlin for Java Developers
- springwebmvc
- ApplicationContext
- lambda
- JPA
- Today
- Total
엔지니어로 가는 길
@InitBinder와 WebDataBinder의 쓰임 본문
@InitBinder
@Controller나 @ControllerAdvice가 붙은 클래스는 @InitBinder가 붙은 메소드를 가질 수 있다. 이는 WebDataBinder라는 인스턴스를 초기화하는 메소드이다.
WebDataBinder
1. 요청 매개변수(form 또는 query 데이터)를 모델 객체에 바인딩한다.
Thymeleaf는 익숙하지 않기 때문에 다 이해할 수는 없지만 확실한 것은 owner와 관련된 정보를 input 태그를 이용하여 사용자로부터 입력받고 있다는 것이다. 사용자가 입력을 마치고 submit을 누르면 post 요청이 될 것이고 이걸 아래의 OwnerController의 메소드에서 잡을 것이다.
processCreationForm 메소드에 Owner 타입의 인자가 있다. Owner 타입의 인자를 확인해보면 앞서 사용자가 입력한 정보들이 담겨있는 Owner 객체가 있다. 바로 누군가 사용자가 입력한 값들을 Owner 객체에 바인딩해주었기 때문인데 이 일을 하는 친구가 바로 WebDataBinder였나보다.
2. 바인딩시 검증을 위해 Validator를 추가할 수 있다.
@InitBinder에 "pet"이란 값을 주었다. 이렇게 되면 WebDataBinder가 "pet"이라는 이름의 객체에 바인딩할 때 PetValidator를 가지고 검증을 수행한다. 검증 결과는 BindingResult에 담긴다.
3. 바인딩에서 제외할 필드를 명시할 수 있다.
HTML에서 넘어온 값 중에 "id"라는 이름의 값이 있어도 이를 객체에 바인딩하지 않는다.
4. 바인딩 하고 싶은 필드들만 명시할 수 있다.
5. 문자열 기반의 요청 값(요청 매개변수, path variables, 헤더, 쿠키 등)을 타겟 타입으로(컨트롤러 메소드 인자의 타입)으로 convert한다.
initUpdateOwnerForm 메소드의 ownerId를 보면 url의 경로는 문자열인데 이를 int로 받고 있다. 이것도 WebDataBinder가 해주는 것인가보다.
6. Formatter와 Converter를 추가할 수 있다.
7. HTML forms을 렌더링할 때 모델 객체의 값을 문자열로 format한다.
회원 정보를 수정하는 과정을 생각해보자. 회원 정보 수정 페이지는 기존에 입력했던 값들로 채워져 있는 것이 자연스럽다. 컨트롤러에서 모델에 객체를 담아 보내면, 뷰에서 모델에 있는 객체를 꺼낸 뒤 객체의 값을 사용자에게 보여준다. 모델에 있는 객체를 꺼내 사용자에게 보내줄 때 제각각인 객체의 타입을 누군가 문자열로 변환해주어야 하는데 이 일을 WebDataBinder가 한다는 의미인 것 같다.
* 코드 출처: spring-petclinic 프로젝트
* 참고: docs.spring.io/spring-framework/docs/current/reference/html/web.html
'프로그래밍 > Spring' 카테고리의 다른 글
Spring security BadCredentialException의 원인 및 해결 방법 (0) | 2021.08.26 |
---|---|
@Bean을 통한 빈 등록시 주의해야 할 점 (0) | 2021.05.17 |
Spring 빈을 생성하는 또 다른 방법 FactoryBean (0) | 2021.02.09 |
Spring Data Jpa의 DomainClassConverter가 해주는 일 (0) | 2020.11.14 |
Spring에서 axios post으로 보낸 요청 매개변수를 못받는 문제 (2) | 2020.11.13 |