백엔드를 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 설치 시 함께 설치됨