본문 바로가기

Spring

[Spring Boot] AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)란 무엇인가?

728x90
반응형


Spring Boot에서 AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)는 코드의 중복을 줄이고, 모듈성을 향상시키기 위한 강력한 도구입니다. AOP는 주로 애플리케이션의 로깅, 트랜잭션 관리, 보안, 예외 처리 등 횡단 관심사(Cross-Cutting Concerns)를 처리하는 데 사용됩니다.

AOP의 기본 개념

  1. Aspect(애스펙트): 횡단 관심사를 모듈화한 것입니다. 예를 들어, 로깅이나 트랜잭션 관리 기능이 하나의 Aspect가 될 수 있습니다.
  2. Join Point(조인 포인트): 애플리케이션 실행 중 특정 지점입니다. 메서드 호출이나 예외 처리 등 여러 종류의 Join Point가 있습니다.
  3. Advice(어드바이스): 특정 Join Point에서 실행될 코드를 정의합니다. Advice는 언제 실행되느냐에 따라 여러 종류로 나뉩니다.
    • Before: 메서드 실행 전에 실행됩니다.
    • After: 메서드 실행 후에 실행됩니다.
    • Around: 메서드 실행 전후에 실행됩니다.
    • After Returning: 메서드가 정상적으로 실행된 후에 실행됩니다.
    • After Throwing: 메서드가 예외를 던진 후에 실행됩니다.
  4. Pointcut(포인트컷): 특정 Join Point를 지정하는 표현식입니다. 예를 들어, 특정 패키지나 클래스의 메서드를 타겟으로 설정할 수 있습니다.
  5. Weaving(위빙): Aspect와 실제 코드의 Join Point를 연결하는 과정입니다. 컴파일 타임, 로드 타임, 런타임에 이루어질 수 있습니다.

Spring AOP와 Spring Boot

Spring AOP는 런타임 위빙 방식을 사용하며, 프록시 패턴을 통해 AOP를 구현합니다. Spring Boot에서는 AOP 기능을 쉽게 사용할 수 있도록 설정을 간소화해줍니다.

예제: 로깅 Aspect 만들기

1. 의존성 추가

spring-boot-starter-aop 의존성을 pom.xml에 추가합니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2. 로깅 Aspect 정의

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {

    @Before("execution(* com.example.demo..*(..))")
    public void logBeforeMethod() {
        System.out.println("Method execution started");
    }
}
  • @Aspect: 이 클래스가 Aspect임을 나타냅니다.
  • @Component: Spring의 Bean으로 등록되도록 합니다.
  • @Before("execution(* com.example.demo..*(..))"): Pointcut 표현식으로, com.example.demo 패키지 아래의 모든 메서드 실행 전에 logBeforeMethod 메서드를 실행하도록 합니다.

Pointcut 표현식

  • execution(* com.example.demo..*(..)): com.example.demo 패키지와 그 하위 패키지에 있는 모든 메서드를 타겟으로 합니다.
  • *: 반환 타입을 의미합니다. 여기서는 모든 반환 타입을 의미합니다.
  • ..: 하위 패키지를 의미합니다.
  • *(..): 모든 메서드와 모든 인수를 의미합니다.

Spring Boot 애플리케이션 클래스

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MySpringBootApplication {
    public static void main(String[] args) {
        SpringApplication.run(MySpringBootApplication.class, args);
    }
}

테스트를 위한 샘플 서비스 클래스

import org.springframework.stereotype.Service;

@Service
public class SampleService {

    public void doSomething() {
        System.out.println("Doing something...");
    }
}

실행 및 결과

애플리케이션을 실행하고 SampleService의 doSomething 메서드를 호출하면, AOP의 Before Advice가 먼저 실행되어 "Method execution started" 메시지가 출력된 후 "Doing something..." 메시지가 출력됩니다.

결론

Spring Boot에서 AOP를 사용하면 애플리케이션의 횡단 관심사를 깔끔하게 분리하여 코드의 중복을 줄이고 유지보수를 쉽게 할 수 있습니다. AOP는 강력한 기능이므로, 필요한 곳에 적절히 사용하여 애플리케이션의 품질을 높일 수 있습니다.

728x90
반응형