Spring AOP 프로그래밍

백엔드&인프라 추종자·2025년 2월 27일

스프링 공부

목록 보기
17/35

AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)는 객체 지향 프로그래밍(OOP)으로 해결하기 어려운 공통 기능(횡단 관심사, Cross-Cutting Concern) 을 효과적으로 분리하여 모듈화하는 프로그래밍 패러다임입니다.

✅ AOP의 주요 개념

  1. 횡단 관심사(Cross-Cutting Concern)

    • 여러 모듈에서 공통적으로 사용되는 기능(로깅, 트랜잭션, 보안 검사 등)
    • OOP에서는 각 클래스에서 반복적으로 작성해야 하는 문제 발생
  2. 애스펙트(Aspect)

    • 횡단 관심사를 모듈화한 객체
    • 예) 로깅 기능을 LoggingAspect로 따로 정의
  3. 조인 포인트(Join Point)

    • AOP가 적용될 수 있는 지점 (메서드 실행, 예외 발생 등)
  4. 포인트컷(Pointcut)

    • 조인 포인트 중에서 AOP가 실제로 적용될 대상을 필터링하는 표현식
    • 예) 특정 패키지의 모든 메서드에 적용
  5. 어드바이스(Advice)

    • 실제 실행될 코드 (Before, After, Around 등)
  6. 위빙(Weaving)

    • 애스펙트를 실제 코드에 적용하는 과정
    • 컴파일 타임, 런타임, 로드 타임 방식이 있음

✅ AOP의 장점

  • 중복 코드 제거: 로깅, 트랜잭션 관리 등의 공통 로직을 분리하여 코드 유지보수 용이
  • 관심사 분리: 핵심 비즈니스 로직과 부가 기능을 분리하여 코드 가독성 향상
  • 코드 변경 최소화: 기존 코드 수정 없이 부가 기능을 추가할 수 있음

✅ Spring AOP 예제 (AspectJ 스타일)

Spring에서는 AOP를 지원하며, @Aspect@Around 같은 어노테이션을 활용하여 쉽게 구현할 수 있습니다.

import org.aspectj.lang.annotation.*;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {

    @Around("execution(* com.example.service.*.*(..))")
    public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        Object result = joinPoint.proceed();
        long executionTime = System.currentTimeMillis() - start;
        System.out.println(joinPoint.getSignature() + " executed in " + executionTime + "ms");
        return result;
    }
}

✅ 언제 사용하면 좋은가?

  • 로깅, 트랜잭션 처리, 보안 검사 등 여러 곳에서 반복되는 기능을 분리하고 싶을 때
  • 기존 코드 수정 없이 새로운 기능을 추가하고 싶을 때

Spring AOP를 활용하면 비즈니스 로직과 부가 기능을 명확하게 분리할 수 있어 유지보수성이 향상됩니다.

profile
AI 답변 글을 주로 올립니다.

0개의 댓글