wintertreey 님의 블로그
aspectJ pointcut 표현식 본문
핵심로직 먼저 후다닥 작성하자.
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
https://velog.io/@ddongh1122/SpringAOP-%EC%8A%A4%ED%94%84%EB%A7%81-AOP
https://engkimbs.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81AOP
https://cafe.daum.net/flowlife/HrhB/27
https://velog.io/@ddongh1122/SpringAOP-%EC%8A%A4%ED%94%84%EB%A7%81-AOP
https://engkimbs.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81AOP
'백엔드 > Spring' 카테고리의 다른 글
JPQL연습_미니게시판 (0) | 2024.08.01 |
---|---|
wmvc 연습. #{}와 ${}의 차이 (0) | 2024.08.01 |
리덕스 Redux. 구조분해 연산자. (1) | 2024.08.01 |
@MVC - MyBatis : 미니게시판 (1) | 2024.07.22 |
@MVC DB연동4 : Spring DATA JPA JpaRepository CRUD (2) | 2024.07.22 |