Spring - AOP

2020. 8. 29. 22:06Java/Spring

반응형

AOP

 

- Aspect Oriented Programming : 관점 지향 프로그래밍

- 하나의 프로그램을 관점(혹은 관심사)라는 논리적인 단위로 분리하여 관리하는 개념

- 로깅, 감사, 선언적 트랜젝션, 보안, 캐싱 등 다양한 곳에서 사용되고 있다.

- 메서드 호출을 관심사로 설정하여 AOP에 관한 실습을 진행한다.

- 관심사를 통해 Spring Framework가 어떤 메서드가 호출되는지 관심있게 지켜보다가 특정 메서드가 호출되면 자동으로 메서드 전과 후에 다른 메서드가 호출 될 수 있도록 한다.

 


Spring AOP 용어

 

- Joint Point : 모듈이 삽입되어 동작하게 되는 특정 위치(메서드 호출 등)

- Point Cut : 다양한 Joint Point 중에 어떤 것을 사용할지 선택

- Advice : Joint Point에 삽입되어 동작할 수 있는 코드

- Weaving : Advice를 핵심 로직 코드에 적용하는 것

- Aspect : Point Cut + Advice


Spring AOP Advice 종류

 

- before : 메서드 호출 전에 동작하는 Advice

- after-returning : 예외 없이 호출된 메서드의 동작이 완료되면 동작하는 Advice

- after-throwing : 호출된 메서드 동작 중 예외가 발생했을 때 동작하는 Advice

- after : 예외 발생 여부에 관계없이 호출된 메서드의 동작이 완료되면 동작하는 Advice

- around : 메서드 호출 전과 후에 동작하는 Advice


XML을 통한 AOP 구현

 

1. Maven Repository  => AspectJ Weaver 

https://mvnrepository.com/artifact/org.aspectj/aspectjweaver/1.9.6

 

Maven Repository: org.aspectj » aspectjweaver » 1.9.6

The AspectJ weaver introduces advices to java classes org.aspectj aspectjweaver 1.9.6 // https://mvnrepository.com/artifact/org.aspectj/aspectjweaver compile group: 'org.aspectj', name: 'aspectjweaver', version: '1.9.6' // https://mvnrepository.com/artifac

mvnrepository.com

Maven 복사, pom.xml에 추가한다.

 

2. beans.xml 세팅

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	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/context
						http://www.springframework.org/schema/context/spring-context.xsd
						http://www.springframework.org/schema/aop
						http://www.springframework.org/schema/aop/spring-aop.xsd">

beans 태그에 aop 속성들을 추가해준다.

 

3. AOP 사용하기

 

1) TestBean, AdvisorClass 객체를 만들고 beans.xml에서 빈 객체로 만든다.

<bean id="xml1" class="cookingcoding.beans.TestBean" />
	
<bean id="advisor1" class="cookingcoding.advisor.AdvisorClass"/>

<aop:config>
	<aop:aspect ref="advisor1">
		<aop:pointcut expression="execution(* method1())" id="point1"/>
		<aop:before method="beforeMethod" pointcut-ref="point1"/>
		<aop:after method="afterMethod"   pointcut-ref="point1"/>
		<aop:around method="aroundMethod" pointcut-ref="point1"/>
		<aop:after-returning method="afterReturning" pointcut-ref="point1"/>
		<aop:after-throwing method="afterthrow" pointcut-ref="point1" throwing="el"/>
	</aop:aspect>
</aop:config>

2) AOP를 사용하기 위해 <aop:config> 태그를 선언하고, 태그 내부에 AOP 기능늘 구현한다.

 

3) <aop:aspect> 를 통해서 aop를 사용할 객체를 가르킨다.

 

4) <aop:pointcut expression="execution(* method1())" id="point1"/> 

    method1()을 관심메서드로 지정한다.  해당 메서드가 호출이 되면 다른 기능들이 실행된다.

 

5) <aop:before method="beforeMethod" pointcut-ref="point1"/>
     method1() 메서드가 호출되면 해당 메서드 실행 전 point1 빈 객체의 beforeMethod를 실행한다.

 

   <aop:after method="afterMethod"   pointcut-ref="point1"/>

    method1() 메서드가 호출되면 해당 메서드 실행 후 point1 빈 객체의 afterMethod를 실행한다.

public class AdvisorClass {

	public void beforeMethod() {
		System.out.println("beforeMethod");
	}
	
	public void afterMethod() {
		System.out.println("afterMethod");
	}
}

 

 

6) <aop:after-returning method="afterReturning" pointcut-ref="point1"/>

    method1() 메서드의 전, 후의 동작을 afterReturning메서드로지정해준다.

public Object aroundMethod(ProceedingJoinPoint pjp)throws Throwable {
	System.out.println("around before");
	Object a = pjp.proceed();//원래의 메서드를 호출
	System.out.println("around after");
	return a;
}

    ProceedingJoinPoint를 통해서 원래의 메서드를 받아오고, proceed()로 원래 메소드(method1())를 호출한다.

    이때, 반환값을 받아서 반환도 가능하다.

 

7) <aop:after-returning method="afterReturning" pointcut-ref="point1"/>

   메서드 실행이 잘 완료되면 afterReturning 메서드를 실행한다.

  <aop:after-throwing method="afterthrow" pointcut-ref="point1" throwing="el"/>

  메서드 실행에 오류가 있으면 afterthrow 메서드를 실행한다. afterthrow는 (Throwable el)를매개변수로 받으므로 throwing으로 값을 넘겨줘야한다.

 

public void afterReturning() {
	System.out.println("afterReturning");
}
public void afterthrow(Throwable el) {
	System.out.println("afterthrow");
	System.out.println(el);
}

 

반응형

'Java > Spring' 카테고리의 다른 글

Spring - @AspectJ  (0) 2020.08.31
Spring - execution 사용법  (0) 2020.08.30
Spring - Component 자동주입  (0) 2020.08.27
Spring- Component Bean 기본 설정  (0) 2020.08.27
Spring - Component  (0) 2020.08.26