개발이론/Spring

AOP - Advice, Target, Pointcut

TedDev 2024. 11. 18. 17:56
728x90

AOP(Aspect-Oriented Programming)란 무엇인가?

  • AOP는 소프트웨어 개발에서 핵심 비즈니스 로직과는 별개로 반복적으로 사용되는 부가기능(공통 관심사)을 분리하여 코드의 중복을 제거하고 유지보수성을 향상시키기 위한 프로그래밍 패러다임이다.
  • AOP의 대표적인 부가기능
    • 로깅 (Logging)
    • 성능 측정 (Performance Monitoring)
    • 트랜잭션 관리 (Transaction Management)
    • 인증 및 권한 관리 (Authentication & Authorization)

 

AOP가 필요한 이유

  • 예를 들어, 시간 측정 기능이 필요하다고 가정한다면
    • 기존 방식에서는 각 컨트롤러 메서드마다 시간을 측정하는 코드를 추가해야 함
    • 결과적으로 코드 중복, 가독성 저하, 핵심 비즈니스 로직과 부가기능 혼합 문제가 발생
  • AOP를 활용하면 이러한 부가기능을 분리하여 관리하고 필요한 곳에서만 적용할 수 있음

 

728x90

AOP의 핵심 개념

  1. Advice (언제 실행할 것인지)
    • 부가기능(Aspect)의 실행 시점을 정의.
    • 5가지 종류
      • Before Advice : 메서드 실행 전에 동작
      • After Returning Advice : 메서드가 정상적으로 실행된 후 동작
      • After Throwing Advice : 메서드 실행 중 예외가 발생했을 때 동작
      • After Advice : 메서드가 정상적으로 실행되거나 예외가 발생한 후 동작
      • Around Advice : 메서드 실행 전후를 모두 제어하며 가장 유연하게 사용됨
  2. Join Point (어디에서 실행할 것인지)
    • Advice를 적용할 수 있는 모든 시점을 의미
    • 일반적으로 메서드 호출, 객체 생성, 필드 접근 등이 가능
    • 스프링 AOP에서는 프록시 기반으로 동작하므로 메서드 호출 시점만을 Join Point로 지원
  3. Pointcut (특정 조건에서 실행할 것인지)
    • Join Point 중에서 Advice를 실제로 적용할 조건을 정의
    • 예를 들어
      • 특정 패키지의 모든 메서드에 적용
      • 특정 이름 패턴의 메서드에만 적용
  4. Target (어디에 적용할 것인지)
    • Advice가 적용되는 실제 객체

 

 

AOP 적용 과정

  1. 기존 문제
    • 컨트롤러 메서드에 직접 부가기능(예: 시간 측정 코드)을 추가하면 코드 중복 발생
    • 비즈니스 로직과 부가기능이 섞여서 코드가 지저분해지고 유지보수가 어려움
  2. AOP 적용 후
    • 부가기능(Aspect)을 독립적으로 정의하고 필요한 곳에만 적용(Pointcut 설정)
    • 핵심 비즈니스 로직과 부가기능이 분리되어 코드의 가독성과 유지보수성이 향상

 

AOP의 활용 사례

  • 트랜잭션 관리 : 데이터베이스 작업에서 일관성을 유지하기 위해 트랜잭션을 관리
  • 로깅 및 모니터링 : 메서드 호출 시간, 입력/출력 값 기록
  • 보안 : 인증 및 권한 확인 로직 적용
  • 캐싱 : 반복적으로 호출되는 메서드의 결과를 캐싱하여 성능 최적화

 

스프링 AOP의 특징

  • 프록시 기반 AOP
    • 스프링 AOP는 런타임 시 프록시 객체를 생성하여 부가기능을 적용
    • Join Point는 메서드 호출로 제한
  • 선언적 방식
    • XML 또는 어노테이션(@Aspect)으로 간단히 설정 가능

 

결론

AOP는 핵심 로직과 부가기능을 명확히 분리하여 코드의 품질을 높이고 유지보수를 용이하게 한다. 스프링 AOP를 활용하면 다양한 부가기능을 간단히 설정하고 관리할 수 있어 효율적이며 특히 트랜잭션 처리나 로깅과 같은 반복적인 작업에서 큰 이점을 제공한다.

반응형

'개발이론 > Spring' 카테고리의 다른 글

Spring Cloud Gateway  (0) 2024.11.26
분산 락(Distributed Lock)  (0) 2024.11.21
Spring Cloud Config  (1) 2024.11.12
서블릿과 스프링의 개요 및 관계  (1) 2024.11.05
Spring Boot와 AWS를 이용한 이미지 업로드 및 최적화  (0) 2024.11.04