데이터 변환과 검증
1.변환
1-1.WebDataBinder
요청메시지가 들어오면 쿼리스트링(요청메세지의 빨간줄)의 값은 Map으로 담긴다. Controller인 main객체에서 @ModelAttribute Mydate를 매개변수로 가지면 그림과 같이 MyDate 객체가 생성되고 요청 데이터들이 담기게 된다. 데이터가 넘어가는 중간에 WebDataBinder가 데이터의 타입을 변환하고 검증하는 작업을 한다.
Map담긴 데이터의 타입은 String이다 하지만 MyDate에 담긴 데이터의 타입은 Int다. Map에 담긴 데이터가 MyDate에 담기기 위해선 Int 타입으로 변경 해야하는데 스프링에서는 WebDataBinder를 통해 타입 변환을 시킨다. 타입이 변환되면 에러, 결과값을 BindingResult에 저장한다.
MyDate 객체의 month와 day는 범위를 제한한다. 즉 month는 12개로 되어있기 때문에 1부터 12의 값을 가져야하고 day는 31개로 되어있기 때문에 1부터 31의 값을 가져야한다. 이런 조건을 맞춰주기 위해 타입과 마찬가지로WebDataBinder에서 데이터를 검증하는 작업을 해준다. 하지만 검증만 할 뿐이지 데이터를 변화시키지는 않는다.
검증 작업이 완료되면, 에러 및 결과를 BindingResult로 저장하고 Controller에게 저장된 BindingResult를 매개변수로 넘긴다.
1.변환
1-1.PropertyEditor
- 양방향 타입 변화을 한다.(String -> 타입, 타입 -> String)
- 특정 타입이나 이름의 필드에 적용 가능하다.
- 모든 컨트롤러 내에서 변환 할 때 - WebBindingInitializer를 구현 후 등록한다.
- 특정 컨트롤러 내에서 변환 할 때 - 컨트롤러에 @InitBinder가 붙은 메서드를 작성한다.
1-2.Converter와 ConversionService
Converter
- 단뱡향 타입 변환을 한다. (타입 A -> 타입 B)
- PropertyEditor의 단점(싱글톤이 아니기 때문에 변수 생성을 반복해야함) 개선(stateful -> stateless)
ConversionService
- 타입 변환 서비스를 제공, 여러 Converter 등록 가능
- WebDataBinder에 DefaultFormattingConversionService이 기본 등록
- 모든 컨트롤러 내에서의 변환 - ConfigurableWebBindingInitializer를 설정해서 사용
- 특정 컨트롤러 내에서의 변환 - 컨트롤러에 @InitBinder가 붙은 메서드를 작성
1-3.Formatter
- 양방향 타입 변환(String -> 타입, 타입 -> String)
- 바인딩할 필드에 적용 - @NumberFormat, @DateTimeFormat
2.검증
2-1 Validator란
객체를 검증하기 위한 인터페이스로 객체 검증기(validator)구현에 사용된다.
2-2 Validator를 이용한 검증 - 수동
Validator를 직접 생성하고 검증한다.
2-2. Validator를 이용한 검증 - 자동
자동으로 검증을 할 때는 @InitBinder가 붙은 메서드에 Validator를 등록하고 @Valid를 이용해서 검증하면 된다. 하지만 등록과 검증은 같은 Controller내에서만 가능하다는 한계가 있다. 이를 해결하기 위해 글로벌 Validator를 사용한다.
2-3. 글로벌 Validator
글로벌 Validator는 이름 그대로 모든 영역에 검증을 활용할 수 있는 기능이다. 개별 객체를 검증하는 게 아니라 다수의 객체를 검증하면 글로벌 Validator를 사용한다.
- 글로벌 Validator 등록 방법
글로벌 Validator를 사용 하기 위해선 Servlet-Context.xml에 들어가서 위의 그림과 같이 Bean과 annotation-driven을 입력해준다. 그러면 어떤 객체에서든 @Valied를 통해 검증가능하다.
- 글로벌 Validator와 로컬 Validator를 동시에 적용하는 방법
글로벌 Validator와 로컬 Validator를 동시에 적용하는 방법이 있는데 위의 코드와 같이 로컬 Validator를 추가 등록하는 방법이다.
출처:스프링의 정석 : 남궁성과 끝까지 간다(패스트 캠퍼스 강좌)
'Spring > SpringMVC' 카테고리의 다른 글
[SpringMVC] rediect와 forward (0) | 2022.02.26 |
---|---|
[SpringMVC] 요청과 응답 (0) | 2022.02.25 |
[Spring MVC] MVC 패턴 (0) | 2022.02.23 |
[Spring MVC] 예외처리 (0) | 2022.02.23 |
[Spring MVC] 쿠키와 세션 (0) | 2022.02.22 |