NestJS 이슈: standard schema 호환성

민경찬·2025년 5월 8일
18

백엔드

목록 보기
27/27
post-thumbnail

안녕하세요.
NestJS 백엔드 개발자 민경찬입니다.

오늘은 재밌있는 NestJS 이슈를 소개해드리려고 합니다.

https://github.com/nestjs/nest/issues/14539

🧐 무엇이 문제인가

NestJS 에서 Class-Validator가 아닌 다른 검증 라이브러리를 사용하기 위해서는 누군가 만들어놓은 pipe를 사용하거나 본인이 직접 만들어 사용해야합니다.
nestjs-valibot 처럼요!

무엇을 요구하는가?

그러나 Standard Schema라는 라이브러리가 1.0.0이 나왔어요.

PR에서는 NestJS가 공식적으로 Standard Schema 인터페이스를 만족시키는 Pipe를 지원하는게 어떠냐고 얘기하고 있어요.

그럼 도대체 Stardard Schema라는게 뭘까요?

Standard Schema란?

Standard Schema는 JavaScript와 TypeScript의 다양한 스키마(검증) 라이브러리들이 구현할 수 있도록 설계된 공통 인터페이스입니다.

Typescript 생태계에는 Zod, Yup, Valibot등 다양한 유효성 검증 라이브러리가 존재합니다.
하지만 라이브러리마다 사용하는 방식과 API가 미묘하게 다르죠. 프로젝트 간의 일관성을 유지하기도 어렵고 섞어쓰는 것은 상상할 수도 없죠.

이런 문제를 해결하기 위해 등장한 것이 Standard Schema입니다.
서로 다른 검증 도구들을 하나의 표준 인터페이스로 추상화하여 사용자는 그저 검증 라이브러리를 선택하기만 하면 됩니다.

// 서로 다른 3개의 라이브러리 사용을 보여줌.
import * as z from 'zod';
import * as v from 'valibot';
import {type} from 'arktype';

const zodResult = await standardValidate(z.string(), 'hello');
const valibotResult = await standardValidate(v.string(), 'hello');
const arktypeResult = await standardValidate(type('string'), 'hello');

부착가능한 라이브러리도 라인업도 상당합니다...

https://standardschema.dev

😀 NestJS가 공식적으로 지원하면 뭐가 좋을까?

NestJS는 기본적으로 Class-Validator에 의존하고 있습니다.
그래서 다른 검증 라이브러리를 사용하고 싶을 경우, 직접 Pipe를 구현하거나, 써드파티 라이브러리에 의존해야합니다.

하지만 만약 NestJS가 공식적으로 Standard Schema를 만족하는 Pipe를 제공한다면 더 이상 직접 만들거나 외부 라이브러리를 끌어다 사용하지 않아도 됩니다.

개발자는 그저 어떤 검증 라이브러리를 쓸지만 선택하면됩니다.

😧 메인테이너의 코멘트

3rd party lib로 시작하는게 낫지않나.
Class-Validator가 뭘 해줄 때까지 할 수 있는게 없다.

라는 코멘트가 달렸어요.

Standard Schema에서 지원하는 라이브러리 목록에 Class-Validator는 아직 없습니다...

이미 Class-Validaotr 파이프라인을 제공하는 NestJS 입장에서 Class-Validator가 먼저 움직여주지 않는 상황에서 기능을 추가하기에 부담스러운가 봅니다.

breaking change 에 대한 염려도 표현하고 있죠.

⁉️ 그 외 코멘트

1. class-validator 이거 업데이트 안 하는 것 같은데요

아쉽게도 Class-Validator 라이브러리가 그리 활발하게 업데이트 되고 있지 않은 모양인가 봅니다.

2. 걍 하나 더 만들죠?

딱 생각하기에, Class-ValidatorStandard Schema를 지원하는 라이브러리 사용하는 생김새가 좀 다르다는 것을 알 수 있습니다.

ValidationMetadata에 저장하여 인스턴스화를 거쳐 검증이 가능한 로직 때문에 Standard Schema를 완벽하게 지원하려면 새로운 API가 필요하다고 합니다.

따라서, 현재 존재하는 ValidationPipe는 냅두고 새로이 공식적으로 지원하는 Pipe를 만들자고 얘기하고 있어요.

이미 비슷한 라이브러리가 있고 조금만 수정하면 되는 것 같습니다.

😎 제 의견

요구한 기능 자체는 충분히 매력적이지만, Class-Validator가 먼저 움직이지 않는 이상 NestJS에서 공식적으로 이 기능을 지원할 가능성은 낮아보입니다.

앞서 언급된 "새로 만들자"는 의견처럼, 공식 Pipe가 더 추가 된다면 문서와 코드 등 관리 포인트가 늘어나기 때문에 메인테이너 입장에서 부담스러울 것 같아요.

게다가 나중에 Class-Validator에서 standard schema를 공식 지원하게 된다면, 새로 만든 Pipe는 애매한 포지션이 될 겁니다.

이런 상황에서 NestJS 메인테이너가 core에 새로운 Pipe를 추가할 가능성은 낮다고 생각해요. 특히 카밀이라면... 더더욱 신중하게 접근하지 않을까 싶습니다.

결론

NestJS는 이슈 관리가 꽤 엄격한 편입니다.
타 레포에 비하면 동향 파악하기가 정말 수월한 편입니다.
그래서 저는 주기적으로 이슈와 PR, Release Note를 읽습니다.

와중에, 흥미로운 NestJS 이슈거리가 있어 가져와봤습니다.
Standard Schema라는 라이브러리가 새롭게 출시된 것도 처음 알았고 Class-Validator 업데이트가 그리 활발하지 않다는 것도 처음 알았네요.

여러분들의 의견도 들어보고 싶습니다.

읽어주셔서 감사합니다.

1개의 댓글

comment-user-thumbnail
2025년 5월 14일

오홍홍 조와용

답글 달기