코딩 개발/Spring

Spring Logging 3탄 - @Around

호소세 2023. 7. 10. 08:56
728x90
반응형

Spring AOP Advice 유형에는 5가지가 있습니다.

 

  • @Before - core 메서드 실행 전에 실행하는 Advice
  • @After Returning - core 메서드 정상 실행 후 실행하는 Advice
  • @After Throwing - core 메서드 실행 시 예외 발생 시 실행하는 Advice
  • @After - core 메서드 정상 실행 또는 예외 발생 상관없이 실행하는 Advice
  • @Around - 위 네가지 Advice를 모두 포함, 모든 시점에서 실행할 수 있는 Advice

이중에 이 모든것을 할 수 있는 @Around에 대하여 알아볼 예정입니다!

 

1, 2탄과 중복되는 내용이 많고 Aspect 파일만 변경하는 것이기 때문에 1, 2탄을 많이 참고 부탁드립니다.

 

AOP 탄 : https://pabeba.tistory.com/192

1탄 : https://pabeba.tistory.com/193

2탄 : https://pabeba.tistory.com/194

 

예시를 바로 보겠습니다.

 

@Around 예시

<AroundLoggingAspect.java>

@Aspect
@Component
public class AroundLoggingAspect {
	private Logger logger = LoggerFactory.getLogger(getClass());
	@Around("execution(public * org.kosta.myproject.model.*Service.*(..))")
	public Object aroundLogging(ProceedingJoinPoint point) throws Throwable {
		Object retValue = null;
		logger.debug("**AOP Before**");
		try {
			retValue = point.proceed();// 실제 Core Target 을 실행
			if (retValue != null) {
				logger.debug("**AOP After Returning** return value {}", retValue);
			}
		} catch (InventoryException ie) {
			logger.error("**AOP After-Throwing 재고부족=>공급처에 연락 **", ie);
		} finally {
			logger.debug("**AOP After**");
		}
		return retValue;
	}
}


딱 코드를 보면 느낌이 오는 것이 core 메서드가 실행되었나 안되었나에 따라 logging을 하냐 안 하냐로 나누게 됩니다.

 

1. @Around 설정에 예전에 설정했던 그대로 설정합니다. (이번에는 find 말고 모든 메서드에 나오게 했습니다.)

2. core 메서드가 실행되기 전에 logging 하려면 point.proceed()가 실행되기 전에 logging을 합니다.(@Before)

3. retValue (리턴 값)애 실제 사용하는 core 대상 정보를 가져와 실행하여 할당합니다.

4. return 값이 있는 메서드가 실행되면 return 값을 logging 합니다. (@After Returning)

5. 만일 에러가 발생한다면 error를 catch 하여 error 로깅 수준으로 로깅합니다. (@After Throwing)

6. 그리고 core 함수가 실행되고 무조건 실행되는 finally에도 디버그 로깅을 합니다. (@After)

 

이렇게 하면 @Before, @After Returning, @After Throwing, @After에 대한 다른 class를 만들 필요 없이 코드만으로 분간해 놓으면 됩니다.

 

소감

역시 이런 마음으로 살아야합니다. 귀찮은 것은 모조리 편하게 만드는 개발자가 되야겠다고 생각합니다.

class를 4개로 나누는 것보다 @Around를 사용하여 4가지를 다 사용하는... 도미노 피자에 4가지 맛 피자 같아요.

이외에도 test 로깅을 하고 싶으면 시간초를 재서 로깅하는 방식도 있습니다. 자신이 원하는 것을 기록하고 싶을 때 로깅을 이용하면 좋을 것 같습니다.

반응형