테스트 용 dataSource와 실서비스용 dataSource를 쉽게 변경하려면 어떻게 하나요~

342 views
Skip to first unread message

StyLe_jG

unread,
Aug 16, 2011, 12:18:27 PM8/16/11
to Korea Spring User Group
안녕하세요 고수 여러분.. 오늘도 개발 삽을 푸다가 궁금한 점이 있어서 이렇게 도움을 요청드립니다.

지금 진행하고 있는 프로젝트에서 실서버용 DataSource와 테스트서버용 DataSource 설정을 쉽게 변경 할 수 있는 방
법이 없을까요?

현재 링크 URL 같은 경우는 Util클래스를 하나 생성해서

private static final boolean _IS_TEST = true;

public static String getHomeURL() {
if( _IS_TEST )
return "/app-test";
else
return "/app";
}

이런식으로 상단의 _IS_TEST만 true,false로 변경해서 쉽게 테스트용과 서버용으로 변경하고 있습니다.

그런데 DataSource같은 경우는 URL부분을 수동으로 변경하고 있습니다.
<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://testurl.co.kr:3306/test?
characterEncoding=utf-8&amp;autoReconnect=true"/>
<!-- <property name="url" value="jdbc:mysql://realurl.co.kr:3306/
real?characterEncoding=utf-8&amp;autoReconnect=true"/>-->
<property name="username" value="아이디"/>
<property name="password" value="비번"/>
</bean>

그런데 이렇게 수동으로 변경하다가 모르고 실서버 db로 테스트를 하는 불상사가 생길 수 있을 것 같아서요...

위에 생성한 Util 클래스의 _IS_TEST를 true, false로 변경하면 xml에 선언된 url을 테스트용, 실서버용으
로 자동으로 변경할 수 있나요??( java의 변수내용으로 xml에 데이터를 제어하는게 이상한 얘기 이지만, datasource
를 java파일로 생성 할 수 있다면 가능할 것도 같아서요..)

다른 분들은 어떻게 작업하시는지 궁금합니다

김태준

unread,
Aug 16, 2011, 8:19:35 PM8/16/11
to ks...@googlegroups.com
.
maven을 사용하신다면 profile기능을 사용하여 고민하시는 부분이 상당 부분 해결되리라 생각되네요.
예를 들면 운영, 개발, 로컬 요렇게 나누고 배포 상황에 따라 빌드하는거죠.

구글에서 아래와 같이 검색하면 다양한 샘플이 있고

백기선씨가 블로깅 한 글도 참고하셔도 좋을것 같아요.

2011년 8월 17일 오전 1:18, StyLe_jG <cresp...@gmail.com>님의 말:

--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.


최영목

unread,
Aug 16, 2011, 9:25:00 PM8/16/11
to ks...@googlegroups.com
김태준님께서 좋은 답변을 해주셨네요 ^^

저도 maven을 사용한다는 가정하에 추가로 말씀드리고 싶은 것은 테스트의 유형에 따라서 방법은 조금 달라질 수 있다고 생각합니다.

예를 들어, 로컬이든 개발서버이든 배포 이후에 하는 테스트의 유형인 경우에는 maven profile이 좋은 방법입니다. 하지만 DAO 또는 서버를 띄우지 않은 상황에서의

비즈니스에 관련된 서버모듈을 테스트하는 경우에는 다른 방법을 사용할 수도 있습니다.

테스트에 대한 설정 및 관련 유틸을 가지고 있는 가칭 TestEnv라는 컴포넌트를 만듭니다. 여기에 Test에 사용할 DataSource를 설정합니다. 그리고 필요한 컴포넌트에서 TestEnv를
dependency 잡고, scope를 test로 잡습니다. 그렇게 하면 특별한 변경없이 Test용 DataSource를 만들어서 사용할 수 있습니다. ^^


2011년 8월 17일 오전 9:19, 김태준 <kior...@gmail.com>님의 말:

Sanghyuk Jung

unread,
Aug 16, 2011, 9:51:18 PM8/16/11
to ks...@googlegroups.com
Spring 3.1에서는 profile이라는 기능으로 좀 더 다양한 선택이 가능할듯합니다.

그리고 위에서 말씀해주신데로, 흔한 방법은 maven으로 profile지정 + resource filtering을 쓰거나, 각 환경별로 소스폴도를 추가 지정해서 .property 파일에 환경마다 달라지는 변수를 따로 지정한다음에 PropertyPlaceholderConfigurer로 참조하는 방식입니다. Spring 3.0에서는 PropertyPlaceholderConfigurer를 안 써도 아래와 같이 Spel로 참조를 할 수도 있습니다.

<util:properties id="dbConfig" location="classpath:db.properties" />

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
....
               <property name="url" value="#{dbConfig['url']}"/>
...
</bean>



2011년 8월 17일 오전 10:25, 최영목 <davi...@nextree.co.kr>님의 말:

Sewon Ann

unread,
Aug 16, 2011, 9:52:13 PM8/16/11
to ks...@googlegroups.com
메이븐을 안 쓰실 거라면.

1. 서버 IP를 확신할 수 있다면 host의 ip로 판단하는 방법도 가능할 것이고 (비추)
2. 첨부한 java 코드와 xml의 값들을 properties 파일로 뽑아낸 다음, 서버 환경에 따라 properties를 구성해서 판단할 수도 있겠죠. properties까지 함께 배포한다면 대상 서버에 맞는 properties를 주의해서 배포하셔야 할 것이고, properties는 배포하지 않는다면 대상 서버의 로컬에 미리 만들어 둔 properties를 사용하면 되겠고요.

원래 첨부해주신 내용과 같이 코드나 xml 자체에 값이 박혀있는 형태는 좋지 않다고 생각합니다.

2011/8/17 최영목 <davi...@nextree.co.kr>

Toby Lee

unread,
Aug 19, 2011, 1:54:13 AM8/19/11
to ks...@googlegroups.com

2. 첨부한 java 코드와 xml의 값들을 properties 파일로 뽑아낸 다음, 서버 환경에 따라 properties를 구성해서 판단할 수도 있겠죠. properties까지 함께 배포한다면 대상 서버에 맞는 properties를 주의해서 배포하셔야 할 것이고, properties는 배포하지 않는다면 대상 서버의 로컬에 미리 만들어 둔 properties를 사용하면 되겠고요.

저도 이 방법을 사용합니다. 단, 실제 DB 정보가 들어있는 프로퍼티 파일은 소스코드와 함께 배포되지 않게 막아두고, 참조용 sample 프로퍼티 파일만 배포한 후에 각 서버 또는 개발자 PC에서 샘플을 복사해서 프로퍼티 파일을 설정하고 사용하도록 합니다.

같은 환경이면서 테스트 코드(JUnit)와 실행 코드에서 다른 DB를 사용하게 할 때는 스프링 설정 파일을 두 벌을 만들어 각각 다른 설정 파일로 동작하도록 만드는 것이 좋습니다. 애플리케이션 코드는 applicationContext.xml을 사용한다면 애플리케이션용 DB를 담은 파일을 읽도록 만들고요. JUnit 등으로 만든 테스트 코드에선 testApplicationContext.xml을 사용하도록 만들고, 이 안에는 테스트 코드가 사용하는 DB의 설정을 넣어둡니다. 이 때 문제가 되는 것은 DataSource 빈을 제외한 다른 설정이 두 개의 파일에 중복되서 들어가는 것인데요. 이 문제는 테스트용 설정 파일에서 애플리케이션용 설정파일을 import 하고, dataSource 관련 빈만 오버라이드 되도록 설정을 해주는 방법을 사용해서 해결할 수 있습니다. <import>를 사용했을 때의 빈 설정 충돌과 우선순위 문제는 자세히 검토해보지는 않았지만 대충(-_-) 쓰니까 기대한 대로 잘 되서 그냥 편하게 사용하고 있습니다. 예를 들어 testApplicationContext.xml은 다음과 갈이 만드는 것이죠. 기본적으로 applicationContext.xml의 빈 설정을 사용하지만 dataSource 빈이 사용할 프로퍼티 정보를 담은 PropertyPlaceholderConfigurer 빈 설정은 여기서 오버라이드 해버리는 것입니다. 프로퍼티 파일을 사용하지 않는다면 dataSource 빈 자체를 오버라이딩 하는 방법도 가능할 것 같은데, 안 해봐서 잘 될지는 모르겠습니다.

<beans ...>
<import resource="classpath:/applicationContext.xml"/>
<!-- override -->
<bean id="PropertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="/test.database.properties" />
</bean>
</beans>

그 밖에 자바 코드에서 JUnit으로 스프링 테스트 할 때는 일부 기능을 제한해야 하는 경우가 있는데요. 테스트용 XML설정을 일일이 고치기 귀찮을 때는 그냥 해당 빈의 초기화 메소드에서 JUnit에서 실행된 것인지 확인해서 특정 기능(폴더 감시 기능 같은 백그라운드에서 동작하는 기능 등등)을 차단하기도 합니다. 한번 만들어두면 적용하기 편해서 좀 편법이지만 가끔 써먹씁니다. 현재 쓰레드의 스택 트레이스를 가져와서 JUnit runner가 있는지 확인하는 식입니다.

StyLe_jG

unread,
Aug 24, 2011, 5:26:09 AM8/24/11
to Korea Spring User Group
잠시 일때문에 못들어 와 봤는데 많은 분들이 글 남겨 주셨네요..

저는 maven을 사용하기 때문에 maven으로 처리 하려고 합니다.

글 남겨주신 고수님들 감사합니다~^^

> > 2011/8/17 최영목 <davidc...@nextree.co.kr>


>
> >> 김태준님께서 좋은 답변을 해주셨네요 ^^
>
> >> 저도 maven을 사용한다는 가정하에 추가로 말씀드리고 싶은 것은 테스트의 유형에 따라서 방법은 조금 달라질 수 있다고 생각합니다.
>
> >> 예를 들어, 로컬이든 개발서버이든 배포 이후에 하는 테스트의 유형인 경우에는 maven profile이 좋은 방법입니다. 하지만
> >> DAO 또는 서버를 띄우지 않은 상황에서의
>
> >> 비즈니스에 관련된 서버모듈을 테스트하는 경우에는 다른 방법을 사용할 수도 있습니다.
>
> >> 테스트에 대한 설정 및 관련 유틸을 가지고 있는 가칭 TestEnv라는 컴포넌트를 만듭니다. 여기에 Test에 사용할
> >> DataSource를 설정합니다. 그리고 필요한 컴포넌트에서 TestEnv를
> >> dependency 잡고, scope를 test로 잡습니다. 그렇게 하면 특별한 변경없이 Test용 DataSource를 만들어서
> >> 사용할 수 있습니다. ^^
>

> >> 2011년 8월 17일 오전 9:19, 김태준 <kiora1...@gmail.com>님의 말:


>
> >> .
> >>> maven을 사용하신다면 profile기능을 사용하여 고민하시는 부분이 상당 부분 해결되리라 생각되네요.
> >>> 예를 들면 운영, 개발, 로컬 요렇게 나누고 배포 상황에 따라 빌드하는거죠.
>
> >>> 구글에서 아래와 같이 검색하면 다양한 샘플이 있고
>

> >>>http://www.google.co.kr/search?aq=0&oq=maven+pro&sourceid=chrome&ie=U...


>
> >>> 백기선씨가 블로깅 한 글도 참고하셔도 좋을것 같아요.
> >>>http://whiteship.tistory.com/2757
>

> >>> 2011년 8월 17일 오전 1:18, StyLe_jG <crespo12...@gmail.com>님의 말:


>
> >>> 안녕하세요 고수 여러분.. 오늘도 개발 삽을 푸다가 궁금한 점이 있어서 이렇게 도움을 요청드립니다.
>
> >>>> 지금 진행하고 있는 프로젝트에서 실서버용 DataSource와 테스트서버용 DataSource 설정을 쉽게 변경 할 수 있는 방
> >>>> 법이 없을까요?
>
> >>>> 현재 링크 URL 같은 경우는 Util클래스를 하나 생성해서
>
> >>>> private static final boolean _IS_TEST = true;
>
> >>>> public static String getHomeURL() {
> >>>> if( _IS_TEST )
> >>>> return "/app-test";
> >>>> else
> >>>> return "/app";
> >>>> }
>
> >>>> 이런식으로 상단의 _IS_TEST만 true,false로 변경해서 쉽게 테스트용과 서버용으로 변경하고 있습니다.
>
> >>>> 그런데 DataSource같은 경우는 URL부분을 수동으로 변경하고 있습니다.
> >>>> <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://
> >>>> testurl.co.kr:3306/test?

> >>>> characterEncoding=utf-8&amp;autoReconnect=true<http://testurl.co.kr:3306/test?characterEncoding=utf-8&autoReconnect=...>


> >>>> "/>
> >>>> <!-- <property name="url" value="jdbc:mysql://
> >>>> realurl.co.kr:3306/

> >>>> real?characterEncoding=utf-8&amp;autoReconnect=true<http://realurl.co.kr:3306/real?characterEncoding=utf-8&autoReconnect=...>


> >>>> "/>-->
> >>>> <property name="username" value="아이디"/>
> >>>> <property name="password" value="비번"/>
> >>>> </bean>
>
> >>>> 그런데 이렇게 수동으로 변경하다가 모르고 실서버 db로 테스트를 하는 불상사가 생길 수 있을 것 같아서요...
>
> >>>> 위에 생성한 Util 클래스의 _IS_TEST를 true, false로 변경하면 xml에 선언된 url을 테스트용, 실서버용으
> >>>> 로 자동으로 변경할 수 있나요??( java의 변수내용으로 xml에 데이터를 제어하는게 이상한 얘기 이지만, datasource
> >>>> 를 java파일로 생성 할 수 있다면 가능할 것도 같아서요..)
>
> >>>> 다른 분들은 어떻게 작업하시는지 궁금합니다
>
> >>>> --
> >>>> Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
> >>>> 이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
> >>>> 그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.

> >>>> 더 많은 옵션을 보려면http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.


>
> >>> --
> >>> Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
> >>> 이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
> >>> 그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.

> >>> 더 많은 옵션을 보려면http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.


>
> >> --
> >> Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
> >> 이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
> >> 그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.

> >> 더 많은 옵션을 보려면http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.

Kyuhyun Park

unread,
Aug 29, 2011, 12:06:19 AM8/29/11
to ks...@googlegroups.com
Spring : JDBC 접속정보 외부로 분리하기 2

http://drypot.com/post/126

2011/8/24 StyLe_jG <cresp...@gmail.com>:

Reply all
Reply to author
Forward
0 new messages