with Nest

Nest.js 얼렁뚱땅 게시판 #2

pwerty 2025. 6. 16. 14:11

웹을 만들건, 앱을 만들건, 그 본질이 크게 다르지 않다. 여기서 이야기하고 싶은 것은 단어 몇 개 다르다고 쫄면 안된다는 것인데, 아.. 잘 모르겠다. 내가 실제 돈 벌어오는 서비스를 만들어본적이 없어서 그런지 Exception, Promise는 처음 본다. 단어에 위화감 든다.


2025.06.16 - [with Nest] - Nest.js 얼렁뚱땅 게시판 #1

 

Nest.js 얼렁뚱땅 게시판 #1

Nest Next 뭐 만만한 이름은 죄다 있는 이러한 JS 기반의 인프라를 처음 접하게 되었다. 어차피 여러분들은 핵심적인 것은 GPT 내지 나름의 책을 쓰다가 이 글에 들어왔다는건 거기에 잘 안나오는 내

hyeonistic.tistory.com

이전 글에서 논했던 Service 로직을 구현해보겠다. 여기서 CRUD를 이어주는 것에 불과하지만 어쨌든 이러한 내용들이 필요하다.

CRUD 구현하기

board.service.ts 파일을 이와 같이 내용을 확장하였다.

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Board } from './board.entity';
import { CreateBoardDto } from './dto/create-board.dto';
import { UpdateBoardDto } from './dto/update-board.dto';

@Injectable()
export class BoardService {
  constructor(
    @InjectRepository(Board)
    private boardRepository: Repository<Board>,
  ) {}

  async create(createBoardDto: CreateBoardDto): Promise<Board> {
    const board = this.boardRepository.create(createBoardDto);
    return await this.boardRepository.save(board);
  }

  async findAll(): Promise<Board[]> {
    return await this.boardRepository.find({
      order: { createdAt: 'DESC' }, // 최신순 정렬
    });
  }

  async findOne(id: number): Promise<Board> {
    return await this.boardRepository.findOne({
      where: { id },
    });
  }

  async update(id: number, updateBoardDto: UpdateBoardDto): Promise<Board> {
    await this.boardRepository.update(id, updateBoardDto);
    return await this.findOne(id);
  }

  async remove(id: number): Promise<void> {
    await this.boardRepository.delete(id);
  }
}

하지만 이대로 적으면 분명 잘 안된다. 왜냐하면, findOne 내지 update 함수에서는 null 반환 여지가 있다.

Promise<뭐시기>는 뭐시기를 반환할 것이라는 정해둔 것인데, 함수의 내용은 NULL 반환 여지를 가지고 있기 때문에, 언급한 두 함수의 Promise는 <Board | NULL>로 정정되어야 한다.

이 내용으로써 CRUD를 매핑했다. 이제 HTTP 요청을 처리하는 영역으로 넘어가보자.

 

Controller 구현

board.controller.ts 파일을 다음과 같이 수정하자 :

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

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

  // POST /board - 게시글 생성
  @Post()
  async create(@Body() createBoardDto: CreateBoardDto): Promise<Board> {
    return await this.boardService.create(createBoardDto);
  }

  // GET /board - 전체 게시글 목록
  @Get()
  async findAll(): Promise<Board[]> {
    return await this.boardService.findAll();
  }

  // GET /board/:id - 특정 게시글 조회
  @Get(':id')
  async findOne(@Param('id') id: string): Promise<Board> {
    const board = await this.boardService.findOne(+id);
    if (!board) {
      throw new NotFoundException(`게시글을 찾을 수 없습니다. ID: ${id}`);
    }
    return board;
  }

  // PATCH /board/:id - 게시글 수정
  @Patch(':id')
  async update(
    @Param('id') id: string,
    @Body() updateBoardDto: UpdateBoardDto,
  ): Promise<Board> {
    return await this.boardService.update(+id, updateBoardDto);
  }

  // DELETE /board/:id - 게시글 삭제
  @Delete(':id')
  async remove(@Param('id') id: string): Promise<{ message: string }> {
    await this.boardService.remove(+id);
    return { message: '게시글이 삭제되었습니다.' };
  }
}

Promise 내용 작성에 문제가 있다면 앞에서 다루었던 NULL이 빠진게 아닌지 다시 한번 확인해보면 된다. 이렇게 필요한 부분을 작성했다. 실제 테스트는 Postman이라는 테스팅 유틸리티 프로그램으로 시도했다.

 

자신의 서버를 우선 npm run start:dev 로 시동을 킨 다음 아래 프로그램 내용을 시도한다.

Postman 사용방법

우선 다운로드 받고 가입 또는 로그인을 하면 아래와 같은 창이 뜬다. 여기서 좌측 상단에서 New를 누른다.

 

우린 HTTP 요청 테스트를 위해 이 프로그램을 받았다. HTTP를 눌러서 HTTP 요청 창으로 들어간다.

 

링크는 http://localhost:3000, 요청 서비스는 POST

Headers를 누른다음, Key 내용은 Content-Type로, Value는 application/json 으로.. 직접 다 해줘야한다!!!

까지만 만져주고 다음 사진을 보자.

 

바로 옆에 있는 Body 를 누른다. 그 다음 none에 있던 선택을 raw로 바꿔준다. 그리고 다음과 같은 양식을 준수하여 작성한다 :

{
  "title": "첫 번째 게시글",
  "content": "게시글 내용입니다.",
  "author": "홍길동"
}

우측에 위치한 내용은 재량껏 변경하기

우측 상단 Send를 누르면 Postman 하단에서 게시됨을 확인 할 수 있다. 좋다. POST를 완료하셨다!

 

다음엔 남은 작업들을 보곘다.