AOP의 계념 및 사용법

2024. 6. 18. 20:23Java/Spring

AOP 관점 지향 프로그래밍(Aspect Oriented Programming)란?

  • 스프링 프레임워크의 핵심 기능 중 하나로, 애플리케이션의 핵심 비즈니스 로직과 공통적인 부가 기능을 분리하여 모듈화할 수 있게 합니다. 이를 통해 코드의 재사용성을 높이고, 비즈니스 로직을 더 간결하고 유지보수하기 쉽게 만듭니다.
  • 스프링 AOP는 애플리케이션의 공통 관심사를 모듈화하는 강력한 도구로, 올바르게 사용하면 코드의 가독성과 유지보수성을 크게 향상시킬 수 있습니다.

AOP 의 적용 전 후

AOP 적용 전

AOP 적용 후

  • Spring이 프록시(가짜 혹은 대리) 객체를 중간에 삽입해줍니다.
  • DispatcherServlet 과 ProductController 입장에서는 변화가 전혀 없습니다.
    • 호출되는 함수의 input, output 이 완전 동일합니다.
    • "joinPoint.proceed()" 에 의해서 원래 호출하려고 했던 함수, 인수(argument) 가 전달됩니다.
    • → createProduct(requestDto);

AOP 의 구현 및 적용 하기

AOP 의존성 삽입

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

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
</dependency>

 

AOP 사용 예시

package com.sparta.newsfeed.aop;


import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import java.util.Arrays;
import java.util.Objects;

@Slf4j
@Aspect
@Component
@RequiredArgsConstructor
public class ControllerAOP {

    @Pointcut("execution(* com.sparta.newsfeed.controller..*(..))")
    public void Controller() {
    }

    @Before("Controller()")
    public void logBeforeMethodExecution(JoinPoint joinPoint) {
        HttpServletRequest request = ((ServletRequestAttributes)
                        Objects.requireNonNull(RequestContextHolder.getRequestAttributes()))
                        .getRequest();
        String requestUrl = request.getRequestURL().toString();
        String requestUri = request.getRequestURI();
        String methodMapping = request.getMethod();

        log.info("" +
                 "\n 요청 URL: " + requestUrl +
                 "\n 요청 URI: " + requestUri +
                 "\n 요청 메서드: " + methodMapping
        );
    }

}

 

AOP 기본 개념

 

  • Aspect(에스펙트):
    • 공통적인 부가 기능(예: 로깅, 트랜잭션 관리)을 모듈화한 것입니다. 애스펙트는 하나 이상의 어드바이스와 포인트컷으로 구성됩니다.
  • Advice(어드바이스):
    • 실제 부가 기능이 구현된 코드입니다. 어드바이스는 특정 시점에 실행되며, 실행 시점에 따라 여러 유형이 있습니다:
      • @Before: 메서드 실행 전에 실행.
      • @After: 메서드 실행 후에 실행.
      • @After Returning: 메서드가 정상적으로 반환된 후에 실행.
      • @After Throwing: 메서드에서 예외가 발생한 후에 실행.
      • @Around: 메서드 실행 전후 또는 실행을 완전히 제어할 수 있습니다.
  • Pointcut(포인트컷):
    • 어드바이스가 적용될 지점을 정의합니다. 메서드 이름, 매개변수, 어노테이션 등을 기준으로 설정할 수 있습니다.
  • Join Point(조인 포인트):
    • 어드바이스가 적용될 수 있는 애플리케이션의 실행 지점입니다. 예를 들어, 메서드 호출, 객체 생성, 예외 발생 등이 있습니다.
  • Weaving(위빙):
    • 애스펙트를 대상 객체에 적용하는 과정입니다. 위빙은 컴파일 타임, 로드 타임, 런타임에 이루어질 수 있습니다. 스프링 AOP는 주로 런타임 위빙을 사용합니다.
  • Logging(로깅):
    • 서드의 호출과 반환 값을 로깅하는 작업은 많은 애플리케이션에서 중요합니다. AOP를 사용하면 모든 메서드 호출에 대한 로그를 중앙에서 관리할 수 있습니다.
  • Transaction(트랜잭션 관리):
    • 데이터베이스 트랜잭션을 관리할 때 AOP를 사용하여 트랜잭션의 시작과 종료, 롤백 등을 처리할 수 있습니다. 이를 통해 코드 중복을 줄이고 트랜잭션 코드를 분리하여 관리할 수 있습니다.
  • Security(보안):
    • 인증과 권한 부여와 같은 보안 관련 작업은 애플리케이션의 여러 부분에서 발생할 수 있습니다. AOP를 이용하여 이러한 보안 작업을 모듈화하고 중앙에서 관리할 수 있습니다.
  • Caching(캐싱):
    • 메서드 결과를 캐시하여 성능을 향상시키는 작업도 AOP를 통해 처리할 수 있습니다. 특정 메서드의 결과를 캐시하고 캐시 유효성을 관리하는 코드를 분리할 수 있습니다.
  • Exception Handling (예외 처리):
    • 예외 처리 로직도 AOP로 처리할 수 있습니다. 예를 들어 특정 예외가 발생하면 특정 로그를 남기거나, 예외를 특정한 방식으로 처리하는 등의 작업을 AOP로 모듈화할 수 있습니다.
  • Performance Monitoring(성능 모니터링):
    • 애플리케이션의 성능을 모니터링하기 위해 AOP를 사용하여 메서드 실행 시간을 측정하거나, 리소스 사용량을 추적하는 등의 작업을 수행할 수 있습니다.

 

AOP 의 장 단점

스프링 AOP의 장점

  • 관심사의 분리: 공통 기능을 비즈니스 로직과 분리하여 모듈화할 수 있습니다.
  • 재사용성: 동일한 부가 기능을 여러 클래스나 메서드에 적용할 수 있습니다.
  • 유지보수성: 공통 기능을 중앙에서 관리할 수 있어 유지보수가 용이합니다.

스프링 AOP의 단점

  • 복잡성 증가: AOP를 처음 접하는 개발자에게는 개념과 구현이 복잡하게 느껴질 수 있습니다.
  • 성능 오버헤드: AOP 적용에 따른 런타임 오버헤드가 있을 수 있습니다.
  • 디버깅 어려움: 코드의 흐름이 분리되어 있어 디버깅이 어려울 수 있습니다.

 

'Java > Spring' 카테고리의 다른 글

@Transactional  (0) 2024.06.24
Entity 맵핑 @어노테이션  (0) 2024.06.19
BLOB 이용한 멀티미디어 저장  (0) 2024.06.19
싱글톤(Singleton) 패턴의 개념 및 사용  (0) 2024.06.18
Refresh Token, Access Token의 개념 및 동작  (0) 2024.06.03