๐ป
์คํ๋ง ํ๋ ์์ํฌ - [Spring] AOP(Aspect Oriented Programming) (1) ๋ณธ๋ฌธ
์คํ๋ง ํ๋ ์์ํฌ - [Spring] AOP(Aspect Oriented Programming) (1)
๋ํจ๋ 2020. 7. 24. 17:01AOP(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๊ฐ ์คํ๋ ์ง์ ์ ์ ํ ์ ์์ |
[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();
}
}