목차
1. AOP란?
2. AOP 장점
3. Advice / PointCut / JoinPoint
4. 동작 방식
5. 구현 방식
📌AOP란?
AOP(Aspect Oriented Programming) 란 '관점 지향 프로그래밍'으로서 개발 로직과 비즈니스 로직을 분리하여 관리하는 Spring 개념입니다. 즉, 공통 관심 사항과 핵심 관심 사항(코어 코드)을 분리하여 반복된 작업을 줄이는 Spring 개념입니다.
쉽게 설명하자면, 100개 함수가 처리해야 할 공통 기능 코드(예: 로깅) 들을 분리해 별도 Bean으로 관리하는 컨셉입니다.
📌AOP 장점
1) 높은 재사용성 : 중복된 코드를 최대한 제외하여 기능이 필요할 때만 호출하여 쓰기 때문에 재사용성이 높습니다.
2) 깔끔한 코드 : 공통관심사항을 별도로 분리하여 관리하기 때문에 깔끔합니다.
📌Advice / PointCut / JoinPoint
1) Advice
어드바이스는 아래의 PointCut, JoinPoint를 포함한 독립된 클래스입니다.
동작되는 시점에는 before, after, around, after-returning, after-throwing 의 5개 시점이 있습니다.
포인트 컷을 통해 적용되는 메서드를 지정하면 해당
2) PointCut
포인트컷은 여러개의 JoinPoint를 묶은 집합을 의미하며, JoinPoint가 적용이 되는 대상 메서드를 말합니다 .
[예시] @Pointcut("execution(* org.com.test.*(..))")
3) JoinPoint
조인포인트는 Aspect 가 적용되는 지점 또는 시점을 말합니다. (예 : 메소드 진입 전/후, 예외 후, 결과 후)
인스턴스 생성, 메소드 호출, 예외 발생 등 특정 메서드가 시작되는 시점을 의미합니다.
[기능] before, after , around, afterReturning, afterThrowing
[예시] joinPoint.proceed();
📌동작 방식
Spring AOP는 기존 클래스 변경을 하지 않고 원하는 메소드/기능을 실행시키기 때문에 프록시 패턴을 활용하여 동작합니다.
예를 들어 실제 컨트롤러가 아닌 프록시 컨트롤러는 실제 컨트롤러를 흉내내는 가짜 컨트롤러로서, 실제 컨트롤러인 것처럼 연기하며 메서드를 실행시키고 동작합니다.
📌구현 방식
먼저 pom.xml 에 AspectJ 라이브러리가 의존 설정이 되어있는지 확인하여 추가합니다.
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.6</version>
</dependency>
⚡ 어노테이션을 활용한 적용
AOP 클래스 상단에 @Aspect , @Component 어노테이션을 선언합니다.
Spring이 자동으로 AOP 컴포넌트로 인식하여 아래 클래스를 실행하게 됩니다.
@Around : 해당 타겟 수행 전/후 를 감싸 어드바이스 내용이 주입되고 실행됩니다. ( "execution(* org.com.test.*(..))" )
joinPoint.proceed() : 전체 메소드(AOP 적용된) 를 실행하고 리턴 데이터를 받는 메서드
@Component
@Aspect
public class LogTraceAop {
@Around("execution(* org.com.test.*(..))")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable
{
try{
//code
return joinPoint.proceed();
}
catch{
//code
}
finally{
//code
}
}
}
'BE > Spring' 카테고리의 다른 글
[MyBatis] MyBatis 정의 및 주요 메서드 (0) | 2021.02.18 |
---|---|
[Spring] @Autowired 와 DI 개념 정리 (0) | 2021.02.08 |
[Spring][JAVA] Spring 개념 정리 (AOP,POJO,JDBC 등) (0) | 2020.11.04 |
[Spring] 네이버 API 데이터 연동 방법 (1) | 2020.11.01 |
[Spring][jsoup] 웹 크롤링으로 특정 사이트 데이터 추출 (0) | 2020.08.18 |