๋กœ์ผ“๐Ÿพ
article thumbnail

 

0.0.1. ์Šคํ”„๋ง์˜ ํŠน์ง•์„ 5๊ฐ€์ง€๋กœ ๋‚˜๋ˆˆ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

0.0.2.  

  • ๊ฒฝ๋Ÿ‰ ์ปจํ…Œ์ด๋„ˆ
  • DI(Dependency Injection, ์˜์กด์„ฑ ์ฃผ์ž…)
  • IoC(์ œ์–ด์˜ ์—ญํ๋ฆ„, Inversion of Control)
  • AOP(๊ด€์ ์ง€ํ–ฅํ”„๋กœ๊ทธ๋ž˜๋ฐ, Aspect oriented Programming)
  • POJO ๋ฐฉ์‹์˜ ํ”„๋ ˆ์ž„์›Œํฌ

0.0.3. ๊ทธ ์ค‘ ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” AOP(๊ด€์ ์ง€ํ–ฅํ”„๋กœ๊ทธ๋ž˜๋ฐ)์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 


1. l AOP๋Š” ์™œ ํ•„์š”ํ• ๊นŒ?

 

1.0.1. ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค๋‹ค ๋ณด๋ฉด ํ•ดํ‚น์„ ๋Œ€๋น„ํ•˜๊ธฐ ์œ„ํ•œ ๋ณด์•ˆ ๊ธฐ๋Šฅ, ์‚ฌ์šฉ์ž์˜ ์ ‘์† ๋‚ด์—ญ์„ ์œ„ํ•œ ๋กœ๊น… ๊ธฐ๋Šฅ ๊ทธ์™ธ์— ํŠธ๋žœ์žญ์…˜, ์ด๋ฉ”์ผ ๋ฐœ์†ก ๊ธฐ๋Šฅ ๋“ฑ ์ˆ˜๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์˜ ๊ณตํ†ต์ ์€ ๋ฌด์—‡์ผ๊นŒ์š”? ๋ชจ๋‘ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ๋•Œ ๊ณตํ†ต์ ์œผ๋กœ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋“ค ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ํด๋ž˜์Šค๋“ค์ด ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค. 

1.0.2.  

1.0.3. ํ•˜์ง€๋งŒ ๊ฐ ํด๋ž˜์Šค๋งˆ๋‹ค ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ์—๋Š” ์‚ฌ์‹ค ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ–‰์—ฌ ๋ณด์•ˆ ๊ธฐ๋Šฅ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ๋ณด์•ˆ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๋ชจ๋“  ํด๋ž˜์Šค๋ฅผ ์ฐพ์•„ ๋ณด์•ˆ ๊ธฐ๋Šฅ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

1.0.4.  

์ƒ๊ฐ๋งŒ ํ•ด๋„ ๋”์ฐํ•ฉ๋‹ˆ๋‹ค

 

1.0.5. ์ด๋Ÿฌํ•œ ๋ถˆํŽธํ•จ์„ ์—†์• ๊ธฐ ์œ„ํ•ด ์Šคํ”„๋ง์€ AOP ๋ผ๋Š” ๊ฐœ๋…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ DI์™€ IoC์ฒ˜๋Ÿผ AOP๋„ ๊ฐœ๋ฐœ์ž๋“ค์˜ ๋ถˆํŽธํ•จ์„ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ๋“ฑ์žฅํ•œ ๊ฒƒ์ด์ง€์š”.

 


2. l AOP๋Š” ๋ฌด์—‡์ผ๊นŒ?

 

2.0.1. AOP๋Š” ๋ฉ”์„œ๋“œ ์•ˆ์˜ ์ฃผ๊ธฐ๋Šฅ๊ณผ ๋ณด์กฐ ๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•œ ํ›„ ์„ ํƒ์ ์œผ๋กœ ๋ฉ”์„œ๋“œ์— ์ ์šฉํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฐœ๋…์œผ๋กœ ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. AOP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ํด๋ž˜์Šค์— ํฉ์–ด์ ธ ์žˆ๋Š” ๊ณตํ†ต๊ธฐ๋Šฅ๋“ค์„ ํ•˜๋‚˜์˜ ์žฅ์†Œ์— ๋ชจ์•„์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

AOP๋ฅผ ์ ์šฉํ•œ LMS ์‹œ์Šคํ…œ์˜ ๊ตฌ์กฐ๋„

 

 

์šฉ์–ด ์„ค๋ช…
aspect ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ณด์กฐ ๊ธฐ๋Šฅ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
โ˜…adviceโ˜… aspect์˜ ์‹ค์ œ ํด๋ž˜์Šค๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ณด์กฐ ๊ธฐ๋Šฅ์˜ ์‹ค์ฒด ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
joinpoint advice๋ฅผ ์ ์šฉํ•˜๋Š” ์ง€์ ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์Šคํ”„๋ง์€ method ๊ฒฐํ•ฉ์ ๋งŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
pointcut advice๊ฐ€ ์ ์šฉ๋˜๋Š” ๋Œ€์ƒ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€์ด๋ฆ„/ํด๋ž˜์Šค์ด๋ฆ„/๋ฉ”์„œ๋“œ์ด๋ฆ„์„ ์ •๊ทœ์‹์œผ๋กœ ์ง€์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
โ˜…targetโ˜… advcie๊ฐ€ ์ ์šฉ๋˜๋Š” ํด๋ž˜์Šค๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
weaving advice๋ฅผ ์ฃผ๊ธฐ๋Šฅ์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 


3. l AOP๋ฅผ ์ด์šฉํ•˜์—ฌ ์‹ค์Šต

 

<html />
<?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>

 

3.0.1. ๋นˆ์„ ํ•˜๋‚˜ํ•˜๋‚˜ ์„ค๋ช…ํ•ด๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

(๋นˆ์ด๋ž€? ์Šคํ”„๋ง์—์„œ DI๋ฅผ ์œ„ํ•˜์—ฌ ํด๋ž˜์Šค์— ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…์‹œ์ผœ์ฃผ๋Š”๋ฐ ์ด ํด๋ž˜์Šค๋ฅผ ๊ฐ์ฒด๋ฅผ ๋นˆ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.)

 

3.1. calTarget ๋นˆ

3.1.1. proxyCal ๋นˆ์—์„œ name="target" ํ•จ์œผ๋กœ์จ advice๊ฐ€ ์ ์šฉ๋  ํด๋ž˜์Šค๋ฅผ ์„ค์ •ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์ ์šฉ๋  ํด๋ž˜์Šค๋Š” bean class์ธ com.spring.ex03.Caculator์ž…๋‹ˆ๋‹ค.

3.1.2.  

3.1.3. property๋ฅผ ์„ค์ •ํ•ด์ฃผ์–ด Caculator์˜ setter์—์„œ ๋นˆ ๊ฐ์ฒด๋ฅผ ๋ฐ›์„์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

3.1.4.  

3.2. logAdvice ๋นˆ

3.2.1. ๋กœ๊น… ๊ธฐ๋Šฅ์„ ํ•˜๋Š” advice ๋นˆ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

3.2.2.  

3.3. proxyCal ๋นˆ

3.3.1. ์ฒซ๋ฒˆ์งธ property๋Š” ref="calcTarget"๋ฅผ ํ•˜์—ฌ Caculator ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์—ˆ๊ณ , ์ด๋ฅผ ํƒ€๊นƒ ํด๋ž˜์Šค๋กœ ์ง€์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

3.3.2. (ํƒ€๊นƒ ํด๋ž˜์Šค๋Š” advice๋ฅผ ์ ์šฉํ•ด์ค„ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.)

3.3.3.  

3.3.4. ๋‘๋ฒˆ์งธ property๋Š” logAdvice๋ฅผ advice ๋นˆ์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ํƒ€๊นƒ ํด๋ž˜์Šค ํ˜ธ์ถœ์‹œ logAdvice๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

<java />
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); } }

 

3.3.5. setter ํ•จ์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ bean์˜ property ์ด๋ฆ„์œผ๋กœ ํ•ด์ฃผ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ name="test" ์˜€๋‹ค๋ฉด setter ํ•จ์ˆ˜์˜ ํ•จ์ˆ˜๋ช…์€ setTest๊ฐ€ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

<java />
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; } }

 

3.3.6. invoke ํ•จ์ˆ˜๋Š” invocation.proceed ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ „์— ์ˆ˜ํ–‰ํ•˜๋Š” ๊ตฌ๋ฌธ๊ณผ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ํ›ˆ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ตฌ๋ฌธ์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ฝ˜์†”์— ๋กœ๊ทธ๋ฅผ ์ฐ์–ด์ค๋‹ˆ๋‹ค. ์•„๋งˆ ๋ฐ‘์—์„œ ์‚ฌ์ง„์œผ๋กœ ๋ณด์‹œ๋ฉด ์ดํ•ด๊ฐ€ ๋” ๋น ๋ฅด์‹ค ๊ฒ๋‹ˆ๋‹ค.

 

<java />
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); } }

 

3.3.7. ApplicationContext ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ๋นˆ ์„ค์ •์ด ๋˜์–ด์žˆ๋Š” xml ํŒŒ์ผ์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  getBean์„ ์ด์šฉํ•˜์—ฌ ๋นˆ ๊ฐ์ฒด๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค. 

3.3.8.  

3.3.9. cal.add(100,20)๋ฅผ ํ•ด์คŒ์œผ๋กœ์จ ๋นˆ ๊ฐ์ฒด๋ฅผ ์ž˜ ๋ถˆ๋Ÿฌ์™”๋Š”์ง€ ํ™•์ธํ•ด์ค๋‹ˆ๋‹ค.

 

์‹คํ–‰ ๊ฒฐ๊ณผ

 

3.3.10. ์ฝ˜์†” ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์ „, ํด๋ž˜์Šค ๋‚ด์šฉ, ๋ฉ”์„œ๋“œ ํ˜ธ์ถœํ›„ ์ด๋ ‡๊ฒŒ ๋กœ๊ทธ๋‚ด์—ญ์ด ์žˆ๋Š” ๊ฑธ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 


4. l ์š”์•ฝ

4.0.1. AOP ๋˜ํ•œ DI, IoC ์ฒ˜๋Ÿผ ๊ฒฐ๊ตญ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ๋ณด๋‹ค ํŽธํ•˜๊ฒŒ ํ•ด์ฃผ๊ธฐ ์œ„ํ•˜์—ฌ ์ƒ๊ธด ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. AOP๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณด๋‹ค ์‰ฝ๊ฒŒ ๊ณตํ†ต ๊ธฐ๋Šฅ๋“ค์„ ํ•œ ๊ณณ์— ๋ชจ์•„ ๊ด€๋ฆฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • target : advice๋ฅผ ์ ์šฉํ•ด์ค„ ํด๋ž˜์Šค
  • advice : ๋ณด์กฐ ๊ธฐ๋Šฅ(aspect)์„ ๊ตฌํ˜„ํ•œ ์‹ค์ œ ํด๋ž˜์Šค

 

 

์ฐธ๊ณ ๋„์„œ

[์ž๋ฐ” ์›น์„ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ (๊ธธ๋ฒ—)]

[๋ฐฐ์›Œ์„œ ๋ฐ”๋กœ ์“ฐ๋Š” ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ(ํ•œ๋น›๋ฏธ๋””์–ด)]

 

 

 

์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์งˆ๋ฌธ์€ ์–ธ์ œ๋‚˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

 

"๋‚œ ๋ฐ˜๋“œ์‹œ ๋ฐฑ์—”๋“œ ์™•์ด ๋ ๊ฑฐ์•ผ"