AOP는 프로그래밍 패러다임 중 하나로, 소프트웨어의 모듈성을 높이는 것을 목표로 한다. AOP는 각 기능을 분리하여 모듈로 만들어 관리하는 방법을 제공한다. 이를 통해 코드의 중복을 줄이고, 유지 보수를 용이하게 한다.
AOP의 기본 개념은 관심사의 분리(Separation of Concerns, SoC)이다. 일반적으로 비즈니스 로직을 처리하는 핵심 관심사와, 로깅, 보안, 트랜잭션 등의 공통 관심사가 섞여 있는데, 이를 분리하여 각각의 관심사를 독립적으로 개발하고 유지 보수하는 것을 목표로 한다.
AOP에서는 핵심 관심사를 '비즈니스 로직'이라고 부르고, 공통 관심사를 '크로스 커팅 컨서드(Cross Cutting Concern)'라고 부른다. 크로스 커팅 컨서드는 여러 클래스나 메소드에 걸쳐 공통으로 사용되는 기능을 의미한다.
AOP는 이 크로스 커팅 컨서드를 분리하여 'Aspect'라는 모듈로 만든다. 이 'Aspect'는 공통 기능을 정의하고, 'Pointcut'을 통해 어디에 적용할지를 결정한다. 그리고 'Advice'라는 코드 조각을 통해 실제로 어떤 동작을 할지를 정의한다.
예를 들어, 로깅은 여러 클래스와 메소드에서 공통으로 사용되는 기능이다. 이를 Aspect로 분리하면, 각 메소드에서 로그를 직접 처리하는 코드를 작성할 필요 없이, 로깅 Aspect가 알아서 로그를 처리해준다. 이는 코드의 중복을 줄이고, 모듈 간의 결합도를 낮추는 효과를 가져다준다. 이는 코드의 가독성과 유지 보수성을 향상시키며, 개발자가 비즈니스 로직에 더욱 집중할 수 있도록 돕는다.
Java에서는 Spring Framework에서 AOP를 지원하며, @Aspect, @Pointcut, @Before, @After 등의 어노테이션을 사용하여 Aspect를 정의하고 적용할 수 있다. 이를 통해 비즈니스 로직과 공통 관심사를 분리하고, 코드의 중복을 줄일 수 있다.
예제 코드는 다음과 같다.
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class LoggingAspect {
@Pointcut("execution(* com.example.myapp.*.*(..))")
public void myAppMethods() {}; // Pointcut 정의
@Before("myAppMethods()") // Advice 정의
public void beforeAdvice() {
System.out.println("Method is being called.");
}
}
이 코드는 'com.example.myapp' 패키지의 모든 메소드가 실행될 때마다 "Method is being called."라는 메시지를 로그로 출력하는 Aspect를 정의한 것이다. 이런 식으로 Aspect를 사용하면, 로그 출력, 보안 체크, 트랜잭션 관리 등의 공통 관심사를 한 곳에서 관리할 수 있다.
좋은 글 감사합니다.