πŸ’»

μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬ - [Spring] AOP (2) / 곡톡 클래슀(Aspect), 곡톡 ν•¨μˆ˜(Advice), ν•΅μ‹¬μ½”λ“œ(JoinPoint) λ³Έλ¬Έ

KITRI/SPRING

μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬ - [Spring] AOP (2) / 곡톡 클래슀(Aspect), 곡톡 ν•¨μˆ˜(Advice), ν•΅μ‹¬μ½”λ“œ(JoinPoint)

λ˜νš¨λ‹ˆ 2020. 7. 27. 10:19

Advice λ™μž‘μ‹œμ 

λ™μž‘μ‹œμ 

μ„€λͺ…

Before

λ©”μ†Œλ“œ μ‹€ν–‰ 전에 λ™μž‘

After

λ©”μ†Œλ“œ μ‹€ν–‰ 후에 λ™μž‘

After-returning

λ©”μ†Œλ“œκ°€ μ •μƒμ μœΌλ‘œ μ‹€ν–‰λœ 후에 λ™μž‘

After-throwing

μ˜ˆμ™Έκ°€ λ°œμƒν•œ 후에 λ™μž‘

Around

λ©”μ†Œλ“œ 호좜 이전, 이후, μ˜ˆμ™Έλ°œμƒ λ“± λͺ¨λ“  μ‹œμ μ—μ„œ λ™μž‘

 


예제 μ‹€μŠ΅

 

[interface] Person.java

package com.java.aop03;

public interface Person {
	public void work();
}

 

Student.java

package com.java.aop03;

public class Student implements Person {

	@Override
	public void work() {
		System.out.println("학생은 곡뢀λ₯Ό ν•©λ‹ˆλ‹€.");
	}
}

 

Teacher.java

package com.java.aop03;

public class Teacher implements Person {	//ν•΅μ‹¬ν΄λž˜μŠ€

	@Override
	public void work() {	//핡심 ν•¨μˆ˜
		System.out.println("μ„ μƒλ‹˜μ€ κ°•μ˜λ₯Ό ν•©λ‹ˆλ‹€.");

	}
}

 

PAspect.java

package com.java.aop03;

import org.aspectj.lang.JoinPoint;

public class PAspect { // κ³΅ν†΅ν΄λž˜μŠ€(aspect)
	public void open(JoinPoint joinPoint) { //κ³΅ν†΅ν•¨μˆ˜(advice), ν•΅μ‹¬μ½”λ“œ(JoinPoint)
		System.out.println("μˆ˜μ—…μ‹œμž‘ -> κ°•μ˜μž₯에 λ“€μ–΄μ˜¨λ‹€.");
	}
	
	public void close(JoinPoint joinPoint) {
		System.out.println("μˆ˜μ—…λ -> κ°•μ˜μž₯을 λ‚˜κ°„λ‹€.");
	}
}

 

appCTX.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="teacher" class="com.java.aop03.Teacher"/>
	<bean id="student" class="com.java.aop03.Student"/>
	
	<!-- κ³΅ν†΅ν΄λž˜μŠ€ -->
	<bean id="pAspect" class="com.java.aop03.PAspect"/>
	
	<!-- AOP -->
	<aop:config>
		<aop:aspect id="aspect" ref="pAspect">
			<aop:pointcut expression="within(com.java.aop03.*)" id="pMethod"/>
			
			<aop:before method="open" pointcut-ref="pMethod"/>
			<aop:after method="close" pointcut-ref="pMethod"/>
		</aop:aspect>
	</aop:config>
</beans>

 

MainClass.java

package com.java.aop03;

import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {

	public static void main(String[] args) {
		GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:com/java/aop03/appCTX.xml");
		Person student = (Person) ctx.getBean("student");
		student.work();
		System.out.println();
		
		Person teacher = (Person) ctx.getBean("teacher");
		teacher.work();
		System.out.println();
	}
}

 

μ‹€ν–‰κ²°κ³Ό


μ—λŸ¬ λ°œμƒ μ‹œν‚€κΈ°

 

 

PAspect.java

package com.java.aop03;

import org.aspectj.lang.JoinPoint;

public class PAspect { // κ³΅ν†΅ν΄λž˜μŠ€(aspect)
	//핡심전
	public void open(JoinPoint joinPoint) { //κ³΅ν†΅ν•¨μˆ˜(advice), ν•΅μ‹¬μ½”λ“œ(JoinPoint)
		System.out.println("μˆ˜μ—…μ‹œμž‘ -> κ°•μ˜μž₯에 λ“€μ–΄μ˜¨λ‹€.");
	}
	//핡심후
	public void close(JoinPoint joinPoint) {
		System.out.println("μˆ˜μ—…λ -> κ°•μ˜μž₯을 λ‚˜κ°„λ‹€.");
	}
	//μ—λŸ¬
	public void error(JoinPoint joinPoint) {
		System.out.println("λ– λ“€μ–΄ κ°•μ˜μ—μ„œ 쫓겨남..흑 μ‹κΆŒλ„μ—†μŒ!");
	}
	//정상
	public void eat(JoinPoint joinPoint) {
		System.out.println("점심식사λ₯Ό λ§›λ‚˜κ²Œ 함!!");
	}
}

 

appCTX.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="teacher" class="com.java.aop03.Teacher"/>
	<bean id="student" class="com.java.aop03.Student"/>
	
	<!-- κ³΅ν†΅ν΄λž˜μŠ€ -->
	<bean id="pAspect" class="com.java.aop03.PAspect"/>
	
	<!-- AOP -->
	<aop:config>
		<aop:aspect id="aspect" ref="pAspect">
			<aop:pointcut expression="within(com.java.aop03.*)" id="pMethod"/>
			
			<aop:before method="open" pointcut-ref="pMethod"/>
			<aop:after method="close" pointcut-ref="pMethod"/>
			
			<aop:after-returning method="eat" pointcut-ref="pMethod"/>
			<aop:after-throwing method="error" pointcut-ref="pMethod"/>
		</aop:aspect>
	</aop:config>
</beans>

 

Student.java

package com.java.aop03;

import java.util.Scanner;

public class Student implements Person {

	@Override
	public void work() {
		System.out.println("학생은 곡뢀λ₯Ό ν•©λ‹ˆλ‹€.");
		
		Scanner sc = new Scanner(System.in);
		
		System.out.println("μˆ˜μž…λ ₯: ");
		int su = sc.nextInt();
		
		if(su==5) System.out.println(su/0);
		
		sc.close();
	}
}

 

 

 

+ λ‹€λ₯Έ 방법

 

PAspect.java

package com.java.aop04;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

public class PAspect { // κ³΅ν†΅ν΄λž˜μŠ€(aspect)
	
	public void sub(ProceedingJoinPoint joinPoint) {
		try {
			//ν•΅μ‹¬ν•¨μˆ˜μ „
			System.out.println("μˆ˜μ—…μ‹œμž‘ -> κ°•μ˜μž₯에 λ“€μ–΄μ˜¨λ‹€.");
			
			//ν•΅μ‹¬μ½”λ“œ
			joinPoint.proceed();
			
			//정상
			System.out.println("점심식사λ₯Ό λ§›λ‚˜κ²Œ 함!!");
		} catch (Throwable e) {
			//μ—λŸ¬
			System.out.println("λ– λ“€μ–΄ κ°•μ˜μ—μ„œ 쫓겨남..흑 μ‹κΆŒλ„μ—†μŒ!");
		} finally {
			//ν•΅μ‹¬ν•¨μˆ˜ ν›„
			System.out.println("μˆ˜μ—…λ -> κ°•μ˜μž₯을 λ‚˜κ°„λ‹€.");
		}
	}
}

appCTX.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="teacher" class="com.java.aop04.Teacher"/>
	<bean id="student" class="com.java.aop04.Student"/>
	
	<!-- κ³΅ν†΅ν΄λž˜μŠ€ -->
	<bean id="pAspect" class="com.java.aop04.PAspect"/>
	
	<!-- AOP -->
	<aop:config>
		<aop:aspect id="aspect" ref="pAspect">
			<aop:pointcut expression="within(com.java.aop04.*)" id="pMethod"/>
			<aop:around method="sub" pointcut-ref="pMethod"/>
		</aop:aspect>
	</aop:config>
</beans>

MainClass.java

package com.java.aop04;

import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {

	public static void main(String[] args) {
		GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:com/java/aop04/appCTX.xml");
		Person student = (Person) ctx.getBean("student");
		student.work();
		System.out.println();
		
		Person teacher = (Person) ctx.getBean("teacher");
		teacher.work();
		System.out.println();
	}
}

μœ„μ˜ 방식과 λ™μΌν•œ κ²°κ³Όμ°½

λ°˜μ‘ν˜•
Comments