스프링 프레임워크에서 AOP(Aspect-Oriented Programming)은 중복되는 코드를 제거하고 코드의 재사용성과 유지보수성을 향상시키는 데에 사용됩니다. AOP는 핵심 비즈니스 로직과 관련 없는 부가적인 기능(로깅, 트랜잭션 처리 등)을 분리하여 적용할 수 있습니다.
AOP는 관점 지향 프로그래밍을 의미합니다. 프로그램을 구성하는 주요 모듈과 주요 모듈에 영향을 미치는 부가적인 모듈(관심사)을 분리하여 개발하는 방법론입니다. 주요 모듈에 영향을 미치는 부가적인 모듈을 'Aspect(관점)'이라고 합니다.
Aspect(관점): 부가적인 모듈을 나타내는 단위입니다. 보통 Advice와 Pointcut을 함께 갖습니다.
Advice(조언): 부가 기능을 정의한 메서드입니다. Advice는 Joint Point에 삽입되어 실행됩니다.
Pointcut(결합점): Advice를 적용할 대상을 지정하는 표현식입니다.
Join Point(조인 포인트): Advice가 적용될 수 있는 지점을 나타냅니다. 예를 들어 메서드 호출이나 객체 생성 등이 조인 포인트가 될 수 있습니다.
Weaving(엮기): Advice를 지정된 지점에 삽입하여 프로그램을 완성하는 과정을 의미합니다.
아래의 예시에서는 메서드 실행 전후에 로깅 기능을 추가하는 AOP를 구현해 보겠습니다.
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
String methodName = joinPoint.getSignature().getName();
System.out.println("Before method: " + methodName);
}
@After("execution(* com.example.service.*.*(..))")
public void logAfter(JoinPoint joinPoint) {
String methodName = joinPoint.getSignature().getName();
System.out.println("After method: " + methodName);
}
}
위 예시에서 @Aspect 어노테이션은 해당 클래스가 Aspect임을 나타내고, @Before, @After 어노테이션은 Advice를 정의합니다. execution( com.example.service..*(..))는 Pointcut을 정의하여 com.example.service 패키지의 모든 메서드를 대상으로 합니다.
모듈성 강화: 부가 기능을 모듈화하여 중복을 제거하고 유지보수성을 향상시킵니다.
관심사의 분리: 핵심 비즈니스 로직과 부가 기능을 분리하여 코드를 더 깔끔하게 유지할 수 있습니다.
재사용성 향상: 부가 기능을 모듈화하여 필요한 곳에서 쉽게 재사용할 수 있습니다.
스프링 AOP는 관점 지향 프로그래밍을 통해 코드의 재사용성과 유지보수성을 향상시키는 도구입니다. 이를 통해 코드의 중복을 제거하고 부가 기능을 쉽게 추가할 수 있습니다.