[Java] UTF-8 캐릭터셋(Charset) 문제 해결

    Mysql로 개발을 할 때, 다양한 이유로 인해서 캐릭터셋이 깨지는 경우가 발생한다. DB설정의 문제일수도 있고, Table을 생성할 때 문제일수도 있고, 혹은 Web 단에서 파라미터 전송시 캐릭터셋을 제대로 지정하지 않아서 생길 수 있는 문제도 있다. 이러한 다양한 캐릭터셋 문제를 해결하기 위한 팁들을 포스팅해보고자 한다




    톰캣(Tomcat)에서 파라미터가 깨질 경우


    흔하디 흔한 방법이다. 톰캣에서 8080 포트에서 캐릭터셋을 지정하면 파라미터가 UTF-8로 인코딩 된다.


    1
    <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>




    스프링(Spring)에서 캐릭터가 깨질 경우


    스프링에서 개발을 할 때, 캐릭터를 위한 필터링을 web.xml에 설정할 수 있다


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <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>
     
     
      <filter>
        <filter-name>SetCharacterEncoding</filter-name>
        <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
      </filter>
     
      <filter-mapping>
        <filter-name>SetCharacterEncoding</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>




    JDBC Connection에서 UTF-8 설정을 놓쳤을 경우


    순수하게 Mysql과 커넥션을 맺고, 데이터를 가져올 때 URL에 UTF-8 설정을 빼서 데이터가 깨지는 경우가 있다.


    AS-IS

    1
    jdbc:mysql://localhost:3306/test


    TO-BE

    1
    jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8



    위와같이, useUnicode=true&characterEncoding=UTF-8 설정을 추가로 넣자


    MYSQL의 Table 생성 시, UTF-8로 설정 안되어 있을 경우


    DB 테이블에 UTF-8 설정을 하지 않아서, 데이터가 깨져서 들어가는 경우가 있다. 자주 하는 실수이고, 타 DBMS 유저들은 헤맬 수 있는 부분이니 꼭 확인해야 한다


    1
    2
    3
    4
    5
    CREATE TABLE `test` (
      `id` int(10) unsigned NOT NULL,
      `title` varchar(100) NULL DEFAULT '',
      PRIMARY KEY (`id`)
    )ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci;



    위와같이 엔진(engine) 설정과 함께 캐릭터셋(charset)도 설정할 수 있다



    MYSQL의 캐릭터셋 설정


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [client]
    port=3306
    default-character-set=utf8
     
    [mysql]
    default-character-set=utf8
     
    [mysqld]
    collation-server = utf8_unicode_ci
    init-connect='SET NAMES utf8'
    character-set-server = utf8



    /etc/mysql/my.cnf 파일을 열어서, 위와 같이 설정하고 Mysql을 재기동하면 캐릭터셋 설정이 변경되어 진다




    반응형

    댓글

    Designed by JB FACTORY