[Spring] 프록시 패턴 기반 Spring AOP, @Aspect

Song_Song·2021년 9월 6일
0

AOP(Aspect Oriented Programming)

AOP(Aspect Oriented Programming) 는 관점 지향 프로그래밍으로 "기능을 핵심 비즈니스 기능과 공통 기능으로 '구분'하고, 공통 기능을 개발자의 코드 밖에서 필요한 시점에 적용하는 프로그래밍 방법"이다.
기존에 작성한 핵심 비즈니스 로직에는 AOP 때문에 단 한글자도 코드가 변경된 것이 있어서는 안된다. 따라서 비즈니스 로직이 들어있는 클래스에서 공통 기능을 담당하는 로직을 뺄 수 있기 때문에 AOP를 Cross-Cutting 기능이라고도 한다.

스프링의 Proxy 기반 AOP

Spring AOP는 Proxy 패턴을 기반으로 동작한다.
Proxy패턴은 클라이언트가 함수를 호출할 때 해당 함수를 가지고 있는 Proxy Class에서 반환값을 전달해주는 방식이다.
예를 들어, bean에 AOP를 걸면 Spring이 런타임에 해당 bean에 Proxy를 생성해주고 해당 빈을 사용하는 다른 bean에서 Proxy를 주입받아 Proxy 객체로 호출을 요청한다.
즉, AOP가 적용된 Target 메소드를 호출할 때 해당 메소드가 직접 호출되는 것이 아니라 메소드를 감싸고 Advice(AOP에서 실제 실행되는 코드 블럭)이 요청을 받고, 이 Proxy가 Target을 호출하는 방식이다.

예시 코드

AcpectClass.java

@Aspect
@Component
public class AspectClass {
	
	@Before("execution(* com.song.app.controller.*.*(..))") // 포인트컷 : controller 패키지의 모든 메소드 실행 이전
	void beforeTest() {
		System.out.println("===============AOP Test Before=================");
	}
	
	@Around("execution(* com.song.app.controller.*.*(..))") // 포인트컷 : controller 패키지의 모든 메소드 실행 앞뒤로
	public Object aroundTest(ProceedingJoinPoint pjp) throws Throwable{
			
		System.out.println("===============AOP Test Start=================");
		Object result = pjp.proceed();
		System.out.println("===============AOP Test End=================");
		
		System.out.println(result);
		
		return result;	
	}
	
}

@Around 어노테이션이 붙은 메소드는 Object를 반환하고 ProceedingJoinPoint를 매개변수로 받는다. 이는 AOP가 메소드를 가로채서 pjp.proceed(); 에서 실행하도록 하고 반환값으로 Object를 해당 메소드의 결과값으로 반환한다.

com.song.app.controller 컨트롤러에 있는 임의의 메소드를 실행하면 메소드 이전(@Before) 그리고 앞 뒤 (@Around)로 콘솔에 로그를 찍도록 실행해 보았다.
아래 처럼 찍히게 된다.

이론적으로 보면 before 이후에 start가 찍혀야 하는데 아래처럼 찍히는 건 조금 이상하다.

===============AOP Test Start=================
===============AOP Test Before=================
Method excution
===============AOP Test End=================
  • 참고 : AOP 용어, 포인트컷 정리해둔 블로그 참고.
profile
성장을 위한 정리 블로그

0개의 댓글