The Debugging Chronicles : "코드의 미학"
[Spring] AOP 관점 지향 프로그램 어노테이션 설정 - 2 (Pointcut 설정의 응집도 높이기) 본문
Spring
[Spring] AOP 관점 지향 프로그램 어노테이션 설정 - 2 (Pointcut 설정의 응집도 높이기)
sweetseonah1004 2024. 10. 16. 09:38pointCut들을 모아두기
참조용 메서드들이여서 실제로 동작하지 않기 때문에 new 대상이 아니다
그래서 어노테이션 service를 달지 않는다.
pointcut 삭제 후 연결
pointcut도 aspect의 대상이므로 aspect 어노테이션을 달아주어야한다.
pointcutCommon.java
package com.koreait.app.biz.common;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class PointcutCommon {
@Pointcut("execution(* com.koreait.app.biz..*Impl.*(..))")
public void aPointcut() {} // 참조 메서드
@Pointcut("execution(* com.koreait.app.biz..*Impl.select*(..))")
public void bPointcut() {}
}
TestAdvice.java
package com.koreait.app.biz.common;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Service;
import com.koreait.app.biz.board.BoardDTO;
@Service
@Aspect
public class TestAdvice {
@AfterReturning("PointcutCommon.aPointcut()")
public void print(JoinPoint jp) { // 바인드 변수
System.out.println("현재 이 어드바이스랑 연결된 조인포인트의 메서드명");
System.out.println("== 포인트컷의 메서드명");
String methodName = jp.getSignature().getName();
System.out.println(methodName);
System.out.println("현재 이 어드바이스랑 연결된 조인포인트의 매개변수 정보");
System.out.println("== 포인트컷의 매개변수 정보");
Object[] args = jp.getArgs();
if(args[0] instanceof BoardDTO) {
BoardDTO boardDTO = (BoardDTO)args[0];
System.out.println(boardDTO.getWriter()+"님이 DB에 글을 등록했습니다.");
}
}
}
loginAdvice.java
package com.koreait.app.biz.common;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Service;
@Service
@Aspect
public class LogAdvice {
@Before("PointcutCommon.aPointcut()")
public void printLog() {
System.out.println("공통 관심 - 로그 : 비즈니스 메서드 수행 전에 호출됨");
}
}
checkAdvice.java
package com.koreait.app.biz.common;
import org.aspectj.lang.annotation.AfterReturning;
import com.koreait.app.biz.member.MemberDTO;
public class CheckAdvice {
@AfterReturning(pointcut="PointcutCommon.aPointcut()", returning="returnObj")
public void check(Object returnObj) {
if(returnObj instanceof MemberDTO) {
MemberDTO memberDTO = (MemberDTO)returnObj;
if(memberDTO.getRole().equals("USER")) {
System.out.println("회원이 로그인했습니다.");
}
else {
System.out.println("관리자가 로그인했습니다.");
}
}
}
}
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
<context:component-scan base-package="com.koreait.app.biz.board" />
<context:component-scan base-package="com.koreait.app.biz.member" />
<context:component-scan base-package="com.koreait.app.biz.common" />
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
'Spring' 카테고리의 다른 글
[Spring] 트랜젝션 (0) | 2024.10.18 |
---|---|
[Spring] 템플릿 패턴 (DAO 고도화 DEVELOP DAO - 로직, 성능 개선, 최적화) (0) | 2024.10.18 |
[Spring] AOP 관점 지향 프로그램 어노테이션 설정 - 1 (0) | 2024.10.16 |
[Spring] "00님이 DB에 글을 등록했습니다" 로그 AOP로 설정하기 (0) | 2024.10.15 |
[Spring] AOP(Aspect Oriented Programming) 관점 지향 프로그램 - 2 (1) | 2024.10.15 |