본문 바로가기

TIL

TIL 240531 Validation

Validation - 검증 과정

 

Bean Validation

- 간편하게 사용할 수 있는 여러 애너테이션을 제공

@NotNull null불가
@NotEmpty null, ""불가
@NotBlank null,""." " 불가
@Size 문자 길이 측정
@Max 최대값
@Min 최소값
@positive 양수
@Negative 음수
@Email E-mail 형식
@Pattern 정규 표현식

 

build.gradle : validation

implementation 'org.springframework.boot:spring-boot-starter-validation'

 

Validation 적용

ex) ProductRequestDto

package com.sparta.springauth.dto;

import jakarta.validation.constraints.*;
import lombok.Getter;

@Getter
public class ProductRequestDto {
    @NotBlank
    private String name;
    @Email
    private String email;
    @Positive(message = "양수만 가능합니다.")
    private int price;
    @Negative(message = "음수만 가능합니다.")
    private int discount;
    @Size(min=2, max=10)
    private String link;
    @Max(10)
    private int max;
    @Min(2)
    private int min;
}

 

@Valid

Bean Validation을 적용한 해당 Object validation 실행

 

testValid

@PostMapping("/validation")
@ResponseBody
public ProductRequestDto testValid(@RequestBody @Valid ProductRequestDto requestDto) {
    return requestDto;
}

 

JSON 데이터

{
    "name" : "Robbie",
    "email" : "Robbie@gmail.com",
    "price" : 1234,
    "discount" : -1234,
    "link" : "54321",
    "max" : 10,
    "min" : 2
}

 

Validation 예외처리

회원가입 적용

SignupRequestDto

package com.sparta.springauth.dto;

import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class SignupRequestDto {
    @NotBlank
    private String username;
    @NotBlank
    private String password;
    @Email
    @NotBlank
    private String email;
    private boolean admin = false;
    private String adminToken = "";
}

 

UserController : signup에 @Valid 적용

@PostMapping("/user/signup")
public String signup(@Valid SignupRequestDto requestDto) {
    userService.signup(requestDto);

    return "redirect:/api/user/login-page";
}

 

 

 

Validation 예외처리

  • 회원가입 진행 시 데이터 검증 시 오류가 발생했을 때 로그인 페이지가 아니라 회원가입 페이지로 이동 하려면 Validation 예외를 처리해야합니다.

 

BindingResult

  • 예외가 발생하면 BindingResult 객체에 오류에 대한 정보가 담깁니다.
  • 파라미터로 BindingResult 객체를 받아올 수 있습니다.

UserController

package com.sparta.springauth.controller;

import com.sparta.springauth.dto.LoginRequestDto;
import com.sparta.springauth.dto.SignupRequestDto;
import com.sparta.springauth.service.UserService;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;

@Slf4j
@Controller
@RequestMapping("/api")
public class UserController {

    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/user/login-page")
    public String loginPage() {
        return "login";
    }

    @GetMapping("/user/signup")
    public String signupPage() {
        return "signup";
    }

    @PostMapping("/user/signup")
    public String signup(@Valid SignupRequestDto requestDto, BindingResult bindingResult) {
        // Validation 예외처리
        List<FieldError> fieldErrors = bindingResult.getFieldErrors();
        if(fieldErrors.size() > 0) {
            for (FieldError fieldError : bindingResult.getFieldErrors()) {
                log.error(fieldError.getField() + " 필드 : " + fieldError.getDefaultMessage());
            }
            return "redirect:/api/user/signup";
        }

        userService.signup(requestDto);

        return "redirect:/api/user/login-page";
    }
}

 

bindingResult.getFieldErrors()

- 발생한 오류들에 대한 정보가 담긴 List<FieldError> 리스트를 가져옵니다.