본문 바로가기
JAVA/SPRING

[Spring] ExpirationDate 만료일 설정하기

by F.E.D 2018. 5. 2.

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

댓글