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를 지원함으로써 메서드 호출 전과 후에 자동으로 동작하는 코드를 삽입할 수 있습니다. 구체적인 개념과 내용들은 아래 강좌에서 확인할 수 있습니다.
'SW > Java' 카테고리의 다른 글
Java : Spring :AspectJ 어노테이션 : 개념, 사용, 방법, 예제, 구현 (0) | 2020.06.14 |
---|---|
Java : Spring : Execution 명시자 : 종류,개념, 사용 방법, 예제, 구현 (0) | 2020.06.13 |
Java : Spring : 자동 주입 : 예제, 구현 (0) | 2020.06.11 |
Java : Spring : bean 컬렉션 주입 : 개념, 예제, 구현 (0) | 2020.06.10 |
Java : Spring : Bean : Setter 메서드를 통한 의존성 주입 : 예제, 구현 (0) | 2020.04.29 |