Spring에 MySQL을 연동하려면 다음과 같은 순서로 진행한다.
MySQL
에 데이터베이스 생성build.gradle
에 의존성 설정application.properties
에MySQL
관련 설정 추가
테스트 환경에 MySQL 연동하는 방법과 이때 발생할 수 있는 오류에 대해서도 정리해보았다.
MySQL
에 데이터베이스 생성build.gradle
에 의존성 설정build.gradle
에 의존성을 추가한다.dependencies {
implementation 'mysql:mysql-connector-java:8.0.28'
}
❗️중요:
- 의존성을 추가할 때 꼭 버전을 명시해주어야 한다.
- 버전을 명시하지 않으면
application.properties
에MySQL
설정을 추가할 때 다음과 같이 빨간색으로 뜨며 인식을 하지 못한다.
- 일반적으로는 버전을 명시하지 않아도 Spring Boot가 맞는 버전을 주입해주지만 MySQL 공식 문서를 참고하면
8.0
버전부터 드라이버 이름이 변경되었는데 변경되면서 발생한 버그가 아닐까 추측한다.
- "MySQL Connector/J has changed from
com.mysql.jdbc.Driver
tocom.mysql.cj.jdbc.Driver
application.properties
에 MySQL
관련 설정 추가application.properties
에 MySQL
관련 설정을 추가한다.datasource.url
에는 밑에를 참고하되, IP, PORT, DB 이름은 1번 과정에서 설정한 내용으로 수정이 필요하다.username
, password
도 마찬가지이다. username
은 root
다.# MySQL Config
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver // 이거는 똑같이 적어야 한다.
spring.datasource.url=jdbc:mysql://localhost:3306/test_log?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
spring.datasource.username=
spring.datasource.password=
💡 참고:
- MySQL에 Seoul 타임존을 인식하지 못하는 오류가 있는 듯 하다.
- 필요 시, 다른 블로그에서 해결 방법 확인 바란다.
- [MySQL] mysql server timezone 한국으로 설정하기.
- MySQL 타임존 에러 - The server time zone value 'KST' is unrecognized
test
디렉토리에 있는 application.properties
에 똑같이 설정을 해주면 된다.결론부터 말하자면,
@JdbcTest
@DataJpaTest
등 어노테이션 옵션에@AutoConfigureTestDatabase
이 붙은 테스트를 한다면 발생할 수 있는 오류이다.
@AutoConfigureTestDatabase
의 디폴트 설정은embedded in-memory database
를 사용하는 것이기 때문에 MySQL과 같이 물리적인 데이터베이스를 사용할 경우 설정을 다음과 같이 바꿔줘야 한다.@JdbcTest @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) class Test { }
DataSource
스프링 빈을 생성할 수 없고, embedded database
를 찾을 수가 없다는 내용이다.Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path
...생략
Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0;
...생략
Error creating bean with name 'dataSource': Invocation of init method failed;
...생략
Failed to replace DataSource with an embedded database for tests.
If you want an embedded database please put a supported one on the classpath or tune the replace attribute of @AutoConfigureTestDatabase.
@JdbcTest
동작 원리@JdbcTest
를 사용했다. @AutoConfigureTestDatabase
도 있다.override
할 수 있다고 한다./**
They also use an embedded in-memory database
(replacing any explicit or usually auto-configured DataSource).
The @AutoConfigureTestDatabase annotation can be used to `override` these settings.
*/
💡 참고:
- Spring 공식문서에서 자바 환경에서 자주 쓰는 In-Memory 데이터베이스와 환경 설정 내용을 확인할 수 있다.
- Spring
EmbeddedDatabaseConnection
에서 인식할 수 있는 embedded DB는 다음과 같다.
- H2 Database
- HSQLDB
- Apache Derby Database
@AutoConfigureTestDatabase
설정 변경@AutoConfigureTestDatabase
설정을 변경하여 embedded in-memory database
를 사용하지 않고 application.properties
에 설정한 데이터베이스를 사용하도록 한다.@JdbcTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class Test {
}