일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- AWS
- php
- Web Server
- laravel
- 맛집
- Gradle
- elasticsearch
- tool
- db
- ReactJS
- linux
- redis
- Spring Batch
- devops
- javascript
- Git
- Spring
- ubuntu
- JVM
- it
- jenkins
- MySQL
- Spring Boot
- Design Patterns
- 요리
- Oracle
- IntelliJ
- java
- jsp
- springboot
- Today
- Total
아무거나
[spring] 폼 데이터 값 검증 본문
[spring] 폼 데이터 값 검증
1. Validator를 이용한 검증
- 폼에서 전달 되는 데이터를 커맨드 객체에 담아 컨트롤 객체에 전달 한다고 하였다.
이때 커맨드 객체의 유효성을 검사할 수 있다. ( 해당 검사방법은 Validator 인터페이스를 이용하여 서버에서 검사하는 방법이다. )
[ex]
@RequestMapping("/bong/create")
public String testCreate(@ModelAttribute("m") Member member, BindingResult result) { // 에러의 결과를 바인딩한 객체(BindingResult)
....
BongValidator validator = new BongValidator();
validator.validate(member, result); // 유효성 검사
if (result.hasErrors()) { // 에러가 있다면
....
}
....
}
[BongValidator.java]
public void validate(Object obj, Errors errors) { // errors 에러발생시 에러를 담는곳, obj는 커맨드 객체
Bong bong = (Bong)obj; // 커맨드 객체를 내가 원하는 객체로 캐스팅
String bongName = bong.getName();
if (bongName == null || bongName.trim().isEmpty()) {
System.out.println("bong is null or empty"); // 로그찍음
errors.rejectValue("name", "empty"); // name필드가 empty다. 1번째는 필드명 2번째는 메세지
}
}
[Validator 예제 소스 참고]
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
public class StudentValidator implements Validator {
// 아래 Override된 메소드는 기본적으로 구현하여야함.
@Override
public boolean supports(Class<?> arg0) {
return Bong.class.isAssignableFrom(arg0); // 검증할 객체의 클래스 타입 정보를 명시해줌.
}
@Override
public void validate(Object obj, Errors errors) {
System.out.println("validate()");
Student student = (Student)obj;
String studentName = student.getName();
if(studentName == null || studentName.trim().isEmpty()) {
System.out.println("studentName is null or empty");
errors.rejectValue("name", "trouble");
}
int studentId = student.getId();
if(studentId == 0) {
System.out.println("studentId is 0");
errors.rejectValue("id", "trouble");
}
}
}
2. ValidationUtils 클래스
- 데이터 검증을 위해서 Validator 인터페이스의 validate() 메소드를 사용하였다.
ValidationUtils 클래스는 validate() 메소드를 좀 더 편리하게 사용할 수 있도록 고안된 클래스
예를 들어 기존에
String studentName = student.getName();
if(studentName == null || studentName.trim().isEmpty()) {
System.out.println("studentName is null or empty");
errors.rejectValue("name", "trouble");
}
위 코드를 아래 코드와 같이 간소화 시킬 수 있다.
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "trouble"); // 값이 비어있거나 공백일 경우에 에러를 추출한다.
3. @Valid와 @InitBinder
- 데이터 검증을 위해서 Validator 인터페이스를 구현한 클래스를 만들고, validate() 메소드를 직접 호출하여 사용하였다.
이번에는 직접 호출하지 않고, 스프링 프레임워크에서 호출하는 방법에 대해 알아보자.
의존추가(maven기준)
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.2.0.Final</version>
</dependency>
커맨드 객체 앞에다 @Valid라는 어노테이션을 붙인다.
@RequestMapping("/bong/{bongId}") // path는 위 url의 11을 bongId로 넣어준다.
public String test(@ModelAttribute("student") @Valid Student student, BindingResult result) {
....
위의 @Valid 선언 때문에 validator 메소드를 호출 안해도된다.
// StudentValidator validator = new StudentValidator();
// validator.validator(student, result);
....
}
그리고 컨트롤러에 @InitBinder어노테이션을 선언한 initBinder메소드를 선언해주면 스프링 프레임워크에서 알아서 유효성 검사를 다 해준다.
@InitBinder
protected void initBinder(WebDataBinder binder){ // 커맨드 객체 데이터를 바인딩한다.
binder.setValidator(new StudentValidator()); // StudentValidator에 set해준다.
}
* 재차 말하지만 위에 메소드가 자동적으로 동작하기 위해선 pom.xml에 hibernate-validator 라이브러리 추가한다.
'Java & Kotlin > Spring' 카테고리의 다른 글
[spring] 트랜잭션(Transaction) - 1 (0) | 2019.12.26 |
---|---|
[spring] JDBC (0) | 2019.12.26 |
[spring] @RequestMapping 파라미터 (0) | 2019.12.25 |
[spring] Form 데이터 (0) | 2019.12.25 |
[spring] 컨트롤러 뷰에 데이터 전달 (0) | 2019.12.25 |