Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 자바
- jpa
- 스프링
- pointcut
- http
- Thymeleaf
- transaction
- Servlet
- 스프링 핵심 기능
- QueryDSL
- java
- JPQL
- kotlin
- 인프런
- db
- Exception
- Android
- SpringBoot
- spring
- 백준
- Greedy
- Proxy
- JDBC
- AOP
- springdatajpa
- 김영한
- 알고리즘
- 스프링 핵심 원리
- Spring Boot
- 그리디
Archives
- Today
- Total
개발자되기 프로젝트
Validator 분리 2 본문
- 스프링이 Validator 인터페이스를 별도로 제공하는 이유는 체계적으로 검증 기능을 도입하기 위해서임.
- 그런데 앞에서는 검증기를 직접 불러서 사용했음.
- 그런데 Validator 인터페이스를 사용해서 검증기를 만들면 스프링의 추가적인 도움을 받을 수 있음.
1. WebDataBinder를 통해 사용
- WebDataBinder 는 스프링의 파라미터 바인딩의 역할을 해주고, 검증 기능도 내부에 포함한다.
2. WebDataBinder 적용
2.1 Controller
- @InitBinder 적용, init()
- 해당 메서드에 WebDataBinder를 넘겨주고, WebDataBinder에 validator를 넣어준다.
- 이렇게 되면 Controller가 호출될 때마다 WebDataBinder를 생성한다.
- 이렇게 WebDataBinder에 검증기를 추가하면 해당 controller에서는 validator를 자동으로 적용 가능.
@Slf4j
@Controller
@RequestMapping("/validation/v2/items")
@RequiredArgsConstructor
public class ValidationItemControllerV2 {
private final ItemRepository itemRepository;
private final ItemValidator itemValidator;
@InitBinder //controller가 호출될 때 마다 실행됨. 매 번 WebDataBinder가 생성됨.
public void init(WebDataBinder dataBinder){
dataBinder.addValidators(itemValidator);
}
2.2 method
- 검증 대상 앞에 @Validated를 추가하자.
- Item에 대해 WebDataBinder에 넣어둔 Validator 가 자동으로 적용된다.
- 별도의 검증 메서드를 추가하지 않아도 된다.
- 검증 결과는 BindingResult에 담긴다.
@PostMapping("/add")
public String addItemV6(@Validated @ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model) {
//검증에 실패하면 다시 입력 폼으로 이동
if(bindingResult.hasErrors()){
log.info("errors = {}", bindingResult);
// model.addAttribute("errors", errors);
return "validation/v2/addForm";
}
//성공 로직.
Item savedItem = itemRepository.save(item);
redirectAttributes.addAttribute("itemId", savedItem.getId());
redirectAttributes.addAttribute("status", true);
return "redirect:/validation/v2/items/{itemId}";
}
3. 동작 방식
- @Validated = "검증기를 실행 하라"는 annotation
- @Validated가 붙어있으면, WebDataBinder에 등록한Validator 실행함.
- 만약 Validator가 여러개면??? 어떤거 사용하지???
- 이 때 supports()가 사용됨.
@Override
public boolean supports(Class<?> clazz) {
return Item.class.isAssignableFrom(clazz); //자식 클래스까지 커버 가능.
}
- 여기서는 supports(Item.class) 호출됨.
- 결과가 true 이므로 ItemValidator 의 validate() 가 호출된다.
4. Global 설정 - 모든 controller에 적용
- application이 WebMvcConfigurer를 구현.
- 각 controller에서 @Validated가 붙으면 해당 validator 적용이 가능.
@SpringBootApplication
public class ItemServiceApplication implements WebMvcConfigurer {
public static void main(String[] args) {
SpringApplication.run(ItemServiceApplication.class, args);
}
@Override
public Validator getValidator() {
return new ItemValidator();
}
}
5. 참고
- @Validated @Valid 둘다 사용가능하다.
- javax.validation.@Valid 를 사용하려면 build.gradle 의존관계 추가가 필요
- implementation 'org.springframework.boot:spring-boot-starter-validation'
- @Validated 는 스프링 전용 검증 애노테이션
- @Valid 는 자바 표준 검증 애노테이션
6. GitHub : 210924 @Validated
'인프런 > [인프런] 스프링 MVC 2' 카테고리의 다른 글
Bean Validation - 시작 (0) | 2021.09.25 |
---|---|
Bean Validation (0) | 2021.09.25 |
Validator 분리 1 (0) | 2021.09.24 |
오류코드와 메시지 처리6 (0) | 2021.09.24 |
오류 코드와 메시지 처리 5 (0) | 2021.09.24 |
Comments