본문 바로가기
WEB/spring

[Spring] AOP 개념 및 라이브러리 설치

by baam 2022. 6. 17.

AOP(Aspect Oriented Programming)

관점 지향 프로그래밍, 부가기능(advice)을 동적으로 추가해주는 기술이다.

메서드의 시작 또는 끝에 자동으로 코드(advice)를 추가한다.

Advice의 설정은 XML과 어노테이션, 두 가지 방법으로 가능하다.

  • target : advice가 추가될 객체
  • advice : target에 동적으로 추가될 부가 기능 코드
  • join point : advice가 추가(join)될 대상(메서드)
  • pointcut : join point들을 정의한 패턴
  • proxy : target에 advice가 동적으로 추가되어 생성된 객체
  • weaving : target에 advice를 추가해서 proxy를 생성하는 것

 


String AOP를 사용하기 위해서는 라이브러리 설치가 필요하다.

https://mvnrepository.com로 가서, 아래 라이브러리를 pom.xml에 추가한다.

 

1.AspectJ Runtime 라이브러리 설치

AspectJ Runtime 라이브러리 추가

 

2. Aspect Weaver 라이브러리 설치

AspectJ Weaver 라이브러리 추가

 

3. Spring AOP 라이브러리 설치

Spring AOP 라이브러리 추가

[pom.xml]

<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

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

<!-- AspectJ -->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>${org.aspectj-version}</version>
</dependency>

 

 

Adivce의 종류

  • @Around : 메서드의 시작과 끝 부분에 추가되는 부가 기능
  • @Before : 메서드의 시작 부분에 추가되는 부가 기능
  • @After : 메서드의 끝 부분에 추가되는 부가 기능
  • @AfterReturning : 예외가 발생하지 않았을 때, 실행되는 부가 기능
  • @AfterThrowing : 예외가 발생했을 때, 실행되는 부가 기능

 

Pointcut Expression

advice가 추가될 메서드를 지정하기 위한 패턴이다.

execution(접근제어자(생략 가능) 반환 타입 패키지명.클래스명.메서드명(매개변수 목록))

 

AOP 설정

라이브러리를 모두 추가했다면, AOP를 사용하기 위해서는 root-context.xml에 context:component-scan과 aop를 추가한다.

<beans xmlns:mvc="http://www.springframework.org/schema/mvc"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xmlns="http://www.springframework.org/schema/beans"
	   xmlns:context="http://www.springframework.org/schema/context"
	   xmlns:aop="http://www.springframework.org/schema/aop"
	   xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
	
	<!-- Root Context: defines shared resources visible to all other web components -->

	<aop:aspectj-autoproxy/>
	<context:component-scan base-package="com.dev.ch3" />
</beans>
@Component  //Advice도 Bean으로 등록이 되어야한다.
@Aspect
public class LoggingAdvice {
    @Around("execution(* com.dev.ch3.aop.MyMath.*(..))*") //pointcut - 부가기능이 적용될 메서드의 패턴
    public Object methodCallLog(ProceedingJoinPoint pjp) throws Throwable{
        long start = System.currentTimeMillis();
        System.out.println("<<[start] " + pjp.getSignature().getName()+ Arrays.toString(pjp.getArgs()));
        
        Object result = pjp.proceed();

        System.out.println("result = " + result);
        System.out.println("[end]>> "+ (System.currentTimeMillis() - start)+ "ms");
        return result;
    }
}

댓글