IBM Korea Skip to main content
       IBM Ȩ    |  Á¦Ç° & ¼­ºñ½º  |  °í°´Áö¿ø & ´Ù¿î·Îµå  |  È¸¿ø°¡ÀÔ  

º¥´õ·Î ºÎÅÍ µ¶¸³µÈ JMS ¼Ö·ç¼Ç ±¸ÇöÇϱâ
³» Äڵ尡 ¾î¶² JMS ±¸Çö Á¦Ç°°úµµ ÀÛµ¿Çϵµ·Ï ÇÏ´Â ¹æ¹ý

Nicholas Whitehead
ÀÚ¹Ù ¼³°èÀÚ, finetix LLC
2002³â 2¿ù

ÃÖ±Ù ÀÚ¹Ù ¸Þ½ÃÁö ¼­ºñ½º (JMS)ÀÇ ÀαⰡ ±Þ»ó½ÂÇÏ°í Àִµ¥, ¾Æ¸¶µµ ½Ç½Ã°£ ¸Þ½Ã¡ ºÐ¾ßÀÇ ¸î¸î ÁÖ¿ä ¾÷üµéÀÇ Áö¿ø¿¡ ÈûÀÔÀº °ÍÀ¸·Î º¸ÀδÙ. Á¡Á¡ ´õ ¸¹Àº ¼öÀÇ º¥´õµéÀÌ JMS¿¡ ¶Ù¾îµê¿¡ µû¶ó ¿©·¯ºÐÀÇ JMS Äڵ尡 ¿©·¯ °³ÀÇ µ¶ÀÚÀû ±¸Çö Á¦Ç°¿¡¼­ ¼öÁ¤ ¾øÀÌ ÀÛµ¿µÇ¸®¶ó´Â °ÍÀ» È®½ÅÇÒ ¸¸µµ ÇÏ´Ù. ÀÚ¹Ù ¼³°èÀÚÀÎ Nicholas Whitehead´Â ¸î °¡Áö °£´ÜÇÑ ´Ü°è¸¦ ÅëÇØ º¥´õ¿¡ Á߸³ÀûÀÎ JMS ¼Ö·ç¼ÇÀ» ¸¸µé ¼ö ÀÖµµ·Ï JMS¿Í ÀÚ¹Ù Naming and Directory ÀÎÅÍÆäÀ̽º, ±×¸®°í Àß ¸¸µé¾îÁø Ư¼ºÆÄÀÏÀ» °áÇÕ½ÃÅ°´Â ¹æ¹ýÀ» º¸¿©ÁÖ°í ÀÖ´Ù.

ÀÚ¹Ù ¸Þ½Ã¡ ¼­ºñ½º (JMS) »ç¾çÀº ÀÚ¹Ù ±â¹ÝÀÇ ÁöÁ¡°£ (point-to-point, P2P) ¸Þ½Ã¡°ú publish/subscribe (P/S) ¸Þ½Ã¡¿¡ ´ëÇÑ Ç¥ÁØÀ» ¿­°ÅÇÑ´Ù. SunÀº ÇöÀç 12°³ÀÇ ¶óÀ̼±½º ¹ÞÀº JMS ±¸ÇöÀÚ ¸ñ·ÏÀ» °¡Áö°í ÀÖ°í 16°³ÀÇ ¶óÀ̼±½º ¹ÞÁö ¾ÊÀº ±¸ÇöÀÚ¸¦ °¡Áö°í ÀÖ´Ù. ±¸Á¶ÀûÀ¸·Î JMS´Â JDBC API¿Í À¯»çÇѵ¥, µÑ ´Ù ÀûÀº ¼öÀÇ Å¬·¡½º¸¦, ±×·¯³ª ¸¹Àº ÀÎÅÍÆäÀ̽º ÁýÇÕÀ» Á¤ÀÇÇϱ⠶§¹®ÀÌ´Ù. ÀÌ ÀÎÅÍÆäÀ̽ºµéÀº ±¸ÇöµÇ¾îÁ®¾ß ÇÏ°í, ¿©±â¿¡ »óÀÀÇÏ´Â ±¸Çöµéµµ µ¿ÀÏÇÏ°Ô ÇൿÇÒ °ÍÀÌ´Ù.

´ëºÎºÐÀÇ µ¥ÀÌÅͺ£À̽ºÀÇ °æ¿ì ÇൿÀÇ À¯»ç¼ºÀº JDBC ÀÎÅÍÆäÀ̽º ±¸ÇöÀ¸·Î ³¡³­´Ù. SQL Áؼö ¼öÁØ°ú µ¶ÀÚÀûÀÎ ÀýÂ÷Àû SQL È®Àå (OracleÀÇ PL/SQL°ú SybaseÀÇ Transact-SQLµî)ÀÇ Â÷ÀÌ·Î ÀÎÇØ µ¥ÀÌÅͺ£À̽º ¼­ºñ½º¿¡ Á¢±ÙÇؼ­ À̸¦ »ç¿ëÇϱâ À§ÇØ ÀÛ¼ºµÈ Äڵ忡 »ó´çÇÑ Â÷ÀÌ°¡ ÀÖÀ» ¼ö ÀÖ´Ù.

JMS¿¡¼­´Â ±×·¸Áö ¾Ê´Ù. ÃÖ¼ÒÀÇ ³ë·Â°ú ÀÌ ±Û¿¡¼­ ³»°¡ Á¦½ÃÇÑ ÀýÂ÷µéÀ» µû¸§À¸·Î¼­ ¿©·¯ºÐÀº ¿©·¯ºÐÀÇ JMS Ŭ¶óÀ̾ðÆ® Äڵ尡 ¿©·¯ºÐÀÌ »ç¿ëÇÏ°í ÀÖ´Â º¥´õ ±¸ÇöÀ» ¾ËÁö ¸øÇÏ°Ô ¸¸µé ¼ö ÀÖ´Ù. ¿©·¯ºÐÀÌ JMS ¸Þ½ÃÁö 󸮿¡ ´ëÇÑ ±âº»ÀûÀÎ ÀÌÇظ¦ °¡Áö°í ÀÖ´Ù°í °¡Á¤ÇÏÁö¸¸, ±âº» °³³ä°ú ¿ë¾î¸¦ °£´ÜÇÏ°Ô »ìÆ캸¸é¼­ ½ÃÀÛÇغ¸ÀÚ.

JMS ¾ÆÅ°ÅØó
¸Þ½ÃÁö¸¦ º¸³»°í ¹Þ´Â ±âº»Àº ¿¬°áÀε¥,ÀÌ´Â JVM ¿ÜºÎ¿¡ ÀÚ¿øÀ» ÇÒ´çÇϴ åÀÓÀ» °¡Áö°í ÀÖ´Ù. JMS º¥´õ´Â º¸Åë P2P Æ®·£Àè¼ÇÀ» À§ÇØ Àû¾îµµ ÇϳªÀÇ QueueConnection À», P/S Æ®·£Àè¼ÇÀ» À§ÇØ TopicConnection À» ±¸ÇöÇÒ °ÍÀÌ´Ù. À̵é Á¢¼ÓÀº Session À» Á¦°øÇϴµ¥, ÀÌ°ÍÀº ¸Þ½ÃÁöÀÇ Àü¼Û°ú ¼ö½ÅÀ» °ü¸®ÇÏ´Â »ý¼ºÀÚÀÌ´Ù.

P2P Æ®·£Àè¼Ç °ü¸®¸¦ À§ÇÑ ±âº» »ý¼ºÀÚ´Â QueueSender¿Í QueueReceiverÀÌ°í, P/S Æ®·£Àè¼Ç °ü¸®¸¦ À§ÇÑ »ý¼ºÀÚ´Â TopicSubscriber°ú TopicPublisherÀÌ´Ù. Topic °´Ã¼¿Í Queue °´Ã¼´Â °¢ ¸Þ½ÃÁöÀÇ ¼ö½ÅÁö¿Í Ãâó¸¦ ³ªÅ¸³»´Â ƯÁ¤ Á¤º¸¸¦ ĸ½¶È­ÇÑ´Ù. ÀÌ °èÃþÀÌ ±×¸² 1¿¡ ³ª¿Í ÀÖ´Ù.

±×¸² 1. JMS Ŭ·¡½º °èÃþ
JMS class hierarchy diagram

request/response Áö¿ø Ŭ·¡½º µîÀÇ ´Ù¸¥ »ý¼ºÀÚ¿Í ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö¿¡ °íÀ¯ÇÑ ±â´ÉµéÀº JMS Ç¥ÁØ (Âü°í ÀÚ·á )¿¡ ³ª¿ÍÀÖ´Ù.

´Ù¸¥ À¯ÇüÀÇ ¿¬°á ¼³Á¤

¿¬°áÀº JMS ¼­¹ö¿ÍÀÇ »óÈ£ÀÛ¿ëÀ» À§ÇÑ ÁøÀÔÁ¡À̱⠶§¹®¿¡, °¢ ¿¬°á ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ·Á¸é ÀÚüÀûÀÎ JMS ¼­¹öÀÇ ÀνºÅϽº¿¡ ¾î¶»°Ô ¿¬°áÇÏ´ÂÁö¸¦ ¾Ë¾Æ¾ß ÇÑ´Ù. ±â¹ÝÀÌ µÇ´Â ¿¬°á ÇÁ·ÎÅäÄÝÀÇ »ó¼¼»çÇ×Àº °¢ º¥´õ¸¶´Ù ´Ù¸¥ °æ¿ì°¡ ¸¹±â ¶§¹®¿¡, À¯È¿ÇÑ ¿¬°á ¼³Á¤¿¡ ÇÊ¿äÇÑ Á¤º¸µµ °¢ º¥´õ¸¶´Ù ´Ù¸£´Ù.

´ëºÎºÐÀÇ º¥´õ´Â ¿¬°áÀÌ µ¿ÀûÀ¸·Î ¼³Á¤µÉ ¼ö ÀÖµµ·Ï ÇÑ´Ù. Áï ¿¬°á Ŭ·¡½ºÀÇ »ý¼ºÀÚ¸¦ °ø°³ÀûÀ¸·Î Á¤ÀÇÇÏ¿©, ÇÁ·Î±×·¡¸ÓµéÀÌ ÇÊ¿äÇÑ ¿¬°á Á¤º¸¸¦ Á¤ÀÇÇÒ ¼ö ÀÖµµ·Ï ÇÏ°í ÀÖ´Ù. ´ëºÎºÐÀÇ º¥´õ´Â È£Ãâ¿¡ ´ëÀÀÇØ ¿¬°áÀ» ¹ÝȯÇÏ´Â factory Ŭ·¡½º¸¦ Á¦°øÇÑ´Ù.

¿¬°á factoryÀÇ °æ¿ì factory Ŭ·¡½º´Â µ¶ÀÚÀûÀÎ ¿¬°á Á¤º¸¸¦ °¡Áö°í ¹Ì¸® ·ÎµùµÇ¾îÀÖ´Â ¿¬°áÀ» ¹ÝȯÇÒ ¼ö ÀÖ´Ù. º¥´õ°¡ Á¤ÀÇÇÑ factory Ŭ·¡½º´Â ÇÁ·Î±×·¡¸Ó°¡ Á¢¼Ó ¸Å°³º¯¼ö¸¦ ¼³Á¤ÇÒ ¼ö ÀÖµµ·Ï ÇÏ´Â ¸Þ¼ÒµåµéÀ» º¸¿© ÁÙ °ÍÀ̸ç, ÀÌ Á¢¼Ó ¸Å°³º¯¼öµé¿¡´Â factory°¡ ¹ÝȯÇÏ´Â Á¢¼ÓÀÇ Æ¯¼ºÀÌ µé¾î ÀÖ´Ù.

º¥´õ API°¡ ´Ù¸¥ ºÎºÐ

ÀÌ ¸ðµÎ¸¦ Á» ´õ ±¸Ã¼È­Çϱâ À§ÇØ ¸î¸î QueueConnection °ú QueueConnectionFactory ±¸Çö Á¦Ç°ÀÇ »ý¼ºÀÚ, Á¢¼Ó factory ¹× ¼³Á¤ ¸Þ¼ÒµåµéÀ» »ìÆ캸ÀÚ. (ÀϺΠ°æ¿ì¿¡´Â ¿À¹ö·ÎµåµÈ »ý¼ºÀÚ°¡ ¸¹ÀÌ ÀÖÀ½¿¡ À¯ÀÇÇÑ´Ù.; ³ª´Â °¢ °æ¿ì¿¡ ´ëÇØ ÇÑ °³¾¿¸¸ º¸¿©ÁÖ°Ú´Ù.)

IIT SwiftMQ 2.1.3 QueueConnectionFactory »ý¼ºÀÚ ¸Å°³º¯¼ö

  • java.lang.String socketFactory: ¼ÒÄÏ factoryÀÇ Å¬·¡½º ¸í
  • java.lang.String hostname: JMS ¼­¹öÀÇ È£½ºÆ® ¸í
  • int port: JMS ¼­¹öÀÇ Æ÷Æ®
  • long keepalive: È°µ¿ ÁÖ±â

´ÙÀ½ ÄÚµå´Â swiftMQ QueueConnectionFactory °´Ã¼¸¦ »ý¼ºÇÏ´Â ¹æ¹ýÀÌ´Ù. :

 
QueueConnectionFactory qcf = (QueueConnectionFactory) new 
com.swiftmq.jms.ConnectionFactoryImpl
  ("com.swiftmq.net.PlainSocketFactory", "myhost",4001,60000);

Progress SonicMQ 3.5 QueueConnection »ý¼ºÀÚ ¸Å°³º¯¼ö

  • java.lang.String brokerURL: URL (in the form [protocol://]hostname[:port])
  • java.lang.String connectID: Á¢¼ÓÀ» ±¸º°Çϱâ À§ÇÑ ID ¹®ÀÚ¿­
  • java.lang.String username: ±âº» »ç¿ëÀÚ¸í
  • java.lang.String password: ±âº» Æнº¿öµå

´ÙÀ½Àº Progress SonicMQ QueueConnectionFactory °´Ã¼¸¦ »ý¼ºÇÏ´Â »ùÇà ÄÚµåÀÌ´Ù:


progress.message.jclient.QueueConnection queueConnection = new
progress.message.jclient.QueueConnection("tcp://myhost:2506", 
    "ServiceRequest", "username", "password");

MQSeries (MA88)

¿ì¸®°¡ »ìÆ캼 ¸¶Áö¸· ¿¹Á¦´Â IBM MQSeries ±¸ÇöÀÌ´Ù. MQSeries´Â ¿¬°á »ý¼ºÀÚ¸¦ ÀÌ¿ëÇÏÁö ¾Ê´Â´Ù. ´ë½Å ¿©·¯ºÐÀº µ¿ÀûÀ¸·Î ¿¬°áÀ» »ý¼ºÇϱâ À§ÇØ ¿¬°á factory¸¦ ±¸ÃàÇØ¾ß Çϴµ¥, ÀÌ´Â ¿¬°áÀ» Á¦°øÇϱâ À§ÇÑ ¸Þ¼Òµå¸¦ Á¦°øÇÑ´Ù. ¸Å°³º¯¼ö°¡ ¾ø´Â »ý¼ºÀÚ¸¦ ¸¸µé±â À§ÇÑ ÄÚµå´Â ´ÙÀ½°ú °°´Ù.:


MQQueueConnectionFactory = new
MQQueueConnectionFactory();

¿¬°á factoryÀÇ »ý¼ºÀÚ´Â ¸Å°³º¯¼ö°¡ ¾ø±â ¶§¹®¿¡, factory´Â factory°¡ Á¦°øÇÒ ¿¬°áÀÇ Æ¯¼ºµéÀ» Á¦¾îÇϱâ À§ÇØ È£ÃâµÉ ¼ö ÀÖ´Â µ¹¿¬º¯ÀÌ ¸Þ¼Òµå¸¦ °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù.:

  • setTransportType(int x): ´ÙÀ½ ¿É¼Ç Áß Çϳª¿¡ Àü¼Û À¯ÇüÀ» ¼³Á¤ÇÑ´Ù. :
    • JMSC.MQJMS_TP_BINDINGS_MQ: MQSeries ¼­¹ö°¡ Ŭ¶óÀ̾ðÆ®¿Í µ¿ÀÏÇÑ È£½ºÆ®¿¡ ÀÖÀ» ¶§ »ç¿ëµÈ´Ù.
    • JMSC.MQJMS_TP_CLIENT_MQ_TCPIP: MQSeries ¼­¹ö°¡ Ŭ¶óÀ̾ðÆ®¿Í ´Ù¸¥ È£½ºÆ®¿¡ ÀÖÀ» ¶§ »ç¿ëµÈ´Ù.
  • setQueueManager(String x): Å¥ °ü¸®ÀÚÀÇ À̸§À» ¼³Á¤ÇÑ´Ù.
  • setHostName(String hostname): Ŭ¶óÀ̾ðÆ®¸¸ ÇØ´çµÊ, È£½ºÆ®ÀÇ À̸§À» ¼³Á¤ÇÑ´Ù.
  • setPort(int port): Ŭ¶óÀ̾ðÆ® ¿¬°áÀ» À§ÇÑ Æ÷Æ®¸¦ ¼³Á¤ÇÑ´Ù.
  • setChannel(String x): Ŭ¶óÀ̾ðÆ®¿¡¸¸ ÇØ´çµÊ, »ç¿ëÇÒ Ã¤³ÎÀ» ¼³Á¤ÇÑ´Ù.

´ÙÀ½Àº MQSeries QueueConnectionFactory¸¦ »ý¼ºÇÏ°í ƯÁ¤ Å¥ °ü¸®ÀÚ·Î Á¢¼ÓÇÏ°Ô ÇÏ´Â »ùÇà ÄÚµåÀÌ´Ù. :


com.ibm.mq.jms.MQQueueConnectionFactory factory = new 
com.ibm.mq.jms.MQQueueConnectionFactory();
factory.setQueueManager("QMGR");
com.ibm.mq.jms.MQQueueConnection connection = 
  factory.createQueueConnection();

º¥´õ¿¡ µ¶¸³ÀûÀÎ ÄÚµå »ý¼º¿¡¼­ÀÇ JNDIÀÇ ¿ªÇÒ

°£·«ÇÏ°Ô »ìÆ캸¾ÒµíÀÌ, °¢ º¥´õ´Â ÀÚüÀûÀÎ º°°³ÀÇ ¿¬°á ¸Å°³º¯¼ö¸¦ äÅÃÇÏ°í ÀÖ´Ù. ±×·¸´Ù¸é ÀÌµé ¸ðµÎ¸¦ ¿©·¯ºÐ Äڵ忡 ¾î¶»°Ô Åõ¸íÇÏ°Ô Áö¿øÇÒ °ÍÀΰ¡? Ç¥ÁØ ¼Ö·ç¼ÇÀº ³×ÀÌ¹Ö ¼­ºñ½º¸¦ »ç¿ëÇÏ¿© »çÀü ¼³Á¤µÈ ConnectionFactory¸¦ À¯ÁöÇÏ´Â °ÍÀÌ´Ù. ½ÇÇà ½Ã¿¡ ¿©·¯ºÐÀÇ ÄÚµå´Â ConnectionFactory¸¦ °Ë»öÇÏ°í ¿©±â¿¡¼­ ¹ÝȯµÇ´Â ¿¬°áÀ» ¿©·¯ºÐÀÇ JMS ¼­¹ö¿¡ Åõ¸íÇÏ°Ô ¿¬°á½Ãų ¼ö ÀÖÀ» °ÍÀÌ´Ù. °£´ÜÈ÷ ¿©·¯ºÐÀÇ ³×ÀÌ¹Ö ¼­ºñ½º¿¡¼­ Á¤È®ÇÏ°Ô ±¸¼ºµÈ ¿¬°á factoryµé¸¸À» °ü¸®ÇÏ¸é µÇ±â ¶§¹®¿¡ Äڵ带 À¯Áöº¸¼öÇÏ°í À籸ÃàÇÒ ÇÊ¿ä°¡ ¾ø¾îÁø´Ù.

Java Naming and Directory Interface (JNDI)´Â ³×ÀÌ¹Ö ¼­ºñ½º¿Í ÀÎÅÍÆäÀ̽ºÇÏ´Â °¡Àå ÀϹÝÀûÀÎ ¹æ¹ýÀÌ´Ù. JNDI´Â ±¸ÇöµÇ¾î¾ß ÇÏ´Â ÀÎÅÍÆäÀ̽º ¼¼Æ®¸¦ °£´ÜÈ÷ Á¤ÀÇÇÑ´Ù´Â Á¡¿¡¼­ JMS¿Í À¯»çÇÏ´Ù. JNDI¸¦ ±¸ÇöÇÏ´Â ¸ðµç ³×ÀÌ¹Ö ¼­ºñ½º´Â ÇϳªÀÇ Ç¥ÁØ APIÇÏ¿¡ Á¢±ÙµÈ´Ù.

JNDI´Â º¥´õ¿¡ µ¶¸³ÀûÀÎ Äڵ带 ÀÛ¼ºÇÏ·Á´Â ¿ì¸® ³ë·ÂÀÇ Áß½ÉÀÌ´Ù. º¥´õ¿¡ µ¶¸³ÀûÀÎ ¹æ½ÄÀ¸·Î ³×ÀÌ¹Ö ¼­ºñ½º¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» Á¦°øÇϱ⠶§¹®ÀÌ´Ù. JNDI´Â ¿ì¸®°¡ À§ ¼½¼Ç¿¡¼­ ¼³¸íÇÑ µ¶ÀÚÀû ±¸Çö Á¦Ç°¿¡ °üÇØ °ÆÁ¤ÇÏÁö ¾Ê°í ³×ÀÌ¹Ö ¼­ºñ½º¿¡¼­ ¿Ã¹Ù¸¥ °´Ã¼¸¦ °Ë»öÇϱâ À§ÇÑ ÄÚµå ÀÛ¼º¿¡¸¸ ½Å°æÀ» ¾²µµ·Ï ÇØÁØ´Ù.

JMS ¼­¹ö·ÎÀÇ Á¢¼Ó

¿¬°á factory¸¦ »ý¼ºÇÏ°í À̸¦ ¹Ì¸® ±¸¼ºÇÏ¿© ¿©·¯ºÐÀÇ ³×ÀÌ¹Ö ¼­ºñ½º¿¡ °áÇÕ½ÃÅ´À¸·Î½á, ¿©·¯ºÐÀÇ ¸Þ½Ã¡ ¼­ºñ½º¿¡¼­ ƯÁ¤ º¥´õ¿¡ ±¹ÇÑµÈ ¿¬°á ¸Å°³º¯¼ö¸¦ °¨Ãâ ¼ö ÀÖ´Ù. ¿©·¯ºÐÀÇ Äڵ尡 °ü·ÃµÇ¾î ÀÖ´Â ÇÑ ¿©·¯ºÐÀº ÀϹÝÀûÀÎ javax.jms.Connection °´Ã¼¸¦ »ç¿ëÇÏ°í ÀÖ´Ù. º¥´õ ±¸ÇöÀº ÀÎÅÍÆäÀ̽º µÚ¿¡ ¼û°ÜÁø´Ù.

JMS »ç¾çÀº °ü¸®ÀÚ¿¡ ÀÇÇØ »ý¼ºµÇ°í JMS Ŭ¶óÀ̾ðÆ®°¡ »ç¿ëÇÒ ±¸¼º Á¤º¸¸¦ °¡Áö°í ÀÖ´Â °´Ã¼¸¦ JMS °ü¸® °´Ã¼·Î ÁöĪÇÏ°í ÀÖ´Ù. °ü¸® °´Ã¼´Â JNDI¿¡ ÀÇÁ¸ÀûÀÌÁö ¾ÊÁö¸¸, JNDI À̸§°ø°£¿¡¼­ °áÇÕµÇ°í °Ë»öµÉ ¼ö ÀÖÀ½À» ¾Ï½ÃÇÑ´Ù.

Listing 1°ú Listing 2´Â JMS ¼­¹ö (ÀÌ °æ¿ì¿¡´Â SwiftMQ)¿¡ Á¢¼ÓÇϱâ À§ÇÑ µÎ °¡Áö ´Ù¸¥ ¹æ½ÄÀ» º¸¿©ÁØ´Ù. º¥´õ¿¡ ÀÇÁ¸ÇÏ´Â Äڵ带 ÀÌ¿ëÇÏ´Â ¹æ½Ä°ú º¥´õ¿¡ µ¶¸³ÀûÀÎ Äڵ带 ÀÌ¿ëÇÏ´Â ¹æ½ÄÀÌ ±×°ÍÀÌ´Ù.

Listing 1. º¥´õ¿¡ ÀÇÁ¸ÀûÀÎ Á¢¼Ó ¹æ¹ý


1.QueueConnectionFactory queueConnectionFactory = 
(QueueConnectionFactory) new 
com.swiftmq.jms.ConnectionFactoryImpl
  ("com.swiftmq.net.PlainSocketFactory", "localhost",4001,60000);
2.QueueConnection queueConnection = 
queueConnectionFactory.createQueueConnection();

Listing 2. º¥´õ¿¡ Á߸³ÀûÀÎ Á¢¼Ó ¹æ¹ý

1.Properties p = new Properties();
2.p.put(Context.INITIAL_CONTEXT_FACTORY,
    "com.swiftmq.jndi.InitialContextFactoryImpl");
3.p.put(Context.PROVIDER_URL,"smqp://localhost:4001");
4.ctx = new InitialContext(p);
5.qcf = (QueueConnectionFactory)ctx.lookup("MyQCF");
6.oQueueConnection queueConnection = 
queueConnectionFactory.createQueueConnection();

Äڵ带 ³ª´©´Â ¹æ¹ý

¿©·¯ºÐµéÀº ¿ì¼± º¥´õ¿¡ µ¶¸³ÀûÀÎ Äڵ尡 ¸î ÇàÀ» ´õ °¡Áö°í ÀÖ´Ù´Â Á¡À» ¾Ë¾ÆÂ÷¸± °ÍÀÌ´Ù. ÀÌ´Â ¿ì¸®°¡ ³×ÀÌ¹Ö ¼­ºñ½º¿¡ Á¢¼ÓÇØ¾ß Çϱ⠶§¹®ÀÌ´Ù. ±×·¯³ª Àüü ÇÁ·Î±×·¥¿¡¼­ Çѹø¸¸ ³×ÀÌ¹Ö ¼­ºñ½º¿¡ Á¢¼ÓÇÏ¸é µÈ´Ù´Â »ç½ÇÀ» ¿°µÎ¿¡ µÎ¾î¾ß ÇÑ´Ù. µû¶ó¼­ Ãß°¡ÀûÀÎ ¸î ÇàÀº ±× °¡Ä¡°¡ ÀÖ´Ù. (ÇÊ¿äÇÒ ¶§¸¶´Ù ¿ø°Ý context¸¦ ÀνºÅÏƮȭ ÇÏ´Â ´ë½Å ³×ÀÌ¹Ö ¼­ºñ½º¸¦ Àç»ç¿ëÇϵµ·Ï ÇÑ´Ù.)

³×ÀÌ¹Ö ¼­ºñ½º¿ÍÀÇ »óÈ£ÀÛ¿ë°ú Áغñ´Â º¥´õ¿¡ Á߸³ÀûÀÎ ¸Þ½Ã¡ Äڵ带 ÀÛ¼ºÇϴµ¥ Áß¿äÇÏ´Ù. º¥´õ¿¡ ÀÇÁ¸ÀûÀÎ ÄÚµå ¿¹Á¦¿¡¼­ ¿ì¸®´Â ¿¬°áÀ» Á¦°øÇÒ factory¸¦ ÀÛ¼ºÇϱâ À§ÇØ SwiftMQ ±¸ÇöÀÇ QueueConnectionFactory »ý¼ºÀÚ¸¦ »ç¿ëÇÏ¿´´Ù. Listing 1ÀÇ 1Çà¿¡¼­¿Í °°ÀÌ, ÀÌ ±¸ÇöÀ» À§ÇØ ¿ì¸®´Â º¥´õ¿¡ µ¶ÀÚÀûÀΠŬ·¡½º¸¦ Æ÷ÇÔ½ÃÄÑ¾ß ÇÒ »Ó ¾Æ´Ï¶ó QueueConnectionFactory »ý¼ºÀÚ¿¡°Ô ƯÁ¤ º¥´õ¿¡ ±¹ÇÑµÈ ¸Å°³º¯¼öµµ º¸³»¾ß ÇÑ´Ù.

º¥´õ¿¡ Á߸³ÀûÀÎ ¿¹Á¦¿¡¼­, ƯÁ¤ º¥´õ¿¡ ±¹ÇÑµÈ ÄÚµå´Â ¾øÁö¸¸ ¿ì¸®´Â Ãʱâ context factory¿Í ³×ÀÌ¹Ö ¼­ºñ½º¸¦ Á¦°øÇÏ´Â URL »Ó ¾Æ´Ï¶ó QueueConnectionFactoryÀÇ ¹ÙÀεù ¸íµµ ¾Ë¾Æ¾ß ÇÑ´Ù. ¹ÙÀεù ¸íÀÇ °æ¿ì ³×ÀÌ¹Ö ¼­ºñ½º¸¦ ÀûÀýÇÏ°Ô À¯ÁöÇÏ¸é ¾î¶² º¥´õ°¡ Á¦°øÇÏ´Â °´Ã¼¶óµµ ¿©·¯ºÐÀÇ JNDI Æ®¸®¿¡ ¹ÙÀεù½Ãų ¼ö ÀÖÀ» °ÍÀÌ´Ù. µû¶ó¼­ º¥´õ°¡ ¹Ù²î´õ¶óµµ ¹ÙÀεù ¸íÀ» ¹Ù²Ü ÇÊ¿ä°¡ ¾ø´Ù. JNDI contextÀÇ °æ¿ì Ư¼º ÆÄÀÏ¿¡ ¸Å°³º¯¼ö ¹®ÀÚ¿­ (Listing 2ÀÇ 2Çà°ú 3Çà)À» ÀúÀåÇÏ´Â °ÍÀÌ ÀϹÝÀûÀÌ´Ù. ÀÌ·¸°Ô Çϸé JMS º¥´õ°¡ ¹Ù²ð °æ¿ì °£´ÜÈ÷ Ư¼º ÆÄÀÏÀ» ¹Ù²Ù±â¸¸ ÇÏ¸é µÈ´Ù.

ÀÌ ±â¹ýÀº ¿©·¯ºÐ¿¡°Ô ³×ÀÌ¹Ö ¼­ºñ½º¿Í °ü·ÃÇÏ¿© À¯¿¬¼º°ú À̽ļºÀ» Á¦°øÇÑ´Ù´Â Á¡µµ Èï¹Ì·Î¿î ÀÏÀÌ´Ù. ¸¹Àº JMS º¥´õ (Fiorano, SwiftMQµî)µéÀÌ ÀÚüÀûÀÎ JNDI ¼­ºñ½º¸¦ Á¦°øÇÏÁö¸¸, ¿©·¯ºÐÀº ³×ÀÌ¹Ö ¼­ºñ½º¸¦ JMS ¼­ºñ½º¿¡¼­ ºÐ¸®ÇÏ°í ½Í¾îÇÒ ¼öµµ ÀÖ´Ù. (¿¹¸¦ µé¾î, ¿©·¯ºÐÀº ¿©·¯ºÐÀÇ ¿¬°á factory¸¦ Áß¾ÓÀÇ LDAP ¼­¹ö¿¡ ÀúÀåÇÏ·Á ÇÒ ¼ö ÀÖ´Ù.)

´ÙÀ½Àº °¢±â ´Ù¸¥ JNDI ¿¬°áµéÀ» °¡Á®¿Ã Ư¼º ÆÄÀÏ ¿£Æ®¸®ÀÇ ¿¹ÀÌ´Ù.:

SwiftMQ JNDI ¼­ºñ½º

  • java.naming.provider.url=smqp://myhost:4001
  • java.naming.factory.initial=com.swiftmq.jndi.InitialContextFactoryImpl

IBM WebSphere JNDI ¼­ºñ½º

  • java.naming.provider.url=iiop://myhost:9001
  • java.naming.factory.initial= com.ibm.websphere.naming.WsnInitialContextFactory

iPlanet µð·ºÅ丮 ¼­¹ö (LDAP)

  • java.naming.provider.url=ldap://myhost:389
  • java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory

BEA WebLogic JNDI ¼­ºñ½º

  • java.naming.provider.url=t3://myhost:7001
  • java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory

File System JNDI ¼­ºñ½º

  • java.naming.provider.url=file:/tmp/stuff
  • java.naming.factory.initial=com.sun.jndi.fscontext.RefFSContextFactory

¿©·¯ºÐÀÇ ¼Ò½º ÄÚµå´Â º¥´õ Ŭ·¡½º¸¦ Á÷Á¢ ÂüÁ¶ÇÏÁö ¾ÊÀ» ¼ö ÀÖÁö¸¸ º¥´õ Ŭ·¡½º´Â À̸§À¸·Î JVM¿¡ µ¿ÀûÀ¸·Î ·ÎµùµÈ´Ù´Â Á¡¿¡ ÁÖÀÇÇ϶ó. µû¶ó¼­ ½ÇÇà ½Ã¿¡ ¿©·¯ºÐ ÇÁ·Î±×·¥ÀÇ Å¬·¡½º°æ·Î¿¡ À̵éÀÌ ÀÖ¾î¾ß ÇÑ´Ù. JNDI¿Í JMS Ŭ·¡½º¿¡¼­µµ ¸¶Âù°¡ÁöÀÌ´Ù.

Ư¼º ÆÄÀÏ ¼³Á¤Çϱâ

µû¶ó¼­ ¿©±â¿¡¼­ ¿ì¸®´Â JNDI ¼­ºñ½º¿¡ ¿¬°áÇÏ´Â ¹æ¹ý°ú Äڵ带 ÀçÄÄÆÄÀÏÇÏÁö ¾Ê°í »óÀÌÇÑ JNDI¿Í JMS ±¸ÇöÀ¸·ÎºÎÅÍ ¿¬°áÇÏ´Â ¹æ¹ýÀ» ¾Ë¾Æ¾ß ÇÑ´Ù. Ư¼º ÆÄÀÏÀÌ ¾î¶»°Ô ¼³Á¤µÇ´ÂÁö¿Í JNDI ¿¬°á¿¡¼­ Ư¼º ÆÄÀÏÀÌ ¼öÇàÇÏ´Â ¿ªÇÒÀ» »ìÆ캸¸é¼­ Áö±Ý±îÁö ¼³¸íÇÑ Á¤º¸µéÀ» Á¾ÇÕÇØ º¸ÀÚ.

JNDI ¿¬°áÀ» À§ÇÑ ±âº» Ŭ·¡½º´Â javax.naming.InitialContextÀÌ´Ù. InitialDirContext¿Í °°ÀÌ µð·ºÅ丮 ÀÛ¾÷¿¡ ±¹ÇÑµÈ InitialContext ÀÇ ÇÏÀ§ Ŭ·¡½ºµµ ÀÖÁö¸¸, ÀÏ¹Ý Å¬·¡½º°¡ ±× ÀÛ¾÷À» ¼öÇàÇÒ °ÍÀÌ´Ù. InitialContext °¡ ±¸ÃàµÇ¸é ȯ°æ (½Ã½ºÅÛ Æ¯¼ºÀ̳ª ¾ÖÇø´ ¸Å°³º¯¼ö)À¸·ÎºÎÅÍ JNDI ¸Å°³º¯¼ö¸¦ °¡Á®¿À°Å³ª ƯÁ¤ÇÑ jndi.properites ÆÄÀÏÀ» ã´Â´Ù.

ÀÌ ÀÛ¾÷Àº J2SE 1.3.1 javadoc¿¡ ´ÙÀ½°ú °°ÀÌ ¼³¸íµÇ¾î ÀÖ´Ù.:

JNDI´Â ´ÙÀ½ µÎ ¼Ò½ºÀÇ °ªÀ» Â÷·Ê·Î ÇÕÇÏ¿© °¢ Ư¼ºÀÇ °ªÀ» °áÁ¤ÇÑ´Ù.

  1. »ý¼ºÀÚÀÇ È¯°æ º¯¼ö¿¡¼­ óÀ½ ³ªÅ¸³ª´Â Ư¼º°ú (ÀûÇÕÇÑ Æ¯¼º¿¡ ´ëÇÑ) ¾ÖÇø´ ¸Å°³º¯¼ö¿Í ½Ã½ºÅÛ Æ¯¼º

  2. ¾ÖÇø®ÄÉÀÌ¼Ç ÀÚ¿ø ÆÄÀÏ (jndi.properties)

Ãß°¡ÀûÀΠƯ¼ºµé

Áö±Ý±îÁö ¿ì¸®´Â Á¢¼Ó Á¦°øÀÚÀÇ URL¿Í InitialContext factory ¸í(name)À̶ó´Â µÎ°³ÀÇ ¸Å°³º¯¼ö¸¸ »ìÆ캸¾Ò´Ù. ½ÇÁ¦·Î´Â ÈξÀ ´õ ¸¹Àº Ư¼º º¯¼öµéÀÌ Á¦°øµÉ ¼ö ÀÖ´Ù. ¿ì¸®°¡ »ìÆ캻 µÎ °¡Áö¸¦ Á¦¿ÜÇÏ°í °¡Àå ÀϹÝÀûÀÎ °ÍÀº º¸¾È ó¸®µÈ JNDI store¿¡ Á¢±Ù½Ã ¿©·¯ºÐÀÇ ½Å¿øÀ» È®ÀÎÇØÁÖ´Â »ç¿ëÀÚ ¸í°ú Æнº¿öµåÀÌ´Ù. ÀÌ ¸Å°³º¯¼öµéÀº ´ÙÀ½°ú °°´Ù.:

  • java.naming.security.principal (»ç¿ëÀÚ¸í)
  • java.naming.security.credentials (Æнº¿öµå)

ÆÄÀÏ ·ÎµùÇϱâ

³ª´Â ¿©·¯ºÐ ¾ÖÇø®ÄÉÀ̼ÇÀÇ ¸ðµç ·±Å¸ÀÓ ±¸¼º ¸Å°³º¯¼ö¸¦ ÇϳªÀÇ ¾ÖÇø®ÄÉÀÌ¼Ç Æ¯¼º ÆÄÀÏ¿¡ µÎ°í °Å±â¿¡ JNDI ¸Å°³º¯¼ö¸¦ Æ÷ÇÔ½Ãų °ÍÀ» ±ÇÇÑ´Ù. ¸ðµç ¸Å°³º¯¼ö¸¦ ÇÑ °÷¿¡ µÎ¸é ºÒÈ®½Ç¼ºÀÌ ¾ø¾îÁø´Ù. ±×·¯¸é ¿©·¯ºÐÀº ¾ÖÇø®ÄÉÀÌ¼Ç Æ¯¼º ÆÄÀÏÀ» ·ÎµåÇϱâ À§ÇÑ ¸î °¡Áö ¿É¼ÇÀ» °¡Áø´Ù. ¿©±â¼­´Â µÎ °¡Áö ¿¹¸¦ µé°Ú´Ù. ÆÄÀÏÀº ÀÚ¿ø ¹øµé·Î ·ÎµùµÉ ¼öµµ ÀÖ°í, ¶Ç´Â ¸í·ÉÇà ¸Å°³º¯¼ö·Î Ư¼º ÆÄÀÏÀÇ À̸§°ú À§Ä¡¸¦ Àü´ÞÇÒ ¼öµµ ÀÖ´Ù.°¢ ¹æ½ÄÀº °¢±â ´Ù¸¥ ÀåÁ¡À» °¡Áö°í ÀÖ´Ù.

ÆÄÀÏ À§Ä¡¸¦ ¸í·ÉÇà ¸Å°³º¯¼ö·Î Àü´ÞÇÏ´Â °ÍÀÌ ¿©·¯ºÐ Äڵ带 ±¸¼ºÇÏ´Â °¡Àå ½¬¿î ¹æ¹ýÀÌ´Ù. ¸Å°³º¯¼ö´Â °£´ÜÈ÷ ¾ÖÇø®ÄÉÀ̼ÇÀÇ ½Ãµ¿À» ¼öÁ¤ÇÏ¿© º¯°æ½Ãų ¼ö ÀÖ´Ù.

ÀÚ¿ø ¹øµé·Î ÆÄÀÏÀ» ·ÎµùÇÏ¸é µÎ °¡Áö ÀÌÁ¡ÀÌ ÀÖ´Ù.:

  • JVMÀÇ À§Ä¡¿¡ µû¶ó ´Ù¸¥ ÀÚ¿ø ¹øµéÀÌ ·ÎµùµÉ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, application_en_US.properties ÆÄÀÏÀº ´º¿åÀÇ JNDI ¼­ºñ½º¸¦ °¡¸®Å°°í, application_fr.properties ÆÄÀÏÀº Æĸ®ÀÇ JNDI ¼­ºñ½º¸¦ °¡¸®Å²´Ù.
  • ÀÚ¿ø ¹øµé¿¡¼­ Ư¼ºÀ» ·ÎµùÇÏ´Â °ÍÀº ¾ÆÅ°ÅØó¿Í Ç÷§Æû¿¡ µ¶¸³ÀûÀÎ ¹æ¹ýÀÌ´Ù. ÀÚ¿ø ¹øµéÀº Ŭ·¡½º °æ·Î·ÎºÎÅÍ ·ÎµùµÇ±â ¶§¹®¿¡
    ÄÚµå´Â JVMÀÇ ¸í·ÉÇà ¸Å°³º¯¼ö¸¦ ÀÐÀ» ¼ö ÀÖ´ÂÁö¿Í ¹«°üÇÏ´Ù. ¶ÇÇÑ EJB ÄÄÆ÷³ÍÆ®¿Í °°Àº ÀϺΠÄÄÆ÷³ÍÆ®µéÀÌ ÆÄÀÏ ÀÔÃâ·ÂÀ» Á÷Á¢ ÀÌ¿ëÇÏÁö ¾Ê±â ¶§¹®¿¡ ÀÚ¿ø ¹øµéÀº Ư¼º ÆÄÀÏÀÇ ³»¿ëÀ» ·ÎµùÇÏ´Â ´õ¿í Æí¸®ÇÑ ¹æ¹ýÀ» Á¦°øÇÑ´Ù.

»óÃæµÇ´Â ȯ°æ ¼³Á¤¿¡¼­ ¿À´Â È¥¶õÀ» ÇÇÇϱâ À§ÇØ ³ª´Â Ç×»ó ³» Ư¼º ÆÄÀÏ¿¡¼­ ÀÐÀº JNDI °ªÀ¸·Î Ư¼º ÀνºÅϽº¸¦ ¼³Á¤ÇÑ´Ù.

Ư¼º ÆÄÀÏ ÃʱâÈ­ ¹× JNDI °Ë»ö

ÀÌ ¼½¼Ç¿¡ ³ª¿Í ÀÖ´Â ÄÚµå´Â Ư¼º ÆÄÀÏ ÃʱâÈ­ÀÇ µÎ À¯Çü (¸í·ÉÇà ¸Å°³º¯¼ö ¹× ÀÚ¿ø ¹øµé) »Ó ¾Æ´Ï¶ó ÀϹÝÀûÀÎ JNDI °Ë»öµµ º¸¿©ÁØ´Ù. ¿ì¼± Listing 3¿¡ ³ª¿Í ÀÖ´Â application_fr.properties¶ó´Â ±¸¼º ÆÄÀÏ »ùÇÃÀ» »ìÆ캸ÀÚ.:

Listing 3. PropertiesManagement.properties

java.naming.provider.url=smqp://localhost:4001
java.naming.factory.initial=com.swiftmq.jndi.InitialContextFactoryImpl
java.naming.security.principal=admin
java.naming.security.credentials=secret
com.nickman.neutraljms.QueueConnectionFactory=myQueueConnectionFactory
com.nickman.neutraljms.TopicConnectionFactory=myQueueConnectionFactory
com.nickman.neutraljms.Queue=testqueue@router1
com.nickman.neutraljms.Topic=testtopic

ÆÄÀÏÀÇ Ã¹¹ø° ³× ¾ÆÀÌÅÛÀº JNDI ȯ°æ Ư¼ºµéÀÌ´Ù. ¸íÈ®ÇÏ°Ô Çϱâ À§ÇØ ÀÎÁõ Ư¼ºÀ» Ãß°¡ÇÏ¿´´Ù. µÚÀÇ ³× ¾ÆÀÌÅÛÀº JMS °´Ã¼°¡ ¹ÙÀεùµÇ´Â ³×ÀÌ¹Ö ¼­ºñ½ºÀÇ ¸íÀÌ´Ù. ¿ì¸®´Â ÀÌ À̸§µéÀ» ¿¬°á factory, Å¥, topicÀ» °Ë»öÇϴµ¥ »ç¿ëÇÒ °ÍÀÌ´Ù. ¿©·¯ºÐÀÌ LDAPÀ» »ç¿ëÇÏ°í ÀÖ´Ù¸é ¾Æ¸¶µµ À̸§ÀÌ ÀÌó·³ °£´ÜÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. ´ÙÀ½°ú °°Àº À̸§À» º¸°Ô µÉ °ÍÀÌ´Ù.:

  • java.naming.provider.url = ldap://myhost:389/o=nickman.com
  • com.nickman.neutraljms.QueueConnectionFactory = cn=myQueueConnectionFactory,ou=jmsTree

Ư¼º ÆÄÀÏ Á¤ÀÇ

ÀÌÁ¦ Ư¼º ÆÄÀÏÀ» Àбâ À§ÇÑ Äڵ带 »ìÆ캸ÀÚ. ¾Õ¿¡¼­ ¼³¸íÇßµíÀÌ, ¿©·¯ºÐÀº JNDI Á¢¼Ó ¸Å°³º¯¼ö¸¦ °áÁ¤Çϱâ À§ÇÑ µÎ °¡Áö ¿É¼ÇÀ» °¡Áö°í ÀÖ´Ù. Listing 4´Â JNDI Ư¼ºÀ» °Ë»öÇϱâ À§ÇÑ »ùÇà ÄÚµåÀÌ´Ù.:

Listing 4. JNDI Ư¼º Á¶È¸Çϱâ

package com.nickman.jndi;
import javax.naming.*;   // For JNDI Interfaces
import java.util.*;
import java.io.*;
import javax.jms.*;
public class PropertiesManagement {
   Properties jndiProperties = null;
   Context ctx = null;
   public static void main(String[] args) {
     PropertiesManagement pm = new PropertiesManagement(args);
.
.
   public PropertiesManagement(String[] args) {
     jndiProperties = new Properties();
     if(args.length>0) {
       try {
         loadFromFile(args[0]);
.
.
     } else {
       try {
         loadFromResourceBundle();
.
.
   private void loadFromFile(String fileName) throws Exception {
     FileInputStream fis = null;
     try { 
       fis = new FileInputStream(fileName);
       jndiProperties.load(fis);
     } finally {
       try { fis.close(); } catch (Exception erx){}
     }
   }
   private void loadFromResourceBundle() throws Exception {
     String key = null;
     String value = null;
     ResourceBundle rb = 
       ResourceBundle.getBundle("PropertiesManagement");
     Enumeration enum = rb.getKeys();
     while(enum.hasMoreElements()) {
       key = enum.nextElement().toString();
       value = rb.getString(key);
       jndiProperties.put(key, value);
     }
   }

ÀÌ ±Û¿¡¼­ÀÇ ÀÛ¾÷½Ã ÂüÁ¶Çϱâ À§ÇØ Àüü ¼Ò½º ÄÚµå ÆÄÀÏÀ» ´Ù¿î·Îµå ¹ÞÀ» ¼ö ÀÖ´Ù.

Äڵ带 ³ª´©´Â ¹æ¹ý

Listing 4´Â Ư¼º ÆÄÀÏÀ» µÎ °¡Áö ´Ù¸¥ ¹æ½ÄÀ¸·Î ·ÎµùÇϱâ À§ÇÑ Äڵ带 º¸¿©ÁØ´Ù. ¸í·ÉÇà ¸Å°³º¯¼ö°¡ Àü´ÞµÇ¸é ÄÚµå´Â ÀÌ°ÍÀÌ ¿ÏÀüÇÑ Á¶°ÇÀ» °®Ãá Ư¼º ÆÄÀϸíÀ̶ó°í °¡Á¤Çϸç, loadFromFile(String fileName) ¸Þ¼Òµå¸¦ »ç¿ëÇØ Æ¯¼ºÀÌ ·ÎµùµÈ´Ù.

Ŭ·¡½º´Â ´ÙÀ½°ú °°ÀÌ È£ÃâµÈ´Ù. :


java com.nickman.jndi.PropertiesManagement 
c:\config\PropertiesManagement.properties

¸í·ÉÇà ¸Å°³º¯¼ö°¡ Àü´ÞµÇÁö ¾ÊÀ¸¸é ÄÚµå´Â loadFromResourceBundle() ¸Þ¼Òµå¸¦ È£ÃâÇÒ °ÍÀÌ´Ù. ÀÌ ¸Þ¼Òµå´Â CLASSPATH¿¡¼­ Ư¼º ÆÄÀÏÀ» ã´Â´Ù. µû¶ó¼­ Ŭ·¡½º °æ·Î¿¡ ÀÌ ÆÄÀÏÀÇ µð·ºÅ丮¸¦ µÎ¾î¾ß ÇÑ´Ù. ¾ç ¹æ½Ä ¸ðµÎ¿¡¼­ Ư¼ºÀº jndiProperties¶ó´Â Ư¼º º¯¼ö·Î ·ÎµùµÈ´Ù.

I JNDI ¼­ºñ½º¿¡ ¿¬°áÇϱâ

Listing 5´Â JNDI ¼­ºñ½º·ÎÀÇ ¿¬°áÀ» º¸¿©ÁØ´Ù. :

Listing 5. JNDI ¿¬°á

   public void connectToJNDI() throws javax.naming.NamingException {
     
     // jndiProperties was loaded from PropertiesManagement.properties
     ctx = new InitialContext(jndiProperties); 

     System.out.println("Connected to " + 
       ctx.getEnvironment().get(Context.PROVIDER_URL));
   }

À§ÀÇ ¿¬°á ÄÚµå´Â ¾ÆÁÖ Á÷Á¢ÀûÀÌ´Ù. jndiProperties º¯¼ö´Â InitialContext »ý¼ºÀÚ·Î Àü´ÞµÇ°í, °á°ú·Î ³ª¿À´Â Context´Â JNDI ¼­ºñ½º¿¡ ´ëÇÑ ÀÏÁ¾ÀÇ "ÇÚµé"ÀÌ´Ù. javax.naming.Context ÀÎÅÍÆäÀ̽º°¡ »ç¿ë °¡´ÉÇÑ ¸ðµç ȯ°æ Ư¼º º¯¼öµéÀ» ¸ðµÎ Ç¥ÇöÇÏ´Â »ó¼öµéÀÇ ¼ÂÆ®¸¦ ´ã°íÀÖ´Ù´Â µ¥ ÁÖÀÇÇÏ´Â °ÍÀÌ ÁÁ´Ù.

±¸ÃàµÈ Context·Î ¿ì¸®´Â Listing 6¿¡¼­¿Í °°ÀÌ JMS °´Ã¼ °Ë»öÀ» ÁøÇàÇÒ ¼ö ÀÖ´Ù.:

Listing 6. JNDI °Ë»ö


   public QueueConnectionFactory lookupQueueConnectionFactory() 
        throws javax.naming.NamingException {
     return 
     (QueueConnectionFactory)ctx.lookup(jndiProperties.get
         ("com.nickman.neutraljms.QueueConnectionFactory").toString());
   }
   public Queue lookupQueue() throws javax.naming.NamingException {
     return 
     (Queue)ctx.lookup(jndiProperties.get
         ("com.nickman.neutraljms.Queue").toString());
   }

°Ë»öÀº °£´ÜÈ÷ ContextÀÇ lookup(String name) ¸Þ¼Òµå¸¦ È£ÃâÇÏ°í, ¿ì¸®°¡ ¿øÇÏ´Â °´Ã¼°¡ ¹ÙÀεùµÉ À̸§À¸·Î Àü´ÞµÇ´Â °úÁ¤À̶ó°í º¼ ¼ö ÀÖ´Ù. ¹ÝȯµÇ´Â °´Ã¼´Â ¿Ã¹Ù¸¥ Ŭ·¡½º·Î º¸³»Á®¾ß Çϴµ¥, ÀÌ °æ¿ì¿¡´Â Ç¥ÁØ javax.jms ÀÎÅÍÆäÀ̽ºÁß Çϳª°¡ µÉ °ÍÀÌ´Ù.

Destination ÀÎÅÍÆäÀ̽º

javax.jms.Destination Àº ¸Þ½ÃÁö°¡ Àü´ÞµÉ ƯÁ¤ ¸ñÀûÁö¸¦ ĸ½¶È­ÇÏ´Â ÀÎÅÍÆäÀ̽ºÀÌ´Ù. Queue¿Í Topic ÀÎÅÍÆäÀ̽º´Â ¸ðµÎ Destination ÀÎÅÍÆäÀ̽º¸¦ È®ÀåÇÑ´Ù. Destination Àº JMS°¡ °ü¸®ÇÏ´Â °´Ã¼À̱⠶§¹®¿¡, Queues¿Í Topicsµµ ¸¶Âù°¡ÁöÀÌ´Ù.

¿©·¯ºÐÀº JMS API°¡ Topic°ú Queue ¼¼¼Ç Ŭ·¡½º¿¡ µÎ°³ÀÇ ¸Þ¼Òµå¸¦ °¡Áö°í ÀÖÀ½À» ¾Ë°Ô µÉ °ÍÀÌ´Ù.:

  • Topic TopicSession.createTopic(java.lang.String topicName)
  • Queue QueueSession.createQueue(java.lang.String topicName)

µû¶ó¼­ ´ÙÀ½°ú °°Àº Áú¹®À» ´øÁú ¼ö ÀÖ´Ù.: ÇϳªÀÇ ¹®ÀÚ¿­À» »ç¿ëÇØ °£´ÜÈ÷ À̸¦ ÂüÁ¶ÇÒ ¼ö Àִµ¥ ¿Ö JNDI¿¡ queue³ª topicÀ» ÀúÀåÇÏ´Â ¼ö°í¸¦ ÇØ¾ß Çմϱî? ±× ÀÌÀ¯´Â ¾ÆÁÖ ¹Ì¹¦ÇÏ´Ù.: À̸¦ ÀÌÇØÇϱâ À§ÇØ javacdoc¿¡¼­ ´ÙÀ½À» ÀοëÇÏ°Ú´Ù.:

Destination °´Ã¼´Â Á¦°øÀÚ(provider) °íÀ¯ÀÇ ÁÖ¼Ò¸¦ ĸ½¶È­ÇÑ´Ù. JMS API´Â Ç¥ÁØ ÁÖ¼Ò ±¸¹®À» Á¤ÀÇÇÏÁö ¾Ê´Â´Ù. Ç¥ÁØ ÁÖ¼Ò ±¸¹®À» ¿°µÎ¿¡ µÎ´õ¶óµµ, ±âÁ¸ÀÇ ¸Þ½ÃÁö ÁöÇ⠹̵é¿þ¾î (MOM) Á¦Ç°µé°£ÀÇ ÁÖ¼Ò Àǹ̷а£¿¡ Â÷ÀÌ°¡ ³Ê¹« Ä¿¼­ ÇϳªÀÇ ±¸¹®À¸·Î´Â ÇØ°áÇÒ ¼ö ¾ø´Ù´Â °á·ÐÀÌ ³»·ÁÁ³´Ù.

Destination Àº °ü¸®µÇ´Â °´Ã¼À̱⠶§¹®¿¡ ÀÚ½ÅÀÇ ÁÖ¼Ò ¿Ü¿¡ Á¦°øÀÚ °íÀ¯ÀÇ ±¸¼º Á¤º¸¸¦ Æ÷ÇÔÇÏ°í ÀÖÀ» ¼ö ÀÖ´Ù.

°£´ÜÈ÷ ¸»ÇØ, ÀÌ°ÍÀº ¿ì¸®°¡ ƯÁ¤ JMS Á¦°øÀÚ¿¡ °üÇÑ »ó¼¼»çÇ×À» JNDI¿¡¼­ À̸§ °ø°£À» °Ë»öÇϱâ À§ÇØ »ç¿ëµÇ´Â °£´ÜÇÑ À̸§ µÚ¿¡ ¼û±æ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ³ª´Â ¶ÇÇÑ JMS Ŭ¶óÀ̾ðÆ®¿Í ½ÇÁ¦ JMS ¸ñÀûÁö°£¿¡ Áß°£ÃþÀ» µÎ¸é ¾ÆÅ°ÅØÃÄ»ó¿¡ Ãß°¡ÀûÀÎ À¯¿¬¼ºÀÌ ÁÖ¾îÁø´Ù´Â °ÍÀ» ¾Ë¾Ò´Ù. Ŭ¶óÀ̾ðÆ® ÄÚµå´Â myQueue¶ó°í ºÒ¸®´Â JNDI³»ÀÇ À̸§°ø°£À» ÂüÁ¶ÇÒ ¼ö ÀÖÁö¸¸ °ü¸®ÀÚ´Â ¸ðµç º¥´õÀÇ Å¥ ¼ö½ÅÁö°¡ µÉ ¼ö ÀÖ´Â °´Ã¼¸¦ ±× À̸§°ø°£¿¡ ÇÒ´çÇÒ ¼ö ÀÖ´Ù. ÀÌ °³³äÀÌ ±×¸² 2¿¡ ³ª¿Í ÀÖ´Ù.

±×¸² 2. ¼ö½ÅÁö À¯¿¬¼º
Destination Diagram

°ñÄ¡ ¾ÆÇ topics

JMSÀÇ publish-and-subscribe ÇÁ·¹ÀÓ¿öÅ©´Â º¥´õ¿¡ Á߸³ÀûÀÌ µÇ·Á´Â ¿ì¸®ÀÇ ÀÛ¾÷À» ¿Ö°î½ÃÅ°´Â ¸î °¡Áö ±â´ÉÀ» Á¤ÀÇÇÑ´Ù. ¸¹Àº JMS ¼­¹ö°¡ °èÃþÀû À̸§ °ø°£À̶ó´Â °³³äÀ» Áö¿øÇϴµ¥, ÀÌ´Â P/S ¸Þ½ÃÁö°¡ ÇϳªÀÇ °èÃþÀ¸·Î ºÐ·ùµÉ ¼ö ÀÖ°Ô ÇÑ´Ù. ÅäÇÈ ±¸µ¶ Ŭ¶óÀ̾ðÆ®°¡ JMS ¼­¹ö¿¡ Á¢¼ÓÇÏ¸é °èÃþÀÇ Æ¯Á¤ ºÎºÐ¿¡ ÇØ´çÇÏ´Â ¸Þ½ÃÁö¸¦ ¿äûÇÒ ¼ö ÀÖ´Ù. ±×¸² 3¿¡ ¼³¸íµÈ °èÃþÀ» ¿¹·Î »ìÆ캸ÀÚ.:

±×¸² 3. »ùÇà °èÃþ
Sample Hierarchy

À̸¦ Á» ´õ Àß ÀÌÇØÇϱâ À§ÇØ ¿¹Á¦ ½Ã³ª¸®¿À¸¦ »ç¿ëÇغ¸ÀÚ. °¡·É ±¸µ¶ÀÚ Å¬¶óÀ̾ðÆ®°¡ ¼­ºñ½º ³»¿¡ ÀÖ´Â ¸ðµç ¹Ì±¹ ÁÖ°¡ Á¤º¸¸¦ ±¸µ¶ÇÏ°í ½Í¾îÇÑ´Ù°í °¡Á¤Çغ¸ÀÚ. Á¤ÀûÀÎ ±¸µ¶ÀÇ °æ¿ì Ŭ¶óÀ̾ðÆ®´Â ¹Ì±¹ ÁÖ°¡¸¦ ±¸µ¶Çϱâ À§ÇØ »çÀü ±¸¼ºµÈ topicÀ» ³ªÅ¸³»´Â JMS °ü¸® °´Ã¼¸¦ °£´ÜÈ÷ °Ë»öÇϱ⸸ ÇÏ¸é µÈ´Ù. JMS º¥´õµé¸¶´Ù °èÃþÀûÀÎ ±¸µ¶À» Ç¥ÇöÇϱâ À§ÇØ ´Ù¸¥ ±¸¹®À» »ç¿ëÇϱ⠶§¹®ÀÌ ÀÌ°ÍÀÌ ÀÌ»óÀûÀÎ ¹æ¹ýÀÌ µÉ °ÍÀÌ´Ù. ±×¸®°í À̸¦ JNDI°¡ °Ë»öÇÏ´Â °´Ã¼ µÚ·Î ¼û±èÀ¸·Î½á Ŭ¶óÀ̾ðÆ®´Â ±â¹ÝÀÌ µÇ´Â JMS ±¸ÇöÀ» ¾ËÁö ¸øÇÒ °ÍÀÌ´Ù.

±×·¯³ª ¼ö¹é°³ÀÇ ´Ù¸¥ ±¸µ¶ "cell"À» Á¦°øÇϸç 50°³ÀÇ ´Ù¸¥ ´Ü°è¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Â ÇÑ °èÃþÀ» »ý°¢Çغ¸ÀÚ. ¶ÇÇÑ ±× °èÃþÀÌ µ¿ÀûÀÌ¸ç °ü¸®ÀÚ°¡ À̸¦ Áö¼ÓÀûÀ¸·Î ´Ã¸°´Ù°í »ý°¢Çغ¸ÀÚ. ±×·± °æ¿ì JMS °ü¸®ÀÚ°¡ °¡´ÉÇÑ ¸ðµç ±¸µ¶À» Ç¥½ÃÇϴµ¥ ÇÊ¿äÇÑ JMS °ü¸® °´Ã¼¸¦ ¸ðµÎ »ý¼ºÇÏ´Â °ÍÀº ºÒ°¡´ÉÇÒ °ÍÀÌ´Ù. ´õ±¸³ª °èÃþ ¼±ÅÃÀº Ŭ¶óÀ̾ðÆ® ¾ÖÇø®ÄÉÀ̼ÇÀ» Áö¿øÇϵµ·Ï À¯¿¬ÇÏ°í µ¿ÀûÀ̾î¾ß ÇÑ´Ù.

ÀÌ·± »óȲ¿¡¼­´Â topic ¸íÀÌ ½ÇÇà ½Ã¿¡ Á¤Àǵǵµ·Ï ÇÏ´Â °ÍÀÌ ´õ ÀûÇÕÇÒ °ÍÀÌ´Ù. ¹®Á¦´Â °èÃþÀ» Ç¥ÇöÇϱâ À§ÇØ »ç¿ëµÇ´Â ±¸¹®ÀÌ º¥´õ¸¶´Ù Ʋ¸®´Ù´Â Á¡ÀÌ´Ù. ´ÙÀ½ ÄÚµåµéÀº ¼¼ °³ÀÇ ´Ù¸¥ º¥´õ°¡ »ç¿ëÇÏ´Â ±¸µ¶ ±¸¹®µéÀÌ´Ù.

MQSeries JMS


Topic topicEqUs = topicSession.createTopic("topic://Prices/Equity/US");
Topic topicEqAll = topicSession.createTopic("topic://Prices/Equity/*");

SonicMQ 3.5


Topic topicEqUs = topicSession.createTopic("Prices.Equity.US");
Topic topicEqAll = topicSession.createTopic("Prices.Equity.*");

SwiftMQ 2.1.3


Topic topicEqUs = topicSession.createTopic("Prices.Equity.US");
Topic topicEqAll = topicSession.createTopic("Prices.Equity.%");

MQSeries JMS ±¸ÇöÀº ´Ù¸¥ µÎ°³ÀÇ ±¸Çö°ú ´Ù¸¥ topic ±¸ºÐÀÚ¸¦ äÅÃÇß´Ù´Â Á¡¿¡ ÁÖÀÇÇÑ´Ù. (°ÅÀÇ ¸ðµç ´Ù¸¥ º¥´õµéÀº ¸¶Ä§Ç¥¸¦ »ç¿ëÇϴµ¥ MQSeries´Â »ç¼± Ç¥½Ã¸¦ »ç¿ëÇÑ´Ù.)

À§¿¡¼­ ¼³¸íÇÑ ¹®ÀÚµé°ú º°µµ·Î, topic ¸í¿¡ ³ªÅ¸³¯ ¼ö ÀÖ´Â º¥´õ¸¶´Ù °íÀ¯ÇÑ ¹®ÀÚ¿­µéÀÌ ÀÖ´Ù. ¿¹¸¦ µé¾î, SonicMQ´Â »óÀ§ °èÃþÀ» ±¸ºÐÇϱâ À§ÇØ ÆÄ¿îµå ±âÈ£¸¦ »ç¿ëÇÏ°í, MQSeries´Â º¸Åë API¿ëÀ¸·Î ³²°ÜµÐ ¿É¼ÇÀ» Ç¥ÇöÇϱâ À§ÇØ topic¸í¿¡ Á¢¹Ì»ç¸¦ ºÙÀδÙ. °ÅÀÇ ¸ðµç JMS º¥´õµéÀÌ ´Ù¸¥ ¿ÍÀϵåÄ«µå¸¦ äÅÃÇÏ°í Àֱ⠶§¹®¿¡ ½ÇÇà ½Ã¿¡ ÅäÇÈ ¸íÀ» ÀÏ·üÀûÀ¸·Î Á¤ÀÇÇÏ´Â °ÍÀÌ ¾î·Æ´Ù. ´ÙÇàÈ÷µµ ÀÌ ¹®Á¦¿¡ ´ëÇÑ ÇØ°á¹æ¹ýÀÌ ÀÖ´Ù. ¸ðµç Ư¼ö ¹®ÀÚ¸¦ ÇϳªÀÇ ÂüÁ¶ ¼Ò½º¿¡ ÀúÀåÇÏ°í ÀÌ ¼Ò½º¿¡¼­ ¹®ÀÚµéÀ» ·ÎµåÇÏ¿© ½ÇÇà ½Ã¿¡ »ç¿ëÇÏ´Â °ÍÀÌ´Ù.

ÂüÁ¶ ¼Ò½º´Â ¿©·¯ºÐÀÇ ¾ÖÇø®ÄÉÀÌ¼Ç Æ¯¼º ÆÄÀÏÀÌ µÉ ¼öµµ ÀÖ°í JNDI ¼­ºñ½º°¡ µÉ ¼öµµ ÀÖ´Ù. À̸¦ º¸¿©ÁÖ±â À§ÇØ Listing 7°ú °°ÀÌ ¿ì¸®ÀÇ PropertiesManagement.properties ÆÄÀÏ¿¡ topic ¹®ÀÚ¸¦ Ãß°¡ÇÒ °ÍÀÌ´Ù:

Listing 7. topic ¹®ÀÚ°¡ Ãß°¡µÈ PropertiesManagement.properties

#Topic Delimiter For  Sonic and Swift
com.nickman.neutraljms.TopicDelemiter=.
#Topic Delimiter for MQSeries
#com.nickman.neutraljms.TopicDelemiter=/
#Topic Wild Card For Sonic and MQSeries
com.nickman.neutraljms.TopicWildCard=*
#Topic Wild Card For Swift
#com.nickman.neutraljms.TopicWildCard=%
#Topic Prefix For MQSeries
#com.nickman.neutraljms.TopicPrefix=topic://
#Topic Prefix For All Others
com.nickman.neutraljms.TopicPrefix=

ÀÌµé ¿£Æ®¸®°¡ Ãß°¡µÇ¾î ¿ì¸®ÀÇ topic ±¸µ¶ Äڵ尡 ´ÙÀ½°ú °°ÀÌ µÇ¸é ÀÌ ÄÚµå´Â º¥´õ¿¡ µ¶¸³ÀûÀ¸·Î µÉ °ÍÀÌ´Ù:

Listing 8. Topic ±¸µ¶ ÄÚµå


String delim = 
jndiProperties.get("com.nickman.neutraljms.TopicDelemiter").toString();
String wildcard = 
jndiProperties.get("com.nickman.neutraljms.TopicWildCard").toString();
Strung prefix = 
jndiProperties.get("com.nickman.neutraljms.TopicPrefix").toString();
Topic topicEqUs = topicSession.createTopic("Prices" + delim + 
"Equity" + delim + "US");
Topic topicEqAll = topicSession.createTopic("Prices" + delim + 
"Equity" + delim + wildcard);

ÀÏ´Ü ¿©·¯ºÐÀÌ Listing 7¿¡ ³ªÅ¸³­ ¿ÜºÎ ¼³Á¤À» ³¡³»°í ³ª¸é ¿©·¯ºÐÀº ¿©Å¸ÀÇ º¥´õ °íÀ¯ ¿É¼ÇÀ» ó¸®Çϵµ·Ï À̸¦ È®ÀåÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, JMS »ç¾çÀº ÇÑ ¼¼¼ÇÀÌ ±¸ÇöÇÒ ¼ö ÀÖ´Â µÎ °³ÀÇ ¹è´Þ (delivery) ¸ðµå¸¦ Á¤ÀÇÇÏÁö¸¸, Sonic MQ´Â ¼¼ °³ÀÇ ¹è´Þ¸ðµå¸¦ Ãß°¡ÀûÀ¸·Î ´õ Áö¿øÇÑ´Ù. ¹è´Þ ¸ðµå¸¦ ¿ÜºÎ¿¡¼­ Á¤ÀÇÇÔ¿¡ µû¶ó ¿©·¯ºÐÀº Sonic MQÀÇ µ¶ÀÚÀû È®ÀåÀÚ¸¦ ±¸ÇöÇÏ´Â ÇÑÆí ¿©·¯ºÐ ÄÚµåÀÇ º¥´õ Á߸³¼ºÀ» À¯ÁöÇÒ ¼ö ÀÖ´Ù.

°á·Ð

ÀÌ ±Û¿¡¼­ ¼³¸íÇÑ ±â¹ýµéÀº Æ÷°ýÀûÀÎ °ÍÀº ¾Æ´Ï´Ù. ³» ¸ñÇ¥´Â ¿©·¯ºÐÀÌ º¥´õ¿¡ Á߸³ÀûÀÎ JMS ¼Ö·ç¼ÇÀ» ±¸ÇöÇϱâ À§ÇÑ ±æÀ» Ãâ¹ßÇÏ°Ô ÇÏ´Â °ÍÀÌ´Ù. ¶ÇÇÑ ÀÌ ±â¹ýµéÀº ¿©·¯ºÐÀÌ »õ·Î¿î JMS ±¸Çö Á¦Ç°À» µµÀÔÇÒ ¶§ º¯È­ »çÇ×À» ÅëÇÕÇÒ ¼ö ÀÖ´Â ¿ª·®À» Çâ»ó½Ãų °ÍÀÌ´Ù.

¿©±â¿¡ ¼Ò°³µÈ ¸ðµç ±â¹ýÀº JMS°¡ °ü¸®ÇÏ´Â °´Ã¼¸¦ JNDI¿¡ ÀúÀåÇÏ´Â ¹æ¹ý¿¡ Å©°Ô ÀÇÁ¸ÇÑ´Ù. J2EE ¾ÖÇø®ÄÉÀÌ¼Ç ¼­¹ö¿Í JNDI ¼­ºñ½º¸¦ ÅëÇÕÇÏ´Â ¹æ¹ý»Ó ¾Æ´Ï¶ó JMS ¹× JNDI¿Í ÇÔ²² ÀÛ¾÷ÇÏ´Â ¿©·¯ ´Ù¸¥ ¹æ¹ýµéÀº ¾ÕÀ¸·Î ÀÛ¼ºÇÒ ±Û¿¡¼­ ´Ù·çµµ·Ï ÇÏ°Ú´Ù.

Âü°í ÀÚ·á

¸ñ Â÷:
JMS ¾ÆÅ°ÅØó
º¥´õ API°¡ ´Ù¸¥ ºÎºÐr
JNDIÀÇ ¿ªÇÒ
JMS ¼­¹ö¿¡ ¿¬°áÇϱâ
Ư¼º ÆÄÀÏ ¼³Á¤Çϱâ
ÆÄÀÏ ÃʱâÈ­ ¹× °Ë»ö
¼ö½ÅÁö ÀÎÅÍÆäÀ̽º
°ñÄ¡ ¾ÆÇ topics
°á·Ð
Âü°í ÀÚ·á
ÇÊÀÚ ¼Ò°³
±â»ç¿¡ ´ëÇÑ Æò°¡
°ü·Ã dW ¸µÅ©:
Java theory and practice: Â÷¼¼´ë ±â¾÷ ¾ÖÇø®ÄÉÀ̼ǿ¡ JMS¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù¸é?
µ¥ÀÌÅÍ º¹Á¦ ¼Ö·ç¼ÇÀ¸·Î JMS »ç¿ëÇϱâ
Subscribe to the developerWorks newsletter
US ¿ø¹® Àбâ
Also in the Java zone:
Tutorials
Tools and products
Code and components
Articles
ÇÊÀÚ¼Ò°³
Nicholas Whitehead´Â finetix LLCÀÇ ÀÚ¹Ù ¼³°èÀÚÀÌ´Ù. ±×´Â ÇöÀç ´º¿åÀÇ JP Morgan Chase ÇÁ·ÎÁ§Æ®¿¡ Âü¿©ÇÏ°í ÀÖ´Ù.
ÀÌ ±â»ç¿¡ ´ëÇÏ¿© ¾î¶»°Ô »ý°¢ÇϽʴϱî?

Á¤¸» ÁÁ´Ù (5) ÁÁ´Ù (4) ±×Àú±×·¸´Ù (3) ¼öÁ¤º¸¿ÏÀÌ ÇÊ¿äÇÏ´Ù(2) ÇüÆí¾ø´Ù (1)

  È¸»ç¼Ò°³  |  °³ÀÎÁ¤º¸ º¸È£Á¤Ã¥  |  ¹ý·ü  |  ¹®ÀÇ