본문 바로가기
Spring 프레임워크/메모

Spring 프레임워크 JoinPoint 인터페이스

by Hwanii_ 2023. 8. 12.
728x90

JoinPoint 인터페이스는,

스프링 프레임워크 에서 AOP를 구현할 때 사용되는 인터페이스 이다.

 

JoinPoint는 AOP 어드바이스 메서드가 실행되는 시점에 관련된 정보를 제공 한다.

 

JoinPoint의 주요 메서드는 아래와 같다.

 

1) Signature getSignature() :

JoinPoint를 통해 호출된 메서드의 시그니쳐 정보를 가져 온다.

시그니쳐에는 메서드명, 매개변수 타입 등의 정보를 포함 한다.

 

2) Object[] getArgs() :

JoinPoint를 통해 호출된 메서드의 인자들을 배열 형태로 가져올 수 있다.

 

3) Object getTarget() :

 JoinPoint를 통해 호출된 메서드의 대상 객체를 가져올 수 있다.

 

4) Object getThis() :

 JoinPoint를 통해 현재 실행 중인 객체 (프록시 객체) 를 가져올 수 있다.

 

@Aspect 어노테이션을 사용한 AOP 에서는,

 

@Before, @After, @After-Returning, @After-Throwing, @Around

어노테이션을 사용한, 어드바이스 메서드의 매개변수로 JoinPoint를 선언해서,

다양한 메서드를 사용 할 수 있다.

 

예시)

 

@AfterReturning(pointcut = "PointcutCommon.cPointcut()", returning = "returnObj")
	public void afterReturningLog(JoinPoint jp, Object returnObj) {	
    
		String getSignature = jp.getSignature().toString();	

		int index = getSignature.indexOf("biz.") + 4;	//	"biz." 다음 인덱스

		if(index != -1) {	//	유효성 검사.
			String str = getSignature.substring(index);
			
			String[] arr = str.split("\\.");	//	subSignature 문자열을 . 을 기준으로 분리 하여 저장 하기.
		
			if(arr.length > 2) {	//	유효성 검사.
				String log = arr[1] + "." + arr[2];
				System.out.println("log : LogAdvice : afterReturningLog() : " + log);
				System.out.println();
			}
		}
        
		if(returnObj instanceof MemberVO) {	

			MemberVO mVO = (MemberVO)returnObj;

			if(mVO.getRole().equals("ADMIN")) {
				System.out.println("[관리자 입장]");
				System.out.println();
			}
			else {
				System.out.println("[사용자 입장]");
				System.out.println();
			}
		}
	}

 

 

 

위와 같이,

조인포인트의 Signature getSignature() 메서드를 활용해서,

로그가 잘뜨는 모습을 확인 할 수 있다.

 

 

 

 

 

[ 참고 ]

 

 

 

 

셋다 이상하게 뜨는 모습을 확인 할 수 있는데,

 

Object[] getArgs() 는 호출된 메서드의 인자들을 배열 형태로 가져 왔고,

Object getTarget() 는 호출된 메서드의 대상 객체를 가져 왔고,

Object getThis() 는 현재 실행 중인 객체 (프록시 객체) 를 가져 왔다.

 

getTarget() 은 MemberServiceImpl 클래스의 인스턴스를 나타내는데,

클래스명 뒤에 @는 기호와 식별자가 붙은것으로, 해당 객체의 해시 코드 값 이다.

해시 코드 값은 객체의 고유한 식별자로 사용 된다.

 

getThis() 는 현재 실행 중인 객체 == MemberServiceImpl 이라서,

getTarget() 메서드와 동일한 출력 정보가 나온것을 확인 할 수 있다.

 

getArgs()는 호출된 메서드, 그러니까 selectOne() 메서드의 인자를 배열로 가져온것이라,

배열의 주소값이 나온건데,

이를 아래와 같이 작성 하면 원하는 값을 얻을 수 있긴 하다.

 

 

selectOne(MemberVO) 였으니까, 인자가 1개라서 1이 출력 되는 모습을 확인 할 수 있다.

 

그리고, 아래를 또 확인해보자.

이건 좀 유용하게 사용 할 수 있을 듯 ?

 

 

Arrays 클래스를 사용해서, selectOne(MemberVO) 의 인자를 toString() 하면,

 

MemberVO 자체를 toString 하기 때문에, toString() 을 오버라이딩 해뒀으면,

입맛에 맞는 내용을 출력 시킬 수 있을듯 하다.

 

 

 

어드바이스가 

지금은 로그인 할 때의 경우라서,

입력하는 값이, mid, mpw 두개 밖에 없으니까,

name 이랑 role 프로퍼티가 null 로 나온다.

 

after-returning 어드바이스는 비즈니스 메서드 호출 이후에,

결과값을 Object returnObj로 받아서,

ADMIN 이라는 계정이 가지고 있는 role 프로퍼티 정보를 사용 해서,

관리자인지 사용자인지 체크해서 로그를 반환 하고 있었지만,

 

getArgs() 메서드는 비즈니스 메서드의 실행 결과에 대한것이 아니고,

처음 호출됬을때, 비즈니스 메서드의 인자에 대한 정보를 가져오기 때문에,

insert 같은 비즈니스 메서드일 때 활용 하면 나쁘지 않을 수도 ?

반응형