Spring Boot
Validation
stophyeon
2024. 1. 9. 13:51
728x90
Validation이란
Validation 기능은 검증을 하는 기능입니다.
우선 사용자의 요청이 처리되는 순서를 알아야 합니다
Client Request(JSON) => Object Mapper => Object(request DTO) => Service Logic =>Object(response DTO) =>
Object Mapper => Response(JSON)
Object Mapper를 통해 JSON 형태의 Request(요청이 POST라고 가정)가 Object로 변환됩니다.
하지만 이 때 Request가 잘못된 형식으로 온다면 Service Logic에서 잘못된 형식을 처리하는 부분을 만들어야 합니다.
그런데 Spring에서 각 Code에 한가지의 기능을 정의하고 부가적인 기능은 따로 정의하는 것을 선호한다는 것을 알 수 있습니다. 따라서 Service Logic에서 Client Request의 Data 형식을 검증하는 부분을 만들지 않고 따로 검증 기능을 하는 부분을 만든 것이 Validation기능입니다.
Validation Annotation
검증을 하는 위치는 Controller와 DTO 입니다.
우선 Object Mapper를 통해 JSON형태가 Object형태로 변환될 때 검증을 해서 형식이 잘못되었다면 빠르게 사용자에게
알려서 Data를 올바른 형식으로 재전송할 것을 요청합니다.
이제 Validation 기능을 구현해주는 어노테이션들에 대해 알아보겠습니다
Validation에 해당하는 어노테이션들은 형식에 맞지 않는 Data가 입력으로 들어왔을 때 예외를 발생시키고
모든 어노테이션에 message라는 속성이 있어서 사용자에게 보낼 message를 만들 수 있습니다.
email의 형식에 맞지않는 입력이 들어올 경우 예외 발생 | |
@Pattern | regexp = ..... 정의한 Data 양식이 아닌 입력이 들어오면 예외 |
@Max(n) | n보다 큰값이 입력으로 들어오면 예외 발생 |
@Min(n) | n보다 작은 값이 입력으로 들어오면 예외 발생 |
@Size(min =a , max =b) | a,b사이 수가아닌 입력이 들어오면 예외 발생 |
@Future | 현재 날짜보다 미래의 날짜가아닌 입력이 들어오면 예외 |
@Past | 현재 날짜보다 과거의 날짜가아닌 입력이 들어오면 예외 |
@NotNull | 입력이 null 이면 예외 발생 |
@NotBlank | 입력이 null,"", " "이면 예외 발생(공백) |
@NotEmpty | 입력이 null,""이면 예외 발생 |
@Valid | 위의 어노테이션들이 선언된 dto를 인수로 받는 메서드 의 dto앞에 선언하면 검증을 실행 |
Custom Validation
Spring에서 제공되는 Validation의 기능 외에 다른 방식으로 검증을 하고 싶다면
@AssertTrue/False를 선언해서 직접 Validation 방싱을 정의할 수 있습니다.
사용법은 DTO 검증방식을 정의한 메서드에 선언을 하는 것입니다.
단, 메서드의 이름이 is....로 시작해야하고 return값은 boolean이어야 합니다.
@AsserTrue(....)
public boolean isValidate(){
//정상 형식
.......
return True;
//형식에 맞지않은 입력
..........
return False;
}
Validation의 위치
모든 Validation기능은 Controller에서 하는 것이 정답은 아닙니다.
개발을 하다보면 검증을 Service 계층에서 해야 할때도 있습니다. 따로 정답은 없는 것입니다.
하지만 저는 Controller에서 최대한 검증을 해줘야 한다고 생각합니다.
만약 Controller가아닌 부분에서 검증을 해야한다면 해당 Class에 @Validated를 선언해
검증을 해주는 방식으로 개발을 하고 있습니다.