-
Spring Boot 독립된 test DB 구성 (MySQL, H2)백엔드 2023. 9. 15. 20:17728x90반응형SMALL
현재 MySQL을 이용해 프로젝트를 구성하고 있습니다. 또한, 테스트를 계속 진행할 예정이기 때문에 테스트에는 h2 DB를 활용해보려고 시도해보았습니다.
서버 실행할 때와 테스트를 실행할 때 다른 DB 환경에서 구동할 수 있도록 설정하는 과정에 대해 글을 남겨보도록 하겠습니다.
환경
application.yml
spring: jpa: show-sql: true properties: hibernate: format_sql: true generate-ddl: true hibernate: ddl-auto: validate datasource: url: <jdbc mysql url> username: <username> password: <password> server: port: 8080
현재 DB로 mysql을 연결해서 사용하고 있는 상태입니다.
이 환경에 테스트를 할 때에는 h2 DB를 활용하도록 변경해보도록 하겠습니다.
profile
profile은 활성화됐을 때 컨테이너에 등록된 빈 정의들의 논리적인 묶음입니다. 배포 환경이나 개발 환경에 따라 DataSource가 달라져야 하는데, 이런 환경을 미리 등록해서 쉽게 필요한 설정들을 바꿀 수 있게 해줍니다.
application.yml 파일에서 profile을 구분해서 설정을 할 수 있습니다.
만약, 배포 환경과 테스트 환경을 구분해서 설정해주고 싶다면 한 application.yml안에서 구분선을 통해 각 설정을 분리해주고 spring.config.activate.on-profile에 어떤 profile인지 설정해주면 됩니다.
예시)
// 배포 환경 spring: config: activate: on-profile: prod ... --- // 테스트 환경 spring: config: activate: on-profile: test ...
--- 를 통해 profile마다 구분을 해줄 수 있습니다.
그리고 가장 위에 spring.profiles.active 를 통해 서버 구동 시 어떤 profile을 active해서 사용할 것인지 지정해 줄 수 있습니다.
spring: profiles: active: prod
이와 같이 설정되어 있다면 prod profile을 사용하겠다는 뜻입니다.
profile을 통해 mysql을 활용하는 local 환경과 h2 DB를 활용하는 test 환경을 구분해주었습니다.
spring: profiles: active: local --- spring: config: activate: on-profile: local jpa: show-sql: true properties: hibernate: format_sql: true generate-ddl: true hibernate: ddl-auto: validate datasource: url: <jdbc mysql url> username: <username> password: <password> server: port: 8080 --- spring: config: activate: on-profile: test h2: console: enabled: true jpa: show-sql: true generate-ddl: true hibernate: ddl-auto: create-drop properties: hibernate: format_sql: true dialect: org.hibernate.dialect.H2Dialect globally_quoted_identifiers: true datasource: driver-class-name: org.h2.Driver url: jdbc:h2:mem:testdb;MODE=MySQL;DATABASE_TO_UPPER=false username: hbs password:
H2 SQL 문법을 MySQL 문법으로 변경해서 사용하기 위해 MODE=MySQL을 추가해주었습니다.
@ActiveProfiles
테스트의 ApplicationContext에게 어떤 프로필을 사용할 것인지 정해주는 어노테이션입니다.
H2Test
@SpringBootTest @ActiveProfiles("test") public class H2Test{}
test profile을 사용하는 테스트 클래스를 선언해줍니다. H2Test 클래스는 테스트 시 H2 DB를 활용하도록 되어있습니다. 다른 테스트 클래스에서 이를 상속 받아 사용하면 H2 DB를 활용한 테스트 환경을 조성할 수 있습니다.
public class userRepositoryTest extends H2Test{ @Test void test(){ ... } }
+ @Profile
프로필을 구분해서 해당 프로필일 경우 빈을 로드할 수 있도록 해줍니다.
@Profile("prod") @Configuration public class TestConfiguration{ @Bean public String hello(){ return "this is prod profile"; } }
위의 hello는 prod 환경에서만 빈으로 등록이 됩니다.
+ 파일 이름으로 profile 구분
application-{profile명}.yml 파일 이름에 profile 명을 붙여서 profile을 구분할 수 있습니다.
application.yml 상에서 서버 구동 시 활용할 profile 환경에 대한 정의를 해주고 각 application-{profile명}.yml마다 환경에 대한 설정을 해주면 됩니다.
파일명으로 profile 구분 오늘은 독립적인 H2 DB 테스트 환경을 구축했습니다. 위와 같이 local과 test환경을 구분했을 경우 다음과 같은 장점과 단점이 있을 수 있습니다.
장점
- 외부의 영향이 없는 독립적인 테스트 환경을 만들 수 있습니다.
- 테스트 데이터의 구성을 마음대로 할 수 있습니다.
- 테스트 수행 후 롤백에 대한 부담이 없습니다.
- 임베디드 DB의 활용으로 빠르게 실행 가능합니다.
단점
- 항상 스키마를 초기화해서 사용해야 합니다.
- 실제 쿼리 수행이 정확하지 않을 수 있습니다. (MySQL -> h2)
단점이 존재하는 환경이긴 하지만, 외부 DB와의 연결 문제가 없고 테스트 데이터를 구성하기 간편하도록 테스트 환경을 만들었다는 것에 만족할 수 있었던 것 같습니다.
출처 : https://taes-k.github.io/2021/04/05/spring-test-isolation-datasource/
Spring H2를 이용한 독립 테스트환경 구축
독립된 테스트 전용 DB 구성의 필요성 통합테스트 혹은 DB 데이터를 사용하는 테스트를 수행할때, 개발환경 전용 DB를 사용한다 하더라도 아래와 같은 문제가 발생 할 수 있습니다. 여러 개발자들
taes-k.github.io
반응형LIST'백엔드' 카테고리의 다른 글
Gradle이란? (0) 2023.09.21 Spring swagger 적용 방법 (springdoc-openapi) (0) 2023.09.18 Rest Template으로 Server(Client) to Server 통신하기 (0) 2023.09.15 Spring filter, interceptor (0) 2023.09.14 Spring Validation (0) 2023.09.13