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.Drivertocom.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 {
}