ÀÚ¹Ù ¾ð¾î¿¡ AOP¸¦ °¡Á®´Ù ÁÖ´Â AspectJ
Nicholas
Lesiecki ±â¼úÁö¿øÆÀ ¸®´õ, eBox, Inc. 2002³â 1¿ù
¿µ¿ª ÁöÇâ ÇÁ·Î±×·¡¹Ö(Aspect-oriented programming : AOP)Àº ÇÁ·Î±×·¡¸ÓµéÀÌ
·Î±ë°ú °°ÀÌ ÀϹÝÀûÀΠåÀÓ ±¸ºÐÀ» ³Ñ¾î¼´Â ÇàÀ§ÀΠȾ´ÜÀû »çÇ×À» ¸ðµâÈÇϵµ·Ï ÇØÁÖ´Â »õ·Î¿î
ÇÁ·Î±×·¡¹Ö ±â¹ýÀÌ´Ù. AOP´Â ¿©·¯ Ŭ·¡½º¿¡ ¿µÇâÀ» ¹ÌÄ¡´Â ÇàÀ§µéÀ» Àç»ç¿ë °¡´ÉÇÑ ¸ðµâ·Î ĸ½¶È½ÃÅ°´Â ¿µ¿ª
(aspect)À» Á¦°øÇÑ´Ù. XeroX PARC»ç°¡ ÃÖ±Ù Ãâ½ÃÇÑ AspectJ·Î ÀÚ¹Ù °³¹ßÀÚµéÀº
ÀÌÁ¦ AOP°¡ Á¦°øÇÏ´Â ¸ðµâȸ¦ ÀÌ¿ëÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù. ÀÌ ±ÛÀº AspectJ¸¦ ¼Ò°³ÇÏ°í À̸¦ »ç¿ëÇÏ¿©
¾òÀ» ¼ö ÀÖ´Â ¼³°è»óÀÇ ÀÌÁ¡À» ¼³¸íÇÑ´Ù.
AOP´Â ÀϹÝÀûÀÎ ÇÁ·Î±×·¥µéÀÌ Á¾Á¾ ÇϳªÀÇ ÇÁ·Î±×·¥ ¸ðµâ, ȤÀº ½ÉÁö¾î´Â ¿©·¯ °³ÀÇ ¹ÐÁ¢ÇÏ°Ô °ü·ÃµÈ
ÇÁ·Î±×·¥ ¸ðµâµé¿¡µµ ÀÚ¿¬½º·´°Ô ¸ÂÃß¾îÁöÁö ¾Ê´Â ÇàÀ§¸¦ º¸¿©Áشٴ ÀνĿ¡¼ Ãâ¹ßÇÏ¿´´Ù. AOPÀÇ °³Ã´ÀÚµéÀº ÀÌ·±
À¯ÇüÀÇ ÇàÀ§¸¦ Ⱦ´ÜÀû(crosscutting)À̶ó°í ºÒ·¶´Âµ¥, ÁÖ¾îÁø ÇÁ·Î±×·¡¹Ö ¸ðµ¨¿¡¼ ÀϹÝÀûÀÎ
Ã¥ÀÓ ±¸ºÐÀ» ³Ñ¾î¼±â ¶§¹®ÀÌ´Ù. ¿¹¸¦ µé¾î, °´Ã¼ ÁöÇâ ÇÁ·Î±×·¡¹Ö¿¡¼ ¸ðµâÈÀÇ ±âº» ´ÜÀ§´Â Ŭ·¡½ºÀ̸ç, Ⱦ´ÜÀû
°ü½É»ç´Â ¿©·¯ Ŭ·¡½º¿¡ °ÉÃÄ ÀÖ´Â °ü½É»ç¸¦ ¸»ÇÑ´Ù. ÀüÇüÀûÀΠȾ´ÜÀû °ü½É»ç¿¡´Â ·Î±ë, ¹®¸Æ ÀÇÁ¸Çü ¿¡·¯ ó¸®,
¼º´É ÃÖÀûÈ ¹× ¼³°è ÆÐÅÏ µîÀÌ Æ÷ÇÔÇÑ´Ù.
Ⱦ´ÜÀû °ü½É»ç¸¦ ÇØ°áÇÏ´Â Äڵ忡 °üÇØ ÀÛ¾÷Çß´ø ÀûÀÌ ÀÖ´Ù¸é, ¿©·¯ºÐÀº ¸ðµâÈÀÇ ºÎÁ· ¶§¹®¿¡ ¹ß»ýÇÏ´Â
¹®Á¦µéÀ» ¾Ë°í ÀÖÀ» °ÍÀÌ´Ù. Ⱦ´ÜÀû ÇàÀ§µéÀÇ ±¸ÇöÀÌ ºÐ»êµÇ¾î Àֱ⠶§¹®¿¡, °³¹ßÀÚµéÀº ÀÌ·¯ÇÑ ÇàÀ§ÀÇ Ãß·Ð, ±¸Çö
¹× º¯°æÀÌ ¾î·Æ´Ù´Â °ÍÀ» ¾Ë°Ô µÈ´Ù. ¿¹¸¦ µé¾î, ·Î±ëÀ» À§ÇÑ ÄÚµå´Â ÁÖ Ã¥ÀÓÀÌ µû·Î ÀÖ´Â ÄÚµåµé°ú ¾ôÈ÷°Ô
µÈ´Ù. ÇØ°áµÇ¾î¾ß ÇÏ´Â »çÇ×ÀÇ º¹À⼺°ú ¹üÀ§¿¡ µû¶ó °á°ú·Î ³ª¿À´Â ¾ôÈûÀÇ »óÅ´ »ç¼ÒÇÑ °Í¿¡¼ºÎÅÍ Áß´ëÇÑ °Í±îÁö
¾î´À °ÍÀÌ µÉ ¼öµµ ÀÖ´Ù. ÇÑ ¾ÖÇø®ÄÉÀ̼ÇÀÇ ·Î±ë Á¤Ã¥À» ¹Ù²Ù¸é ¼ö¹é ÁÙÀÇ Äڵ带 ¼öÁ¤ÇØ¾ß ÇÒ ¼ö ÀÖ°í, ÀÌ´Â
°¡´ÉÇÏ´Ù°í´Â Çصµ ¸Å¿ì Â¥Áõ³ª´Â ÀÏÀÌ µÉ °ÍÀÌ´Ù. ´Ù¸¥ Ãø¸é¿¡´Â AOP°¡ ¸¸µé¾îÁø »ç·Ê Áß Çϳª°¡ ÀÖ´Ù. "Aspect-Oriented
Programming"À̶ó´Â ±Û¿¡¼ AspectJ ÀúÀÛÀÚµéÀº 768 ¶óÀÎÀ¸·Î µÈ ÇÁ·Î±×·¥À» 35,213
¶óÀÎÀ¸·Î ¸¸µé¾ú´ø ¼º´É ÃÖÀûÈ¿¡ °üÇØ ±â¼úÇÏ°í ÀÖ´Ù. ÀÌ Äڵ带 ¿µ¿ª ÁöÇâ ±â¹ýÀ¸·Î ´Ù½Ã ÀÛ¼ºÇÑ °á°ú ¼º´É»óÀÇ
ÀÌÁ¡Àº ´ëºÎºÐ À¯ÁöÇÏ¸é¼ Äڵ带 1,039 ¶óÀÎÀ¸·Î ÁÙÀÏ ¼ö ÀÖ¾ú´Ù.
AOP´Â Ⱦ´ÜÀûÀÎ »çÇ×µéÀÇ ±¤¹üÀ§ÇÑ ±¸ÇöÀ» ÇϳªÀÇ ´ÜÀ§·Î ¸ðÀ¸´Â ¸ðµâÈÀÇ ¶Ç´Ù¸¥ À¯ÇüÀ» ÃËÁøÇÔÀ¸·Î½á °´Ã¼
ÁöÇâ ÇÁ·Î±×·¡¹ÖÀ» º¸¿ÏÇÏ°Ô µÈ´Ù. ÀÌ·¯ÇÑ ´ÜÀ§µéÀ» ¿µ¿ª(aspects)À̶ó°í ºÎ¸£¸ç, ÀÌ ¶§¹®¿¡
¿µ¿ª ÁöÇâ ÇÁ·Î±×·¡¹ÖÀ̶ó´Â À̸§ÀÌ ºÙ¾ú´Ù. Apsect ÄÚµåµéÀ» ±¸È¹ÈÇÔÀ¸·Î½á Ⱦ´ÜÀûÀÎ »çÇ×µéÀ» ´Ù·ç±â°¡
½¬¿öÁø´Ù. ½Ã½ºÅÛÀÇ aspectµéÀº ÄÄÆÄÀÏ ½Ã¿¡ º¯°æ, »ðÀÔ, »èÁ¦µÉ ¼ö ÀÖ°í ½ÉÁö¾î´Â Àç»ç¿ëµµ °¡´ÉÇÏ´Ù.
¿¹Á¦¸¦ ÅëÇØ ¹è¿ì±â
AOP¿¡ ´ëÇØ Á» ´õ Àß ÀÌÇØÇϱâ À§Çؼ Xerox PARC»ç°¡ ³»³õÀº ÀÚ¹Ù ÇÁ·Î±×·¡¹Ö ¾ð¾îÀÇ
aspcect ÁöÇâ È®ÀåÆÇÀÎ AspoectJ¸¦ »ìÆ캸ÀÚ. ¿ì¸® ¿¹¿¡¼, ¿ì¸®´Â ·Î±ëÀ» ¼öÇàÇϱâ À§ÇØ
AspectJ¸¦ »ç¿ëÇÒ °ÍÀÌ´Ù. ÀÌ ¿¹´Â ¼¹öÃø ÀÚ¹Ù ÄÄÆ÷³ÍÆ® Å×½ºÆ®¸¦ °£ÆíÇÏ°Ô ÇØÁÖ´Â ¿ÀÇ ¼Ò½ºÀÇ Cactus
ÇÁ·¹ÀÓ¿öÅ©¿¡¼ °¡Á®¿Â °ÍÀÌ´Ù. Cactus v.1.2´Â AspectJ ¾øÀÌ ÀÛ¼ºµÇ¾úÀ¸¸ç, ÀϹÝÀûÀÎ ¸Þ¼Òµå´Â ¾Æ·¡
Listing 1¿¡ ³ª¿Â °Í°ú À¯»çÇÏ´Ù.: Listing 1. ¸ðµç
¸Þ¼Òµå¼Ó¿¡ ¼öÀÛ¾÷À¸·Î »ðÀÔµÈ ·Î±× È£Ãâ
public void doGet(JspImplicitObjects theObjects) throws ServletException
{
logger.entry("doGet(...)");
JspTestController controller = new JspTestController();
controller.handleRequest(theObjects);
logger.exit("doGet");
}
|
ÇÁ·ÎÁ§Æ® ÄÚµå Ç¥ÁØÈÀÇ ÀÏºÎ·Î½á ¸ðµç °³¹ßÀÚ´Â ÀÌ ÄÚµåµéÀ» ±×°¡ ÀÛ¼ºÇÏ´Â ¸ðµç ¸Þ¼Òµå¿¡ »ðÀÔÇ϶ó´Â ¿ä±¸¸¦
¹Þ¾Ò´Ù. °³¹ßÀÚµéÀº ¶ÇÇÑ °¢ ¸Þ¼ÒµåÀÇ ¸Å°³º¯¼öµéÀ» ·Î±ëÇØ¾ß Çß´Ù. ÇÁ·ÎÁ§Æ® °ü¸®ÀÚµéÀÇ Áø¶¡ »©´Â ÄÚµå °ËÅä°¡
ÀÌ·ç¾îÁöÁö ¾Ê´Â´Ù¸é ÀÌ·¯ÇÑ Á¾·ùÀÇ Ç¥ÁØÈ´Â ÁöÄÑÁö±â ¾î·Æ´Ù. ¹öÀü 1.2¿¡´Â ¾à 80°³ÀÇ °³º°ÀûÀÎ ·Î±× È£ÃâÀÌ
15°³ Ŭ·¡½ºµé¿¡ °ÉÃÄ Á¸ÀçÇÏ¿´´Ù. ÀÌ ÇÁ·¹ÀÓ¿öÅ©ÀÇ ¹öÀü 1.3¿¡¼ ÀÌ 80¿© °³ÀÇ È£ÃâµéÀº ¸Þ¼ÒµåÀÇ ½ÃÀÛºÎÅÍ
³¡¿¡ °ÉÃÄ ¸Å°³º¯¼ö¿Í °á°ú°ªÀ» ÀÚµ¿À¸·Î ·Î±ëÇÏ´Â ÇϳªÀÇ aspect·Î ±³Ã¼µÇ¾ú´Ù. Listing 2´Â ÀÌ
aspectÀÇ ¸Å¿ì ´Ü¼øÈµÈ ¹öÀüÀ» Æ÷ÇÔÇÏ°í ÀÖ´Ù.(¿¹¸¦ µé¾î ÇÊÀÚ´Â ¸Å°³º¯¼ö¿Í °á°ú°ª ·Î±ë ºÎºÐÀ»
»°´Ù)
isting 2. ¸ðµç ¸Þ¼Òµå¿¡ ÀÚµ¿À¸·Î Àû¿ëµÈ ·Î±×
È£Ãâ
public aspect AutoLog{
pointcut publicMethods() : execution(public * org.apache.cactus..*(..));
pointcut logObjectCalls() :
execution(* Logger.*(..));
pointcut loggableCalls() : publicMethods() && ! logObjectCalls();
before() : loggableCalls(){
Logger.entry(thisJoinPoint.getSignature().toString());
}
after() : loggableCalls(){
Logger.exit(thisJoinPoint.getSignature().toString());
}
}
|
ÀÌ ¿¹¸¦ ÀÚ¼¼È÷ ºÐ¼®ÇÏ¿© aspect°¡ ¹«½¼ ÀÏÀ» ÇÏ´ÂÁö »ìÆ캸ÀÚ. ¿©·¯ºÐÀº ¸ÕÀú aspect ¼±¾ðÀÌ ´«¿¡
¶é °ÍÀÌ´Ù. AspectµéÀº À̵éÀÇ ¼±¾ð¿¡¼ Ŭ·¡½º¿Í À¯»çÇϸç, Ŭ·¡½º¿Í ¸¶Âù°¡Áö·Î ÀÚ¹Ù À¯ÇüÀ» Á¤ÀÇÇÑ´Ù. ÀÌ
aspect´Â ¼±¾ð ¿Ü¿¡ Æ÷ÀÎÆ®ÄÆ°ú ¾îµå¹ÙÀ̽º¸¦ °¡Áö°í ÀÖ´Ù.
Æ÷ÀÎÆ®ÄÆ°ú °áÇÕ
Æ÷ÀÎÆ®
Æ÷ÀÎÆ®ÄÆÀ» ÀÌÇØÇÏ·Á¸é °áÇÕ Æ÷ÀÎÆ®°¡ ¹«¾ùÀÎÁö¸¦ ¾Ë¾Æ¾ß ÇÑ´Ù. °áÇÕ Æ÷ÀÎÆ®´Â ÇÁ·Î±×·¥ÀÇ ½ÇÇà¿¡
ÀÖ¾î Àß Á¤ÀÇµÈ Æ÷ÀÎÆ®µéÀ» ³ªÅ¸³½´Ù. AspectJ¿¡¼ ÀϹÝÀûÀÎ °áÇÕ Æ÷ÀÎÆ®¿¡´Â ¸Þ¼Òµå È£Ãâ, Ŭ·¡½º ¸É¹ö Á¢±Ù
¹× ¿¹¿Ü ó¸® ºí·°ÀÇ ¼öÇàµîÀÌ Æ÷ÇԵȴÙ. °áÇÕ Æ÷ÀÎÆ®µéÀº ´Ù¸¥ °áÇÕ Æ÷ÀÎÆ®µéÀ» °¡Áö°í ÀÖÀ» ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î
ÇϳªÀÇ ¸Þ¼Òµå È£ÃâÀº °á°ú°ªÀ» ¹ÝȯÇϱâ Àü¿¡ ¸î °³ÀÇ ´Ù¸¥ ¸Þ¼Òµå¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù. Æ÷ÀÎÆ®ÄÆÀº Á¤ÀÇµÈ ±âÁØ¿¡
µû¶ó ÀÏ·ÃÀÇ °áÇÕ Æ÷ÀÎÆ®µéÀ» °¡Á®¿À´Â ¾ð¾î ±¸Á¶¸¦ °¡¸®Å²´Ù. ¿¹Á¦¿¡¼
publicMethods ¶ó´Â ù¹ø° Æ÷ÀÎÆ®ÄÆÀº
rg.apache.cactus ÆÐÅ°Áö¿¡¼ ¸ðµç public ¸Þ¼Òµå ½ÇÇàÀ» ¼±ÅÃÇÑ´Ù.
execution Àº ±âÃÊÀûÀÎ Æ÷ÀÎÆ®ÄÆÀÌ´Ù (int °¡ ±âÃÊÀûÀÎ ÀÚ¹Ù
À¯ÇüÀÎ °Í°ú ¸¶Âù°¡Áö·Î). ÀÚ½ÅÀÇ ±¸¹® ³»¿¡ Á¤ÀÇµÈ ¼¸í(signature)°ú ÀÏÄ¡ÇÏ´Â ¾î¶² ¸Þ¼Òµå¶óµµ
½ÇÇàÇϵµ·Ï ¼±ÅÃÇÒ ¼ö ÀÕ´Ù. ¼¸íÀº ¿ÍÀϵåÄ«µå¸¦ Æ÷ÇÔÇÒ ¼ö ÀÖ´Ù.; ¿¹Á¦¿¡ ÀÖ´Â ¼¸íÀº ¿©·¯ °³¸¦ Æ÷ÇÔÇÏ°í
ÀÖ´Ù. logObjectCalls À̶ó°í ºÒ¸®´Â µÎ¹ø° Æ÷ÀÎÆ®ÄÆÀº
Logger Ŭ·¡½º ³»ÀÇ ¸ðµç ¸Þ¼Òµå ½ÇÇàÀ» ¼±ÅÃÇÑ´Ù. ¼¼¹ø° Æ÷ÀÎÆ®ÄÆÀÎ
loggableCalls ˼ && !
Ç¥½Ã¸¦ »ç¿ëÇÏ¿© ÀÌÀüÀÇ µÎ Æ÷ÀÎÆ®ÄÆÀ» °áÇÕ½ÃÅ°´Âµ¥, ÀÌ´Â Logger Ŭ·¡½º¿¡ ÀÖ´Â °ÍÀº Á¦¿ÜÇÏ°í
org.apache.cactus ¿¡ ÀÖ´Â ¸ðµç public ¸Þ¼Òµå¸¦ ¼±ÅÃÇÑ´Ù´Â ÀǹÌÀÌ´Ù.
(·Î±× ¸Þ¼Òµå¸¦ ·Î±ëÇÏ´Â °ÍÀº ¹«ÇÑ ¹Ýº¹À¸·Î ºüÁö°Ô µÉ °ÍÀÌ´Ù.)
¾îµå¹ÙÀ̽º
ÀÌÁ¦ aspect°¡ ·Î±ëÇØ¾ß ÇÏ´Â Æ÷ÀÎÆ®µéÀ» Á¤ÀÇÇÏ¿´À¸¹Ç·Î ½ÇÁ¦ ·Î±ëÀ» ¼öÇàÇϱâ À§ÇØ ¾îµå¹ÙÀ̽º¸¦
»ç¿ëÇÑ´Ù. ¾îµå¹ÙÀ̽º´Â °áÇÕ Æ÷ÀÎÆ®ÀÇ ÀÌÀü, ÀÌÈÄ È¤Àº ¼ö½Ã·Î ¼öÇàµÇ´Â ÄÚµåµéÀ» °¡¸®Å²´Ù. ¿©·¯ºÐÀº ¾îµå¹ÙÀ̽º¸¦
Æ÷ÀÎÆ®ÄÆ°ú »ó´ëÀûÀ¸·Î Á¤ÀÇÇϴµ¥, "³»°¡ ·Î±ëÇÏ°í ½ÍÀº ¸ðµç ¸Þ¼ÒµåÀÇ È£Ãâ ÈÄ¿¡ ÀÌ Äڵ带 ¼öÇà½ÃÄѶó"´Â °Í°ú
À¯»çÇÏ´Ù. ¾îµå¹ÙÀ̽ºÀÇ ¿¹´Â ¾Æ·¡¿Í °°´Ù.:
before() : loggableCalls(){
Logger.entry(thisJoinPoint.getSignature().toString());
}
|
¾îµå¹ÙÀ̽º´Â Logger Ŭ·¡½º¸¦ »ç¿ëÇϴµ¥, Logger
Ŭ·¡½ºÀÇ entry ¸Þ¼Òµå¿Í exit ¸Þ¼Òµå´Â ¾Æ·¡¿Í °°´Ù.:
public static void entry(String message){
System.out.println("entering method " + message);
}
|
ÀÌ ¿¹¿¡¼ logger·Î Àü´ÞµÈ String Àº
thisJoinPoint ¿¡¼ ³ª¿Â °ÍÀε¥, ÀÌ´Â °áÇÕ Æ÷ÀÎÆ®°¡ ½ÇÇàµÇ´Â ·±Å¸ÀÓ ¹®¸ÆÀ¸·ÎÀÇ
Á¢±ÙÀ» Çã¿ëÇϴ Ư¼öÇÑ ¹Ý»ç °´Ã¼ÀÌ´Ù. Cactus°¡ »ç¿ëÇÏ´Â ½ÇÁ¦ aspect¿¡¼´Â ·Î±ëµÈ °¢°¢ÀÇ ¸Þ¼Òµå
È£Ãâ·Î Àü´ÞµÇ´Â ¸Þ¼Òµå ¸Å°³º¯¼ö¸¦ °Ë»öÇϱâ À§ÇØ ¾îµå¹ÙÀ̽º°¡ ÀÌ °´Ã¼¸¦ »ç¿ëÇÑ´Ù. ·Î±ë aspect°¡ Äڵ忡
Àû¿ëµÇ¾úÀ» ¶§ ¸Þ¼Òµå È£ÃâÀÇ °á°ú´Â ´ÙÀ½°ú °°´Ù.:
Listing 3. AutoLog aspectÀÇ Ãâ·Â
entering method: void test.Logging.main(String[])
entering method: void test.Logging.foo()
exiting method: void test.Logging.foo()
exiting method: void test.Logging.main(String[])
|
Around
advice
Cactus ¿¹Á¦´Â before() ¿Í
after() ¾îµå¹ÙÀ̽º¸¦ Á¤ÀÇÇÑ´Ù. Á¦ 3ÀÇ ¾îµå¹ÙÀ̽º À¯ÇüÀÎ,
around() ´Â ¾Ö½ºÆåÆ® ¶óÀÌÅÍ(aspect writer)¿¡°Ô Ưº°ÇÑ
proceed() ½ÅÅýº¸¦ »ç¿ëÇÏ¿© Á¶ÀÎ Æ÷ÀÎÆ®(join point)ÀÇ ½ÇÇà
¿©ºÎ ¹× ½ÇÇà ½Ã±â¿¡ ¿µÇâÀ» ÁÙ ¼ö ÀÖ´Â ±âȸ¸¦ ÁØ´Ù:
void around(): call(public void Hello.say()){
if(Math.random() > .5){
proceed();//go ahead with the method call
}
else{
System.out.println("Fate is not on your side.");
}
}
| |
AspectJ¸¦ »ç¿ëÇØ
°³¹ßÇϱâ
ÀÌÁ¦ ¿©·¯ºÐÀº aspect Äڵ尡 ¾î¶² ¸ð½ÀÀÎÁö¸¦ ´õ¿í Àß ¾Ë°Ô µÇ¾úÀ¸¹Ç·Î, aspect¸¦ ÀÛ¼ºÇÏ´Â ÀÏ·Î
¿ì¸®ÀÇ °ü½ÉÀ» µ¹·Á º¸ÀÚ. ´Ù½Ã ¸»ÇØ "À§ÀÇ Äڵ带 ¾î¶»°Ô ÀÛµ¿½Ãŵ´Ï±î"¶ó´Â Áú¹®¿¡ ´äÇغ¸ÀÚ.
aspect°¡ Á¤½Ä Ŭ·¡½º ±â¹Ý Äڵ忡 ¿µÇâÀ» ¹ÌÄ¡·Á¸é aspect´Â ÀÚ½ÅÀÌ ¼öÁ¤ÇÏ´Â Äڵ忡 ¿«¾îÁ®¾ß
ÇÑ´Ù. AspectJ¸¦ »ç¿ëÇØ À̸¦ ¼öÇàÇÏ·Á¸é ¿©·¯ºÐÀÇ Å¬·¡½º¿Í aspect Äڵ带 ajc ÄÄÆÄÀÏ·¯·Î ÄÄÆÄÀÏÇؾß
ÇÑ´Ù. ajc´Â ÄÄÆÄÀÏ·¯·Î ȤÀº precompiler·Î ÀÛµ¿ÇÒ ¼ö ÀÖÀ¸¸ç À¯È¿ÇÑ .class ÆÄÀÏÀ̳ª .java
ÆÄÀÏÀ» »ý¼ºÇϴµ¥, ¿©·¯ºÐÀº À̸¦ ÄÄÆÄÀÏÇÏ¿© ¾î¶² Ç¥ÁØ Àڹ٠ȯ°æ¿¡¼µµ ½ÇÇà½Ãų ¼ö ÀÖ´Ù. (¼Ò±Ô¸ð ·±Å¸ÀÓ
JARÀ» Ãß°¡ÇÏ¿©)
AspectJ·Î ÄÄÆÄÀÏÇϱâ À§Çؼ´Â ÁÖ¾îÁø ÄÄÆÄÀÏ¿¡ ¿©·¯ºÐÀÌ Æ÷ÇÔ½ÃÅ°°í ½ÍÀº ¼Ò½º ÆÄÀϵé(aspect¿Í
Ŭ·¡½º)À» ¸íÈ®ÇÏ°Ô ÁöÁ¤ÇØ¾ß ÇÒ °ÍÀÌ´Ù.--ajc´Â javac°¡ ÇÏ´Â °Íó·³ °ü·Ã ÀÓÆ÷Æ®¸¦ ã±â À§ÇØ ¿©·¯ºÐÀÇ
Ŭ·¡½º °æ·Î¸¦ °Ë»öÇÏÁö ¾Ê´Â´Ù. Ç¥ÁØ ÀÚ¹Ù ¾ÖÇø®ÄÉÀ̼ǿ¡¼ °¢ Ŭ·¡½º´Â ´Ù¼Ò °í¸³µÈ ÄÄÆ÷³ÍÆ®·Î ÀÛµ¿Çϱ⠶§¹®¿¡
ÀÌ°ÍÀº ¸»ÀÌ µÈ´Ù. Ŭ·¡½º°¡ ¿Ã¹Ù¸£°Ô ÀÛµ¿ÇÏ·Á¸é ÀÚ½ÅÀÌ Á÷Á¢ ÂüÁ¶Çϴ Ŭ·¡½º¸¸ ÀÖÀ¸¸é µÈ´Ù. Aspect´Â ¿©·¯
Ŭ·¡½ºµé¿¡ °ÉÃÄ ÀÖ´Â ÁýÇÕÀûÀÎ ÇàÀ§¸¦ ³ªÅ¸³½´Ù. µû¶ó¼ AOP ÇÁ·Î±×·¥Àº ÇÑ ¹ø¿¡ ÇϳªÀÇ Å¬·¡½º°¡ ¾Æ´Ñ ÇϳªÀÇ
´ÜÀ§·Î ÄÄÆÄÀϵǾî¾ß ÇÑ´Ù.
ÁÖ¾îÁø ÄÄÆÄÀÏ¿¡ Æ÷ÇÔµÈ ÆÄÀϵéÀ» ÁöÁ¤ÇÔÀ¸·Î½á ¿©·¯ºÐÀº ¶ÇÇÑ ÄÄÆÄÀÏ ½Ã¿¡ ¿©·¯ºÐ ½Ã½ºÅÛÀÇ ´Ù¾çÇÑ
aspect¸¦ ¿¬°á½ÃÅ°°í ÇØÁ¦ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, ¾Õ¿¡¼ ¼³¸íÇÑ ·Î±ë asptct¸¦ ÄÄÆÄÀÏ¿¡ Æ÷ÇÔ½ÃÅ°°Å³ª
Á¦¿ÜÇÔÀ¸·Î½á ¾ÖÇø®ÄÉÀÌ¼Ç °³¹ßÀÚ´Â Cactus ÇÁ·¹ÀÓ¿öÅ©¿¡¼ ÃßÀûÇÏ´Â ¸Þ¼Òµå¸¦ Ãß°¡Çϰųª »èÁ¦ÇÒ ¼ö ÀÖ´Ù.
AspectJ´Â ¿ÀÇ ¼Ò½ºÀÌ´Ù.
Xerox´Â AspectJ¸¦ Mozilla Public License ÇÏ¿¡ ÀÌ¿ëÇÒ ¼ö ÀÖµµ·Ï
¸¸µé¾ú´Ù. ÀÌ°ÍÀº ¿ÀÇ ¼Ò½º ÃßÁ¾Àڵ鿡°Ô´Â ÁÁÀº ¼Ò½ÄÀÌ´Ù. ¶ÇÇÑ °¡±î¿î ¹Ì·¡¿¡ AspectJ¸¦
µµÀÔÇÏ·Á´Â »ç¶÷¿¡°Ôµµ ÁÁÀº ¼Ò½ÄÀÌ´Ù. Á¦Ç°Àº ¹«·áÀÌ°í, ¿©·¯ºÐÀÌ Áß¿äÇÑ ¹ö±×¸¦ ¹ß°ßÇßÀ» °æ¿ì ¼Ò½º
Äڵ带 °ËÅäÇÒ ¼ö ÀÖ´Ù. ¿ÀÇ ¼Ò½º ±â¹ÝÀº ¶ÇÇÑ AspectJÀÇ ¼Ò½º°¡ ½ÃÀå¿¡ ³ª¿À±â Àü¿¡ Ä¿¹Â´ÏƼÀÇ
»ó´çÇÑ °ËÅ並 °ÅÃÆÀ½À» ÀǹÌÇÑ´Ù. |
AspectJÀÇ ÇöÀç ¹öÀüÀÌ °¡Áö´Â Áß¿äÇÑ ÇÑ°èÁ¡Àº ÄÄÆÄÀÏ·¯°¡ ¼Ò½º¸¦ °¡Áö°í ÀÖ´Â Äڵ忡¸¸ aspect¸¦
¿¬°á½ÃŲ´Ù´Â °ÍÀÌ´Ù. ´Ù½Ã ¸»ÇØ ¿©·¯ºÐÀº »çÀü ÄÄÆÄÀÏµÈ Å¬·¡½º¿¡ ¾îµå¹ÙÀ̽º¸¦ Ãß°¡Çϱâ À§ÇØ ajc¸¦ »ç¿ëÇÒ ¼ö
¾ø´Ù. AspectJÆÀÀº ÀÌ·± ÇÑ°èÁ¡À» ÀÓ½ÃÀûÀÎ °ÍÀ¸·Î °£ÁÖÇÏ°í ÀÖÀ¸¸ç, AspectJ À¥ »çÀÌÆ®´Â ÇâÈÄ ¹öÀü
(°ø½ÄÀûÀ¸·Î 2.0)¿¡¼ ¹ÙÀÌÆ®ÄÚµå ¼öÁ¤ÀÌ °¡´ÉÇÒ °ÍÀ̶ó°í ¾à¼ÓÇÏ°í ÀÖ´Ù.
Åø Áö¿ø
¸î °³ÀÇ °³¹ß ÅøµéÀÌ AspectJ Ãâ½ÃÆÇÀÇ ÀϺηΠÆ÷ÇԵǾî ÀÖ´Ù. ÀÌ´Â AspectJÀÇ ¹Ì·¡¿¡ ÁÁÀº
¡Á¶ÀÌ´Ù. AspectJ¸¦ °³¹ßÀÚ¿¡°Ô Ä£±ÙÇÏ°Ô ¸¸µé·Á´Â AspectJ ÀúÀÛÀÚµéÀÇ °ÇÑ ÀÇÁö¸¦ ¹Ý¿µÇÑ´Ù. Åø
Áö¿øÀº aspect ÁöÇ⠽ýºÅÛ¿¡¼ ƯÈ÷ Áß¿äÇѵ¥, ÇÁ·Î±×·¥ ¸ðµâµéÀÌ ±×µéÀÌ ÀüÇô ¾ËÁö ¸øÇÏ´Â ´Ù¸¥ ¸ðµâµéÀÇ
¿µÇâÀ» ¹ÞÀ» ¼ö Àֱ⠶§¹®ÀÌ´Ù.
AspectJ¿Í ÇÔ²² Ãâ½ÃµÈ °¡Àå Áß¿äÇÑ Åø Áß Çϳª´Â aspect°¡ ´Ù¸¥ ½Ã½ºÅÛ ÄÄÆ÷³ÍÆ®µé°ú ¾î¶»°Ô
»óÈ£ÀÛ¿ëÇÏ´ÂÁö¸¦ ÇÑ ´«¿¡ º¸¿© ÁÖ´Â ±×·¡ÇÈ ±â¹ÝÀÇ ±¸Á¶ ºê¶ó¿ìÀúÀÌ´Ù. ÀÌ ±¸Á¶ ºê¶ó¿ìÀú´Â µ¶¸³Çü Åø·Î »ç¿ëÇÒ ¼ö
ÀÖÀ» »Ó ¾Æ´Ï¶ó Àαâ ÀÖ´Â IDEÀÇ Ç÷¯±×ÀÎÀ¸·Îµµ »ç¿ë°¡´ÉÇÏ´Ù. ±×¸² 1Àº ¾Õ¿¡¼ ¼³¸íÇÑ ·Î±ë ¿¹Á¦ÀÇ
ºäÀÌ´Ù.
±×¸² 1. AspectJ¿Í ÇÔ²² Ãâ½ÃµÈ ±×·¡ÇÈ ±â¹ÝÀÇ ±¸Á¶ ºê¶ó¿ìÀú´Â
´Ù¸¥ ¹«¾ùº¸´Ùµµ AutoLog°¡ ¾î¶² ¸Þ¼Òµå¸¦ ¾îµå¹ÙÀ̽ºÇÒÁö¸¦ º¸¿©ÁØ´Ù.
±¸Á¶ ºê¶ó¿ìÀú¿Í ÇÙ½É ÄÄÆÄÀÏ·¯¿¡ ºÎ°¡ÇÏ¿© ¿©·¯ºÐÀº AspectJ À¥»çÀÌÆ®¿¡¼ aspect ÀÎ½Ä µð¹ö°Å,
javadoc Åø, Ant task ¹× Emacs Ç÷¯±×ÀÎÀ» ´Ù¿î·Îµå ¹ÞÀ» ¼ö ÀÖ´Ù. ¾ð¾îÀÇ ±â´ÉÀ¸·Î µÇµ¹¾Æ°¡
º¸ÀÚ.
Ŭ·¡½º ±¸Á¶¿¡ ¿µÇâ ¹ÌÄ¡±â :
Introduction
Æ÷ÀÎÆ®ÄÆ°ú ¾îµå¹ÙÀ̽º´Â ¿©·¯ºÐÀÌ ÇÁ·Î±×·¥ÀÇ µ¿ÀûÀÎ ½ÇÇà¿¡ ¿µÇâÀ» ¹ÌÄ¥ ¼ö ÀÖµµ·Ï ÇÑ´Ù.;
IntroductionÀº aspect°¡ ÇÁ·Î±×·¥ÀÇ Á¤ÀûÀÎ ±¸Á¶¸¦ º¯°æÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù.
IntroductionÀ» »ç¿ëÇϸé aspect´Â Ŭ·¡½º¿¡ »õ·Î¿î ¸Þ¼Òµå¿Í º¯¼ö¸¦ Ãß°¡ÇÒ ¼ö ÀÖ°í Ŭ·¡½º°¡ ÇÑ
ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÔÀ» ¼±¾ðÇÒ ¼ö ÀÖÀ¸¸ç ¶Ç´Â üũµÈ ¿¹¿Ü¸¦ üũµÇÁö ¾ÊÀº ¿¹¿Ü·Î º¯È¯ÇÒ ¼ö ÀÖ´Ù.
IntroductionÀÇ ¿¹
¿©·¯ºÐÀÌ ¿µ¼Ó µ¥ÀÌÅÍÀÇ Ä³½Ã¸¦ Ç¥½ÃÇÏ´Â °´Ã¼¸¦ °¡Áö°í ÀÖ´Ù°í °¡Á¤Çغ¸ÀÚ. µ¥ÀÌÅÍÀÇ "½Å¼±ÇÔ"À» ÃøÁ¤Çϱâ
À§ÇØ ¿©·¯ºÐÀº ±× °´Ã¼¿¡ timestamp Çʵ带 Ãß°¡ÇÏ¿© °´Ã¼¿Í À̸¦ Áö¿øÇÏ´Â ÀúÀå ÀåÄ¡°¡ µ¿±âȵǰí ÀÖ´ÂÁö¸¦
½±°Ô ÃßÀûÇÒ ¼ö ÀÖµµ·Ï ÇÏ·Á ÇÑ´Ù. ±×·¯³ª °´Ã¼´Â ºñÁî´Ï½º µ¥ÀÌÅ͸¦ ³ªÅ¸³»±â ¶§¹®¿¡, ÀÌ ±â°èÀûÀÎ ¼¼ºÎ »çÇ×À»
°´Ã¼¿¡¼ ºÐ¸®ÇÏ´Â °ÍÀÌ ¹Ù¶÷Á÷ÇÏ´Ù. AspectJ·Î ¿©·¯ºÐÀº Listing 4¿¡ ³ª¿Â ±¸¹®À» »ç¿ëÇÏ¿© ±âÁ¸
Ŭ·¡½º¿¡ timestamping ±â¹ýÀ» Ãß°¡ÇÒ ¼ö ÀÖ´Ù.: Listing
4. ±âÁ¸ Ŭ·¡½º¿¡ º¯¼ö¿Í ¸Þ¼Òµå Ãß°¡Çϱâ
public aspect Timestamp {
private long ValueObject.timestamp;
public long ValueObject.getTimestamp(){
return timestamp;
}
public void ValueObject.timestamp(){
//"this" refers to ValueObject class not Timestamp aspect
this.timestamp = System.currentTimeMillis();
}
}
|
¿©·¯ºÐÀº ¾î¶² Ŭ·¡½º¿¡¼ À̵éÀ» ¼±¾ðÇÒÁö Á¤ÇØ¾ß ÇÑ´Ù´Â Á¡À» Á¦¿ÜÇÏ°í´Â (Áï
ValueObject.timestamp ), Á¤½Ä Ŭ·¡½º ¸â¹ö¿¡¼¿Í °ÅÀÇ ¸¶Âù°¡Áö·Î
introduceµÈ ¸Þ¼Òµå¿Í ¸â¹ö º¯¼ö¸¦ ¼±¾ðÇÒ ¼ö ÀÖ´Ù.
È¥ÇÕ ÇüÅÂÀÇ »ó¼Ó
AspectJ´Â ¿©·¯ºÐÀÌ Å¬·¡½º»Ó ¾Æ´Ï¶ó ÀÎÅÍÆäÀ̽º¿¡ ¸â¹ö¸¦ Ãß°¡ÇÒ ¼ö ÀÖµµ·Ï Çϸç, C++¿¡ È¥ÇÕ ÇüÅÂÀÇ
»ó¼ÓÀ» Áö¿øÇÑ´Ù. ´Ù¾çÇÑ °´Ã¼¿¡ ´ëÇØ timestamp Äڵ带 Àç»ç¿ëÇÒ ¼ö ÀÖµµ·Ï Listing 4¿¡ ³ª¿Â
aspect¸¦ ÀϹÝÈÇÏ·Á¸é, TimestampedObject ¶ó´Â ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇÇÒ ¼ö
ÀÖ°í introductionÀ» »ç¿ëÇÏ¿© ±¸Ã¼ÀûÀΠŬ·¡½º ´ë½Å ÀÎÅÍÆäÀ̽º¿¡ µ¿ÀÏÇÑ ¸â¹ö¿Í º¯¼ö¸¦ Ãß°¡ÇÒ ¼ö ÀÖ´Ù.
Listing 5¿¡ ÀÌ°ÍÀÌ ³ª¿Í ÀÖ´Ù. Listing 5. ÀÎÅÍÆäÀ̽º¿¡
ÇàÀ§ Ãß°¡Çϱâ Adding behavior to an interface
public interface TimestampedObject {
long getTimestamp();
void timestamp();
}
//and
public aspect Timestamp {
private long TimestampedObject.timestamp;
public long TimestampedObject.getTimestamp(){
return timestamp;
}
public void TimestampedObject.timestamp(){
this.timestamp = System.currentTimeMillis();
}
}
|
ÀÌÁ¦ ¿©·¯ºÐÀº ValueObject °¡ ¿©·¯ºÐÀÇ »õ·Î¿î ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÒ ¼ö ÀÖµµ·Ï
ÇÏ´Â declare parents ±¸¹®À» »ç¿ëÇÒ ¼ö ÀÖ´Ù. declare
parents ´Â ´Ù¸¥ AspectJ À¯Çü ½Ä°ú ¸¶Âù°¡Áö·Î Çѹø¿¡ ¿©·¯ °³ÀÇ À¯Çü¿¡ Àû¿ëµÉ ¼ö ÀÖ´Ù.
:
declare parents: ValueObject || BigValueObject implements TimestampedObject;
|
ÀÌÁ¦ ¿©·¯ºÐÀº TimestampedObject °¡ Áö¿øÇÏ´Â ÀÛ¾÷µéÀ» Á¤ÀÇÇÏ¿´À¸¹Ç·Î,
ÀûÀýÇÑ È¯°æÀÌ ¹ß»ýÇßÀ» °æ¿ì Æ÷ÀÎÆ®ÄÆ°ú ¾îµå¹ÙÀ̽º¸¦ »ç¿ëÇÏ¿© timestamp¸¦ ÀÚµ¿À¸·Î ¾÷µ¥ÀÌÆ®ÇÒ ¼ö ÀÖ´Ù.
ÀÌ°ÍÀº ¾îµå¹ÙÀ̽º ³»ÀÇ ¹®¸Æ¿¡ ¾î¶»°Ô Á¢±ÙÇÏ´ÂÁö º¸¿©Áֱ⠶§¹®¿¡ À̸¦ ´ÙÀ½ ¼½¼Ç¿¡¼ ´Ù·çµµ·Ï ÇÏ°Ú´Ù.
AspectJÀÇ ´Ù¸¥
±â´É
Æ÷ÀÎÆ®ÄÆÀ» »ç¿ëÇÏ¿© ¿©·¯ºÐÀº timestamp ó¸®µÈ °´Ã¼°¡ ¾î´À »óȲ¿¡¼ ¾÷µ¥ÀÌÆ®µÇ¾îÁ®¾ß ÇÏ´ÂÁö¸¦ ½±°Ô
Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. Listing 6¿¡ ³ª¿Â °Í°ú °°ÀÌ,
Timestamp aspectÀÇ Ãß°¡ ºÎºÐÀ¸·Î½á setter ¸Þ¼Òµå È£ÃâÀ» ÇÑ ÈÄ¿¡´Â
°´Ã¼¿¡ ´ëÇÏ¿© timestamp ¾÷µ¥ÀÌÆ®¸¦ ¼öÇàÇÏ°í ÀÖ´Ù. Listing 6. ¾îµå¹ÙÀ̽º ³»ÀÇ ¹®¸Æ¿¡ Á¢±ÙÇϱâ
pointcut objectChanged(TimestampedObject object) :
execution(public void TimestampedObject+.set*(..)) &&
this(object);
/*TimestampedObject+ means any subclass of TimestampedObject*/
after(TimestampedObject object) : objectChanged(object){
object.timestamp();
}
|
Æ÷ÀÎÆ®ÄÆÀº È£ÃâµÈ settter¸¦ °¡Áö°í ÀÖ´Â after() ¾îµå¹ÙÀ̽º°¡ »ç¿ëÇÏ´Â
ÀÎÀÚ(ÀÌ °æ¿ì¿¡´Â TimestampedObject )¸¦ Á¤ÀÇÇÑ´Ù´Â Á¡¿¡ À¯ÀÇÇÑ´Ù.
this() Æ÷ÀÎÆ®ÄÆÀº ÇöÀç ½ÇÇà ÁßÀÎ °´Ã¼°¡ °ýÈ£ ³»¿¡ Á¤ÀÇµÈ À¯ÇüÀÎ ¸ðµç °áÇÕ
Æ÷ÀÎÆ®¸¦ ±¸ºÐÇÑ´Ù. ¸Þ¼Òµå ÀÎÀÚ, ¸Þ¼Òµå°¡ Á¦½ÃÇÑ ¿¹¿Ü ¹× ¸Þ¼Òµå È£ÃâÀÇ Å¸°Ùµî ¸î¸î ´Ù¸¥ Á¾·ùÀÇ °ªÀÌ
¾îµå¹ÙÀ̽º ÀÎÀÚ¿¡ ¹ÙÀεùµÉ ¼ö ÀÖ´Ù.
Ä¿½ºÅÒ ÄÄÆÄÀÏ
¿¡·¯
³ª´Â Ä¿½ºÅÒ ÄÄÆÄÀÏ ¿¡·¯°¡ AspectJÀÇ ¸ÚÁø ±â´É Áß ÇϳªÀÓÀ» ¹ß°ßÇß´Ù. Ŭ¶óÀ̾ðÆ® Äڵ尡 Áß°³¸¦ °ÅÃÄ
worker °´Ã¼·Î Á¢±ÙÇØ¾ß Çϵµ·Ï ÇÏÀ§ ½Ã½ºÅÛÀ» °Ý¸®½ÃÅ°±â¸¦ ¿øÇÑ´Ù°í Çغ¸ÀÚ (ÀÌ »óȲÀº Facade ¼³°è
ÆÐÅÏ¿¡¼ µîÀåÇÑ´Ù). Listing 7¿¡¼¿Í °°ÀÌ, ¿©·¯ºÐÀº declare error ³ª
declare warning ±¸¹®À» »ç¿ëÇÏ¿© °¡´ÉÇÑ °áÇÕ Æ÷ÀÎÆ®ÀÇ µîÀå¿¡ ´ëÇÑ ajc
ÄÄÆÄÀÏ·¯ÀÇ ÀÀ´äÀ» Ä¿½ºÅ͸¶ÀÌÁîÇÒ ¼ö ÀÖ´Ù. Listing 7.Ä¿½ºÅÒ ¿¡·¯
Á¤ÀÇÇϱâ
public aspect FacadeEnforcement {
pointcut notThruFacade() : within(Client) && call(public * Worker.*(..));
declare error : notThruFacade():
"Clients may not use Worker objects directly.";
}
|
ajc°¡ ÄÄÆÄÀÏ ½Ã¿¡ À̸¦ ÃßÀûÇÑ´Ù´Â Á¡À» Á¦¿ÜÇÏ°í´Â within Æ÷ÀÎÆ®ÄÆÀº
this() ¿Í À¯»çÇÏ´Ù. (´ëºÎºÐÀÇ Æ÷ÀÎÆ®ÄÆÀº ·±Å¸ÀÓ Á¤º¸¿¡ ±â¹ÝÇÏ¿© ±¸º°µÉ ¼ö
ÀÖ´Ù.)
¿¡·¯ ó¸®
³ª´Â ÀÚ¹Ù ¾ð¾î¿¡¼ üũµÈ ¿¹¿Ü ó¸®ÀÇ °¡Ä¡¸¦ ¾Ë°í ÀÖ´Ù. ±×·¯³ª Á¾Á¾ ¿ìȸÀûÀÎ ¹æ¹ýÀ¸·Î½á Á» ´õ ´Ü¼øÇÑ
Á¾·ùÀÇ "ÀÌ ¿¹¿Ü´Â ·±Å¸ÀÓ ¿¹¿Ü·Î ¹Ù²Û´Ù"¶ó´Â ¸í·É¾î¸¦ ¿øÇÏ¿´´Ù. ³»°¡ ÀÛ¼ºÇÏ°í ÀÖ´Â ¸Þ¼Òµå´Â ¿¹¿Ü¿¡ ´ëÇؼ
ÀÇ¹Ì ÀÖ´Â ÀÀ´äÀ» °¡Áö°í ÀÖÁö ¾Ê´Â °æ¿ì°¡ ¸¹¾Ò°í, ±×·² ±âȸ°¡ ÀÖ´Ù ÇÏ´õ¶óµµ ÀÌ ¸Þ¼Òµå¸¦ »ç¿ëÇÒ¸¸ÇÑ »ç¿ëÀÚµµ
¸¶Âù°¡Áö¿´´Ù. ³ª´Â ¿¹¿Ü¸¦ ¹ö¸®°í ½ÍÁöµµ ¾ÊÁö¸¸ ¸ðµç È£ÃâÀÚ¸¦ ÅëÇØ ±× Á¸À縦 ÃßÀûÇÏ°í ½ÍÁöµµ ¾Ê¾Ò´Ù. ÀÌ·±
¸ñÀûÀ» À§ÇØ try/catch ºí·ÏÀ» »ç¿ëÇÏ´Â ±³¹¦ÇÑ ¹æ¹ýÀÌ ÀÖ±ä ÇÏÁö¸¸ AspectJÀÇ
declare soft ¸¸Å ÈǸ¢ÇÑ °ÍÀº ¾ø´Ù. Listing 8¿¡ ³ª¿Â Ŭ·¡½º´Â ¸î°¡Áö
SQL ÀÛ¾÷À» ½ÃµµÇÏ°í ÀÖ´Ù.: Listing 8. üũµÈ ¿¹¿Ü¸¦ °¡Áø
Ŭ·¡½º
public class SqlAccess {
private Connection conn;
private Statement stmt;
public void doUpdate(){
conn = DriverManager.getConnection("url for testing purposes");
stmt = conn.createStatement();
stmt.execute("UPDATE ACCOUNTS SET BALANCE = 0");
}
public static void main(String[] args)throws Exception{
new SqlAccess().doUpdate();
}
}
|
³»°¡ AspectJ¸¦ »ç¿ëÇÏ°í ÀÖÁö ¾Ê°Å³ª °¢ ¸Þ¼Òµå ¼¸í¿¡¼ ¿¹¿Ü¸¦ ¼±¾ðÇÏÁö ¾Ê´Â´Ù¸é üũµÈ
SQLException (JDBC APIÀÇ °ÅÀÇ ¸ðµç ¸Þ¼Òµå¿¡¼ ÁÖ¾îÁö´Â)À» ´Ù·ç±â À§ÇØ
insert try/catch ºí·ÏÀ» »ðÀÔÇØ¾ß ÇÒ °ÍÀÌ´Ù. AspectJ·Î ³ª´Â ´ÙÀ½ÀÇ ³»ºÎ aspect¸¦
»ç¿ëÇØ ÀÌ°ÍÀ» org.aspectj.lang.SoftException À¸·Î ÀÚµ¿ÀûÀ¸·Î ´Ù½Ã
Á¦°øÇÒ ¼ö ÀÖ´Ù. Listing 9. Softening
exceptions
private static aspect exceptionHandling{
declare soft : SQLException : within(SqlAccess);
pointcut methodCall(SqlAccess accessor) : this(accessor)
&& call(* * SqlAccess.*(..));
after(SqlAccess accessor) : methodCall (accessor){
System.out.println("Closing connections.");
if(accessor.stmt != null){
accessor.stmt.close();
}
if(accessor.conn != null){
accessor.conn.close();
}
}
}
|
Æ÷ÀÎÆ®ÄÆ°ú ¾îµå¹ÙÀ̽º´Â SQLAccess Ŭ·¡½º
³»ÀÇ °¢ ¸Þ¼Òµå°¡ ¼öÇà µÈ ÈÄ¿¡ ±× ¸Þ¼Òµå°¡ ¿¹¿Ü¸¦ ¹ß»ý½ÃÅ°°Ç ȤÀº Á¤»óÀûÀ¸·Î ¹ÝȯÇÏ´ø°£¿¡ »ó°ü¾øÀÌ ¿¬°á°ú
statement¸¦ ´Ý´Â´Ù. ÇϳªÀÇ ¸Þ¼Òµå¸¦ À§ÇØ ÇϳªÀÇ ¿¡·¯ ó¸® aspect¸¦ »ç¿ëÇÏ´Â °ÍÀº ¾Æ¸¶µµ Áö³ªÄ£
´Ü¼ÓÀÏ °ÍÀÌ´Ù. ÇÏÁö¸¸, ¿¬°á°ú statement¸¦ »ç¿ëÇÏ´Â ¿©Å¸ÀÇ ´Ù¸¥ ¸Þ¼ÒµåµéÀ» Ãß°¡ÇÏ·Á ÇÑ´Ù¸é, ¿¡·¯ ó¸®
Á¤Ã¥µµ À̵鿡 Àû¿ëµÇ¾î¾ß ÇÒ °ÍÀÌ´Ù. »õ·Î¿î Äڵ忡 ´ëÇÑ aspectÀÇ ÀÌ·¯ÇÑ ÀÚµ¿ Àû¿ëÀº AOPÀÇ ÇÙ½ÉÀûÀÎ
°Á¡ Áß ÇϳªÀÌ´Ù: »õ·Î¿î ÄÚµåÀÇ ÀÛ¼ºÀڴ Ⱦ´ÜÀûÀÎ ÇàÀ§¿¡ Âü°¡Çϱâ À§ÇØ ±× ÇàÀ§µéÀ» ¾Ë ÇÊ¿ä°¡
¾ø´Ù.
°á·Ð
AspectJ°¡ »ç¿ëÇÒ¸¸ÇÑ °¡Ä¡°¡ Àִ°¡? Grady Booch´Â AOP¸¦ ¼ÒÇÁÆ®¿þ¾î°¡ ¼³°èµÇ°í ÀÛ¼ºµÇ´Â
¹æ½ÄÀÇ ±Ùº»ÀûÀÎ º¯È°¡ ½ÃÀÛµÊÀ» Á¾ÇÕÀûÀ¸·Î Ç¥½ÃÇÏ´Â ¼¼ °¡Áö ¿òÁ÷ÀÓ Áß Çϳª·Î ¼³¸íÇÏ¿´´Ù (Âü°í
ÀÚ·á¿¡¼ ±×ÀÇ "Through the Looking Glass"¸¦ ÂüÁ¶ÇÑ´Ù). ³ª´Â ±×¿¡°Ô µ¿ÀÇÇÑ´Ù.
AOP´Â °´Ã¼ ÁöÇâ ¾ð¾î¿Í ´Ù¸¥ ÀýÂ÷Àû ¾ð¾î°¡ ´Ù·çÁö ¸øÇß´ø ¹®Á¦ ¿µ¿ªÀ» ÇØ°áÇÑ´Ù. ³»°¡ AspectJ¸¦ ¾Ë°Ô
µÈ ÈÄ ¸î ÁÖ¸¸¿¡ ³ª´Â AspectJ°¡ ³»°¡ ÇÁ·Î±×·¡¹ÖÀÇ ±Ùº»ÀûÀÎ ÇÑ°è¶ó°í »ý°¢Çß´ø ¹®Á¦µé¿¡ ´ëÇØ ÈǸ¢ÇÏ°í
Àç»ç¿ë °¡´ÉÇÑ ¼Ö·ç¼ÇÀ» Á¦°øÇÑ´Ù´Â °ÍÀ» ¹ß°ßÇß´Ù. AOP´Â ³»°¡ °´Ã¼¸¦ »ç¿ëÇϱ⠽ÃÀÛÇÑ ÀÌ·¡ ¹è¿î °¡Àå °·ÂÇÑ
Ãß»óȶó°í ¸»ÇÒ¸¸ÇÏ´Ù.
¹°·Ð AspectJ´Â ¹è¿ì´Âµ¥ ½Ã°£ÀÌ °É¸°´Ù. ´Ù¸¥ ¾ð¾î³ª ¾ð¾î È®ÀåÀÚ¿Í ¸¶Âù°¡Áö·Î AspectJÀÇ ¸ðµç
ÈûÀ» ÀÀ¿ëÇÒ ¼ö ÀÖ±â Àü¿¡ ¾Ë¾Æ¾ß ÇÒ ¹Ì¹¦ÇÑ Á¡µéÀÌ ÀÖ´Ù. ±×·¯³ª ÇнÀÀÌ ±×·¸°Ô ±î´Ù·ÓÁö´Â ¾Ê´Ù. ³ª´Â °³¹ßÀÚ
°¡À̵带 ÀÐ°í ¸î °¡Áö ¿¹Á¦¸¦ ÀÛ¾÷ÇØ º» ÈÄ ³»°¡ ¾µ¸¸ÇÑ aspect¸¦ ±¸¼ºÇÒ Áغñ°¡ µÇ¾úÀ½À» ¾Ë¾Ò´Ù.
AspectJ´Â »õ·Î¿î ¹æÇâÀ¸·Î È®ÀåÇϱ⺸´Ù´Â ¿©·¯ºÐÀÇ ÇÁ·Î±×·¡¹Ö Áö½ÄÀÇ °¸À» ¸Þ¿ì´Â °Íó·³ ÀÚ¿¬½º·´°Ô
´À²¸Áø´Ù. ¸î¸î AspectJ ÅøÀº ¾à°£ ±î´Ù·Ó±ä ÇÏÁö¸¸ Áß´ëÇÑ ¹®Á¦Á¡Àº ¸¸³ªÁö ¸øÇß´Ù.
¸ðµâ鵃 ¼ö ¾ø´Â °ÍÀ» ¸ðµâÈÇÏ´Â AspectJÀÇ ÈûÀ» °¨¾ÈÇÒ ¶§ ³ª´Â À̸¦ Áï°¢ »ç¿ëÇÒ¸¸ÇÑ °¡Ä¡°¡ ÀÖ´Ù°í
»ý°¢ÇÑ´Ù. ¿©·¯ºÐÀÇ ÇÁ·ÎÁ§Æ®³ª ȸ»ç°¡ AspectJ¸¦ »ý»ê ȯ°æ¿¡ »ç¿ëÇÒ Áغñ°¡ µÇ¾î ÀÖÁö ¾Ê´Ù¸é µð¹ö±ëÀ̳ª
°è¾à ÀÌÇà°ú °°Àº °³¹ß »çÇ׿¡ AspectJ¸¦ ½±°Ô Àû¿ëÇÒ ¼ö ÀÖ´Ù. ¿©·¯ºÐ Àڽſ¡°Ô ºÎŹÀ» ÇÏ°í ÀÌ ¾ð¾î
È®ÀåÀÚ¸¦ üũÇØ º¸±â ¹Ù¶õ´Ù.
Âü°í ÀÚ·á
- http://www.aspectj.org/¿¡¼
AspectJ¿Í °ü·Ã ÅøÀ» ´Ù¿î·Îµå¹ÞÀ» ¼ö ÀÖ´Ù. ÀÌ »çÀÌÆ®´Â FAQ, ¸ÞÀϸµ ¸®½ºÆ®, ÈǸ¢ÇÑ ¹®¼µé ¹×
AOP¿¡ ´ëÇÑ ´Ù¸¥ ÀÚ¿øÀ¸·ÎÀÇ ¸µÅ©¸¦ °¡Áö°í ÀÖ´Ù.
- Grady BoochÀÇ "Through
the Looking Glass" (Software Development, July
2001)´Â ¼ÒÇÁÆ®¿þ¾îÀÇ ¹Ì·¡¸¦ ³íÀÇÇÏ°í, ÇÑ ¹ø¿¡ ¿©·¯ ¹æ½ÄÀ¸·Î ÀÛ¼ºµÉ ¼ö ÀÖ´Â ¼ÒÇÁÆ®¿þ¾îÀÎ ´Ù°¢Àû
(multifaceted) ¼ÒÇÁÆ®¿þ¾îÀÇ µîÀåÀ» ¿¹ÃøÇÏ°í ÀÖ´Ù. ÀÌ ±ÛÀº AOP¸¦ ÇÁ·Î±×·¡¹Ö ¼¼°è¿¡¼ ù¹ø°
´Ù°¢Àû ¼ÒÇÁÆ®¿þ¾î·ÎÀÇ ¿òÁ÷ÀÓ Áß Çϳª·Î ¾ð±ÞÇÏ°í ÀÖ´Ù.
- IBMÀÇ ¿¬±¸ÆÀ¿¡¼ ³ª¿Â ¶Ç´Ù¸¥ ´Ù°¢Àû ¹æ½ÄÀÌ HyperspacesÀÌ´Ù.
Hyperspaces´Â Ⱦ´ÜÀû »çÇ×ÀÇ Ä¸½¶È¸¦ ³Ñ¾î¼ ±× »çÇ×À» ¿©·¯ Â÷¿øÀ¸·Î ºÐ¸®ÇÏ·Á°í ½ÃµµÇÑ´Ù. Hyper/J
(Hyperspaces¿¡ ´ëÇÑ ÀÚ¹Ù Áö¿ø)´Â ¿äû¿¡ µû¸¥ ½Ã½ºÅÛ Àç¸ðµâȸ¦ Á¦°øÇÑ´Ù.
- IBMÀÇ ¿¬±¸ÆÀÀº ¶ÇÇÑ ÁÖü
ÁöÇâ ÇÁ·Î±×·¡¹Ö(subject-oriented programming)¿¡ Æ÷Ä¿½º¸¦ ¸ÂÃß°í Àִµ¥,
½Ã½ºÅÛÀÇ µ¶Æ¯ÇÑ "ºä"¸¦ °¡Áö°í Àִ Ŭ·¡½ºÀÇ ÁýÇÕ È¤Àº Ŭ·¡½º ºÎºÐÀÎ ÁÖü
(subjects)¸¦ Á¦°øÇÑ´Ù. ÁÖü´Â ÀÛ¼º ±ÔÄ¢¿¡ µû¶ó ¾ÖÇø®ÄÉÀ̼ÇÀ¸·Î ÀÛ¼ºµÈ´Ù.
- asod.net Àº AOP °ü·Ã Á¤º¸ÀÇ
ÃÑüÀûÀÎ Áß¾Ó ¼Ò½º¶ó°í ÇÒ ¼ö ÀÖ´Ù. ÀÌ »çÀÌÆ®´Â ´Ù¸¥ AOP ½Ãµµµé, ´Ù¸¥ ¾ð¾î¿¡¼ÀÇ aspect ±¸Çö,
aspect¿Í À¯»çÇÑ ¼Ò½º ¼öÁ¤ ¹× aspect À̷п¡ °üÇÑ ±Û·ÎÀÇ ¸µÅ©¸¦ Á¦°øÇÑ´Ù.
- AOP¿¡ ´ëÇÑ ÃÊ±â ±Û Áß ÇϳªÀÎ "Aspect
Oriented Programming" (PDF)´Â »õ·Î¿î ÇÁ·Î±×·¡¹Ö ¹æ½ÄÀÇ °³¹ß¿¡ °üÇÑ Ãʱâ ÀÇ°ßÀ»
Á¦°øÇÑ´Ù. ÀÌ ±ÛÀÇ ¼µÎ¿¡ ¾ð±ÞµÈ, 35,000 ¶óÀÎÀÇ Äڵ带 ¿ä±¸Çß´ø ¼º´É ÃÖÀûÈ°¡ aspect¸¦ »ç¿ëÇØ
1,000¶óÀÎÀ¸·Î ÁÙ¾îµç ¿¹Á¦°¡ ÀÌ ±Û¿¡¼ »ç¿ëµÇ¾ú´Ù.
- JavaWorld´Â AOP¸¦ ¼Ò°³Çϴ ªÀº ½Ã¸®ÁîÀÎ "I
want my AOP."¸¦ Á¦°øÇÑ´Ù.
- Eric AllenÀÇ ÀÚ¹Ù
ÄÚµå Áø´ÜÇϱâ Ä÷³Àº Ⱦ´ÜÀûÀÎ »çÇ×µéÀ» ºñÀÏ°üÀûÀ¸·Î ó¸®ÇÏ¿© ³ªÅ¸³ª´Â ¸¹Àº "¹ö±× ÆÐÅÏ"µéÀ» ´Ù·ç°í
ÀÖ´Ù. AllenÀº OO ±â¹ýÀ¸·Î À̵éÀ» ÃÖ¼ÒȽÃÅ°´Â ¹æ¹ýµéÀ» ¼³¸íÇÑ´Ù. "¹ö±×
ÆÐÅÏ : ¼Ò°³"´Â ¹Ýº¹ÀûÀÎ Äڵ忡¼ ³ªÅ¸³ª´Â ÀϹÝÀûÀÎ ¹ö±× À¯ÇüÀ» ´Ù·ç´Âµ¥, À̵éÀº Á¾Á¾ OOP¿¡¼´Â
ÇÇÇÒ ¼ö ¾ø´Â °ÍµéÀÌ´Ù. ±×´Â ¿¹¿Ü¿Í °ü·ÃÇÑ "Null
Flag ¹ö±× ÆÐÅÏ"¿¡¼ AspectJ¸¦ ±¸Ã¼ÀûÀ¸·Î ¾ð±ÞÇÏ¿´´Ù.
- ÀÌ ±Û¿¡ ³ª¿Â ·Î±ë ¿¹Á¦´Â JakartaÀÇ Cactus°´Ã¼¿¡¼ °¡Á®¿Â
°ÍÀÌ´Ù.
- developerWorks
Java technology zone : ¼ö¸¹Àº ÀÚ¹Ù °ü·Ã ÀÚ·á
|