티스토리 뷰

728x90
반응형

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

JDBC 드라이버 지정 속성
Thymeleaf 관련 속성들

application.properties 파일은 기본적으로 src/main/resources 폴더에 위치하며, Spring Boot는 이 파일을 자동으로 로드하여 애플리케이션 구성에 적용한다.

 

application.properties을 사용하는 이유


그럼 Spring에서 굳이 따로 파일을 만들어 속성들을 관리하는 이유가 뭘까?

환경 분리

다양한 이유가 있겠지만, 가장 큰 이유 중 하나는 어플리케이션을 배포할 때 개발 단계, 테스트 단계, 운영 단계 등 다양한 환경에 다라 속성 값들이 달라질 수 있기 때문이다.

예를 들어, 개발, 테스트, 운영 환경에서는 데이터베이스 연결 정보나 로그 레벨 등이 다르게 설정되어야 한다. 어플리케이션 속성 관리 파일을 통해 각 환경에 맞게 설정들을 분리함으로써 배포 시 오류를 줄일 수 있고, 유지 보수도 간편해 진다.

간편한 구성

application.properties 파일은 설정 정보를 키-값 쌍의 형식으로 저장하므로, 구성 정보를 간단하게 작성할 수 있다. 이 파일을 사용하면 코드에서 구성 정보를 하드코딩하지 않고, 런타임에 쉽게 변경할 수 있다.

외부 구성 소스와의 통합

Spring은 application.properties 파일 외에도 다양한 외부 구성 소스와 통합할 수 있다. 예를 들어, YAML 파일, 환경 변수, 커맨드 라인 인자, JNDI 등 다양한 소스에서 구성 정보를 가져와서 사용할 수 있다. 이를 통해 Spring은 유연하게 구성 정보를 관리할 수 있다.

 

설정 파일 우선 순위


위에서 Spring은 다양한 외부 구성 소스와 통합할 수 있다는 말을 했다. 때문에 다양한 설정 파일들이 통합될 때 설정이 겹치는 상황이 발생할 수도 있다. 이럴 때를 대비해 각 설정 소스들에는 우선 순위가 존재한다.

(스프링 공식 문서 참고)

아래로 갈수록(순서의 숫자가 높아질 수록) 우선순위가 높은 것이고, 아래의 설정이 위의 설정을 override 하게 된다.

  1. 기본 속성( 설정으로 지정됨 SpringApplication.setDefaultProperties)
  2. @PropertySource 클래스에 대한 어노테이션인 @Configuration
  3. Config data(예: application.properties 파일)
  4. random.*에 있는 RandomValuePropertySource
  5. OS 환경 변수
  6. Java 시스템 속성(System.getProperties())
  7. java:comp/env에 있는 JNDI
  8. ServletContext 초기화 매개변수.
  9. ServletConfig 초기화 매개변수.
  10. SPRING_APPLICATION_JSON(환경 변수 또는 시스템 속성에 포함된 인라인 JSON)의 속성
  11. 커맨드 라인 인수
  12. @SpringBootTest 애노테이션의 properties
  13. 테스트에 있는 @TestPropertySource
  14. $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 파일은 servermyapp 두 개의 그룹으로 구성된 구성 정보를 저장하고 있다. server 그룹에서는 portcontext-path 속성을, myapp 그룹에서는 nameversion 속성을 지정하고 있다.

application.yml 파일은 들여쓰기에 따라 계층 구조가 표현되므로, 복잡한 구성 정보를 저장하기에 적합하다. 또한, 인라인 리스트나 맵 등을 사용하여 간결하게 작성할 수 있다.

 

References

728x90
반응형
댓글