springframework 3.x 버전에서 컨트롤러에 선언된 @RequestMapping 정보를 모두 가져오는 방법은?

2013-02-09 21:01

현재 사용하지 않는 url을 찾으려고 합니다.

  1. 먼저 소스코드에 등록되어 있는 모든 url을 찾고..
  2. 그 다음에는 실제 호출되고 있는 서버로그에 남는 url을 정리하고...
  3. 마지막으로 1.등록된 url과 2.호출되고 있는 url을 비교하여 호출되지 않는 url을 찾아내려고 합니다.

질문 1. 컨트롤러에 선언되어 있는 @RequestMapping 어노테이션에 등록된 모든 url을 가져오려고 하는데 어떻게 하면 될까요? 질문 2. 서버로그에 남는 url을 모두 찾아내는데 효율적인 방법은 무엇이 있을까요? 질문 3. 위 기능을 툴로 만들면 재사용성도 좋을것 같고.. 오픈소스로 공개하면 여러모로 도움이 될 것 같은데... 좋은 아이디어 공유해주세요.

감사합니다.^^

4개의 의견 from SLiPP

2013-02-12 10:01

질문1 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.ServletHandlerMethodResolver.isHandlerMethod(Method) 이 답이 될것 같습니다.



@Override protected boolean isHandlerMethod(Method method) { if (this.mappings.containsKey(method)) { return true; } RequestMapping mapping = AnnotationUtils.findAnnotation(method, RequestMapping.class); if (mapping != null) { String[] patterns = mapping.value(); RequestMethod[] methods = new RequestMethod[0]; String[] params = new String[0]; String[] headers = new String[0]; if (!hasTypeLevelMapping() || !Arrays.equals(mapping.method(), getTypeLevelMapping().method())) { methods = mapping.method(); } if (!hasTypeLevelMapping() || !Arrays.equals(mapping.params(), getTypeLevelMapping().params())) { params = mapping.params(); } if (!hasTypeLevelMapping() || !Arrays.equals(mapping.headers(), getTypeLevelMapping().headers())) { headers = mapping.headers(); } RequestMappingInfo mappingInfo = new RequestMappingInfo(patterns, methods, params, headers); this.mappings.put(method, mappingInfo); return true; } return false; }

질문 2. 스프링에서는 다음과 같이 찾는것같습니다.. org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.ServletHandlerMethodResolver.resolveHandlerMethod(HttpServletRequest)

2013-02-12 14:01
  1. RequestMapping 에 해당하는 Controller / Url / Action의 경우

http://vard-lokkur.blogspot.kr/2011/01/sts-requestmappings-view.html

이런 식으로, STS를 이용해서 찾으시면 수월하게 찾을 수 있습니다.

  1. access log parser 작업을 하시는게 제일 편합니다. 사실 특별히 프로그래밍 까지도 필요 없을 걸로 보입니다.

이전에 재성형이랑 이야기 했던 쪽에서 나왔던 예제 코드 일부만 수정하시면 될 것 같네요.

cat access.log | awk '{print $4}' | sort | uniq -c

여기서, awk 인자 좀 수정하시고, sort 빼시면, uniq 하게 access.log 내용을 뽑을 수 있을 것으로 보입니다. 각 서버의 access log 에 대해 해당 작업을 수행하시고, 비슷한 방식으로 merge 하면 되겠네요.

  1. 1 - 2 형태의 작업입니다. 단순하게 처리될 수 있겠네요. 1번과 2번에 대해 동일한 기준으로 sort 적용 하시고, diff 해서 나오는 결과 사용하시면 될 듯 합니다. *nix 관련 커맨드 들로 손쉽게 처리 가능하시겠네요.
2013-02-12 16:39

앞 글에 @eclipse4j 가 공유한 URL이 정확히 네가 1번에서 추출하려고 하는 정보를 추출할 수 있네. http://www.java-allandsundry.com/2012/03/endpoint-documentation-controller-for.html 보면 더 확실함을 알 수 있다.

이 방법도 좋지만 앞에서 @Kenny 가 언급한 방식이 더 좋겠다는 생각이 든다. access.log 분석하면 각 일별, url별 요청 수 등은 모두 파악할 수 있을 듯하다. 만약 그래도 굳이 위 방법을 통해 구현하고 싶다면 2번 질문에 대해서는 mvc interceptor와 log4j와 같은 도구의 Async로 처리할 수 있는 Appender하나 추가해서 별도의 로그를 쌓을 수 있도록 하면 가능하지 않을까? 이전 회사에서는 에러 로그를 이와 같은 방식으로 수집해서 관리했는데 정말 유용했다.

근데 이 툴을 만들면 어떤 부분에 유용할까? 어떤 용도로 활용할 경우 유용할지에 대해서 아직 감이 잡히지 않아서 말이야. 각 url별 요청 통계는 다른 형태로도 구현되어 있는 툴이 많아서 말이지. 그냥 google analytics만 사용하더라도 왠만한 정보는 추출할 수 있을 듯하다.

의견 추가하기

연관태그

← 목록으로