ÀÌ ±ÛÀº Neil Bartlett ÀÇ ¿¬Àç ±Û
"Getting started with OSGi"ÀÇ ¹ø¿ªº»ÀÔ´Ï´Ù.
*
ÆÄÆ® 1 - ù¹øÂ° ¹øµé : Your First Bundle
*
ÆÄÆ® 2 - ÇÁ·¹ÀÓ¿öÅ©¿Í ¿¬µ¿Çϱâ : Interacting with the Framework
*
ÆÄÆ® 3 - ¹øµé°£ÀÇ ÀÇÁ¸°ü°è : Dependencies between bundles
*
ÆÄÆ® 4 - ¼ºñ½º µî·ÏÇϱâ : Registering a Service
*
ÆÄÆ® 5 - ¼ºñ½º »ç¿ëÇϱâ : Consuming a Service
¿¡ À̾î 6¹øÂ° ±ÛÀÔ´Ï´Ù. ¿ÀÅ»ÀÚ ¹× ÀÌ»óÇÑ ¹ø¿ªÀº ´ñ±Û·Î ³²°ÜÁÖ¼¼¿ä
Getting started with OSGi : OSGi ½ÃÀÛÇÏ±â ÆÄÆ® 6 - µ¿ÀûÀ¸·Î ¼ºñ½º ÃßÀûÇϱâ
ÀúÀÚ : Neil Bartlett < njbartlett at gmail dot com >
¿ªÀÚ : ±Ç Á¤Çõ < guruguru at gmail dot com >
±Û¿øº» :
http://www.eclipsezone.com/eclipse/forums/t91059.html - Getting started with OSGi : Dynamic Service Tracking
EclipseZone OSGi ¹Ì´Ï ½Ã¸®Áî¿¡ µ¹¾Æ¿À½Å°É ȯ¿µÇÕ´Ï´Ù.
Áö³¹ø¿¡´Â Martin Fowler ÀÇ ½Ã³ª¸®¿À(ƯÁ¤°¨µ¶¿¡ ÀÇÇØ Á¦ÀÛµÈ ¿µÈ¸¦ ã´Â
MovieFinder ¿¡ ÀÇÁ¸ÇÏ´Â
MovieLister)¸¦ ÀÌ¿ëÇØ¼ ¾î¶»°Ô ¼ºñ½º¸¦ »ç¿ëÇÏ´ÂÁö¸¦ ¾Ë¾ÆºÃ½À´Ï´Ù. ¶ÇÇÑ,
MovieLister °¡
MovieFinder ÀÇ ÀνºÅϽº¸¦ ãÁö ¸øÇÒ¶§ ¹«¾ùÀ» ÇØ¾ßÇÏ´ÂÁö¸¦ ÅëÇØ µ¿ÀûÀÎ OSGi ¼ºñ½ºÀÇ º»Áú¿¡ ´ëÇØ »ìÆìº¸¾Ò½À´Ï´Ù.
¿ì¸®°¡ Áö³¹ø¿¡ °í·ÁÇÏÁö ¾Ê¾Ò´ø ´Ù¸¥ °ÍÀÌ ÀÖ½À´Ï´Ù. ¸¸¾à ÇѰ³ ÀÌ»óÀÇ
MovieFinder°¡ ÀÖ´Ù¸é? Áï, ¾î¶² ¹øµéÀ̶óµµ
MovieFinder ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ´Â ¼ºñ½º¸¦ µî·ÏÇÒ¼ö ÀÖ°í, ·¹Áö½ºÆ®¸® ÀÔÀå¿¡¼± ¸ðµç ¹øµéÀº °°½À´Ï´Ù.
¿ì¸° ¹®Á¦¸¦ °£´ÜÈ÷ ¹«½ÃÇÒ ¼öµµ ÀÖ°í, ½ÇÁ¦·Î Áö³¹ø¿£ ±×·¸°Ô Çß½À´Ï´Ù.
ServiceTracker ¿¡°Ô
getService()¸¦ È£ÃâÇÔÀ¸·Î½á, ¿ì¸° ¼ºñ½º ·¹Áö½ºÆ®¸®¿¡ ÀÇÇØ ¼±ÅÃµÈ ÀÓÀÇÀÇ
MovieFinder ÀνºÅϽº¸¦ ¹Þ°Ô µË´Ï´Ù. ÀÌ ¼±Åÿ¡ ¿µÇâÀ» ÁÙ¼öÀÖ´Â ¿©·¯°¡Áö ¹æ¹ýÀÌ ÀÖÁö¸¸(¿¹¸¦ µé¾î,
SERVICE_RANKING ¼Ó¼ºÀ» ¼ºñ½º µî·Ï½Ã¿¡ ÁöÁ¤ÇÔÀ¸·Î½á), »ç¿ëÀڷμÀÇ ¿ì¸®´Â ÀÌ ¼±Åÿ¡ ´ëÇÑ ¿Ïº®ÇÑ Á¶Á¤´É·ÂÀ» °¡ÁöÁö´Â ¸øÇÕ´Ï´Ù. ±×¸®°í ½ÇÁ¦·Î ´õ ¸¹Àº Á¶Á¤´É·ÂÀ» °¡Áö°Ô µÇ´Â°ÍÀº ÁÁÀº°Ô ¾Æ´Õ´Ï´Ù. Áï ¿ì¸®´Â
MovieFinder ÀÇ ¾î¶² ÀνºÅϽº¶óµµ »ç¿ëÇÒ¼ö ÀÖ¾î¾ß ÇѴٴ°ÍÀÌÁÒ. ¿ì¸®°¡ óÀ½ºÎÅÍ ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÏ´Â ÀÌÀ¯À̱⵵ ÇÕ´Ï´Ù.
´ë½Å¿¡ ¿©·¯°³ÀÇ ¼ºñ½º ÀνºÅϽºµé¿¡ ´ëÇØ ÀÎÁöÇÏ°í »ç¿ëÇÏ´Â °ÍÀº ¶§¶§·Î À¯¿ëÇÒ¼öµµ ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î, ¿©·¯°³ÀÇ
MovieFinder ÀÎÅÍÆäÀ̽º°¡ °¡¿ëÇÏ´Ù¸é
MovieLister °¡ ÀÌ¿ëÇÒ¼ö ÀÖ´Â ¿µÈ µ¥ÀÌŸ¿¡ ´ëÇÑ ¿©·¯°³ÀÇ ¼Ò½º°¡ Àִٴ°ÍÀ» ÀǹÌÇÕ´Ï´Ù. °Ë»ö½Ã¿¡ À̵éÀ» ¸ðµÎ ÀÌ¿ëÇÔÀ¸·Î½á, ´õ ³Ð°í À¯¿ëÇÑ °Ë»ö°á°ú¸¦ »ç¿ëÀÚ¿¡°Ô Á¦°øÇÒ ¼ö ÀְԵ˴ϴÙ.
¸¶Áö¸·¿¡ ³íÀÇÇß´ø ¹®Á¦·Î ´Ù½Ã µ¹¾Æ°¡¼, ¸¸¾à
MovieFinder ¼ºñ½º°¡ »ç¿ë ºÒ°¡ÇÏ´Ù¸é ¾î¶²ÀÏÀ» Çϴ°ÍÀÌ ¸ÂÀ»±î¿ä ? ¿ì¸°
MovieFinder °¡ °¡¿ëÇÏÁö ¾ÊÀ»¶§
listByDirector ¸Þ¼Òµå°¡ È£ÃâµÉ¶§¸¶´Ù null À» ¸®ÅÏÇÏ´Â °£´ÜÇÑ ¹æ¹ýÀ» »ç¿ëÇß½À´Ï´Ù. ÇÏÁö¸¸
MovieFinder °¡ Á¸ÀçÇÏÁö ¾Ê´Â´Ù¸é MovieLister ÀÇ ¸Þ¼Òµå È£Ãâµµ º¼°¡´ÉÇÏ°Ô ÇÏ¸é ¾î¶³±î¿ä ?
MovieLister´Â
MovieFinder ¿Í ¸¶Âù°¡Áö·Î ¼ºñ½ºÀÔ´Ï´Ù. ¸¸¾à
MovieFinder ¼ºñ½º°¡ »ç¶óÁø´Ù¸é,
MovieLister µµ °°ÀÌ »ç¶óÁö°Ô ÇÏ´Â°Ç ? ´Ù½Ã ¸»ÇØ, ¿ì¸°
MovieLister ¼ºñ½º°¡
MovieFinder ¿¡ ´ëÇØ "1 ´ë ´Ù" °ü°è¸¦ °¡Áö±â¸¦ ¿øÇß½À´Ï´Ù. ¸¶Áö¸· Æ©Å丮¾ó¿¡¼ ¿ì¸° "0 ´ë 1" °ü°è¿´½À´Ï´Ù.
MovieListerImpl ¸¦ º¯°æÇغ¾½Ã´Ù. ¾Æ·¡ ÄÚµå¿Í ±³Ã¼Çϼ¼¿ä.
package osgitut.movies.impl;
import java.util.*;
import osgitut.movies.*;
public class MovieListerImpl implements MovieLister {
private Collection finders =
Collections.synchronizedCollection(new ArrayList());
protected void bindFinder(MovieFinder finder) {
finders.add(finder);
System.out.println("MovieLister: added a finder");
}
protected void unbindFinder(MovieFinder finder) {
finders.remove(finder);
System.out.println("MovieLister: removed a finder");
}
public List listByDirector(String director) {
MovieFinder[] finderArray = (MovieFinder[])
finders.toArray(new MovieFinder[finders.size()]);
List result = new LinkedList();
for(int j=0; j < finderArray.length; j++) {
Movie[] all = finderArray[j].findAll();
for(int i=0; i < all.length; i++) {
if(director.equals(all[i].getDirector())) {
result.add(all[i]);
}
}
}
return result;
}
}
ÀÌÁ¦ ¿ì¸°
MovieListerImpl ¿¡¼ OSGi ¿¡ ´ëÇÑ ÀÇÁ¸¼ºÀ» ¾ø¾Ý½À´Ï´Ù. ÀÌÁ¨ ¼ø¼ö POJO ÀÔ´Ï´Ù. ¾î¶µç, ÀÌ Å¬·¡½º´Â ´©±º°¡ ¶Ç´Â ¾î¶²°ÍÀÌ
MovieFinder ¼ºñ½º¸¦ ã¾Æ¼
bindFinder ¸Þ¼Òµå¸¦ ÅëÇØ Á¦°øµÇ¾î¾ß ÇÕ´Ï´Ù. ÀÌ·¸°Ô ÇϱâÀ§Çؼ
osgitut/movies/impl/MovieFinderTracker.java ¶ó´Â »õ·Î¿î ÆÄÀÏÀ» ¾Æ·¡¿Í °°ÀÌ ÀÛ¼ºÇÕ´Ï´Ù.
package osgitut.movies.impl;
import org.osgi.framework.*;
import org.osgi.util.tracker.*;
import osgitut.movies.*;
public class MovieFinderTracker extends ServiceTracker {
private final MovieListerImpl lister = new MovieListerImpl();
private int finderCount = 0;
private ServiceRegistration registration = null;
public MovieFinderTracker(BundleContext context) {
super(context, MovieFinder.class.getName(), null);
}
private boolean registering = false;
public Object addingService(ServiceReference reference) {
MovieFinder finder = (MovieFinder) context.getService(reference);
lister.bindFinder(finder);
synchronized(this) {
finderCount ++;
if (registering)
return finder;
registering = (finderCount == 1);
if (!registering)
return finder;
}
ServiceRegistration reg = context.registerService(
MovieLister.class.getName(), lister, null);
synchronized(this) {
registering = false;
registration = reg;
}
return finder;
}
public void removedService(ServiceReference reference, Object service) {
MovieFinder finder = (MovieFinder) service;
lister.unbindFinder(finder);
context.ungetService(reference);
ServiceRegistration needsUnregistration = null;
synchronized(this) {
finderCount --;
if (finderCount == 0) {
needsUnregistration = registration;
registration = null;
}
}
if(needsUnregistration != null) {
needsUnregistration.unregister();
}
}
}
ÀÌ Å¬·¡½º´Â Áö³¹ø¿¡ ¾ê±âÇß´ø
ServiceTracker Ŭ·¡½º¸¦ ¿À¹ö¶óÀ̵å ÇØ¼,
ServiceTracker °¡ ¼ºñ½º µî·Ï/»èÁ¦½Ã µ¿ÀÛÇÏ´Â ¹æ½ÄÀ» Ä¿½ºÅ͸¶ÀÌÁî ÇÕ´Ï´Ù. Ư¡ÀûÀ¸·Î,
MovieFinder ¼ºñ½º°¡ Ãß°¡µÉ¶§
addingService ¸Þ¼Òµå°¡ È£ÃâµÇ°í ,
MovieFinder °¡ Á¦°ÅµÉ¶§
removedService °¡ È£ÃâµË´Ï´Ù. ¿ì¸®°¡ ¿À¹ö¶óÀ̵å ÇÒ¼ö ÀÖ´Â ¸Þ¼ÒµåÁß¿¡
modifiedService µµ ÀÕ½À´Ï´Ù¸¸ ¿©±â¼± ÇÊ¿äÇÏÁö ¾Ê½À´Ï´Ù.
ÀÌ µÎ°³ÀÇ ¸Þ¼Òµå¿¡ ´ëÇØ¼± »ìÆìº¼¸¸ÇÑ °¡Ä¡°¡ ÀÖ½À´Ï´Ù. ù°·Î
addingService ¿¡¼± Àü´Þ¹ÞÀº ÀÎÀÚ°¡ ½ÇÁ¦ ¼ºñ½º ±¸Çö °³Ã¼°¡ ¾Æ´Ï¶ó
ServiceReference ÀÔ´Ï´Ù.
ServiceReference´Â ÀÎÀÚ·Î Àü´ÞµÉ¼ö ÀÖ´Â °¡º¿î ÇÚµéÀ̸ç, ¼ºñ½º¿¡ ´ëÇÑ ¼Ó¼º(¼ºñ½º µî·Ï½Ã¿¡ Àü´ÞÇß´ø)¸¦ Àдµ¥ »ç¿ëÀÌ °¡´ÉÇÕ´Ï´Ù. °áÁ¤ÀûÀ¸·Î,
ServiceReference ¸¦ ¾ò´Â°ÍÀº OSGi ÇÁ·¹ÀÓ¿öÅ©°¡ ÇØ´ç ¼ºñ½ºÀÇ ·¹ÆÛ·±½º Ä«¿îÆ®¸¦ Áõ°¡½ÃŰÁö ¾Ê½À´Ï´Ù. Java Reflection API ¿¡ ÀÖ´Â
WeakReference Ŭ·¡½º¿Í ºñ½ÁÇÏ°Ô »ý°¢ÇÏ½Ã¸é µË´Ï´Ù.
¿¹Á¦¿¡¼ ¿ì¸®°¡
ServiceReference ·Î ÇÒ Ã¹¹øÂ° ÀÛ¾÷Àº
MovieFinder ¼ºñ½º °³Ã¼¸¦ ¾ò´Â°ÍÀÔ´Ï´Ù. À̸¦ À§Çؼ ¿ì¸° ´Ù½Ã BundleContext ¸¦ ÇÊ¿ä·Î ÇÕ´Ï´Ù. (OSGi ÇÁ·¹ÀÓ¿öÅ©¿Í °ü·ÃµÈ ¸ðµç ÀÛ¾÷Àº
BundleContext ÀÎÅÍÆäÀ̽º¸¦ ÅëÇØ ÀÌ·ïÁø´Ù´Â°É ¸í½ÉÇϼ¼¿ä. ) Æí¸®ÇϰԵµ ½´ÆÛŬ·¡½ºÀÎ
ServiceTracker °¡
BundleContext ¿¡ ´ëÇÑ ·¹ÆÛ·±½º¸¦
context ¶ó°í À̸§ºÙÀÎ protected ¸â¹ö·Î °¡Áö°í ÀÖÀ¸¹Ç·Î ¹Ù·Î »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
´ÙÀ½À¸·Î ¿ì¸®°¡ À§¿¡¼ Á¤ÀÇÇÑ
MovieListImpl ÀÇ
bindFinder ¸Þ¼Òµå¸¦ °¡Áö°í ÆÄÀδõ¸¦ ¹ÙÀεù ÇÕ´Ï´Ù. ±×¸®°í
MovieListerImpl ÀÚü¸¦
MovieLister ÀÎÅÍÆäÀ̽º·Î ¼ºñ½º¿¡ µî·ÏÇÕ´Ï´Ù. ÀÌ¹Ì ¼ºñ½º°¡ µî·ÏµÇÁö ¾Ê¾ÒÀ»¶§¸¸ ¼ºñ½º¸¦ µî·ÏÇϰí ÀÖ´Ù´Â °É ÁÖÀÇÇϼ¼¿ä. À̹ø ½Ã³ª¸®¿À ¿¡¼± ÇѰ³ÀÇ
MovieLister °¡ ¿©·¯°³ÀÇ
MovieFinder ¼ºñ½º¸¦ ÃßÀûÇϱ⸦ ¿øÇÕ´Ï´Ù.
¸¶Áö¸·À¸·Î ¸Þ¼Òµå¿¡¼ ¸®ÅÏÇÕ´Ï´Ù. ¿©±â¿¡ Èï¹ÌÀÖ´Â ºÎºÐÀÌ ÀÖ½À´Ï´Ù.
addingService ÀÇ ¸®ÅÏŸÀÔÀº ±×³É
Object ÀÔ´Ï´Ù. ¿ì¸° ¹«¾ùÀ» ¸®ÅÏÇØ¾ß ÇÒ±î¿ä ? »ç½ÇÀº
ServiceTracker ´Â »ó°üÇÏÁö ¾Ê½À´Ï´Ù. ¿ì¸®°¡ ¿øÇÏ´Â ¾î¶²°ÍÀ» ¸®ÅÏÇØµµ µË´Ï´Ù. ¾î¶°Å³ª, ¿ì¸®°¡
addingService ¿¡¼ ¸®ÅÏÇÏ´Â °´Ã¼´Â
modifiedService ³ª
removedService °¡ È£ÃâµÇ¾úÀ»¶§ ¿ì¸®¿¡°Ô ´Ù½Ã ÁÖ¾îÁý´Ï´Ù. ±×·¯¹Ç·Î
removeService ¸Þ¼ÒµåÀÇ Ã¹¹øÂ° ÁÙÀ» º¸½Ã¸é, ¿ì¸®°¡ °´Ã¼¸¦
MovieFinder ·Î ij½ºÆÃÇϴ°ÍÀ» º¼¼öÀÖ½À´Ï´Ù. ÀÌ·¸°Ô ÇØ¼ ¸®½ºÅÍ·Î ºÎÅÍ
unbound µÉ¼ö Àִ°ÍÀÌÁÒ. ±×¸®°í´Â ¸¸¾à ÃßÀûÇÏ´Â finder µéÀÌ 0°³°¡ µÇ¾úÀ»¶§
MovieLister ¼ºñ½º¸¦ µî·ÏÇØÁ¦ ÇÕ´Ï´Ù.
ÀϹÝÀûÀ¸·Î, ¿ì¸®°¡
addingService ¿¡¼ ÇÑ ÀϵéÀº
removedService ¸Þ¼Òµå¿¡¼ µÇµ¹·Á ³ö¾ß ÇÕ´Ï´Ù. ±×·¯¹Ç·Î,
addingService ¸Þ¼Òµå¿¡¼ ¸®ÅÏÇÒ°ÍÀº ¿ì¸®°¡ ¹«½¼ÀÏÀ» Çß´ÂÁö¸¦ ¾Ë¼öÀÖµµ·Ï µµ¿ÍÁÖ´Â °ÍÀÌ¾ß ÇÕ´Ï´Ù.
HashMap ¿¡¼ÀÇ Key°¡ µÉ ¼öµµ ÀÖ°í,
ServiceRegistration °´Ã¼Àϼöµµ, À̹ø °æ¿ìó·³ ½ÇÁ¦ ¼ºñ½º °´Ã¼Àϼöµµ ÀÖ½À´Ï´Ù.
removedService ÀÇ ¸¶Áö¸· ´Ü°è·Î, ¿ì¸®°¡ "°¡Á®¿Ô´ø(Got)" ¼ºñ½º¸¦ "µ¹·ÁÁà¾ß(Unget)" ÇÕ´Ï´Ù. ÀÌ´Â ¼ºñ½º ·¹Áö½ºÆ®¸®°¡ ¼ºñ½º »ç¿ë Ä«¿îÅ͸¦ ÁÙÀÌ°Ô ÇØ¼, Ä«¿îÅͰ¡ 0 ÀÌ µÇ¾úÀ»¶§ ¼ºñ½º°¡ ÇØÁ¦µÉ¼ö ÀÖµµ·Ï ÇϱâÀ§ÇÑ °ÍÀ̹ǷÎ, ¸Å¿ì Áß¿äÇÕ´Ï´Ù.
ÀÚ ÀÌÁ¦ ¿ì¸° Activator °¡ ÇÊ¿äÇÕ´Ï´Ù.
osgitut/movies/impl/TrackingMovieListerActivator.java ÀÔ´Ï´Ù.
package osgitut.movies.impl;
import org.osgi.framework.*;
public class TrackingMovieListerActivator implements BundleActivator {
private MovieFinderTracker tracker;
public void start(BundleContext context) {
tracker = new MovieFinderTracker(context);
tracker.open();
}
public void stop(BundleContext context) {
tracker.close();
}
}
Manifest ÆÄÀÏ
TrackingMovieLister.mf ÀÔ´Ï´Ù.
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Tracking Movie Lister
Bundle-SymbolicName: TrackingMovieLister
Bundle-Version: 1.0.0
Bundle-Activator: osgitut.movies.impl.TrackingMovieListerActivator
Import-Package: org.osgi.framework,
org.osgi.util.tracker,
osgitut.movies;version="[1.0.0,2.0.0)"
ÀÌ ¹øµéÀ» ºôµåÇØ¼ Equinox ¿¡ ¼³Ä¡Çϴ°ÍÀº ¿©·¯ºÐ²² ¿¬½ÀÀ¸·Î ³²°ÜµÓ´Ï´Ù. ±×ÈÄ¿¡´Â ¾Æ·¡ ´Ü°èµéÀ» µû¶óÇØ¼ ¸ðµç°ÍÀÌ µ¿ÀÛÇÏ´ÂÁö¸¦ »ìÆìº¸¼¼¿ä.
BasicMovieFinder ¸¦ ½ÇÇàÇϰí TrackingMovieLister ¸¦ ½ÇÇàÇÕ´Ï´Ù. "MovieLister: added a finder" ¸Þ½ÃÁö°¡ ³ª¿À´ÂÁö È®ÀÎ.
services ¸í·ÉÀ» ÀÔ·ÂÇØ¼ MovieLister °¡ µî·ÏµÇ¾î ÀÖ´ÂÁö È®ÀÎÇÕ´Ï´Ù.
BasicMovieFinder ¸¦ Áß´ÜÇϰí "MovieLister: removed a finder" ¸Þ½ÃÁö°¡ ³ª¿À´ÂÁö È®ÀÎ.
services ¸í·ÉÀ» ´Ù½Ã ÀÔ·ÂÇØ¼ MovieLister ¼ºñ½º µî·ÏÀÌ ÇØÁ¦ µÇ¾ú´ÂÁö È®ÀÎ.
¿ì¸®°¡ ¿©±â¼ ÇÑ ÀÛ¾÷Àº, ¸Å¿ì °·ÂÇÑ ±â¼úÀÇ Åä´ë¸¦ ´ÙÁø°Å¶ó°í º¼¼ö ÀÖ½À´Ï´Ù. ¿ì¸®´Â ÇѰ³ÀÇ ¼ºñ½ºÀÇ ¶óÀÌÇÁ»çÀÌŬÀ» ´Ù¸¥ ¼ºñ½º(½ÇÁ¦·Î´Â ¿©·¯°³ÀÇ ´Ù¸¥ ¼ºñ½º)ÀÇ ¶óÀÌÇÁ»çÀÌŬ¿¡ ¿¬°áÇÏ¿´½À´Ï´Ù. ÀÌ ±â¼úÀ» ´õ ¹ßÀü½Ã۸é,
MovieLister ¿¡ ¿¬°áµÈ ´Ù¸¥ ¼ºñ½º¸¦ °¡Áú¼öµµ ÀÖ°í, ¶Ç °Å±â¿¡ ÀÇÁ¸ÇÏ´Â ´Ù¸¥ ¼ºñ½º µîµî.. ¿ì¸®´Â ¼·Î ÀÇÁ¸ÇÏ´Â ¼ºñ½ºµéÀÇ ±×·¡ÇÁ¸¦ ¸¸µé¾ú½À´Ï´Ù. ÇÏÁö¸¸ ´Ù¸¥ Á¤ÀûÀÎ IOC ÄÁÅ×À̳ʿ¡ ÀÇÇØ ¸¸µé¾îÁø bean µéÀÇ ±×·¡ÇÁ¿Í´Â ´Þ¸® ¿ì¸®ÀÇ ±×·¡ÇÁ´Â ưưÇϸç, ÀÚ°¡ Ä¡À¯´É·ÂÀÌ ÀÖ°í, º¯ÈÇϴ ȯ°æ¿¡ ÀûÀÀÇÒ ¼ö ÀÖ½À´Ï´Ù.
ÇÑÆíÀ¸·Î ¿ì¸®°¡ ÀÛ¼ºÇÑ Äڵ忡´Â ¾à°£ÀÇ ¹®Á¦°¡ ÀÖ½À´Ï´Ù.
MovieFinderTracker ¿Í
TrackingMovieListerActivator Ŭ·¡½º´Â ¹Ýº¹»ç¿ë µÇ´Â ¹®ÀåµéÀÌ °¡µæÇؼ, ¿ì¸®°¡ ½Ã½ºÅÛÀ» È®ÀåÇϱ⠽ÃÀÛÇÑ´Ù¸é ¿ì¸®´Â °°Àº Äڵ带 ¸Å¹ø Á¶±Ý¾¿¸¸ ¹Ù²ã¼ ÀÛ¼ºÇÏ°Ô µÇ¾î ¸Å¿ì ÇǰïÇØ Áú°ÍÀÔ´Ï´Ù. ±×·¯¹Ç·Î ´ÙÀ½È¸¿¡¼´Â ÀÌ ¸ðµç Äڵ带 ¸îÁÙÀÇ XML ·Î º¯°æÇÏ´Â ¹æ¹ýÀ» ¾Ë¾Æº¼ °Í ÀÔ´Ï´Ù.
´ÙÀ½È¸ºÎÅÍ´Â ÀÌÁ¦ ÇÑ µð·ºÅ丮¿¡¼ Ä¿¸Çµå ¶óÀÎ Åø·Î ¸ðµç°ÍÀ» ÀÛ¼ºÇϴ°ÍÀ» ±×¸¸µÑ °ÍÀÔ´Ï´Ù. ÀÌ Æ©Å丮¾óÀ» ½ÃÀÛÇÒ¶§ ÀúÀÇ ¸ñÇ¥´Â OSGi ´Â °£´ÜÇϸ鼵µ °·ÂÇÑ ÇÁ·¹ÀÓ¿öÅ© À̸ç, OSGi ¹øµéÀ» °³¹ßÇϱâ À§Çؼ Eclipse °°Àº ¹«°Ì°í °·ÂÇÑ IDE °¡ ÇÊ¿äÇÏÁö´Â ¾Ê´Ù´Â°ÍÀ» º¸¿©ÁÖ´Â °Í À̾ú½À´Ï´Ù. ¾î¶² °ÍÀÌ ¸Å¿ì ½±´Ù°í º¸¿©Áú¶§ , ¿ì¸®´Â ÇÑÆíÀ¸·Ð IDE °¡ ¾î¶² Èæ¸¶¹ýÀ» »ç¿ëÇÑ °ÍÀÌ ¾Æ´Ò±î ÇÏ´Â ÀDZ¸½ÉÀ» °¡Áö°Ô µË´Ï´Ù. Àü À̹ø °æ¿ì ¿£ ±×·±°Í°ú ´Þ¸®, OSGi °¡ ±×·± Èæ¸¶¹ýÀº ÇÊ¿äÇÏÁö ¾Ê´Ù´Â °Í À» º¸¿©ÁÖ¾ú±â¸¦ Èñ¸ÁÇÕ´Ï´Ù. ÇÑÆíÀ¸·Î, ¸¸¾à ÀÌ Äڵ带 ³Ö´Â µð·ºÅ丮°¡ Á¦°Í°ú ºñ½ÁÇÏ´Ù¸é, ¿©·¯ºÐ²²¼µµ ÀÌÁ¦ ÀûÀýÇÑ °³¹ßȯ°æÀ» ¿øÇÏ°í °è½Ç°Ì´Ï´Ù. Àú ¿ª½Ã ±×·¸½À´Ï´Ù. À̰ÍÀº ¹°·Ð OSGi ÀÇ ¹®Á¦°¡ ¾Æ´Õ´Ï´Ù. ¾î¶² Java ÇÁ·ÎÁ§Æ®¶óµµ Ç¥ÁØ Åø¸¸À» ÀÌ¿ëÇÑ´Ù¸é ±Ý¹æ °ü¸®Çϱâ Èûµé¾î Áý´Ï´Ù.
ÇÏ¿©Æ°, Á˼ÛÇÏÁö¸¸ ´ÙÀ½È¸±îÁö ¿©·¯ºÐ²²¼± EclipseCon ÀÌ ³¡³ª´Â°ÍÀ» ±â´Ù¸®¼Å¾ß ÇÒµíÇÕ´Ï´Ù. Àü 24½Ã°£¾È¿¡ Santa Clara ·Î °¡´Â ºñÇà±â¸¦ ž´Ï´Ù. °Å±â¼ ºË±â¸¦!
(¿ªÁÖ: ÀÛ³â±ÛÀ̶ó À§ ³»¿ëÀº ÇÊ¿ä¾ø°ÚÁö¸¸ ¿ø¹®°úÀÇ ÀÏÄ¡¸¦ À§ÇØ ±×³É ¹ø¿ªÇÕ´Ï´Ù ^_^ )
Concurrent Code ¸¦ À§ÇØ ´õ ³ªÀº ¹æ¹ýÀ» Á¦°øÇØÁØ BJ Hargrave ¿¡°Ô °í¸¿´Ù´Â ¸»À» ÀüÇÕ´Ï´Ù. ÇÏ½Ã¸é ´Ù¾çÇÑ Á¤º¸¸¦ ´õ¿í »¡¸® ¹Þ¾Æº¸½Ç¼ö ÀÖ½À´Ï´Ù.
Á¤¸» °í»ý ¸¹À¸¼Ì³×¿ä. ´öºÐ¿¡ ÆíÈ÷ °øºÎÇÕ´Ï´Ù. °¨»ç ^^