0. 들어가기 전
프로덕션과 테스트 환경에서 다른 DB를 연동해야하는 기능 요구사항이 있었다.
그래서, 스프링에서 프로덕션과 테스트 환경에 따라 다른 구성을 어떻게 하면 할 수 있는지 여러 방법을 알아보고자 한다!
1. 테스트용 properties 만들기
아주 간단하게 분리하는 방법은, application.properties 파일을 test 패키지 아래에 만드는 것이다.
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가 나온 것을 알 수 있다.
'Spring > 기타' 카테고리의 다른 글
[인증/인가] 쿠키 VS 세션 VS 토큰 (JWT) 방식 중 무엇을 사용할까? (5) | 2023.08.13 |
---|---|
[IntelliJ] 인텔리제이에서 .http로 HTTP 요청 보내기 (0) | 2023.05.14 |
[Spring] @SpringBootTest에서 환경이 다른 여러 테스트 실행 시 DDL을 여러번 실행하는 오류 트러블 슈팅하기 (6) | 2023.04.29 |
[Spring] @ResponseBody VS ResponseEntity<T> : 무엇을 사용할까? (1) | 2023.04.16 |
[Spring] JdbcTemplate 스프링 빈은 어떻게 자동으로 등록될까?(feat.DataSource) (4) | 2023.04.16 |