본문 바로가기
TIL

[TIL] Spring boot - MySQL 연동 삽질

by 쏘야.yap 2020. 10. 13.
728x90

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로 변경한다.