Spring

aspectJ pointcut 표현식

wintertreey 2024. 8. 1. 19:29

핵심로직 먼저 후다닥 작성하자.
 
AritcleInter.java

package pack;

public interface ArticleInter {
	void selectAll();
}

ArticleDao.java

package pack;

public class ArticleDao implements ArticleInter {
	@Override
	public void selectAll() {
		System.out.println("테이블 자료 읽기");

	}
}

 
LogicInter.java

package pack;

public interface LogicInter {
	void selectDataProcess1();
	void selectDataProcess2();
}

 
LogicImpl.java

package pack;

public class LogicImpl implements LogicInter{
	private ArticleInter articleInter;
	
	public LogicImpl() {
		// TODO Auto-generated constructor stub
	}
	public LogicImpl(ArticleInter articleInter) {
		this.articleInter = articleInter;
	}
	@Override
	public void selectDataProcess1() {
		System.out.println("selectDataProcess1 수행"); //BL
		articleInter.selectAll(); //모델 클래스 수행 결과
		
	}
	@Override
	public void selectDataProcess2() {
		System.out.println("------------------------------");
		System.out.println("selectDataProcess2 처리"); //BL
		articleInter.selectAll(); //모델 클래스 수행 결과
		
		try {
			Thread.sleep(3000);
		} catch (Exception e) {
			// TODO: handle exception
		}
		System.out.println("3초 delay");
		
	}

}

 
Main.java

package pack;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("aopinit.xml");

		LogicInter inter = (LogicInter) context.getBean("logicImpl");
		inter.selectDataProcess1();
		inter.selectDataProcess2();
	}
}

aopinit.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-4.3.xsd">

	<!-- 핵심 객체 생성: target -->
	<bean id="logicImpl" class="pack.LogicImpl">
		<constructor-arg>
			<ref bean="articleDao" />
		</constructor-arg>
	</bean>
	
	<bean id="articleDao" class="pack.ArticleDao" />

	<!-- AOP 설정: Advice - aop namespace 사용-->
	<bean id="ourAdvice" class="pack.OurAdvice"/>
	
	<aop:config>
		<aop:aspect ref="ourAdvice">
			<!-- pointcut표현식은 execution(패키지.클래스.메소드(메개변수)) -->
			<aop:pointcut expression="execution(* *..*LogicInter*.*(..)) or execution(public void selectAll())" id="poi"/>
			<aop:around method="kbs" pointcut-ref="poi"/>
		</aop:aspect>
	
	</aop:config>
	
	
	
</beans>

 

aopinit.xml execution에서 or execution(public void selectAll() 이 부분을 지웠을때 출력된 결과.
 

 


 

상단의 코드를 인터페이스를 쓰면 다음과 같다. 

 

ArticleInter.java

package pack;

public interface ArticleInter {
	void selectAll();
}

 

ArticleDao.java

package pack;

import org.springframework.stereotype.Repository;

@Repository //db와 연결해서 작업하는 클래스.
public class ArticleDao implements ArticleInter {
	@Override
	public void selectAll() {
		System.out.println("테이블 자료 읽기");

	}
}

 

db와 연결해서 작업하는 클래스이다.

따라서 componenet의 하위버젼인 @repository를 사용했다.

이때 선언을 하는것뿐 뒤에 componentscan을 통해 비로소 생성된다. 

 

LogicInter.java

package pack;

public interface LogicInter {
	void selectDataProcess1();
	void selectDataProcess2();
}

LogicImpl.java

package pack;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service //비즈니스 로직 클래스
public class LogicImpl implements LogicInter{
	@Autowired
	private ArticleInter articleInter;
	
	public LogicImpl() {
		
	}
// @autowired로 생성자 자동선언. 불요. 주석처리. 
//	public LogicImpl(ArticleInter articleInter) {
//		this.articleInter = articleInter;
//	}
	@Override
	public void selectDataProcess1() {
		System.out.println("selectDataProcess1 수행"); //BL
		articleInter.selectAll(); //모델 클래스 수행 결과
		
	}
	@Override
	public void selectDataProcess2() {
		System.out.println("------------------------------");
		System.out.println("selectDataProcess2 처리"); //BL
		articleInter.selectAll(); //모델 클래스 수행 결과
		
		try {
			Thread.sleep(3000);
		} catch (Exception e) {
			// TODO: handle exception
		}
		System.out.println("3초 delay");
		
	}

}

 

어드바이스 종류

@Around 어드바이스를 제외한 나머지 어드바이스들은 @Around가 할 수 있는 일의 일부만 제공할 뿐이다.

 

@Around : 메서드 호출 전후에 수행, 가장 강력한 어드바이스

@Before : 조인 포인트 실행 이전에 실행

@AfterReturning : 조인 포인트가 정상 완료후 실행

@AfterThrowing : 메서드가 예외를 던지는 경우 실행

@After : 조인 포인트가 정상 또는 예외에 관계없이 실행(finally)


 

연습문제

키보드로 아이디입력시 맞으면 핵심로직수행, 안맞으면 핵심로직수행x

 

 

 

참고할 소스코드는 깃허브의 spr10, 11, 12를 참고하자.

https://github.com/yoonah0327/spring_source.git

 

GitHub - yoonah0327/spring_source

Contribute to yoonah0327/spring_source development by creating an account on GitHub.

github.com

 

 


https://velog.io/@ddongh1122/SpringAOP-%EC%8A%A4%ED%94%84%EB%A7%81-AOP

 

[Spring][AOP] 스프링 AOP

기본 사용법 @Aspect @Around어노테이션의 값 execution..은 포인트컷이 된다. @Around어노테이션의 메서드인 doLog는 어드바이스가 된다. 참고로 스프링 AOP는 AspectJ의 문법을 차용하고 프록시 방식의 AOP

velog.io

 

https://engkimbs.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81AOP

 

[Spring] 스프링 AOP (Spring AOP) 총정리 : 개념, 프록시 기반 AOP, @AOP

| 스프링 AOP ( Aspect Oriented Programming ) AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 관점 지향은 쉽게 말해 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로

engkimbs.tistory.com

 

 


 
 


https://cafe.daum.net/flowlife/HrhB/27

 

AspectJ의 Pointcut 표현식

AspectJ의 Pointcut 표현식 정리 * Execution 문법   execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?namepattern(param-pattern) throws-pattern?)   execution(접근제어자? 반환타입 선언타입?메서드이름(

cafe.daum.net

https://velog.io/@ddongh1122/SpringAOP-%EC%8A%A4%ED%94%84%EB%A7%81-AOP

 

[Spring][AOP] 스프링 AOP

기본 사용법 @Aspect @Around어노테이션의 값 execution..은 포인트컷이 된다. @Around어노테이션의 메서드인 doLog는 어드바이스가 된다. 참고로 스프링 AOP는 AspectJ의 문법을 차용하고 프록시 방식의 AOP

velog.io

https://engkimbs.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81AOP

 

[Spring] 스프링 AOP (Spring AOP) 총정리 : 개념, 프록시 기반 AOP, @AOP

| 스프링 AOP ( Aspect Oriented Programming ) AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 관점 지향은 쉽게 말해 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로

engkimbs.tistory.com