-
nest.js 학습에 사용한 공부 자료Node.js/nest.js 2023. 3. 23. 20:43
1. Nest JS란?
- node.js 서버 사이드 애플리케이션 프레임워크이다. Opinionnated를 지향해 Best Pactice를 제공한다.
- node.js의 가장 유명한 프레임워크는 Express이다. 만드는 개발자 마다 설계가 달라서 코드 알아보기, 유지보수가 힘들었다.
- 반면 Nest.JS는 Beat Practice 있어서 가독성 상대적으로 쉽고, 개발자 퇴사하면 새로운 사람이 적응 쉬운 장점이 있다.
- Nest.JS는 Typescript 기반이다. 규모가 큰 프로젝트 관리를 목적으로 한다.
- 기본 express 서버 기반으로 동작하고 Fastify로 갈아끼울 수 있다.(마치 스프링의 톰캣, 네티)
- express 사용하던 라이브러리 그대로 사용 가능.
- Spring 따라 만든 프레임워크라는 느낌을 받았다. 핵심이 DI, AOP이고 제공 기능들이 비슷하다.
- Nest는 Nest Abstraction Layer이다.
- suitable absraction을 제공한다.
- main.ts가 존재하고, 그 아래에는 app.module.ts이 존재하는데 app.module 속에 수많은 Module을 장착하는 것으로 아키텍처가 짜여져있다.
Nest 모듈 - Angular framework에서 영감 받았다. 아키텍처 동일해서 프론트 개발자가 익히기 쉽다(고 한다).
간편하게데이터베이스 접근할 수 있는 ORMs 구성할 수 있다. (typeORM, Prisma).- Prisma는 Flyway를 독특한 문법과 함께 사용하는 것과 같은 느낌
- TypeORM은 JPA인데 미성숙한 JPA로 느껴졌다. 제공 되는 기능이 앞도적으로 부족하다. 2023년 기준 최신 버전이 0.3버전
2. Nest js 사용법
7가지의 핵심 모듈을 이해하고 프로젝트를 어느정도 이해할 수 있었다.
1. Controller
2. Service
3. Module
4. Pipes
5. Interceptors
6. Guards
7. Filters
1) 프로젝트 생성하고 hello world 띄우기
# 01. nest 프로젝트 설치 $ npm i -g @nestjs/cli $ nest --version $ nest --help # 02-1. nest로 새 프로젝트 생성 -> npm, yarn 선택나오는데 enter. $ nest new project-name # 02-2. 타입스크립트 전용 starter로 생성하기 $ git clone <https://github.com/nestjs/typescript-starter.git> project $ cd project $ npm install # 03. 프로젝트 실행 $ npm run start
2) 프로젝트 분석
- src
- ├── app.controller.spec.ts Contoller 테스트 작성하는 곳
├── app.controller.ts API 요청 받는 부분 - ├── app.module.ts app 실행에 필요한 모든 것이 있는 Root 모듈
- ├── app.service.ts Controller의 비즈니스 로직 오는 부분 (= Provider에 등록. 의존성 주입 / 관계 생성 역할)
- └── main.ts 전체 프로젝트가 시작되는 곳 (By NestFactory)
<aside>💡 스프링의 Annotation 기능을 Nest Js는 데코레이터라는 이름으로 수행 </aside>
3) 핵심 빌딩 블록 Controller, Service, Module 생성하기
- Module?
@Module({ imports: []. controllers: [], providers: [], exports: [], }) class ApplicationModule {}
- Controllers : 라우팅 컨트롤러 매핑
- Providers : DI를 위한 Instruction이다. How to obtain value from dependency
- @Injectanle() 선언된 클래스, useFactory, useValue, useClass
- 타입스크립트 리플렉션 Reflect.getMetadata(’design:paramtypes’: CatsService); 이용하여 Providers DI 적용
- Imports / Exports → 모듈 imports, exports해서 재사용할 수 있다.
- Module : Nest의 핵심, 아래의 메타데이터를 매핑해서 모듈 블록으로 사용할 수 있다.
- 직접 폴더, 파일을 만들 수 있지만 CLI 명령어로 자동 생성 가능
// Generate a Controller $ nest generate controller {폴더} // Generate a Service $ nest generate service {폴더} // Generate a Module $ nest generate module {폴더}
- 명령어 1개로 controller / spec 파일(unit test) 생성하고 AppModule에 의존성 주입까지 자동으로 해준다.
- 💡 스프링은 @Controller, @Service, @Repository 선언하면 스프링이 Component Scan으로 IoC 컨테이너에 등록한다.
- 💡 NestJS는 @Controller(), @Injectable(), @Module로 선언하고 AppModule에 controller, provider, imports로 주입할 모듈, 클래스 입력해줘야 Nest IoC 컨테이너에 등록된다. (명령어로 생성하면 자동이지만, 코드 작성하면서 결국 수동 입력 필요하더라)
4) Nest js 나머지 핵심 빌딩 블록 4개
Filters
- API Exception의 응답값 예외 처리
- Spring의 @ControllerAdvice와 @ExceptionHandler 역할을 한다.
Pipes
- input 데이터의 유효성 검사 (srping-validation-starter 같은 기능)
- transformations (spring에 jackson 같은 역할. 서버 요청 Input이 기본 string type인데 원하는 Type으로 직렬화, 역직렬화 도와준다.)
Guards
- 인증 / 인가, Role, ACLs
Interceptors
- 스프링의 AOP와 유사
[요청 - 응답 cycle]
학습자료
[입문자]
- Nest js 개발자의 Nest js 핵심 설명
- Nest.js 공식문서 (다른 프레임워크와 비교해서 굉장히 잘 되어 있음)
- https://velog.io/@yukina1418/Nest의-아키텍처에-대해서-작성중
[초심자]
- Nest.js 아키텍처와 패턴
- 가장 유명한 Nest.js 애플리케이션 만들기 컨텐츠
- 왜 다른 프레임워크도 있는데 Nest.js일까?
- https://medium.com/daangn/typescript를-활용한-서비스개발-73877a741dbc
- https://velog.io/@hong-brother/성능테스트-과연-nestjs는-얼마나-버틸까단순편
[TypeORM]
[커뮤니티]
- https://trilon.io/blog
- https://dev.to/nestjs
- Nest.JS 공식 issue들을 읽어보아도 어떤 문제들이 있는지 살펴볼 수 있다.
반응형'Node.js > nest.js' 카테고리의 다른 글
[nestjs] env파일로 관리하던 환경변수를 yaml파일로 관리하기 (0) 2023.07.02 백앤드에게 Event Loop란 무엇인가.(브라우저, Nest js, SpringBoot) (0) 2023.03.08 [Password hashing] Argon2, Bcrypt, Scrypt, PBKDF2 소개 (0) 2023.03.06 - node.js 서버 사이드 애플리케이션 프레임워크이다. Opinionnated를 지향해 Best Pactice를 제공한다.