[Spring] AOP 사용하기(Java)

    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를 잘 사용하는 것이라고 그나마 말 할 수 있다.

    반응형

    댓글

    Designed by JB FACTORY