|
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 ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù.
ÀÌ À̺¥Æ®´Â ¼ºí¸´ÀÇ ¶óÀÌÇÁ »çÀÌŬ¿¡¼ ´Ü Çѹø¸¸ ÀϾ´Âµ¥, À̺¥Æ®ÀÇ ¹ß»ý½ÃÁ¡Àº
À¥ ¾ÖÇø®ÄÉÀ̼ÇÀÇ ÇÊÅͳª ¼ºí¸´ÀÌ ÃʱâȵDZâ ÀüÀÌ´Ù. °á°úÀûÀ¸·Î,
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 ¿¡¼ ÆÄÀδõ ¸Þ¼Òµå¸¦ »ý¼ºÇÏ´Â ¹æ¹ýÀ» º¸ÀÚ.
- »ùÇÃÄڵ忡¼ ¹ßÃéÇÑ ³»¿ë°ú °°ÀÌ ¿£ÅÍÆ¼ ºóÀÇ È¨ ÀÎÅÍÆäÀ̽º¿¡ ÆÄÀδõ ¸Þ¼Òµå
signature¸¦ Á¤ÀÇÇÑ´Ù. ÆÄÀδõ ¸Þ¼Òµå signature´Â
PersonLocal ¿£ÅÍÆ¼ ºóÀÇ
PersonLocalHome ÀÎÅÍÆäÀ̽º¿¡ Á¤ÀǵȴÙ.
public interface PersonLocalHome
extends EJBLocalHome {
...
public Collection findAll()
throws FinderException;
...
};
- µÎ¹øÂ°·Î, ¿£ÅÍÇÁ¶óÀÌÁî ºóÀÇ 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ÆÄÀÏÀº ¿Ï¼ºµÈ »ùÇÿ¹Á¦Äڵ带 Æ÷ÇÔÇÑ´Ù.
»ùÇÃÇÁ·Î±×·¥À» ½ÇÇàÇϱâ À§Çؼ´Â ´ÙÀ½ °úÁ¤ÀÌ ÇÊ¿äÇÏ´Ù.
- j2ee¼¹ö¿Í µ¥ÀÌÅͺ£À̽º ¼¹ö ¸ðµÎ ½ÇÇà ÁßÀÎÁö È®ÀÎÇÏÀÚ. J2EE Reference ImplementationÀ»
À§Çؼ´Â ´ÙÀ½ 2°¡Áö¸¦ ¸ðµÎ ½ÇÇàÇØ¾ß ÇÑ´Ù.
j2ee -verbose
and
cloudscape -start
- ¾Õ¼ ¼³¸íÇÑ °Íó·³ earÆÄÀÏÀ» ´Ù¿î·Îµå¹ÞÀÚ.
- ¼¹ö¿¡ earÆÄÀÏÀ» ¹èÆ÷ÇÏÀÚ. »ç¿ëÀÚ´Â deploytool ÇÁ·Î±×·¥À» ÀÌ¿ëÇØ¼
J2EE Reference Implementation¿¡ ¾ÖÇø®ÄÉÀÌ¼Ç ¾ÆÄ«À̺ê(
ttaug2003.ear)¸¦ ¹èÆ÷ÇÒ ¼ö ÀÖ´Ù.
$J2EE_HOME/deploytool -deploy ttaug2003.ear localhost
·ÎÄà ȣ½ºÆ®(localhost)¸¦ ¼¹ö°¡ ¼³Ä¡µÇ´Â È£½ºÆ®ÀÇ À̸§À¸·Î ´ëüÇÏÀÚ.
´ÜÀÏ ¸Ó½Å¿¡ ÀνºÅçÇÒ ¶§, È£½ºÆ®À̸§Àº ÀϹÝÀûÀ¸·Î(±ÛÀÚ ¶æ´ë·Î) localhost°¡ µÈ´Ù.
- ¾ÖÇø®ÄÉÀ̼ÇÀ» http://localhost:8000/ttaug2003 ¿¡ ¾×¼¼½ºÇÏÀÚ.
Reference Implementationº¸´Ù´Â J2EEÀÇ specificationÀ» µû¸£´Â ±â´É ±¸ÇöÀÇ Ãø¸é¿¡¼ »ç¿ëÇϰíÀÚ ÇÑ´Ù¸é »ç¿ëÀÚÀÇ Ç÷§Æû¿¡ ¾ÖÇø®ÄÉÀ̼ÇÀ» ¹èÆ÷Çϱâ À§ÇØ J2EE ÇÁ·Î´öÆ®ÀÇ ¹èÆ÷ Åø(deployment tool)À» »ç¿ëÇÑ´Ù.
¾ÖÇø®ÄÉÀÌ¼Ç ½ÇÇàÁß¿¡ index.html welcome file for instructionsÀ» º¸ÀÚ.
¾ÖÇø®ÄÉÀ̼ÇÀ» ½ÇÇàÇϸé, ´ÙÀ½°ú °°Àº ÆäÀÌÁö¸¦ º¸°Ô µÈ´Ù.
°áÇÕµÈ EJB-QL ¸¦ ½ÇÇàÇϱâ À§ÇØ ÇÏÀ̶óÀÌÆ®µÈ ±â´ÉÀ» Çϳª ȤÀº ¸î °³ ¼±ÅÃÇÏÀÚ.
°¡·É, »ç¿ëÀÚ°¡ ´ÙÀ½À» ¼±ÅÃÇϸé,
List Persons with no phone
ÆÄÀδõ ¸Þ¼ÒµåÀÎ findWithNoPhone()ÀÇ EJB-QLÀÌ ½ÇÇàµÈ´Ù.
SELECT OBJECT(p) FROM Person AS p
WHERE p.phones IS EMPTY
°á°ú´Â ´ÙÀ½°ú °°´Ù.
|