SW/Java

Java : Spring : AOP 기본 개념, 용어, 구현, 예제

얇은생각 2020. 6. 12. 07:30
반응형

Java : Spring : AOP 기본 개념, 용어, 구현, 예제

AOP

Aspect Oriented Prograaming은 관정 지향 프로그래밍이라 합니다. 하나의 프로그램을 관점이라는 논리적인 단위로 분리하여 관리하는 개념입니다. 로깅, 감시, 선언적 트랜잭션, 보안, 캐싱 등 다양한 곳에서 사용되고 있습니다.

메소드 호출을 관심사로 설정하여 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

 

 

Spring AOP 구현

- XML을 이용한 구현 방법이 있습니다.
- @AspectJ 어노테이션을 이용한 구현 방법이 있습니다.

 

 

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>kr.co.softcampus</groupId>
	<artifactId>AOPXML</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<!-- xml에서 사용할 속성들 -->
	<properties>
		<!-- 자바 버전 -->
		<java-version>1.8</java-version>
		<!-- 스프링 버전 -->
		<org.springframework-version>5.1.9.RELEASE</org.springframework-version>
		<!--<org.springframework-version>4.3.25.RELEASE</org.springframework-version> -->
		<org.slf4j-version>1.7.26</org.slf4j-version>
		<ch.qos.logback-version>1.2.3</ch.qos.logback-version>
		<javax.annotation-version>1.3.2</javax.annotation-version>
		<org.aspectj-version>1.9.4</org.aspectj-version>
	</properties>

	<!-- 프로젝트에서 사용할 라이브러리 정보 -->
	<dependencies>
		<!-- spring context -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<!-- slf4j -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${org.slf4j-version}</version>
		</dependency>
		<!-- logback -->
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>${ch.qos.logback-version}</version>
			<exclusions>
				<exclusion>
					<groupId>org.slf4j</groupId>
					<artifactId>slf4j-api</artifactId>
				</exclusion>
			</exclusions>
			<scope>runtime</scope>
		</dependency>
		<!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api -->
		<dependency>
			<groupId>javax.annotation</groupId>
			<artifactId>javax.annotation-api</artifactId>
			<version>${javax.annotation-version}</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>


	</dependencies>
</project>

 

beans.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: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">
	                    
	<bean id='xml1' class='kr.co.softcampus.beans.TestBean'/>  
	
	<bean id='advisor1' class='kr.co.softcampus.advisor.AdvisorClass'/>
	
	<aop:config>
		<aop:aspect ref='advisor1'>
			<aop:pointcut id="point1" expression="execution(* method1())"/>
			
			<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="afterReturningMethod" pointcut-ref="point1"/>
			<aop:after-throwing method="afterThrowingMethod" pointcut-ref="point1" throwing="e1"/>
		</aop:aspect>
	</aop:config>      
</beans>

 

TestBean.java

package kr.co.softcampus.beans;

public class TestBean {
	
	public int method1() {
		System.out.println("method1 호출");
		
		//int a1 = 10 / 0;
		
		return 100;
	}
}

 

 

AdvisorClass.java

package kr.co.softcampus.advisor;

import org.aspectj.lang.ProceedingJoinPoint;

public class AdvisorClass {
	
	public void beforeMethod() {
		System.out.println("beforeMethod 호출");
	}
	
	public void afterMethod() {
		System.out.println("afterMethod 호출");
	}
	
	public Object aroundMethod(ProceedingJoinPoint pjp) throws Throwable{
		System.out.println("aroundMethod 호출1");
		
		// 원래의 메서드를 호출한다.
		Object obj = pjp.proceed();
		
		System.out.println("aroundMethod 호출 2");
		
		return obj;
	}
	
	public void afterReturningMethod() {
		System.out.println("afterReturningMethod 호출");
	}
	
	public void afterThrowingMethod(Throwable e1) {
		System.out.println("afterThrowingMethod 호출");
		System.out.println(e1);
	}

}

 

정리

이번 시간에는 AOP를 XML로 구현하는 예제에 대한 실습을 진행하였습니다. 해당 실습을 진행하면서, AOP의 동작방식과 사용 방법에 대해 이해 할 수 있었습니다. Spring은 AOP를 지원함으로써 메서드 호출 전과 후에 자동으로 동작하는 코드를 삽입할 수 있습니다. 구체적인 개념과 내용들은 아래 강좌에서 확인할 수 있습니다.

https://www.udemy.com/course/sooftcampus-sfb/

 

초보 Spring Framework 개발자를 위한 실습을 통한 입문 과정 윤재성

Spring Framework 입문을 위한 주제별 실습 및 상세 설명( beginner step1)

www.udemy.com

반응형