본문 바로가기
백엔드/Spring

JPA Entity 생성시 Table Character set - UTF8 미설정 이슈

by RoJae 2022. 8. 11.

🚀 들어가며

  • 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 추출이후 수정 작업이 필요하다. (당연지사)

댓글