효율적이고 확장 가능한 Node.js 서버측 어플리케이션을 구축하기 위한 프레임워크Express나 Fastify 프레임워크 위에서 동작하기에 해당 프레임워크의 기능도 사용하며, Nestjs만의 기능 사용기본적으로 TypeScript를 지원(자바스크립트로도 코딩 가능)O
클라이언트로부터 들어오는 요청을 처리하고 응답을 클라이언트에 반환라우팅 매커니즘은 어떤 컨트롤러가 어떤 요청을 수신했는지를 제어. 각 컨트롤러에는 둘 이상의 라우트가 있을 수 있으며, 다른 라우트는 다른 작업을 수행기본 컨트롤러를 만들기 위해 클래스와 데코레이터(@)를
Nest의 기본 클래스는 Service, Repository, Factory, Helper 등이 있으며, 이들은 Provider로 취급된다.Provider의 주요 아이디어는 종속성으로 주입할 수 있다는 것이다.즉, 객체는 서로 다양한 관계를 만들 수 있으며, 객체의 인
@Module() 데코레이터로 주석이 달린 클래스이다. 해당 데코레이터는 Nest가 어플리케이션의 구조를 구성하는데 사용하는 메타데이터를 제공한다.각 어플리케이션은 루트 모듈이라는 하나 이상의 모듈이 있다. 루트 모듈은 Nest가 어플리케이션 그래프(Nest가 modu
미들웨어에 대한 설명에 앞서 다음 Nest의 요청 생명주기에 대해 알고 가는 것이 도움이 될 것 같다.Nest Request LifecycleIncoming requestGlobally bound middlewareModule bound middlewareGlobal
Nest에는 어플리케이션 전체에서 처리되지 않은 모든 예외를 처리하는 Exception Layer가 내장되어 있다.어플리케이션 코드에서 예외를 처리하지 않으면, 해당 Layer에서 예외를 포착해 사용자에게 자동으로 응답을 보낸다.기본적으로 이 작업은 HttpExcept
파이프는 @Injectable() 데코레이터로 주석이 달린 클래스이다.파이프는 PipeTransform 인터페이스를 구현해야 한다.파이프는 다음과 같이 두가지 경우에 사용한다.변환: 입력 데이터를 원하는 형식으로 변환(ex: string -> int)유효성 검사: 입력
가드는 @Injectable() 데코레이터로 주석이 달린 클래스이다.가드는 CanActivate 인터페이스를 구현해야 한다.가드는 단일 책임(Single Responsibility)이 있다.런타임에 존재하는 특정 조건(ex: 권한, 역할, ACL 등)에 따라 지정된 요
인터셉터는 @Injectable() 데코레이터로 주석이 달린 클래스이다.인터셉터는 NestInterceptor 인터페이스를 구현해야 한다.인터셉터에는 AOP 기술에서 영감을 받은 유용한 기능들이 있다.메서드 실행 전/후 추가 로직 바인딩함수에서 반환된 결과 변환함수에서
Nest는 데코레이터라는 언어기능을 중심을 구축되었다.ES2016 데코레이터는 함수를 반환하고 대상, 이름 및 속성 설명자를 인수로 사용할 수 있는 표현식이다.데코레이터 앞에 @ 문자를 붙이고 이를 데코하려는 항목의 맨위에 배치하여 적용한다.데코레이터는 클래스, 메서드
종속성 주입은 IoC 컨테이너에 인스턴스에 대한 관리를 위임하는 것이다.다음은 CatsService이다.@Injectable() 데코레이터를 이용해 CatsService를 프로바이더로 표시한다.그 다음 Nest가 프로바이더를 컨트롤러 클래스에 주입하도록 요청한다.마지막
어플리케이션 동작 과정에서 하나 이상의 비동기 작업이 완료될 때까지 지연되어야 하는 경우가 있다.예를 들어, 데이터베이스와 연결이 설정될 때까지 요청 수락을 하지 않는 경우이다.비동기 프로바이더를 이용하여 이를 구현할 수 있다.useFactory 구문과 함께 async
모듈은 어플리케이션의 모듈식 부분으로 연관된 프로바이더 및 컨트롤러와 같은 컴포넌트를 그룹화고, 이러한 구성 요소에 대한 실행 컨텍스트 또는 범위를 제공한다.예를 들어, 모듈에 정의된 프로바이더는 export할 필요없이 같은 모듈의 다른 멤버에서 사용할 수 있다.프로바
순환 종속성은 두 클래스가 서로 의존할 때 발생한다.순환 종속성은 모듈 간 및 프로바이더 간에 발생할 수 있다.순환 종속성은 가능한 한 피하는것이 좋다. 하지만, 항상 그렇게 할 수는 없을 것이다.Nest는 이러한 순환 종속성을 위한 두가지 방법을 제공한다.Forwar
Node.js는 단일 쓰레드 환경에서 구동되며, 그렇기에 Nestjs는 싱글톤 인스턴스의 사용을 지향한다.하지만, GraphQL 어플리케이션의 요청별 캐싱, 요청 추적 및 멀티 테넌시와 같이 request 기반 라이프사이클을 원하는 경우가 있다. Injection Sc
Nest는 ModuleRef 클래스를 제공해 내부 프로바이더의 목록을 탐색할 수 있게하고, 프로바이더를 정의할 때 지정된 주입 토큰을 키로 사용해 프로바이더에 대한 참조를 얻게한다.ModuleRef 클래스를 이용해 정적 및 범위가 지정된 프로바이더를 모두 동적으로 인스
어플리케이션이 로드되는 즉시 모든 모듈이 필요한지에 대한 여부와 관계없이 로드된다.이는 콜드 스타트가 중요한 서버리스 환경에서 실행되는 앱/작업자에게는 병목 현상이 될 수 있다.Lazy-loadgin은 특정 서버리스 함수 호출에 필요한 모듈만 로드해 부트스트랩 시간을
Swagger를 NestJs에 적용해본다. Swagger Swagger는 REST API를 설계 및 문서화하여 협업, 유지보수 시 도움이 되는 라이브러리이다. 이를 이제 NestJS에 적용한다. Setting 먼저 Swagger 폴더를 만들고 그 안에 Swag
AppStore에 올리기 위해서 애플 로그인이 필수라 하여 하게되었다.애플 로그인은 이전에 해보았던 카카오 로그인처럼 프로바이더(애플, 카카오, ...)에서 발급한 토큰을 이용해 프로바이더에 API 요청을 하고 데이터를 받는 방법이 없다고 한다.(첫 번째 고난의 시작:
typeorm을 사용하면서 로컬 데이터베이스에 자동으로 스키마가 반영되도록 ormconfig.ts에 synchronize 속성을 true로 해두었었다.나중에 DB를 마이그레이션 할 때, 이 부분을 true로 놓게되면, 운영시에 문제가 발생하여 false로 둔다.아직 마
스키마를 구축하고 데이터베이스에 더미 데이터를 생성해서 테스트 해보는 것은 관련 쿼리문을 실행해 데이터가 맞게 날라오는지 등을 테스트 해볼 수 있기때문에 중요한 과정이라고 할 수 있겠다.더미 데이터를 생성할 때, 직접 DB에서 추가해주거나, 일일이 쿼리문을 날려 생성하
NestJS 프로젝트를 빌드할 때 빌드 시간에 가장 큰 영향을 미치는 것이 바로 TypeScript 컴파일이다. 원래라면 프로젝트에 변경사항을 적용하고 다시 실행시킬때마다 전체적으로 다시 TypeScript 컴파일을 해야한다.조그마한 변경에도 이 일을 똑같이 반복하게