Spring

[Spring] AOP (Aspect-Oriented Programming) 란? AOP로 로깅하기

소범범 2023. 4. 12. 13:06

Title

실무에서 작업중에 aop를 사용해서 logging과 token 인증 작업하고 있는 프로젝트들이 있습니다.

aop가 무엇인지 알아보고 사용하고 싶어서 정리해보겠습니다!

 

Text

먼저 aop는  (AspectOrientedProgramming) 의 약자로 관점 지향 프로그래밍 이라고 합니다.

간략하게 주요관점과 부가적인관점으로 프로그래밍을 나누어서 모듈화하는 작업입니다.

 

aop의 주요 개념을 이해하고 예제 코드를 통해 AOP에 대해 간략하게 알아보겠습니다.

 

 

AOP의 주요개념 - 출처 : https://engkimbs.tistory.com/746
  • Aspect : 위에서 설명한 흩어진 관심사를 모듈화 한 것. 주로 부가기능을 모듈화함.
  • Target : Aspect를 적용하는 곳 (클래스, 메서드 .. )
  • Advice : 실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체
  • JointPoint : Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능
  • PointCut : JointPoint의 상세한 스펙을 정의한 것. 'A란 메서드의 진입 시점에 호출할 것'과 같이 더욱 구체적으로 Advice가 실행될 지점을 정할 수 있음
 AOP 의존성 추가(Maven)
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

 

AOP 를 사용한 Logging 예시 코드
@RequiredArgsConstructor
@Component
@Aspect
public class ELKLoggingFilter {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Around(value = "@annotation(SetELKLoggingFilter)")
    public Object doFilter(ProceedingJoinPoint pjp) throws Throwable {

        final var signature 
        	= (MethodSignature) pjp.getSignature();
        final var className 
        	= pjp.getTarget().getClass().getSimpleName();
        final var methodName 
        	= signature.getMethod().getName();

        logger.info("ELK_START >>> {}.{}", className, methodName);

        final var result = pjp.proceed(pjp.getArgs());

        logger.info("ELK_END >>> {}.{}", className, methodName);

        return result;
    }
}

이 코드는 스프링 애플리케이션에서 ELK 로깅을 적용하기 위한 예시 코드입니다.

aop 사용을 위해서는

@Component 를 통해 빈등록을 진행하고, 

@Aspect 를 통해 Aspect Class 임을 명시해야합니다.

(모르신분들을 위하여, @RequiredArgsConstructor 는 생성자 자동생성 Lombok 입니다.)

 

 

예시 코드의 doFilter 메소드는 메소드 실행 전/후 로그를 남기는 메소드 입니다.

ProceedingJoinPoint 객체를 통해 메소드의 시그니처, 클래스 이름, 메소드 이름 등을 가져와서

"ELK_START" 로그를 출력하고, 메소드 실행 후에는 "ELK_END" 로그를 출력합니다

 

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SetELKLoggingFilter {
}
@SetELKLoggingFilter
public void exampleMethod () {
}

@Around는 aop를 적용할 타켓을 지정한다. 타켓 지정에는 다양한 방법이 있습니다.

현재 코드에서는 SetELKLoggingFilter 라는 @interface 를 생성하여

aop 를 적용하고자 하는 method에 @SetELKLoggingFilter 태그를 붙여 사용했습니다.

 

Conclusion

AOP를 사용하면 주요 관점과 부가적 관점의 분리를 통해 중복코드를 제거하고 controller 단에서의 효율을 증가할 수 있는 것 같습니다.

하지만, 그만큼  AOP를 정확하게 이해하고 꼭 필요한 범위 내에서 사용하는것이 중요하다고 생각합니다.

 

다음은 AOP를 이용한 토큰 인증 절차를 공부하고 포스팅 해보겠습니다.

감사합니다.

 

 

Reference

https://engkimbs.tistory.com