[Áöµð³ÝÄÚ¸®¾Æ]2004³âÀÌ ¾ÆÁ÷ ¸¹ÀÌ ³²¾Æ ÀÖÁö¸¸ Áö±Ý±îÁö ÀÖ¾ú´ø ¿ÃÇØÀÇ ÀϵéÀ» µÇµ¹¾Æº¸¸é ±×°ÍÀº ¸Å¿ì ´ÞÄÞÇÏ°í °·ÄÇÑ ²ÞÀÇ ¿¬¼Ó°úµµ °°¾Ò´Ù. 2000³âºÎÅÍ ½ÃÀÛÇØ ¿Â ¿ÀǼҽº ÇÁ·ÎÁ§Æ®°¡ °¡½ÃÀûÀÎ °á½ÇÀ» ¸ÎÀº ÇØÀ̱⠶§¹®ÀÌ´Ù.
½Ç¹«¿¡¼µµ ¸¹Àº ÀÏÀÌ ÀÖ¾úÁö¸¸ ¹«¾ùº¸´Ùµµ ±× ¹Ø°Å¸§ÀÌ µÇ¾î ¿Â ÇÊÀÚÀÇ ¿ÀǼҽº ÇÁ·ÎÁ§Æ® °æÇè´ãÀ» µ¶ÀÚ ¿©·¯ºÐ°ú ³ª´©°íÀÚ ÇÑ´Ù(ÆíÁýÀÚ ÁÖ : ÀÌ ±ÛÀÌ ÀÛ¼ºµÈ ½ÃÁ¡Àº Áö³ÇØ 11¿ùÀÌ´Ù).
¿ÀǼҽº ÇÁ·ÎÁ§Æ®¸¦ Çϱâ·Î óÀ½ °á½ÉÇÑ °ÍÀº Áö³ 2000³â Çѱ¹¾îÆÇÀ¸·Î ¹ß¸ÅµÈ¡ºOPEN SOURCES¡»(ÇѺû¹Ìµð¾î)¶ó´Â Ã¥À» ÀÐ°í ³ª¼¿´´Ù. 4³âÀÌ Áö³ Áö±Ý ÀÚ¼¼ÇÑ ³»¿ëÀº ±â¾ïÇÒ ¼ö ¾øÁö¸¸ ±× Ã¥Àº ¹«¾ùº¸´Ùµµ ¿ÀǼҽº ÇÁ·Î±×·¥À» ¸¸µç´Ù´Â °ÍÀÌ ¾ó¸¶³ª Àç¹ÌÀÖ°í ¶Ç ½ÇÁ¦·Îµµ À¯¿ëÇÑÁö¸¦ Èï¹ÌÁøÁøÇÏ°Ô ¼³¸íÇØ ÁÖ¾ú´Ù.
ÀÌ·± ¸Å·ÂÀûÀÎ ¿ÀǼҽº ¸ðµ¨Àº C ¾ð¾î¸¦ °« ¹è¿î ÁßÇб³ ½ÃÀý ÇÑ±Û ÀÔÃâ·Â ¶óÀ̺귯¸® Á¦ÀÛÀ¸·Î ½ÃÀÛµÈ ¶óÀ̺귯¸®¿¡ ´ëÇÑ °ü½É°ú ÀÚ¿¬½º·´°Ô °áÇÕÇß°í ´ç½Ã ¼¹ö ÇÁ·Î±×·¡¹ÖÀ» Çϰí ÀÖ¾ú´ø ÇÊÀÚ´Â ´©±¸³ª ¼¹ö °³¹ß¿¡ À¯¿ëÇÏ°Ô ¾²ÀÏ ¸¸ÇÑ °ø¿ë ŸŶÀ» °³¹ßÇϱâ·Î Çß´Ù.
¶óÀ̺귯¸®(±×°ÍÀÌ ÇÁ·¹ÀÓ¿öÅ©À̵ç ŸŶÀ̵ç)ÀÇ °³¹ßÀº °³¹ßÀÚ¿¡°Ô´Â ¸Å¿ì Áß¿äÇÑ °æÇèÀÌ´Ù. ÀÏ¹Ý »ç¿ëÀÚ¸¦ À§ÇØ À©µµ¿ì¿ë ¾ÖÇø®ÄÉÀ̼ÇÀ» ¸¸µé ¶§ °í·ÁÇØ¾ß ÇÒ °ÍÀÌ À¯Àú ÀÎÅÍÆäÀ̽º¶ó¸é, ¶óÀ̺귯¸® °³¹ß½Ã °í·ÁÇØ¾ß ÇÒ °ÍÀº ¹Ù·Î API´Ù. ¶óÀ̺귯¸®ÀÇ API°¡ ¾ó¸¶³ª °³¹ßÀÚÀÇ ¿ä±¸¿¡ ºÎÇÕÇÏ´À³Ä¿¡ µû¶ó ¶óÀ̺귯¸®ÀÇ À¯¿ë¼ºÀÌ 1Â÷ÀûÀ¸·Î ÆÇ°¡¸§³ª°í, ±× µÚ¿¡ ¶óÀ̺귯¸®ÀÇ Ç³ºÎÇÑ ±â´É°ú ¼º´ÉÀÌ µû¶ó¿Â´Ù.
±×·±µ¥ ÀÌ API¶ó´Â °ÍÀÌ ¶óÀ̺귯¸®¿¡¸¸ ÀÖ´Â °ÍÀÌ ¾Æ´Ï´Ù. ±×°ÍÀº ¹Ù·Î ¿ì¸®°¡ ÀÏ»óÀûÀ¸·Î °³¹ßÇϰí ÀÖ´Â ¸ðµç ºñÁî´Ï½º ·ÎÁ÷¿¡ Àֱ⿡ ÇÊÀÚ´Â ¶óÀ̺귯¸® °³¹ß °æÇèÀ» ¸Å¿ì Áß½ÃÇÑ´Ù.
ÀÌ ¶§ °³¹ßµÈ ¶óÀ̺귯¸®´Â ÀÚ¹Ù¼ºñ½º³Ý(
javaservice.net)¿¡ ¸î Â÷·Ê °ø°³µÇ¾ú°í, ³ªÁß¿¡ ´õ ¸¹Àº ÇÁ·ÎÁ§Æ®¸¦ ÁøÇàÇÏ¸é¼ °³·®µÇ¾î ¼Ò½ºÆ÷Áö(
milkbox.sf.net)³ª °³ÀΠȨÆäÀÌÁö(
gleamynode.net/dev)¿¡ µî·ÏµÇ¾ú´Ù. ±×·¯³ª ÀÚ¹Ù Ä¿¹Â´ÏƼ°¡ ³ª³¯ÀÌ ¼º¼÷ÇØÁöÀÚ ÀÌ·¯ÇÑ ³ë·ÂÀº ASF(Apache Software Foundation,
www.apache.org)°ú °°Àº ¿ª»ç¸¦ °¡Áø ºñ¿µ¸® ±â°ü¿¡¼ºÎÅÍ CodeHaus(
www.codehaus.org), OpenSymphony(
www.opensymphony.com) µî°ú °°Àº »ó´ëÀûÀ¸·Î »õ·Î¿î ±â°ü µî¿¡ ÁýÁߵDZ⠽ÃÀÛÇßÀ¸¸ç, ¼¼È÷ °³ÀÎÀÇ Â÷¿øÀ» ³Ñ¾î¼°Ô µÇ¾ú´Ù.
Çо÷°ú ÇÁ·ÎÁ§Æ®¸¦ º´ÇàÇÏ¸é¼ ´«ÄÚ ¶ã »õ ¾øÀÌ ¹Ù»Û ³ª³¯À» º¸³»´ø Áß ÇÊÀÚ°¡ °³¹ßÇß´ø °ÍµéÀÌ AJC(Apache Jakarta Commons,
jakarta.apache.org/commons)¿Í °°Àº ÇÁ·ÎÁ§Æ®¿¡¼ Ä¿¹Â´ÏƼÀÇ ÈÄ¿ø ¼Ó¿¡ ¹ßÀüÇϰí ÀÖ´Ù´Â °ÍÀ», ±×¸®°í ÇÊÀÚ´Â ±× °÷¿¡ Âü¿©ÇÏÁö ¾Ê°í ÀÖ¾úÀ½¿¡ ¾ÈŸ±î¿î ¸¶À½ÀÌ µé¾ú´Ù.
Èï¹ÌÁøÁøÇÑ ¿ÀǼҽº ÇÁ·ÎÁ§Æ®, Netty 2
ÀÌ¿Í °°¾Ò´ø Netty 1Àº ÀÌ¹Ì 2001³â°æºÎÅÍ ¿©·¯ ÇÁ·ÎÁ§Æ®¿¡¼ »ç¿ëµÇ¾î ¿ÔÀ¸³ª ÇÊÀÚÀÇ È«º¸ ¹× ¹®¼È, ±×¸®°í °æÇè ºÎÁ·À¸·Î Ä¿¹Â´ÏƼÀÇ Áö¿øÀÌ ÀüÇô ¾ø¾ú´Ù. ±×·± ½Ç¼ö¸¦ °Å¿ï»ï¾Æ ´Ù½Ã ½ÃÀÛÇÑ ÇÁ·ÎÁ§Æ®°¡ ¹Ù·Î Netty 2´Ù. Netty 2´Â Netty 1ÀÇ ¸ÞÀÌÀú ¾÷µ¥ÀÌÆ® ¹öÀüÀ¸·Î Netty 1ÀÌ J2SE 1.3 ÀÌÇÏÀÇ BIO(Blocking I/O) API¸¦ »ç¿ëÇß´ø ¹Ý¸é Netty 2´Â J2SE 1.4 ÀÌ»óºÎÅÍ Áö¿øµÇ´Â NBIO(Non-blocking I/O) API¸¦ »ç¿ëÇß´Ù.
´ç½Ã J2SE 1.4°¡ Ȱ¹ßÇÏ°Ô »ç¿ëµÇ±â ½ÃÀÛÇßÁö¸¸ Á¦´ë·Î µÈ NIO ÇÁ·¹ÀÓ¿öÅ©´Â ¾ø¾ú°í °£È¤ ³ª¿Â´Ù ÇØµµ ¾ËÆÄ³ª º£Å¸ ¼öÁØ¿¡¼ ¸Ó¹«¸£°í ÀÖ¾ú´Ù. ÀÌ´Â ¾Æ¸¶µµ ¿À´Ã³¯ ´ëºÎºÐÀÇ °³¹ßÀÌ À¥¿¡ Ä¡ÁߵǾî Àֱ⠶§¹®À̶ó´Â »ý°¢ÀÌ µç´Ù. ±×·¯³ª Ư¼ö ¸ñÀûÀÇ ¼¹ö¸¦ °³¹ßÇϰųª ·¹°Å½Ã ½Ã½ºÅÛ°ú ¿¬µ¿ÇÏ´Â µîÀÇ Àϵ鵵 ÇÁ·ÎÁ§Æ®¿¡¼ ÃæºÐÈ÷ ¸¹Àº ½Ã°£À» ¼Ò¿äÇÑ´Ù. ƯÈ÷ ÇÁ·ÎÅäÄÝÀÇ ±¸ÇöÀÌ ±×·¯Çß´Ù.
 |
| <±×¸² 1> Netty 2ÀÇ µ¿ÀÛ °úÁ¤ |
Netty ½Ã¸®ÁîÀÇ °³¹ß ¸ñÇ¥´Â ¹Ù·Î ÀÌ·¯ÇÑ Àú¼öÁØ I/O È£ÃâÀ» ¼û±â°í, ±×°ÍÀ» À̺¥Æ® ±â¹Ý(Event-Driven) ¹æ½ÄÀ¸·Î ÀüÈ¯ÇØ ÁÖ´Â °ÍÀ̾ú´Ù(<±×¸² 1>).
´ç½Ã ÇÊÀÚ´Â À̵¿Åë½Å 3»ç¿¡ SMS Àü¼ÛÀ» ÇÏ´Â SMS ¼¾Å͸¦ °³¹ßÇϰí ÀÖ¾ú´Âµ¥, À̵é 3»ç´Â Åë½Å »óÀÇ ³í¸®Àû È帧(ÀÌÇÏ ¸Þ½ÃÁö Ç÷οì)À̳ª ¸Þ½ÃÁö (Àü¹®) À¯ÇüÀº ¸ðµÎ µ¿ÀÏÇßÁö¸¸, Àü¹®ÀÇ ÀÎÄÚµùÀº ÀüºÎ Á¦°¢°¢À̾ú´Ù. ¾î¶² ±â¾÷Àº network byte orderÀÇ ¹ÙÀ̳ʸ® µ¥ÀÌÅ͸¦ ¿øÇß°í, ¶Ç ´Ù¸¥ ±â¾÷Àº ASCII ¹®ÀÚ¿À» ¿øÇß´Ù. ASCII ¹®ÀÚ¿ÀÏ °æ¿ì¿¡µµ ³²´Â °ø°£Àº °ø¹éÀ¸·Î ä¿ïÁö, ¾Æ´Ï¸é NULL·Î ä¿ïÁö ¿©ºÎµµ Á¦°¢°¢ÀÎ µî ÇÊÀÚ¸¦ ÇǰïÇÏ°Ô ÇÏ¿´´Ù.
ÇÏÁö¸¸ ¸¸¾à ÇÁ·ÎÅäÄÝ »óÀÇ ¸Þ½ÃÁöµéÀÌ Ãß»óÈµÈ °³Ã¼·Î Ç¥ÇöÀÌ µÇ°í, À̰ÍÀÌ À̺¥Æ®Ã³·³ Àü´ÞµÈ´Ù¸é ¾î¶³±î? »ó±â À¯Áî ÄÉÀ̽ºÀÇ °æ¿ì ¾öû³ À̵æÀÌ ÀÖ´Ù.
ù°, ¸Þ½ÃÁö Ç÷οì´Â °°À¸³ª ¸Þ½ÃÁöÀÇ ÀÎÄÚµùÀÌ ´Ù¸£´Ù¸é ¸Þ½ÃÁö¸¦ ÀÎÄÚµå/µðÄÚµåÇÏ´Â ºÎºÐ°ú ¸Þ½ÃÁö Ç÷ο츦 ´Ù·ç´Â ºÎºÐÀ» µû·Î °³¹ßÇÒ ¼ö ÀÖ´Ù(<±×¸² 1>ÀÇ À¯Àú ÀÎÄÚ´õ/µðÄÚ´õ). ¶ÇÇÑ ¸Þ½ÃÁö Ç÷ο츦 ´Ù·ç´Â ÄÚµå´Â ÇÑ ¹ø¸¸ ±¸ÇöÇϸé À̵¿Åë½Å 3»çÀÇ ÇÁ·ÎÅäÄÝÀ» ¸Å¿ì ½±°Ô ±¸ÇöÇÒ ¼ö ÀÖ´Ù(<±×¸² 1>ÀÇ À¯Àú ÄÚµå). ÀÌ ÀåÁ¡Àº ½Ã°£ÀÌ È帥 ÈÄ À̵¿Åë½Å 3»ç ÀÌ¿ÜÀÇ ´Ù¸¥ SMS Àü¼Û ¼ºñ½º ¾÷ü·ÎÀÇ ¸Þ½ÃÁö Àü´ÞÀ» ±¸ÇöÇÏ´Â µ¥ À§·ÂÀ» ¹ßÈÖÇß´Ù.
µÑ°, À̺¥Æ®´Â ±âº»ÀûÀ¸·Î ºñµ¿±â ¹æ½ÄÀÌ´Ù. ¸Þ½ÃÁö¸¦ ºñµ¿±â·Î ÁÖ°í¹Þµµ·Ï ÇÁ·Î±×·¥ÇÏ´Â °ÍÀº ¼÷·ÃµÈ °³¹ßÀÚÀÇ ±â¼úÀÌ ÇÊ¿äÇÏ´Ù. À̺¥Æ® ±â¹ÝÀ¸·Î ³×Æ®¿öÅ© I/O¸¦ ÀÚµ¿À¸·Î ¼öÇàÇÏ°í ±×°ÍÀ» °³Ã¼·Î Àü´ÞÇÒ ¼ö¸¸ ÀÖ´Ù¸é »ç¿ëÀÚ°¡ º¹ÀâÇÑ ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö Áö½Ä ¾øÀ̵µ ¼÷·ÃÀÚÀÇ °Í¿¡ ¸øÁö¾ÊÀº °á°ú¸¦ ³¾ ¼ö ÀÖ´Ù. ´ÙÀ½Àº Netty 2ÀÇ ¿¹½Ã ÇÁ·Î±×·¥ÀÎ SumUp Ŭ¶óÀ̾ðÆ®/¼¹ö Áß ¼¹öÀÇ ÀϺηΠ»ó±â Ư¡À» Àß Ç¥ÇöÇϰí ÀÖ´Ù.
/*
* @(#) $Id: ServerSessionListener.java 18 2004-08-21 08:27:49Z trustin $
*/
package net.gleamynode.netty2.example.sumup;
import net.gleamynode.netty2.Message;
import net.gleamynode.netty2.Session;
import net.gleamynode.netty2.SessionListener;
import net.gleamynode.netty2.SessionLog;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/***
* {@link SessionListener} for SumUp server.
*
* @author Trustin Lee (http://gleamynode.net/)
* @version $Rev: 18 $, $Date: 2004-08-21 17:27:49 +0900 (Åä, 21 8¿ù 2004) $
*/
public class ServerSessionListener implements SessionListener {
private static final Log log = LogFactory
.getLog(ServerSessionListener.class);
public ServerSessionListener() {
}
public void connectionEstablished(Session session) {
SessionLog.info(log, session, "Connection established.");
// set idle time to 60 seconds
session.getConfig().setIdleTime(60);
// initial sum is zero
session.setAttachment(new Integer(0));
}
public void connectionClosed(Session session) {
SessionLog.info(log, session, "Connection closed.");
}
public void messageReceived(Session session, Message message) {
SessionLog.info(log, session, "RCVD: " + message);
// client only sends AddMessage. otherwise, we will have to identify
// its type using instanceof operator.
AddMessage am = (AddMessage) message;
// add the value to the current sum.
int sum = ((Integer) session.getAttachment()).intValue();
int value = am.getValue();
long expectedSum = (long) sum + value;
if (expectedSum > Integer.MAX_VALUE || expectedSum
< Integer.MIN_VALUE) {
// if the sum overflows or underflows, return error message
ResultMessage rm = new ResultMessage();
rm.setSequence(am.getSequence()); // copy sequence
rm.setOk(false);
session.write(rm);
} else {
// sum up
sum = (int) expectedSum;
session.setAttachment(new Integer(sum));
// return the result message
ResultMessage rm = new ResultMessage();
rm.setSequence(am.getSequence()); // copy sequence
rm.setOk(true);
rm.setValue(sum);
session.write(rm);
}
}
public void messageSent(Session session, Message message) {
SessionLog.info(log, session, "SENT: " + message);
}
public void sessionIdle(Session session) {
SessionLog.warn(log, session, "Disconnecting the idle.");
// disconnect an idle client
session.close();
}
public void exceptionCaught(Session session, Throwable cause) {
SessionLog.error(log, session, "Unexpected exception.", cause);
// close the connection on exceptional situation
session.close();
}
}
ÀÌ ÄÚµå´Â Ŭ¶óÀ̾ðÆ®ÀÇ AddMessage°¡ ´ã°í ÀÖ´Â Á¤¼ö¸¦ ¸ðµÎ ´õÇÑ Áö±Ý±îÁöÀÇ ÇÕÀ» ÀÀ´ä ¸Þ½ÃÁö·Î µÇµ¹¸°´Ù. ¾îµð¿¡µµ SocketChannel.read()³ª write() ¸Þ½îµå°¡ º¸ÀÌÁö ¾Ê´Â´Ù. ±×·¯³ª À̰ÍÀº ¸í¹éÈ÷ ³×Æ®¿öÅ© ¼¹ö´Ù. ¿©·¯ ¼¹ö ¾ÖÇø®ÄÉÀ̼ǿ¡¼ ÀÌ·¯ÇÑ Å×Å©´ÐÀÌ »ç¿ëµÇ°í ÀÖÀ¸³ª, Netty´Â À̰ÍÀ» ÀϹÝÈÇϰí Á¤Á¦ÇÏ¿© ½ÇÁ¦·Î »ç¿ë °¡´ÉÇÑ API¸¦ ¸¸µé¾î³»¾ú´Ù.
±×·¯³ª ÀÌ·¯ÇÑ ÁÁÀº ÇÁ·¹ÀÓ¿öÅ©°¡ ÀÖ´Ù ÇÏ´õ¶óµµ ¸¹Àº »ç¶÷µéÀÌ »ç¿ëÇÏÁö ¾ÊÀ¸¸é ±× À¯¿ë¼ºÀº ¶³¾îÁø´Ù. °ú°ÅÀÇ ¾²¶ó¸° °æÇèÀ» °Å¿ï»ï¾Æ ÇÊÀÚ´Â À̸¦ º»°ÝÀûÀ¸·Î È«º¸Çϱâ·Î Çß´Ù. ±× Àü·«Àº ´ÙÀ½°ú °°´Ù.
¡ß ¸ðµç ÀÛ¾÷À» ¿µ¾î·Î ÁøÇàÇÑ´Ù.
¡ß Netty 2°¡ ³ôÀº ÀÎÁöµµ¸¦ ¾ò±â À§Çؼ´Â Àü ¼¼°èÀûÀÎ Âü¿©°¡ ÇÊ¿äÇÏ´Ù°í ÆÇ´ÜÇ߱⠶§¹®¿¡ ¸ðµç ¹®¼¿Í ÁÖ¼®À» ¿µ¾î·Î ÀÛ¼ºÇÏ¿´´Ù.
¡ß ¸ÚÁø ·è¾ØÇÊÀÇ À¥ »çÀÌÆ®¸¦ ¸¸µé°í Æ÷·³À» ¿¬´Ù.
¡ß À¥ »çÀÌÆ®´Â Maven(
maven.apache.org)À̶ó´Â Áö´ÉÇü ÇÁ·ÎÁ§Æ® ºôµå ½Ã½ºÅÛÀÇ µîÀåÀ¸·Î °¡´ÉÇØÁ³´Ù. ´ç½Ã ¿À¶óÀϸ®
OnJava.comÀÇ Maven¿¡ °üÇÑ Æ©Å丮¾óÀ» ÀÐÀº °ÍÀÌ °è±â°¡ µÇ¾î »ç¿ëÇÏ°Ô µÇ¾ú´Âµ¥, °á°ú´Â ´ë ¸¸Á·À̾ú´Ù. ÇÊÀÚ´Â °ÅÀÇ ¸ðµç ÇÁ·ÎÁ§Æ®¸¦ MavenÀ¸·Î ºôµåÇϰí ÀÖ´Ù.
¡ß Æ÷·³Àº ¿Ü±¹ÀεéÀÌ ¼±È£ÇÏ´Â phpBB(
www.phpbb.com)¸¦ »ç¿ëÇß´Ù.
¡ß ¹ö±× Æ®·¢Ä¿´Â Mantis(
mantisbt.sf.net)À» »ç¿ëÇÏ°í ½Í¾úÀ¸³ª °ÔÀ¸¸§À¸·Î Àû¿ëÇÏÁö ¸øÇßÁö¸¸ Æ÷·³¿¡ ¹ö±× ¸®Æ÷ÆÃ °Ô½ÃÆÇÀÌ µû·Î ÀÖ¾î º°´Ù¸¥ ¾î·Á¿òÀÌ ¾ø¾ú´Ù.
¡ß À¯¸í »çÀÌÆ®¿¡ ¸±¸®Áî ¼Ò½ÄÀ» ¾Ë¸®°í »ç¶÷µéÀÇ °ü½É°ú ´ä±Û¿¡ Ä£ÀýÈ÷ ´ë´äÇÑ´Ù.
ÀÌ¿Í °°Àº ¸ñÇ¥¸¦ °®°í Netty 2¸¦ °³¹ßÇÑ Áö ¼ö °³¿ùÀÌ Áö³ª ¾î´À Á¤µµ ¾ÈÁ¤ÀûÀÎ ¹öÀüÀÌ °³¹ßµÇ¾ú´Ù. 2004³â 6¿ù 7ÀÏ, ÇÊÀÚ´Â ¿ë±â¸¦ ³»¾î
TheServerSide.com¿¡ Netty2 ¹öÀü 1.0.0ÀÇ ¸±¸®Á ¾Ë·È´Ù. ±×·¯³ª ±× °á°ú´Â ½â ÁÁÁö ¸øÇß´Ù. ±×µéÀº ³Ê¹«³ª Á¤Á÷Çß´Ù.
"The usefulness of Netty is zero when the documentation is so poor." - Han Theman
ÇÊÀÚ´Â Netty°¡ »çÀåµÇÁö´Â ¾ÊÀ»±î °ÆÁ¤ÀÌ µÇ¾ú°í, 3ÀÏ¿¡ °ÉÄ£ ÀÛ¾÷ ³¡¿¡ JavaDocÀ» »ó¼¼È÷ º¸°ÇÏ°í ¿¹Á¦ ÄÚµå¿Í ÀüüÀûÀÎ UMLÀÌ Æ÷ÇÔµÈ Æ©Å丮¾óÀ» Ãß°¡ÇØ ¹öÀü 1.1.0À» ¸±¸®ÁîÇß´Ù.
TheServerSide.com¿¡¼´Â ¸±¸®Áî ¾Ë¸²À» ÇÑ ´Þ¿¡ 1ȸ·Î Á¦ÇÑÇϰí ÀÖ¾ú±â ¶§¹®¿¡ ÇÊÀÚ´Â Freshmeat.net(
www.freshmeat.net)À» ÀÌ¿ëÇϱâ·Î Çß°í, À̰ÍÀº ¸Å¿ì È¿°ú°¡ ÁÁ¾Ò´Ù. Áö±ÝÀº 50¿©¸í¿¡ À̸£´Â °³¹ßÀÚµéÀÌ NettyÀÇ »õ ¹öÀüÀÌ ¸±¸®ÁîµÉ ¶§¸¶´Ù FreshmeatÀÌ ÀÚµ¿À¸·Î ¹ß¼ÛÇÏ´Â ¸ÞÀÏÀ» ¼ö½ÅÇϰí ÀÖ´Ù.
Áö¼ÓÀûÀÎ ±â´É °³¼±°ú ¸±¸®Áî°¡ °è¼ÓµÇ¸é¼ Æ÷·³¿¡ Çϳª µÑ Áú¹®ÀÌ ¿Ã¶ó¿À±â ½ÃÀÛÇß´Ù. óÀ½¿¡´Â ¡°Netty¿Í JMS¿ÍÀÇ °ü°è°¡ ¾î¶»°Ô µË´Ï±î?¡±, ¡°ÄÄÆÄÀÏÀÌ ¾ÈµË´Ï´Ù¡±, ¡°¾î¶»°Ô ½ÇÇàÇÏÁÒ?¡± µîÀÇ Áú¹®À̾úÁö¸¸ ±×°Íµµ Àá½Ã¿´´Ù. ±×¸®°í ¾ó¸¶ Áö³ªÁö ¾Ê¾Æ ÇÊÀÚ´Â Ä¿¹Â´ÏƼ°¡ °¡Áø ÈûÀ» ½Ç°¨Çß°í ±× À§·Â¿¡ °¨ÅºÇÒ »ÓÀ̾ú´Ù.
ù°, ¹ö±×¸¦ ÀâÀ¸·Á ¾Ö¾²Áö ¾Ê¾Æµµ ¹ö±× ¸®Æ÷Æ®°¡ µé¾î¿Â´Ù. À̰ÍÀº Netty¸¦ Á¤¸»·Î ¾ÈÁ¤ÀûÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ°Ô ¹Ù²Ù¾î ³õ¾Ò´Ù. 1.0ÀÌ ¸±¸®Áî µÇ¾úÁö¸¸ Á¤¸» ¸¹Àº ¹ö±×¸¦ ³»Æ÷Çϰí ÀÖ¾úÀ½ÀÌ »ç¿ëÀڵ鿡 ÀÇÇØ ¹ß°ßµÇ¾ú´Ù. ¾î¶² »ç¿ëÀÚ´Â ½ÉÁö¾î NettyÀÇ ¼Ò½ºÄڵ带 µð¹ö±×ÇÏ¿© ¾î¶² ºÎºÐÀÌ À߸øµÇ¾ú´ÂÁö¸¦ ÁöÀûÇØ Áְųª, JDK 1.4 Ãʱ⠹öÀüÀÇ ¹ö±×¸¦ µ¹¾Æ°¡´Â ¹æ¹ý(workaround)±îÁö Á¦½ÃÇß´Ù.
µÑ°, »ç¿ëÀÚÀÇ ¿ä±¸(Feature Request)·Î Netty°¡ ¾î¶² ±â´ÉÀÌ ºÎÁ·ÇÑÁö ¾Ë°Ô µÇ¾ú´Ù. ¿¹¸¦ µé¸é ´ÙÀ½°ú °°´Ù.
¡ß UDPÀÇ Áö¿ø
¡ß ¼Óµµ°¡ ´À¸° Ŭ¶óÀ̾ðÆ®ÀÇ Å½Áö
¡ß APIÀÇ °áÇÔÀ̳ª ´©¶ôµÈ ¸Þ½îµå
¡ß »ç¿ëÀÚ°¡ ¹ö±×¸¦ ¸¸µé ¼ö ÀÖ´Â ¹®¼ÀÇ ¹ÌºñÇÑ ºÎºÐ(FAQ ÀÛ¼º)
ÇÊÀÚ°¡ º¸Áö ¸øÇß´ø °ÍµéÀ» ÇÊÀÚ´Â Ä¿¹Â´ÏƼÀÇ ´«À» ÅëÇØ º¸¾Ò°í, ÀÌ´Â Netty¸¦ Áö¼ÓÀûÀ¸·Î °³¼±½ÃŰ´Â ÈûÀÌ µÇ¾ú´Ù. ±×¸®°í ¹«¾ùº¸´Ùµµ ±× °úÁ¤Àº ³Ê¹«³ª Èï¹ÌÁøÁøÇÏ¿© ¸ÅÀϰ°ÀÌ Netty »ý°¢¸¸ ÇÏ°Ô ¸¸µé¾î¹ö¸± Á¤µµ¿´´Ù. ±×·¸´Ù. ¿ÀǼҽº´Â Áñ°Ì´Ù ¸øÇØ ÇູÇÏ´Ù!
ºñÁî´Ï½º ·ÎÁ÷ 󸮸¦ À§ÇÑ OIL
³×Æ®¿öÅ© Ŭ¶óÀ̾ðÆ®/¼¹öÀÇ °³¹ßÀº ÀÌÁ¦ NettyÀÇ »ç¿ëÀ¸·Î ¼Õ½¬¿öÁ³´Ù. ÇÊÀÚÀÇ ÇÑ ÇØ´Â ÀÌ·¸°Ô Netty¿Í ÇÔ²² ÇູÇÏ°Ô ³¡³¯ °Í °°¾ÒÁö¸¸ ºñÁî´Ï½º ·ÎÁ÷À» ó¸®ÇÏ´Â ¼¹ö´Â ¶Ç ´Ù¸¥ ¹«¾ð°¡¸¦ ÇÊ¿ä·Î Çß´Ù. ¹Ù·Î 'ÀÛ¾÷ Å¥'´Ù. ¸¹Àº ¼¹öµéÀÌ À̸¦ ´Ü¼øÇÑ ¼øÈ¯ Å¥(circular queue)³ª ÆÄÀÏ ±â¹Ý Å¥, ¶Ç´Â °ü°èÇü µ¥ÀÌÅͺ£À̽º¿¡ ÀúÀåÇÑ´Ù. ÇÏÁö¸¸ À̵éÀº ¸ðµÎ ´ÙÀ½°ú °°Àº ¹®Á¦¸¦ °®°í ÀÖ´Ù.
¡ß ¼øÈ¯ Å¥´Â ¸Þ¸ð¸® »ó¿¡¼¸¸ À¯ÁöµÇ¹Ç·Î ¼¹ö¸¦ Á¾·áÇÑ µÚ¿¡ À̸¦ º¹±¸ÇÒ ¼ö ¾ø´Ù. ¶ÇÇÑ Å¥ÀÇ ³»¿ëÀ» ƯÁ¤ Ű °ªÀ¸·Î °Ë»öÇÒ ¼ö ¾ø´Ù(¼±Çü ½Ã°£ÀÌ´Ù).
¡ß ÆÄÀÏ ±â¹Ý Å¥´Â ÀûÀýÇÑ Ä³½ÌÀ» ÇÏÁö ¾ÊÀ» °æ¿ì ¼º´É¿¡ ¹®Á¦°¡ ÀÖ´Ù. ¸¶Âù°¡Áö·Î Å¥ÀÇ ³»¿ëÀ» ƯÁ¤ Ű °ªÀ¸·Î °Ë»öÇÒ ¼ö ¾ø´Ù.
¡ß °ü°èÇü µ¥ÀÌÅͺ£À̽º´Â ¸ðµç ¿ä±¸¸¦ ÃæÁ·ÇÏÁö¸¸ ÀÀ´ä ¼Óµµ°¡ ´Ê´Ù.
¼¼ °¡Áö ¼Ö·ç¼ÇÀ» ÇÏÀ̺긮µåÇÏ°Ô »ç¿ëÇÏ¿© È¿°ú¸¦ º¼ ¼öµµ ÀÖ°ÚÁö¸¸ ÀÌ ¸ðµç ¿ä±¸¸¦ ÃæÁ·ÇÏ´Â ¶óÀ̺귯¸®°¡ ÀÖ´Ù¸é ±Ý»ó÷ÈÀ̱⿡ ÇÊÀÚ´Â À̸¦ ¸¸µé°í ¿ÀǼҽº·Î °ø°³Çϱâ·Î ¸¶À½¸Ô¾ú´Ù.
OIL(Objects in a Line)Àº ¿À´Ã³¯ ´ëºÎºÐÀÇ MOM(Message-Oriented Middleware)°¡ äÅÃÇϰí ÀÖ´Â WAL(Write-Ahead Logging) Å×Å©´ÐÀ» ÀÌ¿ëÇÑ Å¥ ¶óÀ̺귯¸®´Ù. WALÀ̶õ µ¥ÀÌÅÍ ±¸Á¶¸¦ ÆÄÀÏ¿¡ ÀúÀåÇÏ´Â ´ë½Å ¸Þ¸ð¸®¿¡ ÀÖ´Â µ¥ÀÌÅÍ¿¡ ´ëÇÑ Á¶ÀÛ µ¿ÀÛÀ» ·Î±×ÈÇÏ¿© ¼øÂ÷ÀûÀ¸·Î ±â·ÏÇÏ´Â ±â¹ýÀ» ¸»ÇÑ´Ù. WALÀ» ÀÌ¿ëÇÑ Å¥´Â ´ÙÀ½°ú °°Àº ÀåÁ¡ÀÌ ÀÖ´Ù.
¡ß µð½ºÅ©ÀÇ ÇÑ ÁöÁ¡¿¡¸¸ ·Î±×¸¦ ¾²°í ÆÄÀÏ ±¸Á¶¸¦ À¯ÁöÇÒ Çʿ䰡 ¾øÀ¸¹Ç·Î µ¥ÀÌÅÍ Á¶ÀÛ ¼º´ÉÀÌ ¿ì¼öÇÏ´Ù.
¡ß ¸ðµç µ¥ÀÌÅͰ¡ ¸Þ¸ð¸®¿¡ ÀûÀçµÇ¹Ç·Î µ¥ÀÌÅÍ Á¶È¸ ¼º´ÉÀÌ ¸Å¿ì ¿ì¼öÇÏ´Ù.
±×·¯³ª ´ÙÀ½°ú °°Àº ´ÜÁ¡µµ ÀÖÀ¸³ª ÇØ°á °¡´ÉÇÏ´Ù.
¡ß ¸ðµç µ¥ÀÌÅͰ¡ ¸Þ¸ð¸®¿¡ ÀûÀçµÇ¹Ç·Î ´ë·®ÀÇ ¸Þ¸ð¸®°¡ ÇÊ¿äÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª ¿À´Ã³¯ÀÇ ¸Þ¸ð¸®´Â Àú·ÅÇϹǷΠµ¥ÀÌÅÍÀÇ ¾çÀÌ ¸Å¿ì ¸¹Áö ¾ÊÀº ÀÌ»ó ¾ÈÀüÇÏ´Ù.
¡ß ·Î±× ÆÄÀÏÀÌ ¸Å¿ì Ä¿Áú ¼ö ÀÖ´Ù. ±×·¯³ª »õº®°ú °°ÀÌ ¼ºñ½º°¡ ÇѰ¡ÇÑ ½Ã°£´ë¿¡ ·Î±×¸¦ ÀÚµ¿ ÃÖÀûÈ (defragment)ÇÒ ¼ö ÀÖ´Ù.
Àε¦½Ì °¡´ÉÇÑ Å¥ÀÇ ±¸Çö
Å¥¿¡ µé¾îÀÖ´Â µ¥ÀÌÅ͸¦ ƯÁ¤ Ű °ªÀ¸·Î °Ë»öÇÏ´Â ±â´ÉÀº ´©±¸³ª ÇÑ ¹øÂë ÇÊ¿ä·Î ÇÏÁö¸¸ ±¸ÇöÇϱⰡ ½±Áö ¾ÊÀº ±â´ÉÀÌ´Ù. ¿¹¸¦ µé¾î Ŭ¶óÀ̾ðÆ®ÀÇ ¿äûÀÌ ÀÛ¾÷ Å¥¿¡ µé¾î¿Í ÀÖµÇ ¾ÆÁ÷ 󸮵ÇÁö ¾Ê¾ÒÀ» °æ¿ì Ŭ¶óÀÌ¾ðÆ®´Â ÇØ´ç ¿äûÀÇ Ã³¸® ÇöȲÀ» ÆÄ¾ÇÇϰí 󸮰¡ Áö³ªÄ¡°Ô ´Ê¾îÁø ¿äû¸¸ ¼±ÅÃÀûÀ¸·Î Ãë¼ÒÇÒ ¼ö ÀÖ´Ù. ÀÌ °úÁ¤¿¡¼ Å¥ÀÇ ³»¿ëÀ» °Ë»öÇÏ´Â °ÍÀº ÇʼöÀûÀÌ´Ù.
°Ë»öÀ» ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀº µ¥ÀÌÅÍÀÇ À§Ä¡¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖÀ½À» ÀǹÌÇÑ´Ù. ±×·¯³ª ÀϹÝÀûÀÎ ¼øÈ¯ Å¥ ±¸ÇöÀº µ¥ÀÌÅÍÀÇ À§Ä¡ °ªÀÌ Å¥ È®Àå½Ã¸¶´Ù ÀçÁöÁ¤µÇ¹Ç·Î °Ë»öÀÌ ºÒ°¡´ÉÇÏ´Ù. À̸¦ ÇØ°áÇϱâ À§ÇØ <±×¸² 2>ÀÇ ±¸Á¶¸¦ ÅÃÇß´Ù.
 |
| <±×¸² 2> OILÀÇ Å¥ ±¸Á¶ |
<±×¸² 2>¿¡¼¿Í °°ÀÌ Å¥´Â ¿©·¯ °³ÀÇ extent·Î ±¸¼ºµÇ¾î Àִµ¥, °¢ extentÀÇ ³»ºÎ´Â <±×¸² 3>°ú °°´Ù.
 |
| <±×¸² 3> OIL Å¥ ExtentÀÇ ³»ºÎ |
ÀÌ ±¸Á¶·Î ¾î¶»°Ô µ¥ÀÌÅÍÀÇ À§Ä¡¸¦ º¯ÇÏÁö ¾Ê°Ô ÇÒ ¼ö ÀÖÀ»±î? ±× ºñ¹ÐÀº extentÀÇ ID¿Í extent ³»¿¡ À§Ä¡ÇÑ °³Ã¼µéÀÇ ¿ÀÇÁ¼ÂÀÌ º¯ÇÏÁö ¾Ê´Â´Ù´Â µ¥ ÀÖ´Ù. Áï, Å¥°¡ Æ÷ÇÔÇϰí ÀÖ´Â µ¥ÀÌÅÍ Ç׸ñÀÇ À§Ä¡´Â extentÀÇ ID¿Í extent ³»ÀÇ ¿ÀÇÁ¼Â °ªÀ¸·Î ÁöÁ¤ÀÌ °¡´ÉÇÏ´Ù.
ÀÌ¹Ì ¾Ë¾ÆÃ«°ÚÁö¸¸, ÀÌ ¹æ¹ýÀº extent Çϳª°¡ ´ãÀ» °³Ã¼ÀÇ ÃÖ´ë Å©±â¸¦ Á¤ÇØ¾ß ÇÑ´Ù´Â ¹®Á¦°¡ ÀÖ´Ù. Áï extentÀÇ Å©±â°¡ 65536Àε¥ °³Ã¼°¡ ÀüºÎ »èÁ¦µÇ°í ÇÑ °³¸¸ ³²¾Æµµ extentÀÇ Å©±â´Â ¿©ÀüÈ÷ 65536À̱⿡ ÀÌ·¸°Ô µ¥ÀÌÅͰ¡ »ê¹ßÀûÀ¸·Î À§Ä¡ÇÒ °æ¿ì ¸Þ¸ð¸®¿¡ ºÎ´ãÀ» °¡Á®¿Ã ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù.
ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇØ extentÀÇ Å©±â¸¦ ÁÙÀδٸé extentÀÇ ¼ö°¡ ¸¹¾ÆÁö°í, À̸¦ °ü¸®ÇÏ´Â µ¥ µå´Â ºñ¿ëÀÌ Áõ°¡ÇÏ°Ô µÈ´Ù. ±×·¯³ª ÀϹÝÀûÀÎ ¼¹ö¿¡¼ ÀÛ¾÷Àº ´ëüÀûÀ¸·Î ¼øÂ÷·Î ÀÌ·ç¾îÁö±â ¶§¹®¿¡ ÀÌ ¹®Á¦´Â ƯÁ¤ °æ¿ì¿¡¸¸ ¿µÇâÀÌ ÀÖ´Ù°í ÇÒ ¼ö ÀÖ°Ú´Ù.
¼º´É Çâ»óÀ» À§ÇÑ ¸öºÎ¸²
¾Æ¹«¸® WALÀ» ÀÌ¿ëÇØ ºü¸¥ ¼º´ÉÀ» º¸ÀåÇÑ´Ù°í ÇØµµ ¼º´ÉÀ» À§ÇÑ ¸öºÎ¸²Àº °è¼ÓµÇ¾ú´Ù. Å¥¸¦ ¿©·¯ °³ »ç¿ëÇÏ´Â ¾ÖÇø®ÄÉÀ̼ÇÀÇ °æ¿ì Å¥¿Í Å¥ »çÀÌÀÇ µ¥ÀÌÅ͸¦ À̵¿ÇÏ´Â ÀÏÀÌ ºó¹øÇÏ´Ù. ¸Þ¸ð¸® »ó¿¡¼ÀÇ ÀÛ¾÷¸¸ Á¸ÀçÇÑ´Ù¸é À̸¦ pop¿Í push µ¿ÀÛÀ» ¿¬¼Ó½ÃÄÑ ÇØ°áÇϰÚÁö¸¸, WAL¿¡¼´Â Áß¿äÇÑ ¹®Á¦°¡ µÈ´Ù. Push ·Î±×¿¡ pushÇÒ °³Ã¼¸¦ µð½ºÅ©¿¡ Á÷·ÄÈ(serialize)ÇØ¾ß Çϱ⠶§¹®ÀÌ´Ù.
ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇØ µµÀÔµÈ °ÍÀÌ ¹Ù·Î 'move' µ¿ÀÛÀÌ´Ù. Áï, ¾î´À À§Ä¡ÀÇ Ç׸ñÀ» ¾î´À Å¥·Î À̵¿Çß´Ù´Â ´Ü¼øÇÑ move ·Î±×¸¸ ³²°Ü ¼º´É Çâ»óÀ» µµ¸ðÇß´Ù. ±×·¯³ª ÀÌ move µ¿ÀÛÀº ÇÊÀÚ¿¡°Ô ¸Å¿ì ½ÉÇÑ ½ºÆ®·¹½º¸¦ °¡Á®¿Ô´Âµ¥, ±× ÀÌÀ¯´Â ÀÌ µ¿ÀÛÀÌ ¸Þ¸ð¸® »ó¿¡¼´Â ¿©ÀüÈ÷ µÎ °³ÀÇ µ¿ÀÛÀ¸·Î ÀÌ·ç¾îÁ® Àֱ⠶§¹®À̾ú´Ù.
ÃÖÃÊÀÇ ±¸ÇöÀº ´Ü¼øÈ÷ 2°³ÀÇ µ¿±âÈ(synchronized) ºí·°À» ¿°í µ¥ÀÌÅ͸¦ ¿Å±â´Â °ÍÀ̾ú´Âµ¥, À̰ÍÀº ±Ý¹æ ¹®Á¦¸¦ °¡Á®¿Ô´Ù. Å¥ A°¡ Å¥ B·Î, Å¥ B°¡ Å¥ A·Î µ¥ÀÌÅ͸¦ ¿Å±æ ¶§ µ¥µå¶ôÀÌ ¹ß»ýÇÏ´Â ¹®Á¦¸¦ °£°úÇ߱⠶§¹®ÀÌ´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇØ ¶ô(Lock)ÇÒ °³Ã¼¸¦ hashCode ¼øÀ¸·Î Á¤·ÄÇÏ¿© ¶ôÀ» °Å´Â ¹æ¹ýÀÌ À¯·ÂÇßÀ¸³ª ¶ô °³Ã¼¸¦ µµÀÔÇϱ⿡´Â ¼öÁ¤ÇÒ ºÐ·®ÀÌ ³Ê¹« ¸¹¾Æ Æ÷±âÇÏ¿´´Ù.
µÎ ¹øÂ° ±¸ÇöÀº µ¿±âÈ ºí·°À» µ¥µå¶ôÀÌ »ý±âÁö ¾ÊÀ¸¸é¼ ·Î±×ÀÇ ¼ø¼°¡ È寮·¯ÁöÁö ¾Êµµ·Ï ±³¹¦ÇÏ°Ô 2°³·Î ³ª´« °ÍÀ̾ú´Ù. À̰ÍÀº óÀ½¿¡´Â Àß µ¿ÀÛÇÏ´Â °ÍÀ¸·Î º¸¿´Áö¸¸ ÃßÀûÀÌ ¸Å¿ì Èûµç µ¿½Ã¼º ¹®Á¦¸¦ °¡Á®¿Ô´Ù. Å¥ÀÇ µ¥ÀÌÅͰ¡ ±úÁöÁö´Â ¾Ê¾ÒÀ¸³ª ·Î±×°¡ ¼ø¼´ë·Î ±â·ÏµÇÁö ¾Ê¾Æ ¼¹ö°¡ Àç½ÃÀÛÇÒ ¶§ µ¥ÀÌÅͰ¡ ¼Õ½ÇµÇ¾ú´Ù.
¼¼ ¹øÂ° ½Ãµµ¿¡¼ ÇÊÀÚ´Â ÀÌ ¹®Á¦¸¦ ±Ùº»ÀûÀ¸·Î ÇØ°áÇϱâ À§ÇØ OILÀ» °ÅÀÇ »õ·Î ÇÁ·Î±×·¡¹ÖÇÒ ¼ö¹Û¿¡ ¾ø¾ú´Ù. ¸Þ¸ð¸® »ó¿¡¼ µ¿ÀÛÀ» ¼öÇàÇÏ´Â ºÎºÐ°ú µð½ºÅ©¿¡ ±â·ÏÇÏ´Â ºÎºÐÀ» ¿ÏÀüÈ÷ ºÐ¸®Çϰí ù ±¸Çö¿¡¼ ¸Á¼³¿´´ø ¶ôÀ» Doug LeaÀÇ Concurrent ¶óÀ̺귯¸® (
http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/
concurrent/intro.html)¸¦ ÀÌ¿ëÇØ Àû±ØÀûÀ¸·Î µµÀÔÇÏ¿´´Ù. ±× °á°ú <±×¸² 4>¿Í °°Àº ÇöÀçÀÇ ±¸ÇöÀÌ ¿Ï¼ºµÇ¾ú°í, ±× °á°ú´Â ³î¶ó¿ü´Ù.
º¹ÀâÇÑ µ¿±âÈ ºí·°À¸·Î ¾ôÈù ±âÁ¸ÀÇ ±¸Çöº¸´Ù Äڵ尡 ±ò²ûÇØÁø °ÍÀº ¹°·ÐÀÌ°Å´Ï¿Í 4°³ ÀÌ»óÀÇ CPU¸¦ °¡Áø ½Ã½ºÅÛ¿¡¼µµ ¸ðµç CPU¸¦ ´Ù »ç¿ëÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù. À̸¦ ÅëÇØ ÇÊÀÚ´Â ´ÙÀ½°ú °°Àº Áß¿äÇÑ ±³ÈÆÀ» ¾ò°Ô µÇ¾ú´Ù.
¡ß ÀÚ½ÅÀÌ Á÷Á¢ ±¸ÇöÇÒ ¼ö ÀÖ´Ù ÇÏ´õ¶óµµ °¡´ÉÇÑ ¸ðµç °÷¿¡¼ Àü¹®ÈµÈ ÆÐŰÁöÀÇ »ç¿ëÀ» µÎ·Á¿ö ¸»¶ó.
¡ß º¯ÈÀÇ ¿ä±¸°¡ ³ªÅ¸³¯ ¶§ ¸Á¼³ÀÌ´Â °ÍÀº ´õ ¸¹Àº ¾î·Á¿òÀ» ³º´Â´Ù.
 |
| <±×¸² 4> OilDatabase ½ÃÄö½º ´ÙÀ̾î±×·¥ |
Checked ExceptionÀ̳Ä, Unchecked ExceptionÀ̳Ä
ÀÚ¹ÙÀÇ ¿¹¿Ü´Â checked¿Í unchecked exceptionÀ¸·Î ³ª´¶´Ù. ÀǿܷΠÀÌ ¿ë¾î¿Í Â÷À̸¦ ¸ð¸£´Â °³¹ßÀÚ°¡ ¸¹´Ù. Checked exceptionÀº IOException°ú °°ÀÌ ¹Ýµå½Ã try-catch ºí·°À¸·Î °¨½Î Àâ¾ÆÁà¾ß ÇÏ´Â ¿¹¿Ü¸¦ ¸»ÇÑ´Ù. unchecked exceptionÀº NullPointerException°ú °°ÀÌ RuntimeExceptionÀ» »ó¼ÓÇÏ¿© try-catch ºí·°À¸·Î °¨½ÎÁö ¾Ê¾Æµµ ¹¬½ÃÀûÀ¸·Î ´øÁ®Áú ¼ö ÀÖ´Â ¿¹¿Ü¸¦ ¸»ÇÑ´Ù. ÀÚ¹ÙÀÇ checked/unchecked exception¿¡ ´ëÇÑ ³íÀÇ´Â ¿À·¡µÈ °ÍÀ¸·Î Burce EckelÀÌ Àß Á¤¸®ÇÑ ´ÙÀ½ URLÀ» Âü°íÇϸé ÁÁÀ» µíÇÏ´Ù.
±×·¸´Ù¸é OilDatabase°¡ ´øÁö´Â OilExceptionÀº ¾îµð¿¡ ¼ÓÇØ¾ß ÇÒ±î? óÀ½¿¡ ÇÊÀÚ´Â JDBC API¸¦ Âü°íÇÏ¿© OilExceptionÀ» checked exceptionÀ¸·Î ÇßÁö¸¸, Å« ¾ÖÇø®ÄÉÀ̼ÇÀ» °³¹ßÇÏ°Ô µÇ¸é¼ °í¹Î¿¡ ºüÁ³´Ù. ¼¹ö°¡ ¿äûÀ» ó¸®Çϱâ À§ÇØ Å¥¸¦ ¸Å¿ì ºó¹øÈ÷ »ç¿ëÇÏ´Â Å¿¿¡ ¿©±âÀú±â º¸±â ÈäÇÏ°Ô try-catch ºí·°ÀÌ ´Ã¾î³ª¹ö·È±â ¶§¹®ÀÌ´Ù.
Å¥ÀÇ µ¿ÀÛÀÌ ½ÇÆÐÇÑ´Ù´Â °ÍÀº ¸Å¿ì Ä¡¸íÀûÀÎ ÀÏÀ̹ǷΠOilExceptionÀÌ ¹ß»ýÇÏ°Ô µÇ¸é ¾ÖÇø®ÄÉÀ̼ÇÀº Á¤»óÀûÀÎ µ¿ÀÛÀ» ÇÒ ¼ö ¾ø´Ù. µû¶ó¼ ´ëºÎºÐÀÇ ¼Ò½ºÄڵ忡¼ OilExceptionÀÇ catch ºí·°Àº ·Î±×¿¡ ³²±â°í µ¿ÀÛÀ» Á¾·áÇÏ´Â µîÀÇ ´Ü¼øÇÑ Ã³¸®¸¸À» ¼öÇàÇÏ¸é¼ ¼Ò½º¸¦ º¹ÀâÇÏ°Ô º¸ÀÌ°Ô Çß´Ù.
°á±¹ ÇÊÀÚ´Â Áö±Ý±îÁö °³¹ßµÈ ÄÚµåÀÇ ¼öÁ¤À» °¨¼öÇÏ¸é¼ OilExceptionÀ» unchecked exceptionÀ¸·Î º¯°æÇß´Ù. ½Ã°£ÀÌ Áö³ªÀÚ ±×°ÍÀº '°¨¼ö'°¡ ¾Æ´Ï¶ó ¿Ã¹Ù¸¥ ¼±ÅÃÀ¸·Î ÆÇ¸íµÇ¾ú´Ù. ¿¹¿Ü ó¸® â±¸´Â ÀÏ¿øÈµÇ°í º¸±â ÈäÇÑ try-catch ºí·°Àº ÀüºÎ »ç¶óÁ® ´Ù¸¥ »ç¶÷µéµµ OIL API¸¦ ÁÁ¾ÆÇÏ°Ô µÇ¾ú´Ù.
ASFÀ¸·ÎºÎÅÍÀÇ ¿¬¶ô
OILÀ» Á¤½Ä ¸±¸®ÁîÇϱâ À§ÇØ ¹®¼È ÀÛ¾÷À» ½ÃÀÛÇÏ·Á°í ÇÒ ÁîÀ½, ¶æÇÏÁö ¾ÊÀº ¿¬¶ôÀ» ¹Þ°Ô µÇ¾ú´Ù. ASFÀÇ Directory ÇÁ·ÎÁ§Æ®(
incubator.apache.org/directory) Áß LDAP ¼¹öÀÎ Eve¸¦ ´ã´çÇϰí ÀÖ´Â Alex Karasulu´Â Netty 2 Æ÷·³¿¡¼ Ȱµ¿Çß´ø Enrique Rodriguez°¡ °³¹ßÇÑ Kerberos ¼¹ö¿¡ °ü½ÉÀ» °®°í ÀÖ¾ú´Ù.
Alex´Â EnriqueÀÇ Kerberos ¼¹öÀÇ Directory ÇÁ·ÎÁ§Æ® ÆíÀÔÀ» Èñ¸ÁÇß°í, µû¶ó¼ ÀÚ½ÅÀÌ ÁøÇàÇØ ¿Â SEDA ÇÁ·ÎÁ§Æ®¿Í ÀüüÀûÀÎ ·Îµå¸ÊÀ» ÇÔ²² ¼³¸íÇß´Ù. Enrique´Â SEDA°¡ ÇÏ´Â ÀÏÀ» Á¦°øÇÏ´Â ÁÁÀº ÇÁ·ÎÁ§Æ®°¡ ÀÌ¹Ì ÀÖ°í, ±×°ÍÀÌ ÀÚ½ÅÀÌ Kerberos ¼¹ö¸¦ °³¹ßÇϴµ¥ »ç¿ëÇÑ Netty 2¶ó´Â °ÍÀ» ¹àÈù´Ù.
Alex´Â Netty 2ÀÇ ±¸Çö »óÅ¿¡ ¸Å¿ì °ü½ÉÀ» º¸À̸ç, ÇÔ²² Netty 2ÀÇ ±â´É°ú SEDA(Staged Event Driven Architecture)ÀÇ ¾ÆÅ°ÅØÃ³¸¦ È¥ÇÕÇÑ À¯´Ð½ºÀÇ inetd¿Í °°Àº ³×Æ®¿öÅ· Ç÷§ÆûÀ» °³¹ßÇÒ °ÍÀ» Á¦¾ÈÇß´Ù. °¡½¿ µÎ±Ù°Å¸®´Â Á¦¾ÈÀÌ ¾Æ´Ñ°¡! ÇÊÀÚ´Â ¹Ù·Î ½Â³«Çß°í, ±×´Â ÇÊÀÚ¸¦ ASF¿¡ Àû±Ø ÃßõÇÏ¿© Á¤½Ä Ä¿¹ÌÅÍ·Î ¸¸µé¾î ÁÖ¾ú´Ù.
Á¤½Ä Ä¿¹ÌÅͰ¡ µÇ±â À§Çؼ´Â º¸Åë ÇØ´ç ASF ÇÁ·ÎÁ§Æ®¿¡ ´ëÇÑ ´«¿¡ ¶ç´Â °øÇåÀÌ ÇÊ¿äÇßÁö¸¸ AlexÀÇ µµ¿òÀ¸·Î ¸î °¡Áö °£´ÜÇÑ ÆÐÄ¡¸¦ ¸¸µé°í ¸ÞÀϸµ ¸®½ºÆ®¿¡¼ Ȱµ¿ÇÑ °Í¸¸À¸·Î PMC ÅõÇ¥¸¦ Åë°úÇß´Ù. Alex´Â ÇѱÛÀ» ¸ð¸£Áö¸¸ ÀÌ ÀÚ¸®¸¦ ºô¾î ±×ÀÇ ²÷ÀÓ¾ø´Â °Ý·Á¿Í Á¶¾ð¿¡ Áø½ÉÀ¸·Î °¨»çÇÏ°í ½Í´Ù.
ÇÊÀÚ´Â Áö±Ýµµ ù ¹øÂ° Ä¿¹ÔÀÇ ¼ø°£À» ÀØÀ» ¼ö°¡ ¾ø´Ù. ASFÀÇ ÀÏ¿øÀÌ µÇ¾î SEDA¶ó´Â TLP(Top Level Project)¸¦ À̲ø°Ô µÉ »ý°¢À» ÇÏ¸é °¡½¿ÀÌ µÎ±Ù°Å¸®´Â °ÍÀÌ´Ù. ÇÏÁö¸¸ ¹«¾ùº¸´Ùµµ ¸ÚÁø ¼ø°£Àº Àü ¼¼°è¿¡ Èð¾îÁø ÇÊÀÚº¸´Ù ÈξÀ ´õ ¸¹Àº °æÇèÀ» °¡Áø ¿©·¯ ºÐ¾ßÀÇ »ç¶÷µé°ú ÇÔ²² ºñÀüÀ» °øÀ¯ÇÏ°í ¼·Î¿¡°Ô¼ ¸¹Àº °ÍÀ» ¹è¿ì°í Çùµ¿ÇÏ´Â µ¿½Ã¿¡ ¶Ç °æÀïÇÏ°Ô µÉ ¹Ù·Î Áö±ÝÀÏ °ÍÀÌ´Ù. @
* ÀÌ ±â»ç´Â ZDNet KoreaÀÇ ÀÚ¸ÅÁöÀÎ ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®¿þ¾î¿¡ °ÔÀçµÈ ³»¿ëÀÔ´Ï´Ù.