[개발일지] Spring 3.2 + Velocity + mybatis 에서의 Form값 한글 깨짐

 최근 나를 일주일동안 고생시킨 인코딩 문제. back / front / DB 모두 UTF-8 로 통일함에도 불구하고 이렇게 한글 깨지는 문제는 정말 언제나 프로젝트 시작시 초반에는 나를 힘들게 하는 가장 큰 일인 것 같다.

 오늘은 나름대로 Spring MVC 3.2 와 Velocity, mybatis 의 연동 사용시에 한글 깨짐 문제를 해결한 날.. 물론 반쪽짜리 해결이긴 하다만, 나름대로 기분은 좋다.

 일단 인터넷을 검색하면 아래와 같이 하라고 나온다.

1. web.xml 에 필터 추가

    <filter>

        <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>

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

    </filter-mapping>

2. mvc-dispatcher-servlet.xml 파일 내 Velocity Configure 수정

    <bean id=”velocityConfigurer”

          class=”org.springframework.web.servlet.view.velocity.VelocityConfigurer”>

        <property name=”resourceLoaderPath” value=”/WEB-INF/views/” />

        <property name=”overrideLogging” value=”false” />

        <property name=”velocityProperties”>

            <props>

                <prop key=”resource.loader”>file</prop>

                <prop key=”input.encoding”>utf-8</prop>

                <prop key=”output.encoding”>utf-8</prop>

                <prop key=”file.resource.loader.cache”>false</prop>

                <prop key=”springMacro.resource.loader.cache”>false</prop>

                <prop key=”counter.name”>velocityCount</prop>

                <prop key=”counter.initial.value”>1</prop>

            </props>

        </property>

    </bean>

    <bean id=”viewResolver”

          class=”org.springframework.web.servlet.view.velocity.VelocityViewResolver”>

        <property name=”exposeRequestAttributes” value=”true” />

        <property name=”exposeSessionAttributes” value=”true” />

        <property name=”exposeSpringMacroHelpers” value=”true” />

        <property name=”requestContextAttribute” value=”rc” />

        <property name=”cache” value=”false” />

        <property name=”suffix” value=”.vm” />

        <property name=”order” value=”1″></property>

        <property name=”contentType” value=”text/html; charset=UTF-8″ />

        <property name=”viewClass”

                  value=”org.springframework.web.servlet.view.velocity.VelocityView” />

        <property name=”prefix” value=”” />

        <property name=”toolboxConfigLocation” value=”WEB-INF/classes/config/velocity/velocity-toolbox.xml”/>

    </bean>

굵게 표시한 부분만 유의하면 된다.

3. DB 연결시 옵션(MySQL 의 경우)

jdbc.url=jdbc:log4jdbc:mysql://127.0.0.1:3306/test_db?characterEncoding=utf8&useUnicode=true&mysqlEncoding=utf8autoReconnect=true 

뭐 설정이야 하기 나름이지만, 일단 DB 스키마를 생성할 때 UTF-8 인코딩인지, DB 자체의 인코딩이 UTF8 인지 확인한다.(이글을 참조한다.)

4. 마지막으로, Form 값을 넘어갈 때 POST 형식인지 확인한다.

                document.form1.action = url;

                document.form1.method = “POST”;

                document.form1.submit(); 

 이게 내가 반쪽짜리 해결이라 말하는 부분인데, POST로 한다는 의미 자체가 GET 방식은 여전히 한글이 깨진다는 의미이다. 그런데 더 웃긴건 Form 으로 넘기는 방식이 아닌, Ajax 로 처리하면 또 잘된다. 뭔가 아직까지는 Velocity 쪽에서 한글 처리가 잘 넘어가지 않는 것 같은데.. Controller 에서 log를 찍어봐도 ​HttpServletRequest 로 넘어온 Parameter 가 일단 깨져서 들어간다는 자체가 이를 의미하지 않을까 싶다.


 어쨌든, 나는 이렇게 해서 문제를 해결했다. 비록 반쪽짜리 해결이긴 하지만, 버그는 잡고있으면 버그가 되고 최선책, 차선책 등을 사용해서 빠르게 해결하면 일단 어떻게든 진도가 나갈 수 있다고 생각하니깐..