본문 바로가기
Spring

[Spring Boot] 환경변수 설정 - application.yml (Profile)

by 마진 2025. 5. 11.

소프트웨어 개발에서는 다양한 환경(개발, 테스트, 운영 등)에 따라 설정값을 유연하게 변경할 필요가 있다.

스프링은 이러한 요구사항을 효과적으로 해결하기 위해 프로파일 기능을 제공하여 환경변수를 손쉽게 관리할 수 있게 하는데, 이는 스프링의 주요 강점 중 하나로 개발자가 코드 변경 없이 애플리케이션의 동작 방식을 환경에 맞게 조정할 수 있게 해 준다.

 

이 글에서는 환경변수의 기본 개념을 살펴보고, 스프링 프레임워크에서 이를 어떻게 효율적으로 관리할 수 있는지 알아보도록 한다.

 

 

 

환경변수란?

위키백과에 등록된 환경변수(environment variable)의 사전적 정의는 '프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는, 동적인 값들의 모임'이다. 즉, 애플리케이션이 정상적으로 동작하기 위해 사용하는 데이터 값을 의미한다.

 

예를 들어, 환경변수 'PATH`는 실행파일이 존재하는 디렉토리 경로를 나타내는 데, 명령프롬프트에서 명령어를 입력하면 시스템은 PATH로 등록된 디렉토리 목록을 차례로 탐색하여 해당하는 실행파일을 찾아 실행한다. OpenJDK 설치 시 java.exe가 위치한 디렉토리 경로(%JAVA_HOME%/bin)를 PATH에 등록하는 이유가 이 때문이다.

 

 

 

스프링은 환경변수를 어떻게 설정할까?

스프링부트는 애플리케이션 동작에 필요한 환경변수를 외부 파일로 설정하는 기능을 제공하며, 외부 설정파일에 정의된 설정 값들은 애플리케이션 구동 시 Environment 인터페이스 구현체에 저장되어 관리된다.

 

설정파일은 일반적으로 클래스 패스 루트 (src/main/resources)에 위치시키며 Properties 파일(application.properties)을 사용한다. 하지만, properties 파일을 사용할 경우 중복 데이터를 입력해야 해서 들여 쓰기를 통해 설정값을 관리할 수 있는 YAML 파일(application.yaml)로 변경해서 사용하는 것이 가독성 측면에서 유리하다.

 

- application.properties

spring.main.web-application-type=none
spring.main.banner-mode=off

 

- application.yaml (or application.yml)

spring:
  main:
    web-application-type: "none"
    banner-mode: "off"

 

참고) YAML 파일에서 String 값을 설정할 때 작은따옴표 (' ')나 큰 따옴표(" ") 없이 입력해도 되지만, 다음의 경우 조건에 맞추어 따옴표를 사용한다. (Properties 파일은 설정한 {value} 값을 모두 문자열로 읽는다.)

 

  • 숫자나 불리언으로 해석될 수 있는 값: yes, no, true, false, on, off, 숫자 등
  • 특수문자가 포함된 경우: :, {, }, [, ], ,, &, *, #, ?, |, -, <, >, =, !, %, @, \
  • 공백으로 시작하거나 끝나는 경우

 

작은따옴표 vs 큰 따옴표

  • 작은따옴표('): 문자열을 있는 그대로 취급하며, 이스케이프 시퀀스(\n, \t 등)를 처리하지 않는다.
  • 큰 따옴표("): C 스타일 이스케이프를 지원한다. \n은 줄 바꿈으로, \t는 탭으로 해석된다.

 

 

 

애플리케이션 구동환경에 따른 변경 - profile

사용되는 환경변수의 값은 애플리케이션이 동작하는 환경에 따라 달라질 수 있다. 개발환경과 운영환경에서 달라지는 DB Connection 정보가 그 대표적인 사례다. 개발 단계에서는 로컬 PC에 설치된 DB에 접근하고 운영 단계에서는 구축된 DB에 붙기 때문에 Connection 정보를 바꿔줘야 한다.

 

그렇다면 개발자가 환경변수를 직접 바꿔야 할까? 이는 위험하다. 사람이 직접 수정할 경우 실수가 발생할 수 있으며 심각할 경우 서비스 장애가 발생할 수 있다.

 

스프링부트는 프로파일(profile)을 통해 원하는 환경설정을 구분할 수 있으며 프로파일의 구분방법은 다음과 같다.

* 프로파일은 애플리케이션이 구동할 때 사용하는 환경의 닉네임으로 생각할 수 있다. 

 

 

1. 파일 이름을 통한 프로파일 분리

 

위 이미지처럼 기본 설정파일 이름(application)에 하이픈(-)과 원하는 프로파일 이름을 함께 적어주면 원하는 프로파일을 활성화했을 때 해당 프로파일을 읽는다. 

예시) dev 프로파일 설정을 위해서 application-dev.yml 파일을 생성한다.

 

 

2. 문서 구분자를 통한 프로파일 분리 (하이픈 사용)

spring:
  application:
    name: env-variables

---

spring:
  config:
    activate:
      on-profile: inner-dev

---

spring:
  config:
    activate:
      on-profile: inner-prod

기본 설정파일에서 하이픈(-)을 이어서 3번 입력하여 다른 설정환경으로 분리가능하며 이때, spring.config.activate.on-profile 설정을 통해 활성화할 프로파일을 표기하면 된다.

 

 

단일 파일 vs 다수의 파일

 

문서구분자를 사용해 설정을 구분하는 방법과 별도의 파일로 분리하는 방법 중 어떤 방법이 더 좋을까?

 

각각 장단점이 존재하기 때문에 선택에 있어 정답은 없어 보인다. 따라서 진행하는 프로젝트의 크기 및 성격에 따라 단일 파일 내부에서 문서구분자를 사용해 프로파일을 분리하는 방법과 다수의 환경설정 파일을 설정하는 방법 중 더 적합한 방법을 채택하면 될 것으로 보인다.

 

 

프로파일 적용방법 - spring.profiles.active

spring.profiles.active 설정을 통해 애플리케이션을 구동할 때 활성화할 프로파일 대상을 지정할 수 있다. 

예를 들어 spring.profiles.active=dev 라면 기본 application.yml (or application.properties) 값이 로드되고 dev 프로파일에 선언된 설정값들이 오버라이드 된다. (기본 설정값에 덮어 씌워진다.) 

 

다음은 프로파일 적용 시 참고하면 도움이 되는 설정들이다. 

 

- spring.profiles.group

여러 개로 나눈 profile 환경을 하나로 그룹화하여 사용할 수 있게 하는 옵션이다.

만약 dev와 debug란 프로파일이 있고 두 프로파일을 함께 사용하고 싶을 때 spring.profiles.group으로 두 프로파일을 그룹화하면 다음의 예시처럼 하나의 프로파일처럼 사용할 수 있다. 

* [참고]: spring.profiles.active에서 쉼표를 사용해 적용할 프로파일을 나열하면 나열된 프로파일들을 함께 적용할 수 있다.

spring:
  profiles:
    active: test
    group:
      test: dev, debug

 

 

- spring.config.import

외부 설정파일이나 다른 위치에 존재하는 설정파일을 가져오는 옵션이다.

일반적으로 환경설정 값은 프로젝트의 resources 디렉토리에 위치시키지만 보안과 관련된 특수한 설정 정보들은 외부에서 별도로 관리될 수도 있다. 이러한 설정정보를 가져와 적용할 수 있도록 지원한다.

 

* [참고]: 기본적으로 spring은 구동될 때 application.properties, application.yml, application-{profile}.yml 등의 이름을 자동으로 찾아 읽지만 spring.config.import로 읽는 설정파일은 이러한 명명규칙에 제약을 받지 않는다.

 

위 이미지 구조일 경우 external.yml 파일을 load 하는 방법은 다음과 같다.

spring:
  config:
    import:
      - classpath:external.yml

 

 

 

 

예시로 사용된 코드 내용은 아래에서 확인 가능합니다.

https://github.com/JaewookMun/programming-exercise/tree/main/framework-config/env-variables

 

programming-exercise/framework-config/env-variables at main · JaewookMun/programming-exercise

practice framework or skill such as spring, jpa, and so on - JaewookMun/programming-exercise

github.com

 

 

References

환경변수 - https://ko.wikipedia.org/wiki/%ED%99%98%EA%B2%BD_%EB%B3%80%EC%88%98

Properties and configuration - https://docs.spring.io/spring-boot/3.3/how-to/properties-and-configuration.html

Externalized configuration - https://docs.spring.io/spring-boot/3.3/reference/features/external-config.html