Maven Profile 을 통해 설정 관리하기 / Spring profile

필요성

아주 작은 프로젝트, 절대로 변하지 않을 프로젝트라면 상관없다.

하지만 단순히 서비스를 어느서버에서 하느냐, 디비를 어느것을 이용하느냐, 인증을 어디것을 사용하느냐에 따라 코드를 바꿔야 한다.
자주 바뀌는 코드, 코드말고 다른 의존성에 의한 설정값 등의 셋팅이 코드에 있다면 어떤 일이 발생할까? 기존값을 주석처리하고 원하는 값으로 수동으로 바꾸는등 수작업이 필요하며 이런 데이터가 많을수록 작업 효율이 떨어진다.

  • maven profile
  • spring profile

두가지를 활용해 원하는 리소스를 활용하는 방법에 대해 알아보자.

ex1 DB connection 설정

mysql 데이터 베이스를 연동하기위한 설정부분이다

1
2
3
4
5
6
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:ServerAddress:13306/letsparty?characterEncoding=utf8"/>
<property name="username" value="id"/>
<property name="password" value="pass"/>
</bean>

driverClassName은 그렇다 쳐도, url의 경우는 local,dev,release,test 와같은 상황에 따라 바뀐다.
상황에 따라 수동으로 입력 하는것은 매우 번거러운 일이다.

선택

필자가 개발하는 팀에서는 local,alpha,beta,release 상황에 따라 바뀌는 설정들을 미리 정해놓고, 컴파일 타임에 선택하려 한다. 후보는 아래 2가지가 있다

  • maven profile
  • spring profile

Spring profile

spring profile의 특징은 런타임에 profile을 바인딩하여 설정 할 수 있는 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Configuration
public class AppConfig {

@Profile("dev")
@Bean
public CacheManager cacheManager() { //... }

@Profile("live")
@Bean
public EhCacheManagerFactoryBean ehCacheCacheManager(){ //... }

@Profile("testdb")
@Bean
public DataSource dataSource() { //... }
}

@Profile 을 통해 적용되는 코드를 나누고,

web.xml에서 다음과 같은 설정을 통해 profile을 설정한다.

1
2
3
4
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>alpha</param-value>
</context-param>

혹은 콤마로 구분하여 어러개를 넣을 수 있다.

1
2
3
4
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>local, testdb</param-value>
</context-param>

java로 실행한다면 -DSpring.profiles.active 로 삽입할수도 있다.

maven profile

maven 을 통한 profile 관리는 compile 시점에 mvn -P[profileName] clean package 명령어를 통해 어떤 자원을 사용할지 결정한다.

  • profile 설정파일들이 들어갈 폴더구조를 만든다.
  • profile에 해당하는 resource 폴더구조를 적어준다

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

<project>

<profiles>
<profile>
<id>local</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<environment>local</environment>
</properties>
</profile>
<profile>
<id>real</id>
<properties>
<environment>real</environment>
</properties>
</profile>
<profile>
<id>dev</id>
<properties>
<environment>dev</environment>
</properties>
</profile>
</profiles>

<build>
<resources>
<resource>
<directory>src/main/resources/${environment}</directory>
</resource>
</resources>
</build>

</project>

maven profile 사용하기

property로 뺄 부분을 별도의 파일로 만든다
그리고 위 사항을 .java 나 .xml 에서 사용한다.

변수에서 사용

1
2
3
4
5
@Value("#{'url'}")
String url;

@Value("#{path}")
String path;

xml 설정에서 사용

mysql.properties

1
2
3
4
jdbc.driver = com.mysql.jdbc.Driver		
jdbc.url = jdbc:mysql://localhost:3306/hello
jdbc.username = id
jdbc.password = passward
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<bean
class= "org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" >
<property name= "locations">
<value>classpath:/mysql.properties</value >
</property>
</bean>

<bean id="dataSource"
class= "org.springframework.jdbc.datasource.SimpleDriverDataSource" >
<property name= "driverClass" value="${jdbc.driverClass}" />
<property name= "url" value ="${jdbc.url}" />
<property name= "username" value="${jdbc.username}" />
<property name= "password" value="${jdbc.password}" />
</bean>

Comments