The Debugging Chronicles : "코드의 미학"

[Spring] AOP 관점 지향 프로그램 어노테이션 설정 - 2 (Pointcut 설정의 응집도 높이기) 본문

Spring

[Spring] AOP 관점 지향 프로그램 어노테이션 설정 - 2 (Pointcut 설정의 응집도 높이기)

sweetseonah1004 2024. 10. 16. 09:38

pointCut들을 모아두기

참조용 메서드들이여서 실제로 동작하지 않기 때문에 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>