๐Ÿ’ป

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ - [Spring] AOP(Aspect Oriented Programming) (1) ๋ณธ๋ฌธ

KITRI/SPRING

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ - [Spring] AOP(Aspect Oriented Programming) (1)

๋˜ํšจ๋‹ˆ 2020. 7. 24. 17:01

AOP(Aspect Oriented Programming) ๋ž€?

 ๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ด๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค. ๊ด€์  ์ง€ํ–ฅ์€ ์‰ฝ๊ฒŒ ๋งํ•ด ์–ด๋–ค ๋กœ์ง์„ ๊ธฐ์ค€์œผ๋กœ ํ•ต์‹ฌ์ ์ธ ๊ด€์ , ๋ถ€๊ฐ€์ ์ธ ๊ด€์ ์œผ๋กœ ๋‚˜๋ˆ„์–ด์„œ ๋ณด๊ณ  ๊ทธ ๊ด€์ ์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐ๊ฐ ๋ชจ๋“ˆํ™”ํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ๋ชจ๋“ˆํ™”๋ž€ ์–ด๋–ค ๊ณตํ†ต๋œ ๋กœ์ง์ด๋‚˜ ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ๋ฌถ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. 

- ์—ฌ๋Ÿฌ ๊ฐ์ฒด์— ๊ณตํ†ต์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•ด์„œ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์—ฌ์ฃผ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•

- AOP๋Š” ํ•ต์‹ฌ๊ธฐ๋Šฅ๊ณผ ๊ณตํ†ต ๊ธฐ๋Šฅ์˜ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ์˜ ์ˆ˜์ •์—†์ด ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค.

- Aspect๋ผ๋Š” ๋ง์€ ๊ตฌ๋ถ„๋˜๋Š” ๊ธฐ๋Šฅ์ด๋‚˜ ์š”์†Œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

=> ์ฆ‰, ํ•ต์‹ฌ ๊ธฐ๋Šฅ์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ๊ณตํ†ต๊ธฐ๋Šฅ์˜ ๊ตฌํ˜„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ

โ€‹

๋ฐฉ๋ฒ• 1) ์ปดํŒŒ์ผ ์‹œ์ ์— ์ฝ”๋“œ์— ๊ณตํ†ต๊ธฐ๋Šฅ์„ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•

๋ฐฉ๋ฒ• 2) ํด๋ž˜์Šค ๋กœ๋”ฉ ์‹œ์ ์— ๋ฐ”์ดํŠธ ์ฝ”๋“œ์— ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•

๋ฐฉ๋ฒ• 3) ๋Ÿฐํƒ€์ž„์— ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•

 

Aspect?

- Aspect๋ผ๋Š” ๋ง์€ ๊ตฌ๋ถ„๋˜๋Š” ๊ธฐ๋Šฅ์ด๋‚˜ ์š”์†Œ๋ฅผ ์˜๋ฏธ

- ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ์ •์˜ํ•œ ์ฝ”๋“œ์ธ ์–ด๋“œ๋ฐ”์ด์Šค(Advice)์™€ ์–ด๋””๋ฐ”์ด์Šค๋ฅผ ์–ด๋””์— ์ ์šฉํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ํฌ์ธํŠธ ์ปท(PointCut)์„ ํ•ฉ์นœ ๊ฐœ๋…์ด๋‹ค.

โ€‹

Advice+PointCut = Aspect

- AOP ๊ฐœ๋…์„ ์ ์šฉํ•˜๋ฉด ํ•ต์‹ฌ๊ธฐ๋Šฅ ์ฝ”๋“œ ์‚ฌ์ด์— ์นจํˆฌ๋œ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ๋…๋ฆฝ์ ์ธ ์• ์ŠคํŽ™ํŠธ๋กœ ๊ตฌ๋ถ„ํ•ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

- ๊ตฌ๋ถ„๋œ ๋ถ€๊ฐ€๊ธฐ๋Šฅ ์• ์ŠคํŽ™ํŠธ๋ฅผ ๋Ÿฐํƒ€์ž„ ์‹œ์— ํ•„์š”ํ•œ ์œ„์น˜์— ๋™์ ์œผ๋กœ ์ฐธ์—ฌํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

โ€‹

๋ฐฉ๋ฒ• 1) ์ปดํŒŒ์ผ ์‹œ์ ์— ์ฝ”๋“œ์— ๊ณตํ†ต๊ธฐ๋Šฅ์„ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•

๋ฐฉ๋ฒ• 2) ํด๋ž˜์Šค ๋กœ๋”ฉ ์‹œ์ ์— ๋ฐ”์ดํŠธ ์ฝ”๋“œ์— ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•

๋ฐฉ๋ฒ• 3) ๋Ÿฐํƒ€์ž„์— ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•

 

AOP ์ฃผ์š” ๊ฐœ๋…

์šฉ์–ด ์˜๋ฏธ
Aspect  ์œ„์—์„œ ์„ค๋ช…ํ•œ ํฉ์–ด์ง„ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ชจ๋“ˆํ™” ํ•œ ๊ฒƒ. ์ฃผ๋กœ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ๋ชจ๋“ˆํ™”ํ•จ.
Weavinhg Advice๋ฅผ ํ•ต์‹ฌ ๋กœ์ง ์ฝ”๋“œ์— ์ ์šฉํ•˜๋Š” ๊ฒƒ.
Target  Aspect๋ฅผ ์ ์šฉํ•˜๋Š” ๊ณณ (ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ .. )
Advice  ์‹ค์งˆ์ ์œผ๋กœ ์–ด๋–ค ์ผ์„ ํ•ด์•ผํ•  ์ง€์— ๋Œ€ํ•œ ๊ฒƒ, ์‹ค์งˆ์ ์ธ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ๋‹ด์€ ๊ตฌํ˜„์ฒด
JointPoint  Advice๋ฅผ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ์ง€์ . ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ, ํ•„๋“œ ๊ฐ’ ๋ณ€๊ฒฝ ๋“ฑ์ด Joinpoint์— ํ•ด๋‹นํ•œ๋‹ค. ์Šคํ”„๋ง์€ ํ”„๋ก์‹œ๋ฅผ ์ด์šฉํ•ด์„œ AOP๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์— ๋Œ€ํ•œ Joinpoint๋งŒ ์ง€์›ํ•œ๋‹ค.

Advice๊ฐ€ ์ ์šฉ๋  ์œ„์น˜, ๋ผ์–ด๋“ค ์ˆ˜ ์žˆ๋Š” ์ง€์ . ๋ฉ”์„œ๋“œ ์ง„์ž… ์ง€์ , ์ƒ์„ฑ์ž ํ˜ธ์ถœ ์‹œ์ , ํ•„๋“œ์—์„œ ๊ฐ’์„ ๊บผ๋‚ด์˜ฌ ๋•Œ ๋“ฑ ๋‹ค์–‘ํ•œ ์‹œ์ ์— ์ ์šฉ๊ฐ€๋Šฅ

PointCut  JointPoint์˜ ์ƒ์„ธํ•œ ์ŠคํŽ™์„ ์ •์˜ํ•œ ๊ฒƒ. 'A๋ž€ ๋ฉ”์„œ๋“œ์˜ ์ง„์ž… ์‹œ์ ์— ํ˜ธ์ถœํ•  ๊ฒƒ'๊ณผ ๊ฐ™์ด ๋”์šฑ ๊ตฌ์ฒด์ ์œผ๋กœ Advice๊ฐ€ ์‹คํ–‰๋  ์ง€์ ์„ ์ •ํ•  ์ˆ˜ ์žˆ์Œ

 


 

.xml ํŒŒ์ผ ์ƒ์„ฑํ• ๋•Œ ๊ผญ ์ฒดํฌํ•ด์ฃผ๊ธฐ

 

 

[Interface]Person.java

package com.java.aop01;

public interface Person {
	public void awake();
	
	public void work();
	
	public void sleep();
	
}

 

Baby.java

package com.java.aop01;

public class Baby implements Person {

	@Override
	public void awake() {
		System.out.println("์ผ์–ด๋‚œ๋‹ค.");
	}

	@Override
	public void work() {
		System.out.println("์œ ์น˜์›์— ๊ฐ„๋‹ค.");
	}

	@Override
	public void sleep() {
		System.out.println("์ž ์„์ž”๋‹ค.");	
	}
}

 

Mama.java

package com.java.aop01;

public class Mama implements Person {

	@Override
	public void awake() {
		System.out.println("์ผ์–ด๋‚œ๋‹ค.");
	}

	@Override
	public void work() {
		System.out.println("์ง‘์•ˆ์ผ ํ•œ๋‹ค.");	
	}

	@Override
	public void sleep() {
		System.out.println("์ž ์„์ž”๋‹ค.");
	}

}

 

Papa.java

package com.java.aop01;

public class Papa implements Person {

	@Override
	public void awake() {
		System.out.println("์ผ์–ด๋‚œ๋‹ค.");
	}

	@Override
	public void work() {
		System.out.println("ํšŒ์‚ฌ๊ฐ„๋‹ค.");
	}

	@Override
	public void sleep() {
		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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="baby" class="com.java.aop01.Baby"/>
	<bean id="papa" class="com.java.aop01.Papa"/>
	<bean id="mama" class="com.java.aop01.Mama"/>
</beans>

 

MainClass.java

package com.java.aop01;

import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {

	public static void main(String[] args) {
		GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:com/java/aop01/appCTX.xml");
		
		//์•„๋น 
		//Papa๋กœ ๊ฐ์ฒด ์ƒ์„ฑํ•ด๋„ ๋˜์ง€๋งŒ, ์ธํ„ฐํŽ˜์ด์Šค๊ธฐ๋ฐ˜์ด๋ฏ€๋กœ Person์œผ๋กœ ๊ฐ์ฒด ์ƒ์„ฑ
		Person papa = (Person)ctx.getBean("papa");
		papa.awake();
		papa.work();
		papa.sleep();
		System.out.println();
		
		//์—„๋งˆ
		Person mama = (Person)ctx.getBean("mama");
		mama.awake();
		mama.work();
		mama.sleep();
		System.out.println();
		
		//์•„๊ธฐ
		Person baby = (Person)ctx.getBean("baby");
		baby.awake();
		baby.work();
		baby.sleep();

		ctx.close();
	}
}

 

๊ณตํ†ตํ•จ์ˆ˜๋ฅผ aspect ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ž‘์„ฑ

 

[Interface]Person.java

package com.java.aop01;

public interface Person {

	public void work();
}

 

Baby.java

package com.java.aop02;

public class Baby implements Person {

	@Override
	public void work() {
		System.out.println("์œ ์น˜์› ๋“ฑ๊ต");
	}
}

 

Mama.java

package com.java.aop02;

public class Mom implements Person {

	@Override
	public void work() {
		System.out.println("์ง‘์•ˆ์ผ");
	}
}

 

Papa.java

package com.java.aop02;

public class Papa implements Person {

	@Override
	public void work() {
		System.out.println("ํšŒ์‚ฌ๋ฅผ ๊ฐ„๋‹ค.");
	}
}

 

PASpect.java

package com.java.aop02;

import org.aspectj.lang.JoinPoint;

public class PASpect {		// ๊ณตํ†ตํด๋ž˜์Šค	: aspect ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
	public void awake(JoinPoint joinPoint) {	// ๊ณตํ†ตํ•จ์ˆ˜	: advice ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
		// joinPoint์˜ ์—ญํ• ์€ ํ•ต์‹ฌ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. 
		System.out.println("์ผ์–ด๋‚œ๋‹ค.");
	}
	
	public void sleep(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="baby" class="com.java.aop02.Baby"/>
	<bean id="papa" class="com.java.aop02.Papa"/>
	<bean id="mama" class="com.java.aop02.Mama"/>
	
	<!-- ๊ณตํ†ต์ฝ”๋“œ -->
	<bean id="pAspect" class="com.java.aop02.PASpect"/>
	
	<!-- AOP -->
	<aop:config>
		<!-- ๊ณตํ†ตํด๋ž˜์Šค  -->
		<aop:aspect id="exAspect" ref="pAspect"> 
			<!--ํ•ต์‹ฌํด๋ž˜์Šค -->
			<aop:pointcut id="publicM" expression="within(com.java.aop02.*)" />
			
			<aop:before method="awake" pointcut-ref="publicM"/>
			<aop:after method="sleep" pointcut-ref="publicM"/> 
		</aop:aspect>
	</aop:config>
</beans>

 

MainClass.java

package com.java.aop02;

import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {

	public static void main(String[] args) {
		GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:com/java/aop02/appCTX.xml");
		
		//์•„๋น 
		//Papa๋กœ ๊ฐ์ฒด ์ƒ์„ฑํ•ด๋„ ๋˜์ง€๋งŒ, ์ธํ„ฐํŽ˜์ด์Šค๊ธฐ๋ฐ˜์ด๋ฏ€๋กœ Person์œผ๋กœ ๊ฐ์ฒด ์ƒ์„ฑ
		Person papa = (Person)ctx.getBean("papa");
		papa.work();
		System.out.println();
		
		//์—„๋งˆ
		Person mama = (Person)ctx.getBean("mama");
		mama.work();
		System.out.println();
		
		//์•„๊ธฐ
		Person baby = (Person)ctx.getBean("baby");
		baby.work();
		ctx.close();
	}
}

๋ฐ˜์‘ํ˜•
Comments