tRPC 라우터 정의
tRPC 라우터 정의 (Define Routers)
tRPC API의 뼈대는 라우터(router)예요. 라우터를 어떻게 정의하고 초기화 옵션을 어떻게 꾸미는지가 이후의 모든 단계의 토대가 돼요.
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 같은 옵션이 있어요.
더 알아보기
- 컨텍스트 구성: Context
- 에러 포맷: Error Formatting
- 데이터 트랜스포머: Data Transformers