본문 바로가기

dev/nestjs

컨트롤러

백엔드를 nestjs 로 구현하기 위해 nestjs를 공부하기로 했다.

 

nodejs, npm 설치를 먼저 해준다.

npm : (Node Package Manager) nodejs의 모듈을 패키지 형태로 저장해 둔 패키지 매니저, nodejs 설치 시 함께 설치됨

nestjs 설치

nestjs/cli

 

-i : install

-g : global 모든 디렉토리에서 사용가능

 

npm i -g @nestjs/cli

 

 

프로젝트 생성

 

nest new ./ 
또는
nest new [프로젝트명] 

 

 

프로젝트 구조

 

 

- eslintrc.js

타입스크립트를 쓰는 가이드 라인을 제시해주고, 문법 오류 등을 알려주는 역할 등을 한다.

규칙을 가지고 코드를 짤수 있도록 해주는 라이브러리.

 

- prettierrc

‘ 또는 “ , indent 값을 2 또는 4를 줄 것인지 등의 코드 포맷터 역할을 한다.

코드 형식을 맞추는데 사용한다.

** eslintrc : 문법오류 위주 / prettierrc : 포맷 위주

 

- nest-cli.json

프로젝트 자체의 설정을 적어준다. ”sourceRoot” : 프로젝트 root 경로 (src)

 

- package.json

프로젝트 버전, 이름, 설명, 설치된 라이브러리.. 등등..

 

- tsconfig.json

타입스크립트 컴파일을 어떻게 할 것인지 설정

 

- tsconfig.build.json

“exclude” 부분에 제외할 파일을 명시

build 시 필요한 설정들을 적음

 

main.ts

 

 

NestFactory

응용 프로그램을 시작하는데 필요한 클래스를 인스턴스화

root module 인 AppModule 을 전달받아 (응용 프로그램을 시작하는데 필요한 클래스) 인스턴스화(app) 하고 서버를 실행시킨다.

 

nestjs 흐름

클라이언트가 요청 (localhost:3000/) 엔드포인트 : ‘/’, http메소드 : Get

엔드포인트가 ‘/’ 인 컨트롤러가 받아서 해당 서비스의 메소드를 실행 ex) getHello()

컨트롤러가 클라이언트에게 응답

클라이언트 → 컨트롤러 → 서비스 → 컨트롤러 → 클라이언트

 

데코레이터

해당 클래스를 필수 메타데이터와 연결하고 nest가 라우팅 맵을 만들 수 있도록 해줌

 

컨트롤러

@Controller() 데코레이터

외부의 요청을 처리하는 모듈

클라이언트의 요청을 처리하고 응답을 보내는 역할

각각의 컨트롤러는 하나 이상의 경로가 있으며 각기 다른 행동을 수행한다.

라우팅 : 어떠한 패킷을 원하는 곳으로 보내는 행위, HTTP 요청을 특정 컨트롤러로 보냄

@Controller(’경로 접두어’) : 관련 경로 집합을 쉽게 그룹화해준다.

경로 접두어가 없으면 HTTP 요청 데코레이터 @Get() … 를 가지는 메소드 (요청 핸들러)에 중복된 경로를 붙여줘야한다..

 

@Get() : HTTP 요청의 특정 엔드포인트를 처리해준다.

엔드포인트 : 클라이언트가 API 에 접근 할 수 있는 URL

 

request 요청 객체

  • @Req
  • request. 클라이언트가 보낸 요청의 세부 정보를 필요로 할 때 사용한다.(세션, 헤더 등)
  • 메서드 시그니처에 @Req() 를 추가해준다.
  • 메서드 시그니처
    • 만약 두 함수명, 매개변수 개수 등이 모두 같다면 두 함수의 시그니처는 같다.
    • 타입스크립트를 사용할 경우 @types/express 패키지를 설치해야함
  • import { Request } from 'express'; : Express.js 의 Request 를 사용한다.
  • 컴파일러가 함수를 구분하기 위한 구성요소. 함수명, 매개변수의 개수 등 요소가 포함되어 있다.

response 응답 객체

  • @Res

HTTP 메서드 데코레이터

  • @Get() @Post() @Put() @Delete() @Patch() @Options() @Head() @All()

와일드 카드 라우팅

  • ex) @Get(’ab*’) : ab로 시작하는 모든 엔드포인트

상태코드

  • @HttpCode() 데코레이터를 이용하여 응답코드 변경 가능
  • ex) @HttpCode(204) : 204를 반환해줌
  • POST 요청인 201 만 제외하고 200 반환

헤더

  • 응답 헤더를 지정하기 위해서 @Header() 데코레이터를 사용

리디렉션

  • @Redirect() 데코레이터 사용
  • @Redirect(url, statusCode)
  • 응답을 특정 URL로 리디렉션

매개변수

  • 경로 URL의 동적 값
  • @Param()

하위 도메인 라우팅

  • 요청의 HTTP 호스트가 일치해야 함
  • @HostParam() 데코레이터를 사용하여 호스트 이름의 특정 위치 동적 값을 가져올 수 있다.
  • @Controller({host : ‘’})

비동기

  • Provise를 반환해야한다.
  • async 함수를 이용

페이로드

  • body 안에 들어있다. → @Body() 데코레이터를 사용
  • Dto를 정의하여 페이로드를 다룬다.
  • 클라이언트가 서버로 보내는 데이터

 

모듈

@Module() 데코레이터

각 응용 프로그램에는 하나 이상의 모듈이 있다. root module(AppModule)이 시작점

AppModule 하위에 기능별 모듈을 위치한다.

모듈은 싱글톤이므로 여러 모듈간에 공급자의 동일한 인스턴스를 공유할 수 있다. (공통 모듈을 만들어 공유할수 있다.)

 

 

 

싱글톤 패턴

객체의 인스턴스가 오직 1개인 것

최초 한번만 메모리를 할당하고 인스턴스를 만들어 전역으로 접근하게 한다.

다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다.

싱글톤 인스턴스가 너무 많이 공유되고 있을 경우 다른 클래스의 인스턴스 간 결합도가 증가하게 된다.

 

클래스 / 객체 / 인스턴스

클래스

- 객체를 만들어 내기 위한 설계도 및 변수와 메소드의 집합.

- 붕어빵 틀

객체

- 클래스의 타입으로 선언된 대상(설계도로 구현한 모든 대상).

- 클래스의 인스턴스.

- 붕어빵 틀로 만든 모든 붕어빵

인스턴스

- 객체를 실체화 한 것.

- 메모리에 할당되어 실제로 사용됨.

- new 키워드.

- 팥붕, 슈붕 등 각각의 붕어빵은 서로 다른 인스턴스

 

DTO / VO / Entity

DTO

- Data Transfer Object

- 계층(Layer)간 데이터 교환을 위해 사용하는 객체

- 데이터 교환만 함.

- 로직이 없고 getter/setter 만 있다. setter 를 사용하면 가변 객체가 된다.

- constructor 생성자로 불변 객체를 만든다.

VO

- Value Object

- 값 자체를 표현하는 객체

- 로직이 있고, 객체의 불변성을 보장한다.

- equals() 와 hashCode() 를 오버라이딩하여 VO 인스턴스의 비교를 할 수 있다.

Entity

- DB 테이블과 매칭되는 클래스

- 요청이나 응닶 값으로 사용하면 안된다.

 

계층형 구조

3-Tier Architecture (3계층)

Presentation Tier : 인터페이스 및 클라이언트쪽 통신을 담당

Application Tier : 비즈니즈 로직 구현. Logic Tier 또는 Middle Tier 라고 부르기도 함

Data Tier : 데이터베이스의 데이터를 읽고 쓰는 역할

npm : (Node Package Manager) nodejs의 모듈을 패키지 형태로 저장해 둔 패키지 매니저, nodejs 설치 시 함께 설치됨

 

 

 

'dev > nestjs' 카테고리의 다른 글

프로바이더  (0) 2023.02.08
모듈  (0) 2023.02.08
pipe  (0) 2023.02.07
미들웨어  (0) 2023.02.07
ejs  (0) 2023.02.04