typeorm remove()와 delete() 차이 (NestJS)
BE/NestJS2023. 11. 21. 21:41데이터를 지우는 메소드는 remove()와 delete()가 있습니다. 본 글에서는 2개의 메소드의 차이를 소개합니다.
remove()
service에 repository.remove() 메소드를 이용하여 데이터를 지우는 메소드를 생성하겠습니다. remove() 메소드는 entity를 인자로 넘겨줘야하기 때문에, id를 통해 board를 가지고 오는 메소드도 추가하였습니다.
@Injectable()
export class BoardsService {
constructor(
@InjectRepository(Boards)
private boardsRepository: BoardsRepository,
) {}
/**
* 특정 게시글을 가지고 옴
* @param id
*/
async getBoardById(id: number): Promise<Boards> {
const board = await this.boardsRepository.findOne({ where: { id } });
if (!board) throw new NotFoundException(`Can't found board. id: ${id}`);
return board;
}
/**
* 게시글을 생성
* @param createBoardDto
*/
async createBoard(createBoardDto: CreateBoardDto) {
const { title, description } = createBoardDto;
const board = this.boardsRepository.create({
title,
description,
status: BoardStatus.PUBLIC,
});
await this.boardsRepository.save(board);
return board;
}
/**
* 게시글을 삭제함
* @param id 게시글의 id 값
*/
async removeBoard(id: number) {
const board = await this.getBoardById(id);
await this.boardsRepository.remove(board);
}
}
이번에는 API를 만들기 위해 Controller를 추가합니다.
@Controller({ path: 'boards' })
export class BoardsController {
constructor(private boardsService: BoardsService) {}
@Get('/:id')
getBoard(@Param('id', ParseIntPipe) id: number) {
return this.boardsService.getBoardById(id);
}
@Post('/')
createBoard(@Body() createBoardDto: CreateBoardDto) {
return this.boardsService.createBoard(createBoardDto);
}
@Delete('/:id')
removeBoard(@Param('id', ParseIntPipe) id: number) {
return this.boardsService.removeBoard(id);
}
}
만들어진 API를 호출해보도록 하겠습니다. 우선 데이터를 삭제하기 전에 post 요청을 보내 데이터를 몇개 생성했습니다.
생성된 데이터를 지워보면, 오류 없이 잘 지워집니다.
만약, 없는 데이터를 지우려고 하면 데이터 레코드를 찾을 수 없어서 오류가 발생하게 됩니다.
delete()
반대로 delete()를 통해 데이터를 삭제하는 구현을 해보면, 서비스는 아래와 같이 구현할 수 있습니다.
async deleteBoard(id: number) {
await this.boardsRepository.delete(id);
}
remove()와는 다르게 id 값을 지울 수 있습니다. 테스트를 위해 controller에도 라우팅 핸들러를 추가합니다. 기존 핸들러를 주석처리하고 내용만 delete()를 호출하도록 수정했습니다.
@Delete('/:id')
removeBoard(@Param('id', ParseIntPipe) id: number) {
// return this.boardsService.removeBoard(id);
return this.boardsService.deleteBoard(id);
}
다시 삭제하는 API를 호출해보면, 데이터가 잘 지워지고 오류 없이 200 OK로 응답이 옵니다.
만약, 없는 데이터를 삭제하면 어떻게 될까요?
없는 데이터를 삭제해도 오류는 발생하지 않습니다.
remove()와 delete()의 차이
정리하면, remove()와 delete()는 둘 다 데이터를 지울 때 사용하지만, remove()는 없는 데이터를 삭제하려고 할때 오류가 발생합니다. 반대로 delete()는 없는 데이터라고해도 오류가 발생하지 않습니다.
delete()에서도 없는 데이터인지 확인할 수 있는데, this.boardsRepository.delete(id)
를 출력해보면 아래와 같이 응답값이 넘어옵니다.
{
"raw":[],
"affected": 1
}
만약 affected 값이 0보다 크면 데이터가 존재하여 삭제되었다는 뜻이고, 0이면 삭제된 데이터가 없다는 뜻입니다.
'BE > NestJS' 카테고리의 다른 글
NestJS + postgres + typeorm 연동하기 (서버 DB 연결) (0) | 2023.11.21 |
---|---|
NestJS Pipe를 이용하여 데이터 변환 및 검증 (1) | 2023.11.20 |
NestJS에서 서비스(Service) 개념 및 서비스 생성하기 (0) | 2023.11.19 |
NestJS 컨트롤러(Controller) 개념 및 정의하기 (0) | 2023.11.17 |
NestJS의 모듈(module) 개념 및 module 정의하기 (0) | 2023.11.17 |
IT 기술에 대한 글을 주로 작성하고, 일상 내용, 맛집/숙박/제품 리뷰 등 여러가지 주제를작성하는 블로그입니다. 티스토리 커스텀 스킨도 개발하고 있으니 관심있으신분은 Berry Skin을 검색바랍니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!