이전에는 잘못된 정보를 폼에 입력 받았을 때 허용한다는 것을 알 수 있게 되었다.
따라서 우리가 필요한 정보에 맞도록 데이터를 검사할 것이다.
ℓ 폼 입력 유효성 검사하기
폼 입력 유효성을 검사하는 방법에는 processDesign()과 processOrder() 메서드에 수 많은 if/then 블록을 너저분하게 추가하는 것이 있다.
이 경우 데이터가 적합한지 각 필드에서 일일이 확인해야 해서 번거롭고 코드 파악과 디버깅이 어렵다.
위 방법을 대체할 수 있는 방법으로 자바의 빈 유호성 검사 API를 지원한다.
이것을 사용하면 애플리케이션에 추가 코드를 작성하지 않고 유효성 검사 규칙을 쉽게 선언할 수 있다.
스프링 부트를 사용하면 유효성 검사 라이브러리를 우리 프로젝트에 쉽게 추가할 수 있다.
유효성 검사 API와 이 API를 구현한 Hibernate 컴포넌트는 스프링 부트의 웹 스타터 의존성으로 자동 추가되기 때문이다.
스프링 MVC에 유효성 검사를 적용하려면 다음과 같이 해야 한다.
1. 유효성을 검사할 클래스에 검사 규칙을 선언한다.
2. 유효성 검사를 해야 하는 컨트롤러 메서드에 검사를 수행한다는 것을 지정한다.
3. 검사 에러를 보여주도록 폼 뷰를 수정한다.
ℓ 유효성 검사 규칙 선언하기
유효성 검사 규칙을 선언하는 것은 다음과 같다.
package tacos;
import java.util.List;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
@Data
public class Taco {
@NotNull // 규칙 : name은 공백으로 제출하면 안된다.
@Size(min=5, message = "Name must be at least 5 characters long") // 규칙 : 최소한 5개 문자이어야 한다.
private String name;
@Size(min=1, message = "You must choose at least 1 ingredient") // 규칙 : 최소한 1개 문자이어야 한다.
private List<String> ingredients;
}
<Taco 도메인 클래스에 유효성 검사 규칙 추가하기>
package tacos;
import jakarta.validation.constraints.Digits;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.NotBlank;
import org.hibernate.validator.constraints.CreditCardNumber;
import lombok.Data;
@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;
}
<주문 필드의 유효성 검사 규칙 추가하기>
책과 다르게 javax가 아닌 jakarta를 불러왔다.
이유는 관리하는 회사가 바뀌면서 명칭이 달라졌다.
ℓ 폼과 바인딩될 때 유효성 검사 수행하기
위에서 유효성 검사 규칙 선언이 끝났으므로, 각 폼의 POST 요청이 관련 메서드에서 처리될 때 유효성 검사가 수행되도록 컨트롤러를 수정할 것이다.
제출된 Taco의 유효성 검사를 하려면 DesignTacoController의 processDesign 메서드의 인자로 전달되는 Taco에 자바 빈 유효성 검사 API의 @Valid 애노테이션을 추가해야 한다.
import jakarta.validation.Valid;
import org.springframework.validation.Errors;
@PostMapping
public String processDesign(@Valid Taco design, Errors errors) {
if (errors.hasErrors()) {
return "design";
}
log.info("Processing design: " + design);
return "redirect:/orders/current";
}
<제출된 Taco의 유효성 검사하기>
@Valid 애노테이션은 제출된 Taco 객체의 유효성 검사를 수행하라고 스프링 MVC에 알려준다.
제출된 Order의 유효성 검사를 하는 방법도 유사하다.
import jakarta.validation.Valid;
import org.springframework.validation.Errors;
@PostMapping
public String processOrder(@Valid Order order, Errors errors) {
if (errors.hasErrors()) {
return "orderForm";
}
log.info("Order submitted: " + order);
return "redirect:/";
}
<제출된 Order의 유효성 검사하기>
에러가 있으면 입력을 수정할 수 있도록 해당 요청이 폼 뷰에 다시 보내진다.
ℓ 유효성 검사 에러 보여주기
Thymeleaf는 fields와 th:errors 속성을 통해서 Errors 편리한 사용 방법을 제공한다.
<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:errors 속성은 ccNumber 필드를 참조한다.
필드에 에러가 있으면 <span>에 사전 지정된 메시지(CC Num Error)를 검사 에러 메시지로 교체한다.
'개발 서적 > 스프링 인 액션' 카테고리의 다른 글
스프링 인 액션 Chapter 2.4 :: 뷰 컨트롤러로 작업하기 (0) | 2023.09.19 |
---|---|
스프링 인 액션 Chapter 2.2 :: 폼 제출 처리하기 (0) | 2023.09.11 |
스프링 인 액션 Chapter 2.1 :: 정보 보여주기 (0) | 2023.08.24 |
스프링 인 액션 Chapter 1.1 :: 스프링 시작하기 (1) | 2023.08.23 |