@Valid(스프링 MVC에서의 입력 유효성 검증)
웹 애플리케이션에서 사용자 입력은 필수적인 부분이며, 올바른 데이터가 입력되었는지 확인하는 유효성 검증(validation)은 매우 중요하다. 스프링 MVC(Spring MVC)에서는 이러한 유효성 검증을 간편하게 처리하기 위해 @Valid 어노테이션을 제공한다. 이 글에서는 @Valid 어노테이션의 개념, 사용 방법, 그리고 실제 예제를 통해 입력 유효성 검증을 어떻게 구현할 수 있는지 살펴보겠다.
@Valid 어노테이션이란?
@Valid 어노테이션은 자바의 표준 유효성 검증 API인 Bean Validation(JSR-380, JSR-303)의 일부이다. 스프링 MVC에서는 이 어노테이션을 사용하여 컨트롤러 메서드의 파라미터로 전달되는 객체의 유효성을 검증할 수 있다. 이를 통해 간편하게 데이터 유효성 검사를 수행하고, 검증 실패 시 적절한 에러 메시지를 제공할 수 있다.
@Valid 사용 방법
1. 검증할 객체 정의: 유효성 검사를 할 객체에 검증 어노테이션을 추가한다.
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
public class UserForm {
@NotEmpty(message = "Name is required.")
@Size(min = 2, max = 30, message = "Name must be between 2 and 30 characters.")
private String name;
@NotEmpty(message = "Email is required.")
private String email;
// Getters and Setters
}
2. 컨트롤러에서 @Valid 사용: 컨트롤러 메서드에서 @Valid 어노테이션을 사용하여 파라미터를 검증한다.
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class UserController {
@GetMapping("/user")
public String showForm(Model model) {
model.addAttribute("userForm", new UserForm());
return "userForm";
}
@PostMapping("/user")
public String submitForm(@Valid UserForm userForm, BindingResult result, Model model) {
if (result.hasErrors()) {
return "userForm";
}
model.addAttribute("message", "User successfully registered.");
return "success";
}
}
유효성 검증 어노테이션
@Valid 어노테이션은 검증 대상 객체에 있는 다양한 유효성 검증 어노테이션과 함께 사용된다. 다음은 자주 사용되는 유효성 검증 어노테이션들이다.
- @NotNull: 값이 null이 아님을 검증.
- @NotEmpty: 문자열, 컬렉션 등이 비어있지 않음을 검증.
- @Size: 문자열, 컬렉션 등의 크기를 검증.
- @Min 및 @Max: 숫자의 최소값과 최대값을 검증.
- @Email: 올바른 이메일 형식인지 검증.
예제: 사용자 등록 폼
스프링 MVC에서의 실제 예제를 통해 입력 유효성 검증을 살펴보자. 사용자 등록 폼을 예로 들어 보겠다.
1. UserForm 클래스: 유효성 검증 어노테이션을 추가한 사용자 폼 객체
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
import lombok.Data;
@Data
public class UserForm {
@NotEmpty(message = "Name is required.")
@Size(min = 2, max = 30, message = "Name must be between 2 and 30 characters.")
private String name;
@NotEmpty(message = "Email is required.")
@Email(message = "Email should be valid.")
private String email;
}
2. UserController 클래스: 사용자 입력 폼을 처리하는 컨트롤러
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class UserController {
@GetMapping("/user")
public String showForm(Model model) {
model.addAttribute("userForm", new UserForm());
return "userForm";
}
@PostMapping("/user")
public String submitForm(@Valid UserForm userForm, BindingResult result, Model model) {
if (result.hasErrors()) {
return "userForm";
}
model.addAttribute("message", "User successfully registered.");
return "success";
}
}
3. userForm.html: 사용자 입력 폼을 나타내는 Thymeleaf 템플릿
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>User Form</title>
</head>
<body>
<h1>User Registration</h1>
<form th:action="@{/user}" th:object="${userForm}" method="post">
<p>
Name: <input type="text" th:field="*{name}" />
<span th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Name Error</span>
</p>
<p>
Email: <input type="email" th:field="*{email}" />
<span th:if="${#fields.hasErrors('email')}" th:errors="*{email}">Email Error</span>
</p>
<p><button type="submit">Submit</button></p>
</form>
</body>
</html>
결론
@Valid 어노테이션은 스프링 MVC에서 입력 유효성 검증을 간편하게 구현할 수 있는 강력한 도구다. 이를 통해 클라이언트의 데이터를 검증하고, 잘못된 입력에 대해 적절한 피드백을 제공할 수 있다. 유효성 검증을 올바르게 구현함으로써, 애플리케이션의 안정성과 신뢰성을 크게 향상시킬 수 있다.
다음 글에서는 위에 코드에 나와있는 BindingResult에 대해서 다뤄보겠다.