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

EJB best practices : ¿£ÅÍƼ ºó º¸È£
Session Facade ÆÐÅÏÀ¸·Î µ¥ÀÌÅ͸¦ ¾ÈÀüÇÏ°Ô °ü¸®Çϱâ

Level: Intermediate

Brett McLaughlin
ÀÛ°¡/ÆíÁýÀÚ, O'Reilly and Associates
2002³â 10¿ù

Column icon¿£ÅÍƼ ºóÀ» À¥ Ƽ¾î(tier)¿¡°Ô Á÷Á¢ ³ëÃâÇÏÁö ¾Ê°í ¾ÖÇø®ÄÉÀ̼ǿ¡ »ç¿ëÀÚµéÀÌ ¾×¼¼½º ÇÒ ¼ö ÀÖµµ·Ï ÇÏ·Á¸é? ÇÏÁö¸¸ ÀÌ°ÍÀº ¾ÖÇø®ÄÉÀ̼ǿ¡ º¸¾È À§ÇùÀ» °¡Á®¿Ã ¼ö ÀÖ´Ù. Brett McLaughlinÀº ¿£ÅÍƼ ºó¿¡´Â ¾ÈÀüÇÏ°í Àüü ¾ÖÇø®ÄÉÀ̼ǿ¡´Â È¿À²ÀûÀÎ ¼Ö·ç¼ÇÀ» Á¦¾ÈÇÑ´Ù.

Enterprise JavaBeans ±â¼úÀº ¼¼ °³ÀÇ ÇÙ½É ºó(bean) À¯Çü- ¼¼¼Ç(session), ¸Þ½ÃÁö ±¸µ¿(message-driven), ¿£ÅÍƼ(entity)-À¸·Î ³ª´µ¾îÁø´Ù. ±×¸®°í, ºó(bean)Àº ºñÁö´Ï½º °´Ã¼·Î¼­ ÀÛµ¿ÇÏ´Â °Í°ú µ¥ÀÌÅÍ °´Ã¼·Î¼­ ÀÛµ¿ÇÏ´Â °ÍÀ¸·Î ³ª´· ¼ö ÀÖ´Ù. ¼¼¼Ç ºó°ú ¸Þ½ÃÁö Á᫐ ºóÀº ºñÁö´Ï½º °´Ã¼ÀÌ´Ù. ¿£ÅÍƼ ºóÀº µ¥ÀÌÅÍ °´Ã¼ÀÌ´Ù. ´ëºÎºÐ ºñÁö´Ï½º °´Ã¼µéÀº À¥ Ƽ¾î¿¡°Ô ³ëÃâµÇ¾î¾ß ÇÑ´Ù. ºñÁö´Ï½º °´Ã¼´Â µ¥ÀÌÅÍ ½ºÅä¾î¸¦ ´Ù·ç´Âµ¥ µ¥ÀÌÅÍ °´Ã¼¸¦ »ç¿ëÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. ÇÏÁö¸¸ ¾î¶² °æ¿ì´Â »ç¿ëÀÚµéÀÌ µ¥ÀÌÅÍ °´Ã¼¿¡ Á÷Á¢ ¾×¼¼½ºÇؼ­ Á¶ÀÛÇÒ ÇÊ¿äµµ ÀÖ´Ù. ´Ù½Ã ¸»Çؼ­ ¿£ÅÍƼ ºóÀ» À¥ Ƽ¾î¿¡°Ô ³ëÃâÇؾßÇÔÀ» ÀǹÌÇÑ´Ù. ÀÌ°ÍÀº ¾ÖÇø®ÄÉÀ̼ÇÀ» º¸¾È À§Çù ¼Ó¿¡ ³ëÃâÇÏ´Â °ÍÀÌ°í °¡²û Äڵ尡 ±úÁö´Â °æ¿ìµµ »ý±ä´Ù.

³ëÃâÀÇ À§Çè
¿£ÅÍƼ ºóÀº µ¥ÀÌÅͺ£À̽ºÀÇ ±â¹Ý ±¸Á¶¿¡ ´ëÇØ ¸¹Àº °ÍÀ» µå·¯³»°í ÀÖ´Ù. °¢ ºóÀº µ¥ÀÌÅͺ£À̽ºÀÇ °¢ Çʵ帶´Ù ¾×¼¼¼­(accessor)¿Í ¹ÂÅ×ÀÌÅÍ(mutator) ¸Þ¼Òµå¸¦ Æ÷ÇÔÇÏ°í ÀÖ°í ¸Þ¼Òµå À̸§µéÀº º¸Åë ÇʵåÀ̸§°ú Á¤·ÄµÇ±â ¶§¹®¿¡ ¿£ÅÍƼ ºó¿¡¼­ Àüü µ¥ÀÌÅͺ£À̽º ±¸Á¶¸¦ °Ë»öÇÒ ¼ö ÀÖ´Ù. ÇÑ °³ÀÇ ¾ÖÇø®ÄÉÀ̼ǿ¡¼­´Â ±×´ÙÁö Å« ÀÏÀº ¾Æ´ÏÁö¸¸ ºóµéÀº ´Ù¸¥ ³×Æ®¿öÅ©»ó¿¡¼­ ´Ù¸¥ ¾ÖÇø®ÄÉÀ̼ǿ¡ Á¾Á¾ ³ëÃâµÈ´Ù. ¾ÖÇø®ÄÉÀ̼ǵéÀÌ ´ÙÁß ³×Æ®¿öÅ©¸¦ ÅëÇØ ¿¬°áµÇ¾î ÀÖ´Â À¥ ¼­ºñ½º ½Ã½ºÅÛ¿¡¼­´Â ƯÈ÷ ±×·¸´Ù.

³ëÃâµÈ ºó: ½ÇÇà ¿¹Á¦
Movie¶ó´Â ¿£ÅÍƼ ºóÀ» »ý°¢Çغ¸ÀÚ. ÀÌ ºóÀÇ ¸Þ¼Òµå´Â getTitle(), getDirector(), getActors().ÀÌ´Ù. ºóÀÇ ¿ø°Ý ÀÎÅÍÆäÀ̽º¸¦ ³ëÃâÇ߱⠶§¹®¿¡ ¿©·¯ºÐÀÇ ¾ÖÇø®ÄÉÀ̼ǰú ¿©·¯ Ŭ¶óÀ̾ðÆ® ¾ÖÇø®ÄÉÀÌ¼Ç ¸ðµÎ getDirector() ¸Þ¼Òµå¸¦ Æ÷ÇÔÇÏ´Â Äڵ带 ÀÛ¼ºÇß´Ù. ÇÏÁö¸¸ ¾ÖÇø®ÄÉÀ̼ÇÀÌ ÁøÈ­Çϸ鼭 ´ÙÁß director¸¦ °¡Áø movie¸¦ ¼ö¿ëÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù´Â °ÍÀÌ ¸íÈ®ÇØ Á³´Ù. µ¥ÀÌÅͺ£À̽º´Â º¯ÇÏ°í getDirector() ¸Þ¼Òµå´Â getDirectors()°¡ µÇ¾ú´Ù. ¸Þ¼Òµå°¡ º¹¼öÇüÀÌ°í ´ÜÀÏ °´Ã¼°¡ ¾Æ´Ñ ¸®½ºÆ®¸¦ ¸®ÅÏÇϵµ·Ï ÄÚµùµÇ¾ú´Ù. °á°úÀûÀ¸·Î ¿À·¡µÈ ¸Þ¼Òµå¸¦ »ç¿ëÇÏ´Â ¸ðµç ¸ðµå´Â ±ú¾îÁö°í ¿©·¯ºÐÀÇ ¾ÖÇø®ÄÉÀÌ¼Ç ÄÚµå´Â ÀçÀÛ¼ºµÇ¾î¾ß ÇÑ´Ù.

µ¥ÀÌÅͺ£À̽º ±¸Á¶¸¦ ¾Ë·ÁÁöÁö ¾ÊÀº ¾ÖÇø®ÄÉÀ̼ǿ¡ µå·¯³¾ °æ¿ì¿¡ ³ªÅ¸³ª´Â ºÐ¸íÇÑ À§Çè »Ó¸¸¾Æ´Ï¶ó µ¥ÀÌÅÍ ±¸Á¶°¡ º¯°æµÉ ¶§ ¾î¶²ÀÏÀÌ ¹ß»ýÇÒ °ÍÀΰ¡¿¡ ´ëÇؼ­µµ »ý°¢ÇØ¾ß ÇÑ´Ù. ¿£ÅÍƼ ºóÀº µ¥ÀÌÅÍ ±¸Á¶¿Í ¹ÐÁ¢ÇÏ°Ô ¹­¿©Àֱ⠶§¹®¿¡ µ¥ÀÌÅͺ£À̽º Å×À̺íÀÇ Ä®·³ÀÌ º¯°æµÇ°Å³ª »õ·Î¿î Ä®·³ÀÌ Ãß°¡µÉ ¶§ ¿£ÅÍƼ ºóµµ Á¾Á¾ º¯ÇÑ´Ù. ¿£ÅÍƼ ºóÀ» ¾ÖÇø®ÄÉÀÌ¼Ç ·¹À̾ ³ëÃâÇÔÀ¸·Î¼­ ¸Þ¼Òµå À̸§À» »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇÏ°í ÀÌ·¯ÇÑ ¸Þ¼Òµå À̸§µéÀº »õ·Î¿î ¾ÖÇø®ÄÉÀÌ¼Ç Äڵ忡 Ãß°¡µÈ´Ù. ½É°¢ÇÑ ÄÚµå ¿À·ù´Â ¿£ÅÍƼ ºóÀÌ º¯°æµÇ°Å³ª ÁøÈ­ÇÒ ¶§ ¹ß»ýÇÒ ¼ö ÀÖ´Ù.

Session Facade ÆÐÅÏ
´ÙÇàÈ÷, ¿£ÅÍƼ ºóÀ» À¥ Ƽ¾î¿¡°Ô ³ëÃâÇÏÁö ¾Ê°í µ¥ÀÌÅÍ °´Ã¼·Î »ç¿ëÀÚ ¾×¼¼½º¸¦ °¡´ÉÇÏ°Ô ÇÏ´Â µðÀÚÀÎ ÆÐÅÏÀÌ ÀÖ´Ù. Session Facade ÆÐÅÏÀº ¿£ÅÍƼ ºó°ú ¾ÖÇø®ÄÉÀÌ¼Ç Å¬¶óÀ̾ðÆ® »çÀÌ¿¡ ¼¼¼Ç ºóÀ» ³õ´Â´Ù. ÀÌ°ÍÀº ´Ù¸¥ ¿£ÅÍƼ·ÎÀÇ ¾×¼¼½º¸¦ °ü¸®Çϱ⠶§¹®¿¡ ÀÌ·¯ÇÑ ¹æ½ÄÀ¸·Î ¼¼¼Ç ºóÀ» »ç¿ëÇÒ ¶§ ¸Å´ÏÀú·Î¼­ °£ÁֵȴÙ.

¼¼¼Ç ºóÀº ºñÁö´Ï½º ·ÎÁ÷°ú ¾ÖÇø®ÄÉÀÌ¼Ç ·ÎÁ÷°£ÀÇ ÀÎÅÍÆäÀ̽º·Î ÀÛµ¿Çϵµ·Ï ¼³°èµÇ¾ú´Ù. ½ÇÇà ¿¹Á¦ÀÇ °æ¿ì ·ÎÁ÷Àº ¸Å¿ì °£´ÜÇÏ´Ù. ÇϳªÀÇ ±â¹Ý ¿£ÅÍƼ ºóÀ» È£ÃâÇÏ´Â °ÍÀÌ´Ù. ½ÇÁ¦ ½Ã³ª¸®¿À¿¡¼­´Â ¼¼¼Ç ºóÀÌ µ¥ÀÌÅÍ Å¸´ç¼º°Ë»ç, º¸¾È, ±âŸ ºñÁö´Ï½º ÇÔ¼ö¸¦ °ü¸®Çϵµ·Ï ÇؾßÇÑ´Ù. ¼¼¼Ç ºó¿¡¼­ ¿£ÅÍƼ ºóÀ» ·¡ÇÎÇÔÀ¸·Î¼­ ¿£ÅÍƼ ºó Äڵ带 ¼Õ»ó½ÃÅ°Áö ¾Ê°í ÇÊ¿äÇÑ ºñÁö´Ï½º ÇÔ¼ö¿¡ ¾×¼¼½º ÇÒ ¼ö ÀÖ´Ù.

½ÇÇà ¿¹Á¦¸¦ ºÐ¼®ÇϱâÀ§Çؼ­ MovieManager¸¦ È£ÃâÇÏ´Â ¼¼¼ÇºóÀ» ¸¸µé¾î¾ßÇÑ´Ù. MovieManager ºóÀº ¿À·¡µÈ ¸Þ¼ÒµåÀÎ getDirector()¿Í »õ·Î¿î ¸Þ¼ÒµåÀÎ getDirectors()¸¦ Æ÷ÇÔÇÏ°Ô µÈ´Ù. »õ·Î¿î ¸Þ¼Òµå°¡ Ãß°¡µÉ ¶§ ¿£ÅÍƼ ºóÀ» ÅëÇØ "ÇÁ·Ï½ÃÈ­(proxied)" µÈ´Ù. ù ¹ø° ¸Þ¼Òµå´Â ÀÌ ¿£ÅÍƼ ºó¿¡¼­´Â ´õÀÌ»ó »ç´ÉÇÏÁö ¾Ê±â ¶§¹®¿¡ ¼¼¼Ç ºóÀº À̸¦ ¼û±â±â À§ÇØ ÇïÆÛ ¸Þ¼Òµå¸¦ »ç¿ëÇÑ´Ù.(Listing 1):

Listing 1. "deprecated" ¸Þ¼Òµå ¼û±â±â

      public Person getDirector() {
          // We can't call getDirector() any more on the entity bean

          // Call the new method, through this manager
          List directors = getDirectors();

          // Return the first one in the list
          return (Person)directors.item(0);
      }

ÇØ°á¹æ¹ý
¿©±â¿¡¼­ ¼³¸íµÈ ¹®Á¦ À¯Çü¿¡ ´ëÇÑ ÀϹÝÀûÀÎ ¼Ö·ç¼ÇÀº ¿£ÅÍƼ ºó¿¡ ÇïÆÛ(helper) ¸Þ¼Òµå¸¦ ´Ü¼øÈ÷ Ãß°¡ÇÏ´Â °ÍÀÌ´Ù. ÇÏÁö¸¸ ±×·¸°Ô ÇßÀ» ¶§ÀÇ °á°ú´Â Àç¾ÓÀÌ µÉ ¼öµµ ÀÖ´Ù. ¿£ÅÍƼ ºóÀÇ ¸ðµç ¸Þ¼Òµå°¡ Àϳ⿡ ´Ü Çѹø ¹Ù²î´õ¶óµµ ºóÀº ±× ÇØ ¿¬¸» ±îÁö µÎ¹èÀÇ ¸Þ¼Òµå¸¦ ¾ò´Â´Ù. ¸Þ¼Òµå°¡ Àϳ⿡ Çѹø ÀÌ»óÀ¸·Î ºü¸£°Ô º¯°æÇÑ´Ù´Â °ÍÀ» »ý°¢ÇÑ´Ù¸é "Band-Aid" Á¢±Ù¹æ½ÄÀÌ ¼Ò¿ë¾ø´ÂÁö°¡ ¸í¹éÇØÁø´Ù. ¿£ÅÍƼºóÀÌ µ¥ÀÌÅÍ °´Ã¼ ó·³ º¸ÀÌÁö ¾Ê°í ÇïÆÛ Å¬·¡½ºÃ³·³ º¸À̱⠽ÃÀÛÇÒ ¶§ ¹®Á¦°¡ ÀÖ´Ù´Â °ÍÀ» ¾Ë°ÔµÈ´Ù. ¹Ý¸é ¼¼¼ÇºóÀº Á¤È®È÷ ÇïÆÛ Å¬·¡½ºÃ³·³ º¸ÀδÙ. ¿Ö³ÄÇϸé ÇÔ¼ö ¼¼¼Ç ºóµé Áß Çϳª°¡ ¼öÇàµÇµµ·Ï ¼³°èµÇ¾ú±â ¶§¹®ÀÌ´Ù.

Listing 1Àº Æ®¸¯À» ¼öÇàÇÏ°í ÀÖ´Ù. ¿À·¡µÈ ¸Þ¼Òµå´Â ¼û°ÜÁ®Àֱ⠶§¹®¿¡ ÀÌ°Í¿¡ ÀÇÁ¸ÇÏ´Â ¸ðµç ¾ÖÇø®ÄÉÀÌ¼Ç ÄÚµå´Â Àß µ¹¾Æ°£´Ù. ¶ÇÇÑ ¼ÓÇØÀÖ´Â ºñÁö´Ï½º °´Ã¼¾È¿¡ À̸¦ À§Ä¡½ÃÄѼ­ ¿£ÅÍƼ ºó ¹Û¿¡¼­ ÇïÆÛ ¸Þ¼Òµå¸¦ À¯ÁöÇÑ´Ù. ±ÞÇÑ ¹®Á¦¸¦ ÇØ°áÇÒ ¶§ ºóÀÇ Å¬¶óÀ̾ðÆ®¸¦ »õ·Î¿î¸Þ¼Òµå·Î ¿Å±â°Å³ª ÇïÆÛ ¸Þ¼Òµå°¡ À̵¿À» ÇÚµéÇϵµ·Ï ÇÏ´Â ¿É¼ÇÀÌ ÀÖ´Ù. µÎ ¹æ¹ý Áß ¾î¶² °ÍÀ» äÅÃÇÏ´õ¶óµµ ¾ÖÇø®ÄÉÀÌ¼Ç Äڵ峪 Ŭ¶óÀ̾ðÆ® ÄÚµå´Â ÇÇÇظ¦ ÀÔÁö ¾Ê´Â´Ù.

µ¥ÀÌÅÍ ±¸Á¶ ¼û±â±â
À§ ¼Ö·ç¼ÇÀÌ º¯°æ °ü¸® ¹®Á¦µéÀ» ÇØ°áÇÏÁö¸¸ º¸¾È ¹®Á¦´Â »ç¶óÁöÁö ¾Ê´Â´Ù. ¿£ÅÍƼ ºóÀÌ À¥ Ƽ¾î¿¡°Ô ³ëÃâµÇÁö ¾Êµµ·Ï º¸È£ÇØ¾ß ÇÑ´Ù. ¸î °¡Áö °£´ÜÇÑ ºñÁö´Ï½º ·ÎÁ÷°ú µ¥ÀÌÅÍ Á¶ÀÛ ÇÔ¼ö¸¦ ¼¼¼Ç ºó¿¡ Ãß°¡ÇÏ¿© ¾ÖÇø®ÄÉÀÌ¼Ç µ¥ÀÌÅ͸¦ ¼û±â°í ¿©±â¿¡ Æ÷ÇÔµÈ Á¤º¸¸¦ ¼¼·ÃµÈ ¹æ½ÄÀ¸·Î Á¢±ÙÇÒ ¼ö ÀÖ´Ù.

¿¹¸¦ µé¾î ¾ÖÇø®ÄÉÀ̼ÇÀÌ ¹ßÀüÇØ°¡¸é¼­ »ç¿ëÀÚµéÀÌ ´Ù¾çÇÑ µ¥ÀÌÅÍ¿¡ °³º°ÀûÀ¸·Î ¾×¼¼½ºÇϵµ·Ï ÇÏ´Â °ÍÀÌ ºñÈ¿À²ÀûÀ̶ó´Â °ÍÀ» ¾Ë°ÔµÈ´Ù. Á¤º¸ À¯ÇüÀº Ç×»ó »óÈ£ÀûÀ¸·Î »ç¿ëµÇ±â ¶§¹®¿¡ ¼¼¼ÇºóÀ» º¯°æÇÏ´Â °ÍÀÌ À¯¿ëÇÏ´Ù. getDirector()³ª getDirectors() ¸Þ¼Òµå ´ë½Å ¼¼¼ÇºóÀº »õ·Î¿î ºñÁö´Ï½º ·ÎÁ÷À» °¡Áú ¼ö ÀÖ´Ù(Listing 2):

Listing 2. µ¥ÀÌÅÍ ±¸Á¶¸¦ ¼¼¼Ç ºóÀ¸·Î ¼û±â±â

      public List getCrew(String movieName)
	     throws NamingException, RemoteException {
          List crew = new LinkedList();

          EJBHomeFactory f = EJBHomeFactory.getInstance();
          MovieHome movieHome =
            (MovieHome)f.lookup("java:comp/env/ejb/Movie", MovieHome.class);
          Movie movie = movieHome.findByName(movieName);

          crew.add(movie.getDirectors());
          crew.add(movie.getProducers());
          crew.add(movie.getExecutiveProducers());
          // and so on...

          return crew;
      }

      public List getCast(String movieName)
	     throws NamingException, RemoteException {
          List cast = new LinkedList();

          EJBHomeFactory f = EJBHomeFactory.getInstance();
          MovieHome movieHome =
            (MovieHome)f.lookup("java:comp/env/ejb/Movie", MovieHome.class);
          Movie movie = movieHome.findByName(movieName);

          crew.add(movie.getActors());
          crew.add(movie.getStandIns());
          // and so on...

          return cast;
      }

¼­·Î ´Ù¸¥ ¾ÖÇø®ÄÉÀÌ¼Ç Æ¼¾îµéÀ» ºÐ¸®ÇÏ°í ºñÁö´Ï½º ·ÎÁ÷À» »ç¿ëÇÏ¿© µ¥ÀÌÅÍ Á¶ÀÛÀ» ÇÚµéÇÔÀ¸·Î¼­ Á÷Á¢ÀûÀÌ°í ºÒ¾ÈÇÑ ¿£ÅÍƼ ºóÀ¸·ÎÀÇ ¾×¼¼½º¸¦ ¹æÁöÇÏ°í À¥ Ƽ¾î¿¡°Ôµµ ÁÁÀº ¸Þ¼Òµå¸¦ ¸¸µé¾ú´Ù. ÀÌ °æ¿ì Session Facade´Â ¿£ÅÍƼ ºó°ú ºñÁö´Ï½º ·ÎÁ÷ ´ÜÀ§¿¡´Â ·¡Æ۷μ­ ÀÛ¿ëÇϸ鼭 ¿À¸®Áö³Î µ¥ÀÌÅ͸¦ ÀǹÌÀÖ´Â Á¤º¸·Î ¹Ù²Ù¾ú´Ù.

Âü°íÀÚ·á

¸ñ Â÷:
³ëÃâÀÇ À§Çè
Session Facade ÆÐÅÏ
µ¥ÀÌÅÍ ±¸Á¶ ¼û±â±â
Âü°í ÀÚ·á
ÇÊÀÚ ¼Ò°³
±â»ç¿¡ ´ëÇÑ Æò°¡
°ü·Ã dW ¸µÅ©:
EJB best practices series
Rules and Patterns for Session Facades
Best practices in EJB exception handling
Subscribe to the developerWorks newsletter
US ¿ø¹® Àбâ
Also in the Java zone:
Tutorials
Tools and products
Code and components
Articles
ÇÊÀÚ¼Ò°³
Photo of Brett McLaughlin Brett McLaughlinÀº ÇöÀç ÀÚ¹Ù ¹× °ü·Ã ±â¼úÀ» ÀÌ¿ëÇÏ¿© ¾ÖÇø®ÄÉÀÌ¼Ç ±â¹Ý±¸Á¶ ±¸ÇöÀ» Àü¹®ÀûÀ¸·Î ¼öÇàÇÏ°í ÀÖ´Ù. BrettÀº Java Apache ÇÁ·ÎÁ§Æ®ÀÎ TurbineÀÇ °øµ¿ ⸳ÀÚÀÌ´Ù.
ÀÌ ±â»ç¿¡ ´ëÇÏ¿© ¾î¶»°Ô »ý°¢ÇϽʴϱî?

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

  È¸»ç¼Ò°³  |  °³ÀÎÁ¤º¸ º¸È£Á¤Ã¥  |  ¹ý·ü  |  ¹®ÀÇ