Nest.js를 빠르게 공부하여 간단한 프로젝트를 구현하게되었다. 그 과정에서 공부한 것을 정리해 기록을 남기고자 작성하였다.
Node.js 란?
node는 javascript 기반의 런타임 환경이다
: 런타임은 특정 언어로 만든 프로그램들을 실행할 수 있는 환경
non-blocking I/O와 단일 스레드 이벤트 루프를 통해 높은 처리 성능을 가진다.
Node.js가 자바스크립트를 컴퓨터에서 쉽게 실행시켜주므로 자바스크립트 언어로 서버사이드 어플리케이션 개발을 위해 활용된다.
non-blocking I/O 개념
프로세스가 blocked 됐다는 것은 작업이 중단되었다는 것을 말한다.
프로세스가 읽기 작업을 요청하면 운영체제가 읽기를 시작하며 프로세스를 block하게되는데, 이때 요청한 작업이 종료될 때까지 해당 작업을 제외한 작업은 실행할 수 없게된다.
blocking i/o는 요청이 적은 서비스에서는 최적의 성능을 내고 안정적이지만, 요청마다 스레드를 생성하므로 요청이 많은 상황에서는 성능이 떨어진다는 단점이 있다.
non-blocking은 프로세스가 블로킹 상태가 아니라는 것을 말하는데, 이는 한 작업을 진행 중에도 다른 작업을 동시에 진행할 수 있다는 것이다.
non-blocking i/o는 요청을 단일 스레드에서 처리하기 때문에 context-switching이 일어나지 않는다.
또한 CPU 를 다른 프로세스에서 사용함으로서 I/O 대기시간을 줄이거나 활용할 수 있다.
따라서 i/o환경에서 성능이 매우 좋다는 장점이 있다.
단일 스레드(Single Thread) 이벤트 루프(Event-loop)
단일 스레드는 한 번에 하나의 작업을 실행(Sequential)하며, 멀티 스레드는 동시에 여러 작업(Concurrency)을 처리한다.
node.js는 단일 스레드 환경에서 실행되지만 이벤트 루프와 비동기 콜백을 통해 한 번에 여러 작업을 처리한다.
좀더 자세히 살펴보자면,
자바스크립트는 한 번에 하나의 콜 스택(call stack)과 힙(heap)을 가지는데, 이 스택에 작업이 남아있을 경우 스레드는 앞서 살펴본 'blocking'상태가 될 것이다.
하지만 여러 작업의 빠른 처리를 위해 공간을 만들어 일단 받은 요청 쌓아두고, 그와 동시에 요청들을 처리하면 어떨까?
콜백 큐로 요청을 쌓아둘 공간을 두고, 콜 스택에서 요청을 처리하는 구조가 바로 비동기Asynchronous 콜백이다.
이벤트 루프는 위의 콜 스택과 콜백 큐의 상태를 감시하여, 콜 스택이 비었을 때 큐의 첫 번째 콜백을 스택에 쌓아 실행할 수 있도록 해주며 효율적인 일 처리를 가능하게 한다.
++ 공식문서
node.js는 이벤트 루프를 런타임으로 구성하였다.
다른 라이브러리나 시스템에서 처럼 시작 호출이나 차단 호출을 하는 대신 입력 스크립트를 실행하고 바로 이벤트 루프를 실행하고, 더 이상 수행할 콜백이 없으면 이벤트 루프를 종료하도록 동작한다.
[참고] :
https://nodejs.org/en/about
https://blog.naver.com/PostView.naver?blogId=joebak&logNo=220063974083
https://hanamon.kr/javascript-런타임-작동-방식-비동기와-이벤트-루프/
NestJS
NestJS는 Node.js에 기반을 둔 서버사이드 웹 API 프레임워크이다.
Typescript를 지원하며, javascript의 최신 스펙을 사용한다.
공식 문서에 따르면 최근 몇 년 동안 Node.js 와 자바스크립트는 프론트엔드와 백엔드의 공용어가 되었다고 한다.
단일 언어로 프론트와 백엔드를 모두 개발할 수 있는 환경이 된 것인데,
이는 보다 효율적으로 개발에서의 의사소통이나 생산성을 관리할 수 있게 되었다는 말과 동일하다.
또한 NestJS는 서버 개발 시의 아키텍처를 누구든 비슷하게 설계하도록 아키텍처 문제를 해결하는 데 중점을 두어 개발되었다.
좋은 구조로 어플리케이션을 작성해 프로젝트의 복잡성을 잘 관리하는 것을 목표로 하는 철학을 가지고 있다.
보통 express.js 와 많이 비교하는데, NestJS는 익스프레스를 품고 있어 익스프레스 기반의 미들웨어를 거의 대부분 사용할 수 있어 성능과 확장성이 좋고 유연하다는 장점이 있다.
정확하게는 HTTP 요청과 응답에 익스프레스의 Request와 Response 객체를 기본으로 사용한다.
NestJS로 개발 환경을 구성할때는 설치 패키지가 많아 nest-cli 패키지를 활용하는 것이 좋다.
nest-cli 패키지는 nest 명령어를 사용해 쉽게 프로젝트를 생성할 수 있도록 해준다.
NestJS 설치하기
초기 개발환경 구성 : 설치 명령어와 기본적인 구조는 아래와 같다.
(yarn 혹은 npm과 node가 미리 설치되어있음을 가정한다)
# nest-cli 패키지 설치
npm i -g @nestjs/cli
# nest 명령어로 새 project 구성하기
nest new <프로젝트 이름>
# 그외 사용하고자하는 패키지들을 설치한다
npm i @nestjs/core @nestjs/common @nestjs/platform-express reflect-metadata typescript
위 명령어를 실행한 후의 프로젝트 기본 구조.
node_modules에서 활용가능한 모듈들이 모두 포함되어 설치되며,
프로젝트 의존성을 담은 package.json이나 gitignore까지 편리하게 생성할 수 있다.
[참고] :
https://docs.nestjs.com/
'AI 웹개발반 > Node.js, Nest.js' 카테고리의 다른 글
[Nest.js] 개발환경 세팅하기 (0) | 2023.12.02 |
---|