반응형

0. 들어가기 전

 

프로덕션과 테스트 환경에서 다른 DB를 연동해야하는 기능 요구사항이 있었다.

 

그래서, 스프링에서 프로덕션과 테스트 환경에 따라 다른 구성을 어떻게 하면 할 수 있는지 여러 방법을 알아보고자 한다!


1. 테스트용 properties 만들기

 

아주 간단하게 분리하는 방법은, application.properties 파일을 test 패키지 아래에 만드는 것이다.

테스트 properties 생성

main/resources 아래에 application.properties는 기본으로 생성되어 있다.

프로덕션 properties와 마찬가지로, test/resources 아래에 application.properties를 생성해주면

간단하게 프로덕션 환경과 테스트 환경을 분리할 수 있다.

 

실제로 미션에서 application.properties를 main, test로 분리해서 생성하여 요구 사항을 만족했다.

 

✅ main/resources의 application.properties


      
spring.datasource.url=jdbc:mysql://localhost:13306/subway-path
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=user
spring.datasource.password=password

 

✅ test/resources의 application.properties


      
spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:testdb;MODE=MySQL
spring.datasource.driver-class-name=org.h2.Driver

 

이를 통해 프로덕션 DB는 로컬에 저장될 수 있게 하고,

테스트 환경 DB는 인메모리로 동작하도록 설정할 수 있었다.


2-1. 환경 프로필 설정하기

1번 방법처럼 application-properties를 main, test 패키지에 다르게 생성하여 분리할 수도 있지만

패키지를 분리하여 application-properties를 생성하지 않고 프로필을 설정해서 분리할 수 있다.

 

🎯1. @Profile 사용하여 환경 프로필 설정

 

✅ prod 환경 DataSource Bean 설정


      
@Profile("prod")
@Configuration
public class ProductionDbConfig {
@Bean
public DataSource dataSource() {
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl("jdbc:h2:mem:localdb;MODE=MySQL");
dataSource.setUsername("sa");
dataSource.setPassword("password");
return dataSource;
}
}

 

✅ test 환경 DataSource Bean 설정


      
@Profile("test")
@Configuration
public class TestDbConfig {
@Bean
public DataSource dataSource() {
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl("jdbc:h2:mem:testdb;MODE=MySQL");
dataSource.setUsername("sa");
dataSource.setPassword("password");
return dataSource;
}
}

 

이렇게 코드 단에서 설정 클래스를 생성하고, @Profile을 통해 프로필을 설정할 수 있다.

 

 

🎯2. application-{profile}.properties 파일을 생성하여 환경 프로필 설정

application.properties를 생성할 때,

application-{profile}.properties 네이밍으로 생성한다면

해당 파일이 환경 프로필 설정파일이 되고, {} 안의 네이밍이 프로필 이름이 된다.

이런 식으로 properties 파일을 생성하게 된다면, 'prod', 'test' 프로필이 생성된다.

해당 properties 안에 DB 설정을 다르게 해주면 될 것이다.


2-2. 생성한 프로필 활성화하기

이렇게 위의 방법으로 프로필을 생성한 후에, 프로필을 활성화해서 사용하면 된다.

 

프로필을 활성화하는 방법은 테스트 단과 프로덕션 단이 다르다.

 

 

🎯 1. 프로덕션 단에서 프로필 활성화하기

여러 활성화 방법이 있지만, 알아본 2가지를 소개하도록 하겠다!

 

✅ Command Line Argument로 활성화

IntelliJ에서 실행 버튼 쪽의 설정을 보면 Edit Configurations로 커맨드 인자 설정을 할 수 있다.

 

해당 설정으로 들어가면, Active profiles라는 설정 칸에 설정해놓은 Profile으로 활성화 할 수 있다.

 

 

✅ application-properties에서 프로필 활성화

application-properties에서 다음과 같이 spring.profiles.active에 활성화할 프로필을 적어주면 활성화된다.


      
spring.profiles.active=test

 

 

🎯 2. 테스트 단에서 프로필 활성화하기

 

테스트 단에서는 @ActiveProfiles로 설정한 프로필을 활성화할 수 있다.

따라서, 테스트에서 선택적으로 Spring Context를 다르게 변경할 수 있다.

 

테스트 환경 프로필로 설정하여 돌린 결과는 다음과 같다.


      
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles("test")
public class ProfileTest {
@Autowired
private DataSource dataSource;
@Test
void profileTest() throws SQLException {
System.out.println(dataSource.getConnection());
}
}

이때, 테스트 프로필에서 설정한 URL인 testdb가 나온 것을 알 수 있다.

 

반응형
BE_성하