웹 개발

AOP에서의 모든 메서드 로깅과 Custom Annotation을 활용한 No Logging 처리

노루아부지 2022. 5. 1. 22:10

Spring에서 애플리케이션 서비스들이 공통으로 처리할 기능들은 그 성격과 범위에 따라 인터셉터나 AOP(Aspect Oriented Programing)을 사용합니다.

 

제가 일하는 회사의 고객사에서 어느 날 프로그램이 어디까지 실행되다 오류가 발생했는지 알기 위해 모든 함수의 시작에는 "START" 로그를, 끝에는 "END"로그를 남겨달라고 했습니다.

그런데 프로그램에서 사용하는 함수가 한두 개도 아닌데, 모든 함수에 "START"와 "END" 로그를 남기는 것은 너무 힘든 일입니다.

Spring에서는 AOP를 사용하여 손쉽게 모든 함수에 이런 로그를 남길 수 있습니다.

 

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

import lombok.extern.slf4j.Slf4j;

@Aspect
@Slf4j
@Component
public class ServerDebug {
  // 모든 Controller
  @Before("bean(*Controller)")
  public void controllerLog(JoinPoint point) {
    log.info("Controller");
  }

  // 모든 Service
  @Before("bean(*Service)")
  public void serviceLog(JoinPoint point) {
    log.info("Service");
  }

  // com.test 패키지 하위 모든 메소드 시작에 START 표시
  @Before("execution(* com.test..*.*(..))")
  public void start(JoinPoint point) {
    log.debug("START");
  }

  // com.test 패키지 하위 모든 메소드 시작에 END 표시
  @After("execution(* com.test..*.*(..))")
  public void end(JoinPoint point) {
    log.debug("END");
  }
}

 

 

위 코드 처럼 원하는 메서드에 로그를 남길 수 있고 필요하면 모든 메서드에도 남길 수 있습니다.

그런데 이 중, 예외로 로그를 표시하고 싶지 않은 메소드가 있을 수 있습니다. 이 경우 Custom Annotation을 이용하여 특정 메서드에 로깅을 하지 않을 수 있습니다.

 

먼저, NoLogging을 선언합니다.

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface NoLogging {
}

 

 

그 이후에, 로그를 사용하지 않을 함수에 @NoLogging를 사용합니다.

@NoLogging
public String getName() {
  return "hong";
}

 

728x90
loading