오늘은 AOP에서의 AfterReturning과 AfterThrowing에 대해 알아보려고 한다.
* 로그를 작성하기 전 초기 설정 방법은 앞의 포스팅 참고
https://junwons.tistory.com/117
[Spring] AOP (Aspect Oriented Programming)
현재까지는 OOP를 이용하여 공부를 했지만, OOP는 응집도가 낮다는 단점이 있어서 응집도를 높이기 위해 AOP를 공부해야 한다. (IoC로 결합도를 낮췄으니 AOP로 응집도를 높여보자 !) OOP와 AOP의 차이
junwons.tistory.com
AfterReturning
ProceedingJoinPoint는 aroundAdvice에서는 필수로 사용해야하는 객체이다. (다른 advice에서는 필수는 아님)
비즈니스 메소드의 정보를 받고 싶을 때 JoinPoint 사용
jp.getSignature().getName();
위는 비즈니스 메소드의 이름과 현재 해당 advice와 결합된 비즈니스 메소드를 말한다.
비즈니스 메소드의 정보를 받고 싶기 때문에 JoinPoint를 인자로 사용하고, 어떤 자료형으로 비즈니스 메소드의 반환값을 받아올 지 모르기 때문에 어떤 자료형이든 스프링 컨테이너가 자동으로 바인딩 해주는 바인드 변수 Object(최상위 클래스)를 인자로 사용할 예정이다.
AfterReturning.java
public void afterReturningPrintLog(JoinPoint jp, Object returnObj) {
String methodName = jp.getSignature().getName();
System.out.println("횡단 관심: " + methodName + " 비즈니스 메소드의 반환 이후의 로그");
//returnObj가 관리자라면, 로그에 [관리자 입장] 이라고 출력하고 싶음
//returnObj의 인스턴스형이 MemberVO가 맞는지 T,F 반환
//returnObj가 MemberVO가 MemberVO를 상속받는 클래스라면 true 리턴
if(returnObj instanceof MemberVO) {
MemberVO mVO = (MemberVO)returnObj; // returnObj 다운캐스팅
if(mVO.getRole().equals("ADMIN")) {
}
}
}
코드는 위와 같이 작성한다.
AfterThrowAdvice
서비스를 하기 전까지 예외 및 에러를 확인하려는 용도로 사용한다.
* 현재 서비스 중에는 사용하지 않음
발생한 예외를 바인딩 변수로 받아올 수 있고 예외 처리는 예외 클래스의 최상위 클래스인 Exception을 사용한다.
이미 try-catch 처리가 되어 있을 경우 호출하지 않고, Service 레이어에서 발생한 경우에만 어드바이스와 결합된다. 즉, ServiceImpl.java 클래스에서 발생한다.
예시 : DAO, SQL, ... 등
PointCutCommon.java
public class PointCutCommon {
@Pointcut("execution(* com.spring.biz..*Impl.*(..))")
public void aPointcut() {}
@Pointcut("execution(* com.spring.biz..*Impl.select*(..))")
public void bPointcut() {}
}
applicationContext.xml
<!-- 자동으로 처리하는 aop 추가 -->
<aop:aspectj-autoproxy />
LogAdvice.java
@Service
@Aspect
public class LogAdvice {
...
@AfterThrowing(pointcut="PointCutCommon.aPointcut()", throwing="exceptObj")
public void afterThrowingPrintLog(JoinPoint jp, Exception exceptObj) {
String methodName = jp.getSignature().getName();
System.out.println("횡단 관심 : "+methodName+"에서 예외가 발생해서 출력되는 로그");
System.out.println("예외 메세지 : "+exceptObj.getMessage());
}
...
}
위와 같이 3개의 코드를 작성하면 완료 !
'Spring' 카테고리의 다른 글
[Spring] NULL 업데이트 이슈 (@SessionAttributes, @ModelAttribute) (0) | 2023.08.16 |
---|---|
[Spring] Spring JDBC (JDBCTemplate) (1) | 2023.08.16 |
[Spring] AOP (Aspect Oriented Programming) (0) | 2023.08.11 |
[Spring] 2 - Layerd 아키텍처 스타일 (0) | 2023.08.11 |
[Spring] Command 객체 VIEW에서 사용하기 (0) | 2023.08.10 |