혼자 공부하며 이해한 내용을 바탕으로 정리하고자 한다.
먼저 유효성 체크를 해야하는 경우는 다음과 같다
- 회원가입을 할 경우에 패스워드에 보안문제로 인해 특수문자나 영어 대소문자등을 포함해서 사용해야 하는 경우
- 이메일 형식의 아이디를 사용하는데 중간에 @가 빠진 상태로 입력하는 경우
대게 유효성 체크를 해주는 경우는 프론트와 백엔드에서 이중으로 처리해주는 것이 좋다.
스프링 부트에서는 도메인으로 사용하는 필드에 조건과 메시지를 작성해주면 @Vaild 어노테이션과 함께 유효성 검사를 할 수 있다.
제일먼저 build.gradle에 아래와 같이 추가해줘야 한다.
스프링 부트 2.3버전 이상부터는 validation이 스프링 부트 스타터 자체에 포함되어있지 않고 별도의 모듈로 분리되었다는점 알아두자!
// valid 사용
implementation 'org.springframework.boot:spring-boot-starter-validation'
이렇게 추가하게되면 아래와같은 어노테이션을 사용할 수 있다.
- @Eamil : 이메일 형식에 맞는지 아닌지 유효성 체크
- @NotBlank : 필수입력 값 체크
- 이외에도 NotNull, @Size, @Min, @Max, @NotEmpty 등 여러가지 추가된 어노테이션 등이 있는데 정보 확인은 하단에 있는 참고사이트에서 확인 및 여기 클릭
private Long id;
@NotBlank(message = "이메일은 필수 입력 값입니다.")
@Email(message = "이메일 형식에 맞지 않습니다.")
private String email;
@NotBlank(message = "패스워드는 필수 입력 값입니다.")
@Pattern(regexp="(?=.*[0-9])(?=.*[a-z])(?=.*\\W)(?=\\S+$).{6,12}",
message = "비밀번호는 영문자와 숫자, 특수기호가 적어도 1개 이상 포함된 6자~12자의 비밀번호여야 합니다.")
private String password;
private Date instTime;
private Date updtTime;
private int grade;
private String status;
@Size(min = 2, max = 8, message = "이름을 2~8자 사이로 입력해주세요.")
private String name;
어노테이션과 함께 유효성 체크시 사용할 메시지를 적어준다.
HTTP 응답을 받아주는 AccountController.java 파일
@PostMapping("/user/sendSignUpEmail")
// @ResponseBody
public String sendSignUpEmail(@ModelAttribute @Valid Account account, BindingResult errors, Model model) throws DuplicateEmailException, SendEmailException{
if (errors.hasErrors()) {
// 유효성 통과 못한 필드와 메시지를 핸들링
Map<String, String> validatorResult = accountSecurityService.validateHandling(errors);
for (String key : validatorResult.keySet()) {
model.addAttribute(key, validatorResult.get(key));
}
return "/user/register";
}
- 여기선 Account에 @Valid 어노테이션을 붙여줌으로써 Account에 캡슐화 형태로 넘어올 떄 유효성을 체크하라는 뜻이다.
- 여기서 BindingResult를 사용해서 에러가 있는지를 검사해준다. (BindingResult에 있는 hasError() 사용)
- 여기서는 유효성 체크할 때 에러가 났을 경우 다시 회원가입 폼으로 되돌려준다.
// 회원가입 시, 유효성 체크
public Map<String, String> validateHandling(Errors errors) {
Map<String, String> validatorResult = new HashMap<>();
for (FieldError error : errors.getFieldErrors()) {
String validKeyName = String.format("valid_%s", error.getField());
validatorResult.put(validKeyName, error.getDefaultMessage());
}
return validatorResult;
}
실제 유효성 체크부분이다.
- errors.getFieldErrors() : 유효성 검사에 실패한 필드 목록을 가져옵니다.
- error.getField() : 유효성 검사에 실패한 필드명을 가져옵니다.
- error.getDefaultMessage() : 유효성 검사에 실패한 필드에 정의된 메시지를 가져옵니다.
회원가입 폼 (register.html)
<form class="sign-up" th:action="@{/user/sendSignUpEmail}" method="post">
<h2 class="heading mb-4">회원가입</h2>
<div class="form-group fone mt-2"> <i class="fas fa-user"></i>
<input type="name" name="name" class="form-control" placeholder="Name">
<span th:style="${'color: red; font-size:11px;'}" th:text="${valid_name}"></span>
</div>
<div class="form-group fone mt-2"> <i class="fas fa-envelope"></i>
<input type="text" name="email" class="form-control" placeholder="Email">
<span th:style="${'color: red; font-size:11px;'}" th:text="${valid_email}"></span>
</div>
<div class="form-group fone mt-2"> <i class="fas fa-lock"></i>
<input type="password" name="password" class="form-control" placeholder="Password">
<div class="image"><i class="fas fa-eye"></i></div>
<span th:style="${'color: red; font-size:11px;'}" th:text="${valid_password}"></span>
</div>
<div class="form-group fone mt-2"> <i class="fas fa-lock"></i> <input type="password" name="confirm" class="form-control" placeholder="Confirm Password"></div>
<button type="submit" class="btn btn-block btn-bold btn-primary mt-2" onclick="regFun()">Sign up now!</button>
</form>
회원가입 폼에서 타임리프를 사용해서 "${valid_ + 선언 필드명} 형태로 유효성 체크 실패시 도메인에 선언한 메시지를 가져와서 보여준다.
이상 유효성 체크 정리 끝!
참고 사이트
www.baeldung.com/javax-validation
'Dev > Spring Boot' 카테고리의 다른 글
스프링부트 공통 설정 그놈 Logback (0) | 2021.04.07 |
---|---|
스프링 시큐리티 로그인 인증 그 후... (0) | 2020.12.02 |
스프링 시큐리티 적용 (CSRF) (0) | 2020.11.19 |
스프링 빈 주입방법과 템플릿 우선순위 (3) | 2020.10.15 |
테스트에 사용하는 어노테이션 (0) | 2020.10.03 |