Web

Ch17. 프로필

tose33 2022. 7. 28. 16:08

프로필

 

개발을 진행하는 동안 실제 서비스 목적으로 운영중인 DB를 사용할수 없다.

또한 개발을 완료한후 실제 서비스에 배포할때, 개발 중에 사용한 DB설정 대로 배포할수도 없다.

 

개발을 완료한 어플리케이션을 실제 서버에 배포하려면 실 서비스 환경에 맞는 JDBC 연결 정보를 사용해야하는데, 배포 전에 설정 정보를 일일히 변경하는 것은 번거롭고 실수가 발생하기 쉽다.

 

스프링 프로필은 처음부터 개발 목적 설정과 실 서비스 목적의 설정을 구분해주는 기능이다.

 

설정 집합에 프로필을 지정할수 있다. 

예를들어 개발을 위한 디비설정 프로필이 "dev"이고 배포를 위한 디비설정 프로필이 "real" 이라고 지정할수 있고, 개발할때는 "dev" 프로필을 선택하고 배포할때는 "real" 프로필을 선택해서 스프링 컨테이너를 초기화할수 있다. 

 


프로필 설정 클래스, @Profile

DsDevConfig.java

package config;

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

@Configuration
@Profile("dev") 
public class DsDevConfig 
{
	@Bean(destroyMethod="close")
	public DataSource dataSource() 
	{
		DataSource ds = new DataSource();
		ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
		ds.setUrl("jdbc:mysql://localhost:3306/spring5fs?characterEncoding=utf8");
		ds.setUsername("spring5");
        	ds.setPassword("1234");
                ds.setInitialSize(2); // 커넥션풀을 2개 만들어 놓는다
                ds.setMaxActive(10); // 활성 상태 가능한 최대 커넥션 개수 10
                ds.setMaxIdle(10);
                // 10초 주기로 유휴 커넥션이 유효한지 여부 검사, 최소 유휴 시간 3분으로 지정
                ds.setTestWhileIdle(true); // 유휴 커넥션 검사 true
                ds.setMinEvictableIdleTimeMillis(1000 * 60 * 3); // 최소 유휴 시간 3분 설정
                ds.setTimeBetweenEvictionRunsMillis(10 * 1000); // 10초 주기로
                return ds;
	}
}

위와 같이 설정 클래스에 @Profile("프로필 이름") 애노테이션을 붙이면, 스프링 컨테이너를 초기화할때 설정한 프로필 이름으로 프로필을 활성화 하면 해당 클래스를 설정으로 사용하게 된다. 

 

 

- 스프링 설정은 두 개 이상의 프로필을 갖을수 있다.

@Profile("dev, real")

 

- @Profile("!dev") 는 "dev" 프로필이 활성화되지 않을때 사용한다는 것을 의미한다. 

 

 


프로필 사용 

특정 프로필을 선택하려면 컨테이너를 초기화하기 전에 AnnotationConfigApplicationContext의

getEnvironment().setActiveProfiles()를 사용해 선택한다.

 

Environment는 스프링 실행 환경을 설정하는데 사용되는 클래스다. 

 

주의할점은 AnnotationConfigApplicationContext.register()로 설정 정보를 전달하기 전에 프로필을 결정해야 한다.

 

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

 

 

 

 

 

 

출처 : 스프링5 프로그래밍 입문 (최범균 저)