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 라이브러리 설치
2. Aspect Weaver 라이브러리 설치
3. 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;
}
}
'WEB > spring' 카테고리의 다른 글
[Spring] @Transactional (0) | 2022.06.22 |
---|---|
[Spring] Controller, Service, DAO, DTO (0) | 2022.06.21 |
[Spring] DI, 어노테이션 정리 (0) | 2022.06.16 |
[Spring] validate - 데이터 유효성 검증 (0) | 2022.05.26 |
[Spring] @Annotation 어노테이션 정리 (0) | 2022.05.25 |
댓글