✅ 레포지토리 의존성 주입
📝 ./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
강제로 다운그레이드
이제 잘 켜진다
✅ 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);
}
✅ 모든 게시글 가져오기
📝 ./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 |