아무거나

[spring] 폼 데이터 값 검증 본문

Java & Kotlin/Spring

[spring] 폼 데이터 값 검증

전봉근 2019. 12. 25. 23:59
반응형

[spring] 폼 데이터 값 검증

 

1. Validator를 이용한 검증

   - 폼에서 전달 되는 데이터를 커맨드 객체에 담아 컨트롤 객체에 전달 한다고 하였다.

     이때 커맨드 객체의 유효성을 검사할 수 있다. ( 해당 검사방법은 Validator 인터페이스를 이용하여 서버에서 검사하는 방법이다. )

     [ex]

@RequestMapping("/bong/create")
public String testCreate(@ModelAttribute("m") Member member, BindingResult result) { // 에러의 결과를 바인딩한 객체(BindingResult)

    ....

    BongValidator validator = new BongValidator();
    validator.validate(member, result); // 유효성 검사
    
    if (result.hasErrors()) { // 에러가 있다면
    	....
    }

    ....
}     

 

     [BongValidator.java]

public void validate(Object obj, Errors errors) { // errors 에러발생시 에러를 담는곳, obj는 커맨드 객체
    Bong bong = (Bong)obj; // 커맨드 객체를 내가 원하는 객체로 캐스팅
    String bongName = bong.getName();
    if (bongName == null || bongName.trim().isEmpty()) {
        System.out.println("bong is null or empty"); // 로그찍음
        errors.rejectValue("name", "empty"); // name필드가 empty다. 1번째는 필드명 2번째는 메세지
    }
}

     

 

[Validator 예제 소스 참고]

import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

public class StudentValidator implements Validator { 
    // 아래 Override된 메소드는 기본적으로 구현하여야함.
    @Override
    public boolean supports(Class<?> arg0) {
    	return Bong.class.isAssignableFrom(arg0);  // 검증할 객체의 클래스 타입 정보를 명시해줌.
    }

    @Override
    public void validate(Object obj, Errors errors) {
        System.out.println("validate()");
        Student student = (Student)obj;

        String studentName = student.getName();
        if(studentName == null || studentName.trim().isEmpty()) {
            System.out.println("studentName is null or empty");
            errors.rejectValue("name", "trouble");
    	}

    	int studentId = student.getId();
        if(studentId == 0) {
            System.out.println("studentId is 0");
            errors.rejectValue("id", "trouble");
        }
    }
}

 

 

2. ValidationUtils 클래스

   - 데이터 검증을 위해서 Validator 인터페이스의 validate() 메소드를 사용하였다.

     ValidationUtils 클래스는 validate() 메소드를 좀 더 편리하게 사용할 수 있도록 고안된 클래스

     예를 들어 기존에

     String studentName = student.getName();

     if(studentName == null || studentName.trim().isEmpty()) {

         System.out.println("studentName is null or empty");

         errors.rejectValue("name", "trouble");

     }

 

     위 코드를 아래 코드와 같이 간소화 시킬 수 있다.

     ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "trouble"); // 값이 비어있거나 공백일 경우에 에러를 추출한다.

 

 

3. @Valid와 @InitBinder

   - 데이터 검증을 위해서 Validator 인터페이스를 구현한 클래스를 만들고, validate() 메소드를 직접 호출하여 사용하였다.

     이번에는 직접 호출하지 않고, 스프링 프레임워크에서 호출하는 방법에 대해 알아보자.

     

     의존추가(maven기준)

<dependency>

<groupId>org.hibernate</groupId>

<artifactId>hibernate-validator</artifactId>

<version>4.2.0.Final</version>

</dependency>

 

 커맨드 객체 앞에다 @Valid라는 어노테이션을 붙인다.

@RequestMapping("/bong/{bongId}")  // path는 위 url의 11을 bongId로 넣어준다.
public String test(@ModelAttribute("student") @Valid Student student, BindingResult result) {

    ....

    위의 @Valid 선언 때문에 validator 메소드를 호출 안해도된다.
    // StudentValidator validator = new StudentValidator();
    // validator.validator(student, result);

    ....
}

 

그리고 컨트롤러에 @InitBinder어노테이션을 선언한 initBinder메소드를 선언해주면 스프링 프레임워크에서 알아서 유효성 검사를 다 해준다.

@InitBinder

protected void initBinder(WebDataBinder binder){ // 커맨드 객체 데이터를 바인딩한다.

    binder.setValidator(new StudentValidator()); // StudentValidator에 set해준다.

}

 

* 재차 말하지만 위에 메소드가 자동적으로 동작하기 위해선 pom.xml에 hibernate-validator 라이브러리 추가한다.

 

 

참고: https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%94%84%EB%A7%81-%EA%B0%95%EC%A2%8C/dashboard

반응형

'Java & Kotlin > Spring' 카테고리의 다른 글

[spring] 트랜잭션(Transaction) - 1  (0) 2019.12.26
[spring] JDBC  (0) 2019.12.26
[spring] @RequestMapping 파라미터  (0) 2019.12.25
[spring] Form 데이터  (0) 2019.12.25
[spring] 컨트롤러 뷰에 데이터 전달  (0) 2019.12.25
Comments