ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JPA Entity 생성시 Table Character set - UTF8 미설정 이슈
    백엔드/Spring 2022. 8. 11. 02:20

    🚀 들어가며

    • JPA의 ddl-auto로 생성된 테이블의 Charset이 서버에서 설정해준 인코딩인 utf8과 달랐다.
    • 사실 테스트가 아닌 이상.. ddl-auto로 생성된 ddl을 사용하지 않으면 되는 일이지만 , 이런 이슈가 익숙하지 않기 때문에 기록하는 글이다.
      (보통 ddl-auto에서 생성된 DDL문을 사용하지 않고, 어느 정도 수정하여 수동으로 테이블들을 생성한다)

    JPA DDL을 통한 테이블 생성 쿼리

    create table TBL_CATEGORY (
           id bigint not null auto_increment,
            createdDate datetime(6),
            modifiedDate datetime(6),
            category_name VARCHAR(255) not null,
            parent_id bigint not null,
            use_yn CHAR(1) DEFAULT 'Y' not null,
            primary key (id)
        ) engine=InnoDB;

    원래라면 아래처럼 되어야 합니다.

    create table TBL_CATEGORY (
           id bigint not null auto_increment,
            createdDate datetime(6),
            modifiedDate datetime(6),
            category_name VARCHAR(255) not null,
            parent_id bigint not null,
            use_yn CHAR(1) DEFAULT 'Y' not null,
            primary key (id)
        ) engine=InnoDB DEFAULT CHARSET=uft8;

    데이터베이스 서버 확인

    MariaDB [(none)]> status
    --------------
    ...
    
    Server characterset:    utf8
    Db     characterset:    utf8
    Client characterset:    utf8
    Conn.  characterset:    utf8
    
    ...
    --------------

    데이터베이스 서버를 확인해보니까, 딱히 문제가 없었다.
    오히려 JPA에서 인코딩을 바라보지 않는 기분이였다.


    JPA 단에서 제공하지 않는 것으로 판단한다. (JPA 이슈)

    💢 JPA 생성된 DDL은 MariaDB를 어떤 값으로 주든 latin1으로 들어간다.
    즉 한글은 안된다는 뜻이다.
    그렇기 때문에 일일이 utf8 인코딩으로 바꿔줘야 한다.

    # Table character set
    show create table {TABLE_NAME};
    
    # Alter table character set
    alter table {TABLE_NAME} default character set = utf8;
    
    # Column character set
    show full columns from {TABLE_NAME};
    
    # Alter columns character set
    alter table {TABLE_NAME} modify column {COLUMN_NAME} varchar(20) character set utf8 collate utf8_general_ci;

    해결방법

    소스단에서는 한글이 들어가게 되면, columnDefinition을 통해서 “컬럼만이라도” charset 설정을 강제로 하도록 진행합니다.

    @Column(name = "category_name", nullable = false, columnDefinition = "VARCHAR(255) CHARACTER SET UTF8")
    private String category_name;

    변경된 DDL

    create table TBL_CATEGORY (
           id bigint not null auto_increment,
            createdDate datetime(6),
            modifiedDate datetime(6),
            category_name VARCHAR(255) character set utf8 not null,
            parent_id bigint not null,
            use_yn CHAR(1) DEFAULT 'Y' not null,
            primary key (id)
        ) engine=InnoDB;

    결론

    • JPA에서 ddl을 통해서 한글이 입력되는 컬럼은 columnDefination으로 utf8 지정해줘야 한다.
    • 이는 JPA의 오류이며, 어찌보면 한계라는 생각이든다. (로컬 개발은 H2를 사용하자)
    • 하지만 실제 운영이나, 추후 어느 정도 개발이 완료된 시점에는 JPA에서 AUTO-DDL을 처리하지 말고 NONE으로 변경한다. 만일 DDL이 필요한 경우, DDL 추출이후 수정 작업이 필요하다. (당연지사)
    반응형
Designed by Tistory.