-
[스프링] Aspect Oriented Programming (AOP을 이용한 로깅파일 구성)Spring 2023. 8. 5. 22:49
AOP란?
- Spring AOP는 스프링 프레임워크에서 제공하는 기능중 하나이다.
- 로깅, 보안, 트랜잭션 관리 등과 같이 항상 사용되는 공통적인 관심사를 모듈화하여 코드 중복을 줄여 유지 보수성 향상에 도움을 주는 기능
메서드, 객체의 기능을 핵심관심사, 공통관심사로 나누어 프로그래밍한다.
- 핵심관심사 : 각 객체가 갖고있어야 할 본래의 기능
- 공통관심사 : 여러 객체에서 공통적으로 사용되는 코드
주요 용어
용어 설명 Aspect 공통 기능을 모듈화한것을 의미 Target Aspect가 적용될 대상을 의미, 메서드 클래스가 이에 해당 Join Point Aspect가 적용될 수 있는 시점을 의미, 메서드 실행 전후등이 이에 해당 Advice Aspect의 기능을 정의한 것으로 메서드 실행 전후, 예외 처리 발생시 실행되는 코드를 의미 Point Cut Advice를 적용할 때, 메서드의 범위를 지정하는 것을 의미 주요 어노테이션
메서드 설명 @Aspect 해당 클래스를 Aspect로 사용하겠다 명시 @Before 대상 메서드가 실행되기 전에 Advice를 실행 @AfterReturning 대상 메서드가 정상 실행되고 반환되면 Advice를 실행 @AfterThrowing 대상 메서드에서 예외 발생시 Advice를 실행 @After 대상 메서드가 실행된 후에 Advice를 실행 @Around 대상 메서드 실행 전,후,예외발생시에 Advice를 실행 사용예시
- API 호출시 요청 파라미터 및 실행시간을 확인할 수 있는 로그를 남기기위해 AOP Class를 구성
@Aspect @Component public class LoggingAspect { private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class); /** * Pointcut : 메서드의 범위 지정 * 패키지내 컨트롤러에 있는 메서드에 모든 메서드를 지정 */ @Pointcut("within(com.zipsin.*.controller..*)") public void onRequest() { } /** * Around : 대상 메서드의 실행 Advice를 실행 * 요청 메서드, URI, 동작시간 표시 */ @Around("com.zipsin.common.aop.LoggingAspect.onRequest()") public Object requestLogging(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); long start = System.currentTimeMillis(); try { return proceedingJoinPoint.proceed(proceedingJoinPoint.getArgs()); } finally { long end = System.currentTimeMillis(); logger.info("Request : {} {} : {} ({}ms)", request.getMethod(), request.getRequestURI(), paramMapToString(request.getParameterMap()), end - start); } } private String paramMapToString(Map<String, String[]> paramStringMap) { return paramStringMap.entrySet().stream() .map(entry -> String.format("%s : %s", entry.getKey(), Arrays.toString(entry.getValue()))) .collect(Collectors.joining(", ")); } }
'Spring' 카테고리의 다른 글
SOLID 원칙 (0) 2023.02.21 MVC모델의 정의, 장점 (0) 2023.02.08 [스프링] 컴포넌트 스캔 (0) 2022.10.03 [스프링] 의존성 주입2 (0) 2022.10.03 [스프링] 의존성 주입1 (0) 2022.10.03