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
반응형
'⚙️Backend > Spring' 카테고리의 다른 글
[Spring] MVC Project part 1 (0) | 2020.05.30 |
---|---|
[Spring] AOP(Aspect Oriented Programming) part 3 (0) | 2020.05.30 |
[Spring] AOP(Aspect Oriented Programming) part 1 (0) | 2020.05.30 |
[Spring] DI (Dependency Injection) part 6 (0) | 2020.05.30 |
[Spring] DI (Dependency Injection) part 5 (0) | 2020.05.30 |