반응형

 

gradle을 이용해서 validation jar파일을 의존성 추가 해준다.

 

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-aop'
    implementation 'org.springframework.boot:spring-boot-devtools'
    implementation 'org.springframework.boot:spring-boot-starter-validation:2.6.6'

 

 

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

 

 


Parameter validation

클래스에 @Validated를 추가하고, 매개변수에 @Size를 지정하여 유효성 검증을 할 수 있다.

 

@RestController
@RequestMapping("/api")
@Validated
public class GetController {
    
    @GetMapping("/get")
    public String val(@Size(max = 5) @RequestParam String name){
        return name;
    }

 

 

 

DTO validation

 

dto model 객체에 validation 어노테이션을 이용해 유효성 검증을 진행할 객체 속성에 추가해준다.

예외가 발생했을 경우 message를 이용해서 사용자에게 검증 실패를 알릴 수 있다.

 

@Getter
@Setter
@ToString
@NoArgsConstructor
public class Dto {

    @Size(min = 2, max = 10, message = "이름은 2~10자 여야 합니다.")
    private String name;
    @Email(message = "이메일 형식이 맞지 않습니다.")
    private String Email;


}

 

 


 

validation.BindingResult 객체를 이용해서 dto model에 적용한 유효성 검증이 알맞게 들어왔는지

인터셉터처럼 동작해서 확인해줄 수 있다.

 

hasErrors()를 이용해서 에러가 발견된다면 모든 에러 메세지를 StringBuilder에 추가한 후,

ResponseEntity 를 이용해 결과를 반환하게끔 했다.

 

BindingResult는 AOP처리해줄 수 있다.

 

@RestController
@RequestMapping("/val")
public class VController {

    @PostMapping("/dto")
    public ResponseEntity createDto(@Valid @RequestBody Dto dto, BindingResult bindingResult){
        StringBuilder sb = new StringBuilder();

        if(bindingResult.hasErrors()){
            List<ObjectError> allErrors = bindingResult.getAllErrors();
            allErrors.forEach((error) -> {
                sb.append(error.getDefaultMessage()).append(" ");
            });
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(sb.toString());
        }

        System.out.println(dto);
        return ResponseEntity.status(HttpStatus.CREATED).body(dto);
    }

 

 


 

@AssertTrue

직접 유효성검증 함수를 만들어줄 수 있다.

true면 정상적으로 동작하고, false면 HTTPSTATUS.400 error가 발생한다.

 

@AssertTrue(message = "이름은 6자 이하여야 합니다.")
public boolean isNameValidation(){
    if(this.name.length() >= 7)
        return false;
    return true;
}

 

 


 

@RestControllerAdvice

Controller일 경우 @ControllerAdvice

Global하게 지정할 경우 클래스에 어노테이션 추가

Global로 동작하지 않게 basePackage, baseClass 지정가능

 

@ExceptionHandler 

value에 지정된 예외가 발생하면 해당 메서드가 동작한다.

매개변수로 예외를 조작할 수 있다.

컨트롤러에 메서드를 만들어서 해당 컨트롤러에서만 동작하도록 할 수 있다.

 

@RestControllerAdvice
public class GlobalAdvice {

    @ExceptionHandler(value = Exception.class) // 예외 잡기
    public ResponseEntity ex(Exception e){
        e.printStackTrace();

        return ResponseEntity.status(HttpStatus.OK).body("예외잡기");
    }
}

 

 

 

 

예외를 일부러 발생시켰다.

@RestController
@RequestMapping("/adv")
public class AController {

    @GetMapping("/get")
    public String get() throws Exception{
        throw new Exception();
    }
}

 

 

 

예외가 글로벌Advice, @ExceptionHandler에 의해 처리되고, Body에 지정한 값을 응답하며 정상 동작한다.

 

 

 


 

반응형

+ Recent posts