Spring Boot에서 환경 변수 사용하기

고범수·2023년 8월 22일
2

Spring Boot

목록 보기
11/12

상황

.properties 혹은 .yml 파일에 노출되어서는 안되는 DB 연결 정보가 포함된 상태로 git repository에 올라가면 안된다. DB를 모두에게 공개하고 싶지 않다면 이 정보를 제거한 채로 git repository에 올려야한다. 아래와 같은 정보가 공개되면... 안된다.

application.yml

spring:
  datasource:
    username: dbusernamehere
    password: dbpasswordhere

해결 방법

이 때 사용되는 해결방법 중 하나가 DB 연결 정보를 환경 변수로 설정해두고 Spring application에서는 환경 변수를 끌어서 쓰는 방법이다.

application 파일(.properties 혹은 .yml)에서 환경 변수를 사용하는 방법

아래처럼 ${환경 변수 이름}을 적어주면, 해당 application 파일을 가지고 기동되는 SpringBoot application이 속한 OS의 환경변수
값을 사용할 수 있다.

OS에 환경변수를 설정하는 법은 다양하다. 컨테이너에서 환경변수를 설정한다면 파라미터로 넘겨줄 수 있고, docker-compose를 이용한다면 .env 파일을 별도로 정의하여 포함시켜 사용하는 방법이 흔하다. 아니면 직접 리눅스계열이라면 매번 export로 설정해줄 수도 있고, 쉘 설정파일을 수정하여 자동으로 추가되게 할 수도 있다. 자세한 방법은 생략한다.

application.yml

spring:
  datasource:
    username: ${DB_USERNAME}
    password: ${DB_PASSWORD}

application 파일에서 설정한 속성값을 코드에서 사용하는 방법

application 파일에 환경 변수 값을 설정해 놓았으니 이제 자바 코드에서 어떻게 이 값에 접근하는지 알아보자. 방법에는 두 가지가 있다.

1. @Value 어노테이션을 사용하는 방법

@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;
    }

2. @ConfigurationProperties 어노테이션을 사용하는 방법

@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

0개의 댓글