gengminy
갱미니의 코딩일지
gengminy
전체 방문자
오늘
어제
  • 분류 전체보기 (61)
    • 🚀 프로젝트 (16)
      • 🎸 고스락 티켓 (4)
      • 🌞 내친소 (5)
      • 🥁 두둥 (7)
    • 📡 백엔드 (31)
      • 🌱 Spring Boot (13)
      • 🐱 Nest.js (10)
      • ⭐ Node.js (8)
    • 🏭 Infra (11)
      • ⚙ 준비를 위한 준비 (2)
      • 🥑 AWS (3)
      • 🐳 Docker (3)
      • ⚡ Github Actions (3)
    • 🌊 프론트엔드 (1)
      • 🌌 React.js (1)
    • 😎 주저리 (2)

블로그 메뉴

  • 💻Github
  • 📸Instagram
  • ✨Blog

공지사항

인기 글

태그

  • nest
  • nestjs
  • JWT
  • AWS
  • 슬랙알림
  • 스프링
  • oauth2
  • SlackAPI
  • 깃헙액션
  • nodejs
  • Spring
  • 네스트
  • 스프링부트
  • OAuth
  • github
  • GithubActions
  • JSON
  • 도커
  • springboot
  • docker

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
gengminy

갱미니의 코딩일지

[NestJs] 따라하면서 배우는 NestJs - 5 (레포지토리 구현 및 DB 이용 CRUD)
📡 백엔드/🐱 Nest.js

[NestJs] 따라하면서 배우는 NestJs - 5 (레포지토리 구현 및 DB 이용 CRUD)

2022. 7. 7. 00:29

✅ 레포지토리 의존성 주입

 

📝 ./src/boards/boards.service.ts

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { BoardRepository } from './board.repository';

@Injectable()
export class BoardsService {
    constructor(
        @InjectRepository(BoardRepository)
        private boardRepository: BoardRepository,
    ) {}
}

컨트롤러에 서비스를 주입한 것 처럼 서비스에 레포지토리를 주입해준다

여기서는 역시 생성자 주입 사용

 

데코레이터 @InjectRepository 를 사용하면서

인자로 우리가 만든 레포지토리 주입시켜주면 끝

 

 

 

✅ DB에서 하나의 id로 검색

 

📝 ./src/boards/boards.service.ts

import { Injectable, NotFoundException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Board } from './board.entity';
import { BoardRepository } from './board.repository';

@Injectable()
export class BoardsService {
    constructor(
        @InjectRepository(BoardRepository)
        private boardRepository: BoardRepository,
    ) {}

    async getBoardById(id: number): Promise<Board> {
        const found = await this.boardRepository.findOne(id);

        if (!found) {
            throw new NotFoundException(`Can't find Board with id ${id}`);
        }

        return found;
    }
}

DB에서 값을 불러오는 것을 기다려야 하기 때문에

async await 사용해서 반드시 비동기 작업으로 처리해주어야함

비동기 처리이기 때문에 리턴값은 Promise<T>

 

 

📝 ./src/boards/boards.controller.ts

import { Controller, Get, Param } from '@nestjs/common';
import { Board } from './board.entity';
import { BoardsService } from './boards.service';

@Controller('boards')
export class BoardsController {
    constructor(private boardsService: BoardsService) {}

    @Get('/:id')
    getBoardById(@Param('id') id: number): Promise<Board> {
        return this.boardsService.getBoardById(id);
    }
}

 

 

✅ 새 board 생성

 

📝 ./src/boards/boards.service.ts

async createBoard(createBoardDto: CreateBoardDto): Promise<Board> {
    const { title, description } = createBoardDto;

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

    await this.boardRepository.save(board);
    return board;
}

 

📝 ./src/boards/boards.controller.ts

@Post()
@UsePipes(ValidationPipe)
createBoard(@Body() createBoardDto: CreateBoardDto): Promise<Board> {
    return this.boardsService.createBoard(createBoardDto);
}

boardRepository.create 로 dto 생성

이후 boardRepository.save로 DB에 값을 전달해서 저장해주면 된다

 

 

 

❌ RepositoryNotFoundError

 

여기서 역시나 한가지 문제가 더 생겼는데.... 바로

자꾸 레포지토리와 엔티티를 찾을 수 없다고 뜨는 것이다

 

현재 최신 버전은 TypeORM 은 3.0, @nestjs/typeorm 은 8.4.5 이다

커스텀 레포지토리를 사용하기 위해 TypeORM 버전은 2.0으로 낮췄으나

아직 nestjs/typeorm 의 버전은 최신 버전과 연동되었기 때문에 발생하는 버그인 것 같다

@nestjs/typeorm 도 강제로 버전을 8.0.1로 낮춰주니까 잘 동작했다

 

2시간 동안 삽질의 결과 하

 

npm i @nestjs/typeorm@8.0.1 --save

강제로 다운그레이드

 

이제 잘 켜진다

 

postman 으로 post 보내기도 잘 됨
pgAdmin에서 Schemas -> Table 들어가서 빨간 아이콘 누르면 확인 가능

 

 

✅ DB 관련 로직 Repository로 옮겨주기

 

📝 ./src/boards/board.repository.ts

import { EntityRepository, Repository } from 'typeorm';
import { BoardStatus } from './board-status.enum';
import { Board } from './board.entity';
import { CreateBoardDto } from './dto/create-board.dto';

@EntityRepository(Board)
export class BoardRepository extends Repository<Board> {
    async createBoard(createBoardDto: CreateBoardDto): Promise<Board> {
        const { title, description } = createBoardDto;

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

        await this.save(board);
        return board;
    }
}

 

📝 ./src/boards/boards.service.ts

createBoard(createBoardDto: CreateBoardDto): Promise<Board> {
    return this.boardRepository.createBoard(createBoardDto);
}

서비스에 만들었던 create 로직을 repository 로 옮겨준다

서비스에 db 관련 로직까지 포함시키면 코드가 너무 복잡해질 수 있다

 

 

 

✅ 게시글 삭제

 

DELETE 메서드를 사용할 때 remove와 delete 를 사용할 수 있는데

remove는 해당 id 값이 무조건 존재해야 하며 (존재하지 않으면 404 error)

delete는 해당 id 값이 있으면 지우고 없으면 아무 영향을 끼치지 않음 (오류 발생 x)

 

그래서 remove는 DB에 2번 접근해야 해서 비효율적

여기서는 1번만 접근해도 되는 delete 사용

 

📝 ./src/boards/boards.service.ts

async deleteBoard(id: number): Promise<void> {
    const result = await this.boardRepository.delete(id);

    if (result.affected === 0) {
        throw new NotFoundException(`Can't find Board with id ${id}`);
    }
}

 

📝 ./src/boards/boards.controller.ts

@Delete('/:id')
deleteBoard(@Param('id', ParseIntPipe) id: number): Promise<void> {
    return this.boardsService.deleteBoard(id);
}

 

 

✅ 게시글 업데이트

 

📝 ./src/boards/boards.service.ts

async updateBoardStatus(id: number, status: BoardStatus): Promise<Board> {
    const board = await this.getBoardById(id);

    board.status = status;
    await this.boardRepository.save(board);

    return board;
}

 

📝 ./src/boards/boards.controller.ts

@Patch('/:id/status')
updateBoardStatus(
    @Param('id') id: number,
    @Body('status', BoardStatusValidationPipe) status: BoardStatus,
): Promise<Board> {
    return this.boardsService.updateBoardStatus(id, status);
}

 

request body에 status 정보를 같이 보내면 성공

 

 

✅ 모든 게시글 가져오기

 

📝 ./src/boards/boards.service.ts

async getAllBoards(): Promise<Board[]> {
    return this.boardRepository.find();
}

 

📝 ./src/boards/boards.controller.ts

@Get()
getAllBoard(): Promise<Board[]> {
    return this.boardsService.getAllBoards();
}

 

레포지토리의 find 를 사용하면 모든 데이터를 가져옴

간단하게 구현

저작자표시

'📡 백엔드 > 🐱 Nest.js' 카테고리의 다른 글

[NestJs] 따라하면서 배우는 NestJs - 7 (JWT, passport 이용한 인증 구현)  (0) 2022.07.08
[NestJs] 따라하면서 배우는 NestJs - 6 (auth 모듈 구현)  (0) 2022.07.07
[NestJs] TypeORM 사용 시 RepositoryNotFoundError 해결하기  (0) 2022.07.06
[NestJs] 따라하면서 배우는 NestJs - 4 (Postgres, TypeORM 적용)  (0) 2022.07.05
[NestJs] 따라하면서 배우는 NestJs - 3 (pipe와 validation)  (0) 2022.07.04
    '📡 백엔드/🐱 Nest.js' 카테고리의 다른 글
    • [NestJs] 따라하면서 배우는 NestJs - 7 (JWT, passport 이용한 인증 구현)
    • [NestJs] 따라하면서 배우는 NestJs - 6 (auth 모듈 구현)
    • [NestJs] TypeORM 사용 시 RepositoryNotFoundError 해결하기
    • [NestJs] 따라하면서 배우는 NestJs - 4 (Postgres, TypeORM 적용)
    gengminy
    gengminy
    코딩

    티스토리툴바