Enterprise Java Technologies Tech Tip¿¡ ¿À½Å ¿©·¯ºÐÀ» ȯ¿µÇÕ´Ï´Ù
Enterprise Java Technologies
Å×Å©ÆÁ
2005³â 12¿ù 27ÀÏÀÚ
  À̹ø È£¿¡¼­´Â,

» ÀÚ¹Ù ±â¼úÀ» ÀÌ¿ëÇÑ AJAXÀÇ È°¿ë
» POJO¸¦ Persistent Entity·Î º¯È¯Çϱâ

¸¦ ´Ù·ì´Ï´Ù.

ÀÌ Å×Å©ÆÁÀº Java EE 5ÀÇ ¿ÀǼҽº ·¹ÆÛ·±½º¸¦ ±¸Çö(ÇÁ·ÎÁ§Æ®¸í: GlassFish)ÇÏ¿© °³¹ßµÇ¾ú½À´Ï´Ù.GlassFish´Â https://glassfish.dev.java.net/ ¿¡¼­ ´Ù¿î·Îµå ÇÒ ¼ö ÀÖ½À´Ï´Ù.

-»ùÇà ¾ÆÄ«ÀÌºê ¹Þ±â-
ÀÚ¹Ù ±â¼úÀ» ÀÌ¿ëÇÑ AJAXÀÇ È°¿ë
POJO¸¦ Persistent Entity·Î º¯È¯Çϱâ

PDF ÆÄÀϹޱ⠠  

ÀÚ¹Ù ±â¼úÀ» ÀÌ¿ëÇÑ AJAXÀÇ È°¿ë
 


ÀúÀÚ Greg Murray

AJAX´Â 'Asynchronous JavaScript and XML'ÀÇ ¸Ó¸®±ÛÀÚ¸¦ µý °ÍÀ¸·Î, À¥ ¾ÖÇø®ÄÉÀ̼ÇÀÌ À¥ ÆäÀÌÁö¿¡ ´ëÇÑ »ç¿ëÀÚ ÀÎÅÍ·¢¼ÇÀ» È¿À²ÀûÀ¸·Î ó¸®ÇÒ ¼ö ÀÖµµ·Ï ÇÏ´Â ¼ö´ÜÀ» Á¦°øÇÑ´Ù(»ç¿ëÀÚ ÀÎÅÍ·¢¼ÇÀÌ ÀÌ·ç¾îÁú ¶§¸¶´Ù ÆäÀÌÁö¸¦ ¸®ÇÁ·¹½Ã(»õ·Î °íħ)Çϰųª Àüü ÆäÀÌÁö¸¦ ¸®·ÎµåÇÏ´Â ¹ø°Å·Î¿òÀ» ´ú¾îÁÜ). ÀÌ´Â ¶ÇÇÑ ºê¶ó¿ìÀú¸¦ ÀÌ¿ëÇÑ ¸®Ä¡ ºñÇìÀ̺ñ¾î(rich behavior)¸¦ °¡´ÉÄÉ ÇØÁØ´Ù(µ¥½ºÅ©Åé ¾ÖÇø®ÄÉÀÌ¼Ç ¶Ç´Â Ç÷¯±×ÀÎ ±â¹Ý ¾ÖÇø®ÄÉÀ̼ÇÀÇ °æ¿ì¿Í À¯»ç). AJAX ÀÎÅÍ·¢¼ÇÀº ¹é±×¶ó¿îµå¿¡¼­ ºñµ¿±âÀûÀ¸·Î 󸮵ǰí, ±× µ¿¾È »ç¿ëÀÚ´Â ÆäÀÌÁö¿¡ ´ëÇÑ ÀÛ¾÷À» °è¼ÓÇÒ ¼ö ÀÖ´Ù. AJAX ÀÎÅÍ·¢¼ÇÀº À¥ ÆäÀÌÁö ³»ÀÇ JavaScript¿¡ ÀÇÇØ ½ÃÀ۵Ǵµ¥, AJAX ÀÎÅÍ·¢¼ÇÀÌ ¿Ï·áµÇ¸é JavaScript´Â ÆäÀÌÁöÀÇ HTML ¼Ò½º¸¦ ¾÷µ¥ÀÌÆ®ÇÑ´Ù. º¯°æ ÀÛ¾÷Àº ÆäÀÌÁö ¸®ÇÁ·¹½Ã ¾øÀÌ Áï½Ã ÀÌ·ç¾îÁø´Ù. ÀÌ AJAX ÀÎÅÍ·¢¼ÇÀº ¼­¹öÃø ³í¸®¸¦ ÀÌ¿ëÇÑ Æû ¿£Æ®¸® °ËÁõ(»ç¿ëÀÚ°¡ ÀÔ·ÂÇÏ´Â µ¿¾È), ¼­¹öÀÇ »ó¼¼ µ¥ÀÌÅÍ °Ë»ö, ÆäÀÌÁö »óÀÇ µ¥ÀÌÅÍ¿¡ ´ëÇÑ µ¿Àû ¾÷µ¥ÀÌÆ®, ±×¸®°í ÆäÀÌÁö¿¡¼­ ÆûÀ» ºÎºÐÀûÀ¸·Î Á¦ÃâÇÏ´Â µîÀÇ ÀÛ¾÷¿¡ ÀÌ¿ëµÉ ¼ö ÀÖ´Ù.

¿©±â¼­ ƯÈ÷ Èï¹Ì¸¦ ²ô´Â ºÎºÐÀº AJAX ¾ÖÇø®ÄÉÀ̼ÇÀÌ º°µµÀÇ Ç÷¯±×ÀÎÀ» ¿ä±¸ÇÏÁö ¾ÊÀ¸¸ç Ç÷§Æû/ºê¶ó¿ìÀú Á߸³Àû Ư¼ºÀ» Áö´Ï°í ÀÖ´Ù´Â Á¡ÀÌ´Ù. ÷¾ðÇÏÀÚ¸é, ±¸Çü ºê¶ó¿ìÀú¿¡¼­´Â AJAX°¡ ÃæºÐÈ÷ Áö¿øµÇÁö ¾ÊÀ¸¸ç, ºê¶ó¿ìÀú°£ÀÇ Â÷À̸¦ À¯¹ßÇϴ Ŭ¶óÀ̾ðÆ®Ãø ½ºÅ©¸³Æ®¸¦ ÀÛ¼ºÇÒ ¶§´Â ÁÖÀǸ¦ ±â¿ï¿©¾ß ÇÑ´Ù. µû¶ó¼­ ºê¶ó¿ìÀúÀÇ Â÷À̸¦ Ãß»óÈ­(abstract)ÇÏ´Â JavaScript ¶óÀ̺귯¸®¸¦ »ç¿ëÇϰųª °æ¿ì¿¡ µû¶ó¼­´Â ´ëü ÀÎÅÍ·¢¼Ç ±â¹ýÀ» ÀÌ¿ëÇÏ¿© ±¸Çü ºê¶ó¿ìÀú¸¦ Áö¿øÇÏ´Â °Íµµ ÁÁÀº ¹æ¹ýÀÌ µÉ ¼ö ÀÖ´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº ÀÚ¹Ù °³¹ßÀÚ¸¦ À§ÇÑ AJAX FAQ(¿µ¹®)¸¦ ÂüÁ¶ÇÒ °Í.

ÀÚ¹Ù ±â¼úÀº ¾î¶² ÀÛ¾÷¿¡ ÀûÇÕÇѰ¡?

ÀÚ¹Ù ±â¼ú°ú AJAX´Â ¼­·Î ±ÃÇÕÀÌ Àß ¸Â´Â´Ù. ÀÚ¹Ù ±â¼úÀº AJAX ÀÎÅÍ·¢¼ÇÀ» À§ÇÑ ¼­¹öÃø ÇÁ·Î¼¼½Ì ±â´ÉÀ» Á¦°øÇϴµ¥, ÀÌ´Â ¼­ºí¸´, JSP(JavaServer Pages) ±â¼ú, JSF(JavaServer Faces) ±â¼ú, À¥ ¼­ºñ½º µîÀ» ÅëÇØ Á¦°øµÉ ¼ö ÀÖ´Ù. AJAX ¿äû 󸮸¦ À§ÇÑ ÇÁ·Î±×·¡¹Ö ¸ðµ¨Àº Á¾·¡ÀÇ À¥ ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ »ç¿ëÇÏ´ø °Í°ú µ¿ÀÏÇÑ API¸¦ »ç¿ëÇÑ´Ù. JSF ±â¼úÀº Ŭ¶óÀ̾ðÆ®Ãø JavaScript¿Í ±×¿¡ ´ëÀÀÇÏ´Â ¼­¹öÃø AJAX ÇÁ·Î¼¼½Ì Äڵ带 ÀÛ¼ºÇÏ´Â Àç»ç¿ë °¡´É ÄÄÆ÷³ÍÆ®¸¦ »ý¼ºÇÏ´Â µ¥ »ç¿ëµÉ ¼ö ÀÖ´Ù. ÀÌÁ¦ AJAX¿Í ¼­ºí¸´ÀÇ È°¿ë ¿¹Á¦¸¦ »ìÆìº¸±â·Î ÇÏÀÚ.

ÀÚµ¿ ¿Ï¼º(autocomplete) ¿¹Á¦

»ç¿ëÀÚ°¡ Á¾¾÷¿ø¿¡ °üÇÑ Á¤º¸¸¦ °Ë»öÇÒ ¼ö ÀÖ´Â À¥ ÆäÀÌÁö¸¦ »ó»óÇØº¸ÀÚ. ÀÌ ÆäÀÌÁö¿¡´Â »ç¿ëÀÚ°¡ Á¾¾÷¿øÀÇ À̸§À» ÀÔ·ÂÇÒ ¼ö ÀÖ´Â Çʵ尡 Æ÷ÇԵǾî ÀÖ´Ù. ÀÌ ¿¹Á¦¿¡¼­ ¿£Æ®¸® Çʵå´Â ÀÚµ¿ ¿Ï¼º(autocomplete) ±â´ÉÀ» °¡Áö°í Àִµ¥, ´Ù½Ã ¸»ÇØ »ç¿ëÀÚ°¡ Á¾¾÷¿ø À̸§ÀÇ ÀϺθ¦ ÀÔ·ÂÇϸé À¥ ¾ÖÇø®ÄÉÀ̼ÇÀº ÀÔ·ÂÇÑ ¹®ÀÚ·Î À̸§À̳ª ¼ºÀÌ ½ÃÀ۵Ǵ ¸ðµç Á¾¾÷¿øÀ» ¿­°ÅÇÏ¿© À̸§À» ÀÚµ¿À¸·Î ¿Ï¼ºÇÏ°Ô µÈ´Ù. ÀÚµ¿ ¿Ï¼º ±â´ÉÀº »ç¿ëÀÚ°¡ Á¾¾÷¿øÀÇ Á¤½Ä À̸§À» ÀÏÀÏÀÌ ±â¾ïÇϰųª ´Ù¸¥ ÆäÀÌÁö¿¡¼­ À̸§À» ã¾Æº¸¾Æ¾ß ÇÏ´Â ¹ø°Å·Î¿òÀ» ´ú¾îÁØ´Ù.

autocomplete example

°Ë»ö ÇʵåÀÇ ÀÚµ¿ ¿Ï¼º ±â´ÉÀº AJAX¸¦ ÀÌ¿ëÇØ¼­ ±¸ÇöµÉ ¼ö ÀÖÀ¸¸ç, À̸¦ À§Çؼ­´Â Ŭ¶óÀÌ¾ðÆ®¿Í ¼­¹ö »ó¿¡ Äڵ带 Á¦°øÇØ¾ß ÇÑ´Ù.

Ŭ¶óÀÌ¾ðÆ® »ó¿¡¼­

¸ÕÀú, »ç¿ëÀÚ°¡ ºê¶ó¿ìÀú¿¡ ÀÇÇØ ·ÎµåµÇ´Â ÆäÀÌÁöÀÇ URLÀ» ÁöÁ¤ÇÑ´Ù. ÇÑÆí, ÀÌ ¿¹Á¦¿¡¼­´Â JSF ÄÄÆ÷³ÍÆ®, ¼­ºí¸´, ¶Ç´Â JSP ÆäÀÌÁö¿¡ ÀÇÇØ »ý¼ºµÇ´Â HTML ÆäÀÌÁö°¡ »ç¿ëµÇ¾ú´Ù°í °¡Á¤ÇÏÀÚ. ÆäÀÌÁö¿¡´Â JavaScript ÇÔ¼ö doCompletion()ÀÇ À̸§À¸·Î µÈ onkeyup ¼Ó¼ºÀ» °¡Áö´Â Æû ÅØ½ºÆ® Çʵ尡 Æ÷ÇԵǰí, ÀÌ ÇÔ¼ö´Â Æû ÅØ½ºÆ® Çʵ忡¼­ ۸¦ ´©¸¦ ¶§¸¶´Ù È£ÃâµÈ´Ù.

    <input type="text"
          size="20"
          autocomplete="off"
          id="complete-field"
                      name="id"
          onkeyup="doCompletion();">

»ç¿ëÀÚ°¡ Æû ÅØ½ºÆ® Çʵ忡 ¹®ÀÚ "M"À» ÀÔ·ÂÇÑ´Ù°í °¡Á¤Çغ¸ÀÚ. ±×¿¡ ´ëÇÑ ÀÀ´äÀ¸·Î doCompletion() ÇÔ¼ö°¡ È£ÃâµÇ°í, doCompletion() ÇÔ¼ö´Â ´Ù½Ã XMLHttpRequest ¿ÀºêÁ§Æ®¸¦ ÃʱâÈ­ÇÑ´Ù.

   function initRequest(url) {
       if (window.XMLHttpRequest) {
           return new XMLHttpRequest();
       } else if (window.ActiveXObject) {
           isIE = true;
           return new ActiveXObject("Microsoft.XMLHTTP");
       }
   }

   function doCompletion() {
       if (completeField.value == "") {
           clearTable();
       } else {
           var url = "autocomplete?action=complete&id=" + 
                   escape(completeField.value);
           var req = initRequest(url);
           req.onreadystatechange = function() {
               if (req.readyState == 4) {
                   if (req.status == 200) {
                       parseMessages(req.responseXML);
                   } else if (req.status == 204){
                       clearTable();
                   }
               }
           };
           req.open("GET", url, true);
           req.send(null);
       }
   }

XMLHttpRequest ¿ÀºêÁ§Æ®´Â ÇöÀç Ç¥ÁØ JavaScript¿¡ Æ÷ÇÔµÇÁö´Â ¾ÊÁö¸¸(Ç¥ÁØÈ­¸¦ À§ÇÑ ³ë·ÂÀÌ ÁøÇàÁßÀÓ), »ç½Ç»óÀÇ Ç¥ÁØÀÌÀÚ AJAXÀÇ ÇÙ½ÉÀ̶ó ÇÒ ¼ö ÀÖ´Ù. ÀÌ ¿ÀºêÁ§Æ®´Â HTTP¸¦ ÅëÇØ ¼­¹öÃø ÄÄÆ÷³ÍÆ®(ÀÌ °æ¿ì¿¡´Â ¼­ºí¸´)¿Í »óÈ£ ÀÛ¿ëÇÏ´Â ºÎºÐÀ» ´ã´çÇÑ´Ù.

XMLHttpRequest ¿ÀºêÁ§Æ® »ý¼º ½Ã URL, HTTP ¸Þ¼Òµå(GET ¶Ç´Â POST), ±×¸®°í »óÈ£ÀÛ¿ëÀÇ ºñµ¿±â ¿©ºÎ µî ¼¼ °¡Áö ¸Å°³º¯¼ö°¡ ÁöÁ¤µÈ´Ù. XMLHttpRequest ¿¹Á¦¿¡¼­ ¸Å°³º¯¼ö´Â ´ÙÀ½°ú °°´Ù.

  • URL autocomplete ¹× Àüü Çʵå(complete-field)ÀÇ ÅØ½ºÆ®(M ¹®ÀÚ):
         var url = "autocomplete?action=complete&id=" + 
                 escape(completeField.value);
    
  • GET(HTTP ÀÎÅÍ·¢¼ÇÀÌ GET ¸Þ¼Òµå¸¦ »ç¿ëÇÔÀ» ÀǹÌ) ¹× true(ÀÎÅÍ·¢¼ÇÀÌ ºñµ¿±âÀûÀÓÀ» ÀǹÌ):
         req.open("GET", url, true);
    

ºñµ¿±â È£ÃâÀ» ÀÌ¿ëÇÒ ¶§´Â callback ÇÔ¼ö¸¦ ¼³Á¤ÇØ¾ß Çϴµ¥, XMLHttpRequestÀÇ readyState ¼Ó¼ºÀÌ º¯°æµÉ °æ¿ì ÀÌ callback ÇÔ¼ö´Â HTTP ÀÎÅÍ·¢¼Ç °úÁ¤ÀÇ Æ¯Á¤ Æ÷ÀÎÆ®¿¡¼­ ºñµ¿±âÀûÀ¸·Î È£ÃâµÈ´Ù. ¿¹Á¦¿¡¼­ callback ÇÔ¼ö´Â processRequest()À̸ç, ÇÔ¼ö¿¡ ´ëÇØ XMLHttpRequest.onreadystatechange ¼Ó¼ºÀ¸·Î ¼³Á¤µÈ´Ù. readState°¡ "4"¡¯ÀÏ °æ¿ì parseMessages ÇÔ¼ö¿¡ ´ëÇÑ È£Ãâ¿¡ ÁÖ¸ñÇÒ °Í. "4"ÀÇ XMLHttpRequest.readyState´Â HTTP ÀÎÅÍ·¢¼ÇÀÌ ¼º°øÀûÀ¸·Î ¿Ï¼öµÇ¾úÀ½À» ³ªÅ¸³½´Ù.

XMLHttpRequest.send()°¡ È£ÃâµÇ¸é HTTP ÀÎÅÍ·¢¼ÇÀÌ ½ÃÀ۵ǰí, ÀÎÅÍ·¢¼ÇÀÌ ºñµ¿±âÀûÀÌ¸é ºê¶ó¿ìÀú´Â °è¼ÓÇØ¼­ ÆäÀÌÁöÀÇ À̺¥Æ®¸¦ ó¸®ÇÑ´Ù.

¼­¹ö »ó¿¡¼­

XMLHttpRequest´Â URL ÀÚµ¿ ¿Ï¼º¿¡ ´ëÇØ HTTP GETÀ» ¿äûÇϰí, autocomplete¶ó ºÒ¸®´Â ¼­ºí¸´À¸·ÎÀÇ ¸ÅÇÎÀÌ ¼öÇàµÈ´Ù. ±×¸®°í, AutoComplete ¼­ºí¸´ÀÇ doGet() ¸Þ¼Òµå°¡ È£ÃâµÈ´Ù. ´ÙÀ½Àº doGet() ¸Þ¼ÒµåÀÇ ÇüÅÂÀÌ´Ù.

   public void doGet(HttpServletRequest request, 
           HttpServletResponse response) 
        throws IOException, ServletException { 
       ... 
       String targetId = request.getParameter("id"); 
       Iterator it = employees.keySet().iterator(); 
       while (it.hasNext()) { 
           EmployeeBean e = (EmployeeBean)employees.get(
                   (String)it.next()); 
           if ((e.getFirstName().toLowerCase().startsWith(targetId) || 
              e.getLastName().toLowerCase().startsWith(targetId)) 
              && !targetId.equals("")) { 
              sb.append("<employee>"); 
              sb.append("<id>" + e.getId() + "</id>"); 
              sb.append("<firstName>" + e.getFirstName() + 
                      "</firstName>"); 
              sb.append("<lastName>" + e.getLastName() + 
                      "</lastName>"); 
              sb.append("</employee>"); 
              namesAdded = true; 
           } 
       } 
       if (namesAdded) { 
           response.setContentType("text/xml"); 
           response.setHeader("Cache-Control", "no-cache"); 
           response.getWriter().write("<employees>" + 
                   sb.toString() + "</employees>"); 
       } else { 
           response.setStatus(HttpServletResponse.SC_NO_CONTENT); 
       } 
    }

ÀÌ ¼­ºí¸´À» º¸¸é ¾Ë ¼ö ÀÖµíÀÌ, AJAX 󸮸¦ À§ÇØ ¼­¹öÃø ÄÚµå ÀÛ¼º ¹æ¹ýÀ» ¹è¿ì´Â µ¥ ÇÊ¿äÇÑ »õ·Î¿î ³»¿ëÀº ÀüÇô ³ª¿ÍÀÖÁö ¾Ê´Ù. XML ¹®¼­¸¦ ±³È¯ÇϰíÀÚ ÇÒ °æ¿ì¿¡ ´ëºñÇØ¼­ ÀÀ´ä ÄÁÅÙÆ® À¯ÇüÀ» text/xml·Î ¼³Á¤ÇØ¾ß Çϴµ¥, AJAXÀÇ °æ¿ì¿¡´Â Æò¹®(plain text) ¶Ç´Â ½ÉÁö¾î Ŭ¶óÀÌ¾ðÆ® »óÀÇ callback ÇÔ¼ö¿¡ ÀÇÇØ Æò°¡µÇ°Å³ª ½ÇÇàµÉ ¼ö ÀÖ´Â JavaScriptÀÇ ´ÜÆíµµ ±³È¯ÀÌ °¡´ÉÇÏ´Ù. ÀϺΠºê¶ó¿ìÀú´Â °á°ú¸¦ ij½ÃÇÒ ¼ö ÀÖÀ¸¹Ç·Î Cache-Control HTTP Çì´õ¸¦ no-cache·Î ¼³Á¤ÇÒ Çʿ䰡 ÀÖÀ» ¼ö ÀÖ´Ù´Â Á¡¿¡µµ ¿ª½Ã À¯ÀÇÇÒ °Í. ÀÌ ¿¹Á¦¿¡¼­ ¼­ºí¸´Àº À̸§À̳ª ¼ºÀÌ ¹®ÀÚ MÀ¸·Î ½ÃÀ۵Ǵ ¸ðµç Á¾¾÷¿øÀ» Æ÷ÇÔÇÏ´Â XML ¹®¼­¸¦ »ý¼ºÇÑ´Ù. ´ÙÀ½Àº È£ÃâÀ» ÇÑ XMLHttpRequest ¿ÀºêÁ§Æ®·Î ¹ÝȯµÇ´Â XML ¹®¼­ÀÇ ¿¹Á¦ÀÌ´Ù.

   <employees>
      <employee>
        <id>3</id>
        <firstName>George</firstName>
        <lastName>Murphy</lastName>
      </employee>
      <employee>
        <id>2</id>
        <firstName>Greg</firstName>
        <lastName>Murphy</lastName>
      </employee>
      <employee>
        <id>11</id><firstName>Cindy</firstName>
        <lastName>Murphy</lastName>
        </employee>
      <employee>
        <id>4</id>
        <firstName>George</firstName>
        <lastName>Murray</lastName>
      </employee>
      <employee>
        <id>1</id>
        <firstName>Greg</firstName>
        <lastName>Murray</lastName>
     </employee>
   </employees>

´Ù½Ã Ŭ¶óÀÌ¾ðÆ®·Î

óÀ½ È£ÃâÀ» ÇÑ XMLHttpRequest ¿ÀºêÁ§Æ®°¡ ÀÀ´äÀ» ¹ÞÀ» °æ¿ì, parseMessages() ÇÔ¼ö°¡ È£ÃâµÈ´Ù(ÀÚ¼¼ÇÑ ³»¿ëÀº ÀÌ ¿¹Á¦ÀÇ ¾Õ ºÎºÐ¿¡ ÀÖ´Â XMLHttpRequestÀÇ ÃʱâÈ­¸¦ ÂüÁ¶). ´ÙÀ½Àº parseMessages() ÇÔ¼öÀÇ ¸ð½ÀÀÌ´Ù.

   function parseMessages(responseXML) {
       clearTable();
           var employees = responseXML.getElementsByTagName(
                   "employees")[0];
       if (employees.childNodes.length > 0) {
           completeTable.setAttribute("bordercolor", "black");
           completeTable.setAttribute("border", "1");
       } else {
           clearTable();
       }
    
       for (loop = 0; loop < employees.childNodes.length; loop++) {
           var employee = employees.childNodes[loop];
           var firstName = employee.getElementsByTagName(
                   "firstName")[0];
           var lastName = employee.getElementsByTagName(
                   "lastName")[0];
           var employeeId = employee.getElementsByTagName(
                   "id")[0];
           appendEmployee(
                   firstName.childNodes[0].nodeValue,
                   lastName.childNodes[0].nodeValue, 
                   employeeId.childNodes[0].nodeValue);
       }
   }

parseMessages() ÇÔ¼ö´Â AutoComplete ¼­ºí¸´ÀÌ ¹ÝȯÇÑ XML ¹®¼­ÀÇ ¿ÀºêÁ§Æ® Ç¥ÇöÀ» ¸Å°³º¯¼ö·Î ¼ö½ÅÇϴµ¥, ÀÌ ÇÔ¼ö´Â XML ¹®¼­¸¦ ÇÁ·Î±×·¥ÀûÀ¸·Î traverseÇÑ ´ÙÀ½ °á°ú¸¦ ÀÌ¿ëÇÏ¿© HTML ÆäÀÌÁöÀÇ ÄÁÅÙÃ÷¸¦ ¾÷µ¥ÀÌÆ®ÇÑ´Ù. ÀÌ ÀÛ¾÷Àº XML ¹®¼­ ³»ÀÇ À̸§¿¡ ´ëÇÑ HTML ¼Ò½º¸¦ ID°¡ "menu-popup"¡¯ÀÎ <div> ¿¤¸®¸ÕÆ®·Î injectÇÔÀ¸·Î½á ¼öÇàµÈ´Ù.

   <div style="position: absolute; 
      top:170px;left:140px" id="menu-popup">

»ç¿ëÀÚ°¡ ¹®ÀÚ¸¦ ´õ ¸¹ÀÌ ÀÔ·ÂÇÒ¼ö·Ï ¸ñ·Ï ±æÀÌ´Â ÁÙ¾îµé°Ô µÇ°í, À̾ »ç¿ëÀÚ´Â ¿©·¯ À̸§ Áß Çϳª¸¦ Ŭ¸¯ÇÒ ¼ö ÀÖ´Ù.

ÀÌÁ¦ ¿©·¯ºÐÀº AJAX°¡ ´Ü¼øÈ÷ ÆäÀÌÁöÀÇ ¹é±×¶ó¿îµå¿¡¼­ HTTP¸¦ ÅëÇØ Á¤º¸¸¦ ±³È¯ÇÏ°í °á°ú¸¦ Åä´ë·Î ÇØ´ç ÆäÀÌÁö¸¦ µ¿ÀûÀ¸·Î ¾÷µ¥ÀÌÆ®ÇÑ´Ù´Â °ÍÀ» ¾Ë°Ô µÇ¾úÀ» °ÍÀÌ´Ù. AJAX¿Í ÀÚ¹Ù ±â¼ú¿¡ °üÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº Å×Å©´ÏÄà ¾ÆÆ¼Å¬ Asynchronous JavaScript Technology and XML (AJAX) With Java 2 Platform, Enterprise Edition(¿µ¹®)À» ÂüÁ¶Çϱ⠹ٶõ´Ù. ¾Æ¿ï·¯ AJAX BluePrints ÆäÀÌÁö(¿µ¹®)¿Í Greg MurrayÀÇ ºí·Î±×¿¡ ½Ç·Á ÀÖ´Â AJAX FAQ for the Java Developer(¿µ¹®)ÀÇ ³»¿ëµµ ÇÔ²² ÂüÁ¶ÇÒ °Í.

¿¹Á¦ ÄÚµå ½ÇÇàÇϱâ

º» ÆÁ¿¡´Â º»¹®¿¡¼­ ´Ù·ç¾îÁø ±â¹ýÀ» ¿¹½ÃÇÏ´Â ¿¹Á¦ ÆÐŰÁö°¡ ÷ºÎµÇ¾î Àִµ¥, Servlet 2.4 ÀÌ»óÀÇ API¸¦ Áö¿øÇÏ´Â À¥ ÄÁÅ×À̳ʶó¸é ¸ðµÎ ¿¹Á¦ ÆÐŰÁö ¼³Ä¡°¡ °¡´ÉÇÏ´Ù. ¿¹Á¦¸¦ ¼³Ä¡ÇÏ°í ½ÇÇàÇÏ·Á¸é ´ÙÀ½ ´Ü°è¸¦ µû¸£µµ·Ï ÇÑ´Ù.

  1. ¸ÕÀú GlassFish Project ÆäÀÌÁö(¿µ¹®)¿¡¼­ GlassFish¸¦ ´Ù¿î·ÎµåÇØ¾ß Çϴµ¥, GlassFish´Â Servlet 2.5¿Í JSTL(JSP Standard Tag Library)À» °ð¹Ù·Î Áö¿øÇÑ´Ù. ¸¸¾à J2EE 1.4 ¶Ç´Â Servlet 2.4 ÄÁÅ×À̳ʸ¦ »ç¿ëÇϰí ÀÖ´Ù¸é JSTL JAR ÆÄÀÏÀ» web/WEB-INF/lib µð·ºÅ͸®¿¡ Æ÷ÇÔ½ÃÄÑ¾ß ÇÒ ¼öµµ ÀÖ´Ù.
  2. ´ÙÀ½ÀÇ È¯°æ º¯¼ö¸¦ ¼³Á¤ÇÑ´Ù.
    • GLASSFISH_HOME. This should point to where you installed GlassFish (for example C:\Sun\AppServer) GLASSFISH_HOME. GlassFish ¼³Ä¡ Àå¼Ò¸¦ °¡¸®ÄÑ¾ß ÇÑ´Ù(°¡·É C:\Sun\AppServer).
    • ANT_HOME. ant ¼³Ä¡ Àå¼Ò¸¦ °¡¸®ÄÑ¾ß ÇÑ´Ù. ant´Â ´Ù¿î·ÎµåÇÑ GlassFish ¹øµé¿¡ Æ÷ÇԵǾî ÀÖ´Ù. (WindowsÀÇ °æ¿ì¿¡´Â lib\ant ¼­ºêµð·ºÅ͸® ³»¿¡ À§Ä¡ÇÔ.)
    • JAVA_HOME. ½Ã½ºÅÛ¿¡¼­ÀÇ JDK 5.0 À§Ä¡¸¦ °¡¸®ÄÑ¾ß ÇÑ´Ù.

    ¾Æ¿ï·¯, ant À§Ä¡¸¦ PATH ȯ°æ º¯¼ö¿¡ Ãß°¡ÇÑ´Ù.

  3. ¿¹Á¦ ÆÄÀÏÀ» ´Ù¿î·ÎµåÇÏ¿© ¾ÐÃàÀ» ÇØÁ¦ÇÑ´Ù. ÀÌÁ¦ »õ·Î ÃßÃâµÈ µð·ºÅ͸®°¡ <install_dir>\ajax-autocomplete·Î Ç¥½ÃµÇ¾î¾ß Çϴµ¥, ¿¹¸¦ µé¾î Windows ÄÄÇ»ÅÍÀÇ C:\¿¡ ¾ÐÃàÀ» Ç®¾ú´Ù¸é »õ·Î »ý¼ºµÈ µð·ºÅ͸®´Â C:\ajax-autocomplete°¡ µÇ¾î¾ß ÇÑ´Ù

  4. ajax-autocomplete µð·ºÅ͸®·Î À̵¿Çؼ­ build.properties ÆÄÀÏ¿¡ build.properties.sampleÀ» º¹»çÇÑ´Ù.

  5. build.properties ÆÄÀÏÀ» ¿­°í Servlet 2.4 ÀÌ»óÀÇ API¸¦ Æ÷ÇÔÇÏ´Â JAR ÆÄÀÏ¿¡ servlet.jar ¼Ó¼ºÀ» ¼³Á¤ÇÑ´Ù. GlassFishÀÇ °æ¿ì JAR ÆÄÀÏÀº <gf_install_dir>/glassfish/lib/javaee.jarÀε¥, ¿©±â¼­ <gf_install_dir>Àº GlassFish°¡ ¼³Ä¡µÈ °÷ÀÌ´Ù. javaee.autodeploy¸¦ À¥ ÄÁÅ×À̳ʰ¡ ¾ÖÇø®ÄÉÀ̼ÇÀ» ÀÚµ¿ ¼³Ä¡ÇÒ µð·ºÅ͸®·Î ¼³Á¤ÇÑ´Ù. GlassFishÀÇ °æ¿ì ÀÌ µð·ºÅ͸®´Â <gf_install_dir>/glassfish/domains/domain1/autodeployÀÌ´Ù.

  6. 6. ´ÙÀ½ ¸í·É¾î¸¦ ÀÔ·ÂÇÏ¿© GlassFish¸¦ ½ÃÀÛÇÑ´Ù.
    <GF_install_dir>\bin\asadmin start-domain domain1
    
    ÀÌ ¶§, <GFinstall_dir>Àº Glassfish°¡ ¼³Ä¡µÈ µð·ºÅ͸®ÀÌ´Ù.

  7. ant ÅøÀ» ÀÌ¿ëÇÏ¿© ¾ÖÇø®ÄÉÀ̼ÇÀ» ±¸ÃàÇÏ°í ¼³Ä¡ÇÑ´Ù. Glassfish´Â /glassfish/bin/asant µð·ºÅ͸®¿¡ antÀÇ »çº»À» °¡Áö°í ÀÖ°í, ¶ÇÇÑ Apache Ant Project ÆäÀÌÁö(¿µ¹®)¿¡¼­ ant¸¦ ´Ù¿î·ÎµåÇÒ ¼öµµ ÀÖ´Ù.

    ¾ÖÇø®ÄÉÀ̼ÇÀ» ±¸ÃàÇÏ·Á¸é ´ÙÀ½ ¸í·É¾î¸¦ ÀÔ·ÂÇÑ´Ù.
          ant
    
    ¾ÖÇø®ÄÉÀ̼ÇÀ» ¼³Ä¡ÇÏ·Á¸é ´ÙÀ½ ¸í·É¾î¸¦ ÀÔ·ÂÇÑ´Ù.
          ant deploy
    
  8. ºê¶ó¿ìÀú¸¦ ´ÙÀ½ÀÇ URL·Î ¿¬´Ù: http://localhost:8080/ajax-autocomplete/.

    NetBeans 4.1 ÀÌ»óÀ» »ç¿ëÇϰí ÀÖ´Ù¸é ¿¹Á¦°¡ Æ÷ÇԵǾî ÀÖÀ» °ÍÀ̰í, Help -> BluePrints Solutions Catalog¸¦ ¼±ÅÃÇÏ¿© Åø¿¡¼­ À̸¦ ½ÇÇàÇÒ ¼ö ÀÖ´Ù. ¿©±â¼­ AJAX -> Autocomplete ¿¹Á¦¸¦ ¼±ÅÃÇÏ¸é µÈ´Ù. ÀÌÁ¦ NetBeans ³»¿¡¼­ ¿¹Á¦¸¦ ½ÇÇàÇÒ ¼ö ÀÖÀ¸¸ç ¿øÇÒ °æ¿ì ¼öÁ¤µµ °¡´ÉÇÏ´Ù.

    ¿¹Á¦¸¦ ½ÇÇàÇÏ¸é ´ÙÀ½°ú °°Àº ¸ð½ÀÀÌ µÈ´Ù.
    example autocomplete

    ¸ñ·ÏÀÇ À̸§À» Ŭ¸¯Çϸé Á¾¾÷¿ø¿¡ °üÇÑ Á¤º¸°¡ Ç¥½ÃµÈ´Ù.
    example autocomplete - Employee Info

ÇÊÀÚ ¼Ò°³

¼­ºí¸´ ½ºÆå ºÐ¾ß¸¦ ÁÖµµÇϰí ÀÖ´Â Greg Murray´Â Java BluePrints ÆÀÀÇ Àü ¸â¹ö·Î, À¥ Ƽ¾î ±Ç°í(recommendations) ºÎ¹®À» ´ã´çÇÑ ¹Ù ÀÖÀ¸¸ç, ÇöÀç ±×´Â BluePrints ÆÀÀÇ µµ¿òÀ» ¹Þ¾Æ ½ãÀÇ AJAX ÇÁ·ÎÁ§Æ®¸¦ À̲ø°í ÀÖ½À´Ï´Ù. ¶ÇÇÑ GregÀº ±¹Á¦È­, À¥ ¼­ºñ½º, J2SE µ¶¸³Çü Ŭ¶óÀ̾ðÆ®, AJAX ±â¹Ý À¥ Ŭ¶óÀÌ¾ðÆ® µîÀÇ ºÐ¾ß¿¡¼­ ´Ù¾çÇÑ °æ·ÂÀ» ½×±âµµ Çß½À´Ï´Ù.

¸Ç À§·Î

POJO¸¦ Persistent Entity·Î º¯È¯Çϱâ
 


ÀúÀÚ Sriramulu Lakkaraju, Abhijit Kumar

Java EE 5ÀÇ ¸ñÇ¥ Áß Çϳª´Â °³¹ßÀ» ¿ëÀÌÇÏ°Ô ÇÏ´Â °ÍÀ¸·Î¼­, EJB(Enterprise JavaBeans) 3.0 ½ºÆå JSR-220ÀÇ ÇÑ ºÎºÐÀ¸·Î Á¤ÀǵǴ »õ Java Persistence API´Â »ó±â ÃëÁö¸¦ ÃæÁ·Çϱâ À§ÇØ ¼³°èµÈ ÇÙ½É ±¸¼º¿ä¼Ò¶ó ÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ, Àα⠳ôÀº Java Servlet API 2.5 ¿ª½Ã °³¹ßÀÇ ¿ëÀ̼ºÀ» Áö¿øÇÏ´Â ±â´ÉÀ» ºÎºÐÀûÀ¸·Î³ª¸¶ Æ÷ÇÔÇϰí ÀÖ´Ù. º» Å×Å© ÆÁ¿¡¼­´Â ÀÚ¹Ù ¼­ºí¸´¿¡¼­ »ç¿ëµÇ´Â Java Persistence APIÀÇ ¿¹Á¦¸¦ ´Ù·ê °ÍÀ̸ç, ¾Æ¿ï·¯ POJO(Plain Old Java Object)¸¦ persistent entity·Î º¯È¯ÇÏ´Â ¹æ¹ý°ú ÀÚ¹Ù ¼­ºí¸´¿¡¼­ÀÇ entity »ç¿ë ¹æ¹ý¿¡ ´ëÇØ¼­µµ ¾Ë¾Æº¸µµ·Ï ÇÑ´Ù. ¶ÇÇÑ ¿©·¯ºÐÀº ÀÌ·± ±â´ÉÀ» »ç¿ëÇÏ´Â ¿¹Á¦ ¾ÖÇø®ÄÉÀ̼ÇÀ» ½ÇÇàÇØ º¼ ¼öµµ ÀÖ´Ù.

POJO¸¦ Persistent Entity·Î º¯È¯Çϱâ

¸ÕÀú POJO·Î ½ÃÀÛÇØº¸ÀÚ. (¿¹Á¦ ÄÚµå ½ÇÇàÇϱ⠼½¼Ç¿¡¼­ ¼³¸íÇÑ ´ë·Î ¿¹Á¦ ÆÐŰÁö¸¦ ´Ù¿î·ÎµåÇÏ¿© ¾ÐÃàÀ» Ç®¸é POJO¿Í ¿¹Á¦¸¦ À§ÇÑ ´Ù¸¥ ¼Ò½º Äڵ带 »ìÆìº¼ ¼ö ÀÖ´Ù.) ÀÌ ¿¹Á¦¿¡¼­ POJO´Â JavaBean ÄÄÆ÷³ÍÆ®·Î ±¸ÇöµÇ´Â Customer¶ó´Â À̸§ÀÇ ´Ü¼ø Ŭ·¡½ºÀ̰í, ÀÌ Å¬·¡½º´Â customerId, firstName, lastName, company, address, phoneNumber, emailAddress µî°ú °°Àº ¼Ó¼ºÀ» °¡Áø´Ù. ¸ðµç JavaBean ÄÄÆ÷³ÍÆ®°¡ ±×·¸µíÀÌ, Customer Ŭ·¡½º´Â °ø¿ë ¹«ÀÎÀÚ »ý¼ºÀÚ(public no-argument constructor)¸¦ ºñ·ÔÇÏ¿© ¼Ó¼º ¾×¼¼½º¸¦ À§ÇÑ getter¿Í setter ¸Þ¼Òµå¸¦ °¡Áø´Ù.

 package com.example.entity;

   public class Customer implements java.io.Serializable {

       private Integer customerId;
       private int version;
       private String firstName;
       private String lastName;
       private String company;
       
   ...
   
   public Integer getCustomerId() {
           return customerId;
       }
   
       protected void setCustomerId(Integer customerId) {
           this.customerId = customerId;
       }
   ...

ÇöÀçÀÇ ÇüÅ·δ Ŭ·¡½º°¡ Áö¼ÓµÉ ¼ö ¾ø´Âµ¥, À̸¦ Å×¸é °ü°èÇü µ¥ÀÌÅͺ£À̽º¿¡ ÀúÀåÇÒ ¼ö ¾ø´Ù´Â ¸»ÀÌ´Ù. µû¶ó¼­ Ŭ·¡½º¸¦ Áö¼Ó½ÃŰ·Á¸é entity·ÎÀÇ º¯È¯ÀÌ ÇÊ¿äÇÏ´Ù. Enterprise JavaBeans 3.0 ½ºÆå(JSR-220)¿¡¼­´Â entity¸¦ º¸Àß °Í ¾ø°í °íÁý ¼¾ µµ¸ÞÀÎ ¿ÀºêÁ§Æ® Á¤µµ·Î Á¤ÀÇÇϰí ÀÖ´Ù. ÇÑÆí, Java Persistence API´Â POJO¸¦ entity·Î º¯È¯ÇÏ´Â µ¥ µµ¿òÀÌ µÇ´Â ¸î °¡Áö ÁÖ¼®À» Á¤ÀÇÇÑ´Ù.

POJO¸¦ entity·Î º¯È¯Çϴ ù ¹øÂ° ´Ü°è´Â persistence ÁÖ¼®À» Customer Ŭ·¡½º·Î ÀÓÆ÷Æ®ÇÑ ´ÙÀ½ Ŭ·¡½º¿¡ ÁÖ¼® @Entity¸¦ ÷ºÎÇÏ´Â °ÍÀÌ´Ù.

   package com.example.entity;

   import javax.persistence.*;

   @Entity
   public class Customer implements java.io.Serializable {

±× Áö¼Ó¼ºÀ» ¿¹½ÃÇϱâ À§ÇØ ÀÌ ¿¹Á¦ÀÇ entity¸¦ °ü°èÇü µ¥ÀÌÅͺ£À̽º-º¸´Ù ±¸Ã¼ÀûÀ¸·Î´Â Apache Derby µ¥ÀÌÅͺ£À̽º(Apache Derby µ¥ÀÌÅͺ£À̽º´Â GlassFish¿Í ÇÔ²² ÆÐŰÁö¿¡ Æ÷ÇԵǾî ÀÖ´Ù)-¿¡ ÀúÀåÇϱâ·Î ÇÑ´Ù. ´ÙÀ½Àº entity°¡ ÀúÀåµÉ Å×À̺íÀ» »ý¼ºÇÏ´Â µ¥ »ç¿ëµÇ´Â SQLÀÌ´Ù.

   CREATE TABLE Customer (
      custId INTEGER PRIMARY KEY NOT NULL,
       firstName VARCHAR(60),
       lastName VARCHAR(60),
       company VARCHAR(255),
       address_1 VARCHAR(255),
       address_2 VARCHAR(255),
       city VARCHAR(60),
       state VARCHAR(60),
       zip VARCHAR(10),
       emailAddress VARCHAR(80),
       phoneNumber VARCHAR(80)
   ) 

´ÙÀ½ ´Ü°è´Â Customer Ŭ·¡½º¿¡ ÁÖ¼® @TableÀ» ÷ºÎÇÔÀ¸·Î½á entity¸¦ À§ÇÑ Å×À̺íÀ» ÁöÁ¤ÇÏ´Â °ÍÀÌ´Ù.

   package com.example.entity;

   import javax.persistence.*;

   @Entity
   @Table(name="customer")
   public class Customer {

µ¥ÀÌÅͺ£À̽º Å×À̺í(Customer)ÀÇ À̸§ÀÌ entityÀÇ ¾à½Ä Ŭ·¡½º À̸§°ú ÀÏÄ¡ÇÏ´ÂÁö È®ÀÎÇÒ °Í(Á¤½Ä Ŭ·¡½º À̸§Àº com.example.entity.Customer). ÀÏÄ¡ÇÏÁö ¾ÊÀ» °æ¿ì¿¡´Â Å×À̺í À̸§À» ¸ÅÇÎÇϱâ À§ÇÑ Ãß°¡ ÁÖ¼®ÀÌ ÇÊ¿äÇѵ¥, entity Ŭ·¡½º¿¡ @Table ÁÖ¼®ÀÌ ÁöÁ¤µÇÁö ¾ÊÀº °æ¿ì¿¡´Â @Table ÁÖ¼®¿¡ ÀÇÇØ Á¤ÀǵǴ ¸ðµç ±âº»°ªÀÌ Àû¿ëµÈ´Ù. Å×À̺í À̸§ÀÌ ¾à½Ä Ŭ·¡½º À̸§°ú ÀÏÄ¡ÇÏÁö ¾ÊÀ» °æ¿ì¿¡´Â@Table ÁÖ¼®À» Á¦¿Ü½Ãų ¼ö ÀÖ´Ù(ÀÌ·± ÀÌÀ¯·Î, º» ÆÁ°ú ÇÔ²² Á¦°øµÇ´Â ¿¹Á¦ÀÇ Customer Ŭ·¡½º¿¡´Â @Table ÁÖ¼®ÀÌ ÁöÁ¤µÇ¾î ÀÖÁö ¾Ê´Ù).

¸ðµç entity´Â ¹Ýµå½Ã 1Â÷ ۸¦ °¡Á®¾ß Çϰí, °í°´ µ¥ÀÌÅͺ£À̽º Å×À̺íÀÇ °æ¿ì 1Â÷ Ű´Â customerIdIdÀÌ´Ù. ¾Æ·¡ÀÇ ³»¿ëÀ» ÅëÇØ ¿¹Á¦¿¡¼­ 1Â÷ ۰¡ ¾î¶»°Ô ÁöÁ¤µÇ´ÂÁö ¾Ë ¼ö ÀÖ´Ù.

   @Id(name="custId")
   
   public String getCustomerId(){
       return customerId;
   }   

´ÙÀ½ ´Ü°è´Â ºó(bean) ¼Ó¼ºÀ» µ¥ÀÌÅͺ£À̽º ¼Ó¼ºÀ¸·Î ¸ÅÇÎÇÏ´Â °ÍÀε¥, ÀÌ ÀÛ¾÷Àº @Column ÁÖ¼®À» ÀÌ¿ëÇÏ¿© ¼öÇàµÈ´Ù. ¡®»ç¿ëÀÇ ÆíÀǼº¡¯À̶ó´Â Java EE 5ÀÇ ÃëÁö¿¡ ¸Âµµ·Ï, ºó ¼Ó¼ºÀ» µ¥ÀÌÅͺ£À̽º ¼Ó¼ºÀ¸·Î ¸ÅÇÎÇÏ´Â ÀÛ¾÷ÀÌ ±âº»°ªÀ¸·Î µÇ¾î ÀÖ´Ù. µû¶ó¼­ ºó ¼Ó¼ºÀÇ À̸§ÀÌ ÇØ´ç µ¥ÀÌÅͺ£À̽º ¼Ó¼º À̸§°ú ´Ù¸¥ °æ¿ì¿¡¸¸ ºó ¼Ó¼º¿¡ ÁÖ¼®À» ´Þ¸é µÈ´Ù. ´ÙÀ½Àº Customer Ŭ·¡½º¿¡¼­ »ç¿ëµÇ´Â ¼Ó¼º À̸§µéÀÌ´Ù.

    private Integer customerId;
    private String firstName;
    private String lastName;
    private String company;
    private String address1;
    private String address2;
    private String city;
    private String state;
    private String zip;
    private String emailAddress;
    private String phoneNumber;

½ÇÁ¦·Î ºó ¼Ó¼º À̸§°ú ±×¿¡ ´ëÀÀÇÏ´Â µ¥ÀÌÅͺ£À̽º ¼Ó¼º À̸§ »çÀÌ¿¡´Â ¸î °¡Áö Â÷ÀÌÁ¡ÀÌ ÀÖ´Ù. ¿¹¸¦ µé¾î, Ŭ·¡½º¿¡´Â ÁÖ¼ÒÀÇ Ã¹ Çà¿¡ ´ëÇØ address1 ·Î ¸í¸íµÈ ¼Ó¼ºÀÌ Æ÷ÇԵǰí, ±×¿¡ ´ëÀÀÇÏ´Â µ¥ÀÌÅͺ£À̽º ¼Ó¼ºÀº address_1ÀÌ´Ù. µû¶ó¼­ ÁÖ¼® @ColumnÀ» »ç¿ëÇÒ °æ¿ì¿¡´Â ¼Ó¼º address1À» À§ÇÑ accessor ¸Þ¼Òµå¿¡ ÁÖ¼®À» ÷ºÎÇÏ°í µ¥ÀÌÅͺ£À̽º ¼Ó¼º¿¡ ÀûÀýÈ÷ ¸ÅÇÎÇØ¾ß ÇÑ´Ù.

    @Column(name="address_1")
    public String getAddress1() {
        return address1;
    } 

´ÙÀ½À¸·Î, Customer Ŭ·¡½º¿¡ ¸î °¡Áö Äõ¸® ¸Þ¼Òµå¸¦ Ãß°¡ÇØ º¸±â·Î ÇÏÀÚ. Äõ¸®µéÀº EntityManager (javax.persistence.EntityManager)¶ó´Â À̸§ÀÇ ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÑ´Ù. ÀÌ ÀÎÅÍÆäÀ̽º À̸§¿¡¼­ ¾Ë ¼ö ÀÖ´Â °Íó·³, EntityManager ÀÎÅÍÆäÀ̽º´Â entity¸¦ °ü¸®ÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù. ´ÙÀ½Àº µ¥ÀÌÅͺ£À̽º Å×ÀÌºí¿¡¼­ ¸ðµç °í°´À» °Ë»öÇÏ´Â Äõ¸®ÀÌ´Ù.

    public static List<Customer> findAllCustomers(
      EntityManager em) {
        Query query = em.createQuery(
                "SELECT OBJECT(cust) FROM Customer cust");
        List<Customer> customers = query.getResultList();
        return customers;
    } 

Äõ¸® ¸Þ¼Òµå findAllCustomers´Â EntityManager¿Í EJB QL(Query Language) ¹®ÀÚ¿­À» ÀÌ¿ëÇÏ¿© Query ¿ÀºêÁ§Æ®¸¦ Çü¼ºÇÏ°í ½ÇÇàÇÑ´Ù.

´ÙÀ½Àº Customer Ŭ·¡½ºÀÇ ¶Ç ´Ù¸¥ Äõ¸®·Î, °í°´ÀÇ ID¸¦ ÀÌ¿ëÇÏ¿© ƯÁ¤ °í°´À» °Ë»öÇÑ´Ù.

    public static Customer findCustomerById(EntityManager em,
            Integer custId) {
        Query query = em.createQuery(
                "SELECT OBJECT(cust) FROM Customer cust "
                + "WHERE cust.customerId = :custId");
        query.setParameter("custId", custId);
        List<Customer> customers = query.getResultList();
        if (customers != null && customers.size() > 0) {
            return customers.get(0);
        } else {
            return null;
        }
    }

»ó±âÇÑ findCustomerById ¸Þ¼Òµå°¡ ¾î¶»°Ô Query ÀÎÅÍÆäÀ̽ºÀÇ setParameter ¸Þ¼Òµå¸¦ ÀÌ¿ëÇÏ¿© Äõ¸®¿¡ ¸Å°³º¯¼ö¸¦ ÆÐ½ºÇÏ´ÂÁö ÁÖ¸ñÇÒ °Í.

Persistence Descriptor

Customer Ŭ·¡½º¸¦ º¯°æÇÏ´Â ÀÏ ¿Ü¿¡µµ, °ü¸® ¿£Æ¼Æ¼(managed entity)¸¦ »ý¼ºÇϱâ À§Çؼ­´Â persistence descriptor ÆÄÀÏÀ» ÀÛ¼ºÇØ¾ß ÇÑ´Ù. EJB ÄÁÅ×À̳ʴ persistence descriptor ÆÄÀÏÀ» ÀÌ¿ëÇÏ¿© ÆÐŰÁö ¾ÖÇø®ÄÉÀ̼Ç(Áï, JAR, WAR, EAR µîÀÇ ÆÄÀÏ) ³»¿¡¼­ persistent entityÀÇ Á¸À縦 È®ÀÎÇÑ´Ù. JSR-220ÀÇ Java Persistence API ½ºÆå ÆÄÆ®¿¡ ÀÖ´Â "Chapter 6: Entity Packaging"¿¡´Â ¿£Æ¼Æ¼ ÆÐŰ¡¿¡ °üÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀÌ ½Ç·Á ÀÖ´Ù.

persistence descriptor´Â persistence.xmlÀ̶ó´Â À̸§ÀÇ ÆÄÀÏ ³»¿¡ ÀÖ´Ù. ´ÙÀ½Àº ¿¹Á¦ persistence descriptor ÆÄÀÏÀÇ ³»¿ëÀÌ´Ù.

   <?xml version="1.0" encoding="UTF-8"?>
   <persistence xmlns="http://java.sun.com/xml/ns/persistence"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
       <persistence-unit name ="myEntityManager">
           <description>Sample Customer Database</description>
       </persistence-unit>
   </persistence>

¿£Æ¼Æ¼ ÆÐŰ¡Àº ÇÁ·Î¹ÙÀÌ´õ¿Í ±¸¼ºÀ» Æ÷ÇÔÇÑ ¸í¸íµÈ(named) ¿£Æ¼Æ¼ °ü¸®ÀÚ, ÀÏ·ÃÀÇ °ü¸® Ŭ·¡½º, Ŭ·¡½º¸¦ µ¥ÀÌÅͺ£À̽º¿¡ ¸ÅÇÎÇÏ´Â ¸ÞŸµ¥ÀÌÅÍ µîÀ» ±×·ìÈ­ÇÏ´Â persistence unitÀ» ±â¹ÝÀ¸·Î ÀÌ·ç¾îÁø´Ù. ´ÙÀ½Àº ÀÌ ¿¹Á¦¿¡¼­ »ç¿ëµÇ´Â persistence unitÀÌ´Ù.

    <persistence-unit name ="myEntityManager">
        <description>Sample Customer Database</description>
        <jta-data-source>jdbc/__default</jta-data-source>
        <class>com.example.entity.Customer</class>
    </persistence-unit>

myEntityManager¶ó´Â À̸§ÀÇ persistence unitÀÌ ¿£Æ¼Æ¼µéÀ» °ü¸®ÇÏ°Ô µÇ¸ç, EJB ÄÁÅ×À̳ʸ¦ ÅëÇØ ´ëºÎºÐÀÇ ±âº»°ªÀÌ Á¦°øµÈ´Ù. ¶ÇÇÑ persistence.xml ÆÄÀÏÀ» ÀÌ¿ëÇÏ¿© persistence provider°¡ Á¦°øÇÏ´Â ±âº»°ªÀ» ¿À¹ö¶óÀ̵åÇÒ ¼öµµ ÀÖ´Ù. ¿¹¸¦ µé¾î, ¿¤¸®¸ÕÆ® <jta-data-source>¿¡ ´ëÇÑ °ªÀ» ÁöÁ¤ÇÏ¿© ¿£Æ¼Æ¼ ¸Å´ÏÀú°¡ »ç¿ëÇÏ´Â µ¥ÀÌÅÍ ¼Ò½º¸¦ ¿À¹ö¶óÀ̵åÇÏ´Â °æ¿ì°¡ ±×°ÍÀÌ´Ù. ÀÌ ¿Ü¿¡µµ, Çϳª ÀÌ»óÀÇ <class> ¿£Æ¼Æ¼¿¡ °ªÀ» ÁöÁ¤ÇÏ¿© persistence entity·Î Ãë±ÞµÇ¾î¾ß ÇÒ Å¬·¡½º¸¦ ¿­°ÅÇÒ ¼ö ÀÖ´Ù.

ÄÁÆ®·Ñ·¯ ¼­ºí¸´

º» ÆÁÀÇ ¿¹Á¦¿¡´Â ÄÁÆ®·Ñ·¯ ¼­ºí¸´ÀÌ Æ÷ÇԵǾî Àִµ¥, ÀÌ ¼­ºí¸´Àº ÁÖ¼® @PersistenceContext (javax.persistence.PersistenceContext)¸¦ ÀÌ¿ëÇÏ¿© ¿£Æ¼Æ¼ ¸Å´ÏÀúÀÇ ÀνºÅϽº¸¦ Á¦°øÇÑ´Ù.

´ÙÀ½Àº ÄÚµåÀÇ ÇÑ ºÎºÐÀÌ´Ù.

   import javax.persistence.EntityManager;
   import javax.persistence.PersistenceContext;
   ...

   public class ControllerServlet extends HttpServlet {

       @PersistenceContext EntityManager myEntityManager;
   ...

º¯¼ö myEntityManagerÀÇ À̸§ÀÌ Áß¿äÇѵ¥, ¼­ºí¸´À¸·Î Á¦°øµÈ EntityManagerÀÇ ÀνºÅϽº´Â myEntityManager¶ó´Â À̸§ÀÇ persistence unitÀ¸·ÎºÎÅÍ ±¸¼ºÀ» ÃëÇÏ°Ô µÈ´Ù(ÀÌ ¿¹Á¦ÀÇ °æ¿ì, persistence.xml ÆÄÀÏ ³»¿¡ ÀÖ´Â persistence unitÀÇ À̸§ÀÌ myEntityManagerÀÓÀ» »ó±âÇÒ °Í).

ÄÁÆ®·Ñ·¯ ¼­ºí¸´Àº Á¦°øµÈ ¿£Æ¼Æ¼ ¸Å´ÏÀú ÀνºÅϽº¸¦ ÀÌ¿ëÇÏ¿© µ¥ÀÌÅͺ£À̽º ¹× jsp ÆÄÀÏÀ» ºä ·¹À̾î·Î¼­ ¾×¼¼½ºÇÑ´Ù. ¿¹¸¦ µé¾î, ¼­ºí¸´ ³»ÀÇ ´ÙÀ½ ¸Þ¼Òµå¸¦ ÀÌ¿ëÇÏ¿© µ¥ÀÌÅͺ£À̽º ³»ÀÇ ¸ðµç °í°´ ·¹Äڵ带 µð½ºÇ÷¹ÀÌÇÑ´Ù.

  private void doQueryByExample(HttpServletRequest request,
      HttpServletResponse response) throws ServletException, 
      IOException {
   ...      

        List<Customer> customers =
          Customer.findAllCustomers(myEntityManager);
        if (customers.size() > 0) {
            request.setAttribute(
              ATTRIBUTE_CUSTOMER_LIST, customers);
            getRequestDispatcher("/list.jsp").forward(
              request, response);
        } else {
            getRequestDispatcher("/index.jsp").forward(
              request, response);
        }
    }

doQueryByExample() ¸Þ¼Òµå´Â Customer Ŭ·¡½º ³»ÀÇ findAllCustomers() ¸Þ¼Òµå¸¦ ÀÌ¿ëÇÏ¿© ¸ðµç °í°´ÀÇ ¸®½ºÆ®¸¦ ¾ò°í, À̾ doQueryByExample()Àº ¿äûÀ» ºä list.jsp·Î Àü¼ÛÇϱâ Àü¿¡ °Ë»öµÈ ¸®½ºÆ®¸¦ ¿äû ¼Ó¼ºÀ¸·Î ¼³Á¤ÇÑ´Ù.

¿¹Á¦ ÄÚµå ½ÇÇàÇϱâ

º» ÆÁ¿¡´Â ÆÁ¿¡¼­ ´Ù·é ±â¹ýÀ» ¿¹½ÃÇÏ´Â ¿¹Á¦ ÆÐŰÁö°¡ ÷ºÎµÇ¾î ÀÖ°í, ¿¹Á¦ ÆÐŰÁö¿¡´Â ¿¹Á¦¿¡ °üÇÑ ¼Ò½º ÄÚµå, ÇÊ¿äÇÑ ±â¼úÀÚ(descriptor) ÆÄÀÏ, ºôµå ½ºÅ©¸³Æ® µîÀÌ Æ÷ÇԵǾî ÀÖ´Ù. ¿¹Á¦¸¦ ½ÇÇàÇÏ·Á¸é ´ÙÀ½ ´Ü°è¸¦ µû¸£µµ·Ï ÇÑ´Ù.

  1. GlassFish Project ÆäÀÌÁö(¿µ¹®)¿¡¼­ GlassFish¸¦ ´Ù¿î·ÎµåÇÑ´Ù.

  2. 2. ´ÙÀ½ÀÇ È¯°æ º¯¼ö¸¦ ¼³Á¤ÇÑ´Ù.
    • GLASSFISH_HOME. GlassFish ¼³Ä¡ Àå¼Ò¸¦ °¡¸®ÄÑ¾ß ÇÑ´Ù(°¡·É C:\Sun\AppServer)
    • ANT_HOME. ant ¼³Ä¡ Àå¼Ò¸¦ °¡¸®ÄÑ¾ß ÇÑ´Ù. ant´Â ´Ù¿î·ÎµåÇÑ GlassFish ¹øµé¿¡ Æ÷ÇԵǾî ÀÖ´Ù. (WindowsÀÇ °æ¿ì¿¡´Â lib\ant ¼­ºêµð·ºÅ͸® ³»¿¡ À§Ä¡ÇÔ)
    • JAVA_HOME. ½Ã½ºÅÛ¿¡¼­ÀÇ JDK 5.0 À§Ä¡¸¦ °¡¸®ÄÑ¾ß ÇÑ´Ù.

    ¾Æ¿ï·¯, ant À§Ä¡¸¦ PATH ȯ°æ º¯¼ö¿¡ Ãß°¡ÇÑ´Ù.

  3. ¿¹Á¦ ÆÄÀÏÀ» ´Ù¿î·ÎµåÇÏ¿© ¾ÐÃàÀ» ÇØÁ¦ÇÏ¸é »õ·Î ÃßÃâµÈ µð·ºÅ͸®°¡ <Sample_install_dir>\web-to-entity·Î Ç¥½ÃµÈ´Ù. ¿©±â¼­ <sample_install_dir>Àº ¿¹Á¦ ÆÐŰÁö°¡ ¼³Ä¡µÈ µð·ºÅ͸®¸¦ ³ªÅ¸³»´Âµ¥, ¿¹¸¦ µé¾î, Windows ÄÄÇ»ÅÍÀÇ C:\¿¡ ¾ÐÃàÀ» Ç®¾ú´Ù¸é »õ·Î »ý¼ºµÈ µð·ºÅ͸®´Â C:\web-to-entity°¡ µÇ¾î¾ß ÇÑ´Ù. web-to-entity µð·ºÅ͸®¿¡´Â Customer¶ó´Â À̸§ÀÇ ¼­ºêµð·ºÅ͸®¿Í ¿¹Á¦ ¼³Ä¡¸¦ À§ÇÑ web-to-entity.war¶ó´Â À̸§ÀÇ war ÆÄÀÏÀÌ Æ÷ÇԵǾî ÀÖ´Ù.

  4. 4. ´ÙÀ½ ¸í·É¾î¸¦ ÀÔ·ÂÇÏ¿© GlassFish Application Server¸¦ ½ÃÀÛÇÑ´Ù.
         <GF_install_dir>\bin\asadmin start-domain domain1
    
    ÀÌ ¶§, <GFinstall_dir>Àº Glassfish°¡ ¼³Ä¡µÈ µð·ºÅ͸®ÀÌ´Ù.

  5. 5. ´ÙÀ½ ¸í·É¾î¸¦ ÀÔ·ÂÇÏ¿© Derby µ¥ÀÌÅͺ£À̽º¸¦ ½ÃÀÛÇÑ´Ù.
          <GF_install_dir>\bin\asadmin start-database
    
  6. Customer Å×À̺íÀ» »ý¼ºÇÏ¿© µ¥ÀÌÅ͸¦ »ðÀÔÇØ¾ß Çϴµ¥, À̸¦ À§ÇØ <Sample_install_dir>\web-to-entity\entity\sql>¿¡¼­ »çÀü ÄÄÆÄÀÏµÈ DerbyInitor.class¸¦ ÀÌ¿ëÇÑ´Ù. <Sample_install_dir>\web-to-entity\entity\sql µð·ºÅ͸®·Î À̵¿ÇÏ¿© ´ÙÀ½°ú °°ÀÌ DerbyInitor Ŭ·¡½º¸¦ ½ÇÇàÇÑ´Ù(¸í·É¾î´Â ÇÑ ¶óÀÎ »ó¿¡¼­ °è¼ÓµÊ).
          java -classpath .;<GF_install_dir>\derby\lib\derbyclient.jar
          DerbyInitor
    
  7. ¾ÖÇø®ÄÉÀ̼ÇÀ» ¼³Ä¡ÇÑ´Ù. ¼³Ä¡´Â ´Ù¾çÇÑ ¹æ¹ýÀ¸·Î ¼öÇàµÉ ¼ö Àִµ¥, ´ÙÀ½¿¡ ¼³¸íÇÏ´Â °ÍÀº Sun Java System Administrator ConsoleÀ» ÀÌ¿ëÇÏ´Â ¹æ¹ýÀÌ´Ù. ºê¶ó¿ìÀúÀÇ ÁÖ¼Ò¸¦ http://localhost:4848·Î ÁöÁ¤ÇÏ¿© Administrator ConsoleÀ» ¿¬ ´ÙÀ½ ÇØ´ç °ü¸®ÀÚ ID¿Í ºñ¹Ð¹øÈ£·Î ·Î±×ÀÎÇÑ´Ù(±âº»°ª ID´Â adminÀÌ°í ±âº»°ª ºñ¹Ð¹øÈ£´Â adminadminÀÌ´Ù). ÀÌ·¸°Ô Çϸé Welcome È­¸éÀÌ ¿­¸°´Ù.

  8. Welcome È­¸é¿¡¼­ ¿ÞÂÊ Å½»öâÀÇ Applications Æú´õ¸¦ È®ÀåÇϰí Web Applications¸¦ ¼±ÅÃÇÑ´Ù. ÀÌÁ¦ Web Applications âÀÌ ¿­¸°´Ù.

  9. Web Applications â¿¡¼­ Deploy ¹öưÀ» Ŭ¸¯Çϸé Deploy Web Module âÀÌ Ç¥½ÃµÈ´Ù.

  10. Deploy Web Module âÀÇ File to Upload Çʵ忡¼­ À¥ ¾ÖÇø®ÄÉÀÌ¼Ç web-to-entity.war¸¦ ºê¶ó¿ìÁîÇÑ ´ÙÀ½ NEXT ¹öưÀ» Ŭ¸¯ÇÏ¸é µÎ ¹øÂ° ¼³Ä¡ âÀÌ ¿­¸°´Ù. ÀÌÁ¦ Context Root ÇʵåÀÇ °ªÀ» /customer·Î º¯°æÇÑ ´ÙÀ½ Finish ¹öưÀ» Ŭ¸¯ÇÏ¸é ¾ÖÇø®ÄÉÀÌ¼Ç ¼³Ä¡°¡ ¿Ï·áµÈ´Ù.

  11. ºê¶ó¿ìÀúÀÇ ÁÖ¼Ò¸¦ http://localhost:8080/customer·Î ÁöÁ¤ÇÏ¿© ¾ÖÇø®ÄÉÀ̼ÇÀ» ½ÇÇàÇÑ´Ù. ÀÌ ¶§, ¾ÖÇø®ÄÉÀÌ¼Ç ½ÃÀÛÀ» GO ¹öưÀÌ Æ÷ÇÔµÈ Ã¢ÀÌ Ç¥½ÃµÇ¾î¾ß ÇÑ´Ù.

    Go button example

  12. GO ¹öưÀ» Ŭ¸¯ÇÑ´Ù. À̾ µ¥ÀÌÅͺ£À̽º¸¦ Á¶È¸ÇÏ¸é °í°´ ¸®½ºÆ®¸¦ º¸¿©ÁÖ´Â °á°ú ÆäÀÌÁö°¡ Ç¥½ÃµÇ¾î¾ß ÇÑ´Ù.

    Sample Results Page

  13. ¸®½ºÆ®¿¡¼­ ù ¹øÂ° °í°´ John Doe¸¦ Ŭ¸¯ÇßÀ» ¶§ ÀÌ °í°´¿¡ °üÇÑ ¼¼ºÎ»çÇ×ÀÌ Ç¥½ÃµÇ¾î¾ß ÇÑ´Ù.

    Sample Details Page

  14. ¾ÖÇø®ÄÉÀ̼ÇÀ» »èÁ¦ÇÏ·Á¸é Administrator ConsoleÀÇ Web Applications ÆäÀÌÁö¿¡¼­ ÇØ´ç ¾ÖÇø®ÄÉÀ̼ÇÀ» ¼±ÅÃÇϰí Undeploy ¹öưÀ» Ŭ¸¯ÇÑ´Ù.

ÀúÀÚ ¼Ò°³

Sriramulu Lakkaraju´Â Sun Java System Enterprise Application Server ±×·ìÀÇ ½ºÅÂÇÁ ¿£Áö´Ï¾î·Î, Áö³­ 7³â°£ ½ã ÀÚ¹Ù ±â¼ú ºÐ¾ß¿¡ °øÇåÇØ ¿Ô½À´Ï´Ù. ¶ÇÇÑ ±×´Â J2SE (Security & Networking), J2EE (JSP, Servlet, JSTL, EJB) µîÀÇ ºÐ¾ß¸¦ ºñ·ÔÇÏ¿© Sun Java System Application ServerÀÇ °í°¡¿ë¼º ±â´É ±¸Çö¿¡µµ ÀÏÁ¶ÇÑ ¹Ù°¡ Å®´Ï´Ù.

Abhijit Kumar´Â Sun Java System Application Server, Platform EditionÀÇ ¼³°èÀÚÀ̸ç, Áö³­ 10³â°£ ÀÚ¹Ù °³¹ßÀڷμ­ ¿ªÇÒÀ» ÈǸ¢È÷ ¼öÇàÇØ¿À°í ÀÖ½À´Ï´Ù.

¸Ç À§·Î

º» ¸ÞÀÏÀº ¼ö½ÅÀ» µ¿ÀÇÇÑ È¸¿ø´Ô¿¡°Ô¸¸ ¹ß¼ÛµË´Ï´Ù.
º» ¸ÞÀÏÀÇ ¼ö½ÅÀ» °ÅºÎÇϰųª ¼ö½ÅÁÖ¼Ò¸¦ º¯°æÇÏ·Á¸é SKDN@Sun.comÀ¸·Î ¹®ÀÇ Áֽñ⠹ٶø´Ï´Ù.

SKDN(Sun Korea Developers Network)¿¡¼­ J2EE/J2SE Å×Å©ÆÁ µî ´Ù¾çÇÑ ¾ÆÆ¼Å¬µéÀ» Âü°íÇϼ¼¿ä.

Copyright 2003-2005 Sun Korea, Ltd. All rights reserved.