본문 바로가기
Spring

[Spring] 스프링에 AspectJ AOP 설정 및 사용하는 방법

by 서피 2021. 5. 17.

sertvlet-context.xml 에 아래 코드 3줄을 추가한다.

aspectj는 프록시를 이용해서 동작하기 때문에 마지막 줄로 프록시를 추가하는 것.

...
xmlns:aop="http://www.springframework.org/schema/aop"
...
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
...
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
...

 


 

root-context.xml의 beans 태그에 아래 코드 2줄을 추가한다.

...
xmlns:aop="http://www.springframework.org/schema/aop"
...
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
...

 

 


 

AOP를 이용해 로그를 기록할 클래스를 만든다. LogAdvice.java

package com.kdh.spring.common;

public class LogAdvice {
	
	public void printLog() {
		System.out.println("[공통로그 - LogAdvice] 비즈니스 로직 수행 전 동작");
	}
}


 

root-context.xml의 beans태그 내부에 bean태그를 추가한다.

3번 줄: log라는 이름으로 com.kdh.spring.common.LogAdvice 클래스를 이용한다는 의미이다.

6번 줄: com.kdh.spring 패키지 아래 자바파일들 중 클래스명이 Impl로 끝나는 파일의 모든 메소드에 대해 적용한다는 의미이다. ~~Impl 클래스의 어떤 메소드든 불려질 때 이것이 실행된다.

11번째 줄 : 6번째 줄에서 지정한 파일의 메소드가 실행되기 전(aop:before)에 printLog라는 메소드를 실행한다는 의미이다.

 

1 <!-- AOP xml방식 -->
2 <!-- 사용할 클래스 설정 -->
3 <bean id="log" class="com.kdh.spring.common.LogAdvice"></bean>
4 <aop:config>
5 	<!-- impl로 끝나는 모든 클래스에 대해 포인트컷을 설정한다. -->
6 	<aop:pointcut expression="execution(* com.kdh.spring..*Impl.*(..))" id="allPointCut"/>
7 	
8 	<!-- ref의 log라는 값은 bean의 id와 일치 -->
9 	<aop:aspect ref="log">
10 		<!-- LogAdvice클래스의 메소드명인 printLog -->
11 		<aop:before method="printLog" pointcut-ref="allPointCut"/>
12 	</aop:aspect>
13 </aop:config>

 

pointcut 표현식 정리 (execution은 생략하였다)
1. * com.kdh.member.model.service.*.*(..) 
 -> service패키지에 있는 모든 클래스 및 모든 메소드 ( 매개변수는 0개 이상)
2. * com.kdh.member.model.service..*.*(..)
 -> service패키지 및 하위 패키지에 있는 모든 클래스 및 모든 메소드 (매개변수는 0개 이상)
3. * com.kdh.member.model.service..*.*()
 -> service패키지 및 하위 패키지에 있는 모든 클래스 및 모든 메소드 (매개변수 없는 것)
4. * com.kdh.member.model.service..*.*(*)
 -> service패키지 및 하위 패키지에 있는 모든 클래스 및 모든 메소드 (매개변수 1개)
5. * com.kdh.member.model.service..*.*(Integer,..)
 -> service패키지 및 하위 패키지에 있는 모든 클래스 및 모든 메소드
 ( 매개변수가 1개 이상이고, 첫번째 파라미터는 정수 )
6. int com.kdh.member.service..*.*(Integer,..)
 -> 리턴타입이 int이고 service패키지 및 하위 패키지에 있는 모든 클래스 및 모든 메소드
 ( 매개변수가 1개 이상이고, 첫번째 파라미터는 정수)
7. int com.kdh.member.service..*Impl.*(..)
 -> 리턴타입이 int이고 service패키지 및 하위 패키지에 있는 Impl로 끝나는 클래스의 모든 메소드
  (매개변수는 0개 이상)

 


pom.xml에 아래와 같이 aspectj 디펜던시를 추가한다.

이후 프로젝트 폴더를 우클릭하여 maven - Update project를 실행한다.

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

 


서버를 실행시켜 com.kdh.spring 패키지 내부의 ~~Impl.java 클래스에서 메소드를 실행해본다.

LogAdvice.java에 있던 printLog()메소드가 실행됨을 확인.


 

LogAdvice.java 클래스에 메소드 printLogging 추가.

이 메소드는 로직 수행 후 실행시킬 것.

public void printLogging() {
	System.out.println("[공통로그 - LogAdvice] 비즈니스 로직 수행 후 동작");
}

 

 


root-context.xml 파일에 aop:after 태그를 추가.

method 속성값으로는 앞서 만든 printLogging을 입력해준다.

 

 


새롭게 추가한 "비즈니스 로직 수행 후 동작" 이 함께 출력되고 있다.

 


 

앞서 해본 Bean 설정을 아래와 같이 어노테이션으로 대체할 수 있다.

댓글