블로그 자료를 이전하고 있습니다. 많은방문 부탁드립니다 ( https://hyeonguj.github.io/ )

이 블로그의 자료는 이관된 페이지에서도 보실 수 있습니다.

https://hyeonguj.github.io/2017/01/23/Maven-Profile-를-통해-설정-관리하기/


property의 필요성


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

하지만 단순히 서비스를 어느서버에서 하느냐, 디비를 어느것을 이용하느냐, 인증을 어디것을 사용하느냐에 따라 코드를 바꿔야 한다.

이런 불상사..

자주 바뀌는 코드, 코드말고 다른 의존성에 의한 설정값 등의 셋팅이 코드에 있다면 어떤 일이 발생할까?

OAuth 인증 부분

다음은 payco, facebook 을 통한 Oauth 인증 설정 코드 중 일부이다

	private static final String FACEBOOK_LOGIN_PAGE_URL = "https://www.facebook.com";
	private static final String FACEBOOK_LOGIN_PAGE_PATH = "/v2.8/dialog/oauth";
	private static final String FACEBOOK_CLIENT_ID = "
	private static final String FACEBOOK_CLIENT_SECRET_KEY = 
	
	private static final String FACEBOOK_REDIRECT_URL = "http://dev-service.domain.com/facebookAccessToken.do";
//	private static final String FACEBOOK_REDIRECT_URL = "http://localhost:8080/letsparty/facebookAccessToken.do";
	private static final String FACEBOOK_REQUEST_SCOPE = 
	private static final String FACEBOOK_REQUEST_TOKEN_PAGE_URL = "https://graph.facebook.com";
	private static final String FACEBOOK_REQUEST_TOKEN_PAGE_PATH = "/v2.8/oauth/access_token";
	private static final String FACEBOOK_REQUEST_DATA_PAGE_URL = "https://graph.facebook.com";
	private static final String FACEBOOK_REQUEST_DATA_PAGE_PATH = "/me";
	private static final String FACEBOOK_REQUEST_DATA_FIELD = "id,name,email,picture";

	private static final String PAYCO_LOGIN_PAGE_URL =
	private static final String PAYCO_LOGIN_PAGE_PATH = 
	private static final String PAYCO_CLIENT_ID = 
	private static final String PAYCO_CLIENT_SECRET_KEY = "
	
	private static final String PAYCO_REDIRECT_URL 
	private static final String PAYCO_RESPONSE_TYPE =
	private static final String PAYCO_SERVICE_PROVIDER_CODE 
	private static final String PAYCO_USER_LOCALE = 
	private static final String PAYCO_REQUEST_TOKEN_PAGE_URL = ";
	private static final String PAYCO_REQUEST_TOKEN_PAGE_PATH =
	private static final String PAYCO_GRANT_TYPE = 
	private static final String PAYCO_REQUEST_DATA_PAGE_URL = 
	private static final String PAYCO_REQUEST_DATA_PAGE_PATH =
    //....

약 15개 정도 되는 정보들이 박혀있는것을 볼 수 있다.

특히

    private static final String FACEBOOK_REDIRECT_URL = "http://dev-service.domain.com/facebookAccessToken.do";
//  private static final String FACEBOOK_REDIRECT_URL = "http://localhost:8080/letsparty/facebookAccessToken.do";

를 보면 dev 서버에 올려서 테스트 하는 경우와 local 에서 테스트 할 경우에 redirect 주소를 다르게 넘겨주어야 하고, 빈번히 바뀌는 부분이기 때문에 주석처리를 해서 사용한것을 볼 수 있다.. 수작업…ㄱ-)

DB

데이터 베이스 부분도 마찬가지이다

    <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,real,test 와같은 상황에 따라 바뀐다. 따라서 상황에 따라 수동으로 입력 하는것은 매우 번거러운 일이다.

Profile

우리TF는 local,dev,real 상황에 따라 바뀌는 설정들을 미리 정해놓고, 컴파일 타임에 선택하려 한다. 후보는

  • maven profile
  • spring profile

Spring

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

@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을 설정한다.

<context-param>
    <param-name>spring.profiles.active</param-name>
    <param-value>live</param-value>
</context-param>
<context-param>
    <param-name>spring.profiles.active</param-name>
    <param-value>dev, testdb</param-value>
</context-param>

Maven

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

  1. profile 설정파일들이 들어갈 폴더구조를 만든다. 

  2. profile에 해당하는 resource 폴더구조를 적어준다

pom.xml

<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>

사용

  1. property로 뺄 부분을 별도의 파일로 만든다
  2. 그리고 위 사항을 .java 나 .xml 에서 사용한다.
  • 변수에서 사용
clientId = ....
clientSecret = ....
paycoHost = ....
authURI = ....
accessURI = ....
profileHost = ...
profileURI = ....
redirectURI = ....
@Value("#{payco['paycoHost']}")
String PAYCO_LOGIN_PAGE_URL;	

@Value("#{payco['clientId']}")	
String PAYCO_CLIENT_ID;
  • xml 에서 사용

mysql.properties

jdbc.driver = com.mysql.jdbc.Driver		
jdbc.url = jdbc:mysql://localhost:3306/guestbook		
jdbc.username = root		
jdbc.password = gusrn 

<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>

진행상황

OAuth 인증, Database, Object Storage 등 외부 의존도가 잇거나, 용도에 따라 달라지는 환경을 분리하는 작업을 진행중이다

  • [v] OAuth 인증
  • [v] Database
  • [v] Object Storage


+ Recent posts