본문 바로가기
Spring

[Spring] Spring AOP, 로그기록

by 박졔삐 2024. 10. 31.

[ Spring AOP와 로그 기록 ]

 

목차

  1. Spring AOP (Aspect-Oriented Programming)
    •     1-1 정의
    •     1-2 역할 및 이점
    •     1-3 주요 구성 요소
    •     1-4 예시 코드
  2. 로그 기록
    •     2-1 정의
    •     2-2 역할 및 이점
    •     2-3 로그 기록 구현
    •     2-4 예시 코드
  3. 사용자 ID 가져오기
    •     3-1 정의
    •     3-2 역할 및 이점
    •     3-3 구현 예시
  4. 결론

 


 

1. Spring AOP (Aspect-Oriented Programming)

 

1-1. 정의

AOP는 관점 지향 프로그래밍으로, 공통 기능을 모듈화하여 비즈니스 로직과 분리하는 프로그래밍 패러다임이다. 이를 통해 코드의 응집성을 높이고 유지보수성을 향상시킬 수 있다.

 

1-2. 역할 및 이점

  • 코드 중복 제거: 반복적으로 사용되는 기능을 어드바이스(advice)로 정의하여 중복 코드를 줄인다.
  • 관심사 분리: 비즈니스 로직과 공통 기능을 분리하여 명확성을 높인다.
  • 유연성: 메서드 호출 전후 등 다양한 지점에 적용 가능하여 기능 추가 및 변경이 용이하다.

1-3. 주요 구성 요소

  • Aspect: 공통 관심사를 모듈화한 것.
  • Join Point: AOP가 적용될 수 있는 지점.
  • Advice: Join Point에서 수행할 작업.
  • Pointcut: Advice가 적용될 Join Point를 지정하는 표현식.

1-4. 예시 코드

@Aspect
@Component
public class LoggingAspect {

    private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);

    @Around("@annotation(org.example.expert.domain.common.annotation.Logging)")
    public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        Object proceed = joinPoint.proceed();
        long executionTime = System.currentTimeMillis() - start;

        logger.info("Executed {} in {} ms", joinPoint.getSignature(), executionTime);
        return proceed;
    }
}

 


 

2. 로그 기록

 

2-1. 정의

로그 기록은 애플리케이션에서 발생하는 이벤트나 상태 정보를 기록하는 과정이다.

2-2. 역할 및 이점

  • 문제 진단: 오류나 예외의 원인을 빠르게 파악할 수 있게 한다.
  • 모니터링: 애플리케이션의 성능과 사용자 행동을 기록하여 실시간 분석이 가능하다.
  • 의사 결정 지원: 로그 데이터를 기반으로 비즈니스 결정을 내릴 수 있다.

2-3. 로그 기록 구현

  • 사용자의 ID, 요청 URL, 요청 시각, 요청 바디 등 다양한 정보를 기록하여 문제 발생 시 유용한 정보를 확보한다.

2-4. 예시 코드

@Around("@annotation(org.example.expert.domain.common.annotation.Logging)")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
    long userId = getCurrentUserId(); // 사용자 ID 가져오기
    String url = request.getRequestURI();
    long start = System.currentTimeMillis();

    try {
        return joinPoint.proceed();
    } finally {
        long executionTime = System.currentTimeMillis() - start;
        logger.info("User ID: {} - Executed {} in {} ms", userId, url, executionTime);
    }
}

 


 

3. 사용자 ID 가져오기

 

3-1. 정의

사용자 ID를 가져오는 것은 인증된 사용자의 정보를 획득하여 기능을 수행하는 데 필수적이다.

3-2. 역할 및 이점

  • 인증 및 권한 관리: 사용자 ID를 통해 인증 상태와 권한을 확인할 수 있다.
  • 개인화된 경험 제공: 사용자 정보를 기반으로 맞춤형 서비스를 제공한다.

3-3. 구현 예시

private long getCurrentUserId() {
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    if (authentication != null && authentication.isAuthenticated()) {
        User user = (User) authentication.getPrincipal(); // UserDetails 구현체가 User인 경우
        return user.getId(); // 사용자 ID 반환
    }
    throw new RuntimeException("User not authenticated"); // 인증되지 않은 경우 예외 처리
}

 


 

4. 결론

 

AOP와 로그 기록 기능 구현은 코드 재사용성과 관리 효율성을 높이며, 문제 해결 시 중요한 정보를 제공하는 데 기여한다. AOP를 통해 비즈니스 로직과 공통 기능을 분리하고, 로그 기록 기능을 통해 시스템의 동작을 효과적으로 모니터링하고 분석할 수 있게 되었다. 이러한 기술들은 현대 소프트웨어 개발에서 필수적인 요소로 자리 잡고 있다.

728x90
반응형