티스토리 뷰
Overview
스프링 부트에서 사용할 수 있는 설정 값들의 우선 순위를 알아봅니다.
설정
Spring Boot를 사용하면 설정을 외부화(externalize)하여 다른 환경에서 동일한 애플리케이션 코드로 작업할 수 있습니다.
설정의 종류는 다음과 같습니다.
- 자바 속성 파일(properties)
- yaml 파일
- 환경 변수
- 커맨드 라인 인수(command line argument)
속성 값은 @Value
를 통해 주입하거나 Environment
추상 클래스를 통해 접근하거나 @ConfigurationProperties
를 이용해 객체에 바인딩 할 수 있습니다.
우선순위
설정 값을 우선순위에 의해 오버라이드하는 방식으로 사용할 수 있습니다.
우선순위는 낮은 순에서 높은 순으로 오버라이드되므로, 공통으로 사용할 값일 수록 우선순위가 낮아지고, 프로파일이나 특정 환경별로 사용할 값일 수록 우선순위가 높아집니다.
우선순위는 다음과 같습니다.
No | Priority | Property |
---|---|---|
1 | Low | 기본 속성(SpringApplication.setDefaultProperties) |
2 | @Configuration 클래스 | |
3 | application.properties 파일 | |
4 | OS 환경 변수 | |
5 | 자바 시스템 변수(System.getProperteis()) | |
6 | JNDI attributes(java:comp/env) | |
7 | ServletContext 초기화를 위한 매개변수 | |
8 | ServletConfig 초기화를 위한 매개변수 | |
9 | SPRING_APPLICATION_JSON(환경 변수 또는 시스템 변수에 포함된 인라인 JSON) | |
10 | Command Line Arguments | |
11 | @SpringBootTest와 함께 사용된 properties | |
12 | @TestPropertySource | |
13 | High | devtools 활성 상태일 때 $HOME/.config/spring-boot 디렉토리 내 devtools 전역 설정 |
보통 우리가 개발할 때 가장 많이 사용하는 설정은 2~3번 정도, 운영시 배포를 위해 사용하는 설정까지 포함하면 2~5번 정도로 설정파일을 사용합니다.
따라서 환경에 의존성이 있는 설정들을 우선순위에 맞게 사용할 필요가 있습니다.
특히 3번(application.properties)의 경우 파일 위치와 프로파일에 따른 우선순위가 적용됩니다.
- classpath 내부에 존재하면서 .config 디랙토리에 위치한 application.properties
- classpath 내부에 존재하면서 .config 디랙토리에 위치한 application-{profile}.properties
- classpath 내부에 존재하는 application.properties
- classpath 내부에 존재하는 application-{profile}.properties
- classpath 외부에 존재하면서 config 디렉토리에 위치한 application.properties
- classpath 외부에 존재하면서 config 디렉토리에 위치한 application-{profile}.properties
- classpath 외부에 존재하는 application.properties
- classpath 외부에 존재하는 application-{profile}.properties
보통 src/main/resources
내에 설정 파일을 위치시키는데 해당 경로는 classpath
로 설정되어있으므로 3, 4번에 해당하고, application.properties
를 기준으로 현재 활성화 된 프로파일의 속성을 오버라이드 시킵니다.
좀 더 우선순위가 낮은 설정파일을 추가하고 싶다면 resources/.config
내에 위치시키면 됩니다.
5~8번의 경우 classpath
외부에 위치하는데 애플리케이션을 실행하는 위치에 있는 설정파일입니다.
gradle
이나 java
명령어로 스프링 부트 애플리케이션을 실행시킬 때 보통 .jar
파일이 있는 곳에서 실행하게 되는데 그 위치에서 config
디렉토리 하위에 위치한 설정 파일이 classpath
에 있는 설정파일을 오버라이드 합니다.
그리고 .jar
파일과 동일한 디렉토리 내에 있는 설정 파일이 가장 높은 우선순위를 가집니다.
따라서 빌드 없이 외부 설정 파일만 바꾼 뒤 애플리케이션을 재시작하면 설정을 바꿔서 실행시킬 수 있습니다.
특히 로컬에서 IDE 등을 이용하는 경우 프로젝트 루트 디렉토리 또는 루트 디렉토리 내 config
디렉토리에 설정 파일을 따로 사용하고 .gitignore
에 추가하게 되면, 암호 등과 같은 민감한 정보를 git
에 같이 포함시키지 않고 공유할 수 있습니다.
Reference
'SpringBoot' 카테고리의 다른 글
커스텀 애너테이션에 @AliasFor 활용하기 (0) | 2022.09.01 |
---|---|
[SpringFramework] SpEL (Spring Expression Language, 스프링 표현식) (1) | 2021.07.29 |
스프링 부트에 graceful shutdown 적용하기 (0) | 2021.06.11 |
Spring Boot로 효율적인 Docker Image 만들기 (0) | 2021.06.11 |
Spring Boot 프로젝트를 웹 서버 기동 없이 실행시키기 (0) | 2020.07.02 |
- Total
- Today
- Yesterday
- JSON
- 스프링 부트 애플리케이션
- @ManyToOne
- JPA
- 클린 아키텍처
- intellij
- Spring Boot JPA
- 함께 자라기 후기
- Spring Data JPA
- spring boot jwt
- 스프링 부트 튜토리얼
- proto3
- 스프링부트
- Linux
- gRPC
- leetcode
- r
- 헥사고날 아키텍처
- Jackson
- Java
- 알고리즘
- 스프링 부트
- spring boot application
- 스프링 데이터 jpa
- QueryDSL
- 스프링 부트 회원 가입
- 함께 자라기
- Spring Boot
- spring boot app
- Spring Boot Tutorial
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |