본문 바로가기

웹개발/Spring

Spring Validation

- org.springframework.validation.Validator    : 인터페이스

=> 스프링에서 제공하는 폼데이터 검증 객체

 

 

Validator 의 메소드 

  1. supports
    • public boolean supports(Class<?> clazz){}
      • 이 Validator가 제공된 Classd의 인스턴스(clazz)를 유효성검사할 수 있는가?
      • @Override
        public boolean supports(Class<?> clazz){
        	System.out.println("supports(" + clazz.getName() + ")");
            // 검증할 객체의 클래스 타입인지 확인 : WriteDTO = clazz; 가능 여부
            return WriteDTO.class.isAssignableFrom(clazz);
        }
  2. validate
    • public void validate(Object target, Errors errors){}
      • 주어진 객체(target)에 유효성검사를 하고, 유효성 검사에 오류가 있는 경우 주어진 객체에 이 오류들을 errors에 등록한다. 
      • @Override
        public void validate(Object target, Errors errors){
        	
            if(에러 있으면){
            	errors.rejectValue("에러 있는 필드명", "에러코드");
            }
            
            ...
        }

- 컨트롤러에서 validator 사용 예시

@RequestMapping("writeOk.do")
public String writeOk(@ModelAttribute("dto") WriteDTO dto, BindingResult result){
	String page = "board/writeOk";
    
    // validator 객체 생성
    // BoadValidator는 interface validator를 implement 한 클래스
    BoardValidator validator = new BoardValidator();
    validator.validate(dto, result);
    
    if(result.hasErrors()){	// 에러 있으면
    	page = "board/write";	// 원래 폼으로 돌아가기
    }
    
    return page;
}

= > validate(dto, result)에서 알 수 있듯이 BindingResult는 Errors를 상속받고 있다. 

 

 

Primitive vs. Wrapper

form 에서 int type의 데이터가 입력이 안되었을 때(or binding 실패시) 0으로 입력이 되고, Integer type의 데이터가 입력이 안되었을 때(or binding 실패시) null 값으로 입력이 됨.

 => 이러한 이유로 primitive type 보단 wrapper 타입으로 설정

 

 

지금까지는 handler method에서 직접 validate() 메소드를 직접 호출해서 사용하였는데, 이렇게 직접 호출하지 않고, 스프링 프레임워크에서 호출하는 방법도 있다.

=> @Valid 와 @InitBinder       <-hibernate-validator가 있어야 하는데 이미 있음.

 

  1. 컨트롤러에 @InitBinder 추가
    1. // 컨트롤러 클래스의 handler method 에서 폼 데이터를 바인딩할 때 검증하는 객체 지정
      @InitBinder
      public void initBinder(WebDataBinder binder){
      	binder.setValidator(new BoardValidator());	
          // BoardValidator : validator 인터페이스를 implement한 클래스
      }
  2. 폼 데이터 검증을 필요로 하는 handler method에서 @Valid 사용
    1. @RequestMapping("writeOk.do")
      public String writeOk(@ModelAttribute("dto") @Valid WriteDTO dto, BindingResult result){
      	String page = "board/writeOk";
          
          if(result.hasErrors()){
          	page = "board/write";
          }
          
          return page;
      }
      [!] BindingResult 보다 Model 이 뒤에 와야 함.

+ 에러시 원래 url로 돌아가기 : redirect: 사용

@RequestMapping("writeOk")
public String writeOk(@ModelAttribute("dto") @Valid WriteDTO dto
					, BindingResult result
                    , Model model
                    , RedirectAttributes redirectAttrs
                    ){
	String page = "board/writeOk";
    
    if(result.hasErrors()){
    	redirectAttrs.addFlashAttribute("w", dto); // 원래 입력한 값 돌려주기
        
        if(result.getFieldError("uid")!=null)
        	redirectAtts.addFlashAttribute("errUid", "uid 값은 0보다 큰 정수이어야 합니다.");
        if(result.getFieldError("name")!=null)
        	redirectAttrs.addFlashAttribute("errName", "name은 필수입니다.");
            
        page = "redirect:/board/write";
    }

	return page;
}

 

'웹개발 > Spring' 카테고리의 다른 글

1: N 관계 매핑  (0) 2021.12.06
[JPA] Auto-Generated + PK 만드는 법  (0) 2021.12.06
Maven 이란?  (0) 2021.11.29
커맨드 객체(Command Object)  (0) 2021.11.29
@RequestParam  (0) 2021.11.29