본문 바로가기

목록이 없습니다.

[Spring] 운영 properties와 개발 properties 구분하기

Framework/Spring
    반응형

    Spring Framework를 사용하는 소스에서 여러가지 설정과 관련된 다양한 properties들이 늘어남에 따라서 운영에서 사용되는 properties와 개발 시 사용할 properties를 구분해야 하는 경우가 생겼습니다. 이런 경우에 찾아보니 properties 파일을 로드할 때 운영 환경 시 로드될 파일들을 ops 폴더 아래에 두고 개발 환경 시 로드될 파일들을 dev 폴더 아래에 위치 시킵니다. 그런 다음에 JAVA Option으로 spring.profiles.active라는 변수를 정의해서 properties 파일들을 로드할 때 spring.profiles.active를 경로 사이에 넣은 다음에 운영 환경일 경우 해당 변수를 ops로 개발 환경일 경우 해당 변수를 dev로 저장하여 소스를 커밋해놓으면 소스에 따라서 알아서 환경이 셋팅되도록 할 수 있습니다.

     

    그런데 여기서 변수를 설정하는 방법이 여러가지 있어서 정리해보려고 합니다. 정리 순서는 적용되는 우선순위가 높은 순서대로 정리하였습니다. 앞에 방법으로 설정을 할 경우 그 뒤에 있는 설정은 해도 소용없습니다.

     

    web.xml

    <context-param>
      <param-name>spring.profiles.active</param-name>
      <param-value>ops</param-value>
    </context-param>

    spring framework 버전이 문서상에는 3.1버전 이상부터 적용이 된다고는 하는데 저 같은 경우에는 4버전은 되야 변수가 인식이 되더라고요.. 왜 이러는지는 잘 모르겠지만 만약 Spring framework 4버전 이상을 사용하는 경우에는 이 방법이 제일 좋을 수 있습니다. 소스 상에서 설정하는 것이기 때문에 배포 시 서버에 따로 설정할 필요 없이 그대로 하면 알아서 환경설정이 되기 때문인데 로컬 PC에서 개발하고 개발 환경으로 소스 커밋을 하지 않도록 주의하기만 하면 됩니다.

     

    Tomcat 빌드 시 설정

    Tomcat 빌드 시 설정하는 방법에도 2가지가 있는데 JAVA OPTION을 설정해주는 맥락은 같습니다. 빌드 시 라는 건 서버에서 Tomcat을 구동할 떄 즉, startup.sh 가 실행될 때를 의미하는데 startup.sh를 실행할 때 톰캣 bin 폴더 아래에 있는 catalina.sh 쉘 스크립트가 함께 동작하는데 이 안에 소스를 확인해보면 Tomcat이 어떻게 구동되는지 조금이나마 이해할 수 있습니다. 

     

    startup.sh

    ...
    PRGDIR=`dirname "$PRG"`
    EXECUTABLE=catalina.sh
    
    # Check that target executable exists
    if $os400; then
      # -x will Only work on the os400 if the files are:
      # 1. owned by the user
      # 2. owned by the PRIMARY group of the user
      # this will not work if the user belongs in secondary groups
      eval
    else
      if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then
        echo "Cannot find $PRGDIR/$EXECUTABLE"
        echo "The file is absent or does not have execute permission"
        echo "This file is needed to run this program"
        exit 1
      fi
    fi
    
    exec "$PRGDIR"/"$EXECUTABLE" start "$@"

    여기서 PRG 변수는 위에서 "$0"이란 값으로 초기화가 되어있고 "$0"는 스크립트 실행 시 첫 파라미터를 의미하는데요 일단 여기서는 생략하고 중요한 부분은 EXECUTABLE이 catalina.sh로 지정이 되어 있다는 점입니다. 결국 startup.sh은 catalina.sh를 실행하는 것이라고 봐도 무방합니다!

     

     

    catalina.sh

    ...
    if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then
      . "$CATALINA_BASE/bin/setenv.sh"
    elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then
      . "$CATALINA_HOME/bin/setenv.sh"
    fi
    ...

    Tomcat 9버전을 기준으로 156줄을 보면 위의 소스가 있는데 여기서 CATALINA_BASE나 CATALINA_HOME은 서버에 설정된 Tomcat 홈 경로를 의미하고 그 아래에 bin 그리고 그 아래에 setenv.sh 스크립트가 있는 경우 해당 스크립트를 적용하는 것을 의미합니다. 여기까지 다시 정리해보면 startup.sh 실행 시 catalina.sh를 실행하고 catalina.sh 스크립트 안에서는 bin 폴더 안에 setenv.sh 스크립트가 존재하는 경우 함꼐 적용한다는 사실을 파악할 수 있었습니다.

     

    따라서 Tomcat 빌드 시 spring.profiles.active 변수를 초기화하는 방법은 $CATALINA_HOME/bin/setenv.sh 스크립트를 만들어서 그 안에 정의해주거나 catalina.sh 스크립트를 열어서 위에서 본 setenv.sh 적용 스크립트 아래 부분에 직접 spring.profiles.active 변수를 초기화해주면 되는 것입니다. catalina.sh를 수정하는 경우에는 모르는 사람이 setenv.sh를 수정했는데도 적용이 안된다고 판단할 수 있기 때문에 가급적이면 setenv.sh 스크립트를 작성하는 편이 좋을 것 같습니다.

     

    export JAVA_OPTS="-Dspring.profiles.active=ops"

     

     

     

    반응형