미들웨어(Middleware)
·
NestJS/NestJS 자체 문서화
미들웨어미들웨어는 클라이언트의 요청 데이터가 가장 먼저 처리되는 곳입니다. 필터, 파이프, 가드, 인터셉터 모두 미들웨어입니다.필터, 파이프, 가드, 인터셉터로 구현한 미들웨어가 아닌 NestMiddleware를 직접 구현한 미들웨어는 사용하지 않는 것을 권장합니다.미들웨어의 기능요청 및 응답 객체를 변경합니다.요청-응답 주기를 종료합니다.미들웨어 작성 시 주의점next() 함수를 실행하지 않으면 클라이언트에 응답이 전달되지 않고 요청이 중단됩니다. 나중에 쓸 일 생기면 정리
인터셉터(Interceptor)
·
NestJS/NestJS 자체 문서화
인터셉터의 역할인터셉터는 라우팅 실행 전과 실행 후 모두에 작업을 추가할 수 있습니다.인터셉터가 할 수 있는 일들메서드 실행 전후에 작업을 추가할 수 있습니다.함수에서 반환된 결과를 변환할 수 있습니다.함수에서 발생한 예외를 변환할 수 있습니다.조건에 따라 함수를 재정의 할 수 있습니다.인터셉터 구현인터셉터는 NestInterceptor 인터페이스를 구현해야 합니다.NestInterceptor 구현 시 intercept(context: ExcutionCentext, next: CallHandler) 메서드를 구현해야 합니다.매개변수 context는 요청 정보를 담고 있습니다.매개변수 next는 라우터 핸들러의 참조입니다.import { CallHandler, ExecutionContext, NestInt..
가드(Guard)
·
NestJS/NestJS 자체 문서화
가드는 클라이언트의 요청이 라우팅을 활성화 할 수 있는지 여부를 결정합니다.생성 방법npm g guard 이름가드 구현가드는 CanActivate 인터페이스를 구현해야 합니다.CanActivate 인터페이스는 canActivate(ExecutionContext) 메서드를 구현해야 합니다.canActivate() 메서드가 true를 반환하면 요청을 처리하고, false를 반환하면 요청을 처리하지 않습니다.ExecutionContext는 다음 정보를 가지고 있습니다.실행 중인 인스턴스가 HTTP, GraphQL, RPC, WebSocket 중 어떤 타입인지어떤 컨트롤러 클래스가 참조하는지어떤 컨트롤러의 메서드가 참조하는지구현 예시import { Injectable, CanActivate, ExecutionC..
예외 필터
·
NestJS/NestJS 자체 문서화
예외 필터의 역할NestJS의 예외 필터는 예외처리를 담당합니다.예외 필터의 특징직접 구현할 일은 거의 없습니다.HTTP / GraphQL, 웹소켓, gRPC의 예외 코드가 다르기 때문에 하나의 서비스를 여러 프로토콜에서 사용한다면 사용자 정의 필터를 사용해야 합니다.기본 제공 필터 목록아래 필터들은 HTTP / GraphQL 에러를 발생시킵니다.자주 사용할 것 같은 메서드만 정리했습니다.전체 목록은 공식 문서에서 확인 하세요.메서드응답코드설명BadRequestException400요청이 잘못된 경우UnauthorizedException401권한이 없을 때ForbiddenException403서버가 요청을 거부NotFoundException404서버는 정상이지만 요청한 정보가 없는 경우RequestTim..
파이프(Pipe), DTO
·
NestJS/NestJS 자체 문서화
파이프파이프는 클라이언트에서 전달된 요청 데이터를 검증 혹은 변환하는 역할을 합니다.라우팅 핸들러(컨트롤러)가 호출되기 전에 작동합니다.파이프 내부에서 예외 처리를 할 수 있습니다.비동기식일 수 있습니다. (데이터베이스나 다른 서버의 검증이 필요한 경우 사용)파이프는 보통 직접 만들지 않고, NestJS 기본 제공 파이프 혹은 class-transformer, class-validator 라이브러리를 사용합니다.DTO(Data Transfer Object)서버에서 데이터 처리를 위해 '요청 -> 컨트롤러 -> 서비스 -> 응답' 에 이르는 과정에서 데이터가 여러번 전달됩니다.이때 DTO는 두 가지 역할을 합니다.데이터의 유효성을 체크하는 타입데이터를 전달하는 객체class-transformer, cla..
프로바이더, 서비스
·
NestJS/NestJS 자체 문서화
프로바이더프로바이더는 NestJS가 인스턴스를 생성 및 관리하는 클래스(가끔 값이나 함수)를 의미합니다.프로바이더는 싱글톤입니다. 하나의 프로바이더 인스턴스를 앱 전역에서 공유합니다.서비스서비스는 프로바이더의 일종입니다. 모든 프로바이더가 서비스는 아니지만, 개발자가 작성하는 대부분의 프로바이더는 서비스입니다.대부분의 핵심 로직은 서비스에 작성합니다.생성 방법# 프로바이더 생성nest g provider 프로바이더명nest g pr 프로바이더명 # 약어 사용nest g pr 프로바이더명 --no-spec # 테스트 파일 생성을 원하지 않을 때# 서비스 생성nest g service 서비스명nest g s 서비스명 # 약어 사용nest g s 서비스명 --no-spec # 테스트 파일 생성을 원하지 않을 ..
컨트롤러
·
NestJS/NestJS 자체 문서화
컨트롤러는 어떤 요청을 어떻게 처리하는지 관리하는 역할을 합니다.컨트롤러 생성 방법nest g controller 이름nest g co 이름 # 약어 사용nest g co 이름 --no-spec # 테스트 파일 생성을 원하지 않을 때라우팅요청 경로를 처리하기 위한 방법을 라우팅이라 합니다.컨트롤러 자체의 경로와 메소드별 경로를 지정할 수 있습니다.// 컨트롤러 수준의 라우팅// http://url/index 패턴과 일치하면 해당 컨트롤러로 진입후 메서드를 찾습니다.@Controller('index')export class AppController { constructor(private readonly appService: AppService) {} //메서드 수준의 라우팅 // http://ur..
모듈
·
NestJS/NestJS 자체 문서화
모듈의 역할NestJS에서 모듈은 두 가지 역할을 합니다.하나의 큰 기능을 여러 개의 작은 기능으로 나누는 역할관련 있는 기능들을 하나의 단위로 묶는 역할하나의 큰 기능을 여러 개의 작은 기능으로 나누는 역할보통 하나의 앱은 여러 기능들이 있고, 각각의 기능도 세부 기능을 가지고 있습니다. 이 때 모듈 단위로 나누어 관리하면 재사용성이 높아지고 유지보수에 용이해집니다.관련 있는 기능들을 하나의 단위로 묶는 역할하나의 모듈은 여러 개의 업무 처리 절차로 나뉘어 있는데, 이러한 것을 하나로 묶는 역할을 합니다.모듈의 특징모듈은 싱글톤입니다. 동일한 모듈 인스턴스를 여러 모듈에서 사용할 수 있습니다.모듈은 의존성 주입을 할 수 없습니다. 모듈 간 순환 종속성이 발생할 수 있기 때문입니다.모듈 생성 방법nest..
자바, 스프링에는 죄가 없다
·
프로그래밍
NestJS 공부 하면서 느끼는 점은 자바, 스프링에는 죄가 없다.물론 완벽한건 아니고, 자바의 장황함이 싫긴 한데, Lombok과 함께하는 자바, 스프링은 다른 프레임워크들이랑 비교하면 제일 좋은게 맞다. 자바, 스프링을 쓰면서 Lombok, JPA, Model, DTO들을 못 쓰게 하는 회사들이 문제지, 얘네를 쓰면 자바, 스프링이 너무너무 편해지고 너무 좋다.자바, 스프링 쓰면서 얘네 안 쓰는 회사면 웬만하면 안 가야겠다. 계속 공부하면서 느끼는데 프론트엔드 개발자를 풀스택으로 쓸거 아니면 Express, NestJS 왜 쓰는지 모르겠다.Express, NestJS로 개발하면 핫리로드가 빨라서 속이 시원하긴 한데 그게 끝이다. (스프링 핫 리로드 빠르게 좀 해줘라 ㅠ)프론트엔드, 백엔드에 코드 공유..
Nest CLI
·
NestJS/NestJS 자체 문서화
Nest CLI의 기능프로젝트 생성 및 프로젝트에 필요한 패키지 자동 설치프로젝트 실행/빌드/테스트프로젝트 구성요소 생성Nest CLI 설치npm i -g @nestjs/clinest info #버전 확인을 통해 설치 확인프로젝트 생성nest new 프로젝트명ESLint 설정(윈도우즈 운영체제)윈도우즈의 경우 ESLint 설정에 아래 코드 추가"prettier/prettier": [ "error", { "endOfLine": "auto" } ],프로젝트 시작npm run start # 개발 모드지만 코드 변경 시 수동으로 서버를 재시작 해야 함npm run start:dev # 코드 변경 시 자동으로 서버 재시작npm run start:debug # 디버깅 모드로 실행. 코드 ..