본문 바로가기

건승하고있어요/Spring framework

[Spring] 스프링2일차 - 어노테이션 기반 AOP 설정

반응형

어노테이션 기반 AOP 사용을 위한 스프링 설정 


1. 스프링 설정 파일에 <aop:aspectj-autoproxy> 엘리먼트 선언


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

<aop:aspectj-autoproxy/>엘리먼트만 선언하면 스프링 컨테이너는 aop 관련 어노테이션들을 인식하고 용도에 맞게 처리해준다.


-AOP관련 어노테이션들은 어드바이스 클래스에 설정

-어드바이스 클래스에 선언된 어노테이션들을 스프링 컨테이너가 설정하게 하기 위해서는 객체가 반드시 생성되어 있어야 함

-따라서 <bean>을 등록하거나 @Service어노테이션을 사용하여 컴포넌트가 검색될 수 있도록 해야함

 Annotation 설정 

@Service

public class Advice{} 

 XML 설정

 <bean id="log" class="com.ciel.animo.Advice"></bean> 


2. 포인트컷 설정


-어노테이션 설정으로 포인트 컷을 선언할 경우 => @Pointcut 사용

-하나의 어드바이스 클래스 안에 여러개의 포인트 컷을  선언할 수 있음 -> 포인트컷을 식별하기 위한 식별자가 필요: 참조메소드 사용

참조메소드

:구현 로직이 없는 메소드 - 어떤 기능 처리를 목적으로 하지 않고 단순히 포인트컷을 식별하는 이름으로만 사용

@Pointcut("execution(* com.ciel.animo.. *impl.*(..)")<--이 경우에만 사용할 메소드

public void allPointcut(){}


@pointcut("executioin(* com.ciel.animo.. *impl.*(..)")

public void getPointcut(){}


3. 어드바이스 설정


-어드바이스 메소드가 언제 동작할지 결정하여 관련된 어노테이션을 메소드 위에 설정하면 됨

-어드바이스의 동작시점은 5가지 제공 

-반드시 어드바이스 메소드가 결합될 포인트컷을 참조해야함 -> 어드바이스 어노테이션 뒤에 괄호를 추가하고 포인트컷 참조 메소드를 지정


@Pointcut("execution(* com.ciel.animo.. *impl.*(..)")

public void allPointcut(){}


@Before("allPointcut()")

public void printLog(){

System.out.println("비즈니스 로직 수행 전 동작");

}

allPointcut() 참조메소드로 지정한 비즈니스 메소드가 호출될 때, 어드바이스 메소드인 printLog()메소드가 before의 시점에서 동작하도록 설정


 @Before 

 비즈니스 메소드 실행 전에 동작 

 @AfterReturning

 비즈니스 메소드가 성공적으로 리턴되면 동작

 @AfterThrowing

 비즈니스 메소드 실행 중 예외가 발생하면 동작

 @After 

 비즈니스 메소드가  실행된 후 무조건 실행 

 @Around 

 호출 자체를 가로채 비즈니스 메소드 실행 전후에 처리할 로직 삽입


4. 애스팩트 설정


-포인트컷과 어드바이스의 결합-> 포트인트컷과 어드바이스를 결합하는 설정이 필요

@Service

@Aspect(pointcut + advice)

public class Advice{

@Pointcut("execution(* com.ciel.animo.. *impl.*(..)") ->포인트컷

public void allPointcut(){}


@Before("allPointcut()") ->어드바이스

public void printLog(){

System.out.println(비즈니스 로직 수행 전 동작");    

}



반응형