🚀 들어가며
- 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 |
댓글