Back to til
Aug 26, 2025
4 min read

[TIL] 2025-08-26 | AOP 개념과 Spring AOP

1. 오늘 학습한 내용

1.1. Aspect Oriented Programming with Spring

  • Aspect-oriented Programming complements Object-oriented Programming by providing another waty of thinking about program structure.
    • OOP 모듈의 핵심 단위: Class
    • AOP 모듈의 핵심 단위: Aspect (관점, 관심, 어쩌면 기능)→ Cross-Cuting Concerns (횡단 관심사)
  • 선택적으로 사용가능하지만 Spring의 핵심 구성요소이며, 2가지 방식으로 제공함
    1. 일반 클래스 (schema-based approach)
    2. Annotation이 추가된 일반 클래스 (@AspectJ annotation style)
  • Spring에서 AOP를 사용하는 예시
    • 선언적 트랜잭션 관리 (Declarative Transaction Management): @Transactional
    • 사용자 정의 관점 구현 (Custom Aspects): 개발자가 원하는 부분을 Aspect로 직접 구현할 수 있음

1.2. AOP Concepts

Spring에서만 사용되는 용어가 아니며, 다소 직관적이지 않아 어렵게 느껴질 수 있음

  • Aspect
    • 여러 클래스에 걸쳐 있는 관심사의 모듈화된 단위라고 할 수 있음
    • 개발자가 커스텀한 Aspect인 경우 횡단 관심사에 공통으로 적용하고자 하는 기능
  • Join point
    • 프로그램 실행 중 메서드 실행이나 필드 값 변경, 예외처리와 같이 Advice를 적용할 수 있는 지점
    • Spring AOP에서는 메서드 실행을 나타냄 → 프록시를 이용하여 AOP를 구현하기 때문
  • Advice
    • 특정 Join point에서 Aspect가 수행하는 작업으로 언제 적용할지를 정의하고 있음
      • Before advice: 대상 객체의 메서드 실행 전 실행
      • After returning advice: 대상 객체의 메서드가 Exception 없이 정상적으로 종료된 이후에 실행
      • After throwing advice: 대상 객체의 메서드가 Exception을 던저 종료되는 경우에 실행
      • After (finally) advcie: Exception 발생 여부와 관련 없이 대상 객체의 메서드 실행 후 실행 (try-catch-finally의 finally 블록과 유사)
      • Around advice: 대상 객체의 메서드 실행 전, 후, 또는 Exception 발생 등 다양한 시점에 실행 가능 → 주로 많이 사용 됨
    • 필요한 동작을 구현할 수 있는 가장 약한 어드바이스 유형을 사용하는 것이 좋음
      • 가장 구체적인 어드바이스 유형을 사용하면 오류 발생 가능성이 적고 프로그래밍 모델이 더 단순해짐
      • For example, you do not need to invoke the proceed() method on the JoinPoint used for around advice, and, hence, you cannot fail to invoke it.
  • Pointcut
    • Join point의 부분 집합으로, 실제로 Advice가 적용되는 Join point를 말함
    • 기본적으로 AspectJ의 문법을 이용하여 정의
    • 핵심: The concept of join points as matched by pointcut expressions is central to AOP, and Spring uses the AspectJ pointcut expression language by default.
  • Introduction
    • 타입을 대신하여 추가 메서드나 필드를 선언하는 것
    • Spring AOP를 이용하면 모든 Advised Object 에 새로운 인터페이스와 구현체를 도입할 수 있음
    • inter-type declaration 이라고도 함
  • Advised Object (Target object)
    • 하나 이상의 Aspect에 의해 adviced 되는 객체, 즉 관심사가 적용된 객체를 말함
    • Spring AOP는 런타임 프록시를 사용하여 구현되므로 항상 프록시된 객체임
  • AOP proxy
    • AOP 프레임워크가 AOP의 기능을 구현하기 위해 생성하는 객체
    • Spring AOP에서는 JDK 동적 프록시 혹은 CGLIB 프록시 2가지 유형임
  • Weaving
    • Aspect를 이용하여 실제 Advised 객체로 만드는 과정 자체를 일컫음
    • Spring AOP는 기본적으로 런타임에 수행됨

1.3. Spring AOP Capabilities and Goals

  • 순수 Java로 구현되어 있음
    • 서블릿 컨테이너나 애플리케이션 서버에서 사용하기에 적합
  • Spring AOP는 메서드 호출만 지원하므로, Field interception이나 메서드 외의 다른 Join Point를 추가하려면 AspectJ 같은 AOP 전용 도구 사용 필요
  • 즉, Spring AOP는 흔히 발생하는 문제 해결에 도움을 주며 부족한 경우에는 AspectJ 사용을 권함. 경쟁이 아니라 상호 보완하면서 사용자에게는 선택권을 제공

2. 더 알아볼 내용 / 다음에 할 내용

  • AOP 프록시

3. 참고