.
.
.
  2003³â 8¿ù 25ÀÏ    

Enterprise Java Technologies Tech Tips (2003³â 8¿ù 25ÀÏ)¿¡ ¿À½Å ¿©·¯ºÐÀ» ȯ¿µÇÕ´Ï´Ù. Java 2 Platform, Enterprise Edition (J2EE)¿¡ ±â¹ÝÇÑ enterprise Java technologies ¿Í APIsÀÇ »ç¿ë¿¡ °üÇÑ ÃֽŠÁ¤º¸¸¦ ¾ò¾î °¡½Ã±â ¹Ù¶ø´Ï´Ù. ÀÌ ±Û¿¡¼­´Â Java 2 SDK, Standard Edition, v 1.4¿Í Java 2 SDK, Enterprise Edition, v 1.3.1 (Reference Implementation)¸¦ »ç¿ëÇÕ´Ï´Ù.

À̹ø È£¿¡¼­´Â,

.¸®½º³Ê¸¦ ÀÌ¿ëÇÑ ¾ÖÇø®ÄÉÀÌ¼Ç ÃʱâÈ­
.ÆÄÀδõ ¸Þ¼Òµå¿Í EJB-QL

ÀúÀÚ Mark Johnson

¿¹Á¦ÀÇ »ùÇà ¾ÆÄ«À̺긦 ´Ù¿î·Îµå ¹ÞÀ¸¼¼¿ä. ÄÁÅØ½ºÆ® ·çÆ®´Â ttaug2003ÀÌ°í »ùÇÃÄÚµåÀÇ »ç¿ë¹ýÀº index.html welcome file ¿¡¼­ º¸½Ç ¼ö ÀÖ½À´Ï´Ù. ÀÌ ÄÚµåÀÇ »ç¿ë¿¡ °üÇÑ ±ÇÇÑÀ̳ª Á¤º¸´Â license terms¸¦ Âü°íÇϽñ⠹ٶø´Ï´Ù.

.

¸®½º³Ê¸¦ ÀÌ¿ëÇÑ ¾ÖÇø®ÄÉÀÌ¼Ç ÃʱâÈ­

"Servlet Life Cycle Listeners" 2003/6/26 Tech Tip ¿¡¼­´Â ¾ÖÇø®ÄÉÀ̼ÇÀÇ Æ¯Á¤Äڵ带 ½ÇÇà½Ã۱â À§ÇÑ ¼­ºí¸´ ¶óÀÌÇÁ »çÀÌŬ À̺¥Æ® ¸®½º³Ê (servlet life cycle event listeners)ÀÇ ÀÌ¿ë¹æ¹ýÀ» ¼³¸íÇϰí, ¾ÖÇø®ÄÉÀÌ¼Ç ¹èÆ÷½Ã¿¡, À̸¦ ÀÌ¿ëÇØ ¾ÖÇø®ÄÉÀÌ¼Ç ÄÄÆ÷³ÍÆ®(application components)¸¦ ÃʱâÈ­ÇÒ ¼öµµ ÀÖ´Ù°í ¾ð±ÞÇÏ¿´´Ù. À̹ø TechTipÀº À¥ ¾ÖÇø®ÄÉÀ̼ÇÀÌ ¹èÆ÷µÉ ¶§, ¿£ÅÍÆ¼ ºóÀÇ ³×Æ®¿öÅ©¸¦ ¸¸µé±â À§ÇØ ServletContextListener°¡ »ç¿ëµÇ´Â ¿¹¸¦ º¸¿©ÁÙ °ÍÀÌ´Ù.

¼­ºí¸´ ¶óÀÌÇÁ »çÀÌŬ ¸®½º³Ê--¸®ºä

¶óÀÌÇÁ »çÀÌŬ ¸®½º³Ê´Â ¼­ºí¸´ ÄÜÅ×ÀÌ³Ê (servlet container)·ÎºÎÅÍ À̺¥Æ®µéÀ» ¹Þ´Â À̺¥Æ® ¸®½º³Ê Ŭ·¡½º(event listener classes)ÀÌ´Ù. ¼­ºí¸´ ÄÜÅ×À̳ʴ ƯÁ¤ ¶óÀÌÇÁ »çÀÌŬ À̺¥Æ®ÀÇ ¹ß»ýÀ» ¸®½º³Êµé¿¡°Ô ¾Ë·ÁÁÖ´Â ¿ªÇÒÀ» Çϸç, À̺¥Æ®µéÀº ´ÙÀ½°ú °°Àº ÀÏÀ» ÇÑ´Ù.

  • ¼­ºí¸´ ÄÜÅØ½ºÆ®¿Í HTTP ¼¼¼ÇÀÇ »ý¼º ȤÀº ÆÄ±â
  • ¼­ºí¸´ ÄÜÅØ½ºÆ® ¾ÖÆ®¸®ºäÆ®¿Í HTTP¼¼¼Ç ¾ÖÆ®¸®ºäÆ®ÀÇ »ý¼º, º¯°æ ȤÀº Á¦°Å
  • HTTP¼¼¼ÇÀÇ ¾×Ƽº£À̼ǰú ÆÐ½Ãº£À̼Ç(passivation)
  • HTTP ¼¼¼Ç ¾ÖÆ®¸®ºäÆ®¿¡ ±¸¼ÓµÇ¾î Àְųª ±×·¸Áö ¾ÊÀº °´Ã¼¿¡°Ô ¾Ë¸²

À¥ ¾ÖÇø®ÄÉÀ̼ÇÀº ¾ÖÇø®ÄÉÀ̼ÇÀÇ ¸ðµç ¼­ºí¸´°ú JSPÆäÀÌÁö »çÀÌ¿¡ °øÀ¯µÇ´Â ÇϳªÀÇ ServletContext°´Ã¼¸¦ °®´Â´Ù.(ºÐ»êµÈ À¥ ¾ÖÇø®ÄÉÀ̼ÇÀº °¢°¢ÀÇ À¥ ¾ÖÇø®ÄÉÀ̼ǰú ÀÚ¹Ù ¹öÃò¾ó ¸Ó½ÅÀ» À§ÇÑ ÇϳªÀÇ ServletContext¸¦ °®´Â´Ù.) À¥ ¾ÖÇø®ÄÉÀ̼ÇÀÌ ¹èÆ÷µÉ ¶§, À¥ ÄÜÅ×À̳ʴ ServletContext°´Ã¼¸¦ ÃʱâÈ­ÇÑ´Ù. ¸¸¾à À¥ ¾ÖÇø®ÄÉÀ̼ÇÀÇ deployment descriptor°¡ ServletContextListeners¸¦ ¼±¾ðÇϸé, ÄÜÅ×À̳ʴ ¼±¾ðµÈ ¸®½º³Ê ¼øÀ¸·Î °¢ ¸®½º³ÊÀÇ contextInitialized ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù. ÀÌ À̺¥Æ®´Â ¼­ºí¸´ÀÇ ¶óÀÌÇÁ »çÀÌŬ¿¡¼­ ´Ü Çѹø¸¸ ÀϾ´Âµ¥, À̺¥Æ®ÀÇ ¹ß»ý½ÃÁ¡Àº À¥ ¾ÖÇø®ÄÉÀ̼ÇÀÇ ÇÊÅͳª ¼­ºí¸´ÀÌ ÃʱâÈ­µÇ±â ÀüÀÌ´Ù. °á°úÀûÀ¸·Î, ServletContextListener.contextInitialized ¸Þ¼Òµå´Â ¾ÖÇø®ÄÉÀÌ¼Ç ÄÄÆ÷³ÍÆ®ÀÇ ÃʱâÈ­¿¡ »ç¿ëµÇ´Â °ÍÀÌ´Ù.

Listeners°¡ Æ®·£Àè¼Ç°ú Æ®·£Àè¼Ç »çÀ̸¦ ±¸º°Çϱâ(demarcate)À§Çؼ­ javax.transaction.UserTransaction ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÒ ¼ö´Â ¾ø´Ù´Â °ÍÀ» ±â¾ïÇÏÀÚ.

»ùÇà ÄÚµå

"ÆÄÀδõ ¸Þ¼Òµå¿Í EJB-QL"Àº ¿£ÅÍÆ¼ ºóÀÇ Ä÷¢¼ÇÀ» ½Äº°Çϱâ À§ÇØ ÆÄÀδõ ¸Þ¼Òµå »ý¼º ¹æ¹ýÀ» ¼³¸íÇÑ´Ù. ÀÌ ±Û¿¡¼­ »ç¿ëµÈ ¿¹Á¦´Â ÆÄÀδõ ¸Þ¼Òµå¸¦ À§ÇÑ ¿£ÅÍÆ¼ ºó¸¦ ÇÊ¿ä·Î ÇÑ´Ù. µû¶ó¼­ ¾ÖÇø®ÄÉÀ̼ÇÀÌ ¹èÆ÷µÉ ¶§, ¿£ÅÍÆ¼ ºóÀÇ ³×Æ®¿öÅ©À» »ý¼ºÇÒ ¼ö ÀÖ´Â ¼ö´ÜÀÌ ÀÖ¾î¾ß ÇÑ´Ù. ±× ¼ö´ÜÀ̶ó´Â °ÍÀº ServletContextListener¸¦ ÅëÇØ¼­ Á¦°øµÈ´Ù. ¾ö¹ÐÈ÷ ¸»ÇÏÀÚ¸é, ÀÌ ÆÁ¿¡¼­ Á¦°øµÈ »ùÇà ÄÚµå´Â LoadDataSCL Ŭ·¡½º¸¦ Æ÷ÇÔÇϴµ¥, ÀÌ Å¬·¡½º´Â ServletContextListenerÀÇ contextInitialized ¸Þ¼Òµå°¡ ¿£Æ¼Æ¼ ºóÀÇ ³ØÆ®¿öÅ©À» »ý¼ºÇϵµ·Ï ServletContextListenerÀ» ±¸ÇöÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. ÀÌ ¸Þ¼Òµå´Â À¥ ¾ÖÇø®ÄÉÀÌ¼Ç ¾ÆÄ«À̺ê(WAR file)¿¡¼­ ¹èÆ÷µÇ´Â XMLÆÄÀÏÀÇ ÄÁÅÙÃ÷¿¡ ±â¹ÝÇÑ ºóÀ» »ý¼ºÇÑ´Ù. LoadDataSCL Ŭ·¡½ºÀÇ contextInitialized ¸Þ¼Òµå¸¦ º¸ÀÚ.

   public void contextInitialized(
                             ServletContextEvent sce) {
      ServletContext sc = sce.getServletContext();
      
      System.out.println(
         "contextInitialized: Creating entity beans.");

      DataLoader dl = new DataLoader();
      InputStream is = sc.getResourceAsStream(
                                    "/persondata.xml");
      dl.load(is);

      System.out.println(
          "contextInitialized: Entity beans created.");
   }

ÀÌ ¸Þ¼Òµå´Â ServletContextEvent ŸÀÔÀÇ ´ÜÀÏÀμö(single argument)¸¦ ¹Þ°í, ServletContextEvent´Â ÃʱâÈ­µÇ´Â ¼­ºí¸´ ÄÁÅØ½ºÆ®¿¡ ·¹ÆÛ·±½º¸¦ ¸®ÅÏÇÏ´Â getServletContext¸Þ¼Òµå¸¦ Æ÷ÇÔÇÑ´Ù. DataLoader°´Ã¼´Â Æ÷¸ËµÈ InputStreamÀÎ XML·ÎºÎÅÍ data read¸¦ ÀÌ¿ëÇÏ¿© ·ÎÄà Person, Address, PhoneNumber ¿£ÅÍÆ¼ ºó¸¦ »ý¼ºÇÑ´Ù. ÀÎDz ½ºÆ®¸²(input stream)Àº getResourceAsStreamÀÇ È£Ãâ¿¡¼­ ¾ç»ýµÇ¾ú°í ¾ÖÇø®ÄÉÀÌ¼Ç ¾ÆÄ«À̺꿡 ÆÐŰÁöµÈ XMLÆÄÀÏ¿¡ ½ºÆ®¸²À» ¿¬´Ù.

¾ÖÇø®ÄÉÀ̼ÇÀÇ ¹èÆ÷½Ã¿¡, ¼­ºí¸´ ÄÜÅ×À̳ʴ ServletContext°´Ã¼¸¦ ÃʱâÈ­ÇÑ ÈÄ, LoadDataSCLŬ·¡½ºÀÇ ÀνºÅϽº¸¦ »ý¼ºÇϰí ServletContextEvent°´Ã¼¸¦ ServletContextEvent¿¡ ³Ñ°ÜÁØ´Ù. ±×¸®°í ³ª¼­ ¸Þ¼Òµå´Â XMLÆÄÀÏ¿¡ Á¤ÀÇµÈ ¿£ÅÍÆ¼ ºóÀÇ ³×Æ®¿öÅ©À» »ý¼ºÇÑ´Ù. °¡·É, »ç¿ëÀÚ°¡ Reference Implementation¿¡ ¾ÖÇø®ÄÉÀ̼ÇÀ» ¹èÆ÷½Ã۸é, ¼­¹ö ·Î±× ÆÄÀÏ¿¡ ´ÙÀ½À» Ãâ·ÂÇÑ´Ù.

   contextInitialized: Creating entity beans.
   INFO: Document parsed
   contextInitialized: Entity beans created.
   Created Context:/ttaug2003
   Application TTAug2003 deployed.

¾ÖÇø®ÄÉÀÌ¼Ç ¹èÆ÷°¡ ¿Ï¼ºµÇ±â Àü¿¡ ÃʱâÈ­ °úÁ¤ÀÌ ¼±ÇàµÇ¾î¾ß ÇÔÀ» ¸í½ÉÇÏÀÚ. µ¥ÀÌÅ͸¦ ÃʱâÈ­Çϱâ À§Çؼ­ ¸®½º³Ê¸¦ ÀÌ¿ëÇÏ´Â °ÍÀº À¥ ¸®Äù½ºÆ®°¡ ¼­ºñ½ºµÇ±â Àü¿¡ ÀÌ¹Ì »ý¼º ȤÀº ÃʱâÈ­ µÈ °´Ã¼°¡ Á¸ÀçÇÑ´Ù´Â °ÍÀ» ¸»ÇÑ´Ù.

ÀÌ ±â¹ýÀº ¿£ÅÍÆ¼ ºóÀÇ ³×Æ®¿öÅ©¸¦ »ý¼ºÇϴµ¥ À¯¿ëÇÒ »Ó¸¸ ¾Æ´Ï¶ó, database connections, JMS sessions, Connector ·¹ÆÛ·±½º¿Í °°Àº À¥ ÄÄÆ÷³ÍÆ®µé °£¿¡ °øÀ¯µÇ´Â ¸®¼Ò½º¸¦ ¼­ºí¸´ ÄÜÅØ½ºÆ® ¸®½º³Ê(servlet context listener)¿¡ ÃʱâÈ­ÇÒ ¶§µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

¸¶Áö¸·À¸·Î »ç¿ëÀÚ´Â À¥ ¾ÖÇø®ÄÉÀ̼ÇÀÇ ¸®¼Ò½º¸¦ »ý¼ºÇϱâ À§ÇØ ´Ù¸¥ ŸÀÔÀÇ ¸®½º³Ê¸¦ ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¸é, HTTP ¼¼¼Ç ¾ÖÆ®¸®ºäÆ®¿¡ »óŸ¦ °®´Â ¼¼¼Ç ºó (°¡·É, ¼îÇÎīƮ¸¦ ³ªÅ¸³»´Â °Í°ú °°Àº) ¿¡ ´ëÇÑ ·¹ÆÛ·±½º¸¦ ÀúÀåÇÒ ¼ö ÀÖ´Ù. ±×¸®°í ³ª¼­ °°Àº ¼¼¼Ç ºó ·¹ÆÛ·±½º´Â °°Àº ¼¼¼Ç¾ÈÀÇ ¿©·¯ À¥ ¸®Äù½ºÆ®¸¦ ¼­ºñ½ºÇϵµ·Ï »ç¿ëµÉ ¼ö ÀÖ´Ù. HTTP ¼¼¼Ç ¸®½º³Ê Ŭ·¡½º¸¦ ÀÌ¿ëÇØ¼­ È®º¸µÈ ¼¼¼Ç ºó ·¹ÆÛ·±½º¸¦ HTTP ¼¼¼Ç¿¡ ÀúÀåÇÒ ¼ö Àִµ¥, ƯÁ¤ ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö°¡ ÀÌ·¯ÇÑ ¿¬»êÀ» ¼öÇàÇÒ ¶§, ¼¼¼Ç ¸¶À̱׷¹À̼Ç(session migration)°ú ÆÐ½Ãº£À̼Ç/Ȱ¼ºÈ­(passivation/activation)¸¦ ÀûÀýÇÏ°Ô ´Ù·ç´Â ¿ªÇÒµµ ÀÌ Å¬·¡½ºÀÇ ¸òÀÌ´Ù.

.
.

ÆÄÀδõ ¸Þ¼Òµå¿Í EJB-QL

ÆÄÀδõ ¸Þ¼Òµå´Â ¿£ÅÍÆ¼ ºóÀÇ ÀνºÅϽº³ª Ä÷¢¼ÇÀ» ã´Â ¿£ÅÍÆ¼ ºó Ȩ ÀÎÅÍÆäÀ̽º ¸Þ¼ÒµåÀÌ´Ù. ¾ÖÇø®ÄÉÀ̼ǰú ÄÞÆ÷³ÍÆ® °³¹ßÀÚµéÀº ÀνºÅϽº¸¦ ãÀ» ¶§ »ç¿ëÇϵµ·Ï ¹üÁÖ¸¦ Á¤ÇÑ´Ù. ¿¹¸¦ µé¾î ÄÞÆ÷³ÍÆ® °³¹ßÀÚ°¡ Account home interface ¸Þ¼ÒµåÀÎ findDelinquentAccounts¸¦ Á¤ÀÇÇϸé, ÀÌ ¸Þ¼Òµå´Â 90ÀÏ ÀÌ»ó Áö³­ ¾îÄ«¿îÆ®¸¦³ªÅ¸³»´Â ¸ðµç AccountÀÇ ·¹ÆÛ·±½º ÄÝ·¢¼ÇÀ» ¸®ÅÏÇÑ´Ù.

Enterprise JavaBeans (EJB) version 2.0ÀÌÀü¿¡´Â, ÆÄÀδõ ¸Þ¼Òµå¸¦ »ý¼ºÇÏ´Â °ÍÀÌ ¾î·Á¿üÁö¸¸, EJB specification version 2.0ÀÇ Äõ¸® ·©±ÍÁö (EJB-QL) ¼Ò°³ ÀÌÈÄ, ÆÄÀδõ ¸Þ¼ÒµåÀÇ »ý¼ºÀÌ ÈξÀ ¼ö¿ùÇØÁ³´Ù.

EJB-QLÀº standard SQL 92¿¡ ±â¹ÝÇÑ(ȤÀº ºñ½ÁÇÑ) °´Ã¼ÁöÇâÀûÀÎ Äõ¸® ·©±ÍÁöÀÌ´Ù. ÀÌ ±ÛÀº EJB 2.0 À̻󿡼­ ÆÄÀδõ ¸Þ¼Òµå ±¸ÇöÀ» À§ÇÑ EBJ-QL »ç¿ë ¹æ¹ýÀ» ¼³¸íÇϰí, Áö³­ Å×Å©ÆÁÀÎ "¸®½º³Ê¸¦ ÀÌ¿ëÇÑ ¾ÖÇø®ÄÉÀÌ¼Ç ÃʱâÈ­" ¿¡¼­ ¼³¸íÇÑ ·Î´õÀÇ ÃʱâÈ­¿¡ ÀÇÇØ »ý¼ºµÈ ¿£ÅÍÆ¼ ºóÀ» »ç¿ëÇÑ ÆÄÀδõÀÇ ¿¹¸¦ »ìÆìº»´Ù.

ÆÄÀδõ¿Í Äõ¸®

EJB 2.0 ÀÌÀü¿¡´Â ÆÄÀδõ ¸Þ¼Òµå¸¦ »ý¼ºÇÒ ¶§ 2°¡Áö ¿É¼ÇÀÌ ÀÖ¾ú´Ù;

  • bean-managed persistence¸¦ »ç¿ëÇϰí ejbFind ¸Þ¼Òµå¸¦ ¼öµ¿À¸·Î ±¸ÇöÇÑ´Ù.

  • container-managed persistence¸¦ »ç¿ëÇϰí, vendor-specific Äõ¸® ·©±ÍÁö¸¦ ÀÌ¿ëÇÏ¿© ÆÄÀδõ ±¸ÇöÀ» Á¤ÀÇÇÑ´Ù.

ù¹øÂ° ¹æ¹ýÀº À̽İ¡´ÉÇÏ°Ô ¸¸µé ¼ö ÀÖ´Ù´Â ÀåÁ¡À» °®Áö¸¸, ¸¹Àº ¾çÀÇ ÀÏÀ» µ¿¹ÝÇϰí CMPÀÇ ÀÌÁ¡À» ÀÌ¿ëÇÒ ¼ö°¡ ¾ø´Â ´ÜÁ¡ÀÌ ÀÖ´Ù. ¹Ý¸é µÎ¹øÂ° ¹æ¹ýÀº »ó´ëÀûÀ¸·Î ½±°Ô ±¸ÇöÇÒ ¼ö ÀÖÁö¸¸ À̽ļºÀ» Æ÷±âÇØ¾ß ÇÑ´Ù.

EJB 2.0ÀÌ»óÀÇ ÆÄÀδõ ¸Þ¼Òµå´Â À̽İ¡´ÉÇÏ°í ½±´Ù.(»ç½Ç, ÆÄÀδõ ¸Þ¼Òµå¸¦ ÀÛ¼ºÇÒ ÇÊ¿äÁ¶Â÷ ¾ø´Ù.) EJB 2.0 ¿¡¼­ ÆÄÀδõ ¸Þ¼Òµå¸¦ »ý¼ºÇÏ´Â ¹æ¹ýÀ» º¸ÀÚ.

  1. »ùÇÃÄڵ忡¼­ ¹ßÃéÇÑ ³»¿ë°ú °°ÀÌ ¿£ÅÍÆ¼ ºóÀÇ È¨ ÀÎÅÍÆäÀ̽º¿¡ ÆÄÀδõ ¸Þ¼Òµå signature¸¦ Á¤ÀÇÇÑ´Ù. ÆÄÀδõ ¸Þ¼Òµå signature´Â PersonLocal ¿£ÅÍÆ¼ ºóÀÇ PersonLocalHome ÀÎÅÍÆäÀ̽º¿¡ Á¤ÀǵȴÙ.
          public interface PersonLocalHome 
             extends EJBLocalHome {
                 ...
             public Collection findAll() 
                throws FinderException;
                 ...
          };
    
  2. µÎ¹øÂ°·Î, ¿£ÅÍÇÁ¶óÀÌÁî ºóÀÇ deployment descriptor¿¡ <query>¿ä¼Ò¸¦ Ãß°¡ÇÑ´Ù. ´ÙÀ½Àº PersonLocal ¿£ÅÍÆ¼ ºóÀÇ deployment descriptor¿¡¼­ ¹ßÃéÇÑ °ÍÀÌ´Ù.
          <query>
            <description>
               Return all Person objects
            </description>
            <query-method>
              <method-name>findAll</method-name>
              <method-params />
            </query-method>
            <ejb-ql>
              SELECT OBJECT(p) FROM Person AS p
            </ejb-ql>
          </query>
    

<query>´Â Äõ¸®°¡ ÇÏ´Â ÀÏÀ» ¹®¼­È­ÇÏ´Â <description>¿ä¼Ò¸¦ °®´Â´Ù. <query-method>´Â Ȩ ÀÎÅÍÆäÀ̽º¿¡¼­ Á¤ÀÇµÈ ÆÄÀδõ ¸Þ¼ÒµåÀÇ À̸§À» Á¤ÀÇÇÑ´Ù. (ÀÌ °æ¿ì¿¡´Â findAllÀÌ´Ù.) <method-param>¿ä¼ÒµéÀÇ ¸®½ºÆ®´Â ¸Þ¼Òµå ¸Å°³º¯¼ö(parameter)ÀÇ Å¸ÀÔÀ» Á¦°øÇÑ´Ù. ¸Þ¼ÒµåÀÇ À̸§°ú ÇÔ²² ŸÀÔ ¸®½ºÆ®´Â À¯ÀϹ«ÀÌÇÏ°Ô ¸Þ¼Òµå signature¸¦ ½Äº°ÇÑ´Ù. ¸¶Áö¸·À¸·Î, <ejb-ql>Àº ¾î¶² ¿£ÅÍÆ¼ ºóÀÌ ÆÄÀδõ¿¡ ÀÇÇØ ¸®ÅϵǾî¾ß ÇÏ´ÂÁö¸¦ ½Äº°ÇÏ´Â EJB-QL Äõ¸®¸¦ Á¤ÀÇÇϴµ¥, À§ÀÇ °æ¿ì¿¡´Â ¸ðµç Person °´Ã¼µéÀÌ ¸®ÅϵȴÙ.

¹èÆ÷½Ã¿¡, deployment toolsÀº ÆÄÀδõ ¸Þ¼Òµå¸¦ ÀÛ¼ºÇϰųª ±¸ÇöÇϱâ À§ÇØ EJB-QL Äõ¸®¸¦ »ç¿ëÇÑ´Ù. EBJ-QLÀÇ ±¸Á¶(semantics)°¡ EJB ¸í¼¼(specification)¿¡ ¸í½ÃµÇ¾î Àֱ⠶§¹®¿¡ EJB-QL Äõ¸®°¡ ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö¸¦ ÅëÇØ À̽İ¡´ÉÇÏ´Ù.

ÆÄÀδõ ¸Þ¼Òµå¸¦ Á» ´õ ÀÚ¼¼È÷ »ìÆìº¸ÀÚ.

Finder Method Declarations ÀÛ¼ºÇϱâ

¾Õ¿¡¼­ ¾ð±ÞÇß´Ù½ÃÇÇ, ÆÄÀδõ ¸Þ¼Òµå¸¦ »ý¼ºÇÒ ¶§ ¿£ÅÍÆ¼ ºóÀÇ È¨ ÀÎÅÍÆäÀ̽º¿¡ ¸Þ¼Òµå signature¸¦ ¼±¾ðÇØ¾ß Çϴµ¥, ±× ¸Þ¼Òµå´Â ÄÜÅ×À̳ʿ¡ ÀÇÇØ ÀÚüÀûÀ¸·Î ±¸ÇöµÈ´Ù. ÆÄÀδõ ¸Þ¼Òµå´Â ´ÙÀ½°ú °°Àº ·êÀ» °®´Â´Ù.

  • ÆÄÀδõ ¸Þ¼ÒµåÀÇ À̸§Àº ½ºÆ®¸µ "find"À¸·Î ½ÃÀÛÇØ¾ß ÇÑ´Ù.

  • ÆÄÀδõ ¸Þ¼Òµå´Â ¹Ýµå½Ã ÆÛºí¸¯À̾î¾ß ÇÑ´Ù.

  • ¸ðµç ÆÄÀδõ ¸Þ¼Òµå´Â FinderException¸¦ º¸³½´Ù.

  • ¿ø°Ý ÆÄÀδõ ¸Þ¼Òµå´Â RemoteExceptionÀ» ¹ß»ý½ÃŰÁö¸¸, ·ÎÄà ÆÄÀδõ ¸Þ¼Òµå´Â ±×·² ¼ö ¾ø´Ù.

  • ÆÄÀδõ ¸Þ¼ÒµåÀÇ ¸®ÅϰªÀº ÄÄÆ÷³Íµå ÀÎÅÍÆäÀ̽º ŸÀÔÀ̰ųª, ÄÄÆ÷³ÍÆ® ÀÎÅÍÆäÀ̽º ŸÀÔÀÇ java.util.Collection°´Ã¼ÀÌ´Ù. ¸¸¾à Äõ¸®°¡ ÇϳªÀÌ»óÀÇ °ªÀ» ÀáÀçÀûÀ¸·Î ¸®ÅÏÇÑ´Ù¸é, ±×°ÍÀÇ ¸®ÅϰªÀº ¹Ýµå½Ã java.util.CollectionÀ̾î¾ß ÇÑ´Ù.

  • Ȩ ÀÎÅÍÆäÀ̽º´Â ¹Ýµå½Ã Ȩ ÀÎÅÍÆäÀ̽º¿¡ Á¸ÀçÇÏ´Â findByPrimaryKey(primaryKeyType) ¸Þ¼Òµå¸¦ Æ÷ÇÔÇØ¾ßÇϰí, ¿À¹ö·ÎµåÇÏ¸é ¾ÈµÈ´Ù. PrimaryKeyTypeÀº ¿£ÅÍÆ¼ÀÇ ÇÁ¶óÀ̸Ӹ® ŰŸÀÔÀ̰í ÄÄÆ÷³ÍÆ® ÀÎÅÍÆäÀ̽º ŸÀÔ¸¦ ¸®ÅÏÇÑ´Ù.

ÆÄÀδõ signatures¸¦ ÁöÁ¤ÇÑ ÈÄ¿¡´Â <query>¸¦ ¿£ÅÍÆ¼ ºóÀÇ deployment descriptor¿¡ Ãß°¡Çϰí, ´ëÀÀ(corresponding) ¿£ÅÍÆ¼ ºóÀ» Á¤ÀÇÇÏ´Â <entity> ¾È¿¡ <query> ¸¦ ³»Æ÷½ÃŲ´Ù.

EJB-QL ÀÌÇØÇϱâ

EJB-QL Äõ¸®´Â ¿£ÅÍÆ¼ ºóÀÇ abstract persistence schema·ÎºÎÅÍ °ª(values), °´Ã¼(objects), ±×¸®°í °´Ã¼ÀÇ Ä÷¢¼Ç (collections of objects)À» ¼±ÅÃÇÑ´Ù. abstract persistence schema´Â ¿£ÅÍÆ¼ ºó, ±×°ÍÀÇ CMPÆÄÀÏ, ±× µÑÀ» ¼­·Î ¿¬°áÇÏ´Â CMRÇʵåÀÇ À̽İ¡´ÉÇÑ schema representationÀÌ´Ù. ÄÜÅ×ÀÌ³Ê¿Í deployment toolsÀº abstract schema¿Í ±×¿¡ ¹ÝÇÏ´Â Äõ¸®¸¦ ƯÁ¤ Ç÷§Æû ±¸ÇöÀ» À§ÇÑ ½ÇÁ¦ ½ºÅ°¸¶(real schema)¿Í Äõ¸®·Î ¸ÊÇÎÇÑ´Ù.

EJB-QL Äõ¸®ÀÇ ±¸¼º¿ä¼Ò´Â,

  • Äõ¸®°¡ ¸®ÅÏÇÒ °ÍÀ» Á¤ÇÏ´Â SELECT ±¸
  • µ¥ÀÌÅͰ¡ ¿Â Àå¼Ò¸¦ ÁöÁ¤ÇÏ´Â FROM ±¸
  • °´Ã¼ ¼¿·º¼ÇÀÇ ¹üÁÖ¸¦ Á¤ÇÏ´Â WHERE ±¸

»ùÇà ÄÚµåÀÇ ÆÄÀδõ ¸Þ¼Òµå¿Í <query>¿ä¼Ò¸¦ º¸¿©ÁÖ´Â ¿¹¸¦ º¸ÀÚ. ÆÄÀδõ ¸Þ¼Òµå´Â PersonLocal ¿£ÅÍÆ¼ ºóÀÇ PersonLocalHome ÀÎÅÍÆäÀ̽º¿¡ ¼±¾ðµÇ¾ú´Ù.

ÇÁ¶óÀ̸Ӹ® ۸¦ ÀÌ¿ëÇÑ °´Ã¼ ã±â

¸ðµç °´Ã¼´Â findByPrimaryKey¸Þ¼Òµå¸¦ °®´Âµ¥, PersonLocalHome¿¡ ÀÛ¼ºµÈ signature´Â ´ÙÀ½°ú °°´Ù.

   public PersonLocal findByPrimaryKey(String key)
      throws FinderException;

ÀÌ ¸Þ¼Òµå´Â Ç×»ó ÄÜÅ×À̳ʿ¡ ÀÇÇØ ±¸ÇöµÇ±â ¶§¹®¿¡ ´ëÀÀ EJB-QL°¡ ¾ø´Ù.

¸ðµç °´Ã¼ ã±â

¸¹Àº ¿£ÅÍÆ¼ ºóÀº ÄÄÆ÷³ÍÆ® ÀÎÅÍÆäÀ̽º ŸÀÔÀÇ Ä÷¢¼ÇÀ» ¸®ÅÏÇÏ´Â findAll ¸Þ¼Òµå¸¦ Á¦°øÇÑ´Ù. »ùÇÃÄÚµåÀÇ ÆÄÀÎÅÍ ¸Þ¼Òµå ¼±¾ðÀº,

   public Collection findAll() throws FinderException;

À̰í,
ÆÄÀδõÀÇ ´ëÀÀ EJB-QL´Â;

   SELECT OBJECT(p) FROM Person AS p

ÀÌ Äõ¸®´Â Person¿¡¼­ °´Ã¼µéÀ» ¼±ÅÃÇÑ´Ù. FROM ±¸´Â Person °´Ã¼¿Í p°´Ã¼ÀÇ "nicknames"¸¦ ¼±ÅÃÇÑ´Ù. ´Ð³×ÀÓÀº OBJECT(p)¸¦ »ç¿ëÇÏ¿©, ¼¿·ºÆ® ±¸ÀÇ °´Ã¼ ŸÀÔÀ¸·Î º¯È¯µÈ´Ù. ÆÄÀδõ ¸Þ¼Òµå´Â ÄÄÆ÷³ÍÆ® ÀÎÅÍÆäÀ̽º³ª Ä÷¢¼Ç¸¸ ¸®ÅÏÇÑ´Ù´Â °ÍÀ» ±â¾ïÇÏÀÚ.

NULLÀ» ÀÌ¿ëÇØ¼­ °ªÀÌ Á¸ÀçÇÏ´ÂÁö È®ÀÎÇÏÀÚ

»ùÇÃÄÚµåÀÇ Ãß»ó ½ºÅ°¸¶(abstract schema)¿¡¼­, PersonÀº 0°³ ȤÀº ÇÑ °³ÀÇ workAddress °´Ã¼¸¦ °®´Âµ¥, Çϳªµµ °®Áö ¾Ê¾ÒÀ» °æ¿ì Person.workAddressÀÇ °ªÀº NULLÀÌ´Ù. workAddress ¾ø´Â user¸¦ ã±â À§ÇÑ ÆÄÀδõ ¸Þ¼ÒµåÀÇ signature´Â ÀÌÇÏ¿Í °°´Ù.

   public Collection findWithNoWorkAddress()
     throws FinderException;

deployment descriptorÀÇ ´ëÀÀ EJB-QL´Â;

   SELECT OBJECT(p)
   FROM Person AS p
   WHERE p.workAddress IS NULL

°á°ú°¡ "workAddress IS NULL"ÀÎ »ç¶÷¿¡°Ô·Î ÇÑÁ¤µÇ¾ú´Ù´Â °Í¸¸ Á¦¿ÜÇϸé ÀÌ Äõ¸®´Â findAll°ú Èí»çÇÏ´Ù. "workAddress IS NULL"´Â PersonÀÌ workAddress¸¦ °®Áö ¾ÊÀ» ¶§¿¡ ÀϾ´Ù. ¶ÇÇÑ Å°¿öµå NULLÀº "WHERE p.middlename IS NULL"°ú °°ÀÌ cmp-field°¡ ¼³Á¤µÇ¾ú´ÂÁö¸¦ Å×½ºÆ®Çϱâ À§ÇØ WHERE ±¸¹®¾È¿¡¼­ »ç¿ëµÈ´Ù.

Ä÷¢¼ÇÀÌ ¸â¹ö¸¦ °®´ÂÁö EMPTY¸¦ »ç¿ëÇØ¼­ È®ÀÎÇÏÀÚ

abstract persistence schema¿¡¼­ Person °ú PhoneNumber´Â1´ë ´ÙÀÇ °ü°è¸¦ °®´Â´Ù. PhoneÀÌ ¾ø´Â ¸ðµç Person°´Ã¼¸¦ ã´Â PersonLocalHome¸Þ¼Òµå¸¦ º¸ÀÚ.

   public Collection findWithNoPhone() 
      throws FinderException;

ÀÌ ÆÄÀδõÀÇ EJB-QL´Â;

   SELECT OBJECT(p) FROM Person AS p
   WHERE p.phones IS EMPTY

p.phones´Â Ä÷¢¼ÇÀ̱⠶§¹®¿¡ IS NULL´ë½Å¿¡ IS EMPTY°¡ »ç¿ëµÇ¾ú´Ù. ¹Ý´ë·Î EJB-QL ÀÇ NOT ¿¬»êÀÚ¸¦ »ç¿ëÇØ¼­ Phones¸¦ °®´Â ¸ðµç PersonsÀ» ãÀ» ¼öµµ Àִµ¥ À̶§´Â WHERE ±¸¸¦ WHERE p.phones IS NOT EMPTY·Î ¹Ù²Ù¸é µÈ´Ù.

Äõ¸®·Î Àμö(arguments) ³Ñ°ÜÁÖ±â

Äõ¸®´Â ƯÁ¤ Àå¼Ò¿¡ "?1", "?2"°ú °°Àº ÆûÀÇ À§Ä¡¸Å°³º¯¼ö(positional parameters)¸¦ °®´Â´Ù. (ÀÚ¼¼ÇÑ ³»¿ëÀº EJB 2.0 specificationÀ» Âü°í.) ¿©±â¼­ ¼ýÀÚ´Â ÆÄÀδõ signatureÀÇ ¸Å°³º¯¼ö ¸®½ºÆ®¿¡ ¸Å°³º¯¼öÀÇ À§Ä¡¸¦ ÁöÁ¤Çϴµ¥, ¸Å°³º¯¼öÀÇ À妽º ÃʱⰪÀº 1ÀÌ´Ù. (´Ù½Ã ¸»Çϸé, "?0"´Â ¾ø´Ù´Â ¸»ÀÌ´Ù.)

µ¥ÀÌÅͺ£À̽ºÀÇ ¸ðµç PersonÀº MÀ̳ª F°ªÀ» °®°í ÆÄÀδõ´Â ¼ºº°·Î ¸ðµç Persons¸¦ ã¾Æ³½´Ù.

   public Collection findGender(String gender)
      throws FinderException;

¶ÇÇÑ ±×°ÍÀÇ <query> ¿ä¼Ò´Â;

   <query>
     <description>Return persons by gender</description>
     <query-method>
       <method-name>findGender</method-name>
       <method-params>
         <method-param>java.lang.String</method-param>
       </method-params>
     </query-method>
     <ejb-ql>SELECT OBJECT(p) FROM Person AS p
       WHERE p.gender = ?1</ejb-ql>
   </query>

¿©±â¼­ ÁÖ¸ñÇÒ ¸¸ÇÑ °ÍÀº <method-param>°¡ ´ÜÀÏ ½ºÆ®¸µ Àμö¸¦ °®´Â ¸Þ¼Òµå¸¦ ÁöÁ¤ÇÑ´Ù´Â °Í°ú, WHERE p.gender = ?1¸¦ Æ÷ÇÔÇÏ´Â WHERE clauseÀÇ ¸Å°³º¯¼ö ?1ÀÌ Äõ¸® °¡ ½ÇÇàµÉ ¶§ StringÀμö·Î ´ëüµÈ´Ù´Â °ÍÀÌ´Ù.

ÀÌ ±ÛÀº ÆÄÀδõ ¸Þ¼ÒµåÀÇ »ý¼ºÀ» À§ÇÑ EJB-QLÀÇ ¼Ò°³¿¡ ±×Ä¡°í ÀÖÁö¸¸, EJB-QLÀº ÀÌÈÄÀÇ Enterprise Java Technologies Tech Tips¿¡¼­ ¼¿·ºÆ® ¸Þ¼Òµå¸¦ »ý¼ºÇÒ ¶§µµ »ç¿ëµÉ °ÍÀÌ´Ù. EJB-QL¿¡ ´ëÇÑ ½ÉÈ­ Á¤º¸´Â Applying Enterprise JavaBeans¸¦ Âü°íÇÑ´Ù.

.
.

»ùÇÁ ÄÚµå ½ÇÇàÇϱâ

ÀÌ ÆÁÀÇ »ùÇà ¾ÆÄ«À̺긦 ´Ù¿î·Îµå¹ÞÀÚ. ¾ÖÇø®ÄÉÀ̼ÇÀÇ ÄÁÅØ½ºÆ® ·çÆ®´Â ttaug2003À̰í, ´Ù¿î·ÎµåµÈ EARÆÄÀÏÀº ¿Ï¼ºµÈ »ùÇÿ¹Á¦Äڵ带 Æ÷ÇÔÇÑ´Ù.

»ùÇÃÇÁ·Î±×·¥À» ½ÇÇàÇϱâ À§Çؼ­´Â ´ÙÀ½ °úÁ¤ÀÌ ÇÊ¿äÇÏ´Ù.

  1. j2ee¼­¹ö¿Í µ¥ÀÌÅͺ£À̽º ¼­¹ö ¸ðµÎ ½ÇÇà ÁßÀÎÁö È®ÀÎÇÏÀÚ. J2EE Reference ImplementationÀ» À§Çؼ­´Â ´ÙÀ½ 2°¡Áö¸¦ ¸ðµÎ ½ÇÇàÇØ¾ß ÇÑ´Ù.
         j2ee -verbose
    
    and
         cloudscape -start
    
  2. ¾Õ¼­ ¼³¸íÇÑ °Íó·³ earÆÄÀÏÀ» ´Ù¿î·Îµå¹ÞÀÚ.

  3. ¼­¹ö¿¡ earÆÄÀÏÀ» ¹èÆ÷ÇÏÀÚ. »ç¿ëÀÚ´Â deploytool ÇÁ·Î±×·¥À» ÀÌ¿ëÇØ¼­ J2EE Reference Implementation¿¡ ¾ÖÇø®ÄÉÀÌ¼Ç ¾ÆÄ«À̺ê(ttaug2003.ear)¸¦ ¹èÆ÷ÇÒ ¼ö ÀÖ´Ù.
        $J2EE_HOME/deploytool -deploy ttaug2003.ear localhost
    
    ·ÎÄà ȣ½ºÆ®(localhost)¸¦ ¼­¹ö°¡ ¼³Ä¡µÇ´Â È£½ºÆ®ÀÇ À̸§À¸·Î ´ëüÇÏÀÚ. ´ÜÀÏ ¸Ó½Å¿¡ ÀνºÅçÇÒ ¶§, È£½ºÆ®À̸§Àº ÀϹÝÀûÀ¸·Î(±ÛÀÚ ¶æ´ë·Î) localhost°¡ µÈ´Ù.

  4. ¾ÖÇø®ÄÉÀ̼ÇÀ» http://localhost:8000/ttaug2003 ¿¡ ¾×¼¼½ºÇÏÀÚ.

Reference Implementationº¸´Ù´Â J2EEÀÇ specificationÀ» µû¸£´Â ±â´É ±¸ÇöÀÇ Ãø¸é¿¡¼­ »ç¿ëÇϰíÀÚ ÇÑ´Ù¸é »ç¿ëÀÚÀÇ Ç÷§Æû¿¡ ¾ÖÇø®ÄÉÀ̼ÇÀ» ¹èÆ÷Çϱâ À§ÇØ J2EE ÇÁ·Î´öÆ®ÀÇ ¹èÆ÷ Åø(deployment tool)À» »ç¿ëÇÑ´Ù.

¾ÖÇø®ÄÉÀÌ¼Ç ½ÇÇàÁß¿¡ index.html welcome file for instructionsÀ» º¸ÀÚ.

¾ÖÇø®ÄÉÀ̼ÇÀ» ½ÇÇàÇϸé, ´ÙÀ½°ú °°Àº ÆäÀÌÁö¸¦ º¸°Ô µÈ´Ù.

figure 5

°áÇÕµÈ EJB-QL ¸¦ ½ÇÇàÇϱâ À§ÇØ ÇÏÀ̶óÀÌÆ®µÈ ±â´ÉÀ» Çϳª ȤÀº ¸î °³ ¼±ÅÃÇÏÀÚ. °¡·É, »ç¿ëÀÚ°¡ ´ÙÀ½À» ¼±ÅÃÇϸé,

   List Persons with no phone

ÆÄÀδõ ¸Þ¼ÒµåÀÎ findWithNoPhone()ÀÇ EJB-QLÀÌ ½ÇÇàµÈ´Ù.

   SELECT OBJECT(p) FROM Person AS p
   WHERE p.phones IS EMPTY   

°á°ú´Â ´ÙÀ½°ú °°´Ù.

figure 5

.
.
.

Reader Feedback

  ¸Å¿ì ÁÁ´Ù    ÁÁ´Ù    ±×Àú ±×·¸´Ù 

 

ÀÚ¹Ù ÇÁ·Î±×·¡¹ÖÀÌ ±Ã±ÝÇϼ¼¿ä? Java Online SupportÀ» Âü°íÇϼ¼¿ä.

.
.


Sun Microsystems, Inc.
.
.