※해당 글은 "NestJS로 배우는 백엔드 프로그래밍"(한용재 저)를 토대로 공부한 것을 정리한 것임을 밝힙니다.
웹 FrameWork
예전에는 웹 페이지에서 구동되는 애플리케이션은 모두 SSR(Server Side Rendering) 방식으로 동작했다. 서버에서 웹 브라우저가 그려야 하는 HTML과 자바스크립트를 그대로 전송하고 브라우저는 서버에 전달되는 코드를 화면에 뿌려주기만 하면 됐다. 이후 동적 구성되는 부분은 함께 전달된 자바스크립트를 파싱하여 화면을 구성했다.
시간이 지날수록 웹 기술은 고도의 복잡도를 가지도록 발전했고, 필수로 적용해야 하는 기술들을 기존 방식으로 작성하기에는 시간과 노력이 너무 많이 들게 되었다. 자연스럽게 웹 개발에 필수적인 요소들을 묶어 개발자들이 쉽게 쓸 수 있게 하고자 하는 시도가 생겨났다. 이를 웹 프레임워크라고 부른다. 웹 프레임워크는 데이터베이스에 연결을 설정하고 데이터를 관리하거나, 세션을 맺고 유지하는 등의 동작을 정해진 방법과 추상화된 인터페이스로 제공한다. 이를 통해 쉽고 빠르게 안정적인 애플리케이션을 구축할 수 있다.
프론트엔드의 프레임워크는 최근 몇 년간 리액트가 크게 인기를 얻으면서 많은 서비스들이 SPA기반으로 구축되었다. SPA는 SSR 방식과 다르게 서버로부터 매 요청에 대해 최소한의 데이터만 응답받고 화면 구성 로직을 프론트엔드에서 구성한다. 따라서 페이지 이동시 화면이 깜빡거리는 것과 같이 어색한 화면이 줄어든다. 반면에 첫 진입 화면에서 프론트엔드 애플리케이션을 다운로드 받아야 해서 초기 로딩 속도가 오래 걸린다.
백엔드 프레임워크는 자바 개발자들에게는 스프링, 파이썬 개발자들에게는 장고가 대세이다. 스프링은 국내에서 인기가 많다. 국내 빅테크 기업들에서 많이 사용하기도 하고 특히 정부 프로젝트를 따내기 위해서는 전자정부프레임워크를 사용해야 하는데 이게 스프링 기반으로 만들어져 있기 때문이다.
웹 프레임워크를 어떤 것을 선택해야 할지 고민일 때 다음 사항들을 고려해 보면 좋다.
- 개발 문서: 잘 쓰여진 개발 문서는 사용자의 생산성을 증대시켜 준다. 커뮤니티에 질문하고 원하는 답변을 얻기까지는 오랜 시간이 걸린다. 문서를 통해 현재 가진 문제를 해결할 수 있으면 가장 좋다.
- 사용자 수: 사용자 수가 많다는 것은 그만큼 안정적으로 운용된다는 반증이다. 궁금한 점이 생겼을 때 개발자 커뮤니티에서 답을 쉽게 찾을 수도 있다.
- 활성 커뮤니티: 요즘에는 언어나 특정 기술에 대한 개발자 커뮤니티가 많이 있다. 페이스북, 슬랙, 디스코드와 같은 채널 외에도 질문/답변 서비스를 제공하는 스택 오버플로우에도 해당 기술을 키워드로 검색하면 얼마나 많은 사람들이 활동하고 있는지 파악할 수 있다.
- 깃허브 스타 수와 이슈 대응: 대부분의 프레임워크는 오픈 소스로 개발하고 소스 코드가 깃허브에 공개되어 있다. 깃허브 스타 수는 그만큼 사람들이 인정하고 있다는 뜻이다. 또 사용자들이 리포트하는 이슈가 얼마나 잘 대응되고 있는 지도 중요한 요소이다.
Node.js
Node.js를 설명하기 전에 우선 JavaScript 런타임에 대해 이해해야 한다. JavaScript 런타임이란 JavaScript가 구동되는 환경을 말한다. JavaScript 런타임의 종류로는 웹 브라우저(크롬, 파이어폭스 등) 프로그램과 Node.js가 있다. 이러한 프로그램들에서 JavaScript가 구동되기 때문에 JavaScript 런타임이라고 한다. JavaScript 런타임에 대한 자세한 내용은 https://dev-allday.tistory.com/45에 정리해 두었다.
Node.js는 기본적으로 npm이라는 패키지(혹은 라이브러리) 관리 시스템을 가지고 있다. 개발에 필요한 라이브러리가 있다면 npm으로 설치하면 된다. npm 외에도 취향에 따라 yarn이라는 패키지 관리자를 사용할 수 있다. npm과 yarn의 차이점은 다음과 같다.
구분 | npm | yarn |
패키지 설치 방식과 속도 | npm은 의존성 트리를 깊이 우선(depth-first) 방식으로 해결한다. 이 방식은 트리 깊이가 깊어질수록 설치 시간이 길어지는 단점이 있다. 그러나 npm v5부터는 트리 플랫트(tree flattening)를 지원하여 의존성 트리의 깊이를 줄여 설치 시간을 개선할 수 있다. | yarn은 의존성 트리를 넓이 우선(breadth-first) 방식으로 해결한다. 이 방식은 의존성 트리의 모든 레벨에 대해 동시에 설치를 시도하기 때문에 의존성 트리가 깊어져도 설치 시간이 일정하다. 또한, yarn은 패키지를 병렬로 다운로드하여 속도를 개선할 수 있다. |
lockfile 파일의 형식 | npm v5부터는 package-lock.json 파일을 사용하고 있다. | yarn은 yarn.lock 파일을 사용한다. |
보안 | npm은 자동으로 패키지에 포함된 다른 패키지 코드를 실행한다. 이로 인해 보안 시스템에 몇 가지 취약성이 발생하며 나중에 심각한 문제가 발생할 수 있다. 하지만, 최근 npm의 업데이트에서 npm의 보안 업데이트도 크게 향상되었다. | yarn은 yarn.lock 또는 package.json파일에 있는 파일만을 설치한다. 보안은 yarn의 핵심 기능 중 하나이다. |
Node.js는 단일 Thread에서 구동되는 논블로킹 I/O 이벤트 기반 비동기 방식이다
Node.js는 단일 Thread에서 작업을 처리한다. 애플리케이션 단에서는 단일 Thread이지만 백그라운드에서는 Thread pool을 구선해 작업을 처리한다. 개발자 대신 Node.js에 포함된 비동기 I/O 라이브러리인 libuv가 Thread pool을 관리한다. 또한, Node.js는 앞에 작업이 끝날 때까지 기다리지 않는 논블로킹 방식을 사용하며 비동기로 처리한다.
입력은 하나의 Thread에서 받지만 순서대로 처리하지 않고 먼저 처리된 결과를 이벤트로 반환해 주는 방식이 Node.js가 사용하는 단일 Thread 논블로킹 이벤트 기반 비동기 방식이다.
Node.js의 장단점
장점-
●빠른 속도: 비동기 이벤트 기반 아키텍처를 사용하기 때문에, I/O 작업에 대한 블로킹을 최소화하고 빠른 속도를 보장한다.
●단순성: 자바스크립트로 작성되었기 때문에, 프론트엔드와 백엔드 양쪽에서 동일한 언어를 사용하여 개발할 수 있어 개발자들이 쉽게 익힐 수 있다.
●확장성: 단일 Thread로 동작하지만, 비동기 이벤트 기반 아키텍처를 사용하기 때문에 다중 Thread를 사용하는 서버보다 더 많은 동시 접속자를 처리할 수 있다.
●생산성: 모듈화 된 아키텍처를 지원하고, 패키지 매니저 npm을 통해 수많은 모듈을 쉽게 사용할 수 있다.
단점-
●단일 Thread 모델: Node.js는 단일 Thread 모델을 사용하기 때문에, CPU 작업을 많이 처리하는 애플리케이션의 경우 처리 속도가 떨어질 수 있다.
●콜백 지옥: 비동기 방식의 콜백 함수를 연속해서 사용하면 코드 가독성을 떨어뜨리고, 디버깅이 어렵게 만들 수 있다.
●모듈 라이브러리의 빈약함: Node.js는 상대적으로 새로운 기술이기 때문에, 일부 라이브러리와 모듈이 부족할 수 있다.
●에러 확인: 스크립트 언어의 특성상 해당 언어가 수행되어야 에러가 나는지 확인할 수 있고, 에러가 날 경우 프로세스가 종료된다
'Node.js' 카테고리의 다른 글
Node.js 프로젝트 생성하기, dependency와 devDependency (0) | 2023.04.21 |
---|