[Áöµð³ÝÄÚ¸®¾Æ]¿¬Àç °¡À̵å¿î¿µÃ¼Á¦ : À©µµ¿ì 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¸¦ ¸¸µç ¼¼µå¸¯ÀÌ ÀÚ¹Ù Æú¸®½º¿¡¼ ¹ßÇ¥ÇÑ °ÍÀ» µè°í ³ª¼ÀÌ´Ù. ÇÊÀÚ°¡ ¿ö³« ¾î³ëÅ×À̼ÇÀ» ÁÁ¾ÆÇÏ´Ùº¸´Ï Å×½ºÆ®¿¡ ¾²ÀÌ´Â ¾î³ëÅ×À̼ǿ¡ ±Í°¡ ¼Ö±êÇØÁ³°í, 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ÀÇ Á¦ÈÞ¸ÅüÀÎ ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®¿þ¾î¿¡ °ÔÀçµÈ ³»¿ëÀÔ´Ï´Ù.