Spring Boot 유효성 검사

허진수·2021년 7월 24일
0

Spring

목록 보기
2/3

form 유효성 검사에 대해 간략히 적어보겠습니다.

<dependency>
	<groupId>org.hibernate.validator</groupId>
	<artifactId>hibernate-validator</artifactId>
	<version>7.0.1.Final</version>
</dependency>

다음과 같은 dependency를 사용하여 코드를 작성했었습니다.
에러는 뜨지 않지만 실제 구동시 유효성 검사를 전혀 실행하지 않습니다.

Data class

package com.sia.tacocloud.data;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Digits;
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;
}
package com.sia.tacocloud.data;

import lombok.Data;
import java.util.List;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Data
public class Taco {

    @NotNull
    @Size(min = 5, message = "Name must be at least 5 characters long")
    private String name;

    @Size(min = 1, message = "You must choose at least 1 ingredient")
    private List<String> ingredients;
}

Controller

package com.sia.tacocloud.web;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.validation.Valid;
import org.springframework.validation.Errors;

import com.sia.tacocloud.data.Order;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/orders")
public class OrderController {

    @GetMapping("/current")
    public String orderForm(Model model) {
        model.addAttribute("order", new Order());
        return "orderForm";
    }

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

Form의 유효성 검사 부분

<h3>Here's how I'll pay...</h3>
<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>
<br/>

상당히 긴 뻘짓 결과
spring 2.3미만에서는 web-starter가 validation-starter를 가져왔으나 이상에서는 그렇지 않다고 하더군요
의존성 추가를 해줘야하는데 위의 org.hibernate.validator를 추가하는 것이 아니라
spring-boot-starter-validation을 추가해 주어야 합니다.

dependency

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-validation</artifactId>
	<version>2.5.3</version>
</dependency>
profile
안녕하세요

0개의 댓글