본문 바로가기
⚙️Backend/Spring

[Spring] AOP(Aspect Oriented Programming) part 2

by Bㅐ추 2020. 5. 30.
728x90
반응형

2020/05/30 - [🌎Web Application/Spring] - [Spring] AOP(Aspect Oriented Programming) part 1

1. XML로 AOP설정 방법

pom.xml 파일에 의존설정

		<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
		<dependency>
		    <groupId>org.aspectj</groupId>
		    <artifactId>aspectjweaver</artifactId>
		    <version>1.9.5</version>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
		<dependency>
		    <groupId>org.aspectj</groupId>
		    <artifactId>aspectjrt</artifactId>
		    <version>1.9.5</version>
		</dependency>

 

공통기능의 클래스 제작(Advice 역할)

public class MyAspect{
	// JoinPoint : 어드바이스가 적용될 수 있는 위치
	// => Advice(타켓(핵심기능을 담고있는 모듈)에 제공할 부가기능을 담고있는 모듈)를 적용해야 되는 부분
	// (ex : 필드, 메소드 / 스프링에서는 메소드만 해당) 

	
	/*
	 * JoinPoint 메서드
		 getArgs() 
		 메서드 아규먼트를 반환한다.
		 
		 getThis()  
		 프록시 객체를 반환한다.
		
		 getTarget() 
		 대상 객체를 반환한다.
		
		 getSignature()
		 어드바이즈 또는 메서드의 설명(description)을 반환한다.
		
		 toString() 
		 어드바이즈 되는 메서드의 설명을 출력한다.
	 * */
	public void before(JoinPoint join) {
		System.out.println("Proxy Object : "+join.getThis().getClass());
		System.out.println("jointPoint method"+join.getSignature().toShortString());
		//공통기능(Advice)이 적용되는 메소드가 어떤 메소드 인지.
		System.out.println("jointPoint class : "+join.getTarget().getClass());
		// 공통기능(Advice)이 적용되는 메소드가 어떤 클래스 인지
		System.out.println("강아지가 짖습니다.");
	}
	
	public void after(JoinPoint join) {
		System.out.println("jointPoint method"+join.getSignature().toShortString());
		System.out.println("jointPoint class : "+join.getTarget().getClass());
		System.out.println("강아지가 짖지 않습니다.");
	}

}

XML 설정

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">

   <!-- 'proxy를 자동으로 생성하고 관리하겠다' 라는 의미 -->
   <aop:aspectj-autoproxy/>
   <bean id="myAspect" class="com.test00.MyAspect"></bean>
   
   <!-- CC -->
   <bean id="myDog" class="com.test00.Dog"></bean>
   
   
   <!-- AOP 설정 -->
   <aop:config>   
      <aop:aspect ref="myAspect">
         <!-- 'myAspect'라는 bean에는 'before'라는 메소드와 'after'라는 메소드가 있다.
            'before'는 pointcut에 설정된 메소드가 실행되기전에 실행되게끔 해준다.
            'after'는 pointcut에 설정된 메소드가 실행된 후에 실행되게끔 해준다. -->    
         <!-- pointcut: 어드바이스를 적용할 타겟의 메서드를 선별하는 정규표현식이다. -->
         <aop:before method="before" pointcut="execution( public * *( .. ) )"/>
         <!-- 핵심기능에 public * *(..) 이 실행되기 전!! -->
         
         <aop:after method="after" pointcut="execution( public * *( .. ) )"/>
     	 <!-- execution( public * *( .. ) ) → 접근 지정자는 public, 리턴 타입과 클래스명은 아무거나 올 수 있고, 매개변수 또한 개수제한이 없다. -->
      </aop:aspect>
   </aop:config>

</beans>

결과

jointPoint methodDog.bark()
jointPoint class : class com.test00.Dog
강아지가 짖습니다.
멍멍!
jointPoint methodDog.bark()
jointPoint class : class com.test00.Dog
강아지가 짖지 않습니다.

실제 Dog에는 공통기능을 추가하지 않고, 핵심 기능만 작성한 뒤, xml파일로 어떤 공통기능을 어떤 범위에서 사용할 건 지만 설정을 해줬다. => 코드간결 및 유지보수 쉬움.

 

Advice를 정의하는 태그<aop:>

<aop:before>: pointcut에 설정된 메소드 실행 전에 적용되는 어드바이스를 정의한다.

<aop:after-returning>: pointcut에 설정된 메소드가 정상적으로 실행 된 후에 적용되는 어드바이스를 정의한다.

<aop:after-throwing> : pointcut에 설정된 메소드가 예외를 발생시킬 때 적용되는 어드바이스를 정의한다.

<aop:after>: pointcut에 설정된 메소드가 정상적으로 실행되는지 또는 예외를 발생시키는지 여부에 상관없이 어드바이스를 정의한다.

<aop:around>: pointcut에 설정된 메소드 호출 이전, 이후, 예외발생 등 모든 시점에 적용 가능한 어드바이스를 정의한다.

 

728x90
반응형