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 |
댓글