AOP의 계념 및 사용법
2024. 6. 18. 20:23ㆍJava/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 |