[Spring] MySQL 연동 - Production, Test 환경

Jinny·2023년 4월 20일
0

Spring

목록 보기
4/10
post-custom-banner

Spring에 MySQL을 연동하려면 다음과 같은 순서로 진행한다.

  1. MySQL에 데이터베이스 생성
  2. build.gradle에 의존성 설정
  3. application.propertiesMySQL 관련 설정 추가

테스트 환경에 MySQL 연동하는 방법과 이때 발생할 수 있는 오류에 대해서도 정리해보았다.


1. MySQL에 데이터베이스 생성

  • 1번 과정은 블로그에 이전에 작성해둔 내용이 있으니 밑에 적어둔 기존 글을 참고 바란다.
  • 참고로 MySQL은 로컬에도 설치가 가능하지만 docker에 설치하는 것을 추천한다.
    이유에 대해서는 따로 찾아보길 바란다.

2. build.gradle에 의존성 설정

  • 다음과 같이 build.gradle에 의존성을 추가한다.
dependencies {
	implementation 'mysql:mysql-connector-java:8.0.28'
}

❗️중요:

  • 의존성을 추가할 때 꼭 버전을 명시해주어야 한다.
  • 버전을 명시하지 않으면 application.propertiesMySQL 설정을 추가할 때 다음과 같이 빨간색으로 뜨며 인식을 하지 못한다.

  • 일반적으로는 버전을 명시하지 않아도 Spring Boot가 맞는 버전을 주입해주지만 MySQL 공식 문서를 참고하면 8.0 버전부터 드라이버 이름이 변경되었는데 변경되면서 발생한 버그가 아닐까 추측한다.
    • "MySQL Connector/J has changed from com.mysql.jdbc.Driver to com.mysql.cj.jdbc.Driver

3. application.propertiesMySQL 관련 설정 추가

  • 다음과 같이 application.propertiesMySQL 관련 설정을 추가한다.
  • datasource.url에는 밑에를 참고하되, IP, PORT, DB 이름은 1번 과정에서 설정한 내용으로 수정이 필요하다.
  • username, password도 마찬가지이다.
    • 별도로 사용자를 추가하지 않았다면 usernameroot다.
# 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 연동하기

  • 테스트 환경에 MySQL을 연동하는 방법은 위와 같다.
  • 테스트용 DB를 생성한 후 test 디렉토리에 있는 application.properties에 똑같이 설정을 해주면 된다.
  • 다만 이렇게 설정하고 테스트를 돌리면 오류가 발생할 수 있다.
  • 오류가 발생했다면 밑에 내용을 참고 바란다.

결론부터 말하자면, @JdbcTest @DataJpaTest 등 어노테이션 옵션에 @AutoConfigureTestDatabase이 붙은 테스트를 한다면 발생할 수 있는 오류이다.
@AutoConfigureTestDatabase의 디폴트 설정은 embedded in-memory database를 사용하는 것이기 때문에 MySQL과 같이 물리적인 데이터베이스를 사용할 경우 설정을 다음과 같이 바꿔줘야 한다.

@JdbcTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class Test {
}

테스트 환경에서 MySQL 연동 시 오류가 발생하는 이유

  • 테스트를 돌리면 아마 다음과 같은 오류가 발생할 것이다.

  • 내용을 요약해보면 다음과 같다.
    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도 있다.

  • 주석을 읽어보면 해당 어노테이션은 디폴트로 in-memory database를 사용하는 것을 알 수 있다.
  • 그리고 설정을 override 할 수 있다고 한다.
  • MySQL은 물리적인 데이터베이스를 사용하기 때문에 당연히 오류가 발생할 수 밖에 없는 것이다.
/**
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 {
}

profile
블로그 이사갔어요. https://jinny-l.tistory.com/
post-custom-banner

0개의 댓글