Spring

Spring Boot 폼 입력 유효성 검사(Form Validation )

비뀨_ 2022. 3. 24. 03:35

유효성 검사(Validation)이란?

회원 가입할 때를 예를 들어보자.

  • 아이디 : 7-15자
  • 비밀번호 : 12-20자 사이의 영문+숫자
  • 주소 등등

보통 이렇게 필요하다고 치면 사용자가 입력한 데이터를 서버에 보낼 때, 

서버는 회원이 잘 입력했나 확인을 해봐야한다. 

값이 올바른지 아닌지 확인하는 것유효성 검사라고 한다.

 

아래는 Member라는 form이 전송 되었다고 가정했을 때 if문으로 유효성 검사를 해 본 것이다.

@PostMapping
public String processJoin(Member member, Errors errors) { //
    if(!(member.getId().length() >= 7 && member.getId().length() <= 15) ) 
    	return "IdError";
    if(!(member.getPw().length() >= 12 && member.getPw().length() <= 20) ) 
    	return "PwError";
	//...등 필요한 것의 유효성 검사

    log.info("member submitted: " + member);
    return "redirect:/";
}

이렇게 직접 처리하는 메소드에서 검사를 할 수 있지만

회원 가입할 때 정보를 10개를 받는다고 하면..Controller에 직접 쓸 떄 최소 10줄, 100개면 100줄을 써야 하기 때문에  가독성이 떨어진다.

 

Spring은 자바의 Bean Validation(빈 유효성 검사)를 지원한다.

Bean Validation을 활용하면 유효성 검사 규칙을 쉽게 선언할 수 있고, 

스프링 부트의 웹 스타터 의존성으로 Bean Validation을 자동추가하는 Hibernate(하이버네트)나 유효성 검사 API가 있기 때문에 사용하기 매우 쉽다.

 

사용법

스프링 MVC에 유효성 검사를 하려면

  1. Validation 의존성 추가하기
  2. 유효성 검사할 클래스(위의 Member)에 검사할 규칙을 적는다.
  3. 검사를 수행할 컨트롤러의 메서드(위의 processJoin())에 검사를 수행할 것이라고 알린다.
  4. 검사 에러를 보여주도록 View의 form을 수정한다.

1. Validation 의존성 추가하기

Spring boot starter  버전 2.3 이전은 Validation 의존성이 포함되어 있었다고 한다.

하지만 2.3 이상부터는 따로 의존성을 추가해야한다고 한다.

 

Maven

ㅡㅡㅡpom.xml에 추가 ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-validation -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

Gradle

// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-validation
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-validation'

 

2. 검사할 클래스에 검사 규칙을 적기

항목은 너무 많기 때문에 이미지와 링크로 대체하겠습니다.

https://www.baeldung.com/javax-validation

 

Java Bean Validation Basics | Baeldung

Learn the basics of Java Bean validation, the common annotations and how to trigger the validation process.

www.baeldung.com

 

위에서 만든 예시로 다시 돌아오자면 Member 클래스에 조건을 적어주면 된다.

@Data
public class Member{
	@Size(min=7,max=15,message="id must be in 7-15 characters long")
	private String id;
	@Size(min=12,max=20,message="password must be in 12-20 characters long")
	private String pw;
}

Size의 메서드. 자세한 항목은 위의 링크 참조

문자의 길이에 대해서 유효성 검사를 해야하기 때문에 Size만 사용한다.

 

 

3. 폼과 바인딩 될 때 유효성 검사하기.

@PostMapping
public String processJoin(@Valid Member member, Errors errors) {
    if(errors.hasErrors()) return "orderForm";
    log.info("member submitted: " + member);
	return "redirect:/";
}

위처럼 @Valid만 붙이면 해당 메서드에게 'form에서 제출된 Member의 데이터에 대해 유효성 검사를 실시해라!'

라고 한다.

만약 유효성 검사에서 에러가 난다면 에러 내역이 Errors 객체에 담겨서 반환된다.

 

4. 유효성 검사 에러 발생시 에러를 보여주도록 한다.

그냥 단순하게 JSP , Thymeleaf 등 사용하고 있는 View 템플릿에 에러를 볼 수 있게 해주면 된다.

 

<form method="POST" th:action="@{/member/join}" th:object="${member}">
    <h1>회원가입!</h1>

    <div th:if="${#fields.hasErrors()}">
        <span class="validationError"> 유효성 검사 에러 메세지입니다.</span>
    </div>

    <h3>양식</h3>

    <label for="id">ID: </label> 
    <input type="text" th:field="*{id}" /> 
    <span class="validationError"
        th:if="${#fields.hasErrors('id')}"
        th:errors="*{id}">아이디 입력 오류</span>
    <br /> 

    <label for="pw">Pw: </label> 
    <input type="text" th:field="*{pw}" /> 
    <span class="validationError"
        th:if="${#fields.hasErrors('pw')}"
        th:errors="*{pw}">비밀번호 입력오류</span>
    <br /> 

    <input type="submit" value="Submit order" />
</form>

입력을 제대로 안했을 때 나오는 에러메세지

공부하는 책에 Thymeleaf로 하길래 Thymeleaf로 써보았다.