📡 백엔드/🌱 Spring Boot

[Spring] 스프링 부트 프로젝트에서 dotenv 환경변수 파일 사용하기

gengminy 2022. 8. 3. 14:12

스프링 프레임워크를 사용하는 웹앱 프로젝트를 진행하면서

환경변수를 저장하기 위한 방법을 검색해보았다

 

그런데 보통 .env.properties 파일을 만들어서

그 안에 있는 값을 또 프로퍼티 빈을 만들어서 불러오더라

 

이렇게 하더라도 비밀키 값 같은 거는

.gitignore 에다가 등록을 하면 되지만

다른 언어를 사용하다가 온 입장에서는

굳이 이렇게 해야하나 싶어서 뭔가 답답하다고 해야하나

 

그래서 이 프로젝트에서는

.env 파일을 사용해서 환경변수를 불러오는 방법을 도입시켜보았다

 

 

📝 /.env

PORT=8000
JWT_SECRET_KEY="MYSUPERSECRETJWTKEY"
...

우선 프로젝트 루트 디렉토리에 .env 파일을 만들었다

 

 

📝 /.gitignore

...
.env*

git을 사용중이라면 반드시 이 설정 파일을 gitignore에 등록해서

git에 딸려서 리모트 레포지토리에 올라가지 않도록 하자

안그러면 비밀키가 전세계에 노출되는 대 참사가 일어난다 (찬진맨 선생님 죄송해요 ^^)

 

 

📝 /src/main/resources/application.yml

server:
  port: ${PORT:8000}

spring:
  # .env import
  config:
    import: optional:file:.env[.properties]
  # Using POSTGRESQL
  datasource:
    url: jdbc:postgresql://${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}
    username: ${POSTGRES_USER}
    password: ${POSTGRES_PASSWORD}
    driver-class-name: org.postgresql.Driver

  jpa:
    database: postgresql
    database-platform: org.hibernate.dialect.PostgreSQLDialect
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        dialect: org.hibernate.dialect.PostgreSQLDialect
        database-platform: org.hibernate.dialect.PostgreSQLDialect

  thymeleaf:
    cache: false
    prefix: classpath:/templates/
    suffix: .html

logging.level:
    org.hibernate.SQL: debug
    org.hibernate.type: trace

우리 프로젝트의 설정 파일이다 yml 형식을 사용중이다

중요한 부분은 저 spring:config:import: 에다 .env 파일을 import 해주어야 한다

 

  config:
    import: optional:file:.env[.properties]

 

.env를 .env.properties 로 해석하여 가져오겠다는 뜻이다

optional을 붙여서 .env 파일이 있을 때만 들고오며

없어도 컴파일 오류는 안난다

 

또한 동일 yml 파일에서 환경변수 값을 읽을 때는

${변수명} 으로 가져오면 된다

  datasource:
    url: jdbc:postgresql://${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}
    username: ${POSTGRES_USER}
    password: ${POSTGRES_PASSWORD}
    driver-class-name: org.postgresql.Driver

 

기본값을 지정하고 싶다면

${변수명:기본값} 이런식으로 콜론을 붙여주면

해당 환경변수가 없을 때 자동으로 기본 값으로 들어가게 된다

server:
  port: ${PORT:8000}

 

 

📝 .../JwtTokenProvider

@Slf4j
@Component
public class JwtTokenProvider {
    /** 토큰 비밀 키 */
    @Value("${JWT_SECRET_KEY}")
    private String JWT_SECRET;

	...

마찬가지로 클래스 내에서 읽을 때는 클래스의 제일 바깥 블록 안에다가

@Value 에노테이션을 사용해서 가져온다

아래에 해당 값을 주입시킬 변수도 써주면 된다

 

스프링 프레임워크 빈 팩토리의 것을 import 해주면 된다