±âŸ(framework)
2018.11.22 / 01:50

[java] HttpClientÀÇ Connection Pool ÀÌ¿ëÇÑ ¿ø°Ý È£Ãâ½Ã ¼ÒÄÏ¿¡·¯ ¹æÁö

hanulbit
Ãßõ ¼ö 268

HttpUrlConnection À̳ª HttpClient¸¦ ÀÌ¿ëÇؼ­ ¸¹À̵é URL ¿ø°Ý È£ÃâÀ» ÇÒÅÙµ¥

µ¿½Ã Á¢¼ÓÀÚ¼ö°¡ Á¶±Ý ¸¹Àº ¼­ºñ½º¿¡ ÀÌ°É Àû¿ëÇÏ°Ô µÇ¸é 
java.net.BindException: Address already in use: connect
java.net.SocketTimeoutException: connect timed out
ÀÌ¿Í °°Àº ¿¡·¯°¡ ³ª´Â°É º¼¼ö°¡ ÀÖ´Ù

ÀÚÁÖ ¹ß»ýÇÏÁö ¾ÊÁö¸¸ ÇÇÅ©½Ã°£¿¡ ¹®Á¦°¡ Ç×»ó ¹ß»ýµÇ¾ú´Ù
±×·¸´Ù¸é ¾î¶»°Ô ÇÏ¸é ¹®Á¦¸¦ ÇØ°áÇÒ¼ö ÀÖÀ»±î? BindExceptionÀº ´õÀÌ»ó ¿­ ¼ÒÄÏÀÌ ¾ø¾î¼­
³ª´Â ¿¡·¯ÀÌ°í HttpUrlConnection À̳ª HttpClient ¸ðµÎ È£ÃâÀÌ ÀÖÀ»¶§¸¶´Ù ¼ÒÄÏÀ» ¿­°í ´Ý´Â°ÍÀ»
¹Ýº¹ÇÑ´Ù ±×·¸´Ù°í Çϸé Connection PoolÀ» ÀÌ¿ëÇÒ¼ö ¾øÀ»±î?

JDK API¸¦ ¾Æ¹«¸® µÚÁ®ºÁµµ Pool°ú °ü·ÃµÈ ¼Ò½º°¡ ¾ø¾ú°í ¾Æ³ö.. ÀÌ°É Á÷Á¢ ±¸ÇöÇÏ·Á°í ÇÏ´Ï
¸Ó¸®°¡ ³Ê¹«³ª ¾ÆÇÁ°í ±×·¡¼­~~~ ¸ÚÁø jakarta project °¡¼­ »ì¦ µÚÁ®º¸´Ï ½±°Ô ó¸®ÇÒ¼ö ÀÖ¾ú´Ù ^¤Ñ^

±âÁ¸ HttpUrlConnectionÀ¸·Î ±¸ÇöµÇ¾î ÀÖ´Â°É HttpClient·Î ¹Ù²Ù±â·Î °áÁ¤!
¸»Àº ÀÌÁ¦ ±×¸¸ÇÏ°í ¼Ò½º¸¦ º¸ÀÚ

¡Ø HttpClient´Â ¹öÁ¯º°·Î ¸ðµÎ ¼Ò½º°¡ ´Ù¸£±â ¶§¹®¿¡ googleÀ̳ª ´Ù¸¥ °Ë»ö¿£Áø¿¡¼­ ±×³É º¸°í »ç¿ëÇϸé
¹öÁ¯¶§¹®¿¡ Á¦´ë·Î µ¿ÀÛÀ» ¾ÈÇÒ¼ö ÀÖÀ¸´Ï~ ²À API ¹®¼­¸¦ º¸°í ¸¸µé±â¸¦ ±ÇÀå(ÀÌ°Å ¶§¹®¿¡ »ðÁúÁ»ÇÔ ¤Ð¤Ð)

¿¹Á¦ »ùÇÃÀº Æ©Å丮¾óÀ» º¸°í ÀÛ¼ºÇÑ°ÍÀÓÀ¸·Î ÀÌ»óÇÑ°Å ÀÖÀ½ ÇØ´ç »çÀÌÆ®¸¦ ÂüÁ¶ ÇÒ°Í!
------------------------------------------------------------------
---------------------------------------------------
ÃֽŠ¸±¸®Áö HttpClient 4.0.1 ±âÁØÀ¸·Î ÀÛ¼ºÇÔ
---------------------------------------------------------------------------------------------------------------------
/* Connection Pool ¼³Á¤ */
HttpParams params = new BasicHttpParams();
// Increase max total connection to 200
ConnManagerParams.setMaxTotalConnections(params, 200);
// Increase default max connection per route to 20
ConnPerRouteBean connPerRoute = new ConnPerRouteBean(20);
// Increase max connections for localhost:80 to 50
HttpHost localhost = new HttpHost("locahost", 80);
connPerRoute.setMaxForRoute(new HttpRoute(localhost), 50);
ConnManagerParams.setMaxConnectionsPerRoute(params, connPerRoute);

SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(
        new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schemeRegistry.register(
        new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));

cm = new ThreadSafeClientConnManager(params, schemeRegistry);

/* 
DefaultHttpClient ¿¡ ÆĶó¹ÌÅ͸¦ ¾î¶²°É ³Ñ°ÜÁֳĿ¡ µû¶ó 
SingleClientConnManager ¿Í 
ThreadSafeClientConnManager Áß ¹»¾²´ÂÁö °áÁ¤µÈ´Ù
ÀÚ¼¼ÇÑ°Ç API ÂüÁ¶
*/
httpClient = new DefaultHttpClient(cm, params);

ThreadSafeClientConnManager tm = (ThreadSafeClientConnManager)httpClient.getConnectionManager();

httpGet = new HttpGet("http://localhost/controller.jsp?Action=GetTopScore&GameIdx=1&Phone=111111109&Score=1213");
hr = httpClient.execute(httpGet);

entity = hr.getEntity();
if (entity != null) {
    buff = new BufferedReader(new InputStreamReader(entity.getContent()));
while((line = buff.readLine()) != null)
{
if(!line.equals(""))
{
String[] my = line.split("\\|");
topPhonenum = Integer.parseInt(my[0]);
topScore = Integer.parseInt(my[1]);
}
}
}

br.close();
entity.consumeContent();
httpGet.abort();
---------------------------------------------------------------------------------------------------------------------
¾Æ¿ì ³Ê¹«³Ê¹« ±ÍÂú¾Æ~~~ ´ëÃæ ¼Ò½º¸¦ º¸¸é ¾Ë¼ö ÀÖÀ»°ÍÀ̶ó ÆÇ´ÜÇÏ°í Àüü ¼Ò½º´Â ¾È¿Ã¸®±â·Î ^^;;

À§¿¡ ¼Ò½º¸¸ º¸¸é ¾Æ ´ëÃæ 
ThreadSafeClientConnManager À̶õ ³à¼ÆÀÌ ÀÖ±º¾Æ ¶ó°í »ý°¢ÀÌ µéÅ×°í
API ¹®¼­¸¦ Á¶±Ý º¸´Ù º¸¸é HttpClient¿¡´Â ClientConnectionManager À̶ó´Â ÀÎÅÍÆäÀ̽º°¡ Á¸ÀçÇÏ°í
°ü·Ã Ŭ·¡½º·Î´Â SingleClientConnManager ¿Í
ThreadSafeClientConnManager °¡ Á¸ÀçÇÏ´Â°É ºÁ¼­µµ
¾Æ...ÀÌ°Ô PoolÀ» ÀÌ¿ëÇÒ¶§¿Í ¾ÈÇÒ¶§ Â÷ÀÌÁ¡ÀÌ°Ú±º¾Æ ´ëÃæ °¨ÀÌ ¿ÀÁö ¾Ê´Â°¡?
´õ ±Ã±ÝÇϸé API¸¦ Á»´õ µÚÁ®º¸´ø°¡ °ü·Ã ¼Ò½º¸¦ ¿­¿©º¸¸é ¾Ë¼ö ÀÖÀ»°Í~~!

¼³¸¶.... ¹«½¼¼Ò¸®ÀÎÁö ¸ð¸£°Ú´Ù..... ¶ó°í »ý°¢ÀÌ µé¸é ±×³É »ç¿ëÇÏ¸é µÊ -¤±-;;


ÀÚ ±×·³ 
ThreadSafeClientConnManager ¸¦ ÀÌ¿ëÇؼ­ PoolÀÇ ´ëÇÑ ¼³Á¤À» ÇÏ°í
HttpGetÀ» ÀÌ¿ëÇؼ­ ÇØ´ç URLÀ» È£ÃâÇÏ°í °á°ú°ªÀ» ¹Þ¾Ò´Ù
±×·¸´Ù¸é ÀÌ°É ¸Å¹ø °°Àº ÆäÀÌÁö¿¡¼­ ¹Ýº¹ÇÒ°ÍÀΰ¡?

¾Æ½Ã´Ù½ÃÇÇ WEBÀ̶õ ȯ°æÀº µ¿ÀûÀÌÁö ¾Ê°í Á¤ÀûÀÎ ÆäÀÌÁö´Ù(¹°·Ð ¿¹¿Ü°¡ ÀÖÁö¸¸ ¸»ÀÌ´Ù)
Çѹø ÇØ´ç URLÀÌ È£ÃâµÇ°í °á°ú°¡ È­¸é¿¡ ³ª¿ÔÀ¸¸é ÇØ´ç ÆäÀÌÁö´Â ¸ØÃçÀÖ°í ¼­¹ö´Â ¶Ç´Ù¸¥ ÀÛ¾÷À» ÇÏÁö ¾Ê´Â´Ù
±×·¸´Ù¸é ÇØ´ç URL¿¡¼­ À§¿¡¼­ ¾ð±ÞÇÑ HttpClient¸¦ ÀÌ¿ëÇؼ­ Connection PoolÀ» »ç¿ëÇÒ²¨¸é
ÇØ´ç °´Ã¼¸¦ ¸Þ¸ð¸®¿¡ °¡Áö°í ÀÖ¾î¾ß Çϴµ¥ ¾î¶»°Ô ÇؾßÇÒ±î?

¹æ¹ýÀº 2°¡Áö°¡ Àִµ¥(¹¹ ´Ù¸¥ ¹æ¹ýÀÌ ÀÖÀ»¼öµµ ÀÖ°ÚÁö¸¸ ^^;;;)
1. application º¯¼ö¿¡ ´ã¾Æ¼­ ÇÊ¿äÇÒ¶§¸¶´Ù ²¨³»¾´´Ù
2. static class·Î ¸¸µé¾î¼­ tomcat ±¸µ¿½Ã ¸Þ¸ð¸®¿¡ ¿Ã¶ó°¡µµ·Ï ÇÑ´Ù

¾î¶² ¹æ¹ýÀ» ÇÏ´ø ±×°Ç °³¹ßÀÚ°¡ ÆíÇÑ´ë·Î ÇÏ¸é µÇ´Ï±ñ~

°£´ÜÇÑ ¿¹Á¦ »ùÇÃÀ» ¸¸µé¾î¼­ ¿Ã¸®°í ½ÍÁö¸¸ ³Ê¹«³ª Áö±Ý ¹è°¡ °íÇÁ°í ±ÍÂú±â ¶§¹®¿¡
´©±º°¡ ÇÊ¿äÇÏ´Ù°í Àý½ÇÈ÷ ¿äûÇϰųª ³»°¡ ÀÒ¾î¹ö¸®Áö ¾Ê°í ´Ù½Ã ÀÌÆ÷½ºÆÃÀ» ãÀ¸¸é ¼öÁ¤Çؾ߰ڴÙ;


±×·¡¼­ °£´ÜÇÏ°Ô Á¤¸®¸¦ ÇÏÀÚ¸é

»ó¿ë¼­ºñ½º¿¡¼­ ¿ø°ÝÈ£ÃâÀ» ÀÌ¿ëÇÑ °³¹ßÀ» ÇÏ°í ½Í´Ù¸é HttpUrlConnection º¸´Ü HttpClientÀ» ÀÌ¿ëÇØ¾ß ¹Ù¶÷Á÷ÀÌ´Ù
HttpClient·Î ConnectionPool À» ±¸ÇöÇÒ¶§´Â application º¯¼ö³ª static class¸¦ ÀÌ¿ëÇÏ¿© °³¹ßÀ» ÇؾßÇÑ´Ù
±×·¡¾ß BindException ¿¡·¯¿¡ ´ëÇÑ ¹®Á¦µµ ÇØ°áÀÌ °¡´ÉÇÏ°í Connection Timeout ¹®Á¦µµ ÇØ°áÀÌ °¡´ÉÇÏ´Ù
(±×³É ¸Å¹ø È£Ãâ½Ã¿¡´Â °è¼Ó °´Ã¼¸¦ ¸¸µé¾ú´Ù°¡ ¾ø¾Ý´Ù°¡¸¦ ¹Ýº¹Çϱ⿡ PoolÀ» Àç»ç¿ëÇÏÁö ¾ÊÀ½)