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 로깅을 하고 싶으면 시간초를 재서 로깅하는 방식도 있습니다. 자신이 원하는 것을 기록하고 싶을 때 로깅을 이용하면 좋을 것 같습니다.
'코딩 개발 > Spring' 카테고리의 다른 글
MyBatis 2탄 - SqlSessionTemplate, XML config (0) | 2023.07.11 |
---|---|
MyBatis 1탄 - Configuration, Annotation, SqlSessionFactory 로 실행하기 (0) | 2023.07.10 |
Spring Logging 2탄 - @After (0) | 2023.07.09 |
Spring Logging 1탄 - Slf4j, logback-classic, jcl-over-slf4j, <exclusion> (0) | 2023.07.09 |
AOP (Aspect Oriented Programming) 관점 지향 프로그래밍 (0) | 2023.07.08 |