[Spring] Spring AOP

2024. 10. 16. 23:03·🌱 Spring/Spring Boot

AOP란 무엇인가요? 🤔

AOP(Aspect Oriented Programming)는 관점 지향 프로그래밍을 의미하며, 프로그램을 '핵심 관심사'와 '횡단 관심사'로 나누어 작성하는 방식입니다. 간단히 말해, 핵심적인 비즈니스 로직과 이와 관련된 부가적인 기능(로깅, 트랜잭션 등)을 분리하여 관리하는 것입니다.

관점(Aspect)이란?

프로그램의 기능을 구현할 때 이를 '핵심 기능'과 '부가 기능'으로 나누어 각각을 관점으로 볼 수 있습니다.

  • 핵심 기능: 비즈니스 로직의 핵심을 구현하는 것.
  • 부가 기능: 로깅, 트랜잭션 처리 등 반복적인 기능으로, 여러 비즈니스 로직에 공통적으로 적용되는 기능.

AOP는 부가 기능을 별도의 모듈로 만들어 핵심 기능에 삽입함으로써, 프로그램의 유지보수성과 재사용성을 높여줍니다.

AOP의 주요 용어

용어 설명
Advice (어드바이스) 횡단 관심사를 구현한 코드(메서드)를 의미하며, 주로 로그 출력이나 트랜잭션 제어 등의 기능을 수행합니다.
Aspect (애스펙트) 여러 어드바이스를 모아놓은 클래스입니다.
JoinPoint (조인포인트) 어드바이스가 적용되는 시점을 의미하며, 주로 메서드 실행 전후를 대상으로 합니다.
Pointcut (포인트컷) 어드바이스를 적용할 위치를 정의합니다. 예를 들어, 특정 메서드 이름이 특정 조건을 만족할 때 적용됩니다.
Interceptor (인터셉터) 스프링 프레임워크에서 어드바이스를 타깃에 삽입하는 메커니즘입니다.
Target (타겟) 어드바이스가 적용되는 대상을 의미합니다.

Advice의 종류

스프링 프레임워크에서는 중심적 관심사에 적용하는 어드바이스를 종류별로 나눌 수 있습니다:

  1. Before Advice: 핵심 관심사가 실행되기 이전에 실행되는 어드바이스입니다. @Before
  2. After Returning Advice: 핵심 관심사가 정상적으로 종료된 후에 실행됩니다. @AfterReturning
  3. After Throwing Advice: 예외가 발생한 후에 실행됩니다. @AfterThrowing
  4. After Advice: 정상 종료 여부와 상관없이 실행됩니다. @After
  5. Around Advice: 핵심 관심사 호출 전후로 실행됩니다. @Around

Pointcut 표현식

포인트컷은 어드바이스를 적용할 대상을 조건으로 지정하는 방법으로, 패키지, 클래스, 메서드 등에서 조건을 설정할 수 있습니다. 자주 사용되는 지시자 중 하나인 execution 지시자를 예로 들어보겠습니다:

execution(반환값 패키지.클래스.메서드(인수))

와일드카드를 사용하여 유연하게 적용 범위를 지정할 수 있습니다:

  • *: 임의의 문자열을 나타냅니다. 메서드 인수에서 사용될 경우 하나의 인수를 나타냅니다.
  • ..: 0개 이상의 패키지나 메서드 인수를 의미합니다.
  • +: 클래스명 뒤에 사용되어 해당 클래스와 서브클래스, 구현 클래스 모두를 의미합니다.

Pointcut 예시

  • execution(* com.example.service.DemoService.*(..)): DemoService 클래스의 모든 메서드에 어드바이스 적용
  • execution(* com.example.service.DemoService.select*(..)): select로 시작하는 메서드에 적용
  • execution(String com.example.service.DemoService.*(..)): 반환값이 String인 메서드에 적용
  • execution(* com.example.service..*.*(..)): service 패키지와 하위 패키지의 모든 클래스에 적용

AOP 클래스 작성 방법

어드바이스를 작성하는 클래스는 @Aspect와 @Component 어노테이션을 사용합니다. 클래스 안에 어드바이스 메서드를 작성하고, 메서드 인수로 JoinPoint를 전달합니다.

@Before("execution(* com.example.demo.chapter03.used.*Greet.*(..))")
public void beforeAdvice(JoinPoint joinpoint) {
    System.out.println("====Before Advice====");
    System.out.println(new SimpleDateFormat("yyyy/MM/dd").format(new java.util.Date()));
    System.out.println("메서드: " + joinpoint.getSignature().getName());
}

출력 결과

====Before Advice====
2023/10/30
메서드: greeting
---------------------
좋은 저녁입니다.
---------------------

위 예시는 Greet로 끝나는 클래스의 모든 메서드에 대해 날짜와 메서드 이름을 출력하는 어드바이스를 적용한 결과입니다.

Around Advice 작성 예시

Around Advice는 메서드 호출 전후로 실행되며, ProceedingJoinPoint를 사용해 대상 메서드를 호출할 수 있습니다:

@Around("execution(* com.example.demo.chapter03.used.*Greet.*(..))")
public Object aroundAdvice(ProceedingJoinPoint joinpoint) throws Throwable {
    System.out.println("====Around Advice====");
    System.out.println("▼▼ 처리 전 ▼▼");
    Object result = joinpoint.proceed();
    System.out.println("▲▲ 처리 후 ▲▲");
    return result;
}

출력 결과

====Around Advice====
▼▼ 처리 전 ▼▼
---------------------
좋은 저녁입니다.
---------------------
▲▲ 처리 후 ▲▲

Around Advice는 다른 어드바이스와 달리 실행 시점을 자유롭게 제어할 수 있으며, 반환값이 있을 경우 이를 반환해야 합니다.

'🌱 Spring > Spring Boot' 카테고리의 다른 글

[Spring] Spring Security  (1) 2024.10.16
[Spring] Spring Batch - Batch와 Job, Step  (1) 2024.10.16
[Spring] Spring MVC  (0) 2024.10.16
[Spring] @Annotation  (0) 2024.10.16
[Spring] Spring IoC(Inversion of Control)와 DI(Dependency Injection)  (0) 2024.10.16
'🌱 Spring/Spring Boot' 카테고리의 다른 글
  • [Spring] Spring Batch - Batch와 Job, Step
  • [Spring] Spring MVC
  • [Spring] @Annotation
  • [Spring] Spring IoC(Inversion of Control)와 DI(Dependency Injection)
kkongdo
kkongdo
kkongdo 님의 블로그 입니다.
  • kkongdo
    숲을 바라보며 나무를 심는 아이
    kkongdo
  • 전체
    오늘
    어제
    • 분류 전체보기 (32)
      • 🌏 Web (0)
      • ☕ Java (5)
      • 🌱 Spring (9)
        • Spring Boot (7)
        • Spring Data JPA & QueryDSL (2)
      • 🗂️ Database (5)
      • 💻 CS (12)
        • 운영체제 (4)
        • 네트워크 (5)
        • 자료구조 (3)
      • 🗃️Git (1)
      • 🔍 Algorithm (0)
      • 📡 DevOps (0)
        • Docker (0)
      • 🔭 ETC (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • GitHub
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    @annotation
    springbatch
    OS
    java
    QueryDSL
    SpringMVC
    네트워크기기
    운영체제
    데이터베이스
    JPA
    조인
    DI
    스케줄링
    네트워크
    SpringSecurity
    spring
    db
    자료구조
    복잡도
    CS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
kkongdo
[Spring] Spring AOP
상단으로

티스토리툴바