[Tech Series 2] Node.js와 함께 성장하기

Node.js, 지금 어디까지 왔을까?
#Node.js #노드JS #JS #INFCON #인프콘

개발자들이 함께 모여 서로의 경험과 인사이트를 나누는 축제, 인프콘! 8월 26일, 드디어 인프런의 첫 번째 오프라인 개발 콘퍼런스인 인프콘이 개최됩니다. 인프콘을 기다리는 인프러너 여러분을 위해 인프런이 준비한 Tech Series! 인프콘에서 발표를 통해 만나볼 여러 기술에 대해 미리 살짝 소개해 드릴게요.

두 번째 이야기는 바로 Node.js입니다. Node.js는 현재 인프런 서비스를 지탱하는 핵심 기술이기도 한데요. 그동안 수많은 개발자들을 푹 빠지게 한 Node.js의 매력, 그 뒤에 숨은 이야기를 함께 살펴볼까요? 😊

INFCON Tech Series #2 📸

한눈에 읽는 재미있는 노드의 역사! 
지난 13년 동안 개발자들을 주목하게 한 
Node.js에 대한 사건들을 알아봅니다. 

자바스크립트로 서버 개발까지?한계를 뛰어넘는 Node.js

Node.js는 프로그래밍 언어 자바스크립트(JavaScript)를 로컬 환경에서 실행할 수 있는 런타임입니다. 본래 자바스크립트는 웹 브라우저 안에서 사용자의 행동에 따라 웹 페이지가 동작할 수 있게 만들어주는 언어였는데요, 처음부터 클라이언트 측에서 실행되는 언어로 만들어진 만큼 자바스크립트로 서버를 구축할 수는 없었습니다. 물론 LiveWire, Jaxer 등을 이용할 순 있었지만 속도가 너무 느려 대중화되지는 못했죠. 

그러다 2009년 Node.js가 발표되면서 자바스크립트를 이용한 서버 개발이 각광받기 시작했어요. Node.js의 등장에는 2008년 구글이 만든 오픈 소스 자바스크립트 엔진 V8이 한몫을 했습니다. V8은 당시 다른 자바스크립트 엔진보다 훨씬 빠르다는 장점이 있었어요. 혜성처럼 등장한 V8에 힘입어 자바스크립트 언어를 웹 브라우저가 아닌 서버 개발처럼 다른 영역에서도 쓸 수 있도록 표준화하자는 움직임이 빠르게 일면서 ServerJS(오늘날의 CommonJS) 프로젝트가 시작됐어요. 

자바스크립트 파일을 기계어로 변환해주는 V8 엔진은 현재 구글 크롬 브라우저에도 탑재되어 있어요. ©Google

그리고 얼마 지나지 않은 2009년, 조이언트(Joyent) 소속의 개발자 라이언 달(Ryan Dahl)이 CommonJS 표준 및 V8 엔진을 기반으로 한 Node.js를 내놓게 됩니다. 이로써 웹 브라우저 구동을 위한 언어였던 자바스크립트가 비로소 바깥 세상으로 나오게 된 것이죠. 이후 등장한 익스프레스(Express)나 네스트(NestJS) 등의 서버 프레임워크를 활용하면 Node.js에서 더욱 편리하게 서버를 개발할 수 있고요. 오늘날 서버 개발에 많이 쓰이는 자바(Java) 기반의 스프링(Spring)이 2003년, 파이썬(Python) 기반의 장고(Django)가 2005년에 탄생한 걸 생각해 보면 자바스크립트로 서버를 개발하게 된 건 비교적 얼마 안 된 일이라고 할 수 있어요.

Node.js의 가장 큰 특징은 비동기 처리 싱글 스레드 방식을 따르고 있다는 점입니다. 또한 npm(노드 패키지 매니저)을 통해 폭넓은 패키지를 효율적으로 사용할 수 있다는 점도 특징으로 꼽혀요. 특히 바벨(Babel)이나 웹팩(Webpack) 등은 여러 프론트엔드 개발자들에게 활발히 쓰이는 기술이죠.

이런 여러 특징에 매력을 느끼고 Node.js를 도입한 프로젝트가 점점 늘기 시작했습니다. 링크드인(Linkedin)이나 미디엄(Medium) 같은 대형 프로젝트에 신규 기술로 도입되기도 하고, 자바스크립트를 통해 서버와 클라이언트 전역을 풀스택으로 개발할 수 있는 MEAN, MERN, MEVN 스택 등이 떠오르기도 했죠. 2017년에는 Node.js 기여자 1,500명 이상, npm 패키지 다운로드 매주 30억 회 돌파, Github 별(star) 4만 개 경신이라는 기염을 토했고요.


해프닝과 성장통 사이 Node.js를 둘러싼 사건들

이렇게 독자적인 인기를 끌어온 Node.js이지만, Node.js가 발전해온 과정이 그저 순탄하지만은 않았습니다. (Node.js 개발자 페이지에서 간단한 타임라인을 공개하고 있어요.)

io.js, 그리고 Node.js v4

Node.js 공식 페이지의 릴리스 기록에도 io.js 릴리스 기록이 등재돼 있어요. ©OpenJS Foundation

특히 Node.js의 역사에서 임팩트가 큰 사건이라면 io.js가 등장하며 Node.js 생태계가 잠시동안 갈라진 일을 꼽을 수 있어요. 지금까지 릴리스된 Node.js 버전 목록을 보면 v0.12.x에서 갑자기 1~3을 건너뛰고 v4로 버전 업된 걸 알 수 있는데, 바로 io.js와 연관이 깊습니다.

2014년에서 2015년 사이, Node.js 프로젝트 초기부터 함께한 핵심 구성원 일부가 3대 프로젝트 리더(BDFL, Gatekeeper)를 맡은 티모시 J 폰테인(Timothy J Fontaine, TJ Fontaine) 및 조이언트 체제의 Node.js 프로젝트의 릴리스 지연 및 폐쇄적인 운영 상황에 대해 불만을 갖기 시작했어요. 이들은 독자적인 기술 위원회인 노드 포워드(Node Forward)를 모으고, Node.js v0.12를 포크한 io.js를 출시하게 됩니다. io.js는 최신 버전의 V8 엔진 및 자바스크립트 ES6(ECMAScript 2015)에 대응하는 빠른 개선 및 릴리스를 목표로, 기존의 Node.js 생태계를 보다 협업할 수 있는 구조로 만들어야 한다고 주장했어요. 불과 몇 개월 사이에 io.js는 버전 0부터 1, 2, 3까지 빠르게 업데이트됐죠.

이에 조이언트는 Node.js 재단을 설립하고 전보다 개방적이고 자율적인 오픈 거버넌스 모델을 통해 노드 커뮤니티를 지원하겠다고 발표했어요. 티모시 J 폰테인 역시 프로젝트 리더를 사임하면서 조이언트를 떠나게 됩니다. 이후 io.js 커뮤니티가 Node.js 재단에 합류하면서 Node.js와 io.js를 통합한 최신 Node.js v4.0이 릴리스되었어요. Node.js v4.0은 io.js가 추구했던 것처럼 최신 V8을 도입해 자바스크립트 ES6에서 지원하는 기능을 더 많이 쓸 수 있고, Node.js가 모던 자바스크립트 생태계로 발돋움하는 전환점이 됩니다.

코드 11줄의 나비효과: 레프트 패드

바벨(Babel)은 크로스 브라우징 이슈를 해결하기 위한 컴파일러로, npm을 통해 설치할 수 있습니다. ©Babel

이듬해인 2016년에는 또 한 번 충격적인 일이 벌어졌어요. npm에 공개된 패키지 하나가 전세계 개발 프로젝트를 발칵 뒤집은, 일명 레프트 패드(Left-pad) 사건인데요. 

아제르 코출루라는 한 개발자가 킥(kik)이라는 프로그램을 개발해 npm에 공개했어요. 그런데 얼마 지나지 않아 한 통의 메일을 받게 됩니다. ‘킥’이라는 이름이 자사 메신저 서비스와 이름이 같으니 바꿔달라는 요청이었죠. 코출루는 이를 거절했지만, npm의 창립자이자 Node.js의 2대 프로젝트 리더이기도 한 아이작 슐레터가 코출루와 기업(킥 인터랙티브)을 중재하는 과정에서 기업의 손을 들어 코출루의 킥 프로그램 소유권을 정지시키고 말았죠. 그러자 코출루는 항의의 뜻으로 지금까지 자기가 npm에 공개했던 273개 프로젝트를 모조리 삭제해버립니다. 

그런데 이렇게 삭제된 프로젝트 중에는 레프트 패드(Left-pad)라는 이름의 코드 11줄짜리 프로젝트가 있었어요. 레프트 패드는 다른 개발자가 만든 라인 넘버스(Line-numbers)라는 프로젝트에 쓰이고 있었는데, 하필 이 라인 넘버스가 전세계 Node.js 기반 프로젝트에 폭넓게 쓰이는 바벨(Babel)에 사용되고 있었습니다. 엄청나게 많은 프로젝트들이 레프트 패드에 대한 의존성(Dependency) 문제가 있었다는 이야기인데요. 레프트 패드가 삭제되면서 바벨을 사용하고 있던 페이스북, 링크드인, 스포티파이 등 대기업을 비롯한 전세계 수많은 프로젝트에 줄줄이 문제가 일어나기 시작했습니다. 

현재 바벨을 비롯한 약 200만 개의 프로젝트가 레프트 패드에 의존하고 있어요. ©left-pad

결국 npm과 킥 인터랙티브는 레프트 패드 사태에 대해 공지를 통해 설명하고 슐레터에게 사과했어요. 슐레터 역시 사과를 받아들여 프로젝트 이름을 킥에서 헥(hek)으로 바꾸면서 사건이 마무리되죠. 이후 npm에서는 공개된 지 24시간이 지난 프로젝트라면 프로젝트 소유자라도 임의로 삭제할 수 없도록 규정을 변경합니다. 레프트 패드 사건은 개발 생태계에서 의존성 문제가 세계적인 사고로 번진 유명한 에피소드 중 하나로 꼽혀요.

Node 이름을 뒤섞으면 Deno?

“Node.js에 관해 후회하는 10가지” 발표 ⓒRyan Dahl

한편 Node.js를 처음 만든 라이언 달은 2018년 JSConf EU에서 “Node.js에 대해 후회하는 10가지”라는 제목의 발표를 합니다. Promise 도입을 고집하지 않은 것, 보안 문제, 빌드 시스템, 패키지 매니저 파일, 모듈 시스템 등 Node.js에 대한 아쉬움에 대해 이야기하다 발표 끝에 Node.js를 대체할 신생 런타임 디노(Deno)를 만들고 있다고 언급했어요. 

디노라는 이름은 Node의 철자를 재배열한 것으로, 2020년 v1.0이 정식 릴리스되면서 전세계 Node.js 개발자들에게 화제가 되기도 했습니다.


Node.js와 함께한 어느 개발자의 10년인프콘에서 만나보세요!

최초의 웹 브라우저가 1990년에, 자바스크립트라는 언어가 1995년에 발표된 걸 생각해 보면 Node.js의 역사는 개발 생태계에서 그리 길지 않은 편입니다. 더욱이 서버 개발 분야에서 Node.js를 통한 자바스크립트의 점유율은 비교적 높지 않은 편이고, 한국에서는 더욱 그렇죠. 하지만 자바스크립트의 새로운 지평을 연 Node.js가 개발자들에게 미친 영향이 적다고 하기에는 어려울 것 같아요. 

올해로 13년이 된 Node.js! 앞으로 Node.js가 걸어갈 길에 대해 주목해보는 건 어떨까요? 오랫동안 Node.js로 개발해 온 분들의 이야기가 궁금하진 않으신가요? 2022 인프콘에서는 2012년부터 지금까지 Node.js와 함께하며 겪은 개발자의 성장과 우여곡절에 대한 이야기가 준비되어 있어요. 한국에서 Node.js를 선택해 프로젝트를 이끈 이야기와 그 뒤에 숨은 생각들이 궁금하신 분들이라면 이번 인프콘 발표와 함께해주세요!

언어와 함께 성장하기 ― Node.js와 10년, v0.8부터 v16까지 
강동한 | Flitto

Node.js를 활용한 Flitto 서비스는 ‘언어의 장벽을 넘어서’라는 슬로건으로 10년 동안 발전해 온 서비스입니다. Node.js v0.8로 서비스를 시작하여, 2022년 현재 LTS인 v16으로 서비스하고 있습니다. 10여 년 동안 Node.js와 함께 성장해 온 이야기를 들려드리려 합니다.

세션 소개 바로가기 >>

인프콘의 소식을 널리 알려주세요

INFCON 2022