리뷰어 분이 밑과 같은 리뷰를 남겨주셨고,
@Profile 어노테이션 달면 당연히 되겠지 라는 생각으로 시도해봤는데 예상과는 전혀 다르게 동작했습니다.
이 기회에 찾아보자는 생각으로 공부해보았습니다.
h2와 mysql을 profile 을 통해서 설정할 수 있게끔 변경 한 번 해주세요!
@Profile
은 Bean들을 다양한 프로필에 매핑할 수 있게 해주는 기능입니다.
특정 구현체는 실제 프로덕션 환경에서만 사용하고, 그렇지 않은 경우 사용하는 구현체는 따로 존재한다고 가정해보겠습니다.
프로덕션 환경에서 사용하는 빈은 다음과 같이 prod 프로필에 매핑할 수 있습니다.
@Component
@Profile("prod")
public class ProdDatasourceConfig
나머지 환경에서 사용하는 빈은 다음과 같이 prod 프로필에서 제외시켜줄 수 있습니다.
@Component
@Profile("!prod")
public class DevDatasourceConfig
웹 어플리케이션이라면 WebApplciationInitializer
을 상속한 클래스를 다음과 같이 구현하여 특정 프로필을 활성화시킬 수 있습니다.
@Configuration
public class MyWebApplicationInitializer
implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.setInitParameter(
"spring.profiles.active", "prod");
}
}
다음과 같이 ConfigurableEnviroment
의 setActiveProfiles
메서드를 활용해 프로필을 활성화시킬 수 있습니다.
@Autowired
private ConfigurableEnvironment env;
...
env.setActiveProfiles("prod");
JVM system parameter에 다음과 같은 구문을 추가하여 프로필을 활성화 시킬 수 있습니다.
-Dspring.profiles.active=prod
유닉스 환경이라면 환경변수를 다음과 같이 설정하여 프로필을 활성화 시킬 수 있습니다.
export spring_profiles_active=prod
테스트 클래스라면 @ActiveProfile
어노테이션을 클래스 위에 붙임으로 간단하게 특정 프로필을 활성화 할 수 있습니다.
Q. 그럼 등록 안한 빈은?
A. 프로필 설정을 해주지 않은 Bean은 Default 프로필에 매핑됩니다!
Q. 위 같은 다양한 방법으로 여러개 active할 Profile이 설정되면 어떤 우선순위로 적용되나요?
Profile이 active되는 우선순위는 다음과 같습니다.
1.Context parameter in web.xml
2.WebApplicationInitializer
3.JVM System parameter
4.Environment variable
5.Maven profile
application.yml 의 밑의 설정을 통해 활성화 할 프로필을 설정할 수 있습니다.
spring:
profiles:
active: mysql
--- 을 구분자로 사용하여 여러 프로필을 한 yml 파일로 관리할 수 있습니다.
이를 통해 어플리케이션의 설정을 한 곳에서 관리하고 사용할 설정을 프로필을 통해 간단하게 선택하여 사용할 수 있습니다.
밑은 mySql과 h2 를 사용하는 dataSource를 각 프로필의 빈으로 등록하고, 어떤 프로필을 사용할지 선택하는 예시입니다.
spring:
profiles:
active: prod
---
spring:
h2:
console:
enabled: true
datasource:
url: jdbc:h2:mem:testdb;MODE=MySQL
driver-class-name: org.h2.Driver
config:
activate:
on-profile: test
---
spring:
datasource:
url: jdbc:mysql://localhost:3306/subway?serverTimezone=UTC&characterEncoding=UTF-8
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
sql:
init:
schema-locations: classpath:data.sql
mode: always
config:
activate:
on-profile: prod