[Spring] AOP 를 활용한 횡단 관심사 구현

2024. 2. 29. 13:03·프로젝트 기록/spring

🌏고민의 시작

프로젝트를 진행하며 로그에 대한 체크를 자주하게 되었습니다.
특히 구현한 메서드에 대한 input parameter 가 제대로 들어오는지 확인하고 싶었습니다.

@Slf4j 를 이용한 추적을 진행해도 큰문제는 없다고 생각했지만, 점점 문제를 느끼게 되었습니다.

  1. 매번 반복되는 @Slf4j 어노테이션을 이용한 log 추적에 피로도 증가
  2. 체크를 위한 로그 표기의 일관성 부족(ex. log.info("매번 바뀌는 로그 추적 양식"))

이러한 문제를 느끼게 되었고, 지금까지 학습한 내용 중 이러한 문제를 해결하기 위해 AOP를 활용한 Input Parameter 추적 어노테이션을 개발하고 적용하게 되었습니다.

 

🌏고민 해결 방법

  1. 매번 반복되는 @Slf4j 어노테이션을 이용한 log 추적에 피로도 증가
  2. 체크를 위한 로그 표기의 일관성 부족(ex. log.info("매번 바뀌는 로그 추적 양식"))

위에 있는 2가지를 해결하기 위해 AOP 를 이용한 Input Parameter 로그 추적 어노테이션 개발을 진행하게 되었습니다.

 

🌏 구현

아래와 같은 방법으로 구현을 진행했습니다.

  • AOP 를 구현하기 위해서는, 어느 어노테이션에 적용할 지 Around 를 설정합니다.
  • 어드바이스( Advice ) 로 메서드를 구현하면 됩니다.
@Slf4j  
@Aspect  
public class LogParameterTraceAop {  
    /**  
     * @Around 애노테이션의 값인 annotation(com.mapwithplan.mapplan..annotation.LogInputTrace)) 는 포인트컷이 된다.  
     * @Around 애노테이션의 메서드인 checkInputLog 는 어드바이스( Advice )가 된다.  
     * 해당 메서드에 대한 Input 파라미터의 값을 출력한다.  
     * 다만 해당 어노테이션을 사용하기 위해서는 로그 추적을 원하는 도메인에 toString 을 구현해야한다.  
     * @param joinPoint  
     * @return  
     * @throws Throwable  
     */    @Around("@annotation(com.mapwithplan.mapplan.common.aop.logparameteraop.annotation.LogInputTrace)")  
    public Object checkInputLog(ProceedingJoinPoint joinPoint) throws Throwable {  
        Object[] args = joinPoint.getArgs();  
        String className = joinPoint.getTarget().getClass().getName();  
        String methodName = joinPoint.getSignature().getName();  
        Arrays.stream(args)  
                .forEach(parameter ->  
                        log.info("className = {}, methodName ={}, Parameter: {}",  
                                className, methodName, parameter));  
        return joinPoint.proceed();  
    }  
}

 

위의 메서드를 보면 ProceedingJoinPoint joinPoint 에서 각 파라미터의 클래스, 메서드를 출력합니다.

그리고 joinPoint.getArgs(); 에서 input 된 파라미터 값을 출력 합니다.   

 

그리고 이 기능을 적용할 어노테이션 입니다. 

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

 

하지만, 이 @LogInputTrace 어노테이션에서 정확한 Input Parameter 값을 추적하기 위해서는

객체의 toString 을 구현해야 합니다.

 

만약에 구현을 하지 않는다면, Input Parameter의 객체 주소만 나오는 문제가 있으므로 정확한 파라미터 추적에 있어서는 toString 을 구현해야 합니다.

 

아래는 예시 입니다. (IDE를 통해 구현 하는 것이 가장 안전한 방법입니다.)

@Override  
public String toString() {  
    return "TestDomain{" +  
            "test=" + test +  
            ", testString='" + testString + '\'' +  
            ", helloTestArray=" + helloTestArray +  
            '}';  
}

 

이러한 과정을 거치게 되면서,

반복되는 과정을 줄일 수 있었을 뿐 아니라 형식의 통일을 하게 되었습니다.

 

🌏마무리

 

간단한 작업이었지만, 실제 개발 상황에서 느낀 불편함을 학습한 AOP 의 개념을 적용해 해결해볼 수 있던 경험을 하게 되었습니다.

반응형

'프로젝트 기록 > spring' 카테고리의 다른 글

[Spring Project] Util 메서드는 Spring bean 으로 등록해야할까? (feat. static Method)  (0) 2025.03.23
[spring] @ComponentScan 의 대상 위치  (0) 2024.01.21
'프로젝트 기록/spring' 카테고리의 다른 글
  • [Spring Project] Util 메서드는 Spring bean 으로 등록해야할까? (feat. static Method)
  • [spring] @ComponentScan 의 대상 위치
코딩 코딩 코오딩
코딩 코딩 코오딩
  • 코딩 코딩 코오딩
    코딩하는 누누
    코딩 코딩 코오딩
  • 전체
    오늘
    어제
    • 분류 전체보기 (491)
      • 생산성 (2)
        • 인텔리제이 (2)
      • 프로젝트 기록 (14)
        • git (2)
        • spring (3)
        • TestCode (2)
        • spring security (3)
        • 기타 (2)
        • MySQL (0)
        • Cloud (2)
      • 회고 (4)
      • Spring (6)
      • JPA (0)
      • DB (4)
        • MySql (2)
        • Redis (1)
      • Java (7)
        • JSP (1)
      • 잡담 (1)
      • CS (30)
        • 컴퓨팅 사고 (0)
        • 배열 (4)
        • 알고리즘 (8)
        • 메모리 (7)
        • 자료구조 (9)
        • 암호학 (2)
      • opencv (14)
      • AI (56)
        • 머신러닝 (2)
        • 딥러닝 (7)
        • tensorflow (3)
        • 머신러닝(딥러닝) 정리 (21)
        • 강화학습 (7)
        • 논문 읽기 (1)
        • 잡동사니 (1)
        • python AI (13)
        • 선형대수 (1)
        • 확률론 (0)
      • 알고리즘 공부 (177)
        • 그래프 이론 (0)
        • 다익스트라 (4)
        • 위상정렬 (3)
        • 신장트리-크루스칼 알고리즘 (4)
        • 플로이드 워셜 (3)
        • 이진탐색 (9)
        • 백트래킹 (11)
        • 부르드포스 (9)
        • 다이나믹 프로그래밍 (20)
        • BFS & DFS (24)
        • 그리디 (6)
        • 구현 (15)
        • 정렬 (3)
        • 기타 (62)
        • 수학? (1)
      • 코딩 (173)
        • 파이썬(python) (15)
        • c언어 (13)
        • 프로그래머스 lv1 (46)
        • 프로그래머스 lv2 (41)
        • 백준 - c++ (49)
        • Softeer (9)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    에라토슽네스의 체
    큐
    정렬
    DFS
    코딩
    그리디
    c언어
    if문
    인접리스트
    삽입 정렬
    알고리즘
    자료구조
    왜곡보정
    순차 탐색
    BFS
    코딩테스트
    코딩문제
    이미지처리
    n진법 변환
    코딩기초
    백준
    인접행렬
    캘리브레이션
    소수찾기
    선택정렬
    C언어 기초
    스택
    코딩기초스킬
    프로그래머스
    다이나믹 프로그래밍
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코딩 코딩 코오딩
[Spring] AOP 를 활용한 횡단 관심사 구현
상단으로

티스토리툴바