-
Spring MVC - 유효성 검사 (JSR-303)Spring/Spring MVC 2022. 1. 3. 01:48728x90반응형
유효성 검사 (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를 가져온다.
다음은 위반했을 시 입력된 데이터가 사라지지 않고 그대로 남도록 설정해보자
728x90반응형'Spring > Spring MVC' 카테고리의 다른 글
Spring MVC - JSR-303 어노테이션(Annotation) (0) 2022.01.03 Spring MVC - 에러 메시지 커스터마이징, From 데이터 유지하기 (0) 2022.01.03 Spring MVC - Message (0) 2022.01.02 Spring MVC - Properties (0) 2021.12.30 Spring MVC - Cookie (0) 2021.12.30