twocowsong

Spring Boot AOP 본문

IT/SpringBoot

Spring Boot AOP

WsCode 2022. 3. 22. 18:10

프로그램 개발중 만약 각 메소드마다 시작 시간,  종료시간, 걸린시간을 출력하기위해서는 어떻게 해야할까요?

모든 메소드 호출마다 try문으로 감싸서 하는방법도있겠지만.. 시간과 고통이 엄청나겠죠. 

이럴때 AOP를 이용하여 공통처리를하게된다면 빠른방법으로 처리할수있습니다.

 

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>5.3.16</version>
</dependency>

pom.xml에 dependency를 추가합니다.

 

/**
 * AOP - 시작, 종료 공통 로직
 */
@Component
@Aspect
@Slf4j
public class TraceAop {

	/**
	 * 모든 패키지에 적용되는 시작, 종료 공통 로직
	 * 시작시간 , 종료시간 출력
	 */
	@Around("execution(* com.twocow.song..*(..))")
	public Object executeTimeTrace(ProceedingJoinPoint joinPoint) throws Throwable {
		// 시작 전 사용될 내용
		long start = System.currentTimeMillis();
		log.info("START : " + joinPoint.toString());
        
		try {
			// 본문 내용 시작
			Object result = joinPoint.proceed();
			return result;
		} finally {
			// 종료 후 사용될 내용
			long finish = System.currentTimeMillis();
			long timeMs = finish - start;
			log.info("END : " + joinPoint.toString() + " " + timeMs + "ms" );
		}
	}
    
}

TraceAop 클래스를 추가하였습니다.

@Around 어노테이션에는 패키지 범위를 지정할 수 있습니다.

패키지 범위를 적게 설정한다면 해당 패키지가 실행 될때만 수행됩니다.

 

join.proceed(); 에서 본문내용이 실행된 후 finally에서 완료 시간을 찍게됨으로 저희가 원하는 시간을 모든 메소드 실행마다 찍을수 있습니다.

 

원하는 패키지단위를 조절하거나 조금씩 입맛에 맞게 수정하여 사용하면 될것같습니다.

'IT > SpringBoot' 카테고리의 다른 글

Filter, interceptor, Aop  (0) 2022.05.24
@Autowired , @RequiredArgsConstructor 차이  (0) 2022.03.23
Environment  (0) 2022.02.02
@RestController @Controller  (0) 2022.01.24
@Scheduled  (0) 2022.01.23