본문 바로가기
NestJS

NestJS 간단한 CRUD API 작성

by Apère 2023. 3. 9.
반응형

CLI에서 아래명령어로 간단하게 기본파일을 생성할 수 있습니다

nest g resource name

name에 원하는 명칭을 지정합니다. 그런다음 REST API 와 y를 선택하면 아래와 같은 구조로 파일이 생성됩니다 

이렇게 패키지가 생성되었다면 그다음 먼저 DB관련 설정을 합니다. 우선 아래 명령어로 typeORM을 설치합니다

npm install mssql typeorm @nestjs/typeorm

저는 mssql을 사용하기 때문에 mssql을 썼지만 mysql을 사용하신다면 mysql2를 대신설치 하셔도 됩니다. 패키지 설치가 완료되었다면 이제 설정을 추가하면 됩니다. 우선 app.module.ts에 아래와 같이 DB설정을 추가합니다

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { User } from './users/entities/user.entity';
import { UsersModule } from './users/users.module';


@Module({
  imports: [UsersModule,
    TypeOrmModule.forRoot({
      type: 'mssql',
      host: 'localhost',
      port: 1433,
      username: 'nest',
      password: 'nest',
      database: 'nest',
      entities: [User],
      synchronize: true,
      extra: {
        trustServerCertificate: true,
      }
    }),
    ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

그런다음 resouce로 생성했던 모듈에도 설정을 추가합니다. users.module.ts 파일에 아래와 같이 설정을 추가 합니다

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './entities/user.entity';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  controllers: [UsersController],
  providers: [UsersService]
})
export class UsersModule {}

DTO와 Entity도 아래와 같이 간단하게 구현해줍니다

export class CreateUserDto {
    name: string;
    age: number;
}


@Entity()
export class User {
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    name: string;

    @Column()
    age: number;

}

이제 DTO와 Entity 변환할수 있는 패키지를 추가합니다.  저는 class-transformer 패키지를 이용하여 구현하였기 때문에 아래 명령어로 설치 할수 있습니다

npm install class-transformer --save
npm install reflect-metadata --save

이제 users.service.ts 파일에 아래와 같이 Repository 추가와 DTO <-> Entity 변환 함수를 추가하고 나머지 CRUD 함수를 구현하면 마무리 입니다

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { classToPlain, plainToClass } from 'class-transformer';
import { Repository } from 'typeorm';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
import { User } from './entities/user.entity';

@Injectable()
export class UsersService {
  constructor(
    @InjectRepository(User)
    private usersRepository: Repository<User>,
  ) {}

  static toModel(createUserDto :CreateUserDto ) : User {
    const data = classToPlain(createUserDto);
    return plainToClass(User, data);
  }

  static toModelByUpdateDTO(updateUserDto :UpdateUserDto ) : User {
    const data = classToPlain(updateUserDto);
    return plainToClass(User, data);
  }

  create(createUserDto: CreateUserDto) {
    return this.usersRepository.save(UsersService.toModel(createUserDto));
  }

  findAll() {
    return this.usersRepository.find();
  }

  findOne(id: number) {
    return this.usersRepository.findOneById(id);
  }

  update(id: number, updateUserDto: UpdateUserDto) {
    return this.usersRepository.update(id, UsersService.toModelByUpdateDTO(updateUserDto));
  }

  remove(id: number) {
    return this.usersRepository.delete(id);
  }

  


}

 

반응형

'NestJS' 카테고리의 다른 글

NestJS 시작하기  (0) 2023.03.05

댓글