·Î±×ÀÎ | ȸ¿ø°¡ÀÔ (´º½º·¹ÅͽÅû) | SITEMAP
   
  °³¹ß   Ç÷§Æû   ½Ã½ºÅÛ   ¸Å´ÏÁö¸ÕÆ®   Àüü±â»ç  
ÀÚ¹Ù
´å³Ý
C/C++
DB
¸ðµ¨¸µ
À¥°³¹ß
±âŸ
À¯´Ð½º/¸®´ª½º
À©µµ¿ì
±âŸ
¼­¹ö
³×Æ®¿öÅ©
º¸¾È
±âŸ
BM
PM
±âŸ
 
±â»çÀúÀå
0
 
¸¶ÀÌ ½ºÅ©·¦
[ÀÚ¹Ù SOA °³¹ß, ¥Á¿Í ¥Ø] ¨é EJB¿Í ¸®Ä¡ Ŭ¶óÀÌ¾ðÆ® ±¸Ãà

ÀÌâ½Å   2005/09/15
1. SOA ¾ÖÇø®ÄÉÀÌ¼Ç ¼³°è¿Í Àüü ½Ã½ºÅÛ ±¸¼º
2. SOA ¾ÖÇø®ÄÉÀÌ¼Ç °³¹ß ¹æÇâ
3. EJB¿Í ¸®Ä¡ Ŭ¶óÀÌ¾ðÆ® ±¸Ãà
4. ¾À Ŭ¶óÀÌ¾ðÆ®¿Í J2ME Ŭ¶óÀÌ¾ðÆ® ±¸Ãà
[Áöµð³ÝÄÚ¸®¾Æ]
¿¬Àç °¡À̵å¿î¿µÃ¼Á¦ : À©µµ¿ì 2000/XP, À¯´Ð½º °è¿­, ¸®´ª½º³ª Mac OS Xµµ °¡´É
°³¹ßµµ±¸ : ÀÌŬ¸³½º 3.1
±âÃÊÁö½Ä : ÀÚ¹Ù, À¥¼­ºñ½º, XML
ÀÀ¿ëºÐ¾ß : ÀÚ¹Ù Ç÷§ÆûÀ» ÀÌ¿ëÇÑ À¥¼­ºñ½º Á¦°ø
À̹ø ±Û¿¡¼­ ´Ù·ç´Â ±â¼úµéÀÌ ¿ö³« ÃÖ½ÅÀε¥´Ù°¡ ½ºÆå°ú ±¸Çö ¸ðµÎ ºü¸£°Ô ¹ßÀüÇϰí ÀÖ¾î, ¸ÕÀú ±×°£ÀÇ º¯°æ »çÇ×µéÀ» Á¤¸®ÇÏ°í ³ª¼­ º»·ÐÀ¸·Î µé¾î°¡°Ú´Ù. JBossÀÇ EJB 3.0 PR4°¡ PR3°¡ ³ª¿Â Áö ¾ó¸¶ µÇÁö ¾Ê¾Æ µîÀåÇߴµ¥, ½ºÆå ±¸Çö Ãø¸éÀÌ ¾Æ´Ñ JBoss¸¸ÀÇ ÀÚü È®ÀåÀ» µé°í ³ª¿Ô´Ù. EJB 3.0 ½ºÆå¿¡µµ ¹Ý¿µÇÏ°í ½Í´Ù´Â Æ÷ºÎ¸¦ ¹àÈ÷±âµµ Çߴµ¥, POJO(Plain Old Java Object, º¸ÅëÀÇ ±âÁ¸ ÀÚ¹Ù ¿ÀÇÁÁ§Æ®¶ó´Â ¶æÀ¸·Î, EJB¿Í °°Àº °ÅâÇÑ ÄÄÆ÷³ÍÆ®°¡ ¾Æ´Ñ ÀϹÝÀûÀÎ Àڹ٠Ŭ·¡½º¸¦ °¡¸®Å²´Ù. ¿µÈ­ ¡®¿À½ºÆ¾ ÆÄ¿ö½º¡¯¿¡ µîÀåÇÏ´Â ¸ðÁ¶(Mojo)ÀÇ ÆÐ·¯µðó·³ µé¸®±âµµ ÇÑ´Ù)ÀÇ È°¿ë°ú ºñµ¿±â È£ÃâÀÇ Áö¿øÀÌ´Ù.

ƯÈ÷ ÃÖ±Ù POJO¿¡ ´ëÇÑ Áö¿øÀÌ J2SE 5.0ÀÇ ¾î³ëÅ×À̼ǰú ÇÔ²² »ó´çÈ÷ °¢±¤À» ¹Þ°í Àִµ¥, À̴ ƯÁ¤ ÀÎÅÍÆäÀ̽ºÀÇ ±¸ÇöÀ̳ª Ŭ·¡½ºÀÇ »ó¼Ó ¾øÀ̵µ ÀÓÀÇÀÇ Å¬·¡½º(Áï POJO)¿¡ ´ëÇÑ ¸ÞŸµ¥ÀÌÅ͸¦ ÁÙ ¼ö Àֱ⠶§¹®¿¡, ÄÄÆ÷³ÍÆ®¸¦ µ¹¸®´Â ÄÁÅ×À̳ʰ¡ ½±°Ô POJO¸¦ ÅëÇØ ¿øÇÏ´Â ¼­ºñ½º¸¦ Á¦°øÇÒ ¼ö ÀÖ´Ù´Â ÀåÁ¡¿¡ ±âÀÎÇÑ´Ù. ¿¹¸¦ µé¾î MDB(Message Driven Bean)¿Í À¯»çÇÏ°Ô JBoss EJB 3.0 PR4¿¡¼­ Á¦°øÇÏ´Â MDP(Message Driven POJO)ÀÇ °æ¿ì JBoss °íÀ¯ÀÇ ¾î³ëÅ×ÀÌ¼Ç Å¸ÀÔÀ» ½á¼­ Æò¹üÇÑ Å¬·¡½º¸¦ JMSÀÇ ¸Þ½ÃÁö °ø±ÞÀÚ°¡ ¼ÒºñÀÚ·Î µÐ°©½Ãų ¼ö ÀÖ´Ù. À̹ۿ¡µµ ½Ì±ÛÅÏ ¼­ºñ½º¸¦ °¡´ÉÇÏ°Ô ÇÏ´Â ¼­ºñ½º POJO¿Í J2SE 5ÀÇ ºñµ¿±â 󸮸¦ ÀÀ¿ëÇÑ ºñµ¿±â È£Ãâµµ ´«¿©°Ü º¼¸¸ÇÏ´Ù.

´Ù½Ã ¸»ÇÏÁö¸¸ ÀÌ·± ±â´ÉµéÀº EJB 3.0 Ç¥ÁØÀº ¾Æ´ÏÁö¸¸, ¹ÝÀÀÀÌ ÁÁ´Ù¸é Ç¥ÁØÈ­µÇ¾î °³¹ßÀÚµéÀ» ´õ¿í Æí¾ÈÇÏ°Ô ÇØÁÙ °ÍÀÌ´Ù.

JAX-RPC 2.0°ú JAXB 2.0ÀÇ RI ¹ßÇ¥°¡ ¿¹»óº¸´Ù Áö¿¬µÇ¾î, ÀÌ ¿ø°í¸¦ ÀÛ¼ºÇϰí ÀÖ´Â ½ÃÁ¡(3¿ù 3° ÁÖ)¿¡µµ ½ã¿¡ ¹®ÀÇÇØº» ¹Ù¿¡ µû¸£¸é ¸î ÁÖ ´õ ±â´Ù·Á¾ß ÇÑ´Ù´Ï, ¾Æ¸¶ ÀÌ ¹øÈ£°¡ Ãâ°£µÈ ÁîÀ½¿¡´Â Á¢ÇÒ ¼ö ÀÖÀ»Áöµµ ¸ð¸£°Ú´Ù. ÀÌ·¯ÇÑ Ãâ½Ã ÀÏÁ¤ÀÇ Áö¿¬¿¡ ÀÇÇØ ¿ø·¡ À¥ ¼­ºñ½º ºÎºÐµµ À̹ø¿¡ ´Ù·ç·Á ÇßÀ¸³ª ºÎµæÀÌÇÏ°Ô ´ÙÀ½ ´Þ·Î ¿¬±âÇÏ°Ô µÇ¾úÀ½À» ¾çÇØÇØÁֱ⠹ٶõ´Ù.

JSFÀÇ À¯ÀÏÇÑ ¿ÀǼҽº ±¸ÇöüÀÎ ¾ÆÆÄÄ¡ MyFaces°¡ ÀÎÅ¥º£ÀÌÅÍ ±â°£À» ¸¶Ä¡°í Á¤½Ä ÇÁ·ÎÁ§Æ®·Î Ãâ¹üÇß´Ù. º¸Åë ÀÚ¹Ù¿Í À¥¿¡ °ü·ÃµÈ ¾ÆÆÄÄ¡ ÇÁ·ÎÁ§Æ®´Â ÀÚÄ«¸£Å¸¿¡ ¼ÓÇÏ´Â °ÍÀÌ ÀϹÝÀûÀε¥, À̹ø MyFacesÀÇ °æ¿ì´Â ¸Å¿ì µ¶Æ¯Çß´Ù´Â °ÍÀÌ ÇÊÀÚÀÇ °³ÀÎÀûÀÎ ´À³¦ÀÌ´Ù. JSF´Â J2EE 5.0ÀÇ Çʼö Ç׸ñÀ̱⵵ ÇØ¼­(JSTL 1.1µµ µé¾î°£´Ù), ±×µ¿¾È ÀÚ¹Ù À¥ GUI¿Í °ü·ÃµÈ ¸¹Àº ÇÁ·¹ÀÓ¿öÅ©(½ÉÁö¾î´Â ½ãÀÇ JSF ¸®µåÀÎ Craig McClanahanÀÌ À̲ø°í ÀÖ´Â ½ºÆ®·µÃ÷±îÁö)°úÀÇ ¾Ë·ÂÀÌ ÀáÀçÇϰí ÀÖ´Ù(ÀÌ ÁÖÁ¦¿¡ ´ëÇØ¼­´Â ´ÙÀ½ ´Þ ¾À Ŭ¶óÀÌ¾ðÆ®¸¦ ´Ù·ç¸é¼­ ½ÉÃþÀûÀ¸·Î ³íÀÇÇÒ ±âȸ¸¦ °¡Á®º¸±æ Èñ¸ÁÇÑ´Ù). J2SE 5.0ÀÌ ¾÷µ¥ÀÌÆ® 2¸¦ ³»³õ¾ÒÀ¸¹Ç·Î ¾ÕÀ¸·ÎÀÇ Ç÷§Æû ±âÁØÀº ´ÙÀ½°ú °°ÀÌ µÇ°Ú´Ù.

  • JDK 5.0_02

  • JBoss ¼­¹ö 4.0.1SP1

  • JBoss EJB 3.0 PR4

  • ÀÌŬ¸³½º 3.0M5a


  • EJB ÄÄÆ÷³ÍÆ®
    ¸ÕÀú ´ÙÀ½°ú °°Àº °¡Á¤À» ÇÏ·Á ÇÑ´Ù.

    [1] JBoss ¼­¹ö¿Í EJB 3.0 ¸ðµâÀº ¼³Ä¡µÇ¾î ÀÖ´Ù.
    [2] Åýà ¿¹¾à ¼­ºñ½ºÀÇ È¨ µð·ºÅ丮¸¦ TAXI_HOMEÀ̶ó°í ºÎ¸¥´Ù(½ÇÁ¦ ¹°¸®ÀûÀÎ À§Ä¡´Â ¾îµð¶óµµ »ó°ü¾ø´Ù).
    [3] µð·ºÅ丮 °æ·Î ±¸ºÐÀÚ´Â /¸¦ ¾´´Ù(À©µµ¿ì »ç¿ëÀÚ´Â \¸¦ ½á¾ß ÇÒ ¶§µµ ÀÖÀ» °ÍÀÌ´Ù).
    [4] Åýà ¿¹¾à ¼­ºñ½ºÀÇ EJB ÄÄÆ÷³ÍÆ® Ȩ µð·ºÅ丮´Â TAXI_HOME/ejb·Î Àâ°í, TAXI_EJB_HOMEÀ̶ó°í ºÎ¸¥´Ù.
    [5] TAX_EJB_HOMEÀÇ µð·ºÅ丮 ±¸Á¶´Â JBoss EJB 3.0ÀÇ ¿¹Á¦¸¦ µû¸¥´Ù.

    ¹Ì¸® JBoss EJB 3.0ÀÇ ¼¼¼Ç ºóÀ̳ª ¿£Æ¼Æ¼ ºóÀÇ ¿¹Á¦¸¦ µ¹·Áº¸ÀÚ. ¿©·¯ °¡Áö ȯ°æ ¼³Á¤À̳ª ±âŸ ¹®Á¦·Î Àß µÇÁö ¾ÊÀ¸¸é Åýà ¿¹Á¦·Î ³ª¾Æ°¥ ¼ö ¾øÀ¸¹Ç·Î, JBoss EJB 3.0ÀÇ °ü·Ã ¹®¼­³ª Æ÷·³À» ÅëÇØ ¹Ýµå½Ã ÇØ°áÇÏÀÚ. ÇÊÀÚÀÇ °æ¿ì¿¡´Â ¼³Ä¡¿Í ¿¹Á¦ ½ÇÇàÀÌ ¸Å¿ì ¸Å²ô·¯¿ö °¨¸í(?)À» ¹Þ¾Ò´Ù. ÇÏÁö¸¸ ¾Ë ¼ö ¾ø´Â °ÍÀÌ ÀÌ ¼¼»óÀÇ ÄÄÇ»Å͵éÀ̹ǷÎ, µÇµµ·Ï ÀÚ½ÅÀÌ °¡Áö°í ÀÖ´Â ±âÁ¸ÀÇ JBoss ¼­¹öº¸´Ù´Â »õ·Î JBoss ¼­¹ö¸¦ µû·Î ¼³Ä¡ÇÏ¿© EJB 3.0À» ¿Ã¸®´Â °ÍÀÌ ¾ÈÀüÇϰڴÙ.

    <È­¸é 1> Åýà ¿¹¾à ¼­ºñ½º EJB ÇÁ·ÎÁ§Æ®ÀÇ ±¸Á¶(ÀÌŬ¸³½º)

    ±×·¯¸é, Åýà ¼­ºñ½º¸¦ À§ÇØ ÇÊ¿äÇÑ EJB ÄÄÆ÷³ÍÆ®°¡ ¹«¾ùÀÏÁö »ý°¢ÇØ º¸ÀÚ. ¸ÕÀú, ´ÙÀ½¿¡ ÁØÇÏ´Â ¼¼¼Ç ºóÀÌ ÇÊ¿äÇÏ´Ù.

    soa.service.TaxiBookService [ÀÎÅÍÆäÀ̽º]
    Taxi[] getAvailableTaxis(Location location, Calendar calendar)
    void reserve(int taxiId)
    Order[] viewOrders()
    void cancelOrder(int orderId)

    EJB 3.0¿¡¼­´Â ÇϳªÀÇ ¼¼¼Ç ºóÀ» ¸¸µé±â À§ÇØ ÃÑ 2°³ÀÇ ÀÚ¹Ù ¿ä¼Ò°¡ µé¾î°£´Ù.

  • ºñÁî´Ï½º ÀÎÅÍÆäÀ̽º-Ŭ¶óÀÌ¾ðÆ®¿¡ ³ëÃâÇÒ ¸Þ½îµåµéÀ» Á¤ÀÇÇÑ´Ù.

  • ºó Ŭ·¡½º-ºñÁî´Ï½º ÀÎÅÍÆäÀ̽º¿¡¼­ Á¤ÀÇÇÑ ¸Þ½îµåµéÀ» ±¸ÇöÇÑ´Ù.


  • Àß º¸¸é ÀÌÀü(2.1ÀÌÇÏ)ÀÇ EJB¿Í´Â ´Þ¸® Ȩ ÀÎÅÍÆäÀ̽º°¡ ¾ø´Ù. ±×¸®°í ¿¹ÀüÀÇ ¸®¸ðÆ®(¶Ç´Â ·ÎÄÃ) ÀÎÅÍÆäÀ̽º°ÝÀÎ ºñÁî´Ï½º ÀÎÅÍÆäÀ̽º³ª ºó Ŭ·¡½ºµµ ƯÁ¤ ÀÎÅÍÆäÀ̽º³ª Ŭ·¡½ºÀÇ »ó¼Ó ¾øÀÌ EJB ¾î³ëÅ×À̼ÇÀ¸·Î ¸¶°¨µÈ´Ù. ¾îÂî º¸¸é ÀÚ¹ÙÀÇ RMI ¸ðµ¨°ú ¸Å¿ì Èí»çÇѵ¥, ±×¸¸Å­ ÅëÄèÇØÁø ¸éÀÌ ÀÖ´Ù(ÀÌ·± ±¸¼®ÀÌ SOAÀÇ »ç»ó°ú Àß ºÎÇÕÇϱ⵵ ÇÑ´Ù). ¾ÕÀÇ TaxiBookServiceÀÇ ½ÇÁ¦ ÄÚµå´Â ´ÙÀ½°ú °°ÀÌ ºñÁî´Ï½º ÀÎÅÍÆäÀ̽ºÈ­ÇÑ´Ù.

    package soa.service;

    import java.util.Calendar;

    import javax.ejb.Remote;

    import soa.model.Location;
    import soa.model.Order;
    import soa.model.Taxi;

    @Remote
    public interface TaxiBookService {
      Taxi[] getAvailableTaxis(Location location, Calendar calendar);
      void reserve(int taxiId);
      Order[] viewOrders();
      void cancelOrder(int orderId);
    }

    ¹°·Ð ÀÌ ÀÎÅÍÆäÀ̽º°¡ ÄÄÆÄÀϵǷÁ¸é Taxi, Location, Order Ŭ·¡½º°¡ Á¤ÀǵǾî ÀÖ¾î¾ß ÇÑ´Ù. ÀÏ´ÜÀº soa.model¿¡ Ŭ·¡½º Á¤ÀǸ¸ ´ÙÀ½°ú °°Àº ½ÄÀ¸·Î ÇØµÎÀÚ.

    package soa.model;

    import java.io.Serializable;

    public class Location implements Serializable {

      private static final long serialVersionUID = 3906368246629414451L;

    }

    ¿ø°Ý Àü´ÞÀ» À§ÇØ SerializableÀ» ±¸ÇöÇØ¾ß Çϸç, J2SE 5.0¿¡ ¿Í¼­´Â serialVerionUID¸¦ Á¤ÀÇÇϱ⸦ °­·Â ±ÇÀåÇϰí ÀÖ¾î ÀÌŬ¸³½º¿¡¼­µµ ÀÚµ¿ »ý¼ºÇØÁÖ°í ÀÖ´Ù. ÀÌ·± ¾ÏÈ£ °°Àº ÄÚµå´Â À©µµ¿ì ÇÁ·Î±×·¡¹Ö¿¡¼­ º» ±â¾ï(±×ÂÊÀº ÈξÀ ±äµ¥´Ù°¡ ¿µ¹®ÀÚµµ ³¢¾î ÀÖ¾ú´Ù)ÀÌ ÀÖ±ä ÇÏ´Ù. ´ÙÀ½Àº Åýà ¿¹¾à ¼­ºñ½ºÀÇ ºó Ŭ·¡½ºÀÌ´Ù.

    package soa.service;

    import java.util.Calendar;

    import soa.model.Location;
    import soa.model.Order;
    import soa.model.Taxi;

    import javax.ejb.Stateless;

    @Stateless
    public class TaxiBookServiceBean implements TaxiBookService {

      public Taxi[] getAvailableTaxis(Location location, Calendar calendar) {
        // TODO Auto-generated method stub
        return null;
      }

      public void reserve(int taxiId) {
        // TODO Auto-generated method stub

      }

      public Order[] viewOrders() {
        // TODO Auto-generated method stub
        return null;
      }

      public void cancelOrder(int orderId) {
        // TODO Auto-generated method stub

      }

    }

    ÀÌŬ¸³½ºÀÇ ÀÚµ¿¿Ï¼º ±â´ÉÀ» »ç¿ëÇϸé ÀÌ¿Í °°ÀÌ ¾Ë¸ÍÀÌ ¾øÀÌ ÇÒ Àϸ¸ Âß ³ª¿Â´Ù. µü ÀÌ »óŰ¡ º¸Åë ¿µ¾î·Î ´õ¹Ì(dummy)¶ó°í ÇÏ´Â ²®µ¥±â¸¸ ÀÖ´Â »óÅÂÀÌ´Ù. ÀÌ Á¤µµ¸¸ ÇØµµ Åýà ¿¹¾à ¼­ºñ½º ¼¼¼Ç ºóÀÇ ºôµå¿Í ¹èÄ¡(deploy)´Â µÈ´Ù. ¡®ÀÌ´ÞÀÇ µð½ºÄÏ¡¯¿¡ µé¾î ÀÖ´Â ¼Ò½º´Â JBoss EJB 3.0ÀÇ ¼¼¼Ç ºó ¿¹Á¦¿¡¼­ À¯µµÇÑ Åýà EJB ÄÄÆ÷³ÍÆ® ÇÁ·ÎÁ§Æ®¿ë build.xmlÀÌ´Ù.

    ±âº»ÀûÀ¸·Î JBOSS_HOME°ú TESTNG_HOMEÀÌ È¯°æº¯¼ö·Î ÀâÇô ÀÖ¾î¾ß Çϴµ¥, TESTNG_HOMEÀº TestNG¶ó´Â Å×½ºÆ® ÇÁ·¹ÀÓ¿öÅ©ÀÇ È¨ µð·ºÅ丮ÀÌ´Ù. ÀÌ »õ·Î¿î Å×½ºÆ® ÇÁ·¹ÀÓ¿öÅ©´Â Á» »ý¼ÒÇÒ ¼öµµ Àִµ¥, Cedric Beust¶ó´Â ±¸±Û ¼Ò¼Ó(Àü¿¡´Â BEA¿¡¼­ EJB °ü·Ã ÀÏÀ» Çß¾ú´Ù) °³¹ßÀÚ°¡ â¾ÈÇØ³½ ¾î³ëÅ×ÀÌ¼Ç È°¿ë Å×½ºÆ® ÇÁ·¹ÀÓ¿öÅ©ÀÌ´Ù. NG(Next Generation)¶ó´Â Á¢¹Ì»ç°¡ ³ªÅ¸³»µí Å×½ºÆ® ÇÁ·¹ÀÓ¿öÅ©°èÀÇ ±â¼º¼¼´ëÀÎ JUnitÀÇ ºÎÁ·ÇÑ Á¡À» ±Øº¹Çϱâ À§ÇÑ ½ÃµµÀÎ ¼ÀÀÌ´Ù. ¾ÆÁ÷ ÀÌŬ¸³½º¿Í °°Àº ÅøÀÇ Áö¿øÀÌ ºÎÁ·ÇÏ´Ù´Â Á¡(ÇöÀç ÀÛ¾÷ÀÌ ÁøÇà ÁßÀ̶ó°í ÇÑ´Ù) ¸»°í´Â ¼ÐÀ̳ª Ant¿¡¼­ ½±°Ô ½ÇÇàÇÒ ¼ö ÀÖ¾î ºÒÆíÇÑ Á¡Àº ¾ø´Ù.

     [TestNG]  
    ÇÊÀÚ°¡ TestNG¿¡ °ü½ÉÀ» °®°Ô µÈ °ÍÀº TestNG¸¦ ¸¸µç ¼¼µå¸¯ÀÌ ÀÚ¹Ù Æú¸®½º¿¡¼­ ¹ßÇ¥ÇÑ °ÍÀ» µè°í ³ª¼­ÀÌ´Ù. ÇÊÀÚ°¡ ¿ö³« ¾î³ëÅ×À̼ÇÀ» ÁÁ¾ÆÇÏ´Ùº¸´Ï Å×½ºÆ®¿¡ ¾²ÀÌ´Â ¾î³ëÅ×À̼ǿ¡ ±Í°¡ ¼Ö±êÇØÁ³°í, JUnit¿¡¼­´Â ÇÒ ¼ö ¾ø´Â ¿©·¯ ±â´Éµé¿¡ ¸Å·ÂÀ» ´À²¼´Ù(°Ô´Ù°¡ assertEquals³ª assertTrue°¡ ¾Æ´Ï°í assert Ű¿öµå¸¦ ¾´´Ù!).

    TestNG´Â EJB 3.0ó·³ ÇÑ Å¬·¡½º¿¡ ¾î¶² ¿ªÇÒÀ» ºÎ¿©Çϱâ À§ÇØ ¸¶Ä¿ ÀÎÅÍÆäÀ̽º(¿¹¸¦ µé¾î ºó Ŭ·¡½º´Â javax.ejb.EnterpriseBean ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇØ¾ß Çϴµ¥, ÀÌ ÀÎÅÍÆäÀ̽º¿¡´Â ¾Æ¹«·± ¸Þ½îµå ¾øÀÌ ´ÜÁö ¡®³ª´Â ¿£ÅÍÇÁ¶óÀÌÁî ºó¡¯ÀÓÀ» Ç¥½ÃÇÏ´Â ¿ªÇÒÀ» ÇÒ »ÓÀÌ´Ù)´ë½Å ¾î³ëÅ×À̼ÇÀ» ½á¼­ Å×½ºÆ® Ŭ·¡½º¸¦ ³ªÅ¸³½´Ù. JUnitÀÌ TestCase¸¦ ¹Ýµå½Ã »ó¼ÓÇÏ´Â °Í°úµµ ±Ë¸¦ ´Þ¸®ÇÔÀ» ¾Ë ¼ö ÀÖ´Ù. ´ÙÀ½Àº °£´ÜÇÑ TestNG ±â¹Ý Å×½ºÆ® Ŭ·¡½ºÀÌ´Ù.

    import com.beust.testng.annotations.*;

    public class SimpleTest {

      @Configuration(beforeTestClass = true)
      public void setUp() {
        // code that will be invoked when this test is instantiated
      }

      @Test(groups = { "functest" })
      public void testItWorks() {
        // your test code
      }
    }

    ¾Õ¼­ ¼³¸íÇßµíÀÌ SimpleTest´Â ¾Æ¹«·± Ŭ·¡½ºµµ È®ÀåÇÏÁö ¾Ê´Â´Ù. TestNGÀÇ Æ¯Â¡ ÁßÀÇ Çϳª´Â Å×½ºÆ® ¸Þ½îµå¸¦ ¾î³ëÅ×À̼ÇÀ¸·Î ±¸ºÐÇÏ°í ¸Þ½îµå À̸§ÀÌ ¹Ýµå½Ã test·Î ½ÃÀÛÇÒ ÇÊ¿ä´Â ¾ø´Ù´Â Á¡ÀÌ´Ù. JUnitÀÇ setUp°ú tearDownµµ ´õ¿í ¼¼¹ÐÇÏ°Ô Á¶ÀýÇÒ ¼ö ÀÖ´Ù´Â Á¡µµ ÁÁ´Ù. °¢ Å×½ºÆ® ¸Þ½îµå´Â Test ¾î³ëÅ×À̼ÇÀÇ groups ¼Ó¼ºÀ¸·Î ºÐ·ù°¡ °¡´ÉÇÏ¿© Å×½ºÆ® ½ÇÇà ½Ã¿¡ Ȱ¿ë, ¿¹¸¦ µé¾î functest ±×·ìÀÇ Å×½ºÆ®´Â ½ÇÇàÇÏÁö ¾Êµµ·Ï ÇÒ ¼öµµ ÀÖ´Ù. Å×½ºÆ®ÀÇ ½ÇÇà¿¡´Â testng.xmlÀ̶ó´Â ¼³Á¤ ÆÄÀÏÀÌ ÇÊ¿äÇÏ´Ù.

    <!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >

    <suite name="My suite">

      <test name="Simple example">
        <classes>
          <class name="example1.Test1" />
        </classes>
      </test>

    </suite>

    ÀÌ¿Í °°ÀÌ Å×½ºÆ® Ŭ·¡½º¸¦ µî·ÏÇϰí Çʿ信 µû¶ó¼­´Â Å×½ºÆ® Ŭ·¡½º¿¡ Àμö¸¦ Àü´ÞÇÒ ¼öµµ ÀÖ´Ù. ÃÖ±Ù ÀÚ¹Ù °³¹ß (ƯÈ÷ ÇÁ·¹ÀÓ¿öÅ© ºÐ¾ß)¿¡¼­ È­µÎ°¡ µÇ°í ÀÖ´Â IoC(Inversion of Control)ÀûÀÎ Á¢±Ùµµ ¿³º¸ÀδÙ. À̹ۿ¡µµ JUnit¿¡¼­´Â º¼ ¼ö ¾ø´Â ½Å¼±ÇÑ ½Ãµµµµ ¸¹¾Æ, ´õ¿í ÀÚ¼¼ÇÑ »çÇ×Àº °ø½Ä »çÀÌÆ®ÀÎ www.beust.com/testng/¸¦ Âü°íÇϱ⠹ٶõ´Ù.

    ±×·¯¸é TestNG¸¦ ¼³Ä¡ÇÏ°í ³ª¼­ TESTNG_HOMEÀ» ¼³Á¤ÇÑ ÈÄ ´ÙÀ½ÀÇ Å×½ºÆ® Ŭ·¡½º¸¦ ½ÇÇàÇØ º¸ÀÚ.

    package soa.test;

    import javax.naming.InitialContext;
    import javax.naming.NamingException;

    import soa.model.Taxi;
    import soa.service.TaxiBookService;

    import com.beust.testng.annotations.Test;

    public class TaxiBookServiceTest {

      @Test(groups = {"function"}, enabled = true)
      public void callGetAvailableTaxis() throws NamingException {
        InitialContext ctx = new InitialContext();
        TaxiBookService service = (TaxiBookService) ctx.lookup(TaxiBookService.class.getName());
        Taxi[] availableTaxis = service.getAvailableTaxis(null, null);
        assert availableTaxis == null;
      }
    }

    ÇöÀç ¿ì¸®°¡ ±â´ëÇÒ ¼ö ÀÖ´Â ¼­ºñ½ºÀÇ ÇൿÀº ÀÌ Á¤µµÀÌ´Ù. ¾Æ¹«Æ° ÀÌ Å×½ºÆ®´Â ´õ¹Ì ºó Ŭ·¡½º¿¡¼­µµ Àß µ¹¾Æ°¡°í ¾î¼­¼Ç(assertion)µµ Åë°úµÈ´Ù. Âü°í·Î JNDI Á¢¼Ó Á¤º¸´Â TAXI_EJB_HOME¿¡ jndi.properties¶ó°í µÎ°í ½ÇÇà ½Ã¿¡ Ŭ·¡½º ÆÐ½º¿¡ TAXI_EJB_HOMEÀ» Ãß°¡ÇØÁÖ¸é ¼³Á¤ÇÏ´Â ¹æ½ÄÀ» ÃëÇß´Ù. ±×·³ °£´ÜÈ÷ Å×½ºÆ®¸¦ Ãß°¡ÇØ º¸ÀÚ. ÀÏ´Ü ÀÔ·ÂÀº ±×´ë·Î nullµé·Î Çϰí, 0°³ ÀÌ»óÀÇ Taxi ¹è¿­ÀÌ ³Ñ¾î¿Àµµ·Ï Çϸç, nullÀº ¹ÝȯµÇÁö ¾Êµµ·Ï ÇÑ´Ù. ±×·¯¸é ´ÙÀ½Ã³·³ ¾î¼­¼ÇÀ» ¹Ù²ã¾ß ÇÒ °ÍÀÌ´Ù.

        assert availableTaxis == null;
    ->
        assert availableTaxis != null;

    ±×¸®°í °£´ÜÇÏ°Ô Taxi ºó Ŭ·¡½º¿¡ ¿îÀü»çÀÇ À̸§À» ³ªÅ¸³»´Â driverName ¼Ó¼ºÀ» °®µµ·Ï ÇÑ ÈÄ, callGetAvailableTaxis()¿¡¼­ ¹Þ¾Æ¿Â Åýà ¸ñ·Ï¿¡¼­ ¿îÀü»ç Á¤º¸¸¦ Ãâ·ÂÇØ º¸ÀÚ.

      for (Taxi taxi : availableTaxis) {
        System.out.println("Driver Name:" + taxi.getDriverName());
      }

    ÀÌ·¸°Ô Å×½ºÆ®¸¦ ¹Ù²ã¼­ ½ÇÇàÇØ º¸¸é, ´ç¿¬È÷µµ AssertionError°¡ ³ª¸ç ½ÇÆÐÇÑ´Ù. TaxiBookServiceBeanÀÇ getAvailableTaxis ¸Þ½îµå°¡ ÇØ´ç Å×½ºÆ®ÀÇ ±â´ë¿¡ ºÎÀÀÇÏ°Ô ¸¸µé¾î º¸ÀÚ.

      public Taxi[] getAvailableTaxis(Location location, Calendar calendar) {
        // TODO Get list from DB
        Taxi[] list = new Taxi[2];
        list[0] = new Taxi();
        list[0].setDriverName("Jack");
        list[1] = new Taxi();
        list[1].setDriverName("Bill");
        return list;
      }

    ¸®Ä¡ Ŭ¶óÀ̾ðÆ®ÀÇ À縲
    ÀÏ´Ü Åýà ¿¹¾à ¼­ºñ½ºÀÇ ¸ñ·Ï¸¸ °£´ÜÈ÷ ÇØµÐ ä Æ÷Ä¿½º¸¦ Ŭ¶óÀÌ¾ðÆ®·Î µ¹·Áº¸ÀÚ. ÀÌ¹Ì Å¬¶óÀÌ¾ðÆ®¿Í ¼­ºñ½º °£ÀÇ Á¤º¸ ±³·ù¿¡ ´ëÇÑ °è¾àÀº ÀÌ·ïÁ®¼­, Ŭ¶óÀÌ¾ðÆ®¿¡¼­ Åýà ¸ñ·ÏÀ» º¸¿©ÁÖ´Â ±â´ÉÀ» ±¸ÇöÇØº¸·Á ÇÑ´Ù.

    ±× Àü¿¡ Àá½Ã Çö´ë Ŭ¶óÀ̾ðÆ®ÀÇ ¿ª»ç¿¡ ´ëÇØ ÀçÁ¶¸íÇÏ´Â ½Ã°£À» °¡Á®º»´Ù. ¸ÞÀÓ ÇÁ·¹ÀÓ°ú Á¢¼ÓÇÏ´Â ³ì»ö Å͹̳Π´Ü¸»±âÀÇ ½Ã´ë¸¦ ³Ñ¾î ´Ü¸»±â°¡ PC Çϵå¿þ¾î·Î »óÇâ Á¶Á¤µÇ¸é¼­ ±×¿¡ °É ¸Â´Â Ŭ¶óÀÌ¾ðÆ® ¼ÒÇÁÆ®¿þ¾î °³¹ßÀÌ ²ÉÀ» ÇÇ¿ì´Âµ¥, ¹Ù·Î ¡®4GLÀÇ ¹ø¼º¡¯À̶ó°í ºÒ¸®´Â 90³â´ë ÃʹÝÀÌ´Ù. MSÀÇ ºñÁÖ¾ó º£ÀÌÁ÷À» ºñ·ÔÇÏ¿© µ¨ÆÄÀÌ¿¡ À̸£±â±îÁö, ±âÁ¸ Å͹̳ο¡ ÁØÇÏ´Â ÀÔÃâ·ÂÀ» ´õ¿í º¸°­ÇØÁØ 4GL ±â¹Ý Ŭ¶óÀÌ¾ðÆ®´Â ±â¾÷ ½ÃÀå»Ó ¾Æ´Ï¶ó ÀÏ¹Ý »ç¿ëÀÚ ½ÃÀåÀ» ¼®±ÇÇØ°¡·Á´Â Âû¶ó, 90³â´ë Á߹ݺÎÅÍ ºÒ¾î ´ÚÄ£ ÀÎÅͳݰú À¥ ºê¶ó¿ìÀúÀÇ Æø¹ßÀûÀÎ º¸±ÞÀ¸·Î Á¡Â÷ ¾Ï¿îÀÌ ±ò¸®±â ½ÃÀÛÇÑ´Ù.

    À¥ ÆäÀÌÁö, À¥ ¼­¹ö, CGI, À¥ ¾ÖÇø®ÄÉÀ̼ÇÀ¸·Î À̾îÁö´Â ¾À Ŭ¶óÀÌ¾ðÆ®´Â À¥ ºê¶ó¿ìÀú°¡ PCÀÇ ±âº» ¾ÖÇø®ÄÉÀ̼ÇÀÌ µÇ¸é¼­ ¡®À̺¸´Ù ´õ ÁÁÀ» ¼ö ¾ø´Â¡¯ Ŭ¶óÀÌ¾ðÆ® ½ÇÇà ȯ°æÀ¸·Î ÀÚ¸®Àâ°í, ±â¾÷ ³»ºÎÀÇ ÀÎÆ®¶ó³Ý¿¡±îÁö ħÅõ, À¯Áöº¸¼ö¼º(ƯÈ÷ ¹ö±× ¼öÁ¤°ú ¹öÀü °»½Å)°ú ¹«°Å¿î µ¿ÀÛ¼ºÀ̶ó´Â ¾àÁ¡À» ¾È°í ÀÖ´Â ¸®Ä¡ Ŭ¶óÀÌ¾ðÆ® ½Ã´ëÀÇ Á¾¾ðÀ» ±¸ÇÏ°Ô ÇÑ´Ù.

    21¼¼±â·Î ³Ñ¾î¿À¸é¼­ ¸¹Àº ½Ã½ºÅÛµéÀÌ Àç°³¹ßµÇ°í, ¸®Ä¡ Ŭ¶óÀÌ¾ðÆ®´Â Á¡Â÷ ÀÔÁö°¡ Á¼¾ÆÁü°ú µ¿½Ã¿¡ ¾À Ŭ¶óÀÌ¾ðÆ®¿¡ ¸¹Àº ÁüÀ» ³Ñ°ÜÁÖ¸ç ¾µ¾µÈ÷ ¿ª»çÀÇ µÚ¾È±æ·Î »ç¶óÁö´Â µí ÇßÀ¸³ª, ¾À Ŭ¶óÀ̾ðÆ®ÀÇ ÇѰ谡 µå·¯³ª¸é¼­ ¼­¼­È÷ Àç±âÀÇ ±â¿îÀÌ °¨µ¹±â ½ÃÀÛÇÑ´Ù.

    ÀÎÅͳݡ¤À¥ ÇÁ·ÎÅäÄÝ¿¡ ±â¹ÝÇÑ ¾À Ŭ¶óÀ̾ðÆ®ÀÇ °¡Àå Å« ¹®Á¦Á¡Àº »ç¿ëÀÚ Ã¼Çè(user experience), ´Þ¸® ¸»ÇÏ¸é »ç¿ëÀÚ°¡ ±× »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º(User Interface, ÀÌÇÏ UI)¸¦ ½áº¸¸é¼­ ´À³¢´Â Æí¸®ÇÔ, ¾Æ¸§´Ù¿ò, Áñ°Å¿ò, ¸Å·Â µîÀÌ ºÎÁ·ÇÏ´Ù´Â °ÍÀÌ´Ù. ¾À Ŭ¶óÀÌ¾ðÆ®´Â ¸» ±×´ë·Î ±º»ì°ú ±â¸§À» ÂÓ »« UIÀÌ´Ù. À¥ ºê¶ó¿ìÀú´Â HTMLÀ̶ó´Â ÇÑÁ¤µÈ ¾ç½ÄÀ» ÅëÇØ Á¤º¸ °Ë»ö°ú ¿­¶÷À» Çϵµ·Ï ¼³°èµÈ ¸Å¿ì Á¦ÇÑµÈ »ç¿ëÀÚ È¯°æÀÌ´Ù. ±×·¡¼­ ºü¸£°í, óÀ½¿¡´Â ¾²±â ½±°í, À̽ĵµ ÆíÇÏ´Ù. ¹®Á¦´Â ±× ÀÌÈÄ´Ù. Çϵå¿þ¾î¿Í ¿î¿µÃ¼°è´Â ²÷ÀÓ¾øÀÌ Áøº¸Çϴµ¥, ¿ì¸®´Â ¿©ÀüÈ÷ À¥ ºê¶ó¿ìÀú°¡ º¸¿©ÁÖ´Â HTML¿¡ ¸Å´Þ¸®°í ÀÖ´Ù. Á¦¾àÀ» ¶Ù¾î³Ñ±â À§ÇØ DHTML, ÀÚ¹Ù½ºÅ©¸³Æ®, ¾×ƼºêX ÄÁÆ®·Ñ, Ç÷¡½Ã°¡ ¹ü¶÷ÇÏ°Ô µÇ°í, ÀÌ´Â °á±¹ ¾À Ŭ¶óÀÌ¾ðÆ®°¡ µµ·Î ¹«°Å¿öÁö¸é¼­ µ¿½Ã¿¡ ºê¶ó¿ìÀú °£ÀÇ È£È¯¼º, ¶Ç ºê¶ó¿ìÀú¿¡ ±ò·Á ÀÖ´Â ¿î¿µÃ¼°è °£ÀÇ È£È¯¼ºÀ» ¹«³Ê¶ß¸®´Â È¥¶õÀ» ÃÊ·¡ÇÏ°Ô µÈ´Ù.

    <È­¸é2> ÀÌŬ¸³½º ¸®Ä¡ Ŭ¶óÀÌ¾ðÆ® Ç÷§Æû ±â¹Ý ¾ÖÇø±ÄÉÀ̼Ç

    <È­¸é 2> ÀÌŬ¸³½º ¸®Ä¡ Ŭ¶óÀÌ¾ðÆ® Ç÷§Æû ±â¹Ý ¾ÖÇø®ÄÉÀ̼Ǹ®Ä¡ Ŭ¶óÀÌ¾ðÆ®´Â ´Þ¶óÁö°í ÀÖ´Ù. ÀÎÅͳݰú À¥À» Àû±ØÀûÀ¸·Î Æ÷¿ëÇϸç, Ç÷¡½Ã´Â ºÎȰÀÇ Ã¹ ½ÅȣźÀ» ³¯·È´Ù. ´õ ÀÌ»ó »ç¿ëÀÚ °æÇèÀ» Èñ»ýÇÏÁö ¸»ÀÚ´Â °ÍÀÌ ¸®Ä¡ Ŭ¶óÀ̾ðÆ®ÀÇ È£¼ÒÀÌ´Ù. ÁÁÀº PC¿¡ ÁÁÀº ±×·¡ÇÈÄ«µå, ±×¸®°í ³Ë³ËÇÑ ¸Þ¸ð¸®, ºü¸¥ ÀÎÅÍ³Ý È¸¼±, °ÔÀÓÀ» ÇϵíÀÌ ÀÎÅÍ³Ý ¹ðÅ·À» ÇÒ ±Ç¸®°¡ »ç¿ëÀÚ¿¡°Ô´Â ÀÖ´Â °ÍÀÌ´Ù. ´ÜÃàŰ¿Í Æã¼Ç ۵µ È¿À²ÀûÀ¸·Î ÀÌ¿ëÇÒ ¼ö ÀÖ°í, ¸Å¹ø È­¸é Àüȯ¿¡ ¼­¹ö¿Í Åë½ÅÇÏÁö ¾Ê¾Æµµ µÈ´Ù. À¥ ºê¶ó¿ìÀúÀÇ À¢Áö ¹Ì´þÁö ¾ÊÀº º¸¾È ´É·Â¿¡ °ÆÁ¤ÇÒ Çʿ䵵 ¾ø´Ù.

    ±×·³¿¡µµ ºÒ±¸Çϰí, ¾À Ŭ¶óÀÌ¾ðÆ®´Â ³ª¸§´ë·Î ¾µ¸ð°¡ ÀÖ(°íµµ ¸¹)´Ù. ¸ð ¾Æ´Ï¸é µµ, Èæ ¾Æ´Ï¸é ¹éÀÌ´ø ½Ã´ë°¡ °¡°í, »ç¿ëÀÚÀÇ ´Ü¸»±â¿Í ¼±Åÿ¡ µû¶ó ´õ ȤÀº ´ú dz¿ä·Î¿î üÇèÀ» ¼±»çÇÒ ¼ö ÀÖ´Ù. ¸®Ä¡ Ŭ¶óÀ̾ðÆ®ÀÇ Àç·¡¿Í ¾À Ŭ¶óÀÌ¾ðÆ®¿ÍÀÇ °øÁ¸Àº SOA¿¡ ÀÖ¾î XMLÀÇ »ç¿ë°ú ÇÔ²² ±× °¡´É¼ºÀÌ ´õ¿í ³Ð¾îÁö°í ÀÖ´Ù. ¾çÂÊ ´Ù Á¦°øÇϸé ÁÁ°Ú´Ù´Â °ÍÀº ´©±¸³ªÀÇ Èñ¸ÁÀÌ´Ù.

    ÇÏÁö¸¸ Ãß°¡ ÀÛ¾÷Àº µÑ°ġ°í¶óµµ °¢ Ŭ¶óÀÌ¾ðÆ®º°·Î ¼­¹ö¿Í ¾î¶»°Ô Åë½ÅÇÒÁöºÎÅÍ µû·Îµû·Î ÇÏ·Á´Ï °ñÄ¡°¡ ¾ÆÇÁ´Ù. °Å±â¿¡ ¸®Ä¡ Ŭ¶óÀÌ¾ðÆ®´Â ¼ÒÄÏ Åë½ÅÀ¸·Î µ¥ÀÌÅÍ ¼Û¼ö½Å ¼º´ÉÀ» Çâ»ó½Ãų ¼ö ÀÖÁö¸¸ ¹æÈ­º® Á¦ÇÑ¿¡ µû¸¥ Æ÷Æ® ¹®Á¦°¡ ´ÚÃĿ´Ù. ¹æÈ­º®¿¡ ģȭÀûÀ̸ç HTTP¸¦ Àü¼Û ÇÁ·ÎÅäÄÝ·Î »ç¿ëÇϸ鼭 Åõ¸íÇÑ ±¸Á¶ÀÇ XMLÀÇ ¸Þ½Ã¡ÀÌ ¸®Ä¡ Ŭ¶óÀÌ¾ðÆ®¿Í È¯»óÀûÀÎ ±ÃÇÕÀÌ µÇ¸®¶ó´Â ÁüÀÛÀº ½±°Ô °¡´ÉÇϸç, ÀÌ¹Ì ¸ÅÅ©·Î¹Ìµð¾îÀÇ Ç÷º½º(Flex)¿Í MSÀÇ ´å³ÝÀÌ ±× ½ÇÁ¦¸¦ º¸¿©ÁÖ°í ÀÖ´Ù.

    ÀÚ¹ÙÀÇ ¸®Ä¡ Ŭ¶óÀÌ¾ðÆ® ´ëÇ¥ Ç¥ÁØ ±â¼úÀº SwingÀÌ´Ù. ÀÚ¹Ù ·±Å¸ÀÓ¿¡ ±âº» ³»ÀåµÇ¾î ÀÖ°í, ¼Óµµ¿Í ¸ð¾ç»õµµ °ú°Å¿¡ ºñÇϸé Á¤¸»ÀÌÁö ¸¹ÀÌ ÁÁ¾ÆÁ³´Ù. ÇÏÁö¸¸ ÄÚ¾î Ç÷§Æû¿¡ ¼ÓÇÑ ±î´ß¿¡ ´Ù¸¥ ÀÚ¹Ù È®Àå ±â¼ú¿¡ ºñÇØ ¹ßÀüÀÌ ´õµð¾ú°í, ½ãÀÇ ÅëÁ¦±Ç¿¡ ³õ¿© Çõ½ÅÀûÀÎ ½Ãµµ¿¡´Â ¹ß¸ñÀÌ ÀâÇû´Ù. ±×·¯´Â ¿ÍÁß¿¡ IBMÀÌ ÀÌŬ¸³½º¸¦ ÅëÇØ ¼±º¸ÀÎ SWTÀº AWT¿Í ½ºÀ®À» ÀåÁ¡¸¸À» »ì¸° µíÇÑ Àλó°ú ÇÔ²² ÀÌŬ¸³½º °³¹ß ȯ°æÀ» ÅëÇØ È£ÆòÀ» ¾ò°Ô µÇ¾ú´Ù.

    ÇÊÀÚ´Â SwingÀ¸·Î ¸î Â÷·Ê ÇÁ·ÎÁ§Æ®¸¦ ÇÑ °æÇèÀ¸·Î Ç¥ÁØ ±â¼úÀ̶ó´Â Ãø¸éÀÇ SwingÀÇ ÀåÁ¡À» ³ôÀÌ »çÁö¸¸, ¡ºÅäÅ» ÀÌŬ¸³½º¡»¶ó´Â ±¹³»¼­ÀÇ º£Å¸ ¸®ºä¾î¸¦ Çϸ鼭 SWT¿Í JFace(SWT´Â AWT¿Í Java2D µî GUI ±â¹Ý°ú Swing ÄÄÆ÷³ÍÆ®ÀÇ ±âº»Ãþ¿¡, JFace´Â SwingÀÇ °í±Þ ÄÄÆ÷ÅÏÆ® Ãþ¿¡ ÇØ´çÇÑ´Ù°í º¼ ¼ö ÀÖ´Ù)ÀÇ °­·ÂÇÔ, ƯÈ÷ °¢ ¿î¿µÃ¼°è¿Í À§È­°¨ ¾øÀÌ °¨ÀÀµµ ÁÁÀº GUI Á¦°ø¿¡ °æÅºÀ» ±ÝÄ¡ ¸øÇß´Ù. ¹Ù·Î ÀÌ·± ¿î¿µÃ¼°è ¹ÐÂøÀÌ Swing Áø¿µÀÇ ½ÊÀÚÆ÷È­¸¦ ¸Â´Â °÷À̱⵵ ÇÏÁö¸¸, ¾îÂ÷ÇÇ ¸ÞÀÌÀú Ŭ¶óÀÌ¾ðÆ® Ç÷§ÆûÀÎ À©µµ¿ì¿¡¼­ÀÇ »ç¿ëÀÚ Ã¼ÇèÀÌ ´õ ÁøÇÏ°Ô ´Ù°¡¿Èµµ ºÎÀÎÇϱâ Èûµé´Ù.

    ÀÌŬ¸³½º RCP
    ±×·¯¸é ¸ÕÀú ÀÌŬ¸³½º¿¡¼­ RCP ¾ÖÇø®ÄÉÀ̼ÇÀ» À§ÇÑ ÇÁ·ÎÁ§Æ®¸¦ ¸¸µé¾îº¸ÀÚ. [New | Plug-in Project]À¸·Î »õ·Î¿î Ç÷¯±×ÀÎ ÇÁ·ÎÁ§Æ® »ý¼º ¸¶¹ý»ç·Î ÁøÀÔÇÑ´Ù(ÇÊÀÚµµ óÀ½¿¡ Ç÷¯±×ÀÎ ÇÁ·ÎÁ§Æ®¸¦ ¼±ÅÃÇ϶ó°í ÇØ¼­ Ȳ´çÇß´Ù).

    ÇÁ·ÎÁ§Æ® À̸§Àº taxi-rcp·Î Çϰí, Project contents¿¡¼­ Use default¸¦ üũÇÏÁö ¾Ê°í, µð·ºÅ丮¸¦ TAXI_HOME ¹Ø¿¡ rcp µð·ºÅ丮(¾ÕÀ¸·Î TAXI_RCP_HOME)¸¦ ¸¸µé¾î ¼±ÅÃÇÑ´Ù. Create OSGi bundle manifest¸¦ üũÇÏ°í ³ª¼­ ´ÙÀ½À¸·Î ³Ñ¾î°¡ÀÚ.

    ´ÙÀ½ È­¸é¿¡¼­´Â Plug-in ID´Â soa.rcp, Plug-in NameÀº Client Plug-in, Runtime Library´Â client.jar, Plug-in ClassÀÇ class nameÀ» soa.rcp.TaxiPluginÀ¸·Î Çϰí, Rich Client Application¿¡¼­ Yes¸¦ ¼±ÅÃÇÑ ÈÄ ´ÙÀ½À¸·Î ³Ñ¾î°£´Ù. ´ÙÀ½ ÅÛÇø´ ¼±Åà ȭ¸é¿¡¼­´Â RCP application with a view¸¦ ¼±ÅÃÇÑ ÈÄ ´ÙÀ½À¸·Î °£´Ù. ¸¶Áö¸· ¾ÖÇø®ÄÉÀÌ¼Ç Á¤º¸ È­¸é¿¡¼­ Application window titleÀº Taxi Booking Client ApplicationÀ¸·Î, Java package nameÀº soa.rcpÀ» ÀÔ·ÂÇϸé ÇÁ·ÎÁ§Æ® »ý¼ºÀÌ ¿Ï·áµÈ´Ù.

    ÅÛÇø´À¸·ÎºÎÅÍ ¸¸µé¾îÁø Åýà ¿¹¾à RCP Ŭ¶óÀÌ¾ðÆ®¸¦ ½ÇÇàÇØ º¸ÀÚ. taxi_rpc ÇÁ·ÎÁ§Æ®¸¦ ¼±ÅÃÇÑ ÈÄ ÄÁÅØ½ºÆ® ¸Þ´º(¸¶¿ì½º ¿À¸¥ÂÊ ¹öư Ŭ¸¯)¿¡¼­ [Run As | Eclipse Application](´ÜÃàŰ´Â alt+shift+X ´ÙÀ½¿¡ E) ¼±Åà ȤÀº plugin.xmlÀ» ¿­¾î¼­ Overview È­¸é¿¡¼­ Test ¼½¼ÇÀÇ Launch an Eclipse applicationÀ» ´­·¯µµ ÁÁ´Ù.

    <È­¸é 3> ¾ÆÁÖ °£´ÜÇÑ RCP ¾ÖÇø®ÄÉÀ̼Ç

    <È­¸é 3>°ú °°ÀÌ Àß ³ª¿Í ÁÖ¸é RCP ¾ÖÇø®ÄÉÀÌ¼Ç Á¦ÀÛ Áغñ´Â ¸¶Ä£ ¼ÀÀÌ´Ù. ±×·±µ¥, RCP ¾ÖÇø®ÄÉÀÌ¼Ç °³¹ß°ú´Â º°µµ·Î RCP ¾ÖÇø®ÄÉÀ̼ÇÀ» RCP ¾ÖÇø®ÄÉÀ̼Ǵä°Ô ¸¸µé¾îÁÖ´Â °ÍÀÌ ÀÖÀ¸´Ï ¹Ù·Î Á¦Ç° ¼³Á¤(Product Configuration)ÀÌ´Ù. ¿ì¼± ÀÌŬ¸³½ºÀÇ Run... ¸Þ´º¿¡¼­ ¹æ±Ý ½ÇÇàÇß´ø Ç׸ñÀÌ Eclipse Application(À̳ª ¼ýÀÚ°¡ µÚ¿¡ ºÙ¾î¼­)À¸·Î Ãß°¡µÇ¾î ÀÖÀ» °ÍÀ» ¼±ÅÃÇÏ¿© À̸§À» Taxi client·Î ¹Ù²Û´Ù. ±×´ÙÀ½ [New | Product Configuration]À» ¼±ÅÃÇϸé Production Configuration »ý¼º ¸¶¹ý»ç°¡ ¶ß´Âµ¥, taxi-rcp ÇÁ·ÎÁ§Æ®¸¦ ¼±ÅÃÇÑ ÈÄ File name¿¡´Â TaxiClient.product¸¦ ÀÔ·ÂÇϰí, Initialize the file content¿¡¼­´Â 2¹øÂ° Ç׸ñÀÎ Use an existing launch configurationÀ» °í¸¥ ÈÄ ±× ¿·ÀÇ ¼±Åà Ç׸ñ¿¡¼­ Taxi clientÀ» °í¸¥´Ù.

    Á¦Ç° ¼³Á¤À» ¸¶Ä¡°í ³ª¸é TaxiClient.productÀÇ Overview È­¸éÀÌ ³ª¿À´Âµ¥, ¸ÕÀú Product ID¿¡¼­ New... ¹öưÀ» ´­·¯ Á¦Ç° Á¤ÀǸ¦ ÇÏÀÚ. Defining Plug-in¿¡¼­´Â Browse ¹öưÀ» ´­·¯ soa.rcp Ç÷¯±×ÀÎÀ» ¼±ÅÃÇÑ´Ù. ´ÙÀ½ Product ID´Â TaxiClient¸¦ ÀÔ·ÂÇϰí, Product Application¿¡¼­ soa.rcp.applicationÀ» °í¸¥ ÈÄ ¸¶Ä£´Ù. ´ÙÀ½Àº Product NameÀ» Taxi Booking ClientÀ̶ó°í ÁØ´Ù.

    ¿©±â±îÁö ¼³Á¤ÇÑ °ÍÀ» °£´ÜÈ÷ Å×½ºÆ®¸¦ ÇØº¸ÀÚ. TaxiClient.productÀÇ Overview¿¡¼­ Testing ¼½¼ÇÀÇ Synchronize¸¦ ´©¸£¸é Á¦Ç° Á¤ÀÇ¿¡¼­ ¼±ÅÃÇÑ Ç÷¯±×Àΰú Á¦Ç° ¼³Á¤À» ¸ÂÃçÁØ´Ù. ´ÙÀ½À¸·Î, Launch the product¸¦ ´©¸£¸é ¾Æ±î ¾ÖÇø®ÄÉÀÌ¼Ç ½ÇÇà°ú ¶È°°Àº °á°ú¸¦ º¸°Ô µÈ´Ù.

    ¸¶Áö¸·À¸·Î Åýà ¿¹¾à RCP Ŭ¶óÀÌ¾ðÆ®¸¦ ÀͽºÆ÷Æ®ÇØ¼­ ÆÐŰÁö·Î ¸¸µé¾î º¸ÀÚ. Overview¿¡¼­ Synchronize·Î Ç÷¯±×Àΰú µ¿±âÈ­ÇÑ ÈÄ, ÀͽºÆ÷Æ®ÇÒ À§Ä¡¸¦ TAXI_RCP_HOMEÀ¸·Î Àâ¾Æ ÁÖ°í, ÆÄÀÏ À̸§À» taxi-rcp-client¶ó°í ÇÑ µÚ Export¸¦ ´©¸£¸é ¾à 5¸Þ°¡ °¡·®ÀÇ taxi-rcp-client.zipÀÌ »ý±ä´Ù. ÀÌ ÆÄÀÏÀ» TAXI_HOME ¹Ø¿¡ Ǭ ÈÄ TAXI_HOME/eclipse µð·ºÅ丮¿¡¼­ eclipse¸¦ ½ÇÇàÇÏ¸é ¾Æ±î Á¦Ç° ½ÇÇà°ú ¶È°°Àº È­¸éÀÌ ³ª¿Â´Ù. Áö±Ý±îÁö RCP ÇÁ·ÎÁ§Æ® ÀÛ¼ºÀ» Á¤¸®Çغ¸¸é ´ÙÀ½°ú °°´Ù.

    [1] [New | Plug-in Project]À¸·Î RPC ¾ÖÇø®ÄÉÀÌ¼Ç taxi-rcp ÇÁ·ÎÁ§Æ®¸¦ »ý¼ºÇÑ´Ù.
    [2] taxi-rcp ÇÁ·ÎÁ§Æ®¸¦ Eclipse ¾ÖÇø®ÄÉÀ̼ÇÀ¸·Î ½ÇÇàÇÑ ÈÄ ÇØ´ç ½ÇÇà Ç׸ñÀÇ À̸§À» Taxi client·Î Áö¾îÁØ´Ù.
    [3] [New | Product Configuration]À¸·Î TaxiClient.product Á¦Ç° ¼³Á¤À» »ý¼ºÇÑ´Ù.
    [4] TaxiClient.product¿¡ Çʼö Ç׸ñÀ» Ãß°¡ÇÑ´Ù.
    [5] ÀͽºÆ÷Æ®ÇÏ¿© ÆÐŰ¡ÇÑ´Ù.

    RCP ¾ÖÇø®ÄÉÀÌ¼Ç °³¹ß ½Ã¿¡´Â Á¦Ç° ¼³Á¤À» °Çµå¸± Çʿ䰡 ¾ø´Ù. ÆÐŰ¡ÇÏ¿© ¹èÆ÷ÇÏ´Â ½ÃÁ¡¿¡¼­ Á¦Ç° ¼³Á¤ÀÇ È¿·ÂÀÌ ¹ß»ýÇÔÀ» ÁÖÀÇÇÏÀÚ. ÀÌ·¸°Ô ÆÐŰ¡µÈ Åýà ¿¹¾à RCP ¾ÖÇø®ÄÉÀ̼ÇÀº JVM¸¸ ±ò·Á ÀÖ´Ù¸é ¾î´À µð·ºÅ丮¿¡ Ç®¾îµµ Àß ½ÇÇàµÇ´Â ¸Å¿ì ÈǸ¢ÇÑ ¼ÒÇÁÆ®¿þ¾î ÆÐŰÁöÀÌ´Ù. Ãß°¡ ¼³Á¤À¸·Î JVM±îÁö Æ÷ÇÔÇÒ ¼ö ÀÖ°í °¢ ¿î¿µÃ¼°è º°·Î ƯȭµÈ ÆÐŰ¡(À©µµ¿ì ¿î¿µÃ¼°è¿¡¼­´Â Winamp°¡ ¾²´Â NSIS ÀνºÅç·¯·Î ¸¸µå´Â °Íµµ °¡´ÉÇϰí, ÀÚ¹Ù À¥ ½ºÅ¸µå¸¦ ÅëÇÒ ¼öµµ ÀÖ´Ù)µµ Áö¿øÇϰí ÀÖ´Ù. Âü°í·Î TaxiClient.productÀÇ Branding ÅÇ¿¡¼­´Â ½ºÇ÷¡½Ã È­¸é(ÇÁ·Î±×·¥ÀÌ ½ÃÀÛÇϸ鼭 ³ª¿À´Â È­¸é), ÇÁ·Î±×·¥ÀÇ °³¹ßÀÚ³ª °³¹ß»ç¸¦ ¼Ò°³ÇÏ´Â About È­¸éµµ ¼³Á¤ÇÒ ¼ö ÀÖ¾î ¹«Ã´ Æí¸®ÇÏ´Ù.

    È­¸é ±¸¼º
    ¾Õ¼­ <È­¸é 3>À» º¸¸é One, Two, Three¶ó°í ³ª¿À´Âµ¥, À̰ÍÀ» Åýà ¿îÀü»ç À̸§ÀÇ ¸ñ·ÏÀ¸·Î ¹Ù²ãº¸ÀÚ. ¿¬Àç ½ÃÀÛºÎÅÍ °­Á¶Çؿ Á¡ÀÌÁö¸¸, ¼­ºñ½º¿Í Ŭ¶óÀÌ¾ðÆ®´Â ÀÎÅÍÆäÀ̽º ¼º¸³ ÀÌÈÄ ºÎÅÍ´Â µ¶¸³ÀûÀ¸·Î °³¹ß°ú Å×½ºÆ®°¡ °¡´ÉÇØ¾ß ÇÑ´Ù°í Çß´Ù. ºñÁî´Ï½º ·ÎÁ÷¿¡ ÇØ´çÇÏ´Â EJBÀÇ soa.modelÀº ±×·± Ãø¸é¿¡¼­ °øÀ¯°¡ °¡´ÉÇϸ鼭µµ °¢ÀÚ ¼Ò½º¸¦ °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ·± Àü·«Àº taxi-ejb ÇÁ·ÎÁ§Æ®ÀÇ src¿¡¼­ soa.model ÆÐŰÁö¸¦ taxi-rcp ÇÁ·ÎÁ§Æ®ÀÇ src·Î º¹»çÇØ¿ÈÀ¸·Î ½ÇÇöµÈ´Ù.

    ¹°·Ð, ÀÌ·¯ÇÑ °øÅë ¼Ò½º¸¦ µû·Î °ü¸®ÇÏ¿© µÎ ÇÁ·ÎÁ§Æ®°¡ ¿ÏÀüÈ÷ ¶È°°Àº ÀÚ·á ¸ðµ¨À» ¾²°Ô ÇÒ ¼öµµ ÀÖ´Ù. ÇÏÁö¸¸ ±×·¯ÇÑ ¹æ½ÄÀº SOAÀÇ Å¬¶óÀÌ¾ðÆ®¿Í ¼­ºñ½º °£ÀÇ ´À½¼ÇÑ ¿¬°á(loosely coupled)°ú´Â ¸ÂÁö ¾Ê´Ù. ½Ö¹æ Åë½Å»óÀÇ ±Ô¾à¸¸ÀÌ ÀÖÀ» »Ó, ³ª¸ÓÁö´Â °¢ÀÚÀÇ ±æÀ» °È´Â °ÍÀÌ´Ù. ÀÏ´ÜÀº ÆíÀÇ»óÀ¸·Î EJB·ÎºÎÅÍ ¸ðµ¨¸¦ ºô·Á¿ÀÁö¸¸(±×¸®°í ½ÇÁ¦ ÇÁ·ÎÁ§Æ®¿¡¼­µµ ÀÌ·¸°Ô ÇÏ¸é ÆíÇϰÚÁö¸¸), EJBÂÊÀÇ ¸ðµ¨°ú RCPÂÊÀÇ ¸ðµ¨Àº ¾ó¸¶µçÁö ´Ù¸¦ ¼ö ÀÖ´Ù.

    RCP Ŭ¶óÀÌ¾ðÆ®¿¡¼­ ¼­ºñ½º¸¦ È£ÃâÇÏ´Â °Íµµ EJB·ÎºÎÅÍ ¸ðµ¨À» ºô·Á¿À´Â °Í°ú ºñ½ÁÇÏ°Ô ÇØ°áµÈ´Ù. ¸ÕÀú, taxi-ejb ÇÁ·ÎÁ§Æ®ÀÇ src¿¡¼­ soa.service ÆÐŰÁö¸¦ taxi-rcp ÇÁ·ÎÁ§Æ®ÀÇ src·Î º¹»çÇØ¿Â´Ù. ´ÙÀ½, taxi-rcpÀÇ soa.service ÆÐŰÁöÀÇ TaxiBookService¿Í TaxiBookServiceBean¿¡ ÀÖ´Â ¾î³ëÅ×À̼ÇÀ» ¸ðµÎ Áö¿î´Ù. ±×¸®°í ³ª¼­, soa.rcp.ViewÀÇ ³»ºÎ Ŭ·¡½ºÀÎ ViewContentProvider¸¦ ´ÙÀ½°ú °°ÀÌ °íÄ£´Ù.

    class ViewContentProvider implements IStructuredContentProvider {
      public void inputChanged(Viewer v, Object oldInput, Object newInput) {
        }

        public void dispose() {
        }

    public Object[] getElements(Object parent) {
    TaxiBookService service = new TaxiBookServiceBean();
    Taxi[] availableTaxis = service.getAvailableTaxis(null, null);
    String[] driverNames = new String[availableTaxis.length];
    for (int i = 0; i < driverNames.length; i++) {
    driverNames[i] = availableTaxis[i].getDriverName();
    }
      return driverNames;
        }
    }

    TaxiBookService service = new TaxiBookServiceBean(); ºÎºÐÀÌ ¾Ð±ÇÀÌ´Ù. EJB 3.0ÀÇ ºñÁî´Ï½º ÀÎÅÍÆäÀ̽º¿Í ºó Ŭ·¡½º°¡ ¾ó¸¶³ª °³³äÀûÀ¸·Î ÈǸ¢ÇÑ Áö¸¦ ½Ç°¨ÇÒ ¼ö ÀÖ´Ù. ±×Àú ¾î³ëÅ×À̼ÇÀ» Áö¿üÀ» »ÓÀε¥, ÀÎÅÍÆäÀ̽º-ÀÓÇø®¸àÅ×ÀÌ¼Ç Â¦ÀÌ J2EE ȯ°æ ¾øÀ̵µ ¿Ïº®ÇÏ°Ô µé¾î¸Â´Â´Ù. ¹°·Ð, ÀÌ·¯ÇÑ Á¢±ÙÀº ºó Ŭ·¡½º¿¡ J2EE ±â¼úÀÌ ¾²À̸é ÅëÇÏÁö ¾Ê´Â´Ù. ±×·¯³ª ºñÁî´Ï½º ÀÎÅÍÆäÀ̽ºÀÇ ÀǹÌÀÇ ÆÄ±ÞÀÌ ÀÚ¿¬½º·´°í, ´õºÒ¾î ´õ¹Ì ºó Ŭ·¡½ºÀÇ ´ëÀÔÀÌ À¯¿¬ÇÏ´Ù´Â Á¡Àº EJB 3.0ÀÇ SOAÀû ÀåÁ¡À¸·Î ²ÅÀ»¸¸ÇÏ´Ù.

    °íÄ£ ¿¹Á¦¸¦ ½ÇÇàÇØº¸¸é One, Two, Three ´ë½Å Jack, BillÀÌ ³ª¿ÈÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ÀÌÁ¦ºÎÅÍ EJB ÄÄÆ÷³ÍÆ®¿Í RCP Ŭ¶óÀ̾ðÆ®ÀÇ °³¹ßÀº ¿ÏÀüÈ÷ º°µµ·Î ÁøÇàÇÒ ¼ö ÀÖÀ¸¸ç, Å×½ºÆ® ÀÛ¼ºµµ ¼­·Î ÀÇÁ¸ÇÏÁö ¾Ê°í Å×½ºÆ®¿ë(´õ¹Ì) µ¥ÀÌÅ͸¦ ÅëÇØ ÀڽŵéÀÇ ±â´É¿¡ Ãæ½ÇÈ÷, ƯÈ÷ »ó´ëÆí(RCP´Â EJB, EJB´Â RCP)ÀÇ °³¹ß ÁßÀÇ °¢Á¾ µ¹¹ß »óȲ¿¡ ¿µÇâÀ» ¹ÞÁö ¾Ê°í µ¶ÀÚÀûÀ¸·Î ÁøÇàÀÌ °¡´ÉÇÏ´Ù.

    µåµð¾î µå·¯³ª´Â Â÷¼¼´ë ÀÚ¹Ù À¥ ¼­ºñ½º
    ´ÙÀ½ È£¿¡´Â ¾î¼¸é ÀÚ¹Ù À¥ ¼­ºñ½ºÀÇ ´ë¹Ú ¼Ò½ÄÀ» ÀüÇÒ ¼ö ÀÖÀ»Áöµµ ¸ð¸£°Ú´Ù(±×·¡¼­ JAX-RPC 2.0°ú JAXB 2.0 RIÀÇ °ø°³°¡ ´Ê¾îÁö´Â Áöµµ). ¸¶Áö¸·À¸·Î Åýà ¿¹¾à ¼­ºñ½º ºó Ŭ·¡½º¿Í RCPÀÇ UIÀÇ ºó ºÎºÐÀ» ä¿ö°¡¸ç º¹½À ÇØ º¸±â¸¦ °­·Â ÃßõÇÑ´Ù. Àç¹Ì´Â ÇÊÀÚ°¡ º¸ÀåÇÑ´Ù.@

    * ÀÌ ±â»ç´Â ZDNet KoreaÀÇ Á¦ÈÞ¸ÅüÀÎ ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®¿þ¾î¿¡ °ÔÀçµÈ ³»¿ëÀÔ´Ï´Ù.
    °ü·Ã±â»ç
    ¿ÀǼҽº, ¹Ìµé¿þ¾î ÅëÇÕ ³ª¼±´Ù¡¸SOA¡¤ESB¸¦ ǰ¾È¿¡¡¹
    SOA¿¡¼­ÀÇ µ¥ÀÌÅÍ ºÐ·ù ¹× Ç¥Çö ¨ç
    À¥¼­ºñ½º·Î SOA ÄÄÆ÷³ÍÆ® ±¸ÇöÇϱâ
    SOA·Î ¸¸µå´Â ¿£ÅÍÇÁ¶óÀÌÁî ÇÁ·¹ÀÓ¿öÅ©
    µ¶ÀÚÀÇ°ß ³²±â±â (·Î±×ÀÎ ÈÄ µ¶ÀÚ ÀǰßÀ» ³²±â½Ç ¼ö ÀÖ½À´Ï´Ù.)
    ¾ÆÀ̵ð ºñ¹Ð¹øÈ£
     
     
    [ORM ¨é] iBATIS SQL...
    [¼öÆÛ°³¹ßÀÚÀÇ ±æ ¨ç] °¡½¿ÀÇ ²Þ...
    [ORM ¨è] JPA Ȱ¿ëÇϱâ
    [ORM ¨ç] ÇÏÀ̹ö³×ÀÌÆ® Ȱ¿ëÀü...
    [±â°í]±ÝÀ¶ ¼­ºñ½º ½ÃÀåÀ» À§ÇÑ ...
    [DDD ¨ë] BDD(Behavi...
    [±â°í]¿Ã¸²ÇÈ ½ÃÁ𠺸¾È À§Çù¿¡ ...
    [Weekend TV]Àü¼¼°è ¸ÅÁø Áø±â·Ï 'ºñµð¿À°ÔÀÓ ¶óÀ̺ê¼î' [00:02:42]
    »õ³ÊÁ¦ÀÌ(¹Ì±¹)=·ùÁØ¿µ ±âÀÚ, À¯È¸Çö PD
    '±¤¼¶À¯ 3D ¿µ»ó', ³úÀÇÇп¡ »õ ÁöÆò ¿­´Ù [00:02:31]
    Áöµð³ÝÄÚ¸®¾Æ ¿µ»óÁ¦ÀÛÆÀ
    ¡°À¥ Ç¥ÁØÀº ¹«½¼!¡±¡¦IE8¿¡ ´ë...
    Á¶Áßµ¿, ´ÙÀ½¿¡ ´º½º°ø±Þ Áß´Ü¡¦"...
    ³×À̹ö´Â ¿Ö '10´ë ÇØÄ¿'¿¡ ´ç...
    [¼öÆÛ°³¹ßÀÚÀÇ ±æ ¨ç] °¡½¿ÀÇ ²Þ...
    °øÀÎÀÎÁõüÁ¦, ¿ì¸®¿¡°Ô ÀÓ¹ÚÇÑ ¹Ì...
    ´ÙÀ½ vs Á¶Áßµ¿, Á¤¸éÃæµ¹·Î Ä¡...
    Áö¾Öµå, ¿Á¿Ü±¤°í¿Í Ç×°ø»çÁø °áÇÕ...
    [Àλç]Áö½Ä°æÁ¦ºÎ
    ÆÄ¼ö´åÄÄ "DRMÀÌ º¸¾È»ê¾÷ À̲ö...
    ³×À̹ö ¼­ºñ½º ÀÚ¹®À§¿øÈ¸, º»°ÝÀû...
    Çѱ¹¾ÆÀ̽ǷÐ, ¾¾µð³×Æ®¿÷½º¿¡ ´ë±Ô...
     
     
    The Korean edition of 'ZDNet' is published under license from CNET Networks, Inc., San Francisco, CA, USA. Editorial items appearing in 'ZDNet Korea' that were originally published in the US Edition of 'ZDNet', 'CNET', and 'CNET News.com' are the copyright properties of CNET Networks, Inc. or its suppliers.
    Copyright ¨Ï 2008 CNET Networks, Inc. All Rights Reserved. 'ZDNet', 'CNET' and 'CNET News.com' are trademarks of CNET Networks, Inc.