Whiteship's Note

테스트 환경와 운영 환경용 설정 분리/구분하기

모하니?/Coding : 2009.09.23 19:06


public class SpringSprout2System {
    public static final String ENCODING = "UTF-8";
    public static final String S2C_HOME = "http://www.springsprout.org/";
    public static final String AVATAR_URL = "http://www.gravatar.com/avatar/";
...
    public static final String JSON_VIEW = "mappingJacksonJsonView";
}


이런식으로 시스템에서 자주 사용하는 상수 값들을 모아두었습니다. 그런데 문제는 저 중에서 S2C_HOME의 값이 로컬 서버에서 돌 때랑 실제 운영 서버에서 돌 때랑 달라져야 하는데 그렇지 않고 있다는 것이었죠.

그럼 일단 프로퍼티 파일로 빼고 싶어질 겁니다. 그런데.. 프로퍼티 파일로 빼면 다인가요? 프로퍼티 파일로 빼고 그걸 빈으로 등록해서 참조해서 쓰면 끝인가요? 프로퍼티 파일이 일단 로털 테스트용/운영 서버용 이렇게 두 개로 나뉠텐데.. 그럼 로컬에서 작업할 땐 로컬용 프로퍼티 파일 쓰다가 버전 관리 올릴 때는 빼고 운영 서버용을 쓸건가요 아니면 프로퍼티 파일 하나에 모두 넣어 놓고 일부는 로컬용으로 일부는 서버용으로 해놓고 주석처리를 바꿔가며 쓸건가요??

도무지 깔끔한 방법이 아니라는 생각이 들어서 고민하다가 봄싹에서 토론도 하고 사부님이랑 전화통화 하다 생각나서 물어보기도 했습니다. 결국은 다음 세 가지 방법으로 정리가 됐습니다.

1. 프로그래밍을 이용한 설정(스마트 설정)

빈을 하나 등록해서 해당 빈이 현재 애플리케이션이 배포된 서버 환경에 대한 정보를 분석해서 이게 운영 서버인지 아닌지 판단해서 거기에 맞게 환경 변수를 샤샥 등록하는 방법입니다. 자바의 System.getProperty()에 os.name os.arch os.version 키 값을 이용해서 지금 돌고 있는 운영체제의 정보를 알 수 있습니다.

2. 설정파일을 버전관리에서 제외시키기(설정파일 외부화)

별도의 프로퍼티 파일로 배포 환경에 따라 달라지는 속성들을 빼놓고, 이 파일을 버전관리에서 제외시켜서 개별적으로 관리하는 방법입니다. 공유되지 않기 때문에 운영 서버에 초기 세팅할 때나 로컬 개발환경에서 처음 세팅할 때 설정 파일을 만들어 주거나 기본 템플릿 파일을 수정해줘야겠죠.

3. 빌드 툴을 사용하는 방법(빌드 다양화)

앤트라면 간단하게 타겟 하나를 만들어서 특정 프로퍼티 파일은 지우고 다른 걸 추가하는 식으로 운영용 타겟과 빌드용 타겟을 만들어서 쓸 수 있을 것이고, 메이븐이라면 메이븐 프로파일을 사용할 수 있겠습니다.

이 세 가지 방법 이외에도 어떤 것이 있고 어떤 방법이 좋을지 논의 중입니다.

'스마트 설정' 방식과 '빌드 다양화'는 딱 한번만 설정 해두면 계속해서 쓸 수 있기 때문에 비슷한데, 프로그래밍을 할 것이냐 빌드 설정을 할 것이냐 그것이 고민이고, '설정파일 외부화'는 프로젝트를 새로 받을 때 마다 한번씩 수고해야 하기 때문에 다른 두개 보다는 좀 더 귀찮은 것 같습니다. 하지만... 로컬 서버 환경이라고 해서 전부 다 같은 설정을 사용하진 않겠죠. 누구는 localhost:8080에 설치하고 누구는 loclahost:80을 사용할 수도 있을테니까요. 그런면에서 보면 누구나 하나씩 프로퍼티 파일을 별도로 만들게 하는 '설정파일 외부화' 방법이 가장 적절해 보입니다.

뭘 선택할지 고민이네요. 아~~~~~~ 고민이로세. 고민이야.. @_@

이것들 말고 또 다른 방법은 뭐 없을까요. 획기적으로.. 스크립트 언어를 활용한다던가, 스프링 EL을 쓴다던가...

이럴 땐 찍어서 하나 써보면 될까요? 써보다 뭔가 불편하면 다른 방법으로 갈아타고..
그렇다면, 나중에 갈아타도 시스템에 별로 지장이 없어보이는 녀석을 선택하는게 좋겠네요.

그렇다면... '설정파일 외부화' --> '빌드 다양화' --> '스마트 설정' 순으로 시도해보는건 어떨까 싶습니다.

top

  1. Favicon of http://blog.lckymn.com BlogIcon Kevin 2009.09.23 20:17 PERM. MOD/DEL REPLY

    저는, 사실 별 방법은 아닙니다만, 이런방법을 씁니다.
    꼭 개발 환경과 사용 환경을 구분하려는 것 이외에도
    개발중인 어플과 실제 사용중인 어플의 동작에 차이가 있을
    필요가 있을때도 쓰는 방법입니다.

    웹어플을 주로 만드니까 웹어플을 기준으로
    어플리케이션이 시작될때, 즉, 미리 만들어 놓은 ContextListener에서
    properties파일이건 XML파일이건 어플의 버전 정보가 들어가는 파일을
    확인하건 parameter 값을 가져오건 암튼 버전 정보를 확인해서
    (예. -Dev 개발버전, -GA 사용버전)
    개발 버전이면, 개발용 설정을 사용하고,
    정식 릴리즈 버전이면, 다른 설정을 사용하는거죠.

    이러면 설정파일을 바꿔치기 한다거나 전체를 다 주석 처리할 필요없이,
    버전 정보 부분만 간단하게 수정해서 환경설정 변환이 가능하니까요.
    배포전에 버전 정보 확인은 필수일테니 이거 고치는거야 일도 아니구요.

    설정파일 전체 교체나 수정보다, 버전 정보 하나 수정으로
    일을 쉽게 해결하는거죠.

    개발 서버 버전 정보가 배포 버전에 들어가는게 신경쓰이면
    배포전에 개발버전용 설정 파일만 삭제해버리면 그만 이구요.

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2009.09.23 20:24 신고 PERM MOD/DEL

    오호.. 어딘가 들어있을 버전 정보를 이용해서 설정을 바꾸는 방법이로군요..

    초기에 읽어오는 그 애플리케이션의 버전 정보로 적절한 프로퍼티 파일을 읽어오도록... 으흠...

    수정할 것은 딱 하나.. 버전정보. 개발 할 때는 계속해서 개발버전으로 쓰니까.. 로컬 설정을 쓰고 서버에 배포할 때는 배포버전으로 바꿔서 배포 설정을 쓰도록..

    스마트 설정을 약간 수동적인 방법을 동원해서 좀 더 명시적으로 하는거군요.

    그럴거라면. 스마트 설정 방식에 플래스를 하나 둬서 isLocalServer 속성에 true/false 값을 보고 분기하는 빈을 만들어서 써도 되겠네요.

    좋은 아이디어입니다. 감사합니다!

  2. Favicon of http://blog.lckymn.com BlogIcon Kevin 2009.09.23 20:50 PERM. MOD/DEL REPLY

    위에 언급하신 1번 방법하고 크게 다르지 않은데,
    단지 구분 할때 쓰는 값으로,
    바꾸기 쉽고, 개발 버전과 사용 버전에 따라 확실히 바뀌는
    버전값을 이용한것 뿐이죠.

    제가 이 방법을 쓰게 된 계기가...
    예전에 기술 담당 부서에서 장비 교체하느라
    서버들을 다 정지 시킨적이 있는데,
    제가 만든 어플 단 하나만이 돌던
    거의 그 어플 전용인 서버를
    실수로 재실행 하지 않은겁니다.

    보스로부터 어플이 동작하지 않는다는 연락을 받고
    확인해 보니 서버가 죽은거더군요...ㅡ_ㅡ;

    그래서 기술 부서에 연락하고, 생각한게
    어플이 설치 됐을때와 제거 됐을때 이메일로 통보를 하도록하면,
    서버 정지시에 이메일이 전송될테니
    문제가 있는것을 알수 있을테고,
    설치시에도 새버전이 설치 됐다는걸 알아야 하는
    사람들에게 자동으로 알릴수 있으니 좋겠다는 거였습니다.

    그래서 ContextListener를 하나 만들고,
    그런 기능을 넣었는데...
    이게 성가신게, 개발중에 설치/제거 혹은
    Eclipse에서 context reloading이 될때마다
    메일을 전송하는겁니다...ㅡ_ㅡ;;;
    전송 되는게 당연한 얘깁니다만...

    그래서, 버전에 따라 개발 버전과 배포 버전의 설정을
    다른것을 사용하도록 하고,
    어플 동작도 일부 다르게 하도록
    만들어 버린거죠.

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2009.09.23 22:30 신고 PERM MOD/DEL

    ㅎㅎ그렇군요.

    저도 이런 설정이 필요하다고 절실히 느낀게..
    이메일 전송 기능하고 관련이 있어요.

    로컬에서 테스트 할 땐 회원 가입 인증 메일이 localhost로 와야하는데 그 URL을 상수 빼기만 했더니.. 영~~~

Write a comment.




: 1 : ··· : 86 : 87 : 88 : 89 : 90 : 91 : 92 : 93 : 94 : ··· : 299 :