빈 검증 - 회원가입
Spring MVC 프로젝트에서 폼 입력에 바인딩되는 빈을 검증하는 예제를 실습한다. 실습 과정은 다음과 같다.
- Hibernate Validator 의존 라이브러리를 pom.xml에 추가
- 폼 입력에 바인딩 되는 자바 빈에 유효성 검사 규칙 선언
- 컨트롤러의 요청 핸들러 메소드에 빈 검증 로직 추가
- JSP에 스프링 태그 라이브러리를 적용하여 검사 에러가 출력되도록 수정
회원 가입에서의 빈 검증
Hibernate Validator 의존 라이브러리를 pom.xml에 추가한다.
pom.xml
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.2.5.Final</version> </dependency>
pom.xml의 내용이 변경되었으니 컨텍스트 메뉴의 Maven - Update Project Cofiguraion을 실행하여 이클립스와 동기화한다.
빈 검증은 스프링 설정 파일에 <mvc:annotation-driven /> 설정이 필요하다.
web.xml에 요청 파라미터의 캐릭터 셋을 "UTF-8"로 바꾸는 필터가 설정되어 있는지 확인한다.
회원 가입 폼 입력에 바인딩되는 빈에 빈 검증 어노테이션을 사용하여 검사 규칙을 선언한다.
User.java
import javax.validation.constraints.Email; import javax.validation.constraints.Size; @Size(min=5, message="이메일 형식이 아닙니다.") @Email(message="이메일 형식이 아닙니다.") private String email; @Size(min=4, message="패스워드는 4자 이상이어야 합니다.") private String passwd; @Size(min=2, message="이름은 2자 이상이어야 합니다.") private String name; @Size(min=6, max=20, message="모바일폰 번호형식이 아닙니다.") private String mobile;
회원 가입 폼 페이지로 포워딩하는 요청 핸들러 메소드(아래 첫 번째 signUp() 메소드)에 내용이 없는 빈 객체(User 객체)를 생성해 뷰에 전달해야 한다.
(이건 스펙이니 따라야 한다)
회원 가입을 처리하는 요청 핸들러 메소드(아래 두 번재 signUp() 메소드)에 빈 검증 로직을 추가한다.
두 번재 signUp() 메소드의 매개 변수 리스트에서 @Valid 어노테이션이 적용된 매개 변수 다음에는 반드시 BindingResult 타입의 매개 변수를 선언해야 한다.
그렇지 않으면 HTTP 400 에러가 발생한다.
UsersController.java
import javax.validation.Valid; import org.springframework.validation.BindingResult; @RequestMapping(value="/signUp", method=RequestMethod.GET) public String signUp(Model model) { model.addAttribute("user", new User()); return "users/signUp"; } @RequestMapping(value="/signUp", method=RequestMethod.POST) public String signUp(@Valid User user, BindingResult bindingResult) { if (bindingResult.hasErrors()) { //검증에 실패한 빈은 BindingResult에 담겨 뷰에 전달 return "users/signUp"; } //...중간 생략... }
JSP를 아래를 참고하여 수정한다.
<sf:errors> 태그는 사용자에게 검증 에러를 표시하는 스프링 폼 태그이다.
signUp.jsp
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf" %> <sf:form id="signUpForm" action="signUp" method="post" modelAttribute="user" onsubmit="return check();"> <sf:errors path="*" cssClass="error" /> <table> <tr> <td style="width: 200px;">이름(Full Name)</td> <td style="width: 390px"> <sf:input path="name" /><br /> <sf:errors path="name" cssClass="error" /> </td> </tr> <tr> <td>비밀번호(Password)</td> <td> <sf:password path="passwd" /><br /> <sf:errors path="passwd" cssClass="error" /> </td> </tr> <tr> <td colspan="2" style="text-align: center;font-weight: bold;"> Email이 아이디로 쓰이므로 비밀번호는 Email계정 비밀번호와 같게 하지 마세요. </td> </tr> <tr> <td>비밀번호 확인(Confirm)</td> <td><input type="password" name="confirm" /></td> </tr> <tr> <td>Email</td> <td> <sf:input path="email" /><br /> <sf:errors path="email" cssClass="error" /> </td> </tr> <tr> <td>손전화(Mobile)</td> <td> <sf:input path="mobile" /><br /> <sf:errors path="mobile" cssClass="error" /> </td> </tr> </table> <div style="text-align: center;padding-bottom: 15px;"> <input type="submit" value="전송" /> </div> </sf:form>
스타일 시트에 에러 메시지를 위한 스타일을 추가
.error { color: red; }
테스트 화면
- Getting started with Hibernate Validator
- Validation - Empty int field
- http://stackoverflow.com/questions/14715248/simple-springmvc-3-login-doesnt-work
- http://stackoverflow.com/questions/6227547/spring-3-validation-not-working
- http://stackoverflow.com/questions/8909482/spring-mvc-3-ambiguous-mapping-found
- 예제로 쉽게 배우는 스프링 프레임워크 3.0(한빛미디어) - 사카타 코이치
- Spring in Action(Jpub) - 크레이그 월즈
- spring-framework-reference.pdf
- MyBatis Getting started