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