Whiteship's Note


Advice parameters

Spring/Chapter 6 : 2007.04.03 15:33


예전에 공부할 때 여기를 공부하다가 멈췄었네요.
Advice parameters 1 (2)
드디어 따라잡았습니다. 흐흣.

1. Access to the current JoinPoint

해당 Advice가 끼어드는 joinpoint에 대한 정보를 얻어 올 수 있습니다. @Around 어드바이스를 제외한 다른 어드바이스들의 첫번째 파라미터로 JoinPoint 를 만들어 주면 됩니다.

    @Before("aop.newStyle.aspect.CinemaAspect.sellTicketPointcut()")
    public void weblcomeAdvice(JoinPoint jp){
        System.out.println(jp.getClass());
        System.out.println("안녕하세요. 어떤 영화를 보시겠습니까?");
    }

실제 객체는 MethodInvocationProceedingJoinPoint 이 클래스라는 걸 확인할 수 있습니다.

@Around 어드바이는 이전 글에서 봤듯이 ProceedingJoinPoint가 와야 합니다.

2. Passing parameters to advice

    @Pointcut("execution(aop.newStyle.domain.Ticket *.sell*(..))")
    public void sellTicketPointcut() {
    }

    @Before("aop.newStyle.aspect.CinemaAspect.sellTicketPointcut() &&" +
            "args(movie, ..)")
    public void weblcomeAdvice(JoinPoint jp, Movie movie){
        System.out.println("안녕하세요." + movie.getName() + " 을(를) 보시겠습니까?");

이렇게 args()를 사용하여 대상 메소드가 받을 인자를 가져올 수 있습니다.

다른 방법으로는 @Pointcut을 정의할 때 args()를 사용해서 다음과 같이 하는 건데요. IllegalArgumentExecption이 발생하는데 아직 원인을 모르겠습니다. 레퍼런스에 나와있는 코드와 똑같이 친것 같은데 말이죠. ㅠ.ㅠ

3. Determining argument names

공부해야 할 부분

4. Proceeding with arguments

@Around 에서 proceed()를 실행 할 때 들어갈 인자값을 바꿀 수 있는데요 그때는 proceed(Object[]) 메소드를 사용하면 됩니다.

@Around("aop.newStyle.aspect.CinemaAspect.sellTicketPointcut() && " +
            "args(movie,..)")
    public Object ticketAround(ProceedingJoinPoint pjp, Movie movie) throws Throwable{
        System.out.println("안녕하세요." + movie.getName() + " (을)를 보시겠습니까?");
        Ticket ticket = (Ticket)pjp.proceed(new Object[]{movie, new Date()});
        System.out.println(ticket.getMovie().getName() + " 를 구매하셨습니다.");
        System.out.println("감사합니다. 다음에 또 오세요.");
        ticket.getMovie().setName("바뀐 영화 이름");
        return ticket;
    }

top

Write a comment.


2. Type of advice

AOP : 2007.01.05 21:19


참조 : Spring Reference 6.1.1 AOP concepts

Before advice : join point 이 전에 실행이 되며 예외를 던지지 않는 이상 join point 이 후에 실행될 작업을 막을 방법이 없습니다.

After returning advice : join point가 정상적으로 완료된 후에 실행이 됩니다. 예외를 던지는 상황은 정상적인 상황에서 제외됩니다.

After throwing advice : 어떤 메소드가 예외를 던지면 실행이 됩니다.

Around advice : 메소드 호출과 같이 join point를 감싸는 Advice. 이 녀석은 advice 중에 가장 능력이 좋다. 메소드 호출 전과 후에 어떤 것을 실행할 수 있다. 또한 join point 이 후에 실행될 작업을 계속 수행할지 말지 정할 수 있다. 수행 하지 않을 때는 자신이 수행할 메소드 대신에 값을 반환하거나 예외를 던질 수 있다.

이 중에서 필요한 기능을 수행할 수 있는 가장 최소화된 능력을 발휘하는 Advice를 사용하는 것을 권장합니다. 예를 들어 어떤 메소드가 값을 반환한 이후 cache를 업데이트 하려고 할 때 Around advice를 사용할 수도 있겠지만 After returning advice를 사용합시다. 이렇게 가장 구체적인 Adivce 타입을 사용하는 것은 잠재적으로 발생할 에러를 방지 할 수 있습니다.

top

TAG advice, AOP

Write a comment.