프로젝트/메타버스 게임

[메타버스 게임] 캐쥬얼 배틀로얄 프로젝트 환경변수 세팅(.env)

마달랭 2025. 4. 9. 16:08

개요

소켓 서버 관련 소스 코드에 대한 설명은 끝났다. 이제 효율적으로 빌드 후 배포하는 과정만이 남았다.

궁극적으로 서버는 AWS EC2 환경에서 Docker 컨테이너에 띄워 관리해줄 것이다, 이후 CI/CD 파이프라인을 구축하여 소스코드 변경 시 자동으로 빌드 및 배포되도록 수정할 예정이다.

 

이를 위해 dockerfile, docker-compose, secrect 설정등을 해주어야 하는데 로컬에서만 관리하면 상관 없지만 public 레포지토리 등 다른 사람이 열람할 수 있는 곳에서 파일을 관리하게 된다면 의도하지 않게 다른 사람들에게 공개하면 안되는 데이터를 유출할 수도 있다.

 

따라서 환경변수 파일을 작성하여 다른 사람이 보면 안되는 내용을 숨겨서 관리하는 방법을 적용하게 되었다.

 

 

.env

SERVER_PORT=8082
SERVER_VERSION=1.1.0
DB_HOST=postgres
DB_PORT=5432
DB_USER=admin
DB_PASSWORD=admin
DB_NAME=gamedata

 

방법은 매우 간단하다, 위와같은 파일을 작성하여 .env파일로 저장해 주면 된다.

추후 docker-compose.yml파일 등에서는 .env에 작성된 값을 변수화 하여 참고할 수 있게 된다.

이를 통해 민감 정보를 외부에 공개하지 않고 감추어 관리할 수 있게 된다. 당연하게도 git에 push할 때에는 .env파일은 업로드되지 않도록 .gitignore를 통해 관리를 해주어야 한다.

 

 

cstdlib

.env파일을 통한 환경변수 세팅 후 해당 변수를 사용해 docker빌드가 되었을 경우 소스 코드에서도 해당 변수를 사용할 수 있게 된다. C++ 환경에서 STL인 cstdlib을 사용하게 된다면 .env파일에 기재된 환경 변수를 자유자재로 사용할 수 있다.

 

cstdlib는 C++ 표준 라이브러리로, C 언어의 stdlib.h 헤더 파일을 C++ 스타일로 감싼 것이다. 이 라이브러리는 다양한 유틸리티 함수와 매크로를 제공한다.

 

  • 메모리 할당 및 해제 (malloc, free, new, delete)
  • 난수 생성 (rand, srand)
  • 정수 산술 (abs, div)
  • 문자열 변환 (atoi, atol, strtol)
  • 검색 및 정렬 (qsort, bsearch)
  • 환경 변수 접근 (getenv)
  • 프로그램 종료 (exit, abort)

 

해당 라이브러리를 설명하는 이유는 환경변수를 가져올 수 있는 기능을 제공하는 getenv함수를 사용하기 위해선 해당 라이브러리를 import해주어야 하기 때문이다.

 

 

std::getenv

getenv 함수는 시스템의 환경 변수 값을 조회하는 데 사용된다.

char* getenv(const char* name);


함수 원형은 위와 같으며, 조회할 환경 변수의 이름을 매개변수로 전달하면 환경 변수가 존재하면 해당 변수의 값을 가리키는 문자열 포인터를 반환한다. 만약 환경 변수가 존재하지 않으면 NULL 포인터 반환된다.

 

// 기본 설정
short port = atoi(std::getenv("SERVER_PORT"));
std::string version = std::getenv("SERVER_VERSION");
std::string db_host = std::getenv("DB_HOST");
std::string db_port = std::getenv("DB_PORT");
std::string db_user = std::getenv("DB_USER");
std::string db_password = std::getenv("DB_PASSWORD");
std::string db_name = std::getenv("DB_NAME");
std::string db_connection_string =
    "dbname=" + db_name + " user=" + db_user + " password=" + db_password + " host=" + db_host +  " port=" + db_port +" client_encoding=UTF8";

 

위 내용을 보면 시스템 환경에 등록된 변수를 getenv함수를 통해 소스 파일 내부에서 변수로 파싱할 수 있음을 볼 수 있다.

이를 통해 서버 포트, 버전, DB관련 민감 정보를 환경 변수를 사용하여 은닉할 수 있다는 장점이 있다.

 

 

회고

프로젝트에 사용했던 산출물을 github와 같은 공개 레포지토리에 업로드 할 때마다 민감 정보에 대한 처리가 항상 신경이 쓰였었다. SpringBoot, FastAPI와 같은 프레임워크를 사용할 때에도 해당 기능을 이용했지만 C++ 프로젝트에서도 getenv라는 함수를 통해 환경 변수를 가져올 수 있다는 점을 알게 되었다.

728x90