tRPC 라우터 정의

tRPC 라우터 정의 (Define Routers)

tRPC API의 뼈대는 라우터(router)예요. 라우터를 어떻게 정의하고 초기화 옵션을 어떻게 꾸미는지가 이후의 모든 단계의 토대가 돼요.

출처: https://trpc.io/docs/server/routers

tRPC는 애플리케이션당 정확히 한 번 초기화해야 해요. 인스턴스가 여러 개면 문제가 생기니, 전용 파일에서 딱 한 번 initTRPC.create()를 호출해요.

// server/trpc.ts
import { initTRPC } from '@trpc/server';

const t = initTRPC.create();

export const router = t.router;
export const publicProcedure = t.procedure;

여기서 주목할 점은 t 전체를 export하지 않고 특정 메서드만 export한다는 거예요. 이렇게 하면 코드베이스에서 관용적으로 쓰는 procedure 집합(예: publicProcedure)을 만들어 일관되게 사용할 수 있어요.

그다음 라우터에 procedure를 채워 API 엔드포인트를 만들어요. 엔드포인트를 프론트엔드에 노출하려면 어댑터가 appRouter 인스턴스로 구성되어야 해요.

// server/_app.ts
import { publicProcedure, router } from './trpc';

const appRouter = router({
  greeting: publicProcedure.query(() => 'hello tRPC v11!'),
});

// Export only the type of a router!
export type AppRouter = typeof appRouter;

중첩 서브라우터는 router() 메서드를 쓰거나 평범한 객체로 두 가지로 표현할 수 있어요 — 둘은 동등해요. 서브라우터로 폴더 구조 같은 계층을 만들 수 있죠.

라우터 초기화 시 다음과 같은 것들을 설정할 수 있어요.

  • 요청 컨텍스트(context)
  • procedure에 메타데이터 부여
  • 에러 포맷·처리
  • 데이터 트랜스포머
  • 런타임 구성 커스터마이즈
const t = initTRPC.context<Context>().meta<Meta>().create({
  // transformer, errorFormatter, isDev 등
});

RootConfig 인터페이스에는 transformer, errorFormatter, isDev(개발 환경이면 에러에 스택 트레이스를 포함할지, 기본은 process.env.NODE_ENV !== 'production'), isServer/allowOutsideOfServer 같은 옵션이 있어요.

더 알아보기