전체 코드는 Github에서 확인이 가능합니다.
Bean Validation
도메인 로직에서 값을 검증할 수 있게 도와주는 인터페이스이다. (참고:Java와 Spring의 Validaiton)
주요 어노테이션들은 아래와 같다.
/**
* 직접 검증을 하고 싶을 때 사용
*/
@AssertTrue
@AssertFalse
/**
* 문자열을 다룰 때 사용
*/
@NotNull // null 불가능
@NotEmpty // null, 빈 문자열(스페이스 포함X) 불가
@NotBlank // null, 빈 문자열, 스페이스만 포함한 문자열 불가
@Size(min=?, max=?) // 최소 길이, 최대 길이 제한
@Null // null만 가능
/**
* 숫자를 다룰 때 사용
*/
@Positive // 양수만 허용
@PositiveOrZero // 양수와 0만 허용
@Negative // 음수만 허용
@NegativeOrZero // 음수와 0만 허용
@Min(?) // 최소값 제한
@Max(?) // 최대값 제한
/**
* 정규식 관련
*/
@Email // 이메일 형식만가능 (기본 제공)
@Pattern(regexp="?") // 직접 정규식을 쓸 수 있음
0. validation을 사용하여 검증해주는 예제
개발환경
- IntelliJ
- Gradle
- Java 1.8
의존성
- Web
- Thymeleaf
- lombok
1. Class 생성
User.java
@Getter
@Setter
public class User implements Serializable {
@NotBlank(message = "이메일을 입력해주세요.")
@Email(message = "이메일 형식을 맞춰주세요.")
private String email;
@NotBlank(message = "이름을 입력해주세요.")
@Size(min = 2, max = 8, message = "이름을 2~8자 사이로 입력해주세요.")
private String name;
@Pattern(regexp="[a-zA-Z1-9]{6,12}", message = "비밀번호는 영어와 숫자로 포함해서 6~12자리 이내로 입력해주세요.")
private String password;
}
엔티티와 비슷하게 생긴 클래스이다.
이메일(email)은 공백 체크(@NotBlank), 이메일 형식 체크(@Email를 할 수 있게,
이름(name)은 공백 체크(@NotBlank), 길이 체크(2~8자 사이)(@Size)를 할 수 있게,
비밀번호(password)는 비밀번호 형식 체크(@Pattern)를 할 수 있게 설정해두었다.
message 속성을 이용해 기존에 설정되어있는 에러 메세지를 덮어쓸 수 있다. (직접 커스텀 가능)
2. Controller 생성
UserController.java
@Controller
public class UserController {
@GetMapping("/user") // 1
public String getAddPage(User user){
return "add_user";
}
@PostMapping("/user") // 2
public String addUser(@Valid User user, BindingResult result){
if(result.hasErrors()){
return "add_user";
}
// 유효성 검사를 성공적으로 끝마쳤을 때 원하는 행동 구현
return "complete";
}
}
1. @GetMapping("/user")
- localhost:포트번호/user을 입력했을 때 (최초 요청)
- add_user.html을 반환해준다.
2. @PostMapping("/user")
- 폼에서 POST요청을 보냈을 때
- @Valid 어노테이션을 사용해서 Validation을 사용할 수 있게 해준다.
- 에러를 확인하고 넘겨줄 수 있게 BindingResult를 사용한다
- BindingResult를 사용하지 않을 시에는 Valid에서 걸리면 바로 Exception이 발생한다.
3. View 구현
add_user.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Validation Example</title>
<style>
.warning{
width:30px;
height:25px;
}
</style>
</head>
<body>
<h2>★ 회원가입 폼 ★</h2>
<form th:action="@{/user}" th:object="${user}" method="POST">
<!-- 1 -->
<span>이름</span>
<input type="text" th:field="*{name}" th:class="${#fields.hasErrors('name')} ? 'error'" />
<div th:each="msg : ${#fields.errors('name')}">
<p th:text="${msg}"></p>
</div>
<br/>
<!-- 2 -->
<span>이메일</span>
<input type="text" th:field="*{email}" th:class="${#fields.hasErrors('email')} ? 'error'" />
<p th:if="${#fields.hasErrors('email')}" th:errors="*{email}"></p>
<br/>
<!-- 3 -->
<span>비밀번호</span>
<input type="password" th:field="*{password}" th:class="${#fields.hasErrors('password')} ? 'error'" />
<img th:class="warning" th:if="${#fields.hasErrors('password')}" th:src="@{/warning.png}" th:errors="*{password}"></span>
<br/>
<input type="submit" value="제출" />
</form>
</body>
1. th:each="msg : ${#fields.errors('name')}"
- 에러가 있을 때, 반복문을 돌면서 에러의 내용을 모두 가져온다.
2. th:if="${#fields.hasErrors('email')}" th:errors="*{email}"
- 에러가 있을 때, 에러의 내용을 보여준다.
3. th:if="${#fields.hasErrors('password')}" th:src="@{/warning.png}"
- 에러가 있을 때, 에러의 사진을 보여준다.
complete.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Validation Example</title>
</head>
<body>
<h2>회원가입이 완료되었습니다!</h2>
</body>
실행화면
'Backend > SpringBoot' 카테고리의 다른 글
SpringBoot와 Thymeleaf를 이용하여 페이징하기 (1) | 2019.12.11 |
---|---|
Spring Boot Map Struct Gradle 사용해보기 (3) | 2019.11.18 |
DAO, DTO 차이점 (0) | 2019.11.04 |
스프링부트의 디렉토리(패키지) 구조와 역할 (0) | 2019.04.19 |
SpringBoot + JPA + Thymeleaf로 간단한 CRUD + Travis CI 사용해보기 프로젝트 (1) | 2019.04.06 |