2022/03/01 스프링의 기능을 활용

김석진·2022년 3월 1일
0

스프링입문

목록 보기
5/5

Spring Boot Validation

Validation

Java에서는 null 값에 대해서 접근 하려고 할때 null pointer exception이 발생 함으로, 이러한 부분을 방지 하기 위해서 미리 검증하는 과정을 Validation이라고 한다

문제점

  1. 검증해야 할 값이 많은 경우 코드의 길이가 길어 진다
  2. 구현에 따라서 달라 질 수 있지만 Service Logic과의 분리가 필요하다
  3. 흩어져 있는 경우 어디에서 검증을 하는지 알기 어려우며, 재사용의 한계가 있다.
  4. 구현에 따라 달라질 수 잇지만, 검증 Logic이 변경 되는 경우 테스트 코드등 참조하는 클래스에서 Logic이 변경되어야 하는 부분이 발생할 수 있다.

Spring에서 Validation을 위해 제공하는 Annotation

Spring Boot Custom Validation

Custom Validation

  1. AssertTure/False와 같은 method를 지정해서 Custom Logic 적용가능
  2. ConstraintValidator를 적용하여 재사용이 가능한 Custom Logic 적용 가능

@AssertTrue의 사용예제

Dto-User

   @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~로 시작해야한다는 점이다.
이거 같은 경우는 재활용이 불가능하다. 즉 매번 만들어 줘야한다. 중복코드가 많이 만들어 질것이다.

ConstraintValidator를 적용하여 재사용이 가능한 Custom Logic 적용 가능

annotation-YearMonth

@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";
}

dto -User

   @YearMonth
    private String reqYearMonth; //yyyyMM

위에서 작성한 Validator메소드를 지운다

validator -YearMonthValidator

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;
    }
}

Spring Boot Exception 처리

Exception(예외) 처리

Web Application의 입장에서 바라보았을 때, 에러가 났을 때 내려줄 수 있는 방법이 많지 않다
1. 에러페이지
2. 4XX Error or 5XX Error
3. Client가 200외에 처리를 하지 못 할 때는 200을 내려주고 별도의 에러 Message 전달

Web Application입장에서는 이러한 에러들을 한곳에 모아서 처리하는게 편리하다

Spring Boot Filter와 Intercepter

filter

Web Application에서 관리되는 영역으로 Spring Boot Framework에서 Client로 부터 오는 요청/응답에 대해서 최초/최종 단계의 위치에 존재하며, 이를 통해서 요청/응답의 정보를 변경하거나, Spring에 의해서 데이터가 변환되기 전의 순수한 Client 요청/응답 값을 확인할 수 있다.

유일하게 ServletRequest, ServletResponse의 객체를 변환할 수 있다.

주로 Spring Framework에서는 request/response의 Logging용도로 활용하거나 인증과 관련된 Logic들을 해당 Filter에서 처리한다
이를 선/후 처리함으로써 ,Service business logic과 분리시킨다.

Filter는 최전방에서 들어오는 정보들을 볼 수 있고, 세션에 대한 정보들을 필터에서 처리할 수 있다.

Interceptor

Interceptor란 Filter와 매우 유사한 형태로 존재하지만, 차이점은 Spring Context에 등록된다(스프링의 기능을 사용할 수 있다).
AOP와 유사한 기능을 제공 할 수 있으며, 주로 인증단계를 처리하거나, Logging를 하는 데에 사용한다
이를 선/후 처리함으로써, Service business logic과 분리 시킨다.

profile
주니어 개발자 되고싶어요

0개의 댓글