그냥 만들며 찾아보며 배우기 NestJs #5 - PostgreSQL NestJs연동

kkikki·2024년 9월 23일

기존에 알려준대로 따라하기만 하면 완성이 될 줄 알았지만,
역시나 되지 않음

데이터베이스와 전혀 연동이 되지 않았다.
독학 겸 찾아서 하기로 결정


데이터 베이스 처리를 위한 엔터티 생성

board.entity.ts

import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
import { BoardStatus } from '../Models/board.model';


@Entity()
export class Board {
  @PrimaryGeneratedColumn('uuid') // UUID 형태의 자동 생성 ID
  id: string;

  @Column() // 제목 열
  title: string;

  @Column() // 설명 열
  description: string;

  @Column({
    type: 'enum', // 열의 타입을 enum으로 설정
    enum: BoardStatus, // 사용할 enum 지정
    default: BoardStatus.PUBLIC, // 기본값 설정
  })
  status: BoardStatus;
}

서비스 리팩토링

import { Injectable, NotFoundException } from '@nestjs/common';
import { BoardStatus } from './Models/board.model';
import { v1 as uuid } from 'uuid';
import { CreateBoardDto } from './Dto/create-board.dto';
import { InjectRepository } from '@nestjs/typeorm';
import { Board } from './Entities/board.entity';
import { Repository } from 'typeorm';

@Injectable()
export class BoardsService {
  // private boards: Board[] = [];
  constructor(
    @InjectRepository(Board)
    private boardsRepository: Repository<Board>,
  ){}

  //전체 게시글 조회
   async getAllBoards(): Promise<Board[]> {
    return this.boardsRepository.find();
  }

  //개별 게시글 조회
  async getBoardById(id: string): Promise<Board> {
    const found = await this.boardsRepository.findOne({ where: { id } });
    if (!found) {
      throw new NotFoundException(`게시글을 찾을 수 없어요 id: ${id}`);
    }
    return found;
  }
  
  //게시글 생성
// 게시글 생성
  async createBoard(createBoardDto: CreateBoardDto): Promise<Board> {
    const { title, description } = createBoardDto;

    const board = this.boardsRepository.create({
      title,
      description,
      status: BoardStatus.PUBLIC,
    });

    await this.boardsRepository.save(board);
    return board;
  }
  //게시글 삭제
   async deleteBoard(id: string): Promise<void> {
    const found = await this.getBoardById(id);
    await this.boardsRepository.delete(found.id);
  }
  //게시글 수정
   async updateBoardStatus(id: string, status: BoardStatus): Promise<Board> {
    const board = await this.getBoardById(id);
    board.status = status;
    await this.boardsRepository.save(board);
    return board;
  }

}

컨트롤러 리팩토링

import { Body, Controller, Delete, Get, Param, Patch, Post, UsePipes, ValidationPipe } from '@nestjs/common';
import { BoardsService } from './boards.service';
import { Board, BoardStatus } from './Models/board.model';
import { CreateBoardDto } from './Dto/create-board.dto';
import { BoardStatusValidationPipe } from './pipes/board-status-validation.pipe';

@Controller('boards')
export class BoardsController {
  // 서비스 주입
  constructor(private boardsService: BoardsService) {}

  // 게시글 전체 읽어오기
  @Get()
  async getAllBoard(): Promise<Board[]> { // Promise<Board[]>로 반환 타입 수정
    return this.boardsService.getAllBoards();
  }

  // 개별 게시글 조회
  @Get('/:id')
  async getBoardById(@Param('id') id: string): Promise<Board> { // Promise<Board>로 반환 타입 수정
    return this.boardsService.getBoardById(id);
  }

  // 게시글 입력
  @Post()
  @UsePipes(ValidationPipe)
  async createBoard(@Body() createBoardDto: CreateBoardDto): Promise<Board> { // Promise<Board>로 반환 타입 수정
    return this.boardsService.createBoard(createBoardDto);
  }

  // 게시글 삭제
  @Delete('/:id')
  async deleteBoard(@Param('id') id: string): Promise<void> { // Promise<void>로 반환 타입 수정
    await this.boardsService.deleteBoard(id); // await 추가
  }

  // 게시글 수정
  @Patch('/:id/status')
  async updateBoardStatus(
    @Param('id') id: string,
    @Body('status', BoardStatusValidationPipe) status: BoardStatus,
  ): Promise<Board> { // Promise<Board>로 반환 타입 수정
    return this.boardsService.updateBoardStatus(id, status);
  }
}

비동기 처리로 전체 교체 작업 진행


모듈

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { BoardsController } from './boards.controller';
import { BoardsService } from './boards.service';
import { Board } from './Entities/board.entity'; // Board 엔티티 가져오기

@Module({
  imports: [
    TypeOrmModule.forFeature([Board]), // Board 엔티티 등록
  ],
  controllers: [BoardsController],
  providers: [BoardsService],
})
export class BoardsModule {}

config, entity 추가 해줌
config 수정 + 엔터티 추가(board)

// typeorm.config.ts
import { TypeOrmModuleOptions } from '@nestjs/typeorm';
import { Board } from 'src/boards/Entities/board.entity';

export const typeOrmConfig: TypeOrmModuleOptions = {
  type: 'postgres',
  host: 'localhost',
  port: 5432,
  username: 'kon',
  password: 'postgres',
  database: 'board-app',
  entities: [Board, __dirname + '/../**/*.entity.{js,ts}'], // 엔티티 추가
  synchronize: true,
};

crud 테스트 결과 정상

profile
내 커리어 끝은 없다

0개의 댓글