Today I Lived/Humanscape - 2023

23.12.06 - Environment management in Nest.js

장 상 현 2023. 12. 10.

Nest.js로 개발을 하다 보니, 불편한 게 있었다

 

Nest.js는 자체적으로 제공하는 registerAs 함수를 사용한 모듈 방식으로 환경변수를 관리하는데

 

간결하고 직관적인 장점이 있지만, 직접 참조 방식이기에 타입을 명시적으로 지정해야 하며

 

키 또는 값이 변경될 때마다 적용 중인 코드 모두를 수정해야 한다

 

아래처럼 Nest.js의 config module에서 도메인 별로 선언한 파일에 대해 .get('app') 방식으로 지정하여 사용한다는 말!

 

나쁘지는 않다

 

위에서 말한 대로, 직관적이다

 

반면 메서드나 함수 타고 들어가듯 어디서 어떻게 사용되는지 찾아내는 게 불가하고

 

같은 값을 여러 곳에서 사용 중이면, 수정 시 모든 곳을 바꿔야 한다

 

이런 군침 싹 도는 불편함을 개선하지 않고 참을 수 있나?

 

그래서, 방법을 찾아봤다

 

registerAs 함수를 사용해 환경변수를 도메인 별로 설정해 둔 ts 파일을 Service Class로 바꾸고

 

Nest.js Conifg 자체에서 일괄 처리가 아닌

 

필요한 곳에서 import 하여 인스턴스화 한다!

 

그렇게 하면, 클래스 내부의 메서드 사용하듯 아래처럼 사용이 가능해진다

이제 이런 장점이 생긴다

 

 - 값 변동 시 한 곳에서 처리 가능한 편리함

 

 - 타입스크립트의 타입 추론 기능을 통한 타입 관리로 런타임 에러 방지

 

 - 모듈화에 대한 의존성 명시

 

 

내가 했지만 기가 막혔다

 

뿌듯하다

 

환경변수 설정을 바꿨기에 로컬 테스트도 꼼꼼히 했다

 

PR 리뷰를 반영해 만족할 만한 개선이 되었다

 

개발 서버에 올라갔다

 

아주 좋다!

 

...

 

...

 

...

 

로 끝날 리가 없지

 

개발 서버에 적용되고 다음 날

 

개발 서버를 사용하는 다른 분들의 호출이 시작됐다

 

몇 개의 환경변수를 불러오지 못하는 문제가 발생!

 

하지만 당황하지 않는다

 

이럴 때를 위해 형상관리를 하잖아?

 

개발 서버는 정상화해야 하니까 누구보다 빠르게 rollback!

 

자 이제 문제를 찾는다

 

실행 시 출력되게 무적의 console.log 시전

 

근데... undefined?

 

오랜만에 본다 undefined

 

한때 나의 숙적이었는데 다시 나타나다니

 

ENV에 존재하고, 오타도 없고, 링크 기능으로 추적도 가능한데

 

못 불러온다?

 

여기서 아차

 

Nest.js의 Life cycle!!!

 

정확히는, 서버 실행 후 Initialization 될 때의 모듈 초기화 순서에 답이 있었다

 

registerAs 함수로 Config Module을 가장 먼저 초기화할 때야 문제가 없었지만

 

지금은 도메인 별 Config Service를 독립적으로 모듈화 하여 초기화하기에

 

상대적으로 늦게 초기화되는 모듈의 환경변수 값이 존재하기 전에 불러와서 이 사달이 난 것

 

해결 방법은 두 가지다

 

  1. 문제가 되는 모듈의 실행순서를 강제한다
  2. 생성자에 값을 선언하여 클래스가 인스턴스화되었을 때 모든 값이 불러와지게 한다

1. 은 명확한 순서를 보장해야만 하는 상황에 사용하는 게 좋을 것 같다

 

2. 는 말 그대로, 도메인 별 Config Service를 사용하기 위해 import -> Declaration -> Instance Creation 과정을 거치는데

 

해당 클래스의 생성자에 환경변수를 선언하여 클래스가 인스턴스화될 때 모든 값이 불려 와 있게 만든다

 

덧붙여, joi를 끼얹어 Validation까지 하니 더할 나위 없구나! ... 겠지?

 

하여, 아래처럼 개선이 되었다

해치웠다

 

일단...

 

개선해야 할 서버가 많다

 

진행하며 더 좋은 방법을 찾게 될 테니 다음에 또 만나요

'Today I Lived > Humanscape - 2023' 카테고리의 다른 글

23.12 - 12월 회고  (2) 2024.01.27
23.12.05 - 마미박스 설명회  (2) 2023.12.10
23.11.24 - 자동화 다 만들었다  (6) 2023.12.08
23.11.20 - TCP Socket  (1) 2023.11.26
23.11.18 - Tunneling Server, Reverse Shell  (3) 2023.11.18

댓글