환경변수, 개발을 하면서 특히 DevOps를 하면서 중요한 개념이다.
환경변수란?
운영체제(OS) 수준에서 설정된 전역변수
프로그램이나 애플리케이션이 실행될 때 해당 값을 외부 설정 값으로 받아와서 사용할 수 있다.
사용 이유
1. 유연성 - 재배포 필요성 줄음
개발 및 배포를 할 때, 코드를 바꾸지 않고도 다른 환경에서 실행할 수 있는 것이 중요하다.
예를 들어, 개발용에서는 Swagger 설정을 쓰지만, 프로덕션 환경에서는 Swagger를 쓰지 않도록 설정을 하는 것이다.
환경 변수를 이해하고 잘 활용한다면, 코드 변경은 최소화하고 여러 환경에서 동작할 수 있게 할 수 있다.
**[개발 환경용 설정 파일]**
spring:
profiles:
active: dev
**[운영 환경용 설정 파일]**
spring:
profiles:
active: prod
2. 보안에 유리하다
예를 들어, 중요한 정보(이름, 비밀번호)를 포함해서 yml에 직접 적는 것은 보안상 매우 위험하다
**❌매우 위험❌**
password : pwd1234
**⭐ 안전 ⭐**
password : ${DB_PASSWORD}
환경 변수 확인 방법
리눅스
echo $환경변수명
printev
윈도우
echo %환경변수명%
주요 사용 방법 예시
1. Spring Profile 기반 설정
스프링에서는 환경별로 다른 설정을 적용하기 위해 Spring Profile이라는 기능을 제공한다.
이를 활용해서 운영환경(prod), 개발환경(dev), 테스트환경(test) 등 다양한 실행 환경에 따라 서로 다른 YML 파일을 분리해서 적용할 수 있어진다.
기본 YML 구조 구조
**[프로덕션 YML 설정]**
spring:
profiles:
active: dev # 이 YML 파일이 적용될 수 있는 조건
....
프로덕션 YML 설정 의미
- SPRING_PROFILES_ACTIVE 설정이 “dev”일 경우 해당 YML설정을 통해 코드가 ~된다는 것이다.
**[환경변수 주입 예시 - 도커 컴포즈 YML]**
services:
discodeit-server:
...
environment:
SPRING_PROFILES_ACTIVE: prod # 환경변수를 설정하여 실행할 프로파일 결정
environment.SPRING_PROFILES_ACTIVE: prod
- 도커 컨테이너가 실행될 때의 환경 설정
2. 환경변수를 이용한 YML 값 주입
스프링에서는 application.yml, application.properties 파일에서 ${} 문법을 통해 환경변수를 참조할 수 있다.
**[스프링에서 DB를 연결할 때 쓰는 흔한 방식]**
spring:
datasource:
url: jdbc:postgresql://${DB_HOST:localhost}:${DB_PORT:5432}/${DB_NAME:discodeit}
username: ${DB_USERNAME:user_name111}
password: ${DB_PASSWORD:pwd1234}
driver-class-name: org.postgresql.Driver
위의 코드는 스프링에서 yml 설정을 통해 DB를 연결할 때 쓰는 식이다.
근데 중간중간 ${~~}같은 것들이 들어있는데 이것들은 환경 변수를 활용한 예시다.
✅ ${ENV_VAR:defult} 문법
- ${ENV_VAR}
- 해당 환경변수 값을 읽는다.
- 예를 들어 ${DB_HOST: ~ } 는 OS의 환경변수의 Key값인 DB_HOST의 value값을 사용한다는 뜻
- ${ENV_VAR:default}
- 해당 환경변수가 없으면 default 값을 사용한다는 뜻
이러한 YML 설정을 활용한 도커 컴포즈 예시
services:
discodeit-server:
container_name: discode-server
build: .
ports:
- 8080:8080
environment:
DB_HOST: postgres-db
DB_PORT: 5432
DB_NAME: discode
DB_USERNAME: environuser
DB_PASSWORD: envvar1122
이 외에도 스프링을 사용할 때, RUN configuration에서 직접 설정하는 방법도 있고, CI/CD에서 환경변수 설정하는 다양한 방법이 있다.