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 테이블과 매핑, 실제 입력된 데이터들을 저장합니다.