IBM Korea Skip to main content
       IBM Ȩ    |  Á¦Ç° & ¼­ºñ½º  |  °í°´Áö¿ø & ´Ù¿î·Îµå  |  È¸¿ø°¡ÀÔ  

¿µ¿ª ÁöÇâ ÇÁ·Î±×·¡¹Ö(Aspect -oriented programming)À¸·Î ¸ðµâÈ­ Çâ»ó½ÃÅ°±â
ÀÚ¹Ù ¾ð¾î¿¡ 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°¡ ¾î¶² ¸Þ¼Òµå¸¦ ¾îµå¹ÙÀ̽ºÇÒÁö¸¦ º¸¿©ÁØ´Ù.
The graphical structure browser that ships with AspectJ reveals, among other things, which methods AutoLog advises

±¸Á¶ ºê¶ó¿ìÀú¿Í ÇÙ½É ÄÄÆÄÀÏ·¯¿¡ ºÎ°¡ÇÏ¿© ¿©·¯ºÐÀº 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 : ¼ö¸¹Àº ÀÚ¹Ù °ü·Ã ÀÚ·á

¸ñ Â÷:
¿¹Á¦¸¦ ÅëÇØ ¹è¿ì±â
AspectJ¸¦ »ç¿ëÇØ °³¹ßÇϱâ
Ŭ·¡½º ±¸Á¶¿¡ ¿µÇâ ¹ÌÄ¡±â : Introduction
È¥ÇÕ ÇüÅÂÀÇ »ó¼Ó
AspectJÀÇ ´Ù¸¥ ±â´Éµé
°á·Ð
Âü°í ÀÚ·á
ÇÊÀÚ ¼Ò°³
±â»ç¿¡ ´ëÇÑ Æò°¡
°ü·Ã dW ¸µÅ©:
Diagnosing Java Code
Subscribe to the developerWorks newsletter
US ¿ø¹® Àбâ
ÇÊÀÚ ¼Ò°³
Nicholas Lesiecki´Â dot.com ºÕ ½Ã´ë¿¡ ÀÚ¹Ù ÇÁ·Î±×·¡¹ÖÀÇ ¼¼°è¿¡ ÀÔ¹®ÇÏ¿´°í ±× ÀÌÈÄ XP¿Í °°Àº ¹ÎøÇÑ ÇÁ·Î¼¼½º¿¡¼­ ¿ÀÇ ¼Ò½º ±¸Ãà ¹× Å×½ºÆà ÅøÀ» ÀÀ¿ëÇϱâ À§ÇÑ ¹æ¹ýÀ» ´ãÀº ¸Å´º¾óÀÎ Java Tools for Extreme ProgrammingÀÇ ÃâÆÇ°ú ÇÔ²² XP¿Í ÀÚ¹Ù Ä¿¹Â´ÏƼ¿¡¼­ Ź¿ùÇÑ ¸í¼ºÀ» ½×¾Æ ¿Ô´Ù. ±×´Â ÇöÀç eBlox, Inc.ÀÇ °í±Þ ¿Â¶óÀÎ Ä«Å»·Î±× ½Ã½ºÅÛÀÎ storeBloxÀÇ °³¹ßÀ» À̲ø°í ÀÖ´Ù. ±×´Â Tucson JUG¿¡¼­ ºó¹øÇÏ°Ô ¿¬¼³ÇÒ »Ó ¾Æ´Ï¶ó JakartaÀÇ Cactus ÇÁ·ÎÁ§Æ® (¼­¹öÃø ´ÜÀ§ Å×½ºÆ® ÇÁ·¹ÀÓ¿öÅ©)¿¡ Àû±ØÀûÀ¸·Î Âü¿©ÇÏ°í ÀÖ´Ù.
ÀÌ ±â»ç¿¡ ´ëÇÏ¿© ¾î¶»°Ô »ý°¢ÇϽʴϱî?

Á¤¸» ÁÁ´Ù (5) ÁÁ´Ù (4) ±×Àú±×·¸´Ù (3) ¼öÁ¤º¸¿ÏÀÌ ÇÊ¿äÇÏ´Ù(2) ÇüÆí¾ø´Ù (1)

  È¸»ç¼Ò°³  |  °³ÀÎÁ¤º¸ º¸È£Á¤Ã¥  |  ¹ý·ü  |  ¹®ÀÇ
´ÞµÇ´Â ¸Þ¼Òµå ¸Å°³º¯¼ö¸¦ °Ë»öÇϱâ À§ÇØ ¾îµå¹ÙÀ̽º°¡ ÀÌ °´Ã¼¸¦ »ç¿ëÇÑ´Ù. ·Î±ë aspect°¡ Äڵ忡