[Spring 9-2] Annotation 기반의 AOP 설정

임승현·2023년 2월 20일

Spring

목록 보기
23/46

🌈클래스 생성(핵심관심모듈)

📃AopAnnotationBean.java

※ xyz.itwill07.aop 패키지에 AopAnnotationBean.java 클래스 생성

package xyz.itwill07.aop;
//
import org.springframework.stereotype.Component;
//
@Component//자동으로 스프링 빈으로 등록됨(context:component-scan 등록 후)
public class AopAnnotationBean {
	public void display1() {
		System.out.println("### AopAnnotationBean 클래스의 display1() 메소드 호출 ###");
	}
	public void display2() {
		System.out.println("### AopAnnotationBean 클래스의 display2() 메소드 호출 ###");
	}
	public void display3() {
		System.out.println("### AopAnnotationBean 클래스의 display3() 메소드 호출 ###");
		throw new RuntimeException();//인위적 예외 발생
	}
}

🌈프로그램 생성

📃AopAnnotationApp.java

※ xyz.itwill07.aop 패키지에 AopAnnotationApp.java 클래스 생성

package xyz.itwill07.aop;
//
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
//
public class AopAnnotationApp {
	public static void main(String[] args) {
		ApplicationContext context=new ClassPathXmlApplicationContext("07-5_aopAnnotation.xml");
		AopAnnotationBean bean=context.getBean("aopAnnotationBean", AopAnnotationBean.class);
		System.out.println("================================================================");
		bean.display1();
		System.out.println("================================================================");
		bean.display2();
		System.out.println("================================================================");
		bean.display3();
		System.out.println("================================================================");
		((ClassPathXmlApplicationContext)context).close();
	}
}

🌈환경설정파일 생성

📃07-5_aopAnnotation.xml

※ src/main/resources 폴더에 07-5_aopAnnotation.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:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
	<!-- ================================================================================ -->
	<context:component-scan base-package="xyz.itwill07.aop"/>
	<!-- ================================================================================ -->
	<!-- aspectj-autoproxy : Spring Annotation을 이용하여 AOP 기능을 제공하기 위한 엘리먼트 -->
	<!-- → AOP 관련 Annotation을 사용하여 핵심관심코드에 횡단관심코드를 삽입하여 실행되도록 설정 -->
	<aop:aspectj-autoproxy/>
</beans>

🌈Advice 클래스 생성(횡단관심모듈)

📃AopAnnotationAdvice.java

※ xyz.itwill07.aop 패키지에 AopAnnotationAdvice.java 클래스 생성

package xyz.itwill07.aop;
//
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
//
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
//
@Component
//@Aspect : 핵심관심코드에 횡단관심코드를 삽입하여 실행하기 위한 기능을 제공하는 어노테이션
//→ Spring Bean Configuration File의 aspect 엘리먼트와 유사한 기능 제공
@Aspect
public class AopAnnotationAdvice {
	private static final Logger logger=LoggerFactory.getLogger(AopAnnotationAdvice.class);
	//
	//@Pointcut : 타겟메소드를 지정하기 위한 어노테이션
	//→ 메소드 호출을 이용하여 타겟메소드를 지정한 PointCut 표현식을 제공하기 위해 사용
	//→ Spring Bean Configuration File의 pointcut 엘리먼트와 유사한 기능 제공
	//value 속성 : 타겟메소드를 지정하기 위한 PointCut 표현식을 속성값으로 설정
	//→ 다른 속성이 없는 경우 속성값만 설정 가능
	@Pointcut("within(xyz.itwill07.aop.AopAnnotationBean)")
	public void aopPointCut() {}
	//
	//◈Before Advice 메소드
	//@Before : 핵심관심코드 실행 전 횡단관심코드를 실행하는 기능을 제공하는 어노테이션
	//→ Spring Bean Configuration File의 before 엘리먼트와 유사한 기능 제공
	//→ 다른 속성이 없는 경우 속성값만 설정 가능
	//@Before(value = "within(xyz.itwill07.aop.AopAnnotationBean)")
	//value 속성값으로 @Pointcut 어노테이션을 사용한 메소드를 호출하면 등록된 PointCut 표현식을 제공받아 사용 가능
	@Before("aopPointCut")
	public void beforeLog() {
		logger.info("[before]핵심관심코드 실행 전 삽입되어 실행될 횡단관심코드");
	}
	//
	//◈After Advice 메소드
	//@After : 핵심관심코드 실해 후 무조건 횡단관심코드를 실행하는 기능을 제공하는 어노테이션
	//→ Spring Bean Configuration File의 after 엘리먼트와 유사한 기능 제공
	//@After("within(xyz.itwill07.aop.AopAnnotationBean)")
	@After("aopPointCut")
	public void afterLog() {
		logger.info("[after]핵심관심코드 실행 후 무조건 삽입되어 실행될 횡단관심코드");
	}
	//
	//◈After Returning Advice 메소드
	//@AfterReturning : 핵심관심코드가 정상적으로 실행된 후 횡단관심코드를 실행하는 기능을 제공하는 어노테이션
	//→ Spring Bean Configuration File의 after-returning 엘리먼트와 유사한 기능 제공
	//returning 속성 : 타겟메소드의 반환값을 저장하기 위한 매개변수의 이름을 속성값으로 설정
	@AfterReturning(value="aopPointCut", returning = "object")
	public void afterReturningLog(Object object) {
		logger.info("[after-returning]핵심관심코드가 정상적으로 실행된 후 삽입되어 실행될 횡단관심코드");
	}
	//
	//◈After Throwing Advice 메소드
	//@AfterThrowing : 핵심관심코드 실행시 예외가 발생된 경우 횡단관심코드를 실행하는 기능을 제공하는 어노테이션
	//→ Spring Bean Configuration File의 after-throwing 엘리먼트와 유사한 기능 제공
	//throwing 속성 : 타겟메소드에서 발생된 예외(Exception 객체)를 저장하기 위한 매개변수의 이름을 속성값으로 설정
	@AfterThrowing(value = "aopPointCut()", throwing = "exception")
	public void afterThrowingLog(Exception exception) {
		logger.info("[after-throwing]핵심관심코드 실행시 예외가 발생되면 삽입되어 실행될 횡단관심코드");
	}
	//
	//◈Around Advice 메소드
	//@Around : 핵심관심코드 실행 전과 후에 횡단관심코드를 실행하는 기능을 제공하는 어노테이션
	//→ Spring Bean Configuration File의 around 엘리먼트와 유사한 기능 제공
	@Around("aopPointCut()")
	public Object aroundLog(ProceedingJoinPoint joinPoint) throws Throwable {
		logger.info("[around]핵심관심코드 실행 전에 삽입되어 실행될 횡단관심코드");
		Object object=joinPoint.proceed();
		logger.info("[around]핵심관심코드 실행 후에 삽입되어 실행될 횡단관심코드");
		return object;
	}
}

0개의 댓글