import {
Body,
Controller,
Delete,
Get,
Param,
Post,
ParseIntPipe,
} from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
import { User } from './user.entity';
import { UsersService } from './users.service';
@Controller('users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Post()
create(@Body() createUserDto: CreateUserDto): Promise<User> {
return this.usersService.create(createUserDto);
}
@Get()
findAll(): Promise<User[]> {
return this.usersService.findAll();
}
@Get(':id')
findOne(@Param('id', ParseIntPipe) id: number): Promise<User> {
return this.usersService.findOne(id);
}
@Delete(':id')
remove(@Param('id') id: string): Promise<void> {
return this.usersService.remove(id);
}
}
다음 provider를 모듈에 등록하면 기대하는 것은
1. POST /users로 Dto 전달하면 서비스 단에서 entity 형태로 데이터 추가
2. GET /users 요청 시, findAll() 호출
3. GET /users/:id 매개변수 포함 요청 시, 정수로 변환하여 findOne(id) 호출
(DELETE /users/:id 생략)
그런데 이상하게 1, 3은 정상 동작하는데 2만 빈 배열 []을 반환하는 현상이 문제였다.
Cats 모듈 내에 두 모듈 간 호환성 문제를 야기하는 무언가가 존재한다는 결론
서로 다른 모듈을 불러오며 라우팅 매핑이 부분적으로 망가지는 경우를 마주했다. 보통 0 또는 1처럼 아예 안 되는 경우가 보편적인데, 프레임워크를 처음 익혀나가는 입장에서 부분적으로 안 되니, 원인 파악이 안 되어 좀 당황했던 것 같다. 이런 상황을 겪을 때면 테스트 기반으로 작업하며, 코드 커밋 전에 검증 단계가 탄탄해야 한다고 생각이 든다.
NestJS 측 샘플 코드의 Mocking된 controller.spec은 DB와의 의존성을 분리했다는 측면에서 좋은 테스트라고 생각하긴 한다. 그렇다면 e2e 테스트를 추가해서 DB가 연결되었을 때에도 정상적으로 동작하는지 확인하는 테스트를 만든다면 이러한 문제를 좀 더 빠르게 확인할 수 있지 않을까 싶다.