회사의 개발팀에선 Node.js 버전이 제각각이었다.
어디 팀은 v16, 또 다른 팀은 v20을 쓰고 있었다.
심지어 Node.js 버전 관리를 위해서 nvm(node version manager)를 사용해서 버전을 계속 바꿔가며 개발을 진행하고..
왜 Node.js 버전이 팀마다 다른지 파악해봤다.
Node.js가 대체 뭐길래?
Node.js는 Chrome V8 엔진 위에서 돌아가는 JavaScript 런타임이다.
브라우저 밖에서 JS를 실행할 수 있게 해준 덕분에, 프론트만 하던 언어가 백엔드까지 넘어왔다.
Node.js의 특징은 크게 네 가지로 볼 수 있다.
- 이벤트 기반 비동기라서 빠른 I/O 성능을 자랑한다.
- npm(node package manager)**이라는 생태계가 있어, 수많은 라이브러리를 가져다 쓸 수 있다.
- 배우기 쉽고, 개발 속도가 빠르다.
- 다만 로직이 복잡해지면, 콜백 지옥같은 문제가 생길 수 있다.
Github 사용률 1위 언어를 유지하고 있는 JavaScript (2023년 기준)

- 2023년 기준으로, Github 사용률 1위 언어는 JavaScript이며, 그 이유는 Node.js라고 해도 과언이 아니다.
- Node.js의 장점으로는 쉬운 난이도, 많은 자료와 커뮤니티, 빠른 개발 가능을 뽑을 수 있다.
결국 Node.js의 강점은 "빠른 개발, 쉬운 진입" 이다.
이 덕분에 스타트업이나 새로운 서비스를 빠르게 만들어야 할 때 가장 먼저 선택되는 언어가 되었다.
근데, 왜 버전을 다르게 쓰는가
문제의 본질은 Node.js 릴리즈 주기에 있다.
위 사진과 같이 Node는 보통 두 가지 버전 체계를 가진다.
-
Current release status ( 6개월 )
Node.js의 가장 최근 버전
이 기간은 다음 Major 버전이 나올때까지 유지되며, 중요한 변경사항이 공개되며,
또한 이 기간 내에 라이브러리의 작성자는 해당 버전에 대한 지원을 추가할 수 있다.
6개월이 지난 후 다음 상태는 Major 버전의 숫자에 따라 차이가 있다.- 홀수 버전 (9, 11, ...) : 지원이 종료가 된다.
- 짝수 버전 (10, 12, ...) : LTS 상태(Active status)로 변경된다.
- LTS status ( 30개월 )
Long Term Support 의 약자이며, 일반적으로 이 기간동안 중요한 버그들은 수정될 것을 보장하고 있다.
- Active status ( 대략 1년 )
- 말 뜻 그대로 활발한 개발을 위한 단계
- 새로운 기능 추가, 버그 수정, 잦은 업데이트가 이루어 진다.
- 새로운 기능 및 개선 사항의 추가로 인해 적극적인 개선이 이루어 진다.
- Maintenance status ( 대락 1년 6개월 )
- 말 뜻 그대로 유지보수를 위한 단계
- 보안 패치나 버그 수정에 대한 지원만 이루어 진다.
- 새로운 기능 추가는 없으며, 보안 및 버그에 대한 수정만 이루어짐으로 안정성을 유지한다.
2024년 기준 예시
Node.js v16 (LTS status 끝.)
- LTS 단계가 끝이 났지만, 여전히 안정성이 제공된다.
- 호환성 문제를 피하기 위해 v16을 사용하기도 한다.
- 하지만, 최신 기능과 성능 최적화에 대한 지원을 받지 못한다.
- 또한, 관련 커뮤니티가 줄어들 수 있다.
Node.js v18 ( Maintenance status )
- v18은 maintenance 단계로 개발이 완료되었으며 버그 및 보안에 대한 수정만 이루어짐으로 안정성이 있다.
- 가장 최근의 안정성이 있는 버전임으로 활발한 커뮤니티, 문서들이 존재한다.
Node.js v20 ( Active status )
- v20은 Node 의 새로운 기능을 경험하고 개발의 최신 트렌드를 활용할 수 있다.
- 하지만, 아직 개발 단계에 있는 버전으로 예상치 못한 버그나 호환성 문제와 같은 안정성에 대한 문제가 발생할 수 있다.
- 아직 개발 단계이므로 커뮤니티 및 문서, 지원이 부족할 수 있다.
결국 개발자들이 어떤 버전을 쓰느냐는 안정성을 택하느냐, 최신 기능을 택하느냐의 문제다.
왜 굳이 낮은 버전을 쓰지?
처음엔 최신 버전이 당연히 제일 좋다고 생각했다.
하지만 실제로는 큰 차이가 있다.
-
안정성과 신뢰성
이미 수많은 테스트를 거친 낮은 버전이 예측 가능한 환경을 보장해준다.
서비스는 예측 가능성이 중요하기 때문에, 일부러 오래된 버전을 고수하기도 한다. -
기존 코드와의 호환성
기존 코드와 라이브러리가 특정 버전에 묶여 있으면, 최신 버전으로 올릴 때 문제가 생길 수 있다.
특히 대규모 프로젝트에서는 이런 비용이 엄청나서, 차라리 낮은 버전에서 버티는 게 나을 때도 있다.
버전 선택의 이유
Node.js 버전이 제각각인 건 단순히 "버전 관리를 대충 해서"가 아니었다. 각자 전략적인 이유로 버전을 선택한 것이었다.
- 어떤 팀은 오래된 서비스 유지보수를 하고 있어서, v16에서만 잘 돌아가는 코드가 있었다.
버전 올리면 의존성이 줄줄이 깨져서, 그냥 "안 건드리는 게 최선"이었다. - 또 다른 팀은 새로운 기능을 빠르게 실험해야 해서, 일부러 v20으로 올려서 개발 중이었다.
최신 기능을 바로 쓰려다 보니 당연히 시행착오도 많았지만, 속도는 그만큼 빨랐다.
nvm 같은 툴로 여러 버전을 바꿔가며 쓰는 것도, 이런 이유 때문이라고 한다.
신입 입장에서 보기엔 nvm으로 왔다 갔다 하는 게 상당히 귀찮아 보였지만, 사실은 nvm 마저 없었으면 더 귀찮아 질 뻔 했다.
팀 프로젝트에서는 특정 버전을 통일해서 쓰는 게 좋지만, 개인적으로는 nvm을 필수 도구처럼 쓰게 된 이유가 여기에 있다.