프로젝트 환경변수 관리하기

White 와잇·2024년 11월 5일
post-thumbnail

목적

지금까지 개발을 해오면서 환경변수 설정을 하라는대로 해왔다.
처음 맥북을 샀을 때 java나 c++ 개발을 하기 위해 구글링해서 나온 개발 환경 세팅 튜토리얼을 따라하며 시스템 환경변수를 설정하기도 하고,
강의를 들으며 프로젝트 환경변수 설정을 따라해보기도 하였다.

직접 환경변수를 만들어 보기도 하여 감이 잡혀가는 중인데..
한 가지, 팀 협업을 하면서 환경변수 설정이 불편한 부분이 많았다. 각 팀원이 설정한 환경변수를 공유해야하는데 매번 수동으로 고치고 있다.

이 글의 이유는 바로 다음과 같다.

프로젝트의 여러 팀원과 공통된 환경변수를 편리하게 공유하고 싶다.

먼저 팀원들과 공유하기 전에 환경변수를 로컬에서 어떻게 구성하는 것이 바람직한지 알아보면 좋겠다고 생각했다.

로컬 머신에서 환경변수를 구성하는 방법

환경변수를 구성하는 방법에는 여러 가지가 있고 그 중 대표적인 방법들을 찾아봤다.

터미널에서 임시로 설정하는 방법

터미널에서 현재 세션 동안만 유효한 환경변수를 설정하여 터미널을 닫으면 설정 초기화

예시 (bash)

$ export API_KEY="your_api_key_here"

장점

  • 간단 설정, 테스트 목적 등 단기 작업에 유용

단점

  • 세션마다 다시 설정해야 함

시스템 전역에 설정하는 방법

환경변수를 로컬 시스템 전역에 설정하면, 모든 터미널 세션에서 사용 가능

예시
macOS/Linux
~/.bash_profile 또는 ~/.bashrc 또는 ~/.zshrc 파일에 환경변수 추가 후, 파일을 소스하거나 터미널을 재시작

$ export API_KEY="your_api_key_here"
$ source ~/.bash_profile

Windows: 시스템 속성 > 고급 > 환경 변수에 추가

장점

  • 한 번만 설정하면 영구적으로 사용
  • 프로젝트에 종속적이지 않은 환경변수라면 하나의 환경변수만 지정해도 여러 프로젝트에서 사용가능

단점

  • UNIX 계열 사용자별 환경변수 파일(~/.bashrc, ~/.bash_profile, ~/.zshrc) 또는 macOS /etc/paths 파일 설정이 필요함. 복잡한 관리
  • 전역 환경 변수 관리의 어려움, 여러 프로젝트에서 사용하면 충돌 위험성 존재

.env 파일을 사용하는 방법

.env 파일에 환경변수를 정의해두고, 애플리케이션에서 이를 로드하는 방식
여러 언어에서 .env 파일을 쉽게 로드할 수 있는 패키지가 제공됨

Python: python-dotenv
Node.js: dotenv
Java (Spring Boot): Dotenv 라이브러리

예시 (Java)
.env

API_KEY=your_api_key_here
DB_HOST=localhost

DotenvConfig.java

// Dotenv 객체를 생성하여 환경 변수 파일(.env)을 로드하고 빈으로 등록합니다.
@Configuration
public class DotenvConfig {
    @Bean
    public Dotenv dotenv() {
        return Dotenv.configure().load();
    }
}

DataSourceConfig.java

// 환경 변수 파일(.env)에서 MySQL 데이터베이스 설정 정보를 가져와 연결을 구성합니다.
@Configuration
@RequiredArgsConstructor
public class DataSourceConfig {
    private final Dotenv dotenv;
    @Bean
    public DataSource dataSource() {
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl(
            "jdbc:mysql://" + dotenv.get("DB_HOST") + ":" + dotenv.get("DB_PORT") + "/"
                + dotenv.get("DB_NAME"));
        dataSource.setUsername(dotenv.get("DB_USERNAME"));
        dataSource.setPassword(dotenv.get("DB_PASSWORD"));
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        return dataSource;
    }
}

장점

  • 애플리케이션별로 설정이 가능해 환경변수 충돌 가능성 낮음
  • 여러 언어와 프레임워크에서 지원

단점

  • 환경변수 로드를 위한 추가 패키지 설정이 필요함

IDE 제공 프로젝트 설정 파일 사용

주요 IDE는 환경변수를 프로젝트 설정 파일에 지정 가능함

예시
Visual Studio Code: .vscode/settings.json
IntelliJ: Run/Debug Configurations 에서 환경변수 설정

장점

  • 편리함, 쉬움
  • 프로젝트별 환경변수 설정 가능

단점

  • 해당 개발 환경에 종속됨. VSC에서 개발하다가 IntelliJ로 변경한다면 다시 환경변수 설정이 필요함

번외) Docker 및 Docker-Compose 사용 시 환경변수 설정

Docker 위에서 돌아가는 애플리케이션의 경우 OS와 분리되어 있어
Docker에도 환경변수를 전달해주어야 함

예시 (docker-compose.yml)

services:
  web:
    image: your_image
    environment:
      - API_KEY=${API_KEY}

또는 .env 파일을 Docker에 전달


내가 한 방법

뭘 모를 때는 IntelliJ 환경변수 설정 창에서 모든 환경변수를 관리했었다. (현재는 지워서 없음)
그리고 팀원들과 공유할 때는 Environment variables를 [Ctrl+C] - [Ctrl+V] 하여 일일이 알려주었다. 어쩌다 새로운 환경변수를 빼먹고 알려주지 않으면 팀원들은 왜 서버가 뜨지 않냐며 물어온다.

처음에는 괜찮아도 환경변수가 몇 십개가 되니 불편해졌다.

그래서

.env 파일을 사용하기로 하였다!
파일을 공유하기만 하면 되기 때문이다.

그런데 문제가 있다.
환경변수는 보안에 민감한 정보를 포함하는 경우가 많아서!
되도록이면 .env 파일을 .gitignore에 추가하여 버전 관리에서 제외하는 것이 좋다.

그렇다면 .env 파일을 팀원들과 어떻게 공유할 것이냐????????
메일이나 카카오톡 같은 메신저에 첨부해버릴까?
뭐 그것도 방법일 수는 있겠는데.

개발자스럽진 않다… 이것도 변경사항이 발생할 때마다 건네주는 건 번거롭다는 것은 똑같음.


팀원과 환경변수를 공유하는 방법

GitHub Secrets 사용

.env 파일을 Artifact로 공유

GitHub Codespaces

클라우드 환경의 IDE

profile
웹개발 도전! 데브옵스 도전!

0개의 댓글