Node.js 백엔드 개발자 되기
- 자바스크립트는 런타임(Node.js)에서 싱글 스레드로 동작한다. _ 이벤트 루프(Event Loop)
libuv에서 File I/O, DNS Operation 등의 작업은 스레드 풀을 사용하기 때문에 멀티 스레드를 활용한다.
- 싱글 스레드로 동작하기 때문에 callback, promise, async/await을 사용해 비동기 처리를 할 수 있다.
- callback : 함수의 파라미터로 함수 전달, 가독성이 좋지 않음
- promise : 비동기 작업 완료 시, 결과 반환하는 객체 / 대기 -> 성공 / 실패
- async/await : Promise를 사용하는 비동기 작업을 동기적으로 처리하는 것처럼 코드 작성 할 수 있게 도와줌.
- Node.js에서 실행하는 서버 사이드 프레임워크
- 타입스크립트 완벽 지원
- 자바스크릡트 최신 스펙 사용
- HTTP 요청 부분은 추상화되어 express, fastify 사용 가능
| 익스프레스 | NestJS | |
|---|---|---|
| 간략 소개 | 미니멀리스트 웹 프레임워크 | 자바스크립트의 최신 기능을 사용해 효율성을 추구하며 상업용 서버 애플리케이션 구축을 목표로 하는 프레임워크 |
| 라우터 | 직접 라우터 함수를 추가하거나, 미들웨어 사용 | @Controller() 데코레이터 사용 |
| 의존성 주입 | 없음 | 잘 만든 의존성 주입 기능을 제공함. 서비스의 의존 관계의 관리가 쉬움 |
| 에러 핸들링 | 직접 에러 처리를 해야 함 | @Catch() 데코레이터 사용 |
| 테스트 | 직접 테스트 관련 도구들을 설치 및 실행해야 함 | jest를 기반으로 한 내장 테스트 모듈을 제공 |
| 인기도 | Node.js에서 가장 인기 있는 프레임워크. 깃허브 스타 62170 | 두 번째로 인기 있는 프레임워크. 깃허브 스타 60700 |
| 아키텍처 | 특정 아키텍처를 요구하지 않음 | 컨트롤러, 프로바이더, 모듈을 사용한 애플리케이션 아키텍처 제공 |
NestJS는 쉽게 테스트하고, 확장 가능하고, 각 모듈간 의존성을 줄여줌으로써 유지보수가 쉬운 아키텍처를 제공한다. (데코레이터)
가드 -> 인터셉터 -> 파이프 -> 컨트롤러(필수) -> 서비스 -> 리포지토리
- 파일명은 .으로 연결한다. 모듈이 둘 이상의 단어로 구성되면 대시(-)로 연결한다.
- 클래스명은 카멜케이스를 사용한다.
- 같은 디렉터리에 있는 클래스는 index.ts를 통해서 임포트하는 것을 권장한다.
- 인터페이스 작명법은 I를 붙이는 방법이 있는데, 어색한 부분이 있어 웬만해서는 인터페이스를 만들고 그 하위 인터페이스 혹은 클래스를 만든다.
interface Series {}
interface BookSeries extends Series {}
class MovieSeries extends Series {}- 타입스크립트에서는 데이터만 가지고 있는 타입을 선언할 때, 클래스보다는 인터페이스를 사용한다. (DTO)
@Injectable을 붙이면 프로바이더(Provider)가 된다. 의존성 주입을 받을 수 있도록 한다.- AppModule의 모듈 설정에 Provider 설정을 추가한다.
- NestJS에서 환경변수 설정은 ConfigModule에서 할 수 있으며, 설정된 환경변수를 다른 모듈에서 사용하려면 ConfigService를 주입받아 사용한다.
- ConfigModule.forRoot() 주요 옵션 : isGlobal (전역) / cache (환경변수 캐시) / envFilePath (환경 변수 파일 경로)
- package.json / scripts에
NODE_ENV={환경명}을 추가해 서버 기동 시 환경을 설정한다.
- NestJS에서는 파이프(pipe)를 사용해 요청의 유효성을 검증한다.