폴더 구조

 


결과 화면

 


1. 패키기 설치하기

npm install @nestjs/typeorm typeorm pg

npm install -g ts-node

터미널에서 위의 명령어를 실행해 패키지를 설치한다.

ts-node 패키지가 전역으로 설치되어 있다면 추가로 설치할 필요는 없다.

 

2. typeorm.config.ts

  • src/config/typeorm.config.ts

해당 경로에 typeorm.config.ts 파일을 만든다.

로컬 또는 서버에서 만든 데이터베이스 정보를 입력한다.

import { TypeOrmModuleOptions } from '@nestjs/typeorm';

export const typeOrmConfig: TypeOrmModuleOptions = {
  type: 'postgres',
  host: '_HOST_',
  port: _DATABASE_PORT_,
  username: '_USER_NAME_',
  password: '_DATABASE_PASSWORD_',
  database: 'postgres',
  entities: [__dirname + './../**/*.entity.{js,ts}'],
  logging: true
};

 

2-1. 데이터베이스

참고, 로컬에 아래 사진처럼 PSQL 데이터베이스를 만들었다.

psql 테이블 만드는 법

 

 

3. app.module.ts에 TypeORM import 하기

@Module imports 부분에 TypeOrmModule.forRoot(typeOrmConfig) 모듈을 추가한다.

board.module.ts 파일이 생겼기 때문에 controllers와 providers가 중복이 되어 안에 리스트를 삭제한다.

import { Module } from '@nestjs/common';
import { BoardModule } from './board/board.module';
import { TypeOrmModule } from "@nestjs/typeorm";
import { typeOrmConfig } from "./config/typeorm.config";

@Module({
  imports: [BoardModule, TypeOrmModule.forRoot(typeOrmConfig)],
  controllers: [],
  providers: []
})

export class AppModule {}

 

5. board.entity.ts

  • src/board/entities/board.entity.ts

데이터베이스 엔티티를 작성한다.

데이터베이스 컬럼에 따라 엔티티는 다르다.

import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity('board_table')
export class BoardEntity extends BaseEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  title: string;

  @Column()
  content: string;

  @Column()
  created_at: Date;

  @Column()
  updated_at: Date;
}

 

5. create-board.dto.ts, update-board.dto

DTO(Data Transfer Object)는 데이터가 네트워크를 통해 전송되는 방법을 정의하는 개체이다.

Typescript 인터페이스나 간단한 클래스를 사용해서 DTO 스키마를 정의할 수 있고, 컴파일 과정에서도 엔티티를 보존하기 위해서 클래스를 선호한다.

 

  • src/board/dto/create-board.dto.ts
export class CreateBoardDto {
  id: number;
  title: string;
  content: string;
  created_at: Date;
  updated_at: Date;
}

 

  • src/board/dto/update-board.dto
import { PartialType } from '@nestjs/mapped-types';
import { CreateBoardDto } from './create-board.dto';

export class UpdateBoardDto extends PartialType(CreateBoardDto) {
  id: number;
  title: string;
  content: string;
  created_at: Date;
  updated_at: Date;
}

 

6. board.repository.ts 파일 만들기

https://typeorm.io/working-with-repository

https://orkhan.gitbook.io/typeorm/docs/custom-repository

TypeORM Custom repositories에 대한 설명의 위의 공식 문서를 참고한다.

 

  • src/board/board.repository.ts

사용자 정의 레포지토리를 만들고, create, findAll, findOne, update, remove에 해당하는 함수를 만든다. (함수명은 상관없다.)

create, save, finde 등 다양한 메소드들을 제공한다.

import { EntityRepository, Repository, DataSource } from 'typeorm';
import { BoardEntity } from './entities/board.entity';

@EntityRepository()
export class BoardRepository extends Repository<BoardEntity> {
  constructor(private readonly datasource: DataSource) {
    super(BoardEntity, datasource.createEntityManager())
  }

  // @Post()
  async createByBoard(createBoardDto): Promise<BoardEntity[]> {
    const newBoard = this.create(createBoardDto)

    return await this.save(newBoard)
  }

  // @Get()
  async findAllByBoard(): Promise<BoardEntity[]> {
    return await this.find()
  }

  // @Get(':id')
  async findOneByBoardId(id: number): Promise<BoardEntity> {
    return await this.findOne({
      where: {
        id
      }
    })
  }

  // @Patch
  async updateByBoard(id, updateBoardDto): Promise<BoardEntity> {
    await this.update(id, updateBoardDto)

    return await this.findOne({
      where: {
        id
      }
    })
  }

  // @Delete
  async removeByBoard(id): Promise<void> {
    await this.delete(id)
  }
}

 

7. board.service.ts

board.repository.ts에서 만든 함수들을 return한다.

import { Injectable } from '@nestjs/common';
import { BoardRepository } from './board.repository';
import { CreateBoardDto } from './dto/create-board.dto';
import { UpdateBoardDto } from './dto/update-board.dto';

@Injectable()
export class BoardService {
  constructor(
      private readonly boardRepository: BoardRepository,
  ) {}

  create(createBoardDto: CreateBoardDto) {
    return this.boardRepository.createByBoard(createBoardDto)
  }

  findAll() {
    return this.boardRepository.findAllByBoard()
  }

  findOne(id: number) {
    return this.boardRepository.findOneByBoardId(id)
  }

  update(id: number, updateBoardDto: UpdateBoardDto) {
    return this.boardRepository.updateByBoard(id, updateBoardDto)
  }

  remove(id: number) {
    return this.boardRepository.removeByBoard(id)
  }
}

 

8. board.controller.ts

Get, Post 등 axios 메서드를 작성한다.

import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common';
import { BoardService } from './board.service';
import { CreateBoardDto } from './dto/create-board.dto';
import { UpdateBoardDto } from './dto/update-board.dto';

@Controller('board')
export class BoardController {
  constructor(private readonly boardService: BoardService) {}

  @Post()
  create(@Body() createBoardDto: CreateBoardDto) {
    return this.boardService.create(createBoardDto);
  }

  @Get()
  findAll() {
    return this.boardService.findAll();
  }

  @Get(':id')
  findOne(@Param('id') id: string) {
    return this.boardService.findOne(+id);
  }

  @Patch(':id')
  update(@Param('id') id: string, @Body() updateBoardDto: UpdateBoardDto) {
    return this.boardService.update(+id, updateBoardDto);
  }

  @Delete(':id')
  remove(@Param('id') id: string) {
    return this.boardService.remove(+id);
  }
}

 

9. board.module.ts

  • src/board/board.module.ts

만든 컨트롤러, 서비스, 레포지토리를 연결한다.

import { Module } from '@nestjs/common';
import { BoardService } from './board.service';
import { BoardController } from './board.controller';
import { BoardRepository } from './board.repository';

@Module({
  controllers: [BoardController],
  providers: [BoardService, BoardRepository],
})
export class BoardModule {}

 

10. 불필요한 파일 삭제하기

app.controller.ts, app.service.ts 등 사용하지 않는 파일이 있다면 삭제한다.

※app.module.ts 파일은 삭제하면 안된다. (모듈을 import, export 하기 때문에)※

+ Recent posts