개념
public void 구매내역조회() {
로그인확인()
구매내역 출력 로직()
}
public void 구매하기() {
로그인확인()
구매하는 로직()
}

이런 반복적인 기능을 횡단 관심사(Cross-Cutting Concern)라고 부릅니다. 횡단 관심사들은 특정 클래스나 메서드에 국한되지 않고, 시스템 전반에 걸쳐서 자주 나타나기 때문에 코드가 중복되고, 유지보수가 어려워질 수 있습니다.
예를 들어, 모든 메서드에서 로깅을 해야 한다면, 각 메서드마다 로깅 코드를 넣어야 하는데, 이렇게 되면 코드가 지저분해지고 변경 사항이 있을 때 일일이 수정해야 하는 문제가 생깁니다.
정의
개념
Advice :
Join Point :
Pointcut :
Aspect :
Target
Weaving
AOP 프록시
JDK 동적 프록시와 CGLIB 프록시가 있고, CGLIB 프록시가 기본값
스프링에서는 Advice에 관련된 5가지 애노테이션을 제공하고, 포인트컷에 지정된 대상 메서드에서 Advice가 실행되는 시점을 정할 수 있음
@Aspect
public class LoggingAspect {
// 1. 포인트컷 정의: 서비스 패키지 내 모든 메서드
@Pointcut("execution(* com.example.service.*.*(..))")
public void serviceMethods() {}
// 2. 어드바이스 정의: 조인포인트에 적용될 로직
@Before("serviceMethods()")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Before method: " + joinPoint.getSignature().getName());
}
@After("serviceMethods()")
public void logAfter(JoinPoint joinPoint) {
System.out.println("After method: " + joinPoint.getSignature().getName());
}
}
코드 실행 예시:
placeOrder() 메서드가 호출되면, 이 메서드는 "execution(* com.example.service.*.*(..))" 조건을 만족하므로 조인포인트가 됩니다.placeOrder() 메서드가 실행되기 전에 logBefore 어드바이스가, 실행된 후에 logAfter 어드바이스가 적용됩니다.public class OrderService {
public void placeOrder() {
System.out.println("Placing order");
}
}
Before method: placeOrder
Placing order
After method: placeOrder
AOP는 프록시 패턴을 이용해 동작합니다. 프록시 패턴에서는 프록시 객체가 타겟 객체를 감싸고, 클라이언트가 프록시를 통해 타겟 객체에 접근하게 됩니다.
예를 들어, 클라이언트가 메서드를 호출하면 프록시 객체가 이 호출을 가로챕니다. 그런 다음, 프록시 객체는 미리 정의된 어드바이스(예: 로깅 기능)를 실행하고, 그 후에 타겟 객체의 실제 메서드를 호출하게 됩니다.
이런 방식으로, 우리는 비즈니스 로직을 수정하지 않고도 추가 기능을 쉽게 삽입할 수 있게 됩니다.
public interface Service {
void performAction();
}
public class RealService implements Service {
@Override
public void performAction() {
System.out.println("Performing action in RealService");
}
}
public class ServiceProxy implements Service {
private RealService realService;
public ServiceProxy(RealService realService) {
this.realService = realService;
}
@Override
public void performAction() {
System.out.println("Logging before action");
realService.performAction(); // 실제 객체의 메서드를 호출
System.out.println("Logging after action");
}
}
모듈화 : 횡단 관심사를 모듈화하여 코드 중복을 줄입니다.
유지보수성 : 비즈니스 로직과 부가 기능이 분리되어 유지보수가 쉽습니다.
관심사 분리 : 코드가 더 깔끔해지고 가독성이 좋아집니다.
AOP는 비즈니스 로직과 부가 기능을 분리하여 애플리케이션의 유지보수성과 확장성을 크게 향상시키는 중요한 기법임을 강조하고 싶습니다.
AOP를 통해 우리는 코드 중복을 줄이고, 공통된 기능을 효율적으로 관리함으로써 더 나은 소프트웨어를 개발할 수 있습니다.
@Aspect는 어떻게 동작하나요?