본문 바로가기

멋쟁이사자처럼_부트캠프/Spring

Spring AOP 개념 심화

AOP (Aspect-Oriented Programming, 관점 지향 프로그래밍)

AOP비즈니스 로직과 공통 관심사(횡단 관심사, Cross-Cutting Concerns)를 분리하여 코드를 효율적으로 관리할 수 있도록 해주는 프로그래밍 패러다임입니다.

 

AOP의 주요 개념

  1. 횡단 관심사 (Cross-Cutting Concerns)
    • 애플리케이션 전반에 걸쳐 반복적으로 사용되는 공통 기능.
    • 예: 로깅, 보안, 트랜잭션 관리, 예외 처리.
  2. 비즈니스 로직과의 분리
    • AOP를 사용하면 로직 코드에 공통 기능을 직접 작성하지 않고, 분리된 모듈(Aspect)로 관리 가능.
    • 이는 유지보수성과 코드의 가독성을 향상시킵니다.

출처: https://velog.io/@geesuee/Spring-AOPAspect-Oriented-Programming%EC%99%80-%ED%94%84%EB%A1%9D%EC%8B%9C

 

AOP가 필요한 이유 (왜 쓰는가?)

  • 코드 중복 제거
    반복적으로 작성되는 로직(예: 로그 출력)을 별도의 모듈로 분리.
  • 유지보수성 향상
    비즈니스 로직에 공통 기능 코드가 섞이지 않아 수정이 용이.
  • 애플리케이션의 모듈화 강화
    주요 기능(로깅, 보안 등)을 독립적인 단위로 관리.

 

실습 코드에서는 Gradle 빌드 스크립트(build.gradle)에서 사용하는 의존성 선언을 다음과같이 추가해주었다.

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

spring-boot-starter-aop는 Spring Boot에서 제공하는 "Starter" 의존성 중 하나입니다. Starter 의존성은 특정 기능을 사용하기 위해 필요한 여러 의존성들을 묶어서 제공함으로써, 개발자가 필요한 의존성을 일일이 추가해야 하는 번거로움을 줄여줍니다. spring-boot-starter-aop는 다음과 같은 기능과 관련된 라이브러리들을 포함하고 있습니다.

 

이 의존성을 추가하는 것 외에도, Spring Boot 애플리케이션에서 AOP를 사용하기 위해서는 @EnableAspectJAutoProxy 어노테이션을 설정 클래스에 추가해야 합니다. 이 어노테이션은 Spring에게 AOP 프록시를 생성하도록 지시합니다. 예를 들어 다음과 같습니다.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@SpringBootApplication
@EnableAspectJAutoProxy // AOP 활성화
public class AopexamApplication {

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

이 두 가지 (의존성 추가 및 @EnableAspectJAutoProxy 어노테이션 추가)를 모두 완료해야 Spring Boot에서 AOP를 정상적으로 사용할 수 있습니다.

 

GPT에서 추천해준 깃연습코드

https://github.com/NomadHuns/aop-practice

 

GitHub - NomadHuns/aop-practice

Contribute to NomadHuns/aop-practice development by creating an account on GitHub.

github.com

 

 

나머지는 팀원분이 잘 정리 하셔서 태그.

https://code-with-fish.tistory.com/22#%F0%9F%92%AC%20AOP(Aspect%20oriented%20Programming%2C%20%EA%B4%80%EC%A0%90%EC%A7%80%ED%96%A5%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D)-1

 

250121 TIL | AOP

💬 AOP(Aspect oriented Programming, 관점지향 프로그래밍) 프로그램에서 핵심 로직과 부수 로직(DB 연결, 로깅, 파일 입출력 등)을 분리해 모듈화하는 방식그림 1을 통해 설명하자면, 각각의 클래스에서

code-with-fish.tistory.com

 

AOP의 주요 구성 요소

  1. Aspect
    • 공통 관심사를 캡슐화한 모듈.
    • 예: 로깅, 트랜잭션 처리.
  2. Advice
    • Aspect의 실제 동작 코드. 특정 시점(Join Point)에서 실행.
    • 종류:
      • Before: 메서드 실행 전에 실행.
      • After: 메서드 실행 후에 실행.
      • Around: 메서드 실행 전후에 모두 실행.
      • AfterReturning: 메서드가 정상적으로 실행된 후 실행.
      • AfterThrowing: 메서드 실행 중 예외가 발생하면 실행.
  3. Join Point
    • Advice가 실행될 수 있는 특정 실행 지점.
    • 예: 메서드 호출, 필드 접근.
  4. Pointcut
    • Advice가 적용될 Join Point를 결정하는 표현식.
  5. Weaving
    • Aspect를 실제 코드에 적용하는 과정.
    • 스프링에서는 런타임 시 Weaving을 지원.

 

AOP 적용 예시 (스프링)

@Aspect
@Component
public class LoggingAspect {

    // Pointcut 정의: com.example.service 패키지의 모든 메서드
    @Pointcut("execution(* com.example.service..*(..))")
    public void allServiceMethods() {}

    // Before Advice
    @Before("allServiceMethods()")
    public void logBeforeMethod(JoinPoint joinPoint) {
        System.out.println("Method Start: " + joinPoint.getSignature());
    }

    // After Advice
    @After("allServiceMethods()")
    public void logAfterMethod(JoinPoint joinPoint) {
        System.out.println("Method End: " + joinPoint.getSignature());
    }
}

 

결과:

  • com.example.service 패키지의 모든 메서드 호출 전에 "Method Start" 로그 출력.
  • 메서드 호출 후 "Method End" 로그 출력.

 

AOP의 장점

  1. 코드 중복 제거: 로깅, 트랜잭션 처리 등 공통 로직을 분리하여 중복 제거.
  2. 유지보수 용이: 공통 관심사만 수정하면 전체 애플리케이션에 반영 가능.
  3. 가독성 향상: 비즈니스 로직과 공통 로직이 분리되므로 가독성이 좋아짐.

 

비유를 통한 이해

  • AOP는 프로그램 전체에서 반복적으로 필요한 일을 "하인"처럼 처리하는 방식입니다.
  • 집안일(로깅, 트랜잭션 관리)은 하인(AOP)가 하고, 주인은 비즈니스 로직만 신경 쓰면 되는 구조입니다.

스프링 AOP를 활용하면 애플리케이션의 로깅, 트랜잭션 처리, 보안 등을 효율적으로 관리할 수 있습니다.