1. 내장 데이터베이스 (H2) 와 연동되는 문제
나는 Spring boot와 MySQL을 연동하고 싶어서, application.yml에 MySQL 접속 정보를 야무지게 등록해두었다.
[appliction.yml]
spring:
datasource:
url: jdbc:mysql://서버/디비?serverTimezone=UTC&characterEncoding=UTF-8
username: 유저
password: 패스워드
driver-class-name: com.mysql.cj.jdbc.Driver
그러나 정작 JPARepository.save()를 하고자하니 자꾸 아래와 같은 에러가 발생하였다.
내 DB의 account 테이블과 스프링부트의 Account 엔티티는 accessToken 이라는 컬럼/필드를 갖고 있었는데, 이상하게도 hibernate 는d엉뚱하게 account_token 에 접근하려고 하고 있었다.
아마 내장 H2 DB에 접근하고 있는 것 같아, MySQL과 바로 이어줄 방안을 찾았다.
application.yml에 관련 설정을 추가해주는 것으로 쉽게 해결되었다.
[application.yml]
spring:
datasource:
url: jdbc:mysql://서버:포트/디비?serverTimezone=UTC&characterEncoding=UTF-8
username: 유저네임
password: 패스워드
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
database: mysql
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
generate-ddl: true
show-sql: true
jpa 에서 바로 mysql 을 찾아가도록 설정하는 것이라고 한다.
(자세한건 추후 추가)
2. 한글 인코딩 문제
MySQL에 연결시킨 후 save를 다시 시도하니 다음과 같은 에러가 발생하였다.
척봐도 인코딩 때문에 한글이 깨진 문제라 DB 인코딩을 utf8로 바꿔주기 위해 /etc/mysql/my.cnf 파일을 다음과 같이 수정해주었다.
[/etc/mysql/my.cnf]
## ... ##
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
# 다음 설정들 추가
[mysqld]
collation-server = utf8_unicode_ci
character-set-server = utf8
skip-character-set-client-handshake
수정 후, sudo systemctl restart mysql 을 통해 mysql 을 재실행해준다.
재실행된 mysql의 인코딩 정보를 확인해보면 다음과 같다.
mysql> status
--------------
mysql Ver 14.14 Distrib 5.7.31, for Linux (x86_64) using EditLine wrapper
// ... 중략 ...
// 이 아래의 캐릭터셋 4개가 전부 utf8로 변경되면 된다.
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /var/run/mysqld/mysqld.sock
Uptime: 56 min 6 sec
Threads: 13 Questions: 546 Slow queries: 0 Opens: 209 Flush tables: 1 Open tables: 183 Queries per second avg: 0.162
Spring boot 에 CharacterEncodingFilter 도 등록해주었다.
[Application.java]
@SpringBootApplication
public class ExcaliburApplication {
public static void main(String[] args) {
SpringApplication.run(ExcaliburApplication.class, args);
}
// Filter 등록
@Bean
public Filter characterEncodingFilter() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
return characterEncodingFilter;
}
}
그래도 동일 에러가 반복되어 찾아보니, 이미 만들어진 Table 들은 기존의 mysql 인코딩(default: latin1)으로 되어있어, 따로 바꾸어주어야 한다고 한다.
다음 명령어로 모두 바꾸어주면 된다.
SHOW CREATE TABLE 테이블명; // 해당 테이블의 정보를 확인한다.
ALTER TABLE 테이블명 CONVERT TO character SET utf8; // 해당 테이블의 캐릭터셋을 utf8로 변경한다.
'TIL' 카테고리의 다른 글
[TIL] 시간 복잡도와 알고리즘 문제 풀기 (0) | 2020.10.28 |
---|---|
[TIL] Hibernate PK 생성 전략 (2) | 2020.10.15 |
[TIL] SOMA CAMP 1일차 - 최백준 알고리즘 (0) | 2020.10.14 |
[TIL] Docker 특강 1차시 (1) :: 개념 (0) | 2020.10.12 |