์คํ๋ง์ ํน์ง์ 5๊ฐ์ง๋ก ๋๋๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋๋ ์ ์์ต๋๋ค.
- ๊ฒฝ๋ ์ปจํ ์ด๋
- DI(Dependency Injection, ์์กด์ฑ ์ฃผ์ )
- IoC(์ ์ด์ ์ญํ๋ฆ, Inversion of Control)
- AOP(๊ด์ ์งํฅํ๋ก๊ทธ๋๋ฐ, Aspect oriented Programming)
- POJO ๋ฐฉ์์ ํ๋ ์์ํฌ
๊ทธ ์ค ์ด๋ฒ ๊ธ์์๋ AOP(๊ด์ ์งํฅํ๋ก๊ทธ๋๋ฐ)์ ๋ํด ์์๋ณด๋ ค๊ณ ํฉ๋๋ค.
l AOP๋ ์ ํ์ํ ๊น?
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๋ค ๋ณด๋ฉด ํดํน์ ๋๋นํ๊ธฐ ์ํ ๋ณด์ ๊ธฐ๋ฅ, ์ฌ์ฉ์์ ์ ์ ๋ด์ญ์ ์ํ ๋ก๊น ๊ธฐ๋ฅ ๊ทธ์ธ์ ํธ๋์ญ์ , ์ด๋ฉ์ผ ๋ฐ์ก ๊ธฐ๋ฅ ๋ฑ ์๋ง์ ๊ธฐ๋ฅ๋ค์ด ์์ต๋๋ค. ์ด๋ค์ ๊ณตํต์ ์ ๋ฌด์์ผ๊น์? ๋ชจ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ๋ ๊ณตํต์ ์ผ๋ก ํ์ํ ๊ธฐ๋ฅ๋ค ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ถ๋ถ์ ํด๋์ค๋ค์ด ์ด๋ฌํ ๊ธฐ๋ฅ์ ํ์๋ก ํฉ๋๋ค.
ํ์ง๋ง ๊ฐ ํด๋์ค๋ง๋ค ์ด๋ฌํ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ์๋ ์ฌ์ค ๋ถ๊ฐ๋ฅํฉ๋๋ค. ํ์ฌ ๋ณด์ ๊ธฐ๋ฅ ์ฝ๋๋ฅผ ์์ ํด์ผ ํ๋ค๋ฉด, ๋ณด์ ๊ธฐ๋ฅ์ด ์๋ ๋ชจ๋ ํด๋์ค๋ฅผ ์ฐพ์ ๋ณด์ ๊ธฐ๋ฅ ์ฝ๋๋ฅผ ์์ ํด์ค์ผ ํฉ๋๋ค.
์ด๋ฌํ ๋ถํธํจ์ ์์ ๊ธฐ ์ํด ์คํ๋ง์ AOP ๋ผ๋ ๊ฐ๋ ์ ์ฌ์ฉํฉ๋๋ค. ๊ฒฐ๊ตญ DI์ IoC์ฒ๋ผ AOP๋ ๊ฐ๋ฐ์๋ค์ ๋ถํธํจ์ ํด์ํ๊ธฐ ์ํ์ฌ ๋ฑ์ฅํ ๊ฒ์ด์ง์.
l AOP๋ ๋ฌด์์ผ๊น?
AOP๋ ๋ฉ์๋ ์์ ์ฃผ๊ธฐ๋ฅ๊ณผ ๋ณด์กฐ ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํ ํ ์ ํ์ ์ผ๋ก ๋ฉ์๋์ ์ ์ฉํด์ ์ฌ์ฉํ๋ค๋ ๊ฐ๋ ์ผ๋ก ์ ์ ํ ์ ์์ต๋๋ค. AOP๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ํด๋์ค์ ํฉ์ด์ ธ ์๋ ๊ณตํต๊ธฐ๋ฅ๋ค์ ํ๋์ ์ฅ์์ ๋ชจ์์ ๊ด๋ฆฌํ ์ ์๊ฒ ๋ฉ๋๋ค.
์ฉ์ด | ์ค๋ช |
aspect | ๊ตฌํํ๊ณ ์ ํ๋ ๋ณด์กฐ ๊ธฐ๋ฅ์ ์๋ฏธํฉ๋๋ค. |
โ adviceโ | aspect์ ์ค์ ํด๋์ค๋ฅผ ์๋ฏธํฉ๋๋ค. ์ฆ ๊ตฌํํ๊ณ ์ ํ๋ ๋ณด์กฐ ๊ธฐ๋ฅ์ ์ค์ฒด ํด๋์ค์ ๋๋ค. |
joinpoint | advice๋ฅผ ์ ์ฉํ๋ ์ง์ ์ ์๋ฏธํฉ๋๋ค. ์คํ๋ง์ method ๊ฒฐํฉ์ ๋ง ์ ๊ณตํฉ๋๋ค. |
pointcut | advice๊ฐ ์ ์ฉ๋๋ ๋์์ ์ง์ ํฉ๋๋ค. ํจํค์ง์ด๋ฆ/ํด๋์ค์ด๋ฆ/๋ฉ์๋์ด๋ฆ์ ์ ๊ท์์ผ๋ก ์ง์ ํ์ฌ ์ฌ์ฉํฉ๋๋ค. |
โ targetโ | advcie๊ฐ ์ ์ฉ๋๋ ํด๋์ค๋ฅผ ์๋ฏธํฉ๋๋ค. |
weaving | advice๋ฅผ ์ฃผ๊ธฐ๋ฅ์ ์ ์ฉํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. |
l AOP๋ฅผ ์ด์ฉํ์ฌ ์ค์ต
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean id="calcTarget" class="com.spring.ex03.Caculator">
<property name="add">
<value>๋ํ๊ธฐ</value>
</property>
</bean>
<bean id="logAdvice" class="com.spring.ex03.LoggingAdvice" />
<bean id="proxyCal"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="calcTarget"/>
<property name="interceptorNames">
<list>
<value>logAdvice</value>
</list>
</property>
</bean>
</beans>
๋น์ ํ๋ํ๋ ์ค๋ช ํด๋๋ฆฌ๊ฒ ์ต๋๋ค.
(๋น์ด๋? ์คํ๋ง์์ DI๋ฅผ ์ํ์ฌ ํด๋์ค์ ํด๋์ค ๊ฐ์ฒด๋ฅผ ์ฃผ์ ์์ผ์ฃผ๋๋ฐ ์ด ํด๋์ค๋ฅผ ๊ฐ์ฒด๋ฅผ ๋น์ด๋ผ๊ณ ํฉ๋๋ค.)
calTarget ๋น
proxyCal ๋น์์ name="target" ํจ์ผ๋ก์จ advice๊ฐ ์ ์ฉ๋ ํด๋์ค๋ฅผ ์ค์ ํด์ฃผ์์ต๋๋ค. ์ ์ฉ๋ ํด๋์ค๋ bean class์ธ com.spring.ex03.Caculator์ ๋๋ค.
property๋ฅผ ์ค์ ํด์ฃผ์ด Caculator์ setter์์ ๋น ๊ฐ์ฒด๋ฅผ ๋ฐ์์ ์๊ฒ ํด์ฃผ์์ต๋๋ค.
logAdvice ๋น
๋ก๊น ๊ธฐ๋ฅ์ ํ๋ advice ๋น์ ์ง์ ํฉ๋๋ค.
proxyCal ๋น
์ฒซ๋ฒ์งธ property๋ ref="calcTarget"๋ฅผ ํ์ฌ Caculator ํด๋์ค๋ฅผ ์ฐธ์กฐํ ์ ์๊ฒ ํด์ฃผ์๊ณ , ์ด๋ฅผ ํ๊น ํด๋์ค๋ก ์ง์ ํ์์ต๋๋ค.
(ํ๊น ํด๋์ค๋ advice๋ฅผ ์ ์ฉํด์ค ํด๋์ค์ ๋๋ค.)
๋๋ฒ์งธ property๋ logAdvice๋ฅผ advice ๋น์ผ๋ก ์ค์ ํ์ฌ ํ๊น ํด๋์ค ํธ์ถ์ logAdvice๊ฐ ์คํ๋๋๋ก ํฉ๋๋ค.
package com.spring.ex03;
public class Caculator {
private String add;
public void setAdd(String add) {
this.add = add;
}
public void add(int x, int y) {
int result=x+y;
System.out.println("bean์ Value : " + add);
System.out.println("๊ฒฐ๊ณผ:"+ result);
}
public void subtract(int x, int y) {
int result=x - y;
System.out.println("๊ฒฐ๊ณผ:"+ result);
}
public void multiply(int x, int y) {
int result=x * y;
System.out.println("๊ฒฐ๊ณผ:"+ result);
}
public void divide(int x, int y) {
int result=x / y;
System.out.println("๊ฒฐ๊ณผ:"+ result);
}
}
setter ํจ์๋ ๋ฐ๋์ bean์ property ์ด๋ฆ์ผ๋ก ํด์ฃผ์ด์ผํฉ๋๋ค. ๋ง์ฝ name="test" ์๋ค๋ฉด setter ํจ์์ ํจ์๋ช ์ setTest๊ฐ ๋์ด์ผ ํฉ๋๋ค.
package com.spring.ex03;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class LoggingAdvice implements MethodInterceptor {
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("[๋ฉ์๋ ํธ์ถ ์ : LogginAdvice");
System.out.println(invocation.getMethod() + "๋ฉ์๋ ํธ์ถ ์ ");
Object object = invocation.proceed();
System.out.println("[๋ฉ์๋ ํธ์ถ ํ : loggingAdvice");
System.out.println(invocation.getMethod() + "๋ฉ์๋ ํธ์ถ ํ");
return object;
}
}
invoke ํจ์๋ invocation.proceed ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฉ์๋ ํธ์ถ ์ ์ ์ํํ๋ ๊ตฌ๋ฌธ๊ณผ ๋ฉ์๋ ํธ์ถ ํ ์ํํ๋ ๊ตฌ๋ฌธ์ผ๋ก ๋๋์ด ์ฝ์์ ๋ก๊ทธ๋ฅผ ์ฐ์ด์ค๋๋ค. ์๋ง ๋ฐ์์ ์ฌ์ง์ผ๋ก ๋ณด์๋ฉด ์ดํด๊ฐ ๋ ๋น ๋ฅด์ค ๊ฒ๋๋ค.
package com.spring.ex03;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class CalcTest {
public static void main(String[] args){
ApplicationContext context=new ClassPathXmlApplicationContext("AOPTest.xml");
Caculator cal=(Caculator)context.getBean("proxyCal");
cal.add(100,20);
}
}
ApplicationContext ํด๋์ค๋ฅผ ์ด์ฉํ์ฌ ๋น ์ค์ ์ด ๋์ด์๋ xml ํ์ผ์ ๋ก๋ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ getBean์ ์ด์ฉํ์ฌ ๋น ๊ฐ์ฒด๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
cal.add(100,20)๋ฅผ ํด์ค์ผ๋ก์จ ๋น ๊ฐ์ฒด๋ฅผ ์ ๋ถ๋ฌ์๋์ง ํ์ธํด์ค๋๋ค.
์ฝ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ๋ฉ์๋ ํธ์ถ์ , ํด๋์ค ๋ด์ฉ, ๋ฉ์๋ ํธ์ถํ ์ด๋ ๊ฒ ๋ก๊ทธ๋ด์ญ์ด ์๋ ๊ฑธ ํ์ธํ์ค ์ ์์ต๋๋ค.
l ์์ฝ
AOP ๋ํ DI, IoC ์ฒ๋ผ ๊ฒฐ๊ตญ ์ ์ง๋ณด์๋ฅผ ๋ณด๋ค ํธํ๊ฒ ํด์ฃผ๊ธฐ ์ํ์ฌ ์๊ธด ๊ฐ๋ ์ ๋๋ค. AOP๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณด๋ค ์ฝ๊ฒ ๊ณตํต ๊ธฐ๋ฅ๋ค์ ํ ๊ณณ์ ๋ชจ์ ๊ด๋ฆฌ ํ ์ ์์ต๋๋ค.
- target : advice๋ฅผ ์ ์ฉํด์ค ํด๋์ค
- advice : ๋ณด์กฐ ๊ธฐ๋ฅ(aspect)์ ๊ตฌํํ ์ค์ ํด๋์ค
์ฐธ๊ณ ๋์
[์๋ฐ ์น์ ๋ค๋ฃจ๋ ๊ธฐ์ (๊ธธ๋ฒ)]
[๋ฐฐ์์ ๋ฐ๋ก ์ฐ๋ ์คํ๋ง ํ๋ ์์ํฌ(ํ๋น๋ฏธ๋์ด)]
์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์ง๋ฌธ์ ์ธ์ ๋ ํ์ํฉ๋๋ค.
"๋ ๋ฐ๋์ ๋ฐฑ์๋ ์์ด ๋ ๊ฑฐ์ผ"
'...' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JS] javascript:void(0) ์ฌ์ฉํ๋ ์ด์ (0) | 2021.01.07 |
---|---|
[MyBatis] MyBatis ์์ํ๊ธฐ (0) | 2021.01.06 |
[Spring] ์คํ๋ง DI, IoC ์ดํดํ๊ธฐ (4) | 2021.01.02 |
[Java] equals() == ์ฐจ์ด ์ฝ๊ฒ ์ดํดํ๊ธฐ (2) | 2020.12.31 |
[Java] HashMap ์ฌ์ฉํ๊ธฐ (0) | 2020.12.30 |