💻 개발/프레임워크
(공식문서) NestJS Pipes와 queryString, Body가 데이터 처리하는 방법
foodev
2025. 2. 18. 13:51
728x90
파이프는 @Injectable() 데코레이터로 주석이 달린 클래스로, PipeTransform 인터페이스를 구현합니다.
관련된 링크 : https://docs.nestjs.com/pipes
🌠 목차
✅ 파이프의 일반적 사례
✅ 파이프 바인딩과 적용
✅ queryString과 body의 데이터 처리 차이점
파이프의 일반적 사례
transfromation: 입력 데이터를 원하는 형식(예: 문자열에서 정수로)으로 변환합니다.
validation: 입력 데이터를 평가하여 유효하면 변경 없이 통과하고, 그렇지 않으며 예외를 던집니다.
두 경우 모두 컨트롤러 경로 핸들러에서 처리 중인 인수에 대해 작동합니다
파이프 작동 방식
- 요청: 클라이언트가 서버로 요청을 보냅니다.
- 파이프 실행: NestJS는 요청 데이터를 파이프에 전달합니다.
- 변환 & 검사: 파이프는 데이터를 변환하고 유효성을 검사합니다.
- 결과 반환: 파이프는 변환되고 검증된 데이터를 컨트롤러에 전달합니다.
- 컨트롤러 실행: 컨트롤러는 파이프가 제공한 데이터를 사용하여 로직을 처리합니다.
파이프는 예외영역에서 실행됩니다.
파이프에서 예외가 발생하면 exception filters에서 처리됩니다
파이프 바인딩과 적용
queryString 에서 Pipe
@Get(':id') async findOne(@Param('id', ParseIntPipe) id: number)
{
return this.catsService.findOne(id);
}
다음과 같은 ParseIntPipe를 사용했다고 가정합니다
그러면 id값은 number이거나 예외를 발생합니다.
GET localhost:3000/개발개맛집이 들어왔다면
typeof(id)의 결과는 string이 됩니다.
이에 따라 예외 필터에 걸려서 아래의 문구를 보게 됩니다.
{
"statusCode": 400,
"message": "Validation failed (numeric string is expected)",
"error": "Bad Request"
}
이렇게 pipe가 예외를 던지는 이유는 findOne() 함수가 실행되지 않도록 함에 있습니다.
body에서 Pipe 적용은?
위에 내용은 쿼리스트링에서 pipe를 적용했습니다.
그렇다면 POST 메소드의 body 값에는 어떻게 적용할 수 있을까요?
아쉽게도 NestJS의 pipe를 이용하여 body 값을 체크할 수 없습니다.
보통 class-decorator를 import 하여 사용하거나 nestia의 typechecking 함수를 이용합니다.
uuId 체크 예시:
import { IsUUID } from 'class-validator';
export interface CreateEventBody {
@IsUUID()
uuid?: string;
prevUrl?: string;
}
queryString과 body의 데이터 처리 차이점
데이터가 도착하는 시점
- 쿼리 스트링: 쿼리 스트링은 URL의 일부로, 요청이 서버에 도착하는 즉시 파싱되어 파이프에 전달됩니다.
- 본문(Body): 본문 데이터는 요청의 내용 부분으로, 서버에 도착한 후 별도의 처리를 거쳐야 파이프에 전달될 수 있습니다.
데이터 처리 방식
- 쿼리 스트링: 쿼리 스트링은 주로 문자열 형태로 전달됩니다. 파이프는 이 문자열을 원하는 타입(숫자, 날짜 등)으로 변환하거나 유효성을 검사합니다.
- 본문(Body): 본문 데이터는 다양한 형식(JSON, XML 등)으로 전달될 수 있습니다. 파이프는 이 데이터를 파싱 하고, 필요한 경우 변환하거나 유효성을 검사합니다.
파이프 적용 시점
- 쿼리 스트링: 쿼리 스트링은 요청과 함께 도착하므로, 파이프가 즉시 적용될 수 있습니다.
- 본문(Body): 본문 데이터는 파싱 과정을 거쳐야 하므로, 파이프는 파싱 후에 적용될 수 있습니다.
글 잼나게 보셨으면 좋아요 눌러주고 가세요
관심받는 거 좋아합니다

728x90