[spring] 외부 설정 사용
스프링 부트와 관련된 각종 설정은 일반적으로 application.properties 파일에 저장한다. 이 파일은 각종 설정을 담고 있기 때문에 git에 직접 커밋하는 경우도 많다.
그런데, 모든 정보를 git 또는 github 환경에 공개할 수는 없다. 메일 API나 데이터베이스 연결 등 스프링을 다른 시스템과 연동하기 위해서는 해당 시스템에 대한 username과 password가 필요한데, 이러한 정보를 외부에 노출하는 순간 해커의 공격으로 데이터를 잃어버리거나, 디도스 공격 등을 통해 엄청난 금액의 손실을 맛볼 수 있다.
따라서, 여러 계정과 관련된 정보의 경우 스프링 설정이라고 하더라도 커밋되지 않는 별도의 파일에 저장해두는 것이 적합하다고 생각했다. node.js 진영의 .env 파일처럼, 비밀 정보를 저장하고 싶은 것이다.
스프링은 application.properties 이외의 파일에서 가져오도록 하는 여러가지 방법을 제공하고 있다.
spring.config.import
별도의 자바 파일이 필요 없는, 가장 간단한 방식이다.
spring.config.import=optional:secrets.properties
- optional: 구성 파일이 없어도 어플리케이션 실패 X
- classpath: 클래스 경로를 기준으로 위치 지정. 일종의 상대경로?로 참조하는 방식
- file: 파일 시스템 상 절대 경로를 지정
별도 자바 파일 없이 application.properties에 설정만 추가하면 알아서 비밀 파일을 인식한다.
@PropertySource
PropertySource 어노테이션을 이용하면 application.properties 이외의 파일에서 설정 정보를 읽어올 수 있다.
@Configuration
@PropertySource("classpath:secrets.properties")
@EnableConfigurationProperties(SecretConfig.class)
public class EnableSecretPropertiesConfig { }
@Getter
@Setter
@ConfigurationProperties(prefix = "mytest")
public class SecretConfig {
private String username;
private String password;
}
- @PropertySource("path"): path에 있는 설정 정보를 읽어 스프링이 관리하는 설정에 넣는다.
- @ConfigurationProperties(prefix="~"): 필드에 대응되는 프로퍼티들을 바인딩 한 객체를 만든다. ( 링크 )
예전부터 사용한 방식인듯 하다. 설정을 사용하는 방식이 스프링스럽긴 하지만, 설정 파일이 추가될 때마다 자바 코드 컴파일이 필요하다는 점에 있어서 spring.config.import를 이용하는 방식이 더 좋아 보인다. @ConfigurationProperties가 @PropertySource에 묶여 있는 방식이 아니다보니 단순 설정 방식에 비해 큰 장점이 있나? 싶다.
Baeldung에 여러가지 설정 방법이 잘 정리되어 있어 링크를 남긴다. 난 spring.config.import를 사용하는게 좋아보인다.