Spring Boot Project, .env 파일로 환경변수 관리하기

Jihu Kim·2025년 1월 19일
post-thumbnail

환경변수를 관리하는 방법은 다양하니 상황에 따라 맞는 방법을 선택하도록 하자

.env 파일

프론트엔드에서는 .env 파일을 만들어 추가적인 설정없이 사용이 가능하다. 하지만, Spring Boot Project에서는 추가적인 설정을 해주어야 .env 파일을 통해 환경변수 관리가 가능하다. (프론트엔드는 빌드 도구가 .env 파일을 포함한 모든 파일을 읽어 정적 파일을 생성하지만, Spring은 실행시점에 설정을 로드함으로 추가적인 설정을 해주어야 함)

.env 파일 생성

프로젝트의 루트 디렉토리에 .env 파일을 생성한다.

DB_PASSWORD=my_secret_password
JWT_SECRET=my_super_secret_key

java-dotenv 라이브러리 활용(로컬에서)

java-dotenv 라이브러리를 추가한다. 이 방법은 로컬에서만

  • Gradle

    implementation 'io.github.cdimascio:java-dotenv:5.2.2'
  • Maven

    <dependency>
        <groupId>io.github.cdimascio</groupId>
        <artifactId>java-dotenv</artifactId>
        <version>5.2.2</version>
    </dependency>
  • Application.java 수정

    • java-dotenv 라이브러리를 활용한 .env 파일 로드
    import io.github.cdimascio.dotenv.Dotenv;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            // .env 파일 로드
            Dotenv dotenv = Dotenv.configure()
                                  .directory("./") // .env 파일 경로 설정 (기본: 프로젝트 루트)
                                  .load();
    
            // 환경변수를 시스템 프로퍼티에 추가
            dotenv.entries().forEach(entry ->
                    System.setProperty(entry.getKey(), entry.getValue())
            );
    
            SpringApplication.run(Application.class, args);
        }
    }
  • 환경변수 참조(application.yml)

    spring:
      datasource:
        password: ${DB_PASSWORD} # .env에서 DB_PASSWORD 가져오기
    jwt:
      secret: ${JWT_SECRET} # .env에서 JWT_SECRET 가져오기

Docker를 사용하는 환경일 때(배포환경 에서)

  • docker-compose.yml
    • env_file 설정을 사용하면 .env 파일을 컨테이너 내부로 복사하지 않고, .env 파일에 정의된 환경변수들을 읽어서 컨테이너의 환경변수로 설정
version: "4" # Docker Compose 버전

services:
  database: # MariaDB 컨테이너 설정
    image: mariadb
    container_name: my-mariadb # MariaDB 컨테이너 이름
    ports:
      - "3307:3306" # 외부 포트 3307을 컨테이너 포트 3306에 연결
    environment:
      MARIADB_ROOT_PASSWORD: ${DB_PASSWORD}
      MARIADB_DATABASE: auth # 기본 생성할 데이터베이스 이름
    networks:
      - my-network # 사용자 정의 네트워크에 연결
    restart: always # MariaDB가 중단되면 자동으로 재시작
    volumes:
      - mariadb-data:/var/lib/mysql # 데이터를 컨테이너 외부에 유지
    env_file:
      - .env

  app: # Spring Boot 애플리케이션 컨테이너 설정
    build: # Dockerfile을 사용해 이미지 빌드
      context: . # 현재 디렉토리를 빌드 컨텍스트로 사용
      dockerfile: Dockerfile # 사용할 Dockerfile
    container_name: my-app # Spring Boot 컨테이너 이름
    ports:
      - "8080:8080" # 외부 포트 8080을 컨테이너 포트 8080에 연결
    networks:
      - my-network # 사용자 정의 네트워크에 연결
    depends_on:
      - database
    restart: always # Spring Boot가 중단되면 자동으로 재시작
    env_file:
      - .env

networks:
  my-network: # 사용자 정의 네트워크 설정
    driver: bridge

volumes:
  mariadb-data: # 데이터 유지용 볼륨

추가적인 환경변수 관리

.env 파일은 .gitignore에 추가해 저장소에 올리지 않는다. 일반적으로 CI/CD에서 환경변수를 전달하게 된다.

클라우드 플랫폼(AWS, Google Cloud, Azure) 등에서 자체적으로 환경변수를 관리할 수 있는 도구를 제공한다.

추가적으로 GitHub Actions과 같은 CI/CD 툴과 병행해 사용하면 환경변수 관리를 효율적으로 할 수 있다.

profile
Jihukimme

0개의 댓글