[JAVA] Spring AOP(관점 지향 프로그래밍) 기초 완전 정복

Spring AOP는 개발하면서 흔히 중복되는 부가적인 로직(로깅, 트랜잭션 처리, 보안 등)을 핵심 비즈니스 로직과 분리해 깔끔하게 관리할 수 있게 해주는 강력한 기능입니다. 

 

 

AOP란 무엇인가?

AOP는 Aspect Oriented Programming의 약자로, "횡단 관심사(Cross-Cutting Concern)"를 모듈화하는 프로그래밍 패러다임입니다.

  • 핵심 로직과는 별개로 애플리케이션 전반에 걸쳐 반복되는 기능(예: 로깅, 보안, 트랜잭션)
  • 이런 로직을 공통 모듈로 분리해 코드의 재사용성유지보수성을 높임

기존 방식으로는 매 서비스 클래스마다 로그를 찍는 코드가 중복됐겠지만, AOP를 활용하면 하나의 Aspect 클래스에서 처리 가능합니다.

 

AOP의 핵심 개념

  • Aspect: 공통 기능을 모듈화한 클래스
  • Join Point: Aspect가 적용될 수 있는 지점 (메서드 실행 등)
  • Advice: Join Point에 실행될 실제 로직 (@Before, @After 등)
  • Pointcut: Advice를 적용할 Join Point를 필터링
  • Weaving: 실제 객체에 Aspect를 적용하는 과정 (Spring은 런타임 Weaving)

 

Spring AOP 적용 예제

실제로 로깅 기능을 AOP로 구현하는 예제를 보겠습니다.

1. 의존성 추가 (Gradle)

implementation 'org.springframework.boot:spring-boot-starter-aop'

2. 로깅 Aspect 클래스 작성

@Aspect
@Component
public class LoggingAspect {

    @Pointcut("execution(* com.example.service..*(..))")
    public void allServiceMethods() {}

    @Before("allServiceMethods()")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("[Before] " + joinPoint.getSignature().toShortString());
    }

    @AfterReturning(pointcut = "allServiceMethods()", returning = "result")
    public void logAfter(JoinPoint joinPoint, Object result) {
        System.out.println("[After] " + joinPoint.getSignature().toShortString() + " => " + result);
    }
}

3.서비스 클래스 예시

@Service
public class UserService {
    public String getUser(String id) {
        return "User:" + id;
    }
}

위처럼 AOP를 적용하면, UserService의 모든 메서드 실행 전후에 로그가 자동으로 찍힙니다.

 

 

AOP 적용 시 주의할 점

  • AOP는 기본적으로 프록시 기반이므로, public 메서드에만 적용됩니다.
  • 내부 메서드 호출(self-invocation)에는 AOP가 적용되지 않습니다.
  • Pointcut 표현식을 명확히 작성하지 않으면, 원치 않는 곳에 Advice가 적용될 수 있습니다.

 

실무에서의 AOP 활용 사례

  • API 요청 로그 수집: 모든 Controller에 대한 진입 로그 출력
  • 트랜잭션 감지: 서비스 로직 전후로 DB 상태 확인
  • 보안 체크: 특정 어노테이션 기반으로 권한 검사
  • 성능 측정: 메서드 실행 시간 측정

 

 


 

 

Spring AOP는 우리가 흔히 놓치기 쉬운 ‘중복’과 ‘부수 로직’을 깔끔히 정리해줍니다. 코드의 핵심 로직에만 집중할 수 있도록 도와주는 도구죠. 단순히 기능으로서가 아니라, 아키텍처 설계의 중요한 한 축으로 자리 잡은 기술입니다.