Cats모듈에 있는 내용을 App모듈에서 사용하려면 먼저 Cats모듈에 있는 Service를 exports배열에 추가해줘야 한다.
exports배열에 추가된 Cats모듈의 서비스는 App.module에서 imports에 CatsModule이 추가되어 있으므로 App모듈에서 사용이 가능하다.
Nest.js의 공식문서엔 nest의 미들웨어는 express의 미들웨어와 같다고 나와있다. 미들웨어를 사용하려면
npx @nestjs/cli generate middleware logger
forRoutes()의 경로를 설정해주면 원하는 경로에만 미들웨어 적용이 가능하다.
Nest.js의 공식문서엔 ExceptionFilter에 대한 내용이 나와있다.
HttpExceptionFilter은 HttpException유형의 예외만 처리한다.
처리된 에러는 정의된 방식으로 응답되지만, 404와 같은 예외처리는 Nest.js 자체에서 Json형식으로 설정되어 있으므로
개발자가 직접 예외처리를 하는 경우 전달받는 error의 타입을 분기처리하여 일관된 에러메시지를 전달할 수 있다.
ExceptionFilter를 일부 라우터에만 적용하려면 메서드 아래에 데코레이터를 사용하여 추가할 수 있다.
ExceptionFilter를 컨트롤러 아래에 있는 모든 라우터에 적용하려면 @Controller 아래에 데코레이터를 사용하여 추가할 수 있다.
ExceptionFilter를 App 전역에 적용하려면 main.ts에 useGlobalFilters를 사용하여 적용할 수 있다.
NestJS에서의 pipes는 데이터를 처리하고 검증하는 메커니즘으로 사용된다.
특히, pipes는 라우터 핸들러로 데이터가 전달되기 전에 실행된다.
주로 데이터 변환 또는 유효성 검사와 같은 작업에 사용됩니다.
데이터 변환: Pipes는 클라이언트로부터 받은 데이터를 서버에서 사용하기 원하는 형식으로 변환하는 데 사용될 수 있다. 위의 예시를 들자면 ':id'의 경우 주로 숫자로 사용되기 때문에 pipe를 사용하여 문자열 형식의 데이터를 숫자 형식으로 변환했다.
1-1. pipes 적용 전
1-2. pipes 적용 후
유효성 검사: Pipes를 사용하여 받은 데이터가 원하는 조건을 충족하는지 확인할 수 있습니다. 유효하지 않은 데이터가 포착되면 클라이언트에게 오류 응답을 보낼 수 있습니다.
2-1. pipes를 통해 param의 type을 number으로 타이핑 후 ":id"에 문자열을 추가해 요청을 보냈더니 Validation error가 출력되는 모습
중앙 집중식 유효성 검사: 모든 유효성 검사 로직을 한 곳에서 관리할 수 있으므로 코드의 재사용성과 유지 관리성이 향상됩니다.
코드 정리: 데이터 변환과 유효성 검사를 라우터 핸들러에서 분리하면 라우터 핸들러 코드가 더욱 깔끔하고 직관적으로 보입니다.
확장성: 사용자 정의 pipes를 생성하여 비즈니스 로직에 맞게 데이터 처리를 확장할 수 있습니다.
자동화: class-validator 및 class-transformer와 같은 라이브러리와 함께 사용하여 유효성 검사와 변환을 자동화할 수 있습니다.
':id'의 경우 일반적으로 양수가 입력돼야 하므로 ParseIntPipe 외에 양수만 입력받을 수 있는 Pipe를 만들었다.
PositiveIntPipe를 장착한 결과 "http://localhost:8000/cats/-1" 으로 요청을 보냈더니 PositiveIntPipe에서 설정한 오류메시지가 출력되는것을 확인할 수 있었다.