Spring Boot에서 properties 값 주입받기
개요
Spring Boot를 이용해서 어플리케이션을 만들다 보면 외부에서 특정 값들을 주입받아야 하는 경우가 있다. 예를 들면 AWS의 특정 컴포넌트를 사용하기 위한 secret key가 될 수도 있고 외부 API를 사용하기 위한 API key가 될 수도 있다. 이러한 값들을 소스 코드에 하드 코딩한다면 악의적인 의도를 가진 사람이 값을 탈취하여 사용하면서 큰일로 이어질 수 있다.
따라서 이렇게 중요한 값들을 application.properties
혹은 application.yml
과 같은 외부 설정값을 관리하는 파일에 적어두고 사용하기도 하고 .jar 파일을 실행하기 위한 커맨드에서 직접 값을 넘겨주기도 한다.
이번 글은 Spring Boot에서 외부 파일(ex.application.properties
, application.yml
)에 있는 값들을 소스 코드에 주입해서 사용하는 방법에 대해 살펴보고자 한다.
예제로 사용된 코드는 Github에서 확인 할 수 있다.
.properties vs .yml
글에서는 application.yml
을 사용할 것이기에 application.properties
와 application.yml
의 차이를 가볍게 짚고 넘어가고자 한다.
Spring Boot 어플리케이션을 생성하면 기본적으로 resources 디렉토리에 application.properties
파일이 생성되어있는 것을 확인할 수 있다. 이 파일을 그대로 이용해도 문제는 없지만 .yml을 이용하는 것보다 불편한 점이 있다.
만약 .properties 로 설정을 다음과 같이 작 성한다면
spring.datasource.hikari.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.hikari.jdbc-url=jdbc:mariadb://localhost:3306/testdb
spring.datasource.hikari.username=root
spring.datasource.hikari.password=root
spring.datasource.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.datasource.jpa.properties.hibernate.format_sql=true
spring.datasource.jpa.show-sql=true
spring.datasource.jpa.generate-ddl=true
.yml은 다음과 같이 표현이 가능해진다.
spring:
datasource:
hikari:
driver-class-name: org.mariadb.jdbc.Driver
jdbc-url: jdbc:mariadb://localhost:3306/testdb
username: root
password: root
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
format_sql: true
show-sql: true
generate-ddl: true
.yml을 이용함으로써 계층 구조로 설정값을 표현할 수 있고 prefix의 중복 제거가 가능해진다.
참고로 .yml 을 이용하기 위해서는 SnakeYAML 라이브러리가 classpath에 존재해야 한다. spring-boot-starter 의존성은 이 라이브러리를 기본적으로 제공해준다.
@Value
가장 간단하게 값을 주입하는 방식이다. 사용 방법은 @Value
어노테이션에 값을 가리키고 있는 placeholder를 명시해주거나 SpEL을 명시해주면 된다.