본문 바로가기
/JAVA

[ maven ] 운영환경 별, 설정 파일 분리하기

by 삐야악이 2019. 10. 3.

maven profile 을 이용한 설정 파일

어플리케이션을 개발하다보면 다양한 설정파일들을 관리하게 된다. 데이터베이스 접근 정보, 레디스 접근 정보 등..

이런 설정들은 개발, 테스트, 운영 단계별 서로 다른 설정을 가질 수 밖에 없다. 만약 이런 내용들이 코드에 정적으로 들어가 있다면 단계별로 코드의 내용을 수정해서 다시 컴파일을 해야하는 매우 번거로운 상황이 일어날 것이다.

만약 별 다른 기능을 사용하지 않는다면 아마 코드에는 다음과 같은 내용이 들어갈 것이다.

if(env.equals("local")) {
    ......
}
else if (env.equals("dev")) {
    .....
}

 

maven 을 이용해서 개발하는 java 프로젝트일 경우, maven profile 을 이용하여 빌드 시, 외부에서 넣어주는 파라미터를 기준으로 서로 다른 설정파일을 참조하게 하여 환경 별로 다른 설정파일을 선택하도록 해줄 수 있다.

설정 파일

설정파일은 다양한 포멧을 가질 수 있다. 가장 많이 쓰이는 것이 yaml 와 properties 이다. maven 에서는 properties 파일을 이용해서 설정 파일을 관리하고 있다.

properties 설정 파일의 형태는 다음과 같이 key = value 형태를 가진다.

url = http://printf.kr

그리고 설정 파일은 대부분 src/main/resources 폴더 아래에 위치한다.

환경 별 리소스 폴더 구분

위에서 설정 파일은 대부분은 src/main/resources 에 저장된다고 하였다. 그럼 환경별로 리소스 폴더를 다르게 두고 그것을 classpath 에 넣으면 환경 별로 설정파일을 다르게 가져갈 수 있다.

  • 개발자 환경
    • src/main/resources-local
  • 개발 서버 환경
    • src/main/resources-dev
  • 운영 서버 환경
    • src/main/resources-real

와 같이 리소스 폴더를 구분해 줄 수 있다.

maven profile 설정

이제 maven profile 설정을 통해, 빌드 단계에서 원하는 리소스 폴더를 classpath 에 추가하는 작업을 진행할 것이다.

우선, pom.xml 에 아래와 같이 profile 을 추가한다.

<profiles>
    <profile>
      <id>dev</id>
      <properties>
        <env>dev</env>
      </properties>
    </profile>
    <profile>
      <id>local</id>
      <properties>
        <env>local</env>
      </properties>
    </profile>
    <profile>
      <id>real</id>
      <properties>
        <env>real</env>
      </properties>
    </profile>
</profiles>

이렇게 설정된 profile 을 maven 명령어에서 P옵션으로 같이 선택할 수 있다.

maven clean package -P dev

다음은 선택된 profile 에 맞는 리소스 폴더를 classpath 에 넣는 작업이다. 기본즉으로 src/main/resources 는 들어가고 부가적으로 환경 별 리소스 폴더를 넣으면 된다. 아래 내용을 pom.xml 의 build 부분에 추가한다.

<resources>
  <resource>
    <directory>src/main/resources</directory>
  </resource>
  <resource>
    <directory>src/main/resources-${env}</directory>
  </resource>
</resources>

자 여기까지 하면 빌드 시, 환경에 맞는 설정파일이 classpath 로 들어가게 된다.

코드에서 properties 값 가져오기

이제 코드에서 properties 에 설정된 값을 가져와야 한다.

Properties prop = new Properties();
prop.load(OAuthPayco.class.getClassLoader().getResourceAsStream("payco.properties"));
clientId = prop.getProperty("clientId");
clientSecret = prop.getProperty("clientSecret");

위 코드와 같이 아주 간단하게 코드에서 properties 에 있는 값을 가져올 수 있다.

참고 자료

반응형