4P by asheswook 7시간전 | ★ favorite | 댓글 1개

안녕하세요.

일반적으로 Typescript 백엔드를 개발하다보면 오류가 많이 발생하는 지점은 컴파일 타임에서 잡히지 않는 런타임 부분이라는 걸 아실겁니다.

이를테면 DB row를 파싱하는 레포지토리 구현체 또는 외부 API 통신 부분에서 제일 많이 발생합니다.

DB에서 받아온 값이 예상과 달라 런타임에서 undefined로 값이 주입되거나, 캐스팅을 할 때 외부에서 온 원시 값을 제대로 파악하지 못해 휴먼 에러가 발생하는 부분들입니다.

레포지토리를 구현할 때에도 interface로 외부에서 오는 원시 값에 대한 타입을 덕지덕지 적어야 하는데요. 어쩌면 사소한 문제일 수 있지만 편하게 사용하려고 만들었습니다.

실제로 외부 API 부분과 DB 구현체 코드가 훨씬 간결해졌고, 런타임에서 발생하는 오류도 줄어들었습니다.

팀에서 백엔드에 사용해보다가 괜찮은 것 같아 npm에 배포하였습니다.

import { validate } from 'valdex';  
  
const data: unknown = await fetchData();  
  
validate(data, {  
  name: String,  
  age: Number,  
  active: Boolean  
});  
  
// TypeScript now knows the exact type of data  
data.name // string  
data.age // number  
data.active // boolean  

위 예시는 외부에서 데이터를 가져오는 상황을 가정합니다. axios를 쓰든, mysql2를 쓰든, postgres pg를 쓰든 적용 가능합니다. unknown 타입으로 들어온 값에 대한 검증을 진행하고 올바르다면 이후 제어 흐름에서 해당 값은 validate() 에서 정의한 값으로 단언 (asserts) 됩니다.

물론 zod 같은 라이브러리를 사용할 수도 있습니다.

zod와 valdex가 다른 점은, valdex는 스키마를 인스턴스로 만들어서 사용하지 않고, 데이터를 받아오는 곳 안에서 선언적으로 데이터 타입을 다룰 수 있다는 겁니다. 인터페이스를 수정하려고, DTO 클래스를 수정하려고 위 아래를 왔다갔다 하며 코드를 수정하지 않아도 됩니다.

npm i valdex  

npm에서 설치하고 사용해볼 수 있습니다.

Github: https://github.com/asheswook/valdex

간단한 타입에 한해서는 굉장히 좋은 DX를 발휘할 듯 싶네요 캬