appling 프로젝트

[appling] 전역 Log 처리 (with. AOP)

studyingJuno 2024. 9. 9. 16:02
728x90
반응형

🔴 log 전역으로 처리하기

간단한 로그를 남기려고 하는데 Controller랑 Service마다 로그를 직접 찍지 않고 자동화처리 하고 싶다.

해당 부분을 Aspect(AOP)를 사용하여 처리해보자.

🟠 설정

dependencies {
    ...
    implementation("org.springframework:spring-aop:6.0.11")
}

의존성 주입만 해주면 끝이다.

🟠 적용

🟢 Controller Log

@Component
@Aspect
@Slf4j
public class GlobalControllerLog {
    @Around("execution(* com.simol.appling..*.controller..*.*(..))")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
        String type = pjp.getSignature().getDeclaringTypeName();
        String method = pjp.getSignature().getName();
        String requestURI = ((ServletRequestAttributes) requestAttributes).getRequest()
                .getRequestURI();

        log.info("[appling] [controller] requestUri=[{}] package = [{}], method = [{}]",
                requestURI, type, method);

        return pjp.proceed();
    }
}

@Around("execution(* com.simol.appling..*.controller..*.*(..))") 설정을 통해 해당 패키지의 controller에 포함된 경우에만 적용되도록 했다.

그리고 controller에서 요청된 url과 해당 controller의 package, method명을 로그로 찍도록 설정했다.

🟢 Service Log

@Aspect
@Component
@Slf4j
public class GlobalServiceLog {
    @Around("execution(* com.simol.appling..*.service..*.*(..))")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        log.info("[appling] [service] method = [{}]", pjp.getSignature().toShortString());

        return pjp.proceed();
    }
}

@Around("execution(* com.simol.appling..*.service..*.*(..))") 설정을 통해 해당 패키지의 service가 포함된 경우에만 적용되도록 했다.

그리고 service의 method명만 찍도록 했다.

로그가 잘 찍히는 것을 확인했다. 로그를 저장하기 위해 LogBack을 설정해야되지만 아직은 필요하지 않아 나중에 설정하기로 하자!

728x90
반응형