본문 바로가기

Java

AOP

AOP

관점 지향 프로그래밍
횡단 관심사를 관점(Aspect) 이라는 기준으로 바라보고 이를 별도의 모듈로 분리하여 프로그래밍하는 패러다임
공통 기능(관심사)을 효과적으로 분리하여 관리하는 기술

왜 AOP를 사용해야 하는가?

복잡하게 얽혀있는 코드 속에서 공통된 기능을 깔끔하게 분리하여 가독성과 유지보수성을 높이는 기술
흩어지고 얽혀 있는 코드
애플리케이션을 개발하다보면, 여러 비즈니스 로직에서 반복적으로 나타나는 부가요소들이 있다.
로깅, 트랜잭션 관리, 보안 검증 = 횡단 관심사
AOP가 없다면

@Service
public class UserService {
    public User findUser(Long id) {
        // --- 횡단 관심사 (로깅) ---
        log.info("findUser 메서드 실행 시작");
        // =========================

        // === 핵심 비즈니스 로직 ===
        User user = userRepository.findById(id);
        // ======================

        // --- 횡단 관심사 (로깅) ---
        log.info("findUser 메서드 실행 종료");
        // =========================
        return user;
    }
}

코드 흩어짐 : 로깅 코드가 Service 에 흩어져 있다. 로그 포맷을 변경하려면 모든 파일을 찾아 수정
코드 얽힘 : 핵심 비즈니스 로직과 부가 기능 로직이 한 메서드 안에 뒤섞여 있다.
AOP를 통한 관심 분리
횡단 관심사를 별도의 모듈(Aspect)로 빼내고 핵심 비즈니스 로직은 순수하게 유지

AOP 주요 개념

Aspect(관점)

  • 횡단 관심사를 모듈화한 클래스(로깅, 시간 측정 등)
  • 핵심 로직에만 집중할 수 있도록 부가 기능들을 관리
  • 클래스에 @Aspect@Component 어노테이션을 함께 붙여 Bean에 등록

    Advice(조언)

  • Aspect가 수행하는 부가 기능과 그 동작을 수행할 시점을 정의한 메서드
  • @Before : 핵심 로직 실행 전
  • @After : 핵심 로직 실행 후
  • @AfterReturning : 핵심 로직이 정상 실행된 후
  • @AfterThrowing : 핵심 로직에서 예외 발생 후
  • @Around : 핵심 로직 실행 전과 후 모두

    JoinPoint(결합 지점)

  • Advice가 적용될 수 있는 모든 지점을 의미
  • Advice 메서드의 파라미터로 JoinPoint 객체를 받으면 현재 실행중인 메서드의 정보를 얻을 수 있다.
    @Before("execution(* com.example.service..*(..))")
    public void logMethodDetails(JoinPoint joinPoint) {
      String methodName = joinPoint.getSignature().getName();
      Object[] args = joinPoint.getArgs();
      log.info("'{}' 메서드 실행 시작, 파라미터: {}", methodName, args);
    }

    PointCut

  • 수많은 JoinPoint 중에서 Advice를 정확히 어디에 적용할지 선별하는 표현식(필터링 규칙)
  • execution() : 메서드의 시그니처(리턴 타입, 이름, 파라미터)를 기준으로 정밀하게 선택
  • execution(* com.example.service..*Service.*(..))
    • com.example.service.. : service 패키지 및 모든 하위 패키지
    • Service : 이름이 Service로 끝나는 클래스
    • .* : 모든 이름의 메서드
    • (..) : 0개 이상의 모든 파라미터

'Java' 카테고리의 다른 글

MSA  (6) 2025.08.02
오류 정리  (4) 2025.07.26
N + 1  (2) 2025.07.22
Interceptor  (4) 2025.07.21
Spring 정리  (0) 2025.07.19