[Spring] AOP 사용하기(Java)
- Web/Spring
- 2020. 10. 22.
aop 방법, JAVA 방식에 대해 설명이다.
Bean 데이터(Student, Worker)
더보기
Student.java
package com.day03.Ex07;
public class Student {
private String name;
private int age;
private int gradeNum;
private int classNum;
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 int getGradeNum() {
return gradeNum;
}
public void setGradeNum(int gradeNum) {
this.gradeNum = gradeNum;
}
public int getClassNum() {
return classNum;
}
public void setClassNum(int classNum) {
this.classNum = classNum;
}
public void getStudentInfo()
{
System.out.println("이름 : "+getName());
System.out.println("나이 : "+getAge());
System.out.println("학년 : "+getGradeNum());
System.out.println("반 : "+getClassNum());
}
}
Worker.java
package com.day03.Ex07;
public class Worker {
private String name;
private int age;
private String job;
public void getWorkerInfo() {
System.out.println("이름 : "+getName());
System.out.println("나이 : "+getAge());
System.out.println("직업 : "+getJob());
}
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 getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
}
LogAop.java
package com.day03.Ex07;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class LogAop {
@Pointcut("within(com.day03.Ex07.*)")
public void pointcutMethod() {
}
@Around("pointcutMethod()")
public Object loggerAop(ProceedingJoinPoint joinpoint) throws Throwable {
String signatureStr = joinpoint.getSignature().toShortString();
System.out.println(signatureStr + " is start.");
long st = System.currentTimeMillis();
try {
Object obj = joinpoint.proceed();
return obj;
} finally {
long et = System.currentTimeMillis();
System.out.println(signatureStr + " is finished.");
System.out.println(signatureStr + "경과 시간 : " + (et - st));
}
}
@Before("within(com.day03.Ex07.*)")
public void beforeAdvice(JoinPoint joinPoint) {
System.out.println("beforeAdvice()");
}
}
어노테이션을 이용해서 각 필요한 위치에 어노테이션을 설정한다.
xml에 비해서 보기 쉽고 간편해진 듯 하다.
package com.day03.Ex07;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class MainClass {
public static void main(String[] args) {
// AOP 에 대해 알아보자
AbstractApplicationContext ctx = new GenericXmlApplicationContext("classpath:AdminDay03Ex07.xml");
Student student = ctx.getBean("student", Student.class);
student.getStudentInfo();
Worker worker = ctx.getBean("worker", Worker.class);
worker.getWorkerInfo();
ctx.close();
}
}
갖고 오는 데이터는 이전 xml에서 사용했던 MainClass하고 동일하다.
student, worker의 bean 데이터가 xml에 있기 때문에 굳이 수정 할 필요가 없어서다.
그러나 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"
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-3.1.xsd">
<aop:aspectj-autoproxy />
<bean id="logAop" class="com.day03.Ex07.LogAop" />
<!-- AOP의존설정 -->
<aop:config>
<aop:aspect id="logger" ref="logAop">
</aop:aspect>
</aop:config>
<bean id="student" class="com.day03.Ex07.Student">
<property name="name" value="홍길동" />
<property name="age" value="15" />
<property name="gradeNum" value="3" />
<property name="classNum" value="15" />
</bean>
<bean id="worker" class="com.day03.Ex07.Worker">
<property name="name" value="홍길동" />
<property name="age" value="15" />
<property name="job" value="도둑" />
</bean>
</beans>
aop:aspectj-autoproxy 를 추가해주고
aop 위치만 지정해주면 된다. 그러면 자동적으로 찾아주는 것을 볼 수 있다.
AOP는 참 애매하다. 문자가 실행도중에 작용되는 메소드로
여러 메소드에 대한 제어권을 얻기도 한다.
그래서 메소드 실행 전 후에 해당 기능을 실행하게 만든다.
그래서 관점지향언어가 된 것이, 해당 메소드에 관해서 어떻게 제어를 하는가를 바라봐야한다.
언제 어떻게 어디서 작동되어서 이렇게 될 수 있는지를 파악해야지 AOP를 잘 사용하는 것이라고 그나마 말 할 수 있다.
반응형
'Web > Spring' 카테고리의 다른 글
[Spring] MVC 패턴 이해하기2 (0) | 2020.10.26 |
---|---|
[Spring] Spring MVC를 만들어보자 (0) | 2020.10.23 |
[Spring] 선택해서 해당 xml 실행하게 만들기 (0) | 2020.10.22 |
[Spring] AOP 사용하기 (0) | 2020.10.22 |
[Spring] AOP에 대해 알아보자 (0) | 2020.10.22 |