-
아래 글은 인프런에 있는 무료 강의를 듣고 정리한 것이다.
📖 Nest.js 프로젝트 기본 구조
- eslintrc.js : 개발자들이 특정 규칙을 가지고 코드를 짤 수 있게 도와주는 라이브러리. 문법 오류 및 타입스크립트 오류 잡아줌
- prettierrc : 코드의 형식을 만들어줌. 작은따옴표 vs 큰 따옴표, indent 2 vs 4... 등의 코드 포맷터. eslint 와 약간 다르다.
- nest-cil.json : nest 프로젝트를 위해 특정한 설정을 할 수 있는 파일
- tsconfig.json : 타입스크립트를 어떻게 컴파일 할 지 설정
📖 모듈이란?
@Module()
데코레이터로 주석이 달린 클래스이다.- 각 application 에는 하나 이상의 모듈이 필요하다.(루트 모듈 === appModule 포함)
- 루트 모듈은 application 의 시작점이 된다.
- 모듈은 밀접하게 관련된 기능 집합으로 만드는 것이 효율적이다. (유저 모듈, 주문 모듈, 챗 모듈 ... → 기능별로 생성)
- 모듈은 기본적으로 싱글톤이기 때문에 여러 모듈간에 쉽게 공급자의 동일한 인스턴스를 공유할 수 있다. ( → 공통 모듈을 만들고 여러 모듈에서 사용할 수 있다는 의미)
📖 컨트롤러란?
- 컨트롤러는 들어오는 요청을 처리하고 클라이언트에 응답을 반환한다.
@Controller()
데코레이터로 주석이 달린 클래스이다.- Handler 는 @Get, @Post, @Put 등의 데코레이터로 장식된 컨트롤러 클래스 내의 단순한(?) 메서드이다.
📖 Provider 란?
- 프로바이더의 주요 아이디어는 종속성을 주입할 수 있다는 것이다.
- 간단하게 설명하기
→ 컨트롤러는 많은 내용을 필요로 한다. 그러나 컨트롤러 내부에서 구현하기에 한계가 있으므로 서비스를 만들어서 컨트롤러에서 사용할 수 있도록 객체를 주입해주는 것!
- 서비스도 프로바이더, 레포지토리도 프로바이더, 팩토리도 프로바이더 이다.
- Provider 를 사용하기 위해서는 모듈 파일 내의
providers
항목 안에 해당 모듈에서 사용하고자 하는 Provider 를 등록해줘야 한다.
📖 서비스란?
- 서비스는 소프트웨어 개발내의 공통 개념이며, NestJS, JS 에서만 쓰이는 개념이 아니다.
@Injectable
(= 주입가능한) 데코레이터로 감싸져서 모듈에 제공되며, 이 서비스 인스턴스는 application 전체에서 사용될 수 있다.- 서비스는 컨트롤러에서 데이터의 유효성을 체크하거나 데이터베이스에 아이템을 생성하는 등의 작업 부분을 처리한다.
- 단, 서비스를 사용하기 위해서는 컨트롤러에 종속성 주입을 해줘야 사용이 가능하다. (Dependency Injection)
→ Controller 내의 constructor 에 Service 를 선언하고 this 키워드를 이용해 해당 서비스 내의 메서드를 가져와서 사용한다.
Tip ) private 접근 제한자를 이용해 간단하게 property 를 선언할 수 있다. (typescript 의 특성을 이용함)
@Controller('boards') export class BoardsController { constructor(private boardsService: BoardsService) {} }
📖 모델이란?
Class
나Interface
를 이용한다.
→ interface : 변수의 타입만을 체크한다.
→ class : 변수의 타입도 체크하고 인스턴스 또한 생성할 수 있다.
📖 NestJS 에서 request.body 를 받는 방법
@Body
데코레이터를 이용한다.
→
@Body(’title’) title: string
: 특정 값만 가져오기→
@Body() body: { title: stirng; description: string }
: 모든 값 가져오기📖 DTO 란?
- Data Transfer Object 의 약자
- 계층간 데이터 교환을 위한 객체이다.
- DB 에서 데이터를 얻어 Service 나 Controller 등으로 보낼 때 사용하는 객체를 말한다.
- DTO 는 데이터가 네트워크를 통해 전송되는 방법을 정의하는 객체이다.
interface
나class
를 이용해 정의 할 수 있다. (NestJS 는class
를 이용해 정의하는 것을 추천한다.)- DTO 를 사용하는 이유는?
- 데이터 유효성을 체크하는 데 효율적이다.
- 더 안정적인 코드를 만들어준다. (타입스크립트의 타입으로도 사용된다.)
- 클래스는 인터페이스와 다르게 런타임에서 작동하기 때문에 파이프 같은 기능을 이용할 때 더 유용하다. 따라서 클래스로 DTO 를 작성한다.
📖 파이프(Pipe) 란?
@Injectable()
데코레이터로 주석이 달린 클래스이다.- 파이프는 data transformation (데이터 변형/가공) 과 data validation (데이터 유효성 체크) 을 위해서 사용한다.
- 파이프는 컨트롤러 경로 처리기에 의해 처리되는 인수에 대해 작동한다.
→ 컨트롤러가 필요로 하는 params 가 정확한지 체크하거나 가공한다는 말이다.
- Nest 메소드가 호출되기 직전에 파이프를 삽입하고 파이프는 메소드로 향하는 인수를 수신하고 이에 대해 작동합니다. (맞지 않는 params 가 들어올 시 error 를 던진다.)
📖 파이프 사용하는 법 (Binding Pipes)
- Handler-level Pipes
@UsePipes()
데코레이터를 이용해서 사용한다.- 특정 핸들러에 있는 모든 파라미터에 적용하는 것이 핸들러 레벨이다.
- Parameter-level Pipes
- 특정 핸들러의 특정 파라미터에만 적용되는 파이프이다.
@Body(’title’, ParameterPipe) title
처럼 사용한다.
- Global Pipes
- 애플리케이션 전체 레벨의 파이프이다.
- 가장 상단 영역인 main.ts 에 작성한다.
→
app.useGlobalPipes(GlobalPipes);
- NestJS 는 기본적으로 6가지 내장 파이프를 제공한다.
- 파이프를 사용하기 위한 필요한 모듈 설치
npm install class-validator class-transformer --save
https://github.com/typestack/class-validator
📖 커스텀 파이프 구현 방법
PipeTransform
을 상속받아서 만들어야 한다.- 모든 파이프는
transform()
이라는 메소드를 필요로 한다.
→ 이 메소드는 value, metadata 라는 두 개의 파라미터를 가진다.
→ value : 처리가 된 인자의 값(value)
→ metadata : 인자에 대한 메타 데이터를 포함한 객체
→
transform()
에서 return 된 값은 router 핸들러로 전달된다. 만약 예외가 발생하면 클라이언트에 바로 전달된다.'프로그래밍 > Back-end' 카테고리의 다른 글
[TypeORM] How to auto-remove orphaned rows in TypeORM? (0) 2022.05.01 [java] 현재 날짜로부터 n분전, n시간전, n일전, n주전, n달전 표기하기 (0) 2021.06.09 댓글