AOP (Aspect-Oriented Programming)
AOP (Aspect-Oriented Programming, 관점 지향 프로그래밍)은 애플리케이션의 핵심 비즈니스 로직과는 별개로, 부가적인 관심사(공통 기능, Cross-Cutting Concerns)를 분리하여 모듈화하는 프로그래밍 기법입니다. 이를 통해 코드를 간결하고 유지보수 가능하게 만듭니다.
AOP의 주요 개념
1. 핵심 비즈니스 로직 (Core Concerns):
- 애플리케이션의 주된 기능으로, 주요 비즈니스 로직을 담당합니다.
- 예: 주문 생성, 결제 처리 등.
2. 횡단 관심사 (Cross-Cutting Concerns):
- 여러 모듈이나 계층에 공통으로 적용되는 기능입니다.
- 예: 로깅, 보안, 트랜잭션 관리, 성능 모니터링 등.
AOP를 사용하는 이유
- 코드 중복 제거:
- 로깅, 예외 처리, 트랜잭션 관리 등 반복적인 코드를 분리하여 모듈화합니다.
- 결합도 감소:
- 핵심 로직과 부가적인 관심사를 분리함으로써, 코드 간의 결합도를 낮춥니다.
- 유지보수성 향상:
- 횡단 관심사를 별도의 모듈로 관리하기 때문에 수정이 용이합니다.
- 가독성 향상:
- 핵심 로직에서 부가적인 코드를 제거하므로 코드의 가독성이 높아집니다.
Spring에서의 AOP
Spring은 AOP를 지원하여 횡단 관심사를 핵심 비즈니스 로직과 분리합니다. Spring AOP는 프록시 기반으로 동작하며, 주로 다음과 같은 기능에 사용됩니다:
- 로깅
- 성능 모니터링
- 트랜잭션 관리
- 보안 처리
AOP의 주요 구성 요소
1. Aspect:
- 횡단 관심사를 모듈화한 단위입니다.
2. Advice:
- Aspect가 적용되는 시점에 실행되는 동작(로직)입니다.
- Advice는 특정 시점에 실행되는 코드를 정의합니다.
- Before: 메서드 실행 전에 실행.
- After: 메서드 실행 후에 실행.
- After Returning: 메서드가 정상적으로 반환된 후 실행.
- After Throwing: 메서드 실행 중 예외가 발생한 후 실행.
- Around: 메서드 실행 전후 또는 실행을 대체.
3. Join Point:
- Advice가 적용될 수 있는 지점입니다.
- ex) 메서드 호출, 필드 접근 등.
4. Pointcut:
- Advice가 적용될 실제 Join Point를 정의하는 표현식입니다.
- ex) 특정 패키지나 클래스의 메서드에만 적용.
5. Target:
- Aspect가 적용되는 객체(비즈니스 로직을 포함한 객체).
6. Weaving:
- Aspect와 Target 객체를 결합하여 Advice가 실행되도록 설정하는 과정.
- 컴파일 타임, 로드 타임, 런타임 중 하나에서 이루어질 수 있습니다.
Spring AOP 구현 방식
어노테이션 기반 설정: Aspect 정의:
1
2
3
4
5
6
7
8
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Before method: " + joinPoint.getSignature().getName());
}
}
Pointcut 표현식:
execution(* com.example..*(..))
: 특정 패키지의 모든 메서드.within(com.example.service.*)
: 특정 클래스나 패키지 내의 메서드.
Java Config 기반 설정:
1
2
3
4
5
6
7
8
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
@Bean
public LoggingAspect loggingAspect() {
return new LoggingAspect();
}
}
AOP 적용 시나리오
- 로깅:
- 메서드 호출 전후로 로그를 기록합니다.
- 트랜잭션 관리:
- 메서드 실행 중 트랜잭션을 시작하고, 종료합니다.
- 보안:
- 사용자의 권한을 검증합니다.
- 캐싱:
- 메서드 실행 결과를 캐싱하여 성능을 최적화합니다.
Spring AOP의 한계
- 프록시 기반 제약:
- Spring AOP는 기본적으로 프록시 객체를 사용하므로, Spring Bean에만 적용할 수 있습니다.
- 클래스 내부의 메서드 호출은 AOP가 적용되지 않을 수 있습니다.
- AspectJ와의 차이:
- AspectJ는 컴파일 타임에 AOP를 적용하며 더 강력한 기능을 제공합니다.
- Spring AOP는 런타임에 동작하여 일부 제한이 있습니다.
Spring AOP와 AspectJ 비교
| 특징 | Spring AOP | AspectJ | |——-|————|—————–| | 적용 시점 | 런타임 | 컴파일 타임 또는 로드 타임 | | 구현 방식 | 프록시 기반 | 바이트코드 조작 | | 성능 | 상대적으로 느림 | 빠름 | | 복잡도 | 간단 | 복잡 |
Spring AOP는 핵심 로직과 횡단 관심사를 분리하여 애플리케이션 개발의 효율성을 높이고, 코드의 가독성과 유지보수성을 개선하는 강력한 도구입니다.
https://docs.spring.io/spring-framework/reference/core/aop.html
This post is licensed under CC BY 4.0 by the author.