작심십육일러의 스프링 시작하기(16)-1

서은경·2022년 10월 12일
0

Spring

목록 보기
27/43

프로필과 프로퍼티 파일

개발을 진행하는 동안에는 실제 서비스 목적으로 운영중인 DB를 이용할 수 없다. 따로 개발용 DB를 사용하거나 개발 PC에 직접 DB를 설치해서 사용한다.

@Bean(destroyMethod = "close")
public DataSource dataSource() {
	DataSource ds = new DataSource();
    ds.setDriverClassName("com.mysql.jdbc.Driver");
    ds.setUrl("jdbc:mysql://localhost/spring5fs?characterEncoding=utf8");
    ds.setUsername("spring5");
    ds.setPassword("spring5");
    ...
    return ds;
}

실 서비스 장비에 배포하기 전 설정 정보를 변경하고 배포하는 방법을 사용할 수도 있지만 이 방법은 실수하기 쉽다. 이런 실수를 방지하기 위해 처음부터 개발 목적 설정과 실 서비스 목적의 설정을 구분해서 작성하는 것이다. 이를 위한 스프링 기능이 바로 ‼️프로필‼️ 이다.

프로필은 논리적인 이름으로서 설정 집합에 프로필을 지정할 수 있다. 스프링 컨테이너는 설정 집합 중에서 지정한 이름을 사용하는 프로필을 선택하고 해당 프로필에 속한 설정을 이용해서 컨테이너를 초기화할 수 있다.

예를 들어 로컬 개발 환경을 위한 DataSource 설정을 "dev"프로필로 지정하고 실 서비스 환경을 위한 DataSource 설정을 "real"프로필로 지정한 뒤, "dev"프로필을 사용해서 스프링 컨테이너를 초기화할 수 있다. 그럼 스프링은 "dev"프로필에 정의된 빈을 사용한다.

@Configuration 설정에서 프로필 사용하기

@Configuration 어노테이션을 이용한 설정에서 프로필을 지정하려면 @Profile 어노테이션을 이용한다.

package config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.apache.tomcat.jdbc.pool.DataSource;


@Configuration
@Profile("dev")
public class DsDevConfig {

    @Bean(destroyMethod = "close")
    public DataSource dataSource() {
        DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost/spring5fs?characterEncoding=utf8");
        ds.setUsername("spring5");
        ds.setPassword("spring5");
        ds.setInitialSize(2);
        ds.setMaxActive(10);
        ds.setTestWhileIdle(true);
        ds.setMinEvictableIdleTimeMillis(60000 * 3);
        ds.setTimeBetweenEvictionRunsMillis(10 * 1000);
        return ds;
    }
}

스프링 컨테이너를 초기화할 때 "dev"프로필을 활성화하면 DsDevConfig 클래스를 설정으로 사용한다.
특정 프로필을 선택하려면 컨테이너를 초기화하기 전에 setActiveProfile() 메서드를 사용해서 프로필을 선택해야 한다.

AnnotationConfigApplicationContext context = new AnnotationConfigApplicatinoContext();
context.getEnvironment().setActiveProfiles("dev");
context.register(MemberConfig.class, DsDevConfig.class, DsRealConfig.class);
context.refresh();

getEnvironment() 메서드는 스프링 실행환경을 설정하는데 사용되는 Environment를 리턴한다. setActiveProfiles() 메서드를 사용해서 사용할 프로필을 선택할 수 있다. 위 코드는 "dev"를 값으로 주었으므로 "dev"프로필에 속한 설정이 사용된다. 따라서 DsDevConfig 클래스와 DsRealConfig 클래스에 정의되어 있는 dataSource 중 "dev"에 속하는 dataSource 빈을 사용한다.

❌ 프로필을 사용할 때 주의할 점은 설정 정보를 전달하기 전에 어떤 프로필을 사용할지 지정해야 한다는 점이다.setActiveProfiles() 메서드로 프로필을 설정하고 register() 메서드로 설정 파일 목록을 지정한다. 그런 뒤 refresh() 메서드를 실행해서 컨테이너를 초기화했다.
❌ 이 순서를 지키지 않고 프로필을 선택하기 전 설정 정보를 먼저 전달하면 프로필을 지정한 설정이 사용되지 않기 때문에 설정을 읽어오는 과정에서 빈을 찾지 못해 익셉션이 발생한다.

context.getEnvironment().setActiveProfiles("dev", "mysql");

두 개 이상의 프로필을 활성화하고 싶다면 다음과 같이 각 프로필 이름을 메서드에 파라미터로 전달한다.

java -Dspring.profiles.active=dev main.Main

또 다른 방법은 spring.profiles.active 시스템 프로퍼티에 사용할 프로필 값을 지정하는 것이다. 두 개 이상인 경우 사용할 프로필을 콤마로 구분해서 설정하면 된다. 시스템 프로퍼티는 명령행에서 -D 옵션을 이용하거나 System.setProperty();를 이용해서 지정할 수 있다. 이렇게 지정해두면 setActiveProfiles() 메서드를 사용하지 않아도 된다.

자바의 시스템 프로퍼티뿐만 아니라 OS의 spring.profiles.active 환경변수에 값을 설정해도 된다. 프로필 우선순위는 다음과 같다.

  • setActiveProfiles()
  • 자바 시스템 프로퍼티
  • OS 환경변수

@Configuration을 이용한 프로필 설정

중첩 클래스를 이용해 프로필 설정을 한 곳으로 모을 수 있다.

@Configuration
public class MemberConfigWithProfile {
	@Autowired
    private DataSource dataSource;
    
    @Bean
    public MemberDao memberDao() {
    	return new MemberDao(dataSource);
    }
    
    @Configuration
    @Profile("dev")
    public static class DsDevConfig {
    	..
    }
    
    @Configuration
    @Profile("real")
    public static class DsRealConfig {
    	..
    }
}

중첩된 @Configuration 설정을 사용할 때 주의점은 중첩 클래스는 static이어야 한다는 점이다!

다수 프로필 설정

스프링 설정은 두 개 이상의 프로필 이름을 가질 수 있다.

@Configuration
@Profile("real,test")
public class DataSourceJndiConfig {
	...

프로필 값을 지정할 때 느낌표를 사용할 수도 있다.

@Configuration
@Profile("!real")
public class DsDevConfig {
	...

!real 값은 real 프로필이 활성화되지 않을 때 사용한다는 것을 의미한다. 보통 !프로필 형식은 특정 프로필이 사용되지 않을 때 기본으로 사용할 설정을 지정하는 용도로 사용된다.

어플리케이션에서 프로필 설정하기

웹 어플리케이션의 경우에도 spring.profiles.active 시스템 프로퍼티나 환경변수를 사용해서 사용할 프로필을 선택할 수 있다. 그리고 web.xml에서 spring.profiles.active 초기화 파라미터를 이용해 프로필을 선택할 수 있다.

<init-param>
  	<param-name>spring.profiles.active</param-name>
  	<param-value>dev</param-value>
</init-param>

0개의 댓글