
환경변수를 관리하는 방법은 다양하니 상황에 따라 맞는 방법을 선택하도록 하자
프론트엔드에서는 .env 파일을 만들어 추가적인 설정없이 사용이 가능하다. 하지만, Spring Boot Project에서는 추가적인 설정을 해주어야 .env 파일을 통해 환경변수 관리가 가능하다. (프론트엔드는 빌드 도구가 .env 파일을 포함한 모든 파일을 읽어 정적 파일을 생성하지만, Spring은 실행시점에 설정을 로드함으로 추가적인 설정을 해주어야 함)
프로젝트의 루트 디렉토리에 .env 파일을 생성한다.
DB_PASSWORD=my_secret_password
JWT_SECRET=my_super_secret_key
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 수정
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 가져오기
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 툴과 병행해 사용하면 환경변수 관리를 효율적으로 할 수 있다.