개발 학습 실습실

이 사이트의 실습은 자바스크립트를 켜야 움직입니다. 아래는 같은 내용을 글로 적은 것입니다.

공부 › Spring › 스프링 부트

설정 우선순위

같은 설정이 여러 곳에 있으면 어느 값이 이기나

스프링 부트는 설정값을 파일, 환경 변수, 실행 옵션 등 여러 곳에서 읽습니다. 같은 키가 여러 곳에 있으면 우선순위가 높은 쪽이 이깁니다.

실행으로 대조 · 스프링 부트 4.1.1로 32가지 조합을 실행해 대조

이 실습에 나오는 개념

외부화 설정과 프로파일
외부화 설정은 DB 주소 같은 설정 값을 코드에 넣지 않고 설정 파일, 환경 변수, 명령행 인자 등으로 주입하는 것이다. 같은 빌드 결과물을 환경에 따라 다르게 설정해 실행할 수 있다. 프로파일은 개발·운영처럼 환경별로 설정 묶음을 나눠 두고 실행 시 선택하는 기능이다.
Spring Boot 자동 설정(Auto-configuration)
클래스패스에 있는 라이브러리와 설정 값을 보고 필요한 빈을 자동으로 등록해 주는 Spring Boot의 기능이다. 예를 들어 JDBC 드라이버와 접속 정보가 있으면 DataSource를 자동으로 구성한다. 각 자동 설정에는 적용 조건이 붙어 있으며, 개발자가 같은 종류의 빈을 직접 등록하면 자동 설정에서 그 빈을 만드는 부분은 적용되지 않는다.
CI/CD
CI(지속적 통합)는 코드 변경을 자주 합치고, 합칠 때마다 자동으로 빌드와 테스트를 실행해 문제를 일찍 발견하는 것이다. CD(지속적 전달·배포)는 검증된 코드를 자동화된 절차로 배포 가능한 상태로 만들거나 운영 환경까지 배포하는 것이다. 사람이 수동으로 하던 빌드·테스트·배포를 자동화해 실수를 줄이고 배포 주기를 짧게 한다.

이렇게 바꿔 보세요

처음 설정으로 실행하면

  1. 애플리케이션이 뜨면서 app.timeout의 값을 찾습니다. 스프링 부트는 우선순위가 높은 곳부터 차례로 살피고, 가장 먼저 찾은 값을 씁니다.
  2. 1순위 실행 인자: 이 키가 없습니다. 다음으로 넘어갑니다.
  3. 2순위 JVM 시스템 프로퍼티: 이 키가 없습니다. 다음으로 넘어갑니다.
  4. 3순위 운영체제 환경 변수: 이 키가 없습니다. 다음으로 넘어갑니다.
  5. 4순위 application-prod.yml: 값 5000을 찾았습니다. 더 높은 우선순위에 값이 없었으므로 이 값이 최종 값입니다.
  6. 5순위 application.yml: 값 3000이 있지만, 더 높은 우선순위에서 이미 값이 정해졌습니다. 이 값은 쓰이지 않습니다.

실행 결과

코드

@Value("${app.timeout:1000}")          // 어디에도 없으면 1000
private int timeout;

# application.yml
app.timeout: 3000

# application-prod.yml
app.timeout: 5000

# 실행
java -jar app.jar --spring.profiles.active=prod

이 모형의 전제

스프링 부트 공식 문서의 외부화 설정 우선순위 가운데 자주 쓰는 다섯 곳만 골랐습니다. 실제 목록에는 SPRING_APPLICATION_JSON, jar 바깥의 설정 파일(jar 안의 파일보다 우선) 등이 더 있습니다. 프로파일 전용 파일은 해당 프로파일이 켜져 있을 때만 읽습니다. 32가지 조합 모두를 실제 스프링 부트 4.1.1로 조합마다 프로세스를 새로 띄워, 최종 값과 그 값을 준 곳이 화면과 일치하는 것을 확인했습니다.

앞 실습: 스프링 부트 자동 설정 · 다음 실습: 액추에이터와 헬스 체크

이 실습에 나오는 개념

이 실습에서 보는 것

설정

코드


      
    

그림

실행 비교

이렇게 바꿔 보세요