-
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;
- 참고한 글
- 검색 키워드 : JPA DDL Character SET
- https://yonguri.tistory.com/113
- JPA MariaDB character SET 오류
해결방법
소스단에서는 한글이 들어가게 되면, 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 추출이후 수정 작업이 필요하다. (당연지사)
반응형'백엔드 > Spring' 카테고리의 다른 글
[Java] Bean Validation에 대해서 알아보자 (JSR-303, JSR-380, 파라미터 유효성 체크) (0) 2022.11.06 [Spring] Springboot Properties 설정파일을 외부에서 가져오자 (0) 2022.08.11 [Spring] RestTemplate을 편리하게 사용하자 (샘플 포함) (2) 2022.06.12 [Spring] 인텔리제이에서 Mybatis Generator 사용하는 법 (0) 2022.06.12