Computer Science/Spring

#8 Form 입력 값 검증

꿈꾸는어린이 2018. 6. 16. 18:20


Form 입력 값 검증

  • Controller에서 command 객체 생성 및 입력 값 저장 후 Validator 객체를 통해 객체 값 검증 가능

  • boolean supports(Class<?> clazz);

    -> 주어진 클래스 clazz에 대한 검증 지원 여부 반환

  • void validate(Object target, Errors errors);

    -> target객체(Form 입력 값을 저장하고 있는 command 객체)에 대한 검증 수행

    -> 오류 발생 시 errors 객체에 오류 정보 저장.

  • error코드는 validation.properties 파일로 관리

  public class MemberInfoValidator implements Validator {

@Override
public boolean supports(Class<?> clazz) { //검증 지원 여부
return MemberInfo.class.isAssignableFrom(clazz);
}

@Override
public void validate(Object target, Errors errors) { //target = command 객체
MemberInfo memberInfo = (MemberInfo) target;
if (memberInfo.getId() == null || memberInfo.getId().trim().isEmpty()) {
         //id 필드가 null이거나 공백이면
errors.rejectValue("id", "required"); //"required"라는 error code 저장
}
if (memberInfo.getPassword().length() < 5) {
errors.rejectValue("name", "shortPassword");
}
}
}

  • handler method에 Errors 또는 BindingResult 타입의 parameter 추가

    ★★ command 객체 바로 다음 parameter로 지정해야 함!!!

  
@Controller
@RequestMapping("/account/create.do")
public class CreateAccountController {

@ModelAttribute("command") // command 객체 생성, 공통적으로 이름 부여
public MemberInfo formBacking(HttpServletRequest request) {
if (request.getMethod().equalsIgnoreCase("GET")) {
MemberInfo mi = new MemberInfo();
Address address = new Address();
address.setZipcode(autoDetectZipcode(request.getRemoteAddr()));
mi.setAddress(address);
return mi;
} else {
return new MemberInfo();
}
}

@RequestMapping(method = RequestMethod.POST)
public String submit(@ModelAttribute("command") MemberInfo memberInfo,
                        //command 객체가 memberInfo로 참조
BindingResult result) {
     
new MemberInfoValidator().validate(memberInfo, result); //검증 실행
if (result.hasErrors()) { //오류 발생 시
return "account/creationForm"; //다시 실행
}
// accountService.createAccount(memberInfo); // 요청 처리
return "account/created";
}
}

  1. Error와 관련된 message들은 message bundle(properties files)에 저장

  2. Message bundle접근을 위해 객체로 설정(Spring bean으로 등록)

  3. View에서 Spring이 제공하는 tag 사용하여 error messge 출력

    (ex. <form:errors />, <spring:hasBindErrors />)

  
//validation.properties

required=\ud544\uc218 \ud56d\ubaa9\uc785\ub2c8\ub2e4.
required.loginCommand.userId=\uc0ac\uc6a9\uc790 \uc544\uc774\ub514\ub294 \ud544\uc218 \ud56d\ubaa9\uc785\ub2c8\ub2e4.
required.password=\uc554\ud638\ub294 \ud544\uc218 \ud56d\ubaa9\uc785\ub2c8\ub2e4.
required.email=\uc774\uba54\uc77c\uc744 \uc785\ub825\ud558\uc138\uc694.

  
<!-- <form:form /> 및 <form:errors /> 사용 -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>로그인</title>
</head>
<body>
<form:form commandName="loginCommand"> <!-- form과 관련된 command 객체 저장 -->
아이디: <form:input path="userId"/>
<form:errors path="userId" />
  <!-- userId와 관련된 error message 검색하여 출력 -->
<br/>
암호: <form:password path="password" showPassword="false"/>
<form:errors path="password" />
<br/>
<input type="submit" value="로그인"/>
</form:form>
</body>
</html>

<br>

JRS 303 Bean Validation API 활용한 Form 입력 값 검증

@javax.validation.Valid

  • parameter로 받은 유효성 검증이 필요한 command 객체 앞에 적용

  • command 객체와 관련된 validator의 유효성 검증 method를 자동으로 호출

    ( handler method가 validator를 직접 생성 및 호출할 필요가 없음)

  • validator은 method앞에 @InitBinder 적용하여 설정

    • Form과 command 객체 사이의 mapping를 처리하는 WebDataBinder를 parameter로 받음

    • WebDataBinder.setValidator() 이용하여 validator 설정

  
@Controller
@RequestMapping("/login/login.do")
public class LoginController {

private String formViewName = "login/form";

@ModelAttribute
public LoginCommand formBacking() {
return new LoginCommand();
}

@RequestMapping(method = RequestMethod.POST)
public String submit(@Valid LoginCommand loginCommand,
BindingResult result) {
// new LoginCommandValidator().validate(loginCommand, result); @Valid 사용->생략
if (result.hasErrors()) {
return formViewName;
}
...
}

@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.setValidator(new LoginCommandValidator()); //validator 설정
}

}

<br>

annotation 사용한 검증

  • command 객체에 @NotNull, @Size 등 annotation 사용하여 검증 가능

  • pom.xml 에 JSR 303 Validation API 및 Provider 설치

  
<!-- JSR 303 Validation API -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.3.1.Final</version>
</dependency>
  • mvc-config.xml에 <mvc:annotation-driven /> 사용하여 JSR 303 provider를 global validator로 등록

  
public class MemberInfo {
@NotNull
   @Size(min=5, max=10)
private String id;

@NotEmpty
private String name;

@NotEmpty
@Email
private String email;
}

propreties 파일

NotEmpty=필수 항목입니다.

NotEmpty.name = 이름을 입력하세요.

Email=올바른 형식의 이메일 주소를 입력하세요.

'Computer Science > Spring' 카테고리의 다른 글

#10 Tiles  (0) 2018.06.16
#9 HTTP Session 사용  (0) 2018.06.16
#7 Model Data  (0) 2018.05.26
#6 Command 객체 이용한 Form 전송 처리  (2) 2018.05.25
#5 Spring MVC 구조  (0) 2018.05.25