[Spring] 프로필과 프로퍼티 파일

첫걸음 - 17

Posted by owin2828 on 2019-12-30 17:05 · 6 mins read

1. 프로필


개발 목적 설정과 실 서비스 복적의 설정을 구분해서 작성하는 방법으로 스프링이 제공하는 기능

1-1. @Configuration 설정에서 프로필 변경하기

  • @Configuration 어노테이션을 이용한 설정에서 프로필을 지정하려면, 다음처럼 @Profile 어노테이션을 사용
      // DsDevConfig.java
      @Configuration
      @Profile("dev")
      public class DsDevConfig {
    
          @Bean(destroyMethod = "close")
          public DataSource dataSource() {
              ...
          }
      }
    
      // DsRealConfig.java
      @Configuration
      @Profile("real")
      public class DsRealConfig {
    
          @Bean(destroyMethod = "close")
          public DataSource dataSource() {
              ...
          }
      }
    
  • 앞선 코드의 두 클래스는 모두 이름이 “dataSource()”인 Bean을 설정
  • 두 Bean중 어떤 빈을 사용할지는 활성화한 프로필에 따라 달라짐
  • 특정 프로필을 선택하기 위해 컨테이너 초기화전, setActivateProfiles() 매서드를 사용
    // MainProfile.java
    public class MainProfile {
    
      public static void main(String[] args) {
          AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
                  // 어떤 프로필을 사용할지 선택함
          context.getEnvironment().setActiveProfiles("dev");
          ...
      }
    }
    

    두 개 이상의 프로필은 다음과 같이 활성화
    context.getEnvironment().setActivateProfiles(“dev”, “mysql”);

  • 위와 같은 방법을 거치지 않고도, 다음과 같은 2가지 방법에 의해 프로필 설정 가능
    • spring.profiles.active 시스템 프로퍼티에 사용할 프로필 값 지정
    • OS의 spring.profiles.active 환경 변수에 값을 설정

      프로필의 우선 순위는 다음과 같다.

      1. setActiveProfiles()
      2. 자바 시스템 프로퍼티
      3. OS 환경 변수

1-2. @Configuration을 이용한 프로필 설정

  • 중첩 클래스를 이용해 프로필 설정을 한 파일에 모을 수 있음
      // MemberConfigWithProfile.java
      @Configuration
      @EnableTransactionManagement
      public class MemberConfigWithProfile {
          ...
              // 같은 이름의 Bean을 등록하는 두 클래스를 다른 프로필로 설정  
          @Configuration
          @Profile("dev")
          public static class DsDevConfig {
    
              @Bean(destroyMethod = "close")
              public DataSource dataSource() {
                  ...
              }
          }
    
          @Configuration
          @Profile("real")
          public static class DsRealConfig {
    
              @Bean(destroyMethod = "close")
              public DataSource dataSource() {
                  ...
              }
          }
    
      }
    

    위와 같은 방법으로 중첩 클래스를 설정할 경우, 반드시 static으로 클래스를 선언해야 함

1-3. 다수 프로필 설정

  • 스프링 설정은 두 개 이상프로필 이름을 가질 수 있음
      @Configuration
      @Profile("real,test")
      public class DataSourceJndiConfig{
          ...
    
  • 프로필 값을 지정할 때 다음 코드처럼 느낌표(!) 사용 가능
      @Configuration
      @Profile("!real") // 프로필이 "dev", "real" 두 개만 있다면 해당 코드는 @Profile("dev")와 동일한 코드
      public class DsDevConfig {
          ...
    

    보통 특정 프로필이 사용되지 않을 때, 기본으로 사용할 설정을 지정하는 용도로 사용

1-4. 어플리케이션에서 프로필 설정하기

  • web.xml에서 다음과 같이 spring.profiles.active 초기화 파라미터를 이용해 프로필을 선택 가능
      <!-- web.xml -->
      ...
          <init-param>
                  <param-name>spring.profiles.active</param-name>
                  <param-value>dev</param-value>
          </init-param>
      ...
    


2. 프로퍼티 파일을 이용한 프로퍼티 설정


스프링은 외부의 프로퍼티 파일을 이용해 스프링 Bean을 설정하는 방법을 제공

    # db.properties
    db.driver=com.mysql.jdbc.Driver
    db.url=jdbc:mysql://localhost/spring5fs?characterEncoding=utf8
    db.user=spring5
    db.password=spring5

위 파일의 프로퍼티 값을 자바 설정에서 사용가능

2-1. @Configuration 어노티에션 이용 자바 설정에서의 프로퍼티 사용

  • 자바 설정에서 프로퍼티 파일을 사용하려면 다음 두 가지를 설정
    • PropertySourcePlacholderConfigurer Bean 설정
    • @Value 어노테이션으로 프로퍼티 값 설정
      // PropertyConfig.java
      @Configuration
      public class PropertyConfig {
    
          @Bean
          public static PropertySourcesPlaceholderConfigurer properties() {
              PropertySourcesPlaceholderConfigurer configurer = 
                          new PropertySourcesPlaceholderConfigurer();
              configurer.setLocations(
                      new ClassPathResource("db.properties"),
                      new ClassPathResource("info.properties"));
              return configurer;
          }
    
      }  
    

    PropertySourcesPlaceholderConfigurer 타입의 Bean을 설정하는 매서드는 반드시 static으로 선언해야 함

      // DsConfigWithProp
      @Configuration
      public class DsConfigWithProp {
          @Value("${db.driver}")
          private String driver;
          @Value("${db.url}")
          private String jdbcUrl;
          @Value("${db.user}")
          private String user;
          @Value("${db.password}")
          private String password;
          ...
    
  • @Value 어노테이션은 ${구분자} 형식의 플레이스홀더를 값으로 가짐
  • 이 경우, PropertySourcesPlaceholderConfigurer는 일치하는 프로퍼티 값으로 치환