[내배캠 Spring TIL] Spring AOP
Spring
2024년 9월 10일
Spring AOP에 대해 공부한 내용을 정리해보겠다.
AOP (Aspect-Oriented Programming) #
기능에서 공통적이고 반복적으로 발생하는 부가적인 관심사(관점, Aspect)를 분리하여 모듈화하는 프로그래밍 패러다임이다. 부가적인 관심사의 예를 들면 로깅, 보안 등이 있다.
개념 #
핵심 관심사 #
프로그램의 주요 기능과 관련된 부분으로, 예를 들어 비즈니스 로직이 여기에 해당한다.
횡단 관심사 #
여러 모듈에 걸쳐 나타나는 공통된 기능으로, 예를 들어 로깅, 트랜잭션 관리, 예외 처리 등이 이에 해당한다.
Aspect(관점) #
횡단 관심사를 모듈화한 것. 횡단 관심사를 독립적인 모듈로 관리할 수 있게 도와준다.
Join Point #
Aspect를 적용할 수 있는 지점. Spring AOP에서는 메서드 실행 시점이 Join Point가 된다.
Pointcut #
Aspect가 적용될 구체적인 지점을 지정하는 표현식. 어떤 메서드에, 어느 클래스에 애스펙트를 적용할지 정의한다.
Advice #
Aspect에서 실제로 실행되는 부가 기능 코드. Pointcut에서 지정된 Join Point에 Advice가 실행된다. 종류는 다음과 같다.
- Before: 메서드 실행 전에 실행
- After: 메서드 실행 후에 실행
- After Returning: 메서드가 정상적으로 종료된 후 실행
- After Throwing: 예외가 발생한 후 실행
- Around: 메서드 실행 전후로 실행 (메서드 실행을 제어할 수 있다)
Weaving #
Aspect를 실제로 대상 코드에 적용하는 과정. Spring AOP는 런타임 위빙 방식을 사용하여 프록시 객체를 통해 Aspect를 적용한다.
Spring AOP #
Spring에서는 어노테이션을 사용하여 간단하게 AOP를 구현할 수 있다.
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("메서드 실행 전: " + joinPoint.getSignature().getName());
}
@After("execution(* com.example.service.*.*(..))")
public void logAfter(JoinPoint joinPoint) {
System.out.println("메서드 실행 후: " + joinPoint.getSignature().getName());
}
}
@Aspect
어노테이션을 클래스에 사용하면 해당 클래스는 Aspect가 된다. @Before
, @After
어노테이션을 사용해 Advice를 정의하고, 표현식을 통해 Pointcut을 정의한다.