sertvlet-context.xml 에 아래 코드 3줄을 추가한다.
aspectj는 프록시를 이용해서 동작하기 때문에 마지막 줄로 프록시를 추가하는 것.
...
xmlns:aop="http://www.springframework.org/schema/aop"
...
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
...
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
...
root-context.xml의 beans 태그에 아래 코드 2줄을 추가한다.
...
xmlns:aop="http://www.springframework.org/schema/aop"
...
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
...
AOP를 이용해 로그를 기록할 클래스를 만든다. LogAdvice.java
package com.kdh.spring.common;
public class LogAdvice {
public void printLog() {
System.out.println("[공통로그 - LogAdvice] 비즈니스 로직 수행 전 동작");
}
}
root-context.xml의 beans태그 내부에 bean태그를 추가한다.
3번 줄: log라는 이름으로 com.kdh.spring.common.LogAdvice 클래스를 이용한다는 의미이다.
6번 줄: com.kdh.spring 패키지 아래 자바파일들 중 클래스명이 Impl로 끝나는 파일의 모든 메소드에 대해 적용한다는 의미이다. ~~Impl 클래스의 어떤 메소드든 불려질 때 이것이 실행된다.
11번째 줄 : 6번째 줄에서 지정한 파일의 메소드가 실행되기 전(aop:before)에 printLog라는 메소드를 실행한다는 의미이다.
1 <!-- AOP xml방식 -->
2 <!-- 사용할 클래스 설정 -->
3 <bean id="log" class="com.kdh.spring.common.LogAdvice"></bean>
4 <aop:config>
5 <!-- impl로 끝나는 모든 클래스에 대해 포인트컷을 설정한다. -->
6 <aop:pointcut expression="execution(* com.kdh.spring..*Impl.*(..))" id="allPointCut"/>
7
8 <!-- ref의 log라는 값은 bean의 id와 일치 -->
9 <aop:aspect ref="log">
10 <!-- LogAdvice클래스의 메소드명인 printLog -->
11 <aop:before method="printLog" pointcut-ref="allPointCut"/>
12 </aop:aspect>
13 </aop:config>
pointcut 표현식 정리 (execution은 생략하였다)
1. * com.kdh.member.model.service.*.*(..)
-> service패키지에 있는 모든 클래스 및 모든 메소드 ( 매개변수는 0개 이상)
2. * com.kdh.member.model.service..*.*(..)
-> service패키지 및 하위 패키지에 있는 모든 클래스 및 모든 메소드 (매개변수는 0개 이상)
3. * com.kdh.member.model.service..*.*()
-> service패키지 및 하위 패키지에 있는 모든 클래스 및 모든 메소드 (매개변수 없는 것)
4. * com.kdh.member.model.service..*.*(*)
-> service패키지 및 하위 패키지에 있는 모든 클래스 및 모든 메소드 (매개변수 1개)
5. * com.kdh.member.model.service..*.*(Integer,..)
-> service패키지 및 하위 패키지에 있는 모든 클래스 및 모든 메소드
( 매개변수가 1개 이상이고, 첫번째 파라미터는 정수 )
6. int com.kdh.member.service..*.*(Integer,..)
-> 리턴타입이 int이고 service패키지 및 하위 패키지에 있는 모든 클래스 및 모든 메소드
( 매개변수가 1개 이상이고, 첫번째 파라미터는 정수)
7. int com.kdh.member.service..*Impl.*(..)
-> 리턴타입이 int이고 service패키지 및 하위 패키지에 있는 Impl로 끝나는 클래스의 모든 메소드
(매개변수는 0개 이상)
pom.xml에 아래와 같이 aspectj 디펜던시를 추가한다.
이후 프로젝트 폴더를 우클릭하여 maven - Update project를 실행한다.
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.8</version>
</dependency>
서버를 실행시켜 com.kdh.spring 패키지 내부의 ~~Impl.java 클래스에서 메소드를 실행해본다.
LogAdvice.java에 있던 printLog()메소드가 실행됨을 확인.
LogAdvice.java 클래스에 메소드 printLogging 추가.
이 메소드는 로직 수행 후 실행시킬 것.
public void printLogging() {
System.out.println("[공통로그 - LogAdvice] 비즈니스 로직 수행 후 동작");
}
root-context.xml 파일에 aop:after 태그를 추가.
method 속성값으로는 앞서 만든 printLogging을 입력해준다.
새롭게 추가한 "비즈니스 로직 수행 후 동작" 이 함께 출력되고 있다.
앞서 해본 Bean 설정을 아래와 같이 어노테이션으로 대체할 수 있다.
'Spring' 카테고리의 다른 글
[Spring] 이클립스에 Lombok 설치하기 - 이클립스 메뉴 및 Maven을 이용해 간편하게 (0) | 2021.05.19 |
---|---|
[Spring] 참고할만한 오픈소스 프로젝트들 (0) | 2021.05.17 |
[Spring] 사용자에게 alert를 출력하고 redirect 하기 - Controller단에서 (0) | 2021.05.07 |
[Bean] Bean.xml 파일에 Bean 등록 후 클래스 사용하기 (0) | 2021.05.04 |
[Spring] root-context.xml의 Namespaces탭에 jdbc가 없을 때 (0) | 2021.05.02 |
댓글