환경 변수 (Environment Variables)
개념
환경 변수는 셸과 그 자식 프로세스들이 공유하는 이름-값 쌍이다. 프로그램이 시작될 때 필요한 설정을 환경 변수로 전달한다.
1
2
3
4
| # 환경 변수 사용 예
echo $HOME # /home/ubuntu
echo $PATH # /usr/local/bin:/usr/bin:/bin:...
echo $USER # ubuntu
|
주요 환경 변수
시스템 환경 변수
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| # 홈 디렉토리
echo $HOME # /home/ubuntu
# 현재 사용자 이름
echo $USER # ubuntu
# 호스트 이름
echo $HOSTNAME # my-server
# 셸의 종류
echo $SHELL # /bin/bash
# 현재 작업 디렉토리
echo $PWD # /home/ubuntu/app
# 이전 작업 디렉토리
echo $OLDPWD # /home/ubuntu
# 시스템 언어
echo $LANG # en_US.UTF-8
|
PATH - 명령어 검색 경로
PATH는 ls, python, node 같은 명령어를 찾을 때 검색하는 디렉토리 목록이다.
1
2
| echo $PATH
# /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
|
콜론(:)으로 구분된 경로들을 순서대로 검색해서 명령어를 찾는다.
1
2
3
| # python 명령어를 찾을 때
which python
# /usr/bin/python
|
PATH에 경로 추가
1
2
3
4
5
6
| # 현재 셸에서만 (임시)
export PATH=$PATH:/home/ubuntu/.local/bin
# 영구 설정 (홈 디렉토리에 .bashrc 편집)
echo 'export PATH=$PATH:/home/ubuntu/.local/bin' >> ~/.bashrc
source ~/.bashrc
|
환경 변수 설정하기
임시 설정 (현재 셸에서만)
1
2
3
4
5
6
7
| # 설정
export MY_VAR="hello"
# 사용
echo $MY_VAR # hello
# 셸 종료하면 사라짐
|
영구 설정 (재부팅해도 유지)
1
2
3
4
5
6
7
8
9
10
11
12
13
| # 1. ~/.bashrc 파일 편집 (현재 사용자용)
vi ~/.bashrc
# 파일 끝에 추가
export APP_ENV="production"
export DATABASE_URL="postgres://localhost/mydb"
export API_KEY="sk-1234567890"
# 2. 저장하고 적용
source ~/.bashrc
# 3. 확인
echo $APP_ENV # production
|
전역 설정 (모든 사용자)
1
2
3
4
5
6
7
| # /etc/environment 파일 편집 (root만)
sudo vi /etc/environment
# 파일 내용
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
LANG="en_US.UTF-8"
APP_ENV="production"
|
.bashrc vs .bash_profile vs .profile
.bashrc - 인터랙티브 셸 설정
1
2
3
4
5
6
7
| # ~/.bashrc
# 대화형 셸이 시작될 때마다 실행됨
export PATH=$PATH:/home/ubuntu/.local/bin
export PS1="\u@\h:\w$ " # 프롬프트 형태
alias ll='ls -lah'
alias grep='grep --color=auto'
|
언제 실행: 터미널을 열 때마다
.bash_profile - 로그인 셸 설정
1
2
3
4
5
6
7
| # ~/.bash_profile
# 로그인할 때만 실행됨 (SSH 접속 시)
# 보통 .bashrc를 실행
if [ -f ~/.bashrc ]; then
source ~/.bashrc
fi
|
언제 실행: SSH로 접속할 때
.profile - POSIX 호환 설정
1
2
3
4
| # ~/.profile
# sh 및 호환 셸에서 실행
export PATH=$PATH:/home/ubuntu/.local/bin
|
관계
1
2
3
4
5
6
7
8
9
10
| 로그인 셸
↓
.bash_profile 또는 .profile 실행
↓
(보통 .bashrc도 함께 실행)
↓
인터랙티브 셸 (이미 로그인한 상태)
↓
.bashrc 실행
|
환경 변수 확인 및 관리
모든 환경 변수 확인
1
2
3
4
5
6
7
8
9
| # 환경 변수만 확인
env
# 셸 변수 + 환경 변수 확인 (함수도 포함)
set
# 특정 변수 확인
echo $PATH
echo $HOME
|
변수 설정 해제
1
2
3
4
5
| # 변수 삭제
unset MY_VAR
# 확인
echo $MY_VAR # (아무것도 출력 안 됨)
|
읽기 전용 변수
1
2
3
4
5
6
7
8
9
| # 한 번 설정하면 변경 불가
readonly DATABASE_URL="postgres://localhost"
# 변경 시도
export DATABASE_URL="postgres://other"
# bash: DATABASE_URL: readonly variable
# 읽기 전용 변수 확인
readonly -p
|
실제 사용 사례
배포 환경 설정
1
2
3
4
5
6
7
| # ~/.bashrc
export APP_ENV="production"
export NODE_ENV="production"
export DATABASE_URL="postgres://user:pass@db.example.com/mydb"
export REDIS_URL="redis://localhost:6379"
export API_PORT="3000"
export LOG_LEVEL="info"
|
개발 환경 설정
1
2
3
4
5
| # ~/.bashrc (개발 머신)
export APP_ENV="development"
export NODE_ENV="development"
export DATABASE_URL="postgres://localhost/mydb_dev"
export DEBUG="app:*"
|
프로젝트별 환경 변수
1
2
3
4
5
6
7
8
9
10
11
12
| # ~/app/.env 파일 생성
DATABASE_URL="postgres://localhost/mydb"
API_KEY="sk-1234567890"
SECRET_KEY="secret-key-xyz"
# 스크립트에서 로드
#!/bin/bash
set -a
source .env
set +a
echo "Database: $DATABASE_URL"
|
Python/Node.js 애플리케이션
1
2
3
4
5
6
7
| # Node.js (환경 변수 사용)
#!/bin/bash
export NODE_ENV="production"
export PORT="3000"
export DATABASE_URL="postgres://localhost/mydb"
node app.js
|
1
2
3
4
5
6
7
8
9
| # Python (환경 변수 읽기)
import os
app_env = os.getenv('APP_ENV', 'development')
database_url = os.getenv('DATABASE_URL', 'sqlite:///db.sqlite')
debug = os.getenv('DEBUG', 'false').lower() == 'true'
print(f"환경: {app_env}")
print(f"DB: {database_url}")
|
환경 변수 Best Practices
1. 보안 정보는 환경 변수로
1
2
3
4
5
| # ❌ 나쁜 예 (코드에 직접 쓰기)
const API_KEY = "sk-1234567890"
# ✅ 좋은 예 (환경 변수)
const API_KEY = process.env.API_KEY
|
2. .env 파일 .gitignore에 추가
1
2
3
4
| # .gitignore
.env
.env.local
.env.*.local
|
1
2
3
4
| # .env 파일 예
DATABASE_URL="..."
API_KEY="..."
SECRET_KEY="..."
|
3. 환경별로 다른 설정
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # .env.development
DATABASE_URL="postgres://localhost/mydb_dev"
DEBUG="true"
# .env.production
DATABASE_URL="postgres://db.example.com/mydb"
DEBUG="false"
# 로드 스크립트
#!/bin/bash
ENV=${APP_ENV:-development}
set -a
source .env.$ENV
set +a
|
4. 환경 변수 필수 확인
1
2
3
4
5
6
7
8
9
10
11
12
13
| #!/bin/bash
# 필수 환경 변수 확인
required_vars=("DATABASE_URL" "API_KEY" "SECRET_KEY")
for var in "${required_vars[@]}"; do
if [ -z "${!var}" ]; then
echo "Error: $var is not set"
exit 1
fi
done
echo "모든 필수 환경 변수가 설정됨"
|
프로세스에 전달하기
명령어 실행 시 환경 변수 설정
1
2
3
4
5
| # 한 번만 적용
DATABASE_URL="postgres://localhost" python app.py
# 여러 개 설정
NODE_ENV="production" PORT="8080" DEBUG="true" node server.js
|
서비스 시작 시 환경 변수
1
2
3
4
5
6
7
8
9
10
11
12
| # systemd 서비스 파일 (/etc/systemd/system/myapp.service)
[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/app
ExecStart=/usr/bin/node server.js
Environment="NODE_ENV=production"
Environment="PORT=3000"
EnvironmentFile=/home/ubuntu/app/.env
Restart=always
RestartSec=10
|
참고
- 환경 변수는 프로세스 격리 (각 프로세스가 독립적인 복사본 유지)
-
export하지 않으면 자식 프로세스가 상속받지 못함 - 민감한 정보(API 키, 비밀번호)는 절대 코드에 하드코딩하지 말 것
- 배포 시 환경 변수 설정을 자동화하는 것이 중요함