로깅은 사용자의 요청을 추적하여 시스템이 애플리케이션이 어떻게 돌아가고 있는지 효율적으로 확인할 수 있는 수단이에요. 그님스 백엔드 팀에서는 모든 API 호출 시, 로그를 남기고 이에 더해 응답 시간을 계산해서 제공하고 있습니다.
목차
1. AOP 살짝 맛보기
2. API 응답 시간 Aspect
1. AOP 살짝 맛보기
AOP는 여러 객체에 공통으로 적용할 수 있는 기능을 분리해서 재사용성을 높여주는 프로그래밍 기법이에요. 이에 대한 자세한 설명은 제가 작성한 블로그에서 확인하실수 있습니다. (스프링5 프로그래밍 입문 - ch7. AOP 프로그래밍 - (2) AOP)
API 응답 시간을 남기는 AOP 코드를 보기전에 AOP에 대해 살짝 맛볼게요
(1) @Asepect
AOP를 적용할 클래스에 명시합니다. Aspect는 공통 기능이라는 의미를 가지고 있어요. 우리가 자주 사용하는 @Transactional 또한 Aspect 중 하나에요.
(2) @Around("execution(* com.gnims.project.domain..*Controller.*(..))")
@Around
해당 애노테이션을 이해하기 전에 Advice에 대해 알아야해요. Advice는 공통 관심사를 언제 적용할지 결정해요.
Before, Around, After 등 다양한 Advice가 존재해요. 해당 소스 코드에서는 Around Advice에요. Around Advice는 타겟 전, 후에 모두 동작해요.
"execution(* com.gnims.project.domain..*Controller.*(..))"
pointcut이자 execution 명시자라고 불러요. Aspect를 적용할 타겟을 결정하는것이에요. 간단하게 설명하면 AOP가 적용될 메서드를 결정한다. 라고 이해하면 될 것 같아요.
eecution 명시자 작성 양식 (? 생략 가능함을 의미, '*' 모든 값을 표현 '..' 0개 이상이라는 의미)
"execution(접근 제어자(?) 리턴타입패턴 클래스이름패턴(?)메서드이름패턴(파라미터 패턴))
이를 통해 pointcut를 해석하면 다음과 같습니다. com.gnims.project.domain 내부 모든 패키지 XxxController 클래스 내부 모든 메서드에 적용한다는 의미에요.
(3) jointPoint.proceed()
어드바이스 메서드는 일반적으로 proceed() 메서드의 반환값을 반환해야 합니다. 그래야 다음 프록시 혹은 비즈니스 로직으로 넘어갈 수 있습니다.
2. API 응답 시간 Aspect
응답 시간이 1500ms 이하일 경우 해당 API의 클래스 + 메서드 명과 응답 시간을 로그로 반환합니다.
응답 시간이 1500ms 초과할 경우 해당 API의 클래스 + 메서드 명과 응답 시간을 로그로 반환하고 DB에 저장합니다.
실제로 응답시간이 1500ms를 초과할 경우 아래와 같이 DB에 추가되는 것을 확인하실 수 있습니다.
이를 통해, 어디서 병목현상이 발생하는지 이전부터 편하게 확인할 수 있습니다.
'BE 프로젝트 일대기' 카테고리의 다른 글
[Be] 비밀번호 재설정 (0) | 2023.03.13 |
---|---|
Gnims - 인증 방식 (0) | 2023.03.11 |
[BE] 소셜 로그인 (0) | 2023.03.09 |
GNIMS - 유저검색하기 (1) | 2023.02.27 |
그님스 BE는 코드 리뷰를 합니다. 그런데 잘되고 있나요...? (0) | 2023.02.26 |