본문 바로가기

컴퓨터공학/Spring & Hibernate

Spring> AOP> Around Advice Type

메인 함수에서 목표 객체 메소드를 실행할 때

먼저 Around aspect가 실행된다.   

그리고 목표 객체 매소드를 실행시키고 결과값을 메인함수로 보내준다.

 

즉, 메인함수가 메소드를 실행시키면

Aspect 는 중간에 끼어들어서 대신 실행시키고

결과값을 다시 메인함수로 보내주는 역할을 한다.  

목표 객체 클래스 기능 말고 asepct에서 추가로 실행시킬 수 있다.

 

아래 예시에서는 aspect에 메소드를 실행할 때 걸리는 시간을 측정하는 기능이 있다.

 

Pre Work

이전 시간에 사용한 메인 함수 클래스를 이어 가져온다.


@Around


@Around Advice

aspect에서도 똑같이 해준다. 

아래에 오류가 나는 부분은 toString( ) 으로 바꿔준다.

 

이러면 이제 로그로 나온다.


@Around Advice Handling Exceptions  

다시 복습하자면 메인 앱에서 특정 객체 클래스의 메소드를 실행하면

@Around 에서 중간에 끼어들어서 실행시키고 

다른 기능도 실행시킨다. 예를 들면 시작 시간이나 끝나는 시간을 재는 거와 같이..

 

그런데 만약 @Around가 대신 실행하는데 오류가 난다면??

그러면  @Around advice가 오류를 다룬다.

메인함수는 다루지 않는다 . 메인함수는 오류가 생긴 걸 모른다.

즉 역할이 분담되어 있다.. 

 

메인 함수에서 오류를 표시하는 boolean을 하나 만들어주고 목표 객체 메소드에 입력한다. 

목표 객체 클래스에서 오류 생성 표시를 받으면 에러를 던진다.

만약에 오류를 생성하라고 표시를 받지 못하면

이전에 썼던 getFortune 메소드를 사용하여 정상 기능을 실행한다.  

실행해보면 오류가 나온다.

 

메인 함수에서 실행하고 목표 객체 클래스에서 에러를 던지면 

남는 건 이제 에러를 캐치하는 부분인 @Around aspect가 된다 .

 

 

목표 객체 클래스에서 오류면 에러를 던지고 아니면 정상 결과물을 던진다.

@Around에서는 오류를 받으면 에러를 표시하고(e.getMessage() 부분)

오류 값에 대한 적정값을 메인함수에 반환한다.

만약 오류를 못 받았으면 정상 결과물을 그대로 받아서 메인함수에 반환한다. 

 

 

오류는 @Around aspect가 관리하여 적절한 처리를 한다. 

메인 함수에서는 오류에 관한 결과값을 받아서 표현한다.

임무 분담이 되어있다.


@Around Advice Rethrowing Exceptions

오류 결과값을 @Around에서 처리하여 보내는 것이 아니라

오류값을 그대로 메인 함수에 전달하는 내용이다.

 

목표 객체에서 보낸 에러가 메인 함수에서 표현된다.