ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] ExpirationDate 만료일 설정하기
    JAVA/SPRING 2018. 5. 2. 15:26

    ExpirationDate

    프로젝트 중에 ExpriationDate를 이용하여 기존 프로덕션의 기한을 주는 인터페이스를 사용하여 포스팅 해보려고 합니다.

    우선 Component 를 만듭니다.

    커스텀 어노테이션을 만드는데요.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    package 경로;
     
    import static java.lang.annotation.RetentionPolicy.RUNTIME;
     
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.Target;
     
    @Target(ElementType.METHOD)
    @Retention(RUNTIME)
     
    public @interface ExpirationDate {
        String endDate() default "2099-12-31 23:59:59";
    }
     
    cs

    Interceptor를 통해 해당 주소의 만료일을 관리합니다.
    파라미터가 없으면 만료일은 2099-12-31 23:59:59로 지정합니다.

    우리가 주석을 만들 때, 어노테이션들의 목적은 항상 분명하지 않을 수도 있습니다.
    새로 생성 된 어노테이션 유형에 일종의 메타 데이터 (또 다른 자바 어노테이션)를 제공하여 도구가 의도 된 기능을 공개 할 수 있도록하거나 컴파일러가 컴파일 중에 의도 한 기능을 명시 할 수 있습니다.

    그 같은 목적을 위해 자바 언어는 네가지의 어노테이션 유형을 정의합니다.

    Target
    Retention
    Documentation
    Inherited

    위의 네가지를 meta-annotation이라고 일컫습니다.

    Target Annotation은 코드의 어떤 요소가 정의 된 형식의 주석을 가질 수 있는지 지정합니다. 
    위와 같이 Element.Type.METHOD로 지정하면 Method 요소가 가질 수 있다는 것을 Target으로 지정하는 것입니다.

    그리고 가시성을 지정하는 Retention이 있습니다.
    총 3가지가 있습니다.

    Compilers
    Tools
    Runtime

    Retention에 위와 같이 Runtime 식별자를 사용하면 class 파일에 주석이 기록 될뿐만 아니라 JVM에서 런타임에 사용할 수있게됩니다.

    JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당 받고 이 메모리를 용도에 따라 여러 영역으로 나누어 관리합니다.



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    package 인터셉터 경로;
     
    import java.util.Calendar;
    import java.util.Date;
     
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
     
    import org.apache.commons.lang3.time.DateUtils;
    import org.springframework.web.method.HandlerMethod;
    import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
     
    import ExpirationDate 경로;
     
    /**
     * 
     * Expiration Date Interceptor
     * Expires after that time
     * 
     * Date Format "yyyy-MM-dd HH:mm:ss"
     * 
     */
    public class ExpriationInterceptor extends HandlerInterceptorAdapter {
        
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)  {
            boolean isExpired = true;
            HandlerMethod method = (HandlerMethod)handler;
            
            ExpirationDate expire = method.getMethodAnnotation(ExpirationDate.class);
            if ( expire != null ) {
                
                try {
                    
                    Date expireDate = DateUtils.parseDate(expire.endDate(), "yyyy-MM-dd HH:mm:ss");
                    
                    isExpired =  (Calendar.getInstance().getTimeInMillis() < expireDate.getTime()) ;
                    if (!isExpired)
                        response.sendError(HttpServletResponse.SC_BAD_REQUEST);
                                                    
                } catch (Exception e) {
                    isExpired = true;
                    
                } 
            }
            
            
            return isExpired;
        }
     
    }
     
    cs

    이번에는 인터셉터 컴포넌트를 받아서 사용하는 인터셉터를 만들어봅시다.
    DATE를 양식을 적절히 파싱하고 EXPIRED 될 때 배드 리퀘스트를 뱉어서 에러 페이지로 전환하도록 합니다.

    1
    2
    3
    4
    5
    6
    7
     @Override
     public void addInterceptors(InterceptorRegistry registry) {
         registry.addInterceptor(new ExpirationInterceptor()).addPathPatterns("/**");
     }
     
     추가하시는 부분입니다.
     
    cs

    addPathPatterns에는 controller로 오는 요청들에 대한 패턴을 지정하여, 이 패턴들에 해당하는 요청들에 대해 지정한 interceptor를 태우라는 설정입니다.
    설정한 패턴들 중, 일부 패턴을 제외하고 싶다면 excludePathPatterns 를 붙여 제외하고 싶은 패턴을 string 값으로 주면 됩니다.

    이제 구성은 끝났으니 실제 파일에 사용하시면 됩니다.

    사용은 해당 컨트롤러 메서드에 선언하면 됩니다.

    1
    2
    3
    4
    @ExpirationDate(endDate="2018-04-01 00:00:00")
    public String main() {
            return "main";
    }
    cs


    출처

    https://www.mindstick.com/Articles/12141/annotations-in-java-target-and-retention

    https://www.holaxprogramming.com/2013/07/16/java-jvm-runtime-data-area/

    http://www.leafcats.com/40

    'JAVA > SPRING' 카테고리의 다른 글

    Asynchronous, Multi-thread 개발하기  (0) 2018.06.04
    [Spring] Restful을 위한 @ResponseBody 와 @RestController  (0) 2018.04.25
    [Spring]Spring Boot + Tiles  (0) 2018.04.10
Designed by Tistory.