현재 프로젝트에서는 H2를 사용해서 테스트를 구동하고 있다. 다만 여기서 문제는 배포, 빌드 환경에서도 H2를 사용하고 있다는 것이다.
나는 빌드 & 배포에서는 MySQL을 사용하고 테스트 환경에서는 H2를 사용할 계획이다.
따라서 DB 환경을 분리해야 한다.
우선 pom.xml부터 수정해야 한다.
현재 h2의 범위는 runtime이기 때문에 이를 test 범위로 바꾸고 mysql-connector-java 스코프를 바꿔준다.
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
기본적인 DB 접속 정보는 application.yml에 저장한다.
그러면 spring에서 자동으로 이를 불러와 연결시켜준다.
따라서 application.yml에 다음과 같이 정보를 저장한다.
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql:""
username: ""
password: ""
jpa:
hibernate:
ddl-auto: create
위 설정만 하면 테스트 환경에서도 mysql을 연결한다.
왜냐하면 아래의 코드를 보면 알 수 있다.
테스트 코드에서 사용하는 테스트는 SpringBootTest이다.
이 어노테이션은 Springboot서버를 실행시켜서 테스트를 하기 때문에 기본적인 application.yml 세팅 정보를 가져온다.
따라서 별도의 test yml을 정의해주지 않으면 빌드 환경의 DB 세팅이 불러와진다.
테스트 하위 폴더에 resource 파일을 만들고 application-test.yml파일을 작성한다.
// application-test.yml
spring:
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:mem:testdb
hikari:
jdbc-url: jdbc:h2:mem:testdb
username: root
password:
jpa:
hibernate:
ddl-auto: create
properties:
hibernate:
dialect : org.hibernate.dialect.H2Dialect
이러면 기본 application.yml이 로딩되고 그 위에 application-test.yml 파일이 덮어씌워진다.
따라서 test & build에서 공통적으로 사용하는 세팅은 application.yml에 저장하고 테스트 환경에서만 사용할 설정은 application.yml에 세팅해서 DB 환경을 분리할 수 있다.
테스트 코드에서 application-test.yml을 사용하기 위해선 별도의 설정을 해줘야 한다.
사용하는 어노테이션은 ActiveProfiles이고 이 어노테이션은 application-""에 들어가는 문자열로 매핑시켜줄 수 있다.
따라서 각 테스트 코드마다 ActiveProfiles("test") 어노테이션을 추가해준다.
@SpringBootTest
@AutoConfigureMockMvc
@ActiveProfiles("test")
public class EventControllerTest {
...
}