ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring MVC - 유효성 검사 (JSR-303)
    Spring/Spring MVC 2022. 1. 3. 01:48
    반응형

    유효성 검사 (JSR-303)

    • 서버에서 사용자 입력에 대해 유효성 검사를 할 수 있다.
    • JavaScript로 처리할 수도 있지만 Spring MVC에서도 유효성을 처리할 수 있다.
    • JSR - 303 라이브러리 사용
    • Bean에 데이터가 입력될 때 어떤 검사를 할 것인지 Annotation으로 지정하고
      조건이 맞지 않으면 개발자에게 입력 값 오류를 전달한다.

     

    더보기

     라이브러리 추가

    <dependency>
    	<groupId>javax.validation</groupId>
      	<artifactId>validation-api</artifactId>
      	<version>2.0.1.Final</version>
    </dependency>
    <dependency>
      	<groupId>org.hibernate.validator</groupId>
      	<artifactId>hibernate-validator</artifactId>
      	<version>6.0.2.Final</version>
    </dependency>

     

    유효성 검사를 위한 Bean 정의

     우선 JSP에서 보낸 데이터를 저장하고 유효성 검사하기 위한 DataBean1 클래스 설정을 먼저 하자.

     

    DataBean.java

    public class DataBean1 {
    
    	@Size(min = 2, max = 10)
    	private String data1;
    	
    	@Max(100)
    	private int data2;
    	
    	public String getData1() {
    		return data1;
    	}
    	public void setData1(String data1) {
    		this.data1 = data1;
    	}
    	public int getData2() {
    		return data2;
    	}
    	public void setData2(int data2) {
    		this.data2 = data2;
    	}
    }
    @Size(min = 2, max = 10)
    private String data1;
     -  jsp에서 보낸 이름과 똑같은 이름으로 변수 선언
     - 어떤 유효성 검사를 하는지만 설정. 아직 실제로 유효성 검사는 안 한 단계
     - 유효성 검사를 하기 위해선 Controller의 메서드에서 주입받는 Bean에 Valid를 설정해야 한다

    @valid

    • Controller의 메서드에서 주입받는 Bean에 @Valid를 설정하면 유효성 검사를 실시
    • 유효성 검사 결과를 사용하고자 한다면 BindingResult 객체를 주입받아야 된다.
    • BindingResult 객체에는 유효성 검사를 실행한 결과 정보가 담겨있다.
    • 이를 통해 Controller에서 사용자가 입력한 값의 유효성 검사를 할 수 있다.

     

    Controller에서 유효성 검사

     유효성 검사를 위해 정의한 Bean을 주입받아 유효성을 검사해보자.

     

    Controller

    @Controller
    public class testController {
    
    	@PostMapping("/input_pro")
    //	유효성 검사를 위해 @Valid와 BindingResult 객체를 주입받는다
    //	public String input_pro(DataBean1 dataBean1) {
    	public String input_pro(@Valid DataBean1 dataBean1, BindingResult result) {
    		System.out.println("data1 : " + dataBean1.getData1());
    		System.out.println("data2 : " + dataBean1.getData2());
    		
    		System.out.println("BindingResult : " + result);
    			
    		return "input_success";
    	}
    }
    public String input_pro(@Valid DataBean1 dataBean1, BindingResult result) {
     - 유효성 검사를 위해 @Valid로 DataBean1을 주입하고, 유효성 위반을 확인하기 위해
       BindingResult 객체를 주입받는다.

    BindingResult
     - 유효성 검사를 하여 위반이 있으면 정보를 저장한다.
     - 저장된 정보는 request 영역에 erorros라는 이름으로 저장된다.

     

     


     

    유효성 정보 확인

     설정한 유효성 검사에 위반된 부분이 있다면 어떤 위반이 발생했는지 확인해보자.

     

    Controller

    @Controller
    public class testController {
    
    	@PostMapping("/input_pro")
    	public String input_pro(@Valid DataBean1 dataBean1, BindingResult result) {
    		System.out.println("data1 : " + dataBean1.getData1());
    		System.out.println("data2 : " + dataBean1.getData2());
    		
    		if(result.hasErrors()) {
    			for(ObjectError obj : result.getAllErrors()) {
    				System.out.println("메세지 : " + obj.getDefaultMessage());
    				System.out.println("code : " + obj.getCode());
    				System.out.println("object name : " + obj.getObjectName());
    				System.out.println();
    				String [] codes = obj.getCodes();
    				for(String c1 : codes)
    					System.out.println(c1);
    				if(codes[0].equals("Size.dataBean1.data1")) {
    					System.out.println("data1은 2~10글자를 담을 수 있다");
    				}else if(codes[0].equals("Max.dataBean1.data2"))
    					System.out.println("100이하 수가 들어가야 한다");
    			}
    			return "input_data";
    		}
    		
    		return "input_success";
    	}
    }

    결과 화면

     

    result.hasErrors()
     - 유효성 검사에서 위반된 부분이 있는지 알려준다.
     - 위반된 데이터가 있으면 true, 없으면 false 반환

    result.getAllErrors()
     - 유효성 위반 결과를 모두 가져온다.

    obj.getDefaultMessage()
     - 위반에 관한 default로 설정된 message를 가져온다.
     - 출력 : " 반드시 최솟값 2와 최댓값 10 사이의 크기이어야 합니다. "

    obj.getCode()
     - 위반된 code가 무엇인지 알려준다.
     - 출력 : " Size "

    obj.getObjectName()
     - 위반한 객체 이름을 알려준다.
     - 출력 : " dataBean1 "

    String [] codes = obj.getCodes();
     - 위반된 code를 배열에 저장하여 정보를 알려준다.
     - codes[0] -  코드.위반한객체.데이터명    |  Max.dataBean1.data2
     - codes[1] -  코드.데이터명                   |  Max.data2
     - codes[2] -  코드.데이터타입                |  Max.int
     - codes[3] -  코드                               |  Max

    JSP에서 유효성 위반에 따른 Message 출력

     이제 JSP에서 위반 결과에 따른 message를 출력해보자

     

    JSP

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<h1>input_data</h1>
    	<form action='input_pro' method='post'>
    		data1 : <input type='text' name='data1'/><br/>
    		<spring:hasBindErrors name="dataBean1">
    			<c:if test="${errors.hasFieldErrors('data1') }">
    				${errors.getFieldError('data1').defaultMessage }
    			</c:if>
    		</spring:hasBindErrors>
    		data2 : <input type='text' name='data2'/><br/>
    		<spring:hasBindErrors name="dataBean1">
    			<c:if test="${errors.hasFieldErrors('data2') }">
    				${errors.getFieldError('data2').defaultMessage }<br/>
    			</c:if>
    		</spring:hasBindErrors>
    		<button type="submit">확인</button>
    	</form>
    	
    </body>
    </html>
    <spring:hasBindErrors name="dataBean1">
     - 해당 Bean에 유효성 검사에 문제가 있는지 확인

    <c:if test="${errors.hasFieldErrors('data1') }">
          ${errors.getFieldError('data1').defaultMessage }
    </c:if>
     - 해당 property에 error가 있는지 확인
     - error가 있을 시 해당 error에 대한 defaultMessage 출력

    ${errors.getFieldError('data1').defaultMessage }
     - BindingResult에 의해 저장된 erorros로 해당 위반에 관한 defaultMessage를 가져온다.

     

    결과 화면


     다음은 위반했을 시 입력된 데이터가 사라지지 않고 그대로 남도록 설정해보자

     

    반응형

    댓글

Designed by Tistory.