[Spring] application.properties에 대해
Spring Boot를 사용하는 누구든, DB 연결 설정이나 JPA 관련 설정을 위해 application.properties
파일을 한 번 쯤은 작성해 봤을 것이다. 대충 감으로 어플리케이션의 속성 값을 지정해 주는 파일일 것이라고 추측은 할 수 있겠지만, 정확이 어떤 역할을 하며, 어떤 속성들을 가지고 있는 지 궁금해져 관련 포스팅을 하기로 했다.
Goals
- application.properties 파일의 역할
- application.properties을 사용하는 이유
- 설정 파일 우선 순위
- application.properties 파일에 지정된 속성 값 사용 방법
- application.properties vs application.yml
application.properties 파일의 역할
Spring 공식 문서에서는 application.properties
파일을 다음과 같이 한 문장으로 정의한다.
애플리케이션을 구성하는 데 사용할 수 있는 공통 애플리케이션 속성 - Spring 공식 문서
application.properties
파일은 애플리케이션 구성을 지정하는 데 사용된다. 이 파일은 Spring Boot 애플리케이션에서 사용하는 다양한 속성을 설정할 수 있는 중요한 구성 파일이다.
예를 들어, 데이터베이스 연결 정보나 로그 파일 경로, 서버 포트, 캐싱 관련 속성, 보안 관련 설정 등 다양한 설정을 이 파일에서 지정할 수 있다. 이렇게 지정된 속성은 애플리케이션에서 사용되는 모든 구성 요소에서 읽어올 수 있다.
공식 문서를 들어가 보면 설정할 수 있는 속성 목록들을 확인할 수 있다.
https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html
application.properties
파일은 기본적으로 src/main/resources
폴더에 위치하며, Spring Boot는 이 파일을 자동으로 로드하여 애플리케이션 구성에 적용한다.
application.properties을 사용하는 이유
그럼 Spring에서 굳이 따로 파일을 만들어 속성들을 관리하는 이유가 뭘까?
환경 분리
다양한 이유가 있겠지만, 가장 큰 이유 중 하나는 어플리케이션을 배포할 때 개발 단계, 테스트 단계, 운영 단계 등 다양한 환경에 다라 속성 값들이 달라질 수 있기 때문이다.
예를 들어, 개발, 테스트, 운영 환경에서는 데이터베이스 연결 정보나 로그 레벨 등이 다르게 설정되어야 한다. 어플리케이션 속성 관리 파일을 통해 각 환경에 맞게 설정들을 분리함으로써 배포 시 오류를 줄일 수 있고, 유지 보수도 간편해 진다.
간편한 구성
application.properties
파일은 설정 정보를 키-값 쌍의 형식으로 저장하므로, 구성 정보를 간단하게 작성할 수 있다. 이 파일을 사용하면 코드에서 구성 정보를 하드코딩하지 않고, 런타임에 쉽게 변경할 수 있다.
외부 구성 소스와의 통합
Spring은 application.properties
파일 외에도 다양한 외부 구성 소스와 통합할 수 있다. 예를 들어, YAML 파일, 환경 변수, 커맨드 라인 인자, JNDI 등 다양한 소스에서 구성 정보를 가져와서 사용할 수 있다. 이를 통해 Spring은 유연하게 구성 정보를 관리할 수 있다.
설정 파일 우선 순위
위에서 Spring은 다양한 외부 구성 소스와 통합할 수 있다는 말을 했다. 때문에 다양한 설정 파일들이 통합될 때 설정이 겹치는 상황이 발생할 수도 있다. 이럴 때를 대비해 각 설정 소스들에는 우선 순위가 존재한다.
(스프링 공식 문서 참고)
아래로 갈수록(순서의 숫자가 높아질 수록) 우선순위가 높은 것이고, 아래의 설정이 위의 설정을 override 하게 된다.
- 기본 속성( 설정으로 지정됨 SpringApplication.setDefaultProperties)
@PropertySource
클래스에 대한 어노테이션인@Configuration
- Config data(예:
application.properties
파일) random.*
에 있는RandomValuePropertySource
- OS 환경 변수
- Java 시스템 속성(
System.getProperties()
) java:comp/env
에 있는 JNDIServletContext
초기화 매개변수.ServletConfig
초기화 매개변수.SPRING_APPLICATION_JSON
(환경 변수 또는 시스템 속성에 포함된 인라인 JSON)의 속성- 커맨드 라인 인수
@SpringBootTest
애노테이션의properties
- 테스트에 있는
@TestPropertySource
$HOME/.config/spring-boot
에 있는spring-boot-dev-tools.properties
위 우선 순위에 따르면 application.properties
파일의 속성 값을 커맨드 라인으로 지정한 속성 값이 override하게 된다.
application.properties 파일에 지정된 속성 값 사용 방법
Spring에서 application.properties
파일에 지정된 속성 값을 사용하려면, 다음과 같은 방법을 사용할 수 있다.
@Value
어노테이션 사용
@Value
어노테이션을 사용하여 application.properties
파일에서 지정된 속성값을 가져올 수 있다.
// server.port 속성 값을 가져올 수 있다.
@Value("${server.port}")
private int serverPort;
@ConfigurationProperties
어노테이션 사용
@ConfigurationProperties
어노테이션을 사용하여 application.properties
파일에서 지정된 여러 속성 값을 한 번에 가져올 수 있다.
// myapp 프로퍼티 그룹의 모든 속성 값을 가져올 수 있다.
@ConfigurationProperties(prefix = "myapp")
public class MyAppProperties {
private String name;
private String version;
// ...
}
Environment
객체 사용
Environment
객체를 사용하여 application.properties
파일에서 지정된 속성 값을 가져올 수 있다.
@Autowired
private Environment env;
public int getServerPort() {
return Integer.parseInt(env.getProperty("server.port"));
}
이렇게 application.properties
파일에 지정된 속성 값을 가져와서 사용하는 방법은 다양하지만, 대부분의 경우 @Value
어노테이션을 사용하는 것이 간단하고 편리하다.
application.properties vs application.yml
application.properties
는 기본적으로 키-값 쌍의 형식으로 구성 정보를 저장한다. 예를 들어, server.port=8080
과 같이 키와 값을 =
로 구분하여 작성한다. 이 파일 형식은 구성 정보가 간단하고 직관적인 경우에 사용하기 적합하다.
반면에, application.yml
은 YAML 형식으로 구성 정보를 저장한다. YAML은 들여쓰기를 사용하여 데이터를 구분하고 계층 적인 구조를 표현한다.
server:
port: 8080
context-path: /myapp
myapp:
name: MyApp
version: 1.0.0
위 YAML 파일은 server
와 myapp
두 개의 그룹으로 구성된 구성 정보를 저장하고 있다. server
그룹에서는 port
와 context-path
속성을, myapp
그룹에서는 name
과 version
속성을 지정하고 있다.
application.yml
파일은 들여쓰기에 따라 계층 구조가 표현되므로, 복잡한 구성 정보를 저장하기에 적합하다. 또한, 인라인 리스트나 맵 등을 사용하여 간결하게 작성할 수 있다.