NestJs(1)_구성 요소

임쿠쿠·2021년 8월 8일
0

NestJS

목록 보기
1/2
post-thumbnail

NestJS 구성 요소

(1) NestJS 모듈

  • 데코레이터로 주석이 달린 클래스 이다.
  • 애플리케이션에는 하나 이상의 모듈이 필요하다.

Provider
대부분의 기본 nest 클래스는 서비스, 레포지토리, 팩토리, 헬퍼 등 프로바이더로 취급 가능하다.
즉, 객체는 서로 다양한 관계를 만들 수 있으며 객체의 인스턴스를 '연결'하는 기능은 대부분 Nest 런타임 시스템에 위임 가능하다.
Provider 등록은 모듈 파일에서 가능하다. ~ 종속성 주입 : 각각의 서비스를 컨트롤러에 주입

모듈 생성 CLI

nest g module '모듈명'

(2) NestJS 컨트롤러

  • 컨트롤러는 들어오는 요청을 처리하고 클라이언트에 응답을 반환
  • controller는 @Controller 데코레이터로 클래스를 정의한다.
  • handler는 @GET @POST @DELETE 등과 같은 컨트롤러 클래스 내 메서드이다.

컨트롤러에 서비스 인젝션 시 Ts에서 제공하는 접근 제한자(publice, protected, private)를 생성자 파라미터에 선언할 경우, 접근 제한자가 사용된 파라미터는 암묵적으로 클래스 프로퍼티로 선언된다.

컨트롤러 생성 CLI

 nest g controller '컨트롤러명' 

(3) NestJS 서비스

  • @Injectable 데코레이터로 감싸져서 제공되며, 서비스 인스턴스는 애플리케이션 전체에서 사용 될 수 있다.
  • 서비스 로직 , 데이터베이스 관련 로직, 데이터 유효성 검사
  • Injectable 데코레이터를 이용해서 다른 컴포넌트에서 이 서비스를 사용 할 수 있게 한다.
  • controller에서 service를 이용하기 위해서 Controller 클래스의 Constructor안에 Dependency Injection 실행

서비스 생성 CLI

nest g service '서비스명'

(4) NestJS Model, DTO

Model

Class를 이용하거나 Interface를 이용한다.

  • Interface는 변수의 타입만을 체크한다.
  • class는 변수의 타입도 체크하고 인스턴스 또한 생성 가능

DTO(Data Transfer Object)

  • 계층간 데이터 교환을 위한 객체이다.
  • DB에서 데이터를 얻어 Service나 Controller 등으로 보낼 때 사용하는 객체
  • DTO는 데이터가 네트워크를 통해 전송되는 방법을 정의하는 객체
  • Interface나 class를 이용해서 정의 할 수 있다.

DTO를 쓰는 이유

1) 데이터 유효성을 체크하는데 효율적
2) 유지보수과정에서 다수의 프로퍼티를 관리 가능
3) 타입스크립트의 타입으로도 사용 가능

(5) NestJS PIPE

파이프는 @Injectable() 데코레이터로 주석이 달린 클래스이다.

  • 파이프는 data transformationdata validation을 위해 사용
  • 파이프는 컨트롤러 경로 처리기에 의해 처리되는 인수로 작동
  • Nest는 메소드가 호출되기 직전에 파이프를 삽입하고 파이프는 메소드로 향하는 인수를 수신 후 작동

Data Transformation
입력 데이터를 원하는 형식으로 변환

Ex) 만약 숫자를 받길 원할 시 데이터가 문자열 형식으로 온다면 파이프에서 자동으로 숫자로 변환

Data Validation
입력 데이터를 평가 후 전달 or 에러 처리

PIPE 사용법

1) Handler-level Pipes
라우터 핸들러 레벨에 직접 @UsePipes() 데코레이터를 이용하여 모든 파라미터에 적용

2) Parameter-level Pipes
특정한 파라미터에 적용되는 파이프

3) Global-level Pipes
애플리케이션 레벨의 파이프로 클라이언트에서 들어오는 모든 요청에 적용

*DTO에 정의한 validation 적용 시 nestjs built-in된 ValidationPipe사용

Custom PIPE 구현

  • Pipe Transform 인터페이스를 활용해 transform() 메소드로 인자(arguments)처리
  • transform() 메소드 :
    첫번째 파라미터는 처리가 된 인자의 값이며, 두번째 파라미터는 인자에 대한 메타 데이터를 포함한 객체

tranfrom() 메소드에서 return 된 값은 route 핸들러로 전해지고 예외 발생 시 클라이언트에 에러 전달

profile
Pay it forward

0개의 댓글