3. NestJS (2)
이번 시간에는 저번 주차에서 배웠던 ‘NestJS’에 대해 추가적으로 알아봅시다.
공부할 내용 📚
NestJS에서는 하나의 요청이 여러 구성 요소를 거쳐 처리됩니다. 아래 그림을 통해 전체적인 요청 처리 흐름을 먼저 살펴보세요.

이번 주에는 이 흐름에서 사용되는 Pipe, Guard, Interceptor, Exception Filter 등의 역할을 공부합니다.
1. 요청 데이터 검증
NestJS가 요청 데이터를 검증하고 변환하는 방법을 공부합니다.
- DTO
- Pipe
ValidationPipeclass-validator- Built-in Pipe (
ParseIntPipe등) - Built-in Exception (
NotFoundException등)
아래 NestJS 공식 문서를 읽어보세요.
- Pipes: Pipe의 역할과 Built-in Pipe,
ValidationPipe사용 방법을 살펴보세요. - Validation: DTO와
class-validator를 이용한 요청 데이터 검증 방법을 살펴보세요. - Exception Filters: Built-in Exception을 중심으로 살펴보세요.
2. Guard와 인증·인가
Guard가 요청을 허용하거나 거부하는 과정을 공부합니다.
- Guard
- Authentication과 Authorization의 차이
아래 NestJS 공식 문서를 읽어보세요.
- Guards: Guard의 역할과 적용 방법을 살펴보세요.
- Authentication: 인증의 개념을 가볍게 살펴보세요.
- Authorization: 인증과 인가의 차이를 중심으로 살펴보세요.
3. NestJS 요청 처리 기능
다음 기능은 각각 어떤 역할을 하는지 가볍게 살펴보세요.
4. Testing
Unit Test, Integration Test, E2E Test의 차이와 Jest의 기본적인 사용 방법을 공부합니다.
- Unit, Integration, E2E Test: 테스트 종류별 차이를 살펴보세요.
- Testing: NestJS에서 Jest를 이용해 Unit Test를 작성하는 방법을 살펴보세요.
프로젝트 실습 🎈
지난주에 구현한 Restaurant CRUD API에 요청 데이터 검증, 예외 처리, Guard와 Unit Test를 추가해봅시다.
데이터베이스는 아직 사용하지 않으며, 기존과 동일하게 식당 데이터를 Service의 배열에 저장합니다.
1. DTO와 Validation
Restaurant 생성과 수정 요청에 사용할 DTO를 작성합니다.
먼저 필요한 패키지를 설치합니다.
pnpm add class-validator class-transformerCreateRestaurantDtoname,address,phone을 필수 값으로 받습니다.
UpdateRestaurantDto- 수정할 값만 전달할 수 있도록 각 필드를 선택적 프로퍼티로 선언합니다.
- 각 필드에
@IsOptional()을 적용합니다.
class-validator를 사용하여 각 필드가 비어 있지 않은 문자열인지 검증합니다.ValidationPipe를 적용하여 올바르지 않은 요청은 거부합니다.
아래 자료를 참고하세요.
2. Pipe와 예외 처리
GET /restaurants/:id,PATCH /restaurants/:id,DELETE /restaurants/:id의id에ParseIntPipe를 적용합니다.- 요청한
id에 해당하는 식당이 없다면NotFoundException을 발생시킵니다.
아래 자료를 참고하세요.
3. Guard
식당 정보를 변경하는 API에 간단한 Guard를 적용합니다.
- 요청 헤더의
x-api-key값을 확인하는 Guard를 작성합니다. - API Key가 올바른 경우에만 다음 API를 사용할 수 있도록 합니다.
POST /restaurantsPATCH /restaurants/:idDELETE /restaurants/:id
- API Key는 환경 변수에 저장하지 않고 실습을 위한 임의의 값으로 설정해도 됩니다.
아래 자료를 참고하세요.
4. Unit Test
Jest를 사용하여 RestaurantsService의 Unit Test를 하나 이상 작성합니다.
다음 항목 중 하나를 선택하여 테스트하세요.
- 전체 식당 목록을 반환하는지
- 새로운 식당이 정상적으로 추가되는지
- 존재하지 않는 식당을 조회했을 때
NotFoundException이 발생하는지
테스트 코드는 restaurants.service.spec.ts에 작성합니다.
5. API 테스트
Bruno를 사용하여 다음 내용을 확인합니다.
- 정상적인 요청이 처리되는지
- 잘못된 Body가
ValidationPipe에 의해 거부되는지 - 숫자가 아닌
id가ParseIntPipe에 의해 거부되는지 - 존재하지 않는 식당을 요청했을 때
NotFoundException이 발생하는지 - API Key가 없거나 올바르지 않을 때 변경 요청이 거부되는지
- 이외에도 추가하고 싶은 부분이 있다면 자유롭게 추가해주세요!