Web Spring AOP
AOP
- 특정처리를 주시하고 있다가 주시하는 함수가 호출되면 체킹또는 다른 처리(메소드)실행
- 선택적인 사용이며 사용하면 편리하다
- 실무에서 알아 들을 수 잇어야한다
- 하기전, 하기 후 , 공통 처리 기능
공통 메소드
- logger 찍어주기
- session 체크
- 디비연결전 테스트
filter는 진행처리로 걸러주는거고 aop는 멈춤 처리를 할 수 있다
AOP를 설정하는 방법은 여러가지가 있지만 2가지 방법을 기술
1. Xml로 설정
- 우선 aop를 설정하기위해 라이브러리를 pom.xml을 통해 받아준다
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.4</version>
</dependency>
- java src에 설정한 처리를 주시하다가 실행할 메소드를 만들어준다.
package com.aop;
import org.aspectj.lang.ProceedingJoinPoint;
public class LogAop {
public Object loggerAop(ProceedingJoinPoint joinpoint)throws Throwable {
String signatureStr = joinpoint.getSignature().toShortString();
System.out.println(signatureStr + "시작"); //실행 전
try {
Object obj = joinpoint.proceed(); //지정 클래스의 어떠한 메소드가 실행 시
return obj;
}finally {
System.out.println("실행후:"+System.currentTimeMillis());
System.out.println(signatureStr + "종료"); // 실행 후
}
}
}
- aop를 설정할 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" <!-- aop의 namespace를 설정 -->
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-4.3.xsd">
<!-- 객체 생성
xml: <bean == <beans:bean id=
jsp: <jsp:useBean
java: Object obj = new Object
-->
<!-- AOP Object 생성 -->
<bean id="logAop" class="com.aop.LogAop"/>
<!-- LogAop logAop = new LogAop() 와 같은 의미-->
<!-- AOP 설정(자동호출) - 자동호출 함수를 callback함수라고 부른다 -->
<aop:config>
<aop:aspect id="logger" ref="logAop"> <!-- 감시자 생성 (위에 생성한 LogAop클래스) -->
<aop:pointcut expression="within(com.dto.*)" id="publicM"/> <!-- 어디에 있는것을 감시할거냐 패키지 명 *는 모든 파일-->
<aop:around method="loggerAop" pointcut-ref="publicM"/> <!-- 감시하고 실행되는 함수명(여기서는 logAop클래스의 loggerAop메소드 실행 -->
</aop:aspect>
</aop:config>
</beans>
- dto의 메소드가 실행될때 aop가 처리되도록 설정하였다. dto를 생성하도록 한다.
package com.dto;
public class Cat {
private String name;
private int age;
private String color;
public Cat() {
}
public Cat(String name, int age, String color) {
super();
this.name = name;
this.age = age;
this.color = color;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public void catInfo() {
System.out.println("이름:"+name);
System.out.println("나이:"+age);
System.out.println("색깔:"+color);
}
}
- 그리고 xml 파일에서 Cat dto를 생성한다
<bean id="myCat" class="com.dto.Cat">
<property name="name" value="야옹이"/>
<property name="age" value="2"/>
<property name="color" value="black"/>
</bean>
- 이제 main 클래스에서 dto의 메소드를 실행해본다
package com.main;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
import com.dto.Cat;
public class mainclass {
public static void main(String[] args) {
// java에서 xml 실행시 필요함
AbstractApplicationContext ctx = new GenericXmlApplicationContext("bean.xml");
//xml에서 생성된 Object를 read
Cat mycat = ctx.getBean("myCat", Cat.class);
mycat.catInfo();
// Cat youcat = new Cat("나비", 5, "흰색"); //생성만할때는 aop 호출 X
// youcat.catInfo(); //현재는 일반 자바main으로 실행이 안된다
}
}
-결과
Cat.catInfo()시작
이름:야옹이
나이:2
색깔:black
실행후:1599219702567
Cat.catInfo()종료
2. Annotation으로 설정
-
dto와 main 클래스는 동일하게 진행
-
AOP설정하는 xml에서 Annotation을 사용하기위해 설정해 준다
<?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"
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-4.3.xsd">
<!-- AOP Object 생성 -->
<bean id="logAop" class="com.aop.LogAop"/>
<!-- LogAop logAop = new LogAop() -->
<!-- AOP Annotation 설정-->
<aop:aspectj-autoproxy/>
</beans>
- java AOP클래스에서 어노테이션을 달아주고 설정해준다
package com.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
@Aspect //어노테이션으로 aop를 사용하기위해 클래스에 설정
public class LogAop {
@Around("within(com.dto.*)") //아까 xml의 around이며 실행할 callback함수에 붙여준다
public Object loggerAop(ProceedingJoinPoint joinpoint)throws Throwable {
String signatureStr = joinpoint.getSignature().toShortString();
System.out.println(signatureStr + " - 시작"); //실행 전
try {
Object obj = joinpoint.proceed(); //지정 클래스의 어떠한 메소드가 실행 시
return obj;
}finally {
System.out.println("실행후:"+System.currentTimeMillis());
System.out.println(signatureStr + "- 종료"); // 실행 후
}
}
}
- 결과는 위와 동일하다