SPRING
2017.06.03 / 15:52

ÀÚ¹Ù ½ºÇÁ¸µ ÀÎÄÚµù ´ë¹Ú »ðÁú °æÇè - ½ÇÀü

±Ý±Ý±Ý
Ãßõ ¼ö 464

1. ¹®Á¦ »óȲ


¿ì¸® ¼­¹ö´Â UTF-8À» »ç¿ëÇÏ°í ÀÖ¾ú´Âµ¥,

¿ÜºÎ ¾÷ü¿¡¼­ EUC-KR POST ¹æ½Ä(Content-type: charset=EUC-KR; text/html)À¸·Î ÇÑ±Û ÆĶó¹ÌÅ͸¦ Àü´ÞÇÏ¿´°í, ÇѱÛÀÌ ±úÁö´Â ¿À·ù°¡ ¹ß»ý.



2. ¿À·ù È®ÀÎÀ» À§ÇÑ »ðÁú

1) »ðÁúÀÇ ½ÃÀÛ

Postman À̶ó´Â ¾îÇø®ÄÉÀ̼ÇÀ» »ç¿ëÇÏ¿© Å×½ºÆ®¸¦ ÁøÇàÇÏ¿´´Ù.

UTF-8·Î º¸³»´Ù°¡, EUC-KR·Î º¸³»°í, 

tomcatÀÇ server.xmlµµ °Çµå·Á º¸°í, 

½ºÇÁ¸µ web.xml¿¡¼­ ÇÊÅÍ ¼³Á¤µµ º¯°æÇغ¸¾Ò´Ù.

¼ö¸¹Àº ÀÎÄÚµù Å×½ºÆ®¸¦ °ÅÃÆÀ¸³ª ¸ðµÎ ½ÇÆÐ.


±× ÀÌÀ¯´Â Postman¿¡¼­ ¾î¶»°Ô ¼³Á¤Çϵç UTF-8·Î °íÁ¤µÇ¾î ¿äûÀÌ ³¯¶ó°¬±â ¶§¹®À̾ú´Ù.



2) »ðÁúÀÇ ¿¬¼Ó(EF BF BDÀÇ ÀúÁÖ)

±×·¡¼­ ÀÏ´Ü Å×½ºÆ® ÅøÀ» º¯°æÇؾ߸¸ Çß°í,

°£´ÜÇÑ HTML POST FormÀ» ¾Æ·¡Ã³·³ ÀÛ¼ºÇÏ¿´´Ù.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Sample - Hello Page</title>

</head>

<body>

  <form action="http://ÁÖ¼Ò" method="post">

    <input type="text" name="name" value="µÎÄÚÄÚ"/>

    <button type="submit">Á¦Ãâ</button>

  </form>

</body>

</html>


ÀÌÁ¦ Çѱ۷ΠµÈ ÆĶó¹ÌÅ͸¦ EUC-KR ÀÎÄÚµùÀ¸·Î ¼­¹ö¿¡ Àü´ÞÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù.

ÇÏÁö¸¸ ¶Ç´Ù½Ã ¹®Á¦°¡ ³ªÅ¸³µ´Ù.


³ª´Â "µÎÄÚÄÚ"¸¦ Àü¼ÛÇÏ¿´´Âµ¥ °è¼ÓÇؼ­ ¾Æ·¡ÀÇ °ªÀÌ ³ª¿Ô´Ù.

name=%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD

¹º°¡ ½Í¾î "È«±æµ¿" , "ÀüÁöÇö" µîµî ¾Æ¹«°ªÀ̳ª ³Ö¾îºÁµµ À§ÀÇ °ªÀÌ ³ª¿Ô´Ù.


µµ´ëü EF BF BD´Â ¹«¾ùÀ̶õ¸»Àΰ¡? °á°ú´Â ¾Æ·¡¿Í °°¾Ò´Ù.

"¾î¶°ÇÑ ÀÌÀ¯·Î ¹®¼­°¡ UTF-8·Î ÀúÀåµÉ ¶§ ±úÁ®¼­ ��·Î º¯È¯µÅ ¹ö¸°´Ù. ��´Â UTF-8¿¡¼­ EF BF BD / EF BF BD·Î ÀúÀåµÈ´Ù."

(ÀÚ¼¼ÇÑ ¼³¸íÀº https://uncyclopedia.kr/wiki/%E5%8D%A0%EC%8F%99%EC%98%99 ¸¦ ÂüÁ¶ÇÏ¸é µÈ´Ù)


ÀÏ´Ü »óȲÀ» »ìÆ캸´Ï, EUC-KR·Î ³Ñ¾î¿Â °ªÀ» UTF-8·Î º¯È¯ÇÏ´Â °úÁ¤¿¡¼­ ¹ß»ýÇÑ ¿À·ù¿´´Ù.


¿À, ³ª´Â º¯È¯À» ÇÏÁö ¾Ê¾Ò´Âµ¥ µµ´ëü ¾îµð¼­ º¯È¯À» ÇÏ°í ÀÖ´Ü ¸»Àΰǰ¡?
'±×·¡ ¹¹ ¼­¹ö ¼³Á¤ÀÌ°ÚÁö' ½Í¾î È®ÀÎÇغ¸´Ï, ¾Æ´Ï³ª ´Ù¸¦±î ¾Æ·¡ÀÇ ¼³Á¤ÀÌ web.xml¿¡ ÀÖ¾ú´Ù.


 <filter>

<filter-name>encodingFilter</filter-name>

<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

<init-param>

<param-name>forceEncoding</param-name>

<param-value>true</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>encodingFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

(Âü°í·Î À§ÀÇ web.xml ¼³Á¤Àº POST ¹æ½Ä¸¸ Àû¿ëµÇ¸ç, GET¹æ½ÄÀÇ °æ¿ì server.xmlÀÇ connector ÀÎÄÚµù ¼³Á¤À» Á¶ÀÛÇØ¾ß ÇÑ´Ù.)


ÀÌó·³, ¸ðµç URL¿¡ ´ëÇØ UTF-8·Î ÀÎÄÚµùÀ» ÇÏ°í ÀÖ¾ú´ø °ÍÀÌ°í,

EUC-KR·Î µé¾î¿Â °ªÀÌ ¹Ù·Î UTF-8·Î ÀÎÄÚµùµÇ¸é¼­ ±ÛÀÚ°¡ ±úÁö°Ô µÈ °ÍÀ̾ú´Ù. 



3) URLEncoded°¡ µÇ¾îÀÖ³×? ±×°Íµµ UTF-8·Î?

ÀÌÁ¦ ³»°¡ ÇؾßÇÒ ÀÏÀº ¼­¹ö ÀÎÄÚµù ÇÊÅ͸¦ EUC-KR·Î º¯°æÇÏ´Â °ÍÀÌ¿´´Ù.

¹°·Ð, ³»°¡ ÀÎÄÚµù ÇÊÅ͸¦ ¹Ù²Ù¸é ±âÁ¸ÀÇ UTF-8 ¹æ½ÄÀ» µû¸£´ø ´Ù¸¥ °Íµé¿¡¼­ ¸ðµÎ ¿¡·¯°¡ ³ª±â ¶§¹®¿¡

ÀÏ´Ü Å×½ºÆ®³ª Çغ¸ÀÚ ½Í¾î ·ÎÄÿ¡¼­¸¸ À§ÀÇ encoding º¯¼ö¸¦ "EUC-KR"·Î º¯°æÇÏ¿© Å×½ºÆ®Çغ¸¾Ò´Ù.


@RequestBody·Î ¹ÞÀº String name¿¡´Â "name=%EB%91%90%EC%BD%94%EC%BD%94" À̶ó´Â °ªÀÌ µé¾îÀÖ¾ú´Ù.

Àú °ªÀº µü ºÁµµ "µÎÄÚÄÚ"°¡ URLEncodedµÈ °ÍÀ̾ú±â ¶§¹®¿¡

URLDecoder.decode(name, "EUC-KR"); ·Î º¯°æÇÏ¿´´Ù.

ÀÚ ÀÌÁ¦ ÇѱÛÀÌ ³ª¿ÔÀ»±î?

¹°·Ð ³ª¿ÀÁö ¾Ê¾Ò´Ù.

¿ÖÀϱî?

Àú name µÚÀÇ URLEncodedµÈ °ªÀº UTF-8À̾ú±â ¶§¹®À̾ú´Âµ¥,

URLDecoder.decode(name, "UTF-8");¸¦ ÇÏÀÚ  "µÎÄÚÄÚ"°¡ Á¤»óÃâ·Â µÊÀ» º¼ ¼ö ÀÖ¾ú´Ù.


³ªÀÇ »ý°¢Àº

a. form¿¡¼­ EUC-KR·Î "µÎÄÚÄÚ" Àü¼Û

b. ¼­¹ö ÇÊÅÍ¿¡¼­ EUC-KR·Î µðÄÚµù
c. @RequestBody String name À¸·Î ¹ÞÀº °ªµµ  euc-kr·Î URL µðÄÚµùÇϸé "µÎÄÚÄÚ" Ãâ·Â °¡´ÉÀ̾ú°í,


½ÇÁ¦´Â

c. @RequestBody String name À¸·Î ¹ÞÀº °ªÀ»  utf-8·Î URL µðÄÚµùÇϸé "µÎÄÚÄÚ" Ãâ·Â °¡´ÉÀ̾ú´Ù.


±×·¸´Ù. »ç½Ç ³ª´Â @RequestBody°¡ ¹«½¼ÀÏÀ» ÇÏ´ÂÁöµµ ¸ð¸£°í »ç¿ëÇÏ°í ÀÖ¾ú´ø °ÍÀÌ´Ù.



4) HttpServletRequest.getParameter() & @RequestBody

Form¿¡¼­ POST ¹æ½ÄÀ¸·Î µ¥ÀÌÅ͸¦ Àü¼ÛÇϸé ÀÚµ¿ÀûÀ¸·Î URL ÀÎÄÚµùÀÌ µÇ¾î Àü¼ÛµÈ´Ù.

(ÀÌ ¶§ÀÇ ÀÎÄÚµù ¹æ½ÄÀº ÇØ´ç Form¿¡ ÁöÁ¤µÈ content-type¿¡ ´Þ·Á ÀÖ´Ù.)

¿Ö URL ÀÎÄÚµùÀÌ µÇ´À³Ä Çϸé, ¾Æ·¡Ã³·³ '&', '=' ±âÈ£°¡ value·Î ¾²ÀÏ ¼ö Àֱ⠶§¹®ÀÌ´Ù. 

corpName=A&B&corpAddr=°æ±âµµ=¼­¿ï½Ã Á¦ÁÖµ¿


±×·¡¼­ °á±¹ 

a. EUC-KR·Î ÀÎÄÚµù µÊ.

b. URLEncoding µÊ.

c. Byte·Î request Body¿¡ µé¾î°¨

ÀÌ ¼¼°¡Áö ´Ü°è¸¦ °ÅÃÄ ÆĶó¹ÌÅÍ°¡ Àü¼ÛµÈ °ÍÀÌ´Ù.


±×¸®°í ¼­¹ö¿¡ ¿Í¼­´Â

web.xmlÀÇ ÀÎÄÚµù ÇÊÅ͸¦ ÅëÇØ request bodyÀÇ Byte °ªÀ» ¾î¶² ÀÎÄÚµù ¹æ½ÄÀ¸·Î ÀоîµéÀÏÁö °áÁ¤ÇÏ°Ô µÈ´Ù.

request.getParameter(key) ¸Þ¼ÒµåÀÇ °æ¿ì ÀÚµ¿ÀûÀ¸·Î ÇØ´ç key¿¡ ¼ÓÇÑ value¸¦ URLµðÄÚµùÇÑ °ªÀ¸·Î ²¨³»Áֱ⠶§¹®¿¡

request.getParameter("name")À» Çϸé "µÎÄÚÄÚ"°¡ Çѹ濡 Àß ³ª¿À°Ô µÈ´Ù. 


±×. ·¯. ³ª, @RequestBody·Î String ÆĶó¹ÌÅ͸¦ »ç¿ëÇÏ°Ô µÇ¸é ¸»ÀÌ ´Þ¶óÁø´Ù.

http://blog.naver.com/duco777/220565709386 ¿¡µµ ¼³¸íÀÌ Àִµ¥,

tomcatÀÇ inputStream consumed ¹®Á¦·Î ÆĶó¹ÌÅ͵éÀ» Ä«ÇÇ Ã³¸® Çϸ鼭 UTF-8·Î °íÁ¤µÇ¾î ÀÎÄÚµù 󸮠µÈ´Ù.

Áï, ´Ã UTF-8·Î µðÄÚµù ÇÏ¸é µÇ´Â °ÍÀ̾ú´ø °ÍÀÌ´Ù.


ÀÌ·¸°Ô ÆòÈ­·Ó°Ô ³¡³ª´Â µí Çß´Ù.



5) ¼­¹ö ÇÊÅÍ Àû¿ë

¾Æ±î À§¿¡¼­ Àû¿ëÇß´ø ¼­¹ö ÇÊÅÍ´Â °ø¿ëÀ¸·Î UTF-8À» ¾²´ø °ÍÀ» Å×½ºÆ®¸¦ À§ÇØ ÀÓÀÇ·Î EUC-KR·Î ¹Ù²Û °ÍÀ̾ú´Ù.

Áï, url-filter¸¦ »ç¿ëÇÏ¿© ³»°¡ Àû¿ëÇÏ°íÀÚ ÇÏ´Â °÷¿¡¸¸ ´Ù¸¥ ÇÊÅ͸¦ Àû¿ëÇؾßÇÏ´Â ¹®Á¦°¡ ³²¾ÆÀÖ´Â °ÍÀÌ´Ù!!!


ÀÏ´ÜÀº ¾Æ·¡Ã³·³ µÎ °³ÀÇ ÇÊÅ͸¦ Àû¿ëÇغ¸¾Ò´Ù.


 <filter>

<filter-name>eucKrEncodingFilter</filter-name>

<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>euc-kr</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>eucKrEncodingFilter</filter-name>

<url-pattern>/test.nhn</url-pattern>

</filter-mapping>


<filter>

<filter-name>encodingFilter</filter-name>

<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

<init-param>

<param-name>forceEncoding</param-name>

<param-value>true</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>encodingFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>


À§¿¡´Â /test.nhnÀÇ °æ·Î·Î Á¢±ÙÇÒ °æ¿ì euc-kr·Î ÀÎÄÚµùÇÏ´Â ÇÊÅ͸¦ Ãß°¡ Àû¿ëÇÑ °æ¿ìÀÌ´Ù.

ÇÏÁö¸¸, È®ÀΠ°á°ú UTF-8·Î ÀÎÄÚµùÀÌ µÇ¾î ¾Æ·¡ÀÇ ÀúÁÖ°ªÀÌ ´Ù½Ã Çѹø µîÀåÇÏ´Â °ÍÀÌ ¾Æ´Ñ°¡??

name=%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%C8%AE


¿ÖÀÎÁö À§, ¾Æ·¡¸¦ ¹Ù²Ù¸é requestÀÇ Ä³¸¯ÅͼÂÀÌ ¹Ù²ð°Í¸¸ °°¾Æ »¡°£ÄÚµå¿Í ÆĶõÄÚµåÀÇ ¼ø¼­¸¦ º¯°æÇÑ µÚ Àç½Ãµµ Çغ¸¾Ò´Ù.


¿ª½Ã, °á°ú´Â ÂüÆÐ.


ÇÊÅÍ µÎ °³ Àû¿ëÀº ¾ÈµÇ´Â °ÍÀϱî? 

À̹ø¿£ CharacterEncodingFilter¸¦ È®ÀåÇÑ MyEncodingFilter¸¦ »ç¿ëÇغ¸¾Ò´Ù.

<filter>

<filter-name>myEncodingFilter</filter-name>

<filter-class>org.test.myEncodingFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>euc-kr</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>myEncodingFilter</filter-name>

<url-pattern>/test.nhn</url-pattern>

</filter-mapping>


<filter>

<filter-name>encodingFilter</filter-name>

<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

<init-param>

<param-name>forceEncoding</param-name>

<param-value>true</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>encodingFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>


°á°ú´Â.... ³î¶ø°Ôµµ Àß ³ª¿Ô´Ù. myEncodingFilter¿¡ Ưº°È÷ ´Ù¸¥ °ªÀÌ ÀÖ´Â °ÍÀº ¾Æ´Ï¿´´Âµ¥ ¸»ÀÌ´Ù.


ÇÏÁö¸¸, ±×·¡µµ ÇÊÅÍ°¡ µÎ°³ÀÖ´Â°Ç º¸±â ÈäÇϱ⠶§¹®¿¡ myEncodingFilter Çϳª¸¸À» ¼±¾ðÇØ ³õ°í

³»ºÎÀûÀ¸·Î requestÀÇ url Á¤º¸¸¦ ºñ±³Çϱâ·Î ÇÏ¿´´Ù.

public class MyEncodingFilter extends CharacterEncodingFilter {


@Override

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

        

        if (request.getRequestURI().startsWith("/test.nhn")) {

            request.setCharacterEncoding("euc-kr");

            response.setCharacterEncoding("euc-kr");

            filterChain.doFilter(request, response);

        } else {

   //À§ÀÇ °æ·Î°¡ ¾Æ´Ò °æ¿ì ±âº» doFilterInternalÀ» Ÿ°Ô µÈ´Ù.

            super.doFilterInternal(request, response, filterChain);

        }

    }

}




¿ÜºÎ¾÷ü¿¡°Ô °¥±À¸ÔÀ¸¸ç Å« »ðÁúÀ» Çߴµ¥, 

ÆÀ³»ÀÇ ÀüÀÓ´ÔÀÌ µµ¿ÍÁּż­ Å« ¹è¿òÀÌ µÈ ÁÁÀº °æÇèÀ̾ú´Ù.

-ÀϱâÅä ³¡-