.properties 혹은 .yml 파일에 노출되어서는 안되는 DB 연결 정보가 포함된 상태로 git repository에 올라가면 안된다. DB를 모두에게 공개하고 싶지 않다면 이 정보를 제거한 채로 git repository에 올려야한다. 아래와 같은 정보가 공개되면... 안된다.
application.yml
spring: datasource: username: dbusernamehere password: dbpasswordhere
이 때 사용되는 해결방법 중 하나가 DB 연결 정보를 환경 변수로 설정해두고 Spring application에서는 환경 변수를 끌어서 쓰는 방법이다.
아래처럼 ${환경 변수 이름}을 적어주면, 해당 application 파일을 가지고 기동되는 SpringBoot application이 속한 OS의 환경변수
값을 사용할 수 있다.
OS에 환경변수를 설정하는 법은 다양하다. 컨테이너에서 환경변수를 설정한다면 파라미터로 넘겨줄 수 있고, docker-compose를 이용한다면 .env 파일을 별도로 정의하여 포함시켜 사용하는 방법이 흔하다. 아니면 직접 리눅스계열이라면 매번 export로 설정해줄 수도 있고, 쉘 설정파일을 수정하여 자동으로 추가되게 할 수도 있다. 자세한 방법은 생략한다.
application.yml
spring: datasource: username: ${DB_USERNAME} password: ${DB_PASSWORD}
application 파일에 환경 변수 값을 설정해 놓았으니 이제 자바 코드에서 어떻게 이 값에 접근하는지 알아보자. 방법에는 두 가지가 있다.
@Value 어노테이션은 setter, constructor, field injections를 지원한다. 다음과 같이 환경 변수를 사용할 수 있다. 아래는 constructor injection의 예이다.
JwtTokenProvider 클래스의 생성자
public JwtTokenProvider( @Value("${jwt.properties.access-token-expiration-time-in-milliseconds}") long ACCESS_TOKEN_EXPIRATION_TIME, @Value("${jwt.properties.refresh-token-expiration-time-in-milliseconds}") long REFRESH_TOKEN_EXPIRATION_TIME) { this.ACCESS_TOKEN_EXPIRATION_TIME = ACCESS_TOKEN_EXPIRATION_TIME; this.REFRESH_TOKEN_EXPIRATION_TIME = REFRESH_TOKEN_EXPIRATION_TIME; }
@Value 어노테이션이 각각의 속성 값을 가져온다면, @ConfigurationProperties 어노테이션은 속성들을 그룹화하여 가져올 때 유용하다. prefix에 정의된 문자열을 접두사로 가지는 모든 속성을 검색한다.
아래의 경우에는 oauth2.xxx.xxx... 와 같은 모든 속성을 검색하여 매핑한다. 매핑되면 key: google, value: Provider가 Map 객체안에 들어있게 되고, Provider의 필드 jwks에는 application 파일의 jwks 속성 값이 들어있게 된다.
@Getter
@Component
@ConfigurationProperties(prefix = "oauth2")
public class OAuthProperties {
private final Map<String, Provider> provider = new HashMap<>();
@Getter
@Setter
public static class Provider {
private String jwks;
}
}
application.yml
oauth2: provider: google: jwks: > { "keys": [ { } ] } ...
그 후, 다음과 같이 사용할 수 있다.
@Autowired
OAuthProperties oAuthProperties
void method() {
String jwks = oAuthProperties.getProvider().getJwks();
}
https://www.baeldung.com/spring-boot-properties-env-variables