본문 바로가기

백엔드 잡학사전

[스프링 입문] 스프링에서의 AOP

AOP란?

Aspect-Oriented Programming은 소프트웨어 개발의 한 패러다임으로, 앱의 공통 관심사(Cross-Cutting Concerns)를 모듈화하는 데에 중점을 둔다.

 

 

AOP의 기본개념?

  • 공통 관심사 Cross-cutting concerns: 앱의 여러 부분에서 공통적으로 필요한 기능을 말함. 예를 들어 로깅, 트랜잭션 관리, 보안, 예외처리 등. 이러한 기능들은 앱의 핵심 비즈니스 로직이 아니지만, 많은 클래스 혹은 메서드에서 필요로하는 기능이다.
  • 관점 Aspect: 공통 관심사를 모듈화한 단위를 aspect라고 함.
  • 그 외에도 위빙, 조인 포인트, 포인트컷, 어드바이스 등의 개념들이 있다.

 

AOP가 필요한 상황?

* 모든 메소드의 호출 시간을 측정하고 싶을 때, 모든 메소드의 앞뒤로 측정 메소드를 붙일 수는 없는 노릇 아닌가?

이때 쓰는 게 AOP다. 

 

예를 들어

이런 상황에서 AOP를 쓰면,

 

 

이런 식의 형태가 가능하다는 것이다.

 

참고로 AOP는 보통 프록시를 사용한다. DI를 해주기 때문에 이게 기술적으로 가능하다는 것을 알 수 있다.

 

 

사용방법

1 가장 상단에 aop 패키지를 만들어서 TimeTraceAop라는 기능을 가진 모듈을 만들어준다.

2 @Aspect 애노테이션 붙여주고, 템플릿에 맞춰 함수를 짜준다. 예를 들어 시간 재는 녀석은 TimcTraceAop.

package hello.hellospring.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class TimeTraceAop {
 @Around("execution(* hello.hellospring..*(..))")
 public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
  long start = System.currentTimeMillis();
  System.out.println("START: " + joinPoint.toString());
  try {
   return joinPoint.proceed();
  } finally {
   long finish = System.currentTimeMillis();
   long timeMs = finish - start;
   System.out.println("END: " + joinPoint.toString()+ " " + timeMs + "ms");
  }
 }
}

 

3 어디에 적용하는지는 @Around를 써서 특정해준다.

4 예시처럼 컴포넌트 스캔을 써도 되지만, 보통 AOP는 꽤나 특이한 녀석이기 때문에 bean에 직접 등록해주면 좋다.

 

 

=> AOP라 하면 뭐라뭐라 말이 많다. 그 중 실무에서 쓰는 건 5%도 안 된다고 저자는 단언한다. 즉 AOP는 고마운 도구 정도로 여기면 될 것 같다.