DTO 데이터 검증이 필요한 이유
보통 Web Appliation을 작성하면, Front-End에서 사용자가 입력한 정보를 검증하고, 검증이 완료된 데이터를 Back-End에게 넘겨주게 된다.
하지만, 보통의 경우가 아닌 상황에서는 Back-End에서는 입력값으로 받은 DTO를 신뢰할 수가 없게 된다.
( Web Application UI를 통해 요청된 Request가 아닌 경우 - curl, postman 등등..)
이러한 상황에 대한 대비로 Back-End에서도 Request로부터 전달받은 DTO에 대한 검증이 필요하다.
@Valid
Spring에서는 DTO 필드에 조건과 메세지를 작성해주면, @Valid를 이용해 데이터 검증을 할 수 있다.
@Valid는 JSR-303, 380 표준 스펙으로
제약 조건이 부여된 객체에 대해 Beam Validator를 이용하여 검증하도록 지시하는 Annotation이다.
Spring에서는 LocalValidatorFactoryBean을 이용해 JSR 표준의 검증 기능을 사용한다.
SpringBoot 2.3 이상의 버전 부터는 spring-boot-starter-web 의존성 내부에 있던 validation이 사라졌다.
spring-boot-starter-validation 의존성을 따로 추가해 주어야 한다.
Dto
@Getter
@NoArgsConstructor
public class UserSaveRequestDto {
@NotBlank(message = "Please, insert UserID!")
private String userId;
@NotBlank(message = "Please, insert UserName!")
private String userName;
@Email(message = "Please, insert valid e-mail!",
regexp = "^(?=.{1,64}@)[A-Za-z0-9_-]+(\\.[A-Za-z0-9_-]+)*@[^-][A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})$")
private String email;
@NotBlank(message = "Please, insert password!")
private String password;
@Size(min = 1, message = "User must be mapped with Group")
@NotNull(message = "Please, insert GroupIdList!")
private Set<String> groupIdList;
}
javax.validation.constraints에서 제공하는 valid 관련 Annotation
https://docs.jboss.org/hibernate/beanvalidation/spec/2.0/api/
Controller
@RequiredArgsConstructor
@RestController
public class UserController {
private final UserService userService;
@PostMapping("/user")
public String save(@RequestBody @Valid UserSaveRequestDto requestDto) throws Exception {
return userService.save(requestDto);
}
}
검증을 원하는 @RequestBody argument에 @Valid Annotation을 추가해 주면 된다.
Exception Handling
@ControllerAdvice
public class CommonExceptionHandler<T> {
@ExceptionHandler(value = {MethodArgumentNotValidException.class})
protected ResponseEntity<Response<T>> handleMethodArgNotValidException(
MethodArgumentNotValidException exception) {
Response<T> response = new Response<>();
response.addErrorMsgToResponse(
exception.getBindingResult().getAllErrors().get(0).getDefaultMessage()
);
return ResponseEntity.status(HttpStatus.NOT_ACCEPTABLE).body(response);
}
}
@RequestBody로 부터 받은 파라미터에 Error가 발생한 경우에는 MethodArgumentNotValidException이 발생한다.
Spring의 Exception Handling 관련 Annotation을 이용하여 해당 Exception에 대한 처리를 추가해 주면 된다.
'Spring > etc' 카테고리의 다른 글
[Spring] Spring Boot Profile 환경별 설정 (2.4버전) (1) | 2022.01.29 |
---|---|
[Spring] 설정 파일 분리 및 여러 개 설정하기 (application.yml) (0) | 2022.01.26 |
[Spring] Spring Boot Logging(SLF4J, Logback) (0) | 2021.12.13 |
[Spring] Spring Security 로그인 사용자 정보 가져오는 방법 (0) | 2021.12.01 |
[Spring] Spring Security Architecture (0) | 2021.11.29 |