NestJS+TypeORM으로 백엔드 구축 PART1 【설치, RESTAPI 구현】

대체로 공식 문서대로 구현해 갑니다.

-1- 준비편



1.nestjs를 설치하여 프로젝트를 만듭니다.



nestjs 설치 및 프로젝트 작성
 npm i -g @nestjs/cli 
 nest new project-name

2. 프로젝트를 열고 필요한 패키지를 설치합니다.



프로젝트에 필요한 npm 패키지 설치
  npm i --save @nestjs/core @nestjs/common rxjs reflect-metadata
  npm i --save @nestjs/typeorm typeorm mysql2

3. 프로젝트의 루트 디렉토리에 ormconfig.json 만들기



나중에 ER 다이어그램을 자동으로 만들고 싶으므로 ormconfig.json을 사용하여 DB 정보를 전달합니다.

ormconfig.json
{
  "type": "mysql",
  "host": "localhost",
  "port": 3305,
  "username": "root",
  "password": "root",
  "database": "test",
  "entities": ["dist/**/*.entity{.ts,.js}"],
  "synchronize": true
}

4. mysql 컨테이너를 3305번 포트에서 시작



3305번 포트에서 mysql 컨테이너를 기동
docker run -it \
-e MYSQL_DATABASE=test \
-e MYSQL_ROOT_PASSWORD=root \
-p 3305:3306 \
-d mysql


-2- 구축편



-1- app.module.ts 편집



app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import {TypeOrmModule} from "@nestjs/typeorm";
@Module({
  imports: [TypeOrmModule.forRoot()],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

-2- UsersModule을 CLI로 작성


nest g module users
nest g service users
nest g controller users

users라는 디렉토리가 CLI에 의해 src에 작성됩니다.
그런 다음 라우팅을 위해 컨트롤러와 컨트롤러에서 호출되어 처리하는 서비스도 만들어 둡니다.

-3- user.entity.ts 작성 및 편집



users 디렉토리에 user.entity.ts를 만듭니다. 여기는 CLI에서 만들 수 없으므로 수동으로 만들 수 있습니다.

user.entity.ts
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;
  @Column()
  firstName: string;
  @Column()
  lastName: string;
  @Column({ default: true })
  isActive: boolean;
}

-4- users.module.ts 편집



CLI가 자동으로 공급자와 컨트롤러를 추가하므로 편집이 필요한 것은 TypeORM 관계뿐입니다.

users.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UsersService } from './users.service';
import { UsersController } from './users.controller';
import { User } from './user.entity';
@Module({
  imports: [TypeOrmModule.forFeature([User])],
  providers: [UsersService],
  controllers: [UsersController],
})
export class UsersModule {}

-5- users.service.ts 편집



users.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';
@Injectable()
export class UsersService {
  constructor(
    @InjectRepository(User)
    private usersRepository: Repository<User>,
  ) {}
  findAll(): Promise<User[]> {
    return this.usersRepository.find();
  }
  findOne(id: string): Promise<User> {
    return this.usersRepository.findOne(id);
  }
  async remove(id: string): Promise<void> {
    await this.usersRepository.delete(id);
  }
}

-6- users.controller.ts 편집



users.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';
@Injectable()
export class UsersService {
  constructor(
    @InjectRepository(User)
    private usersRepository: Repository<User>,
  ) {}
  findAll(): Promise<User[]> {
    return this.usersRepository.find();
  }
  findOne(id: string): Promise<User> {
    return this.usersRepository.findOne(id);
  }
  async remove(id: string): Promise<void> {
    await this.usersRepository.delete(id);
  }
}

-3- 확인편



여기까지 끝나면 또 한숨입니다!

-1- 프로젝트 시작


npm run start:dev

※dev를 붙이면 파일의 변경을 한 경우에 검지해, 마음대로 재실행해 주기 때문에 편리합니다.

-2- 데이터베이스 확인



Workbench에서 데이터베이스를 확인하면 test 데이터베이스 안에 user 테이블이 생겼는지 확인할 수 있습니다. 또한 RESTAPI를 테스트하기 위해 User 테이블에 적절하게 데이터를 넣습니다.



-3- RESTAPI 확인



RESTAPI도 제대로 작동합니다.


요약



여기까지의 소스는 이쪽

part2에서 TypeORM의 관계의 구현과 ER 다이어그램의 자동 작성을 실시합니다.

좋은 웹페이지 즐겨찾기