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에 지정한 값을 응답하며 정상 동작한다.
'프로그래밍 > Spring' 카테고리의 다른 글
스프링 프레임워크 DI, AOP, 환경설정(intellij, gradle, tomcat) (0) | 2022.07.23 |
---|---|
[Spring] Bean을 싱글톤으로 사용해도 되는 이유 (0) | 2022.07.18 |
[Spring] Spring boot JPA 연동, myBatis 연동 (0) | 2022.05.16 |
[Spring] DTO <-> Entity 변환 (0) | 2022.05.05 |
[Spring] @Bean 과 @Component 차이 (0) | 2022.04.30 |