Java에서는 null 값에 대해서 접근 하려고 할때 null pointer exception이 발생 함으로, 이러한 부분을 방지 하기 위해서 미리 검증하는 과정을 Validation이라고 한다
@Size(min = 6, max = 6)
private String reqYearMonth; //yyyyMM
...(생략)
public class User {
@AssertTrue(message = "yyyyMM의 형식에 맞지 않습니다.")
public boolean isReqYearMonthValidation() {
try {
LocalDate localDate = LocalDate.parse(getReqYearMonth() + "01", DateTimeFormatter.ofPattern("yyyyMMdd"));
} catch (Exception e) {
return false;
}
return true;
}
}
...(생략)
여기서 만약 reqYearMonth에 세팅둔 yyyyMMdd에 맞지않는 값이 넘어온다면 에러메세지가 호출된다.
여기서 중요한부분은 @AssertTrue 애노테이션을 사용한 검증 메소드명 처음에 is~로 시작해야한다는 점이다.
이거 같은 경우는 재활용이 불가능하다. 즉 매번 만들어 줘야한다. 중복코드가 많이 만들어 질것이다.
@Constraint(validatedBy = {YearMonthValidator.class})
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
public @interface YearMonth {
String message() default "yyyyMM 형식에 맞지 않습니다.";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
String pattern() default "yyyyMMdd";
}
@YearMonth
private String reqYearMonth; //yyyyMM
위에서 작성한 Validator메소드를 지운다
public class YearMonthValidator implements ConstraintValidator<YearMonth, String> {
private String pattern;
@Override
public void initialize(YearMonth constraintAnnotation) {
this.pattern = constraintAnnotation.pattern();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
//yyyyMM01
try {
LocalDate localDate = LocalDate.parse(value+"01", DateTimeFormatter.ofPattern(this.pattern));
} catch (Exception e) {
return false;
}
return true;
}
}
Web Application의 입장에서 바라보았을 때, 에러가 났을 때 내려줄 수 있는 방법이 많지 않다
1. 에러페이지
2. 4XX Error or 5XX Error
3. Client가 200외에 처리를 하지 못 할 때는 200을 내려주고 별도의 에러 Message 전달
Web Application입장에서는 이러한 에러들을 한곳에 모아서 처리하는게 편리하다
Web Application에서 관리되는 영역으로 Spring Boot Framework에서 Client로 부터 오는 요청/응답에 대해서 최초/최종 단계의 위치에 존재하며, 이를 통해서 요청/응답의 정보를 변경하거나, Spring에 의해서 데이터가 변환되기 전의 순수한 Client 요청/응답 값을 확인할 수 있다.
유일하게 ServletRequest, ServletResponse의 객체를 변환할 수 있다.
주로 Spring Framework에서는 request/response의 Logging용도로 활용하거나 인증과 관련된 Logic들을 해당 Filter에서 처리한다
이를 선/후 처리함으로써 ,Service business logic과 분리시킨다.
Filter는 최전방에서 들어오는 정보들을 볼 수 있고, 세션에 대한 정보들을 필터에서 처리할 수 있다.
Interceptor란 Filter와 매우 유사한 형태로 존재하지만, 차이점은 Spring Context에 등록된다(스프링의 기능을 사용할 수 있다).
AOP와 유사한 기능을 제공 할 수 있으며, 주로 인증단계를 처리하거나, Logging를 하는 데에 사용한다
이를 선/후 처리함으로써, Service business logic과 분리 시킨다.