본문 바로가기

BE/Spring

[Spring] AOP 개념 및 구현

목차
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 
        } 
    } 
}