AOP
객체 지향 프로그래밍을 보완하는 프로그램 구조에 대한 또 다른 사고방식입니다. OOP에서 모듈화의 핵심 단위는 클래스인 반면, AOP에서 모듈화의 단위는 관점입니다.
Spring의 핵심 구성 요소 중 하나는 AOP 프레임워크입니다. Spring IoC 컨테이너가 AOP에 의존하지 않는다는 점에서 유의할 필요가 있습니다. 즉 Spring은 AOP를 사용하지 않고 IOC 컨테이너를 사용할 수 있습니다. AOP는 Spring IoC를 보완하여 매우 유능한 미들웨어 솔루션을 제공합니다.
AOP는 핵심 로직에서 공통 관심사를 분리하여 모듈화 하는 방법을 제공합니다. 이로써 코드 중복을 줄이고, 유지보수성과 확장성을 향상시킬 수 있습니다. Aspect는 애플리케이션 전체에 걸쳐 흩어진 관심사를 하나의 모듈로 추상화합니다. Adivice, Pointcut, JoinPoint 등의 개념을 사용하여 메서드 실행 전, 후 또는 중간에 횡단하는 부분에 코드 삽입이 가능합니다.
AOP 주요 기능
1. 트랜잭션 관리
@Transactional 어노테이션을 사용합니다. @Transactional 어노테이션을 부여하여 데이터베이스 액세스 처리 메서드가 정상 종료하면 트랜잭션을 커밋하고 예외처리가 발생하면 롤백합니다.
2. 횡단 관심사 분리
AOP 목적 중 하나는 횡단 관심사를 모듈화하는 것입니다. 이것은 비즈니스 로직과는 별개로 존재하는 공통적인 작업들을 분리하여 코드 중복을 줄이고 유지보수를 향상시킬 수 있습니다.
3. 조인 포인트 식별
Advice가 적용될 수 있는 프로그램 실행 지점을 나타내며, 메서드 호출, 예외발생, 필드 접근등을 말합니다.
AOP 용어
Adicice : 회단적 관심사 구현. 로그 출력 및 트랜잭션 제어
Aspect : 어드바이스를 정리
JoinPoin : 어드바이스를 삽입할 수 있는 위치, 예를 들어 메서드 이름이 get으로 시작할 때만 처리하는 조건
Interceptor : 처리의 제어를 인터셉트하기 위한 구조 또는 프로그램
Target : 어드바이스가 도입되는 대상
AOP gradle
의존성을 추가해 줍니다.
implementation 'org.springframework.boot:spring-boot-starter-aop'
AOP 클래스
AOP를 구현하기 위해 @Aspect을 사용해 Aspect 클래스 정의합니다.
@Aspect
@Component
public class Aspect{
}
AOP 예시
@Aspect
@Component
public class Aspect {
@Before("execution(* io.joo.spring.greet.*Greet.*(..))")
public void beforeAdvice(JoinPoint joinPoint) {
System.out.println(new SimpleDateFormat("yyyy/MM/dd").format(new java.util.Date()));
System.out.println(String.format("메서드:%s", joinPoint.getSignature().getName()));
}
}
Pointcut에 매칭되는 메서드가 실행되기 전에 Before Advice로 출력하고 현재 날짜와 해당 메서드 이름 출력합니다. 이러한 로깅으로 Aspect로 분리되어 해당 클래스에 직접 구현 없이 자연스러운 로깅이 가능합니다.
'Spring(Boot & FrameWork)' 카테고리의 다른 글
Validation (0) | 2023.12.06 |
---|---|
Parameter (0) | 2023.11.28 |
RequestParam (1) | 2023.11.27 |