이 서평은 한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.
자바스크립트를 통해 개발한 개발자들은 Node.js의 중요성을 쉽게 알 수 있다. React를 이용해 주로 개발하는 나는 NPM을 항상 사용하면서도 Node.js에 대해 깊이 알지 못했다.
이번 기회에 서평을 작성하면서 Node.js가 무엇인지 어느 정도 이해하게 되었다.
이 책의 저자도 처음에는 프론트엔드 개발에 집중하다가 자바스크립트 관련 지식이 늘어나면서 백엔드에도 같은 언어를 사용할 수 있으면 좋겠다는 생각으로 Node.js에 입문했다고 한다.
그러나 깊이 다룰수록 브라우저와 서버에서 각각 동작하는 것은 완전히 다르다는 것을 알게 되었다고 회고한다.
자바스크립트라는 공통적인 맥락 덕분에 운영체제 동작이나 프로토콜 등 웹 구조를 코드로 학습하면서 흥미를 붙여 나갈 수 있었다고 한다.
나 역시 자바스크립트에 대한 지식이 쌓이면서 더 넓은 영역으로 나아갈 수 있는 목적지로서 Node.js에 대한 흥미가 자연스럽게 생겼다.
이 책을 읽는 독자들은 백엔드에서 프론트엔드까지 전체적으로 체험해보고 이해하는 것을 목표로 읽어보는 것을 권장한다.
처음 만나는 Node.js
Node.js는 크롬의 V8 엔진을 기반으로 동작하며 서버 사이드 자바스크립트를 실행할 수 있는 환경을 제공한다.
V8 엔진은 구글 크롬 브라우저에서 자바스크립트를 빠르게 실행할 수 있도록 설계된 고성능 자바스크립트 엔진이다.
이 엔진을 기반으로 하는 Node.js는 비동기 이벤트 기반의 구조를 채택해 높은 처리 성능을 발휘하고 싱글 프로세스, 싱글 스레드로 작동하면서도 논블로킹 I/O를 통해 많은 연결을 효율적으로 처리할 수 있다.
이러한 특성 덕분에 실시간 애플리케이션, 데이터 집약적인 네트워크 애플리케이션, 마이크로서비스 아키텍처 등 다양한 분야에서 광범위하게 사용되고 있다.
Node.js는 또한 거대한 패키지 생태계를 제공하는 NPM$_{Node \space Package \space Manager}$을 통해 필요한 라이브러리와 모듈을 손쉽게 설치하고 관리할 수 있다.
프론트엔드와 백엔드 모두에서 필요하게 된 Node.js는 개발 도구, 빌드, 태스크 러너로서도 널리 이용된다.
2010년 전후로 자바스크립트는 요구사항이 점점 복잡해지면서 모듈이 늘어나는 개발 스타일에 적합하지 않았다. 이러한 복잡해진 개발에 대응하기 위해 많은 문제들을 해결해야 했다.
ECMAScript는 2011년 무렵에 ES5를 표준으로 사용하고, 후속작으로 ES6를 내면서 모듈, const/let, 화살표 함수 등 현재까지도 많이 사용되는 표준 사양들을 정의했다.
하지만 각 브라우저에서는 이런 기능을 바로 사용할 수 없었고, 이를 해결하기 위해 바벨$_{Babel}$이라는 트랜스파일러가 등장했다.
바벨은 코드를 변환함으로써 아직 ES6 기반 사양을 구현하지 못하는 ES5 기반의 브라우저에서도 새로운 사양을 따르는 코드를 동작시킬 수 있게 했다.
서버 사이드에는 브라우저와 달리 script 태그가 없기 때문에 Node.js는 모듈을 관리하는 방법이 필요하다. 이 문제를 해결하기 위해 Node.js는 CommonJS 스타일의 모듈 시스템을 채택했다.
ES6에서도 import/export 구문이 정의되었지만 실제 브라우저에서 구현하는 데 많은 문제가 있어 해결 시간이 필요했다.
그래서 이미 입증된 CommonJS 스타일을 이용해 프론트엔드의 코드도 모듈로 분할하고자 하는 움직임이 일어났다.
이 과정에서 웹팩이나 브라우저리파이와 같은 모듈 번들러가 등장했고 이를 통해 모듈을 결합할 수 있게 되었다.
Node.js와 모듈
Node.js에는 역사적인 배경에 따라 2가지 모듈 분할 방식이 있다.
표준이 없었던 당시에 Node.js가 채택한 CommonJS 모듈과 ECMAScript 표준의 ECMAScript 모듈이다.
// CommonJS modules
const fs = require('fs');
// ECMAScript modules
import fs from 'fs';
최근에는 ECMAScript 모듈 시스템이 표준화되었지만 완전히 보급되려면 아직 시간이 필요하다.
따라서 이 책에서는 가능한 한 쉽게 실행할 수 있도록 CommonJS 모듈을 중심으로 이용한다.
Node.js에 구현된 CommonJS 모듈과 ECMAScript 모듈은 모듈 분할 방식에서 비슷한 부분이 있어 서로 불러올 수 있지만 세세한 차이가 있다.
Node.js 세계에서는 예전부터 CommonJS 모듈을 표준으로 사용해왔기 때문에 대부분의 파일 형식이 .js이다.
따라서 형식 차이로 인한 마찰을 줄이기 위해 Node.js의 ECMAScript 모듈을 표준으로 따르는 파일은 .mjs 확장자를 사용한다.
이러한 방식으로 모듈을 구분하고, 표준 모듈 및 npm과 같은 외부 모듈을 다양하게 활용할 수 있다.
Node.js의 비동기 처리
자바스크립트에서 비동기 처리는 매우 중요한 기술로 다양한 방식으로 활용된다.
Node.js 애플리케이션에 이용되는 이벤트 핸들링 패턴은 크게 4가지이다.
- 콜백$_{callback}$
- 프로미스$_{promise}$
- asnyc/awaiit
- EventEmitter/Stream
이 책을 집필하는 시점에서 권장하는 설계 패턴은 아래와 같다.
- 되도록 async/await를 사용한다.
- 스트림 처리가 필요한 경우에만 EventEmitter/Stream을 사용한다.
이와 같은 권장 사항의 이유를 자바스크립트 문법의 진화와 함께 살펴보며 설명한다.
async/await은 프로미스에서 루프나 조건 분기 등 어려운 처리를 해결하기 위해 도입된 문법적 설탕이다.
이를 이용하면 프로미스를 통한 비동기 처리를 동기적인 형태로 기술할 수 있다.
함수에 async 키워드를 붙이면 그 함수 내부에서 await 키워드를 사용할 수 있다. await 키워드는 해당 식에서 반환된 프로미스의 결과가 나올 때까지 실행을 중지시킨다.
Node.js에는 async/await와 같은 비동기 흐름 제어 외에도 이벤트 주도 방식의 비동기 흐름 제어가 존재한다.
스트림 처리는 콜백과 같은 일회성 처리에 비해 데이터를 순차적으로 처리해 메모리를 효율적으로 사용할 수 있다.
Node.js의 비동기 성능을 최대한 활용하기 위해 스트림 처리 타입의 API가 구현된 모듈을 사용하기도 한다. 따라서 스트림 처리를 이해하고 사용할 수 있도록 하는 것이 중요하다.
CLI 도구 개발
이 장에서는 실제로 Node.js를 사용해 애플리케이션을 개발한다.
먼저 CLI 도구 개발을 통해 인수나 환경 변수를 다루는 방법에 관해 설명한다.
여기에서는 마크다운 파일에서 HTML을 작성하는 간단한 블로그 아티클 작성 CLI 도구를 만들며 설명한다.
여기에서 작성하는 CLI에서는 다음 기능을 구현한다.
- CLI 도구 이름 표시
- 파일 이름 지정해 마크다운 파일 읽기
- 읽은 마크다운 파일을 HTML로 변환
- 변환한 HTML을 파일에 쓰기
- 옵션으로 출력하는 HTML 이름 설정
- 테스트 코드
익스프레스를 이용한 REST API 서버 / 웹서버
이전 장에서 CLI 도구를 만드는 방법을 활용해 Node.js 프로젝트를 시작하는 방법부터 테스트 방법까지 설명했다.
이번 장에서는 Node.js의 강점인 네트워크 처리를 설명하기 위해 API 서버를 개발한다.
다음 요건을 만족하는 애플리케이션을 작성한다.
- / 경로에 접근한 사용자에게 뷰 템플릿을 사용해 HTML 반환
- 레디스에서 가져온 데이터를 기반으로 HTML 반환
- 서버가 중단되지 않도록 포괄적인 에러 핸들링
- 브라우저에서 이용하는 정적 파일 송신
- 테스트 실행
API 서버는 Node.js의 표준 모듈만으로도 구축할 수 있다. 하지만 http.createServer
는 매우 저수준의 API로, 라우팅이나 GET/POST와 같은 메서드별 구현을 위해 많은 추가 작업이 필요하다.
const http = require('http');
http
.createServer((req, res) => {
res.write('hello world\n');
res.end();
})
.listen(3000);
특히 API 서버를 작성할 때는 Node.js에서 사실상 표준인 익스프레스$_{Express}$를 사용하는 것이 좋다.
익스프레스는 최소화된 규모 덕분에 Node.js의 성능을 저하시키지 않으면서도 유연하고 강력한 기능을 제공한다.
이런 특징 덕분에 현재 널리 이용되는 많은 Node.js 프레임워크들이 익스프레스를 기반으로 하고 있다.
프런트엔드 / 백엔드 개발
이번 장에서는 Node.js를 이용해 API/웹 서버를 만드는 방법을 통해 설계나 구현을 위한 Node.js 애플리케이션 운용을 설명했다.
HTML 출력을 다루었지만 이번에는 한 단계 더 나아가 프론트엔드 프레임워크를 도입한 SPA와 npm 기능을 이용한 단일 저장소 개발을 살펴본다.
Node.js가 다른 백엔드 언어에 비해 우위에 있는 점은 프론트엔드와 동일한 언어로 개발할 수 있다는 점이다. 이전 장에서 설명한 백엔드 애플리케이션에 프론트엔드를 새롭게 추가하는 형태로 설명한다.
기능 요건은 이전 장과 거의 같다. 서버에서 HTML을 표시했던 부분을 API로 가져온 값을 사용해 표시하는 SPA 구조로 변경한다. 모노레포와 애플리케이션 구성 부분을 통해 설계를 어떻게 구성하는지 설명한다.
프론트엔드 개발의 사고 방식이 변화하면서 리액트를 사용하는데 있어 현대적인 개발 방법을 설명한다. 리액트의 기본 기능, 브라우저 이벤트 처리, 컴포넌트 분할, API로 가져온 값을 표시하기를 통해 최신 개발 패턴을 이해할 수 있다.
애플리케이션 운용과 개선
이전 장보다 조금 더 실용적인 애플리케이션 운용에 관해 설명한다.
기본적으로 Node.js 버전은 최신 LTS 버전을 사용하는 것이 가장 좋다. 버전 업데이트에 따라 버그 수정이나 성능 향상 등의 효과를 기대할 수 있기 때문이다.
그리고 Node.js의 버전과 함께 npm으로 설치한 패키지도 버전 업데이트를 따라가는 것이 매우 중요하다.
모듈에서 기능 추가뿐만 아니라 취약점 대응이나 버그 수정 등 다양한 버전 업데이트가 매일 발생한다.
버전 업데이트에 주의하면서 꾸준히 최신 상태를 유지하면 애플리케이션 운용이 편리해진다.
만약 업데이트를 미루면 Node.js 본체 업데이트에 장애가 발생하는 경우도 많다.
패키지 버전 업데이트, 모노레포에서의 라이브러리 관리, 실제 운용 시의 주의점 등도 중요하다.
모노레포는 여러 프로젝트를 단일 저장소에서 관리할 수 있게 해주고 각 프로젝트의 버전을 일관되게 유지하는 데 유용하다. 패키지 간의 의존성 문제를 최소화하고 일관된 개발 환경을 유지할 수 있다.
총평
업무에 활용하는 Node.js는 Node.js의 기본 개념부터 실제 애플리케이션 운용까지 다양한 내용을 다룬다. 실무 경험과 노하우도 함께 실어 ‘왜’ 그렇게 구현해야 하는지 배우며 개발자로서의 경험치를 넓힐 수 있다.
Node.js의 강력한 비동기 처리 능력과 V8 엔진의 성능을 기반으로 서버 사이드 자바스크립트를 보여준다. 프론트엔드와 백엔드를 동일한 언어로 개발할 수 있는 Node.js의 장점을 잘 활용하는 방법을 설명하고 있다.
프론트엔드와 백엔드를 통합한 모노레포 구조, 최신 개발 패턴을 반영한 리액트와의 통합, 그리고 CLI 도구 개발 등 다양한 주제를 다루며 예제를 통해 독자가 직접 따라해볼 수 있도록 구성되어 있다.
Node.js의 모듈 시스템에 대한 설명과 CommonJS 및 ECMAScript 모듈의 차이를 이해하기 쉽게 비교한다. 웹팩과 브라우저리파이와 같은 모듈 번들러들도 간단하게 소개한다.
비동기 처리 방식에 대해서는 콜백, 프로미스, async/await, EventEmitter/Stream의 사용법과 함께 권장하는 설계 패턴을 제시해 프로젝트에서의 적용 방법을 알려준다.
마지막으로 애플리케이션 운용 및 개선에 관한 내용에서는 Node.js와 npm 패키지의 최신 버전을 유지하는 중요성과 모노레포에서의 라이브러리 관리, 성능 모니터링과 에러 추적 등 실무에서 반드시 알아야 할 지식들을 다루고 있다.
처음 Node.js를 접하는 독자들도 프론트엔드에서 리액트를 조금이라도 개발해본 경험이 있다면 이 책을 재미있게 읽을 수 있을 것이다.
'Life > 독서 기록' 카테고리의 다른 글
[서평] 테스트 개론 - 프런트엔드 개발을 위한 테스트 입문 (0) | 2024.07.13 |
---|---|
[서평] 그림으로 쉽고 빠르게 배우는 - AWS 시스템 개발 스킬업 (0) | 2024.07.05 |
[서평] IT 업계 노하우 에센스 - 개발자를 위한 커리어 관리 핸드북 (0) | 2024.05.14 |
[서평] 프론트엔드 입문서 - 제로초의 자바스크립트 입문 (0) | 2024.05.13 |
[서평] 트러블슈팅 개론서 - 자바 잘 읽는 법 (0) | 2024.05.12 |
컴퓨터 전공 관련, 프론트엔드 개발 지식들을 공유합니다. React, Javascript를 다룰 줄 알며 요즘에는 Typescript에도 관심이 생겨 공부하고 있습니다. 서로 소통하면서 프로젝트 하는 것을 즐기며 많은 대외활동으로 개발 능력과 소프트 스킬을 다듬어나가고 있습니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!