user.entity.ts
@OneToMany((type) => Board, (board) => board.user, { eager: true })
boards: Board[];
board.entity.ts
@ManyToOne((type) => User, (user) => user.boards, { eager: false })
user: User;
type
:type => Board
관계를 형성하려는 테이블inverseSide
:(board) => board.user
board에서 유저로 접근하려면 board.user로 접근해야함Option
:{ eager: true }
user
정보를 가져올때board
도 같이 가져옴
UseGuards(AuthGuard())
@GetUser() user: User
board.controller.ts
@Post()
@UsePipes(ValidationPipe)
createBoard(
@Body() createBoardDto: CreateBoardDto,
@GetUser() user: User, // 추가
): Promise<Board> {
return this.boardsService.createBoard(createBoardDto, user); // 추가
}
board.service.ts
createBoard(createBoardDto: CreateBoardDto, user: User): Promise<Board> {
return this.boardRepository.createBoard(createBoardDto, user);
}
board.repository.ts
@CustomRepository(Board)
export class BoardRepository extends Repository<Board> {
async createBoard(
createBoardDto: CreateBoardDto,
user: User, // 추가
): Promise<Board> {
const { title, description } = createBoardDto;
const board = this.create({
title,
description,
status: BoardStatus.PUBLIC,
user, // 추가
});
await this.save(board);
return board;
}
}
결과
board.controller.ts
@Get()
getAllBoards(
@GetUser() user: User, // 추가, user 정보를 줌
): Promise<Board[]> {
return this.boardsService.getAllBoards(user);
}
@GetUser() user: User,
: user 정보를 줌board.service.ts
참고사이트
async getAllBoards(user: User): Promise<Board[]> {
const query = await this.boardRepository
.createQueryBuilder('board')
.where('board.userId = :userId', { userId: user.id });
const boards = await query.getMany();
return boards;
}
.createQueryBuilder('board')
: board 테이블에 접근.where('board.userId = :userId', { userId: user.id });
board
테이블의 userId
user
테이블의 id
query.getMany()
: 해당 id의 전체 게시물을 가져옴query.getOne()
: 해당 id의 게시물을 하나만 가져옴결과
board.controller.ts
@Delete('/:id')
deleteBoard(
@GetUser() user: User, // 추가
@Param('id', ParseIntPipe) id: number,
): Promise<void> {
return this.boardsService.deleteBoard(id, user); // 추가
}
@GetUser() user: User,
: user 정보를 줌board.service.ts
참고사이트
async deleteBoard(id: number, user: User): Promise<void> {
const result = await this.boardRepository
.createQueryBuilder('board')
.delete()
.from(Board)
.where('userId = :userId', { userId: user.id })
.andWhere('id = :id', { id: id })
.execute();
if (!result.affected) {
throw new NotFoundException(`Can't find Board with id ${id}`);
}
}
결과 ======> 다른 유저가 게시물을 삭제하려 했을 때
Repository API와 Query Builder
간단한 CRUD는Repository API
로, 복잡한 조건이 있는 경우는Query Builder
로 구현한다.