[ 관점지향 프로그래밍 ] AOP ( xml설정 - JointPoint )
Advice 클래스를 더 꾸며보자
키워드 : JoinPoint | 바인드 변수
바인드 변수 = returnObj, exseptObj
JoinPoint 객체를 이용하여 사용해보자
JoinPoint는 import가 필요함 - AOP관련 클래스인것을 알수있음
jp.getSignature().getName()
>> 포인트컷(핵심로직)의 메서드명을 알수있음
jp.getArgs()
>> 포인트컷(핵심로직)이 사용하는 인자들의 정보를 알수있음
여러개일수 있으므로 아웃풋은 Object [] 로 받는다
해당값을들 syso로 확인할 수 있게 된다
포인트컷 (핵심로직)의 리턴값을 이용하여
AfterReturning 과 AfterThrowing에서 사용해보자
1) AfterReturning
인자로 Object returnObj를 생성
어떤 결과값이 올지 모르기 때문에 Object로 받는 것
returnObj 객체에 핵심로직의 리턴값을 넣어줘야하는데
aop:after-returning으로 포인트컷(핵심로직)이 실행되고 리턴값을 returning 속성으로 returnObj에 넣어주는 것
bPointcut = select류 메서드에 반응하는 포인트컷
selectOne에 반응 시켜볼 예정
인자 Object returnObj는 xml에서 설정한 속성으로 인해 포인트컷의 리턴값이 들어가 있음
instanceof를 이용하여 MemberVO 객체인지 확인하고
if문 바디에서 형변환을 이용하여 returnObj를 MemberVO로 만들고
해당 결과값의 Role이 관리자인지 일반계정인지 확인하는 기능을 만들어 보았다
콘솔결과
SelectAll일 경우 List 리턴하기 때문에 returnObj에 List가 담긴다
1) 조건문으로 instanceof List인지 확인
** instanceof 는 타입만 검사가 가능하기때문에 제네릭까지 포함할 순 없음
2) 조건안으로 들어왔다면 returnObj = List 라는 뜻
( 편하게 쓰기위해 List obj 객체로 담아주고 )
3) obj의 첫번째 객체를 꺼내본다
어떤객체가 나올지 모르기때문에 Object type 객체에 담아둔다
4) 해당 type이 MemberVO 인지 BoardVO인지 구별한다
구별이 완료되면 해당 바디에서 obj를
List<MemberVO or BoardVO> 맞는 객체의 리스트로 형변환 한다
5) 원하는 기능을 코딩한다
콘솔 결과
2) AfterThrowing
인자로 Execption exceptObj를 생성
어떤 에러가 올지 모르기때문에 최상위 Exception을 사용
Execption exceptObj에 값을 넣어주어야 하는데
aop:after-throwing으로 포인트컷(핵심로직)이 실행되고 리턴값을 throwing 속성으로 exceptObj에 넣어주는 것
bPointcut = select류 메서드에 반응하는 포인트컷
selectOne에 반응 시켜볼 예정 >> id가 error 라면 Throw 발생시킬 예정
인자 Object exceptObj는 xml에서 설정한 속성으로 인해 포인트컷의 에러가 들어가 있음
새로운 에러가 발생할때마다 else if로 해당 에러를 instanceof 하여 로그를 넣어 해결
콘솔결과
after-throwing 실행된 것을 확인할 수 있고 - " Throwing 수행중인 핵심메서드명 "로그
발생한예외 : [실행시예외 ] = IllegalArgumentException 발생했다는 뜻이고
올바르지않은 인자값을 사용했습니다... = AfterThrowingAdvice 클래스의 로그 인 것을 확인할 수 있다