티스토리 뷰

앞서 AOP를 Spring 에서는 두 가지 방법으로 구현할 수 있다고 언급했다. 

첫번째는 직전 포스팅까지 실습한 xml 설정 파일을 사용하는 방법이고, 두번째는 어노테이션을 이용하여 구현하는 것이다. 

이번 포스팅은 두번째 방법인 어노테이션을 이용하여 AOP를 구현하는 예제를 알아보려고 한다.


우선 비즈니스 로직(핵심 관심)과 횡단 관심은 이전 포스팅과 동일한 예제로 진행하기 때문에 자세한 설명은 생략한다.

 

1. 어노테이션 사용을 위한 스프링 설정

 

우선 constructor-scan 방식과 유사하게 AOP를 사용하기 위해 xml 설정 파일 내부에 <aop:aspectj-autoproxy> 엘리먼트를 선언해야한다.

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

 

2. 어드바이스 클래스(횡단 관심)에 어노테이션 선언

 

횡단 관심으로 사용할 클래스 위에 @Service 어노테이션을 사용하여 컴포넌트가 검색될 수 있도록 한다.

 

◎Before.java

package com.choonham.biz.board.common;

import org.springframework.stereotype.Service;

@Service
public class BeforeLog {

	public void printLog() {
		System.out.println("[Advice] I'm Before!");
	}
	public BeforeLog() {
		// TODO Auto-generated constructor stub
	}

}

 

3. 포인트컷 설정

 

비즈니스 로직을 필터링하기 위한 포인트컷을 설정하기 위해 @Service로 선언해놓은 어드바이스 클래스 내부 로직에 

@Pointcut("execution( )")을 선언한다. 이때, 경로 지정은 이전 xml 방식과 동일하다.

 

◎Before.java

package com.choonham.biz.board.common;

import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Service;

@Service
public class BeforeLog {
	
	@Pointcut("execution(* com.choonham.biz.board..*UserServiceImpl.*(..))")
	public void allPointcut() {}
    
        public void printLog() {
          System.out.println("[Advice] I'm Before!");
        }
	public BeforeLog() {
		// TODO Auto-generated constructor stub
	}

}

 

위와 같이 선언하게 되면, 이후 포인트컷을 참조할 때, @Pointcut이 붙은 참조 메서드의 이름을 이용하여 특정 포인트컷을 검색한다.

 

4. 어드바이스 설정

 

어드바이스 클래스에는 횡단 관심에 해당하는 어드바이스 메서드가 구현되어 있다. 이 어드바이스 메서드가 언제 동작할지 결정하여 관련된 어노테이션을 메서드 위에 설정하면 된다. 어드바이스의 동작 시점은 이전 xml 방식과 동일하다. 

 

◎Before.java

package com.choonham.biz.board.common;

import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Service;

@Service
public class BeforeLog {
	
	@Pointcut("execution(* com.choonham.biz.board..*UserServiceImpl.*(..))")
	public void allPointcut() {}
	
	@Before("allPointcut()")
	public void printLog() {
		System.out.println("[Advice] I'm Before!");
	}
	
	public BeforeLog() {
		// TODO Auto-generated constructor stub
	}

}

 

5. aspect 설정

 

AOP에서 가장 중요한 설정이며, 앞서 설정한 포인트컷과 어드바이스의 결합이므로 반드시 설정해줘야 한다. 

@Aspect를 이용하여 설정한다.

package com.choonham.biz.board.common;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Service;

@Service
@Aspect
public class BeforeLog {
	
	@Pointcut("execution(* com.choonham.biz.board..*UserServiceImpl.*(..))")
	public void allPointcut() {}
	
	@Before("allPointcut()")
	public void printLog() {
		System.out.println("[Advice] I'm Before!");
	}
	
	public BeforeLog() {
		// TODO Auto-generated constructor stub
	}

}

 

 

'[JAVA] > Spring' 카테고리의 다른 글

[Spring] Spring MVC 1: Model2 구조 직접 구현  (0) 2021.06.22
[Spring] 트랜젝션 처리  (0) 2021.06.21
[Spring] AOP: JoinPoint  (0) 2021.06.18
[Spring] AOP: advice 동작 시점  (0) 2021.06.18
[Spring] AOP 용어 정리  (0) 2021.06.17
Comments