본문 바로가기

TIL

231110_TIL

오늘한일

  • 회원가입 기능 개발에 데이터 검증 적용 시키기

 

유효성 검사

유효성 검사란, 요청한 데이터가 어떤 조건에 충족하는지 확인하는 작업입니다

Validation이란?

  • Java는 null 값에 대한 접근에 대해 NullPointerException 오류가 발행하기 때문에 이러한 부분을 예방하기 위해 Validation 즉, 검증 과정이 필요합니다.
  • Spring에서는 null 확인 뿐 아니라 문자의 길이 측정과 같은 다른 검증 과정도 쉽게 처리할 수 있도록 Bean Validation 제공하고 있습니다. 

 

  • Bean Validation
    • 간편하게 사용할 수 있는 여러 애너테이션을 제공 해줍니다.
    •  

 

build.gradle : validation

implementation 'org.springframework.boot:spring-boot-starter-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 객체를 받아올 수 있습니다.
@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";
}

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> 리스트를 가져옵니다.

 

느낀점

@Valid 어노테이션을 통해 dto 클래스 필드의 유효성 검사를 하는 방법에 대해 알게됬었다.

'TIL' 카테고리의 다른 글

231128_TIL  (1) 2023.11.28
231117_TIL  (1) 2023.11.17
231109_TIL  (1) 2023.11.09
231108_TIL  (0) 2023.11.08
231107_TIL  (0) 2023.11.07