ÀÌ ±ÛÀº 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 - µ¿ÀûÀ¸·Î ¼ºñ½º ÃßÀûÇϱâ : Dynamic Service Tracking
¿¡ À̾î 7¹øÂ° ±ÛÀÔ´Ï´Ù. ¿ÀÅ»ÀÚ ¹× ÀÌ»óÇÑ ¹ø¿ªÀº ´ñ±Û·Î ³²°ÜÁÖ¼¼¿ä
Getting started with OSGi : OSGi ½ÃÀÛÇÏ±â ÆÄÆ® 7 - ¼±¾ðÀû ¼ºñ½º ¼Ò°³Çϱâ
ÀúÀÚ : Neil Bartlett < njbartlett at gmail dot com >
¿ªÀÚ : ±Ç Á¤Çõ < guruguru at gmail dot com >
±Û¿øº» :
http://www.eclipsezone.com/eclipse/forums/t96740.html - Getting started with OSGi : Introducing Declarative Services
¸Å¿ì ´Ê¾îÁ® ¹ö¸° "Getting Started with OSGi" ½Ã¸®Áî¿¡ ¿À½Å°É ȯ¿µÇÕ´Ï´Ù. À̹ø ȸ´Â ¼±¾ðÀû ¼ºñ½º¿¡ ´ëÇØ ¾Ë¾Æº¼°ÍÀ̹ǷΠ¸Å¿ì Àç¹ÌÀÖÀ» °ÍÀÔ´Ï´Ù.
¼±¾ðÀû ¼ºñ½º(Declarative Services , DS) ½ºÆåÀº OSGi ÀÇ »õ·Î¿î ºÎºÐÁßÀÇ Çϳª·Î¼, ¹øµé°£ÀÇ ¼ºñ½º¸¦ ¿¬°áÇÒ¶§ »ý±â´Â À̽´µéÀÇ °á°ú·Î »ý°Ü³µ½À´Ï´Ù. ÀÌ ÀÛ¾÷ÀÌ ¾î·Æ´Ù´Â °ÍÀÌ ¾Æ´Ï¶ó ( Á¦ ¿¹Àü Æ©Å丮¾óµéÀÌ º¸¿©ÁÖ¾úÀ»²¨¶ó°í Èñ¸ÁÇÕ´Ï´Ù. ) ²Ï ¸¹Àº ¾çÀÇ ¹Ýº¹ÀûÀÎ ÄÚµå(boilerplate)¸¦ ÇÊ¿ä·Î Çϱ⠶§¹®ÀÔ´Ï´Ù. ¶ÇÇÑ, ¾²·¹µå ¹®Á¦¶§¹®¿¡ Á¶½ÉÇØ¾ß Çϸç ÀÌ´Â ½±°Ô ´ç½ÅÀÇ ¹ß¿¡ ÃÑÀ» ½ò¼ö ÀÖ°Ô µÈ´Ù´Â °ÍÀÔ´Ï´Ù. (shoot yourself in the foot, ¿ªÁÖ: ½±°Ô ½Ç¼öÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ¸·Î, ±×³É ¿ø¹®´ë·Î ¹ø¿ªÇß½À´Ï´Ù.
http://burks.bton.ac.uk/burks/language/shoot.htm Âü°íÇϼ¼¿ä)
ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇÑ Ãʱ⠽õµ´Â
Humberto Cervantes ¿Í
Richard Hall ÀÌ ¸¸µç ÅøÀÎ Service Binder ¿´½À´Ï´Ù. Service Binder ´Â
automated service dependency management(ÀÚµ¿ ¼ºñ½º ÀÇÁ¸°ü°è °ü¸®) ¸¦ ¼Ò°³ÇÏ¿© °³¹ßÀÚ¿¡°Ô ÀڽŵéÀÇ ¼ºñ½º¸¸À» ÀÛ¼ºÇϴµ¥ ÁýÁßÇϵµ·Ï Çß½À´Ï´Ù. ¼ºñ½º°£ÀÇ ¿¬°áÀº ¼±¾ðÀûÀ¸·Î 󸮵Ǿú°í, ÀÌ ¼±¾ðµéÀº XML ·Î ÀÛ¼ºµÇ¾ú½À´Ï´Ù.
¼±¾ðÀû ¼ºñ½ºÀÇ ½ºÆåÀº Service Binder ¿¡¼ ¹ßÀüµÈ°ÍÀ¸·Î ÀÌÁ¦´Â OSGi ¹öÀü 4.0 À̻󿡼± Ç¥ÁØÀÌ µÇ¾ú½À´Ï´Ù. ±×·³, ÀÌÁ¦ À̰ÍÀÌ ¿ì¸®¿¡°Ô ¹«¾ùÀ» ÇØÁÙ¼ö ÀÖ´ÂÁö º¸ÁÒ.
Áö³È¸¿¡¼ ¸»¾¸µå·ÈµíÀÌ, ÀÌÁ¦ Ä¿¸Çµå ¶óÀο¡¼ ¸ðµç°ÍÀ» ÇÏ´Â °ÍÀÌ Èûµé¾îÁ³À¸¹Ç·Î Áö±ÝºÎÅÍ´Â Eclipse SDK ¸¦ »ç¿ëÇϵµ·Ï ÇϰڽÀ´Ï´Ù. ±×·¸Áö¸¸ Á¦°¡ ¼Ò°³ÇÏ´Â °ÍµéÀÌ Á¤¸» Eclipse ¿¡ Á¾¼ÓÀûÀÌÁö´Â ¾Ê´Ù´Â°ÍÀ» ±â¾ïÇØÁÖ¼¼¿ä. ºñ·Ï Eclipse °¡ ¿ì¸®°¡ ÇÏ·Á´Â °ÍµéÀ» ¸¹ÀÌ µµ¿ÍÁÖ±â´Â ÇÏÁö¸¸, ¾î¶² Èæ¸¶¹ýµµ ¾øÀ¸¸ç, ¿©±â¼ º¸½Ã´Â ¾î¶² °Íµµ NetBeans ³ª IntelliJ ¶Ç´Â ¿À·¡µÈ vi ¶óµµ °¡´ÉÇÕ´Ï´Ù.
ù¹øÂ°·Î ÇÒÀÏÀº ¼±¾ðÀû ¼ºñ½º¿¡ ´ëÇÑ Equinox ±¸ÇöÀ» ´Ù¿î·Îµå Çϴ°ÍÀÔ´Ï´Ù. ¾ÈÁ¤ÀûÀÎ Eclipse ¹öÀüÀ» »ç¿ëÇϰí ÀÖÀ¸½Ã´Ù´Â °¡Á¤ÇÏ¿¡ ( ÀÌ±Û ¾²´Â ½ÃÁ¡¿¡¼´Â 3.2.2 ), ´Ù¿î¹Þ±â ¸µÅ©´Â
¿©±â ÀÔ´Ï´Ù. ´Ù¸¥ ¹öÀüÀ» »ç¿ëÇÏ°í °è½Ã´Ù¸é,
¿©±â Equinox ÀÇ »óÀ§·¹º§ ´Ù¿î·Îµå ÆäÀÌÁö ¿¡¼ ¸Â´Â ¹öÀüÀÇ
org.eclipse.equinox.ds_x.x.x_xxxxx.jar ÆÄÀÏÀ» ãÀ¸¼Å¾ß ÇÕ´Ï´Ù. ´Ù¿î·Îµå°¡ ³¡³ª¸é, Eclipse°¡ ¼³Ä¡µÈ µð·ºÅ丮 ÇϺÎÀÇ
plugins µð·ºÅ丮¿¡ º¹»çÇϰí Eclipse ¸¦ Àç½ÃÀÛ Çϼ¼¿ä. ¸¸¾à¿¡ ¿©·¯ºÐÀÌ Eclipse plug-ing °³¹ß¿¡ ¾à°£ ¾Ë°í °è½Å´Ù¸é, ÀÌ Jar ÆÄÀÏÀ» Target Platform Æú´õ¿¡ ³ÖÀ¸¼Å¾ß ÇÕ´Ï´Ù. "Target Platform"ÀÌ ¹ºÁö ¸ð¸£½Å´Ù¸é, ¾Æ¹« °ÆÁ¤¸¶½Ã°í ±×³É
plugins Æú´õ¿¡ JAR ÆÄÀÏÀ» ³Ö¾îÁÖ¼¼¿ä.
ÀÚ ÀÌÁ¦ »õ·Î¿î ¹øµéÀ» ¸¸µé °ÍÀÔ´Ï´Ù. Eclipse ¿¡¼ Plug-in ÇÁ·ÎÁ§Æ® À§Àڵ带 ÀÌ¿ëÇØ¼ »õ·Î¿î ÇÁ·ÎÁ§Æ®¸¦ »ý¼ºÇÕ´Ï´Ù.
- ¸ÞÀÎ ¸Þ´º¿¡¼ File -> New -> Project ¸¦ ¼±ÅÃÇÕ´Ï´Ù.
- Plug-in ÇÁ·ÎÁ§Æ®¸¦ ¼±ÅÃÇϰí Next¸¦ ´©¸¨´Ï´Ù.
- ÇÁ·ÎÁ§Æ®ÀÇ À̸§À»
SampleExporter ¶ó°í ÀÔ·ÂÇÕ´Ï´Ù.
- ¾Æ·¡ÂÊ "This plug-in is targeted to run with" Ç׸ñ ¹Ø¿¡, "an OSGi framework" ¸¦ ¼±ÅÃÇÏ°í ±× ¿· µå·Ó´Ù¿î¸®½ºÆ®¿¡¼ "standard" ¸¦ ¼±ÅÃÇϼ¼¿ä. ÀÌ ´Ü°è´Â ²À ÇÊ¿äÇÑ>°ÍÀº ¾Æ´ÏÁö¸¸, ¿ì¸®°¡ ½Ç¼ö·Î¶óµµ ´Ù¸¥ OSGi ÇÁ·¹ÀÓ¿öÅ© ±¸ÇöµéÀÌ ±âº»À¸·Î °¡Áö°í ÀÖÀº ±â´É(Out-of-the-box)¿ÜÀÇ °ÍµéÀ» »ç¿ëÇÏÁö ¸øÇϵµ·Ï ¸·¾ÆÁÝ´Ï´Ù.
- Next ¸¦ ´©¸¨´Ï´Ù. ´ÙÀ½¿¡ ³ª¿À´Â Wizard ÆäÀÌÁö¿¡¼, "Generate an activator..." ÀÇ Ã¼Å©¹Ú½º¸¦ ÇØÁ¦Çϰí, Finish ¸¦ ´©¸¨´Ï´Ù.
ÀÌÁ¦ ¿ì¸° ºó ¹øµé ÇÁ·ÎÁ§Æ®¸¦ Çϳª °¡Áö°Ô µÇ¾úÀ¸¹Ç·Î, Äڵ带 Ãß°¡ÇØ º¾´Ï´Ù. ÀÏÀ» ½±°Ô ÇϱâÀ§ÇØ , ¸ðµç ÀÚ¹Ù ·±Å¸ÀÓ¿¡ µé¾îÀÖ´Â ÀÎÅÍÆäÀ̽ºÀÎ
java.lang.Runnable À» ÀÌ¿ëÇÏ´Â ¼ºñ½º¸¦ ¸¸µé¾î º¾´Ï´Ù. ÀÌŬ¸³½º ´ÜÃà۸¦ ÀÌ¿ëÇØ¼, ¾Æ·¡Äڵ带 ºê¶ó¿ìÀú¿¡¼ Á÷Á¢ º¹»çÇÑÈÄ¿¡
SampleExporter ÇÁ·ÎÁ§Æ®¿¡ ÀÖ´Â src Æú´õ¸¦ ¼±ÅÃÇϰí, Edit->Paste ¸¦ ¼±ÅÃÇØº¸¼¼¿ä. Eclipse °¡ ÆÐŰÁö¿Í ¼Ò½ºÆÄÀÏÀ» ¸¸µé¾î ÁÙ°ÍÀÔ´Ï´Ù.
package org.example.ds;
public class SampleRunnable implements Runnable {
public void run() {
System.out.println("Hello from SampleRunnable");
}
}
Áö±Ý±îÁö´Â Ưº°ÇÑ°Ô ¾ø½À´Ï´Ù¸¸, ÀÌÁ¦ Àç¹ÌÀÖ¾îÁö´Â ºÎºÐÀÌ ³ª¿É´Ï´Ù. ¿ì¸°
SampleRunnable À» ¼ºñ½º·Î ¼±¾ðÇÏ´Â XML ÆÄÀÏÀ» »ý¼ºÇÒ °ÍÀÔ´Ï´Ù. ÇÁ·ÎÁ§Æ® ÃÖ»ó´Ü¿¡
OSGI-INF ¶ó´Â Æú´õ¸¦ ¸¸µé°í ±× ¾È¿¡
samplerunnable.xml ÆÄÀÏ¿¡ ¾Æ·¡ ³»¿ëÀ» º¹»çÇϼ¼¿ä.
"1.0"?>
"samplerunnable">
"org.example.ds.SampleRunnable"/>
"java.lang.Runnable"/>
À̰ÍÀº ¿ì¸®°¡ DS ¿¡¼ º¸°ÔµÉ °£´ÜÇÑ ¼±¾ð Çü½ÄÁß ÇϳªÀÔ´Ï´Ù. ³»¿ëÀÎ Áï½¼,
java.lang.Runnable ÀÇ ÀÎÅÍÆäÀ̽º¸¦ ÀÌ¿ëÇÏ¿© OSGI Service Registry¿¡°Ô ¼ºñ½º¸¦ Á¦°øÇÏ´Â
samplerunnable À̶ó´Â ÄÄÆ÷³ÍÆ®°¡ ÀÖ°í, ÄÄÆ÷³ÍÆ®ÀÇ ±¸Çö Ŭ·¡½º´Â
org.example.ds.SampleRunnable À̶ó´Â °ÍÀÔ´Ï´Ù.
¸¶Áö¸· ´Ü°è´Â Declaratie Services ·±Å¸ÀÓ¿¡°Ô XML ÆÄÀÏÀÇ Á¸À縦 ¾Ë¸®´Â °ÍÀÔ´Ï´Ù. ¿ì¸° À̰ÍÀ» ¹øµéÀÇ MANIFEST.MF ¿¡ Çʵ带 Ãß°¡ÇÔÀ¸·Î½á °¡´ÉÇÕ´Ï´Ù. Manifest¸¦ ¿°í(ÇÁ·ÎÁ§Æ®¿¡¼ ¿ìÃø¹öư Ŭ¸¯ÈÄ PDE Tools -> Open Manifest¸¦ ÀÌ¿ëÇØº¸¼¼¿ä), Á÷Á¢ manifest ÆíÁýÀÌ °¡´ÉÇÑ MANIFEST.MF ÅÇÀ¸·Î °¡¼ ¾Æ·¡ ¶óÀÎÀ» Ãß°¡ÇÕ´Ï´Ù.
Service-Component: OSGI-INF/samplerunnable.xml
±×¸®°í´Â ÆÄÀÏÀ» ÀúÀåÇÕ´Ï´Ù. ÀÌÀüȸ¿¡¼Ã³·³, manifest ÀÇ ¸Ç ¸¶Áö¸· ºóÁÙÀ» ¸Å¿ì Áß¿äÇÕ´Ï´Ù. ÇÏÁö¸¸ ÀÌÀü°ú´Â ´Ù¸£°Ô ¸¸¾à ´ç½ÅÀÌ Àش´ÙÇØµµ Eclipse °¡ ¿¡·¯¸Þ½ÃÁö¸¦ Ãâ·ÂÇÒ °ÍÀÔ´Ï´Ù.
´õ ÁøÇàÇϱâ Àü¿¡, Equinox ¸¦ ½ÇÇàÇØ¼ À̰ÍÀÌ µ¿ÀÛÇÏ´ÂÁö º¾½Ã´Ù. Run ¸Þ´º·Î °¡¼ "Run..." ¸Þ´º¸¦ ¼±ÅÃÇØ¼ ´ÙÀ̾ó·Î±×°¡ ¿¸®¸é "Equinox OSGi Framework" ¸¦ ¿ÞÂÊ Æ®¸®¿¡¼ ¼±ÅÃÇϰí New ¹öưÀ» ´©¸¨´Ï´Ù. ¸¸¾à ¿©·¯ºÐÀÌ Eclipse ¿¡´Â °æÇèÀÌ ÀÖÁö¸¸, OSGi °³¹ßÀº ¾ÈÇØº¸¼Ì´Ù¸é, ÀÌ ·±ÃÄ ´ÙÀ̾ó·Î±×´Â ¾à°£ ÀÌ»óÇØ º¸ÀϰÍÀÔ´Ï´Ù. Bundles ¶ó°í À̸§ºÙ¿©Áø ù¹øÂ° ÅÇÀº Launch ¼³Á¤¿¡¼ ¾î¶² ¹øµéÀÌ ¼±ÅÃµÉ Áö, ÃʱâȽÿ¡ ÀÚµ¿À¸·Î ½ÃÀÛÇÒÁö,¾Æ´ÏÁö¸¦ °áÁ¤ÇÒ¼ö ÀÖ°Ô ÇØÁÝ´Ï´Ù. ÃÖ¼ÒÀÇ ¼¼Æ®¸¦ °¡Áö·Á¸é, Deselect All À» ´©¸£°í, ¾Æ·¡ ¹øµéµé¸¸À» ¼±ÅÃÇÕ´Ï´Ù.
SampleExporter (Workspace Ç׸ñ ÇϺο¡)
org.eclipse.equinox.ds (Target Platform Ç׸ñ ÇϺο¡)
ÀÌ ¹øµéµéÀÌ ¿ì¸®°¡ °ü½ÉÀ» °¡Áö°í Àִ°ÍÀÌÁö¸¸, À̵éÀº ÀÇÁ¸°ü°è¸¦ °¡Áö°í ÀÖÀ¸¹Ç·Î, Add Required Bundles ¸¦ ´·¯¼ ´Ù¸¥ ¹øµéµéÀ» ¼±ÅÃµÇ°Ô ÇÕ´Ï´Ù. "Validate bundles automatically prior to launching"(½ÇÇà½Ã ÀÚµ¿À¸·Î ¹øµé °ËÁõ) À» ¼±ÅÃÇϴ°͵µ ÁÁÀº »ý°¢ÀÔ´Ï´Ù. ¸¶Áö¸·À¸·Î Run À» ¼±ÅÃÇÏ¸é ¹Ù·Î osgi> ÇÁ·ÒÇÁÆ®°¡ Eclipse Äֿܼ¡ Ç¥½ÃµÉ°ÍÀÔ´Ï´Ù. OSGi ÇÁ·¹ÀÓ¿öÅ©°¡ ½ÇÇàÁßÀ̹ǷÎ, ÀÌÀü¿¡ ¹è¿ü´ø Ä¿¸ÇµåµéÀ» »ç¿ëÇØ º¼¼ö ÀÖ½À´Ï´Ù.
¿ì¸® ¼ºñ½º°¡ µî·ÏµÇ¾ú³ª¿ä ? services ¸í·ÉÀ¸·Î È®ÀÎÇØ º¼¼ö ÀÖ½À´Ï´Ù. ¼ºñ½º ¸®½ºÆ®Áß¿¡-¾Æ¸¶µµ ¸¶Áö¸·Âë¿¡-¾Æ·¡¿Í °°Àº°ÍÀ» º¸½Ç¼ö ÀÖ½À´Ï´Ù.
{java.lang.Runnable}={component.name=samplerunnable, component.id=1, service.id=22}
Registered by bundle: initial@reference:file:..../SampleExporter/ [5]
No bundles using service.
³× µî·ÏµÇ¾ú½À´Ï´Ù! ÁÖ¸ñÇÒ°Ç ¼ºñ½º µî·ÏÀÌ
Declarative Services ¹øµé¿¡ ÀÇÇØ¼°¡ ¾Æ´Ï¶ó ¿ì¸® ¹øµé¿¡ ÀÇÇØ ÀÌ·ç¾î Á³´Ù´Â °ÍÀÔ´Ï´Ù. ½ÇÁ¦·Î DS °¡
¿ì¸® ¹øµéÀ» ´ë½ÅÇÏ¿© µî·ÏÇØÁذÍÀÔ´Ï´Ù. µÚ¿¡ ¾î¶»°Ô ±×·¸°Ô ÇÏ´ÂÁö¸¦ »ìÆìº¼ °ÍÀÌÁö¸¸, ÀÌ ·¹½¼ÀÇ ¸ñÀûÀº ¿ì¸® ¼ºñ½ºÀÇ »ç¿ëÀÚ°¡ ¾î¶² Ưº°ÇÑ ÀÏÀ» ÇÒ Çʿ䰡 ¾ø´Ù´Â°ÍÀÔ´Ï´Ù. ½ÇÁ¦·Ð »ç¿ëÀÚ´Â ¿ì¸®°¡ Declarative Services ¸¦ »ç¿ëÇϰí Àִٴ°ÍÀ» ¾Ë Çʿ䵵 ¾ø½À´Ï´Ù. »ç¿ëÀÚ ¶ÇÇÑ ¿øÇÑ´Ù¸é Declarative Services ¸¦ »ç¿ëÇÒ ¼ö ÀÖÁö¸¸, ¶ÇÇÑ ±×³É OSGi Äڵ带 Á÷Á¢ ÀÌ¿ëÇÒ ¼öµµ ÀÖ½À´Ï´Ù.
¶Ç Çϳª ÁÖ¸ñÇÒ°ÍÀº, ¿ì¸®ÀÇ ¹øµé¿¡´Â ¾î¶² OSGi °ü·Ã ÀÚ¹Ù Äڵ嵵 ¾ø´Ù´Â °ÍÀÔ´Ï´Ù. ´Ù¸¥¸»·Î, ¿ì¸®°¡ »ý¼ºÇÑ Å¬·¡½º´Â POJO À̰í, À̰ÍÀÌ Declarative Services ÀÇ ÁÖ¿ä ±â´ÉÀÔ´Ï´Ù.
À̹øÈ¸´Â ¿©±â±îÁöÀÔ´Ï´Ù. À̹ø ·¹½¼ÀÌ ³Ê¹« ±âÃÊÀûÀΰÍÀ̶ó ¹Ì¾ÈÇÕ´Ï´Ù. ´ÙÀ½È¸¿¡¼´Â DS ¸¦ ÀÌ¿ëÇÏ¿© ¾î¶»°Ô ¼ºñ½º¸¦ »ç¿ëÇÏ´ÂÁö ¾Ë¾Æº½À¸·Î½á DS°¡ Á¦°øÇÏ´Â ÆÄ¿ö¿Í Æí¸®ÇÔÀ» ¾Ë¼ö ÀÖÀ»°ÍÀÔ´Ï´Ù.
ÇÏ½Ã¸é ´Ù¾çÇÑ Á¤º¸¸¦ ´õ¿í »¡¸® ¹Þ¾Æº¸½Ç¼ö ÀÖ½À´Ï´Ù.
ÇѱÛÀ̶ó ³Ñ ÁÁ±º¿ä ¤¾¤¾¤¾