[Spring] AOP 사용하기

     

    실행 결과 모습

    메소드를 호출하면서 그 전, 후에 갚이 추가되는 것을 확인 할 수가 있다.

     

     

    <!-- aop 기능 -->
    		<dependency>
    			<groupId>org.aspectj</groupId>
    			<artifactId>aspectjweaver</artifactId>
    			<version>1.7.4</version>
    		</dependency>

    Porm.xml에 먼저 이것 부터 추가하고 시작한다.

    Proxy 라이브러리가 필요하므로 먼저 xml을 사용한다.

    이러면 자동완성 기능도 활성화 되기 때문에 여러므로 좋다.

     

     

    패키지에 필요한 Bean은 다음과 같다

    더보기

    Student.java

    package com.day03.Ex05;
    
    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.Ex05;
    
    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.Ex05;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    
    //공통기능
    public class LogAop {
    
    	//proxy
    	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));
    		}
    	}
    }

    지금 이 과정에서는 logAop.class를 통해서 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"
    	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">
    
    	<bean id="logAop" class="com.day03.Ex05.LogAop" />
    
    	<!-- AOP의존설정 -->
    	<aop:config>
    		<aop:aspect id="logger" ref="logAop">
    			<aop:pointcut id="publicM"
    				expression="within(com.day03.Ex05.*)" />
    			<aop:around pointcut-ref="publicM" method="loggerAop" />
    		</aop:aspect>
    	</aop:config>
    
    	<bean id="student" class="com.day03.Ex05.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.Ex05.Worker">
    		<property name="name" value="홍길동" />
    		<property name="age" value="15" />
    		<property name="job" value="도둑" />
    	</bean>
    
    </beans>

    xml에서 알다싶이 좀 많이 복잡하다.

    먼저 객체 등록을 하기 위해 bean을 먼저 사용하고

    그 아래에는 config를 사용한다.

     

    aspect는 해당 class를 참조한다는 의미이다.

    pointcut은 적용 범위를 정하며, 패키지를 통해 전체 지정 또한 할 수 있다.

    around는 aspect를 통해 참조 한 class 내의 method를 호출함으로써

     

    pointcut 범위 내에 있던 객체가 호출 될 때마다 전, 후 과정에 해당 작업이 실행된다.

    aop란 결국 JAVA가 원래 실행하는 도중에 과정을 포함을 시켜서

    실행 외의 작업이 실행되도록 하는 부가적인 설정이자 또는 다른 코드에 손 대는 것 없이 기능을 추가 할 수 있는 매우 특이하면서도 필요한 작업 과정이기도 하다.

     

     

    이 외에도 아래의 코드를 보면 좀 더 많은 추가를 할 수 있다는 것을 확인 할 수 있다.

    더보기

     

    LogAop.java

    package com.day03.Ex06;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    
    //공통기능
    public class LogAop {
    
    	//proxy
    	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));
    		}
    	}
    	
    	public void beforeAdvice(JoinPoint joinPoint)
    	{
    		System.out.println("beforeAdvice()");
    	}
    	
    	public void afterReturningAdvice() {
    		System.out.println("afterReturningAdvice()");
    	}
    	
    	public void afterThrowingAdvice() {
    		System.out.println("afterThrowingAdvice()");
    	}
    	
    	public void afterAdvice() {
    		System.out.println("afterAdvice()");
    	}
    }
    

     

    AdminDay03Ex06.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">
    
    	<bean id="logAop" class="com.day03.Ex06.LogAop" />
    
    	<!-- AOP의존설정 -->
    	<aop:config>
    		<aop:aspect id="logger" ref="logAop">
    			<aop:pointcut id="publicM"
    				expression="within(com.day03.Ex06.*)" />
    			<aop:around pointcut-ref="publicM" method="loggerAop" />
    		</aop:aspect>
    	</aop:config>
    
    	<aop:config>
    		<aop:aspect id="logger" ref="logAop">
    			<aop:pointcut id="publicM"
    				expression="within(com.day03.Ex06.*)" />
    			<aop:before pointcut-ref="publicM" method="beforeAdvice" />
    		</aop:aspect>
    	</aop:config>
    
    	<aop:config>
    		<aop:aspect id="logger" ref="logAop">
    			<aop:pointcut id="publicM"
    				expression="within(com.day03.Ex06.*)" />
    			<aop:after-returning pointcut-ref="publicM"
    				method="afterReturningAdvice" />
    		</aop:aspect>
    	</aop:config>
    	<aop:config>
    		<aop:aspect id="logger" ref="logAop">
    			<aop:pointcut id="publicM"
    				expression="within(com.day03.Ex06.*)" />
    			<aop:after-throwing pointcut-ref="publicM"
    				method="afterThrowingAdvice" />
    		</aop:aspect>
    	</aop:config>
    	<aop:config>
    		<aop:aspect id="logger" ref="logAop">
    			<aop:pointcut id="publicM"
    				expression="within(com.day03.Ex06.*)" />
    			<aop:after pointcut-ref="publicM" method="afterAdvice" />
    		</aop:aspect>
    	</aop:config>
    
    	<bean id="student" class="com.day03.Ex06.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.Ex06.Worker">
    		<property name="name" value="홍길동" />
    		<property name="age" value="15" />
    		<property name="job" value="도둑" />
    	</bean>
    
    </beans>

     

    MainClass.java

    package com.day03.Ex06;
    
    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:AdminDay03Ex06.xml");
    
    		Student student = ctx.getBean("student", Student.class);
    		student.getStudentInfo();
    
    		Worker worker = ctx.getBean("worker", Worker.class);
    		worker.getWorkerInfo();
    
    		ctx.close();
    
    	}
    
    }

     

     

     

    반응형

    댓글

    Designed by JB FACTORY