Validator 인터페이스 유효성 검사
이번에 공부할 유효성 검사는 Validator 인터페이스를 사용하는 방법입니다.
다음과 같이 구분하여 공부해보겠습니다.
- 도메인 클래스의 속성에 애너테이션을 선언하지 않고 스프링에서 제공하는 Validator 인터페이스의 구현체를 생성하고, 이를 이용하여 속성 값의 유효성을 검사하는 방법
- 스프링의 Validator 인터페이스와 JSR-380 Bean Validation과 연동하여 유효성을 검사하는 방법
유효성 검사 과정
스프링 Validator 인터페이스 활용은 네 단계를 거쳐 검사합니다.
- Validator 인터페이스의 구현체 생성
- @InitBinder 선언 메소드 추가
- @Valid를 이용한 유효성 검사
- <form:errors> 태그로 오류 메시지 출력
Validator 인터페이스의 구현체 생성
Validator 인터페이스의 구현체는 다음 두 가지 메소드를 구현해야 합니다.
메소드 | 설명 |
boolean supports(Class<?> clazz> | 주어진 객체에 대해 유효성 검사를 수행할 수 있는지 검사할 목적으로 사용 |
void validate(Object target, Errors errors) | 주어진 객체에 대해 유효성 검사를 수행하고 오류가 발생하면 주어진 Errors 타입의 errors 객체에 오류 관련 정보 저장 |
validate() 메소드의 Errors 객체를 사용해서 유효성 검사를 진행합니다.
오류 관련 정보는 Errors 객체에 저장됩니다.
유효성 검사할 시 발생할 오류를 처리하는 Errors 객체의 주요 메소드는 다음과 같습니다.
메소드 | 설명 |
void rejectValue(String field, String errorCode, String defaultMessage) | 설정된 field가 유효성 검사를 할 때 오류를 발생시키면 설정된 errorCode와 함께 거부 |
void reject(String errorCode, String defaultMessage) | 유효성 검사를 할 때 오류가 발생하면 설정된 errorCode를 사용하여 도메인 객체에 대한 전역 오류로 사용 |
다음은 Validator 인터페이스 구현체 생성 예제입니다.
우선 Person 클래스를 생성해줍니다.
package com.springmvc.chap13;
public class Person {
private String name;
private String age;
private String email;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
다음은 유효성 검사를 위한 PersonValidator 클래스를 생성해줍니다.
package com.springmvc.chap13;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
@Component
public class PersonValidator implements Validator{
public boolean supports(Class<?> clazz) {
return Person.class.isAssignableFrom(clazz);
}
public void validate(Object target, Errors errors) {
Person person = (Person)target;
String name = person.getName();
if(name==null || name.trim().isEmpty()) {
errors.rejectValue("name", "name.not.empty");
}
String age = person.getAge();
if(age==null || age.trim().isEmpty()) {
errors.rejectValue("age", "age.not.empty");
}
String email = person.getEmail();
if(email==null || email.trim().isEmpty()) {
errors.rejectValue("email", "email.not.empty");
}
}
}
@InitBinder를 선언한 메소드 추가
컨트롤러의 매소드 내 바인딩되는 데이터의 유효성 검사를 위해서 매개변수에 @Valid를 선언합니다.
그리고 @InitBinder 메소드를 정의하고 메소드의 입력 매개변수로 전달된 WebDataBinder 객체를 사용해서
해당 Validator 인터페이스의 구현체를 설정합니다.
@InitBinder가 선언된 메소드에 Validator를 미리 등록하게 되면 해당 컨트롤러 내 모든 메소드에서
유효성 검사 기능을 사용할 수 있습니다.
다음은 @InitBinder 메소드를 정의하는 예제입니다.
package com.springmvc.chap13;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/exam03")
public class Example03Controller {
@Autowired
private PersonValidator personValidator;
@GetMapping
public String showForm(Model model) {
model.addAttribute("person",new Person());
return "webpage13_03";
}
@PostMapping
public String submit(@Valid @ModelAttribute Person person, BindingResult result) {
if(result.hasErrors()) {
return "webpage13_03";
}
return "webpage13_result";
}
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.setValidator(personValidator);
}
}
컨트롤러 메소드의 @ModelAttribute 매개변수에 @Valid를 선언합니다.
Validator 인터페이스의 구현체를 컨트롤러 내 @InitBinder가 선언된 메소드에 설정하였습니다.
또한 커맨드 객체를 바인딩하는 WebDataBinder는 @InitBinder 메소드에서 등록된 Validator를 사용하여
모델을 검증하고 그 결과를 BindingResult에 전달합니다.
BindingResult에는 PersonValidator로 검증한 결과가 담깁니다.
다음은 검증 결과를 보여주는 뷰 페이지입니다.
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
<title>Validation</title>
</head>
<body>
<h3>유효성 검사</h3>
<form:form modelAttribute="person" method="post">
<p>이름 : <form:input path="name"/><form:errors path="name"/>
<p>나이 : <form:input path="age"/><form:errors path="age"/>
<p>이메일 : <form:input path="email"/><form:errors path="email"/>
<p><input type="submit" value="확인"/>
</form:form>
</body>
</html>
'SPRING' 카테고리의 다른 글
[SPRING]#55 도서 쇼핑몰 구현 (유효성 검사8) (0) | 2024.02.17 |
---|---|
[SPRING]#54 도서 쇼핑몰 구현 (유효성 검사7) (0) | 2024.02.17 |
[SPRING]#52 도서 쇼핑몰 구현 (유효성 검사5) (0) | 2024.02.16 |
[SPRING]#51 도서 쇼핑몰 구현 (유효성 검사4) (0) | 2024.02.13 |
[SPRING]#50 도서 쇼핑몰 구현 (유효성 검사3) (0) | 2024.02.12 |