# 폼 검증(form validation)
## 목차
1. 라이브러리 등록
2. 애노테이션 작성
3. 폼 검증 수행
## 라이브러리 등록
폼 검증을 위한 라이브러리를 등록.
**pom.xml**
```
...
<!-- Form Validation -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.3.Final</version>
</dependency>
...
```
## 애노테이션 작성
대상 VO 필드에 검증할 애노테이션을 추가.
**Article**
```
public class Article {
private int id;
@NotNull
private String title;
@NotEmpty
private String body;
...
}
```
## 폼 검증 수행
### Valid
폼 검증 수행
**ArticlesController.java**
```
@RequestMapping(value ="/articles", method = RequestMethod.POST)
public String create(@Valid @ModelAttribute Article article) {
System.out.println(article);
articleMapper.create(article);
return "redirect:/articles";
}
```
### BindingResult
폼 검증 결과 저장
**ArticlesController.java**
```
@RequestMapping(value ="/articles", method = RequestMethod.POST)
public String create(@Valid @ModelAttribute Article article, BindingResult result) {
if (result.hasErrors()) {
System.out.println("Error: 폼 검증 실패..");
return "redirect:/articles/new"; // 실패 시, 다시 작성
}
// 성공!
System.out.println(article);
articleMapper.create(article);
return "redirect:/articles";
}
```
### RedirectAttributes
리다이렉트시 사용할 휘발성 데이터 생성
**ArticlesController.java**
```
@RequestMapping(value ="/articles", method = RequestMethod.POST)
public String create(@Valid @ModelAttribute Article article,
BindingResult result,
RedirectAttributes flash) { // 휘발성 파라미터
if (result.hasErrors()) {
System.out.println("Error: 폼 검증 실패..");
List<FieldError> fieldErrors = result.getFieldErrors(); // 폼 검증 에러 검출
flash.addFlashAttribute("fieldErrors", fieldErrors); // 휘발성 모델 객체 추가
return "redirect:/articles/new";
}
// 성공!
System.out.println(article);
articleMapper.create(article);
return "redirect:/articles";
}
```
### 폼 검증 에러 확인
RedirectAttributes 객체 정보를 통한 에러 출력
**views/articles/new**
```
<form action="<c:url value="/articles" />" method="post">
<!-- errors -->
<c:forEach var="error" items="${ fieldErrors }">
<div class="alert alert-warning">
<p>
<strong>${ error.getField() }</strong>: ${ error.getDefaultMessage() }
</p>
</div>
</c:forEach>
<!-- inputs -->
<div class="form-group">
<label>제목</label> <input name="title" class="form-control" type="text" placeholder="제목을 입력하세요.">
</div>
<div class="form-group">
<label>내용</label>
<textarea name="body" class="form-control" rows="3" placeholder="내용을 입력하세요."></textarea>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
```
## 요약