Profile로 자유롭게 DataSource 선택하기

POII·2023년 5월 22일
1

Java

목록 보기
5/7
post-thumbnail

학습 계기

리뷰어 분이 밑과 같은 리뷰를 남겨주셨고,
@Profile 어노테이션 달면 당연히 되겠지 라는 생각으로 시도해봤는데 예상과는 전혀 다르게 동작했습니다.
이 기회에 찾아보자는 생각으로 공부해보았습니다.

h2와 mysql을 profile 을 통해서 설정할 수 있게끔 변경 한 번 해주세요!

@Profile은 Bean들을 다양한 프로필에 매핑할 수 있게 해주는 기능입니다.

Bean 에 @Profile 적용하기

특정 구현체는 실제 프로덕션 환경에서만 사용하고, 그렇지 않은 경우 사용하는 구현체는 따로 존재한다고 가정해보겠습니다.

프로덕션 환경에서 사용하는 빈은 다음과 같이 prod 프로필에 매핑할 수 있습니다.

@Component
@Profile("prod")
public class ProdDatasourceConfig

나머지 환경에서 사용하는 빈은 다음과 같이 prod 프로필에서 제외시켜줄 수 있습니다.

@Component
@Profile("!prod")
public class DevDatasourceConfig

특정 프로필 활성화하기

WebApplicationInitializer 상속하여 활성화 하기

웹 어플리케이션이라면 WebApplciationInitializer 을 상속한 클래스를 다음과 같이 구현하여 특정 프로필을 활성화시킬 수 있습니다.

@Configuration
public class MyWebApplicationInitializer 
  implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
 
        servletContext.setInitParameter(
          "spring.profiles.active", "prod");
    }
}

ConfigurableEnvironment 이용하기

다음과 같이 ConfigurableEnviromentsetActiveProfiles 메서드를 활용해 프로필을 활성화시킬 수 있습니다.

@Autowired
private ConfigurableEnvironment env;
...
env.setActiveProfiles("prod");
  • ConfigurableEnvironment란? 스프링 프레임워크의 여러 속성들을 관리하기 위해 만들어진 인터페이스.

JVM System Parameter 이용하기

JVM system parameter에 다음과 같은 구문을 추가하여 프로필을 활성화 시킬 수 있습니다.

-Dspring.profiles.active=prod

환경변수 이용하기

유닉스 환경이라면 환경변수를 다음과 같이 설정하여 프로필을 활성화 시킬 수 있습니다.

export spring_profiles_active=prod

@ActiveProfile 어노테이션 이용하기

테스트 클래스라면 @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

스프링 부트에서 Profile 사용

application.yml 의 밑의 설정을 통해 활성화 할 프로필을 설정할 수 있습니다.

spring:
  profiles:
    active: mysql

Profile 설정으로 dataSource 지정하기

--- 을 구분자로 사용하여 여러 프로필을 한 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
profile
https://github.com/poi1649/learning

0개의 댓글