Clean Code that Works.


간단한 Url Logger를 작성 하기 위해서, 해당 url에 대한 @RequestMapping에 url값이 필요했다.

구글링을 해서 찾아봤었는데.. http://lizdouglass.wordpress.com/2009/12/16/adding-a-spring-aspect/

여튼..
@Before aspect로 할 경우 Joinpoint에서 getClass 한 후
여기서 getMethods[] 한다. 메서드 들 중에서 방금 호출한 메서드를 가져오고
가져온 메서드와 호출한 메서드 정보가 일치 하면 그 메서드에서 어노테이션 정보를 가져오고
어노테이션 정보에서(대부분 url을 첫번째 값이니) 첫번째 값을 가져온다.

@Before(value="execution(* net.study.spring.controller.WelcomeController.index())")
    public void doBeforeProfiling( JoinPoint jp) throws SQLException
    {
        UrlLogger urlLogger = new UrlLogger();
        Method[] methods =  jp.getTarget().getClass().getMethods();
        for ( Method method : methods) {
            if ( method.getName().equals( jp.getSignature().getName()))
            {
                String[] values = method.getAnnotation( RequestMapping.class).value();
                urlLogger.setTargetUrl( values[0]);
            }
        }
        urlLoggerDAO.insert( urlLogger);
    }

더 낳은 방법도 있을 것 같은데..
토비님 책 나오면 다시한번 집중하고 봐야겠다.

추가로..
aspect표현식을 수정 하면. 아래 한줄임!! ..;
@Before(value="execution(* net.study.spring.bbs.controller.*.*(..)) && @annotation(org.springframework.web.bind.annotation.RequestMapping)")

이렇게 된다. controller클래스에 있는 모든 메서드에 걸긴 거는데 거기서 @annotation이 RequestMapping인 것만!!
왜냐.. url로깅이기 때문에 @_@
만약 dao관련 로깅을 하고 싶다면..@Transactional을 하면 되겠죵!!