개요
지금까지 배운걸 사용하고 typeORM을 이용하여 DTO와 Entity를 정의하고 Restfull 한 API를 만들어 보고 nestjs의 규칙등도 알아보자
NestJS의 명명 규칙
- 클래스(Class)명:
- 클래스명은 대문자로 시작하고 카멜 케이스(CamelCase)를 사용합니다.
- RESTfull의 컨벤션을 따르기 위해 복수형으로 써주는 것이 좋다
- 강제적인 룰은 아니다
- 예:
UserService
,ProductController
,OrderService
- 모듈(Module)명:
- 모듈명은 대문자로 시작하고 카멜 케이스를 사용합니다.
- 예:
UserModule
,ProductModule
,OrderModule
- 컨트롤러(Controller)명:
- 컨트롤러명은 대문자로 시작하고 카멜 케이스를 사용합니다.
- 예:
UserController
,ProductController
,OrderController
- 서비스(Service)명:
- 서비스명은 대문자로 시작하고 카멜 케이스를 사용합니다.
- 예:
UserService
,ProductService
,OrderService
- 리포지토리(Repository)명:
- 리포지토리명은 대문자로 시작하고 카멜 케이스를 사용합니다.
- 예:
UserRepository
,ProductRepository
,OrderRepository
- DTO(Data Transfer Object)명:
- DTO명은 대문자로 시작하고 카멜 케이스를 사용합니다.
- 예:
CreateUserDto
,UpdateProductDto
,OrderDto
- 인터페이스(Interface)명:
- 인터페이스명은 대문자로 시작하고 카멜 케이스를 사용합니다.
- 예:
IUser
,IProduct
,IOrder
- 파일명:
- 파일명은 소문자로 작성하며, 단어 사이에는 하이픈(-)을 사용합니다.
- 예:
user.controller.ts
,product.service.ts
,order.module.ts
User Restfull API
user를 예시로 만들어 보자
User의 속성
- id : number
- email : string
- password : string
- name : string
- createdAt : Date
유저 리소스 생성
$ nest g resource user
REST API 엔터 치고 생성하자
dto, entity, controller, module, service 생성후 module import까지 자동으로 되어있다
Entity생성
// user/entities/user.entity.ts import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; @Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column() email: string; @Column() password: string; @Column() name: string; @Column({ name: 'created_at', type: 'timestamp with time zone', }) createdAt: Date; static from(email: string, password: string, name: string): User { const user = new User(); user.email = email; user.password = password; user.name = name; user.createdAt = new Date(); return user; } }
DTO 생성
// user/dto/create-user.dto.ts import { User } from '../entities/user.entity'; export class CreateUserDto { email: string; password: string; name: string; toUserEntity(): User { return User.from(this.email, this.password, this.name); } }
module 설정
APP_PIPE
ValidationPipe
import { Module, ValidationPipe } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { UserModule } from './user/user.module'; import { APP_PIPE } from '@nestjs/core'; @Module({ imports: [UserModule], providers: [ { provide: APP_PIPE, useValue: new ValidationPipe({ transform: true, whitelist: true, forbidNonWhitelisted: true, }), }, ], }) export class AppModule {}
config
$ npm i @nestjs/config
database
$ npm i @nestjs/typeorm
유저생성
controller에서 post로 body 데이터를 받아 service로 dto를 넘겨주자
// user/user.controller.ts ... @Post() create(@Body() createUserDto: CreateUserDto) { return this.userService.create(createUserDto); } ...
// user/user.service.ts ... create(createUserDto: CreateUserDto) { const user: User = createUserDto.toUserEntity(); return user; } ...