AOP는 공통적인 관심 사항을 코드에 일괄적으로 적용하여 코드 중복과 의존 관계 복잡성을 해소하는 방식이다. 각 클래스가 공통 기능을 위해 의존하는 대신, AOP에서는 Aspect를 통해 공통 기능을 핵심 로직에 분리된 형태로 적용한다.
이 방식의 장점은, 핵심 로직 코드를 수정하지 않고도 보안, 로깅, 트랜잭션 같은 공통 기능을 여러 클래스에 쉽게 추가할 수 있다는 것이다.
AOP의 구조는 다양한 용어로 구성되며, 이를 통해 공통 기능과 핵심 로직이 연결된다.
Advice
공통 관심 기능이 핵심 로직에 언제 적용될지를 정의한다. 예를 들어, 메소드 호출 전(before
)이나 후(after
)에 로깅 처리를 수행하는 방식이다.
Joinpoint
Advice가 적용 가능한 지점을 뜻한다. 메소드 호출 지점, 예외 발생 지점 등이 포함된다.
Pointcut
Joinpoint의 부분집합으로, 실제로 Advice가 적용되는 지점을 의미한다. 특정 메소드에만 공통 기능을 적용할 때 주로 사용된다.
Weaving
Advice를 핵심 로직 코드에 적용하는 과정이다. AOP 프레임워크에서 주로 자동으로 처리한다.
Aspect
여러 객체에 공통으로 적용할 수 있는 관심 사항을 Aspect라고 한다. 트랜잭션 관리, 보안, 로깅 등이 Aspect의 대표적인 예이다.
아래는 트랜잭션 관리 Aspect를 적용하는 예제이다. 특정 메소드 실행 전후에 트랜잭션 처리를 통해 공통 기능을 적용한다.
@Aspect
@Component
public class TransactionAspect {
@Pointcut("execution(* com.example.service.*.*(..))")
private void transactionMethods() {}
@Before("transactionMethods()")
public void beginTransaction() {
System.out.println("트랜잭션 시작");
}
@After("transactionMethods()")
public void commitTransaction() {
System.out.println("트랜잭션 커밋");
}
}
주요 구성 요소 설명
@Aspect
: 해당 클래스가 Aspect임을 명시@Pointcut
: execution
표현식을 통해 특정 패키지 내 메소드 호출에 대해 트랜잭션을 시작@Before
및 @After
: 트랜잭션 시작과 종료 시점을 지정AOP는 공통 기능을 핵심 로직과 분리하여 코드의 유지보수를 용이하게 한다. 이를 통해 보안, 로깅, 트랜잭션 관리 등의 작업을 코드 중복 없이 여러 클래스에 적용할 수 있어 효율적이다. AOP를 잘 활용하면 애플리케이션의 품질과 안정성이 크게 향상될 수 있다.