dotenv, Twelve-Factor App, Graceful Shutdown, side effect

gunny·2023년 12월 6일
0

Python

목록 보기
1/29

갑분 왠 개발일기냐라고 한다면,
2년 6개월 정도의 ai 개발 (이라고 쓰고 잡부라고 쓰는) 경력을 가지고 있음에도 불구하고, 이번 이직을 통해서 새로운 회사에서 새로운 프로젝트를 경험하게 됨에 따라 한없이 부족하고 또 부족한 실력이었음을 (알고있었음) 다시 한 번 여실히 깨닫게 되었다. (항상 톱밥이라고 생각하고 있어서, 시간이 흐르는 것에 대해서 무서움. 시간은 흐르고 경력은 쌓이는데 실력은 과연?)
아무튼 이번 이직을 계기로 좀 더 깊은 개발자가 되고자 부끄럽게 짝이없지만 몰랐던 부분들, 그리고 알았다고 착각했던 부분들을 기록하려고 한다.

dotenv

dotenv의 공식 문서(https://www.npmjs.com/package/dotenv)에 따르면

Dotenv is a zero-dependency module that loads environment variables from a .env file into process.env. Storing configuration in the environment separate from code is based on The Twelve-Factor App methodology.

Dotenv는 .env 파일의 환경 변수를 process.env로 로드하는 종속성이 없는 모듈이다. 코드와 별도의 환경에 구성을 저장하는 것은 Twelve-Factor App 방법론을 기반으로 합니다.

  • dotenv는 우리가 개발시 민감하고 보안이 이루어져야 하는 정보들을 환경변수 파일 (.env)를 외부에 만들어 접근할 수 있게 한다.
    설치 및 활용 방법은 위의 documentation 참고
  • .env 파일을 만들더라도 따로 .gitignore파일에 .env 파일을 추가 해줘야한다.
  • .env 파일은 루트에 위치해 있어야 하고, 혹시나 다른 경로를 원한다면 dotenv.config(경로)로 .env 파일의 위치를 직접 지정할 수 있다.

dotenv는 이번에 개발과정에서 OpenAI key, postgresql 등 db 접속을 위한 username, password 등의 정보를 따로 저장해놓은 .env 파일을 보면서 알게 됐는데, 아.. 기존에 만들었던 프로젝트들을 다 이렇게 수정해야겠다고 생각했다.
만들어져있던 프로젝트들 주말에 다 dotenv 활용하고 .gitignore 작업해야지

Twelve-Factor App

Twelve-Factor App 은 들어본적이 없지만 이번 dotenv document에서 dotenv에 대해서 찾아보면서 나온 개념이다.
dotenv가 코드와 분리된 별도의 환경에 환경 구성을 저장하는 것이 이 Twelve-Factor App 방법론에 기반되었다고 한다.

Twelve-Factor App 공식 사이트 한국 버전(https://www.12factor.net/ko/) 에 따르면

Twelve-Factor app은 소프트웨어를 서비스 형태로 제공하는 웹앱 혹은 SaaS(Software As A Service) 앱을 만들기 위한 방법론

특성으로는

  • 설정 자동화를 위한 절차(declarative) 를 체계화 하여 새로운 개발자가 프로젝트에 참여하는데 드는 시간과 비용을 최소화
  • OS에 따라 달라지는 부분을 명확히하고, 실행 환경 사이의 이식성을 극대화
  • 최근 등장한 클라우드 플랫폼 배포에 적합하고, 서버와 시스템의 관리가 필요없게 됨
  • 개발 환경과 운영 환경의 차이를 최소화하고 민첩성을 극대화하기 위해 지속적인 배포가 가능
  • 툴, 아키텍처, 개발 방식을 크게 바꾸지 않고 확장(scale up) 할 수 있다.
  • Twelve-Factor 방법론은 어떤 프로그래밍 언어로 작성된 앱에도 적용할 수 있고 백엔드 서비스(데이터베이스, 큐, 메모리 캐시 등)와 다양한 조합으로 사용할 수 있음

그래서 해당 12개의 요소는
(1) 코드베이스 : 버전 관리되는 하나의 코드베이스와 다양한 배포
(2) 종속성 : 명시적으로 선언되고 분리된 종속성
(3) 설정 : 환경(environment)에 저장된 설정
(4) 백엔드 서비스 : 백엔드 서비스를 연결된 리소스로 취급
(5) 빌드, 릴리즈, 실행 : 철저하게 분리된 빌드와 실행 단계
(6) 프로세스 : 애플리케이션을 하나 혹은 여러개의 무상태(stateless) 프로세스로 실행
(7) 포트 바인딩 : 포트 바인딩을 사용해서 서비스를 공개함
(8) 동시성(Concurrency) : 프로세스 모델을 사용한 확장
(9) 폐기 가능(Disposability) : 빠른 시작과 그레이스풀 셧다운(graceful shutdown)을 통한 안정성 극대화
(10) 개발/프로덕션환경 일치 : 개발, 스테이징, 프로덕션 환경을 최대한 비슷하게 유지
(11) 로그 : 로그를 이벤트 스트림으로 취급
(12) Admin 프로세스 : admin/maintenance 작업을 일회성 프로세스로 실행

이다.

여기서 또 모르는 그레이스풀 셧다운

그레이스풀 셧다운

프로그램이 OS 혹은 다른 소프트웨어로 인해 종료 될때 해당 task 를 안전하게 실행해서 완료 하고 process 와 connection 을 닫는 것을 의미

  • 그레이스풀 셧다운은 하고 있던 작업을 마무리한 뒤 종료되는 것이 핵심이다. 프로그램이 종료 될때 최대한 side effect가 없도록 로직을 잘 처리하고 종료하는 것이다.
  • 그레이스풀 셧다운의 반대는 hard shutdown이고, 종료 시그널과 동시에 모든 작업을 중단하는 것이다.

Side effect

Accessing an object designated by a volatile lvalue, modifying an object, calling a library I/O function, or calling a function
that does any of those operations are all size effects, which are changes in the state of the execution environment

휘발성 lvalue로 지정된 객체에 접근, 객체 수정, 라이브러리 I/O 함수 호출, 함수 호출과 같은 작업을 수행 시, 실행 환경 상태의 변화가 일어나는 행위라고 볼 수 있다.


만들어져있는 코드를 보다가 모르는 dotenv 라이브러리가 있었고,
그 뒤에 LLM 관련 영상을 보다가 dotenv가 계속 나오길래
한 번 정리해야겠다고 생각하던 찰나에 dotenv를 찾아보면서 줄줄이 고구마같이 twelve-factor app과 graceful shutdown, hardful shutdown, side effect까지 찾아보게 됐다.
벌써 2시잖아.. 출근해야 돼...
사실 이 3일동안 알게 된게 너무 많아서 정리해야하지만 오늘은 여기까지

profile
꿈꾸는 것도 개발처럼 깊게

0개의 댓글