본문 바로가기
DEV/Spring

Spring - AOP 개념

by 어쩌다개발 2023. 3. 2.
반응형

AOP - Aspect Oriented Programming

Aspect : [명사]측면, [명사][격식]양상

Oriented : [형용사] ~을 지향하는

AOP의 사전적 의미로 찾아보면 측면/양상 지향적인 프로그래밍이라는 의미이다.

양상(樣相) : 사물이나 현상의 모양이나 상태.
측면(側面) : 사물이나 현상의 한 부분. 또는 한쪽 면.

AOP는 공통 관심 사항(cross-cutting concern) 와 핵심 관심 사항(core concern) 분리하자는 개념으로 보면 된다.

예를 들면, 각 메서드가 작업하는 시간을 체크하는 로직을 메서드마다 넣어야 된다고 가정하자.

class A {
	method a() {
    	시간 체크 로직(시작) 추가
        ...
        a 로직
        ...
        시간 체크 로직(종료) 추가
    }
    
    method b() {
    	시간 체크 로직(시작) 추가
    	...
        b 로직
        ...
        시간 체크 로직(종료) 추가
    }   
}

만약, 메서드가 1000개라면 각 메서드별로 1000개의 시간 체크 로직을 넣어야되고, 10000개라면 10000개의 시간 체크 로직을 넣어줘야 한다.

이렇게 일일이 찾아서 넣었는데 만약 로직이 변경된다고 한다면 다시 일일이 찾아서 전부 수정해줘야 한다. 즉, 유지보수 측면에서도 좋지 않다.

AOP 적용

AOP는 중복되는 코드(공통 관심 사항)를 분리하고, 각 메서드가 해야 될 작업(핵심 관심 사항)만 가지고 있자라는 개념이다.

package com.spring.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
  
@Component
@Aspect //AOP를 적용하기 위해 해당 애노테이션을 붙인다.
public class TimeTraceAop {

    //Around는 지정된 패턴에 해당하는 메서드가 실행되기 전, 실행된 후 모두에서 동작한다.
    @Around("execution(* com.spring..*(..))") // com.spring 패키지의 하위 패키지 메서드에 적용
    public Object execute(ProceedingJoinPoint joinPoint) thrwos Throwable {
        
        long start = System.currentTimeMilleis();
        
        System.out.println("Start : " + joinPoint.toString());
    }
    
    try {
        //procedd() 하게되면, 대상 메서드를 실행, 타겟이 되는 @Around("...")를 호출
        return joinPoint.proceed();
    
    //그리고 finally 실행
    } finally {
        long finish = System.currentTimeMillis();
        long timeMs = finish - start;
        
        System.out.println("End : " + joinPoint.toString() + " " + timeMs + "ms");
    }
}

 

 

참고 : 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - https://inf.run/hHPp

반응형

댓글