노트

스프링 설정 외부화와 프로파일

Spring Externalized Configuration and Profiles

백엔드#spring · 연결된 개념 8개

쉽게 말하면

스프링 설정 외부화는 휴대폰 하나를 회사에선 무음 모드, 집에선 벨소리 모드로 바꿔 쓰듯 같은 앱은 그대로 두고 설정만 갈아 끼우는 거예요. 개발, QA, 운영마다 다시 빌드하지 않아도 돼요.

비유가 깨지는 곳 휴대폰 모드는 하나만 고르지만 스프링 설정은 여러 곳에서 동시에 들어와요. 같은 키가 겹치면 명령줄 인자, 환경변수, 프로파일 파일, 기본 파일 순으로 바깥쪽이 이기고, 비밀값은 파일에 커밋하지 않아요.

스프링 부트는 설정값을 코드 밖(application.yml·환경변수·명령줄 인자 등)에 두고, 실행 환경에 따라 다른 값을 주입하게 해 준다. 같은 빌드 산출물을 개발·QA·운영에 그대로 쓰고 설정만 바꾸는 것이 목표다.

우선순위

여러 곳에 같은 키가 있으면 더 바깥(구체적인) 쪽이 이긴다. 대략 높은 순서로:

  1. 명령줄 인자(--server.port=9000)
  2. 자바 시스템 속성(-Dserver.port=9000)
  3. OS 환경변수(SERVER_PORT=9000, 점은 밑줄·대문자로)
  4. 프로파일별 파일(application-prod.yml)
  5. 기본 파일(application.yml)

값 읽기

@Value("${app.page-size:20}")           // 단일 값, 콜론 뒤는 기본값
private int pageSize;
 
@ConfigurationProperties(prefix = "app")
@Validated
public record AppProps(@Min(5) @Max(100) int pageSize, List<String> branches) {}
  • @Value는 간단하지만 키가 흩어진다. 관련 값이 여럿이면 @ConfigurationProperties로 묶어 타입 안전(type-safe)하게 받고, @Validated로 시작할 때 검증한다(Bean Validation)
  • Environment를 주입받아 env.getProperty("...")로 읽을 수도 있다
  • 기본 파일이 아닌 프로퍼티 파일은 @PropertySource로 추가한다

프로파일(profile)

환경별 설정 묶음이다. application-dev.yml, application-prod.yml을 두고 활성 프로파일을 고른다.

SPRING_PROFILES_ACTIVE=prod java -jar app.jar
java -jar app.jar --spring.profiles.active=prod
  • 테스트에서는 @ActiveProfiles("test")
  • 빈 자체를 프로파일로 갈아 끼울 수 있다: @Profile("!prod")인 가짜 인증 제공자, @Profile("prod")인 실제 구현

비밀값

DB 비밀번호·API 키를 application.yml에 적어 커밋하지 않는다. 환경변수나 비밀 저장소(AWS Secrets Manager, Vault 등)에서 주입받는다(AWS CLI 프로필). 키스토어 비밀번호도 마찬가지다(Let's Encrypt로 HTTPS 적용).

프론트엔드 빌드 도구의 모드·env 파일과 비교하면 Vite mode와 env 파일, 환경변수가 프로세스에 전달되는 원리는 환경변수 스코프와 source를 본다. "설정을 코드에서 분리하라"는 원칙은 Twelve-Factor App의 Config 항목과 같다.

출처: Spring Boot 문서: Externalized Configuration · Type-safe Configuration Properties · Profiles · The Twelve-Factor App: Config

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • Spring Boot Actuator

    Spring Boot Actuator는 운영 중인 앱의 상태를 HTTP 엔드포인트로 보여주는 모듈이다. 헬스 체크, 지표, 설정값, 로그 레벨, 등록된 빈 같은 정보를 /actuator/* 아래에 노출한다.

  • 스프링 빈과 IoC 컨테이너

    스프링 빈은 스프링 IoC(Inversion of Control, 제어의 역전) 컨테이너가 만들고, 의존성을 연결하고, 생명주기(lifecycle)를 관리하는 평범한 자바 객체(POJO, Plain Old Java Object)다. 컨테이너(ApplicationContext)는 이 빈들을 담는 공간이고, 내가 new로 만든 객체는 컨테이너가 모른다.

  • 스프링 AOP

    AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)는 로깅·트랜잭션·보안·실행 시간 측정처럼 여러 클래스에 흩어져 반복되는 횡단 관심사(cross-cutting concern)를 한 곳에 모아, 비즈니스 코드를 건드리지 않고 메서드 호출 앞뒤에 끼워 넣는 방법이다. 스프링 AOP는 이를 프록시로 구현한다.

  • 빈 스코프

    빈 스코프(bean scope)는 스프링 컨테이너가 빈 인스턴스를 언제 만들고 얼마나 오래 유지하는지를 정한다. 기본값은 싱글턴이다.

  • 스프링 REST 컨트롤러

    @RestController는 메서드의 반환값을 뷰 이름이 아니라 HTTP 응답 본문(보통 JSON)으로 쓰는 컨트롤러다. @Controller에 @ResponseBody를 합친 것으로, 직렬화(serialization)는 Jackson이 맡는다.

보기 옵션