스프링 애플리케이션을 개발하다 보면 운영(Prod), 개발(Dev), 테스트(Test) 환경에 따라 서로 다른 설정을 적용해야 할 때가 많습니다.
대표적으로 DB 연결 정보, 외부 API Key(예: 기상청 OpenAPI 서비스 키), 로그 레벨 등이 환경마다 달라지죠.
스프링에서는 이런 환경별 구분을 위해 Profiles 기능을 제공합니다.
오늘은 application-xxx.properties를 어떻게 환경에 따라 다르게 적용하는지, 그리고 톰캣 배포 시 catalina.sh를 어떻게 활용하는지 정리해보겠습니다.
Spring Boot는 application.properties 외에 환경별 설정 파일을 구분해서 둘 수 있습니다.
예시:
application.properties # 기본 설정
application-dev.properties # 개발 환경 설정
application-prod.properties # 운영 환경 설정
application-local.properties # 로컬 개발 환경
이때 spring.profiles.active 값을 어떤 걸로 주느냐에 따라 로딩되는 설정이 달라집니다.
예를 들어,
# application-dev.properties
db.url=jdbc:mysql://dev-db:3306/mydb
weather.api.key=DEV123456
# application-prod.properties
db.url=jdbc:mysql://prod-db:3306/mydb
weather.api.key=PROD987654
IDE에서 애플리케이션을 실행할 때는 Run Configurations → VM options(또는 Arguments)에 아래와 같이 세팅합니다.
-Dspring.profiles.active=dev
➡️ 그러면 application-dev.properties가 적용됩니다.
운영 테스트를 하고 싶다면:
-Dspring.profiles.active=prod
➡️ 이 경우에는 application-prod.properties가 적용되겠죠.
운영 환경에서는 보통 톰캣 같은 WAS(Web Application Server)에 Spring Boot WAR를 배포하게 됩니다.
이때도 어떤 프로파일을 사용할지 톰캣이 기동될 때 지정해줄 수 있습니다.
$CATALINA_HOME/bin/catalina.sh 또는 setenv.sh에 아래처럼 추가합니다:
JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=dev"
혹은 운영 서버라면:
JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=prod"
이렇게 세팅해주면, 톰캣이 실행될 때 JVM 옵션을 통해 Spring에 spring.profiles.active 값을 전달하게 되고,
애플리케이션은 자동으로 해당 프로파일(application-prod.properties)을 읽어옵니다.
로컬 개발 환경
Run Configurations → Spring Boot App → Arguments → VM arguments → -Dspring.profiles.active=dev
배포 환경 (톰캣)
catalina.sh 또는 setenv.sh에 → JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=prod"
결과적으로 환경마다 다른 properties 파일을 알아서 로딩하기 때문에,
배포된 서버에서는 application-prod.properties, 개발 서버에서는 application-dev.properties,
로컬 테스트에서는 application-local.properties … 이런 식으로 깔끔하게 분리할 수 있습니다.
제가 이번에 구현한 기능 중 하나는 기상청 OpenAPI 데이터를 가져오는 모듈이었는데요.
문제는 서비스 키(Service Key) 가 환경마다 달랐다는 점이었습니다.
이를 해결하기 위해:
# application-dev.properties
weather.api.key=DEV_KEY_12345
# application-prod.properties
weather.api.key=PROD_KEY_98765
이렇게 분리해 두고, 서버 기동 시 프로파일만 다르게 주었더니,
별도의 코드 수정 없이도 환경마다 다른 설정을 자동으로 불러오게 되었습니다. 👍
👉 spring.profiles.active 값을 로컬에서는 VM 옵션으로,
👉 배포 환경에서는 톰캣 기동 옵션(JAVA_OPTS)으로 지정하면,
환경에 맞는 application-xxx.properties를 손쉽게 적용할 수 있습니다.
이 방법을 쓰면 소스 수정 없이 환경만 바꿔도 자동으로 다른 DB, API Key, 로그 레벨을 적용할 수 있어서 배포가 훨씬 깔끔해집니다. 🚀