GitHub

https://github.com/Backcoder-June

BackCoder 기록 그리고 숙달

Back to the Spring

사용자의 요청DTO => @Validated 검사

Backcoder 2023. 1. 18. 21:05

[ Validation ] 

: 사용자의 요청 입력 값요구되는 조건에 맞는지 검사 

사용자 입력값을 받는 requestDTO 에서 validate 해줘야 합니다.

( responseDTO (X) / entity (X) ) 

 

- 클라이언트 단에서도 validate 를 하겠지만 
서버로 바로 접근하는 '공격' 을 막지 못하므로  
=> 1.클라이언트 2.서버 3.DB 

각 단에서 validate 를 해주어야 합니다. 

[ 서버에서 validation ] 
1. validation 라이브러리 설치

spring => jakarta bean validation api 

boot => spring boot starter validation 


2. requestDTO 각 Column 에 필요한 validation 어노테이션 사용

 

@NotNull : null 값일 경우 에러 발생시킴 
@NotEmpty : 빈 문자열일 경우 에러 발생시킴 
@NotBlank : null 혹은 빈문자열 에러 발생시킴 

 

@Size(min = 2, max = 5 )  : 글자수 vaildate  
== 
@Min(2) @Max(5) 

@JsonFormat(pattern = "yyMMdd")

@Pattern 

...




3. @Validated
: Controller 에서 해당 requestDTO 가 쓰이는 부분에서 @Validated 

    @RequestMapping(value = "", method = RequestMethod.POST)
    public ResponseEntity<?> createPost(@Validated @RequestBody PostRequestDTO postRequestDTO) {

4. BindingResult

: @Validated에러 내용이 담기는 객체  ( 매개변수에 추가해서 사용 )

public ResponseEntity<?> createPost(@Validated @RequestBody PostDTO postDTO, BindingResult bindingResult) {

        if (bindingResult.hasErrors()) {
            List<FieldError> fieldErrors = bindingResult.getFieldErrors();
            return ResponseEntity
                    .badRequest()
                    .body(fieldErrors);
        } ...


5. @Valid 

: 두 개 이상의 데이터를 가지고 있는 상위 객체에다가 @NotBlank 같은 validation을 붙이면

안에 어떤 필드에 validation을 적용하라고 하는지 모름 

=> 클래스 안에 들어가서 직접 하나하나 @NotBlank 등 검사 해주고, 
=> 여기 상위 객체에서는 @Valid  붙여줘서 안에걸 검사하게 하는 것. 

public class Address {
    @NotBlank
    private String street;
    @NotBlank
    private String postCode;
}

@Valid
private Address address;