오늘한일
- 회원가입 기능 개발에 데이터 검증 적용 시키기
유효성 검사
유효성 검사란, 요청한 데이터가 어떤 조건에 충족하는지 확인하는 작업입니다
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 |