본문 바로가기

SPRING

AOP (1) - XML Schema

AOP란?


 - Aspect Oriented Programming : 관점 지향 프로그래밍

 - 공통 기능을 핵심 기능과 분리한 후, 핵심 기능에 필요한 공통 기능을 적용


AOP 관련 용어


 - Aspect : 공통 기능

 - Advice : Aspect의 기능 자체. 세세한 개별 기능들.

 - Joinpoint : Advice를 적용할 부분 (스프링에서는 method만 해당). 핵심 기능들을 지칭함

 - Pointcut : Joinpoint의 일부로 실제로 Advice가 적용된 부분

 - Weaving : Advice를 핵심기능에 적용하는 행위


SPRING에서의 AOP 구현 방식


 - Client에서 기능이 호출됨 

 - Proxy를 통해 공통 기능이 수행됨

 - Target에서 호출된 기능이 수행됨

 

 XML 스키마, @Aspect 어노테이션을 이용하여 구현할 수 있음


XML Schema를 사용한 간단한 예제


1) POM.xml 에 의존 라이브러리 추가

		
			org.aspectj
			aspectjweaver
			1.6.10
		

2) applicationCTX.xml

<?xml version="1.0" encoding="UTF-8"?>


	<bean id="logAop" class="com.ska.ex.LogAop" />
	
	
		
			<aop:pointcut id="publicM" expression="within(com.ska.ex.*)" />
			<aop:around pointcut-ref="publicM" method="loggerAop" />
		
	
	
	
		<property name="name" value="frederic" />
		<property name="major" value="Java" />
	
	
	
		<property name="name" value="chopin" />
		<property name="job" value="Pianist" />
	

3) LogAop.java

public class LogAop {
	public Object loggerAop(ProceedingJoinPoint joinpoint) throws Throwable {
		String signatureStr = joinpoint.getSignature().toShortString();
		System.out.println(signatureStr + " has been started");
		
		long timeStart = System.currentTimeMillis();
		
		try {
			Object obj = joinpoint.proceed();
			return obj;
		} finally {
			long timeEnd = System.currentTimeMillis();
			System.out.println(signatureStr + " has been finished");
			System.out.println(signatureStr + " time elapsed : " + (timeEnd - timeStart));
		}
	}
}

4) MainClass.java

public class MainClass {
	public static void main(String[] args) {		
		AbstractApplicationContext ctx = new GenericXmlApplicationContext("classpath:applicationCTX.xml");
		
		Student student = ctx.getBean("student", Student.class);
		Worker worker = ctx.getBean("worker", Worker.class);
		student.getInfo();
		worker.getInfo();
		
		ctx.close();
	}
}

5) Student.java

public class Student {
	private String name;
	private String major;
	
	public void getInfo() {
		System.out.println("--- Student Info ---");
		System.out.println("name : " + this.name);
		System.out.println("major: " + this.major);
	}

	//getters and setters
	public String getName() {return name;}
	public void setName(String name) {this.name = name;}
	public String getMajor() {return major;}
	public void setMajor(String major) {this.major = major;}
}

6) Worker.java

public class Worker {
	private String name;
	private String job;
	
	public void getInfo() {
		System.out.println("---  Worker Info  ---");
		System.out.println("name : " + this.name);
		System.out.println("job  : " + this.job);
	}

	//getters and setters
	public String getName() {return name;}
	public void setName(String name) {this.name = name;}
	public String getJob() {return job;}
	public void setJob(String job) {this.job = job;}

}

Result

Student.getInfo() has been started
--- Student Info ---
name : frederic
major: Java
Student.getInfo() has been finished
Student.getInfo() time elapsed : 11
Worker.getInfo() has been started
---  Worker Info  ---
name : chopin
job  : Pianist
Worker.getInfo() has been finished
Worker.getInfo() time elapsed : 7

Summary


Additional ) AOP tags

 <aop:before>

 메소드 실행 전 advice 실행

 <aop:after-returning>

 정상적으로 메소드 실행 후 advice 실행

 <aop:after-throwing>

 메소드 실행 중 exception 발생 시 advice 실행

 <aop:after>

 메소드 실행 중 exception이 발생해도 advice 실행

 <aop:around>

 메소드 실행 전/후 및 exception 발생 시 advice 실행