Nest.js CRUD REST API 만들기
2025-02-06
NestCRUD
Nest.js CRUD 만들기
$ nest g res users
- g는 generate, res는 resource란 뜻으로, users라는 리소스를 만들겠다는 명령어입니다.
✔ What transport layer do you use? REST API
✔ Would you like to generate CRUD entry points? Yes
...
✔ Packages installed successfully.
- REST API 옵션을 선택하면 자동으로 REST API에 필요한 파일들이 생성됩니다.
기본적인 controller, module, testing, service, 파일들이 생겨났고 또한 dto와 entity 파일이 생겼습니다.
src/users/users.controller.ts
import {
Controller,
Get,
Post,
Body,
Patch,
Param,
Delete,
} from "@nestjs/common";
import { UsersService } from "./users.service";
import { CreateUserDto } from "./dto/create-user.dto";
import { UpdateUserDto } from "./dto/update-user.dto";
@Controller("users")
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Post()
create(@Body() createUserDto: CreateUserDto) {
return this.usersService.create(createUserDto);
}
@Get()
findAll() {
return this.usersService.findAll();
}
@Get(":id")
findOne(@Param("id") id: string) {
return this.usersService.findOne(+id);
}
@Patch(":id")
update(@Param("id") id: string, @Body() updateUserDto: UpdateUserDto) {
return this.usersService.update(+id, updateUserDto);
}
@Delete(":id")
remove(@Param("id") id: string) {
return this.usersService.remove(+id);
}
}
- 기본적인 CRUD에 필요한 라우팅을 구현하고 있습니다.
src/users/users.service.ts
import { Injectable } from "@nestjs/common";
import { CreateUserDto } from "./dto/create-user.dto";
import { UpdateUserDto } from "./dto/update-user.dto";
@Injectable()
export class UsersService {
create(createUserDto: CreateUserDto) {
return "This action adds a new user";
}
findAll() {
return `This action returns all users`;
}
findOne(id: number) {
return `This action returns a #${id} user`;
}
update(id: number, updateUserDto: UpdateUserDto) {
return `This action updates a #${id} user`;
}
remove(id: number) {
return `This action removes a #${id} user`;
}
}
- 컨트롤러에 필요한 비즈니스 로직들을 주입하는 코드가 들어있습니다.
src/users/users.module.ts
import { Module } from "@nestjs/common";
import { UsersService } from "./users.service";
import { UsersController } from "./users.controller";
@Module({
controllers: [UsersController],
providers: [UsersService],
})
export class UsersModule {}
- 모듈 로직도 완성되어 root module인 app.module.ts에 연결만 해주면됩니다.
DTO
- DTO(Data Transfer Object)는 데이터를 전달할 때 사용하는 객체입니다.
- 클래스 또는 인터페이스로 DTO를 정의할 수 있습니다.
기본 DTO 정의
src/users/dto/user.dto.ts
export class UsersDto {
id: number;
name: string;
email: string;
age?: number; // 선택적 필드
}
입력 DTO 정의
src/users/dto/create-user.dto.ts
export class CreateUserDto {
name: string;
email: string;
password: string;
}
수정 DTO 정의
import { PartialType } from "@nestjs/mapped-types";
import { CreateUserDto } from "./create-user.dto";
export class UpdateUserDto extends PartialType(CreateUserDto) {}
Entity
- Entity(엔티티)는 데이터베이스 테이블과 1:1로 매핑되는 클래스입니다.
typeorm 예시
import {
Entity,
PrimaryGeneratedColumn,
Column,
CreateDateColumn,
UpdateDateColumn,
} from "typeorm";
@Entity("users") // DB의 users 테이블과 매핑
export class UserEntity {
@PrimaryGeneratedColumn()
id: number;
@Column("varchar", { length: 100, nullable: false })
name: string;
@Column("varchar", { unique: true, nullable: false })
email: string;
@Column("varchar", { nullable: false })
password: string;
@CreateDateColumn({ type: "timestamp", nullable: false })
createdAt: Date;
@UpdateDateColumn({ type: "timestamp", nullable: true })
updatedAt: Date | null;
}
- 간단한 typeorm으로 작성한 entity의 예시입니다.
- DB 테이블과 매핑, 실제 입력된 데이터들을 저장합니다.