WebDataBinder
- 타입변환 : 타입이 불일치할 때 타입을 변환해서 BindingResult에 저장 (에러시 에러 저장), BindingResult는 데이터(예시에선 date) 바로뒤에 붙어 와야 한다.
- 데이터 검증 : month의 경우 1~12 같은 제약사항 검증 (에러시 에러저장)
타입변환
- 기본적으로 스프링에서 자동으로 변환을 해준다.
- 커스텀 변환기능을 추가 할 수 있다.
- 우선순위: 커스텀PropertyEditor, ConversionService, 디폴트PropertyEditor 순
또는 위에 처럼 @DateTimeFormat 에너테이션을 이용해서 필드에서 형식을 지정해줘도 됨, 숫자나 날짜는 많이 쓰여서 지원이 됨
PropertyEditor
- 양방향 타입 변환(String -> 타입 , 타입 <-String), 특정 타입이나 이름의 필드에 적용가능
- 디폴트 PropertyEditor: 스프링이 기본적으로 제공
- 커스텀 PropertyEditor: 사용자가 직접 구현. PropertyEditorSupport를 상속하면 편리
- 모든 컨트롤러 내에서의 변환 - WebBindingInitializer를 구현 후 등록
- 특정 컨트롤러 내에서의 변환 - 컨트롤러에 @InitBinder가 붙은 메서드를 작성
Converter( PropertyEditor보다 이걸 사용하는게 좋다.)
- Converter - 단방향 타입 변환(타입A -> 타입B)
->PropertyEditor의 단점을 개선 (stateful ->stateless) - 양방향 구현시 두번쓰면 됨
위 코드는 스트링이 들어오면 스트링배열로 반환한다는 말
ConversionService
- 타입 변환 서비스를 제공
- 여러 Converter를 등록 가능
- WebDataBinder에 DefaultFormattingConversionService가 기본 등록
- 모든 컨트롤러 내에서의 변환 - ConfigurableWebbindingInitializer를 설정해서 사용
- 특정 컨트롤러 내에서의 변환 - 컨트롤러에 @InitBinder가 붙은 메서드를 작성
Formatter
- 양방향 타입변환(String -> 타입, 타입 -> String)
- 바인딩할 필드에 적용- NumberFormat, @DateTimeFormat
타입변환
validator
- 객체를 검증하기 위한 인터페이스, 객체 검증기구현에 사용
- 위에서 사용한 BindingResult는 Errors의 자식인터페이스
- 컨트롤러에서 직접 검증할 수도 있지만 가독성이 좋지않아 따로 validator를 만들어 등록하여 사용
- 같은컨트롤러클래스에서 작동
글로벌 Validator
- 하나의 Validator로 여러 객체를 검증할 때, 글로벌 Validator로 등록
- 글로벌 Validator로 등록하는 방법: Servlet-context.xml에서 아래와 같이 수정
- 등록시 @Valid 어노테이션 사용가능
- 로컬 Validator와 글로벌 Validator 동시 적용시 add를 이용하여 추가해주면 됨
MessageSouce
- 다양한 리소스에서 메시지를 읽기 위한 인터페이스
- Locale에는 지역정보가 들어있다. 이정보를 이용하여 error_message.properties를 나라별로 다르게 만들어서 다르게 보여줄 수 있다.(error_message_ko, erorr_message_en,default)
- 프로퍼티 파일을 메시지 소스로 하는 ResourceBundleMessageSource를 등록 (ServletContext.xml)
- error_message.properies 파일을 생성해줘야함. 경로는 위 프로터피중간에 error_message 우측의 주소
- {1}~{2}는 인터페이스의 args에서 가져온다.
- required는 값이 빈값인지
- jsp에서 검증 메시지를 출력하기 위해서는 태그 라이브러리를 사용
- invalidLen 체크 예시 (맨뒤칸은 defaultmessage; 아래코드에서는 null)
'I leaned > 스프링,스프링부트' 카테고리의 다른 글
JPA N+1문제 와 Fetch join (0) | 2023.07.10 |
---|---|
컨트롤러에 비즈니스로직을 넣으면 안되는 이유 (0) | 2023.07.04 |
DispatcherServlet (0) | 2023.05.26 |
예외처리 (0) | 2023.05.25 |
세션(Session) (0) | 2023.05.24 |