(NestJS-기초강의) 3. 사전지식 (Knowledge Base) – Web framework, node.js, Event loop, Dependency Management

NestJs를 배우기에 앞서, 몇 가지 유용한 사전 지식을 간략하게 습득하고 진행하면 한결 수월하므로 몇 가지 소주제들에 대해 간략히 이해하는 시간을 갖겠습니다.

본 글의 내용으로 아래 주제 들을 모두 이해하기는 힘들고, 개략적으로 알고 넘어 간 후 이후 필요할 때 상세히 알아보기로 하겠습니다.

Web Framework

발전과정

  1. 웹 기술 진화: 인터넷은 단순한 문서 저장소에서 더 많은 기능을 처리할 수 있는 플랫폼으로 발전했습니다. HTML에서 더 많은 요구사항과 기술이 필요해졌습니다.
  2. Javascript의 중요성: javascript는 웹 페이지를 동적으로 만드는 필수 도구로 부상하여 대부분의 브라우저에 내장되었습니다.
  3. Web Framework의 필요성: 기존 HTML을 만들어서 서버에서 전달하는 단순 방식에서 개발이 복잡해지면서, 개발자는 많은 노력과 시간을 들여야 했습니다. 이에 Web Framework는 개발자들에게 필수적인 요소들을 제공하여 개발 생산성을 높이고자 합니다.
  4. Web Framework의 표준화: 표준화된 방법을 제시하며, 이를 통해 개발자들은 안정적이고 확장 가능한 애플리케이션을 보다 쉽게 구축할 수 있습니다.

Front-end framework

Front-end 에서 사용되는 Framework 중 가장 인기 있는 것은 React, Vue.js, Angular, Svelte입니다.
각각의 Framework는 javascript를 기반으로 하며, 특징과 장단점을 가지고 있습니다.

Framework설명
ReactSPA 및 모바일 앱 개발에 사용되며, 가상 DOM을 사용합니다. 페이스북 주도하에 지속적으로 유지보수됩니다.
Vue.jsReact와 경쟁하는 프론트엔드 프레임워크로, 빠른 속도와 높은 성능을 가집니다.
AngularSSR을 지원하며, 모듈/컴포넌트 기반으로 구성되어 SW의 재사용성을 높입니다.
SvelteSPA에서 가상 DOM을 사용하지 않으며, 적은 코드로 구현이 가능하고 유지보수성이 좋습니다.

Back-end framework

Back-end에서는 Express, Spring, Django, Gin, Ruby on Rails 등이 사용됩니다. 각각의 Frameworks는 다양한 기능과 특징을 가지고 있으며, 주로 개발자들의 선호도에 따라 선택됩니다.

Framework설명
ExpressNode.js 기반 웹 애플리케이션을 구축하기 위한 미니멀하고 유연한 웹 프레임워크입니다. 라우팅, 미들웨어, 템플릿 엔진 등을 제공하여 빠르고 간편한 웹 개발이 가능합니다.
SpringJava 언어로 개발된 엔터프라이즈급 애플리케이션을 위한 오픈 소스 프레임워크입니다. 의존성 주입, AOP, 트랜잭션 관리 등으로 기업급 애플리케이션 개발에 적합한 기능을 제공합니다.
DjangoPython 언어로 작성된 빠르고 안전한 웹 프레임워크로, 데이터베이스 모델링, URL 라우팅, 세션 관리 등을 포함하여 웹 개발을 위한 필수 기능을 제공합니다.
GinGo 언어로 개발된 경량 웹 프레임워크로, 빠른 속도와 고성능을 지향합니다. 미들웨어, 라우팅 등의 기능을 제공하여 간단하면서도 효율적인 웹 애플리케이션을 개발할 수 있습니다.
Ruby on RailsRuby 언어로 개발된 오픈 소스 웹 프레임워크로, 개발 생산성을 높이는 데 중점을 둔 기능을 제공합니다. 라우팅, ORM, 보안 등을 지원하여 빠르고 간편한 웹 개발이 가능합니다.

Node.js

Node.js는 2009년에 등장한 자바스크립트 런타임 환경으로, Front-end에서 주로 사용되던 자바스크립트를 Back-end에서도 활용할 수 있게 만든 플랫폼입니다.

출처: Deep Dive into the Event Loop: Understanding Node.js Internals on medium


Node.js 소개

Node.js는 2009년에 등장한 자바스크립트 런타임 환경으로, front-end에서 주로 사용되던 자바스크립트를 back-end에서도 활용할 수 있게 만든 플랫폼입니다. 웹 시장에서 동적 페이지를 다루기 위해 주로 사용되던 <script> 태그 삽입을 넘어서 자바스크립트로 서버를 구동할 수 있는 방식으로 개발자들에게 획기적인 기회를 제공하고 있습니다.

Node.js 특징

Node.js는 단일 쓰레드(Single Thread)에서 동작하며 non-blocking I/O 이벤트 기반 비동기 방식을 채택합니다. 이를 통해 대규모 네트워크 애플리케이션을 개발하는 데 적합하며, 하나의 쓰레드에서 동작하는 것처럼 코드를 작성할 수 있는 장점을 가지고 있습니다. 또한 자체 패키지 관리 시스템인 NPM을 통해 강력한 생태계를 갖추고 있어 다양한 패키지를 손쉽게 활용할 수 있습니다. (상세설명 참고)

Node.js 장점

Node.js는front-end와 back-end에서 동일한 언어를 사용할 수 있다는 점에서 fullstack 개발에 이점을 제공합니다. 또한 non-blocking 방식으로 자원에 대한 부하를 최소화하면서도 높은 성능을 유지할 수 있어, 대규모 애플리케이션 개발에 적합합니다.

Node.js 단점

단일 쓰레드로 동작하는 특성으로 인해 하나의 쓰레드에 문제가 생길 경우 전체 애플리케이션에 오류가 발생할 수 있으며, 코드의 가독성 문제도 고려해야 합니다.
(최근에는 Promise 및 async/await 등을 도입하여 이러한 문제들을 해결하고 있습니다.)

이벤트 루프(Event Loop)

Node.js는 단일 쓰레드 기반으로 작동하지만 Event loop를 통해 non-blocking I/O 작업을 가능하게 합니다.
Paul Shan의 블로그를 참고하여, Event loop의 6가지 단계를 설명하겠습니다.

출처: https://wikidocs.net/158475

Timer 단계

Event loop는 Timer 단계에서 시작합니다. setTimeout이나 setInterval과 같은 함수로 생성된 타이머 콜백들을 큐에 넣고 실행합니다. 가장 적은 시간이 남은 타이머가 먼저 실행됩니다.

Pending (I/O) 콜백 단계

현재 작업 이전에 생성된 콜백들이 대기합니다. TCP 핸들러와 같은 비동기 작업이 끝나면 해당 콜백이 큐에 들어옵니다.

Idle, Prepare 단계

Node.js 내부 동작을 위한 단계로, Idle은 매 틱(Tick)마다, prepare 단계는 폴링마다 실행됩니다.

Poll 단계

새로운 I/O 이벤트를 처리합니다. ex) 소켓 연결과 같은 새로운 커넥션을 맺기, 파일 읽고 쓰기 등

watch_queue에 있는 콜백들을 실행하고, 큐가 비거나 시스템 실행 한도에 도달할 떄까지 모든 콜백을 실행합니다.

큐가 비게 되면 바로 다음단계로 가지 않고 check_queue, pending_queue, closing_callback_quque에 남아 있는 작업이 있는지 검사하고 다음 작업이 있으면 다음 단계로 넘어갑니다.

Check 단계

setImmediate의 콜백만을 위한 단계로, Queue가 비거나 실행한도에 도달할 때까지 Callback을 실행합니다.

Close 콜백 단계

close나 destroy 이벤트 타입의 콜백을 처리합니다. 모든 작업이 완료되면 Event Loop를 종료합니다.

Dependency Management

package.json 개요

App이 필요로 하는 패키지 목록을 나열하는 파일로 주로 node.js 프로젝트에서 사용되며, 이 파일을 이용하여 package 관리를 용이하게 합니다.

package.json 역할

  • 애플리케이션이 필요로 하는 패키지 목록을 나열
  • 각 패키지가 시맨틱 버저닝(Semantic Versioning) 규칙에 따라 필요한 버전을 기술
  • 다른 개발자와 동일한 빌드 환경을 구성하고, 의존성으로 인한 문제를 예방하는데 사용

package-lock.json

npm install 명령을 수행 시, 생성되는 파일로 package.json에 선언된 패키지들의 버전과 의존성을 정확히 표현합니다.

팀원들을 이를 통해 정확한 개발 환경을 공유할 수 있음에 따라 node_modules 을 repository에 공유하지 않아도 됩니다.

참고링크

Leave a Comment