Programming/Spring

[Spring Boot] @Vaild 유효성 검사 하는 방법 (개념/ 예제)

JeongKyun 2022. 4. 8.
반응형

서론

이번 글에서는 입력하는 부분에 대한 @Vaild 애노테이션을 이용하여 유효성 검사하는 방법에 대해 알아보려한다. 필자는 SpringInAction5 교재에 있는 내용을 활용하여 작성했다.

 


 

유효성 검사란?

1. 데이터의 값이 유효한지, 조건에 타당한지 확인하는 것을 말한다.
2. 올바르지 않은 데이터를 서버 또는 DB로 전송되는것을 막기 위함이다.

 


 

@Vaild를 이용한 유효성 검사 방법

#01. Dependency 추가

@Vaild를 사용하기 전 pom.xml에 Dependency를 아래와 같이 추가해줘야 한다.

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

 

 

** Validation 어노테이션 정리

Anotation 제약조건
@NotNull Null 불가
@Null Null만 입력 가능
@NotEmpty Null, 빈 문자열 불가
@NotBlank Null, 빈 문자열, 스페이스만 있는 문자열 불가
@Size(min=,max=) 문자열, 배열등의 크기가 만족하는가?
@Pattern(regex=) 정규식을 만족하는가?
@Max(숫자) 지정 값 이하인가?
@Min(숫자) 지정 값 이상인가
@Future 현재 보다 미래인가?
@Past 현재 보다 과거인가?
@Positive 양수만 가능
@PositiveOrZero 양수와 0만 가능
@Negative 음수만 가능
@NegativeOrZero 음수와 0만 가능
@Email 이메일 형식만 가능
@Digits(integer=, fraction = ) 대상 수가 지정된 정수와 소수 자리 수 보다 작은가?
@DecimalMax(value=)  지정된 값(실수) 이하인가?
@DecimalMin(value=) 지정된 값(실수) 이상인가?
@AssertFalse false 인가?
@AssertTrue true 인가?

 

 

#02 도메인 유효성 애노테이션 조건 작성

@Data
public class Taco {
	
	@NotNull
	@Size(min = 5, message="최소 5개 이상의 문자가 되어야합니다.")
	private String name;
	
	@Size(min=1, message = "최소 1개의 재료를 선택해야합니다.")
	private List<String> ingredients;
}

위의 Taco 도메인에서는

name은 비어있으면 안되기에 null값인지 확인해주는 @NotNull을 작성하였고,

글자 수를 검사할 수 있도록 @Size를 이용하여 5개까지 조건을 걸어두었다.

 

@Data
public class Order {
	
	@NotBlank(message="Name is required")
	private String deliveryName;
	
	@NotBlank(message="Street is required")
	private String deliveryStreet;
	
	@NotBlank(message="City is required")
	private String deliveryCity;
	
	@NotBlank(message="State is required")
	private String deliveryState;
	
	@NotBlank(message="Zip code is required")
	private String deliveryZip;
	
	@CreditCardNumber(message="Not a valid credit card number")
	private String ccNumber;
	
	@Pattern(regexp="^(0[1-9]|1[0-2])([\\/])([1-9][0-9])$",
			message="Must be formatted MM/YY")
	private String ccExpiration;
	
	@Digits(integer=3, fraction=0, message="Invalid CVV")
	private String ccCVV;
}

위의 Order 도메인에서 사용한 애노테이션을 설명하면,

@NotBlank

변수에 값이 비어있는 것을 체크할 수 있는 애노테이션이다.

 

@CreditCardNumber

속성의 값이 Luhn 아록리즘 검사에 합격한 유효한 신용 카드 번호이여야 한다는 것을

선언해주는 애노테이션이다.

 

@Pattern

정규 표현식을 지정하여 ccExpiration 속성 값이 해당 형식을 따르는지 확인하는 애노테이션이다.

 

@Digit

카드 cvv특성 상 3자리이기에 정확하게 세 자리 숫자인지 검사하는 애노테이션이다.

 

 

#03 요청에 따른 Controller 유효성 검사 처리

@PostMapping
public String processOrder(@Valid Order order, Errors errors) {
	if(errors.hasErrors()) {
		return "orderForm";
	}
	return "redirect:/";
}

위와 같이 인자값에 @Valid 애노테이션을 추가하고, Errors라는 validation의 객체를 선언해준다.

 

그러면 Post로 제출된 Order 객체의 유효성 검사를 수행(제출된 폼 데이터와 Order 객체가 바인딩 된 후, 그리고 processOrder() 메서드의 코드가 실행되기 전에)하라고 스프링 MVC에게 알려준다.

 

만일 검사 중 에러가발생하면 에러의 상세 내역이 Errors 객체에 저장되어 processOrder()으로 전달된다. 여기서 Error를 처리하는 방법은 hasErrors()라는 함수를 사용하여 검사 에러가 있는지 확인 후 있다면, 생성 해놓은 orderForm의 뷰로 가게해준다.

 

 

#04 View에서의 유효성 검사 에러 처리

<label for="ccNumber">Credit Card #: </label> 
<input type="text" th:field="*{ccNumber}" /> 

<span class="validationError"
	th:if="${#fields.hasErrors('ccNumber')}"
	th:errors="*{ccNumber}">CC Num Error
</span>

필자는 템플릿 엔진인 타임리프를 사용하였는데, 타임리프에서는 위 와같이 th:if를 사용하여 hasErrors() 메서드를 사용하여 에러가 있는지 검사를 한 후 에러가 발생한다면,

 

#02에서 사전에 지정해놓은 message의 내용이 출력 되는 것을 확인할 수 있다.

만약 유효성 검사를 실패하면 "Not a valid credit card number"가 출력된다.

 

이런식으로 의존성을 하나 추가하여 간편하게 유효성 검사 로직을 처리할 수 있다.

아래는 실제 검사 결과 화면을 보여주고 마무리해보겠다.

 

 

#05 유효성 검사 처리 화면 보기

첫 화면 로드

처음 로드했을 때 화면이고 아래에서 아무것도 입력하지 않고 Submit했을 때의 화면을 보자.

 

Submit 했을 때의 화면

아무것도 입력하지 않고 클릭했을 때 위의 빨간색 점을 찍은 부분들에

도메인에서 message에 입력했던 문구들이 활성화 되는 것을 확인 할 수 있다.

 

이상 유효성 검사 방법에 대해 마치겠습니다 :)

댓글

💲 많이 본 글