링크 & 요청 배칭
비공식 베타 번역
이 페이지는 PageTurner AI로 번역되었습니다(베타). 프로젝트 공식 승인을 받지 않았습니다. 오류를 발견하셨나요? 문제 신고 →
urql의 exchanges나 Apollo의 links와 유사합니다. 링크는 tRPC 클라이언트와 tRPC 서버 간의 데이터 흐름을 커스터마이징할 수 있게 해줍니다.
요청 배칭
요청 배칭은 자동으로 활성화되어 서버로의 요청을 일괄 처리합니다. 이로 인해 아래 코드가 정확히 하나의 HTTP 요청을 생성하고 서버에서 정확히 하나의 데이터베이스 쿼리를 실행할 수 있습니다:
ts// below will be done in the same request when batching is enabledconst somePosts = await Promise.all([client.query('post.byId', 1),client.query('post.byId', 2),client.query('post.byId', 3),]);
ts// below will be done in the same request when batching is enabledconst somePosts = await Promise.all([client.query('post.byId', 1),client.query('post.byId', 2),client.query('post.byId', 3),]);
데이터 흐름 커스터마이징
아래 예제들은 Next.js를 사용한다고 가정하지만, 일반 tRPC 클라이언트를 사용할 때도 동일하게 적용할 수 있습니다.
최대 배치 크기 설정
이 설정은 일괄 처리로 함께 전송될 수 있는 요청 수를 제한합니다(URL이 너무 길어져 HTTP 413 오류가 발생하는 것을 방지하는 데 유용합니다).
server.tsts// 👇 import the httpBatchLinkimport { httpBatchLink } from '@trpc/client/links/httpBatchLink';import { withTRPC } from '@trpc/next';import { AppType } from 'next/dist/shared/lib/utils';import type { AppRouter } from 'pages/api/trpc/[trpc]';const MyApp: AppType = ({ Component, pageProps }) => {return <Component {...pageProps} />;};export default withTRPC<AppRouter>({config() {return {links: [httpBatchLink({url: '/api/trpc',maxBatchSize: 10, // a reasonable size}),],};},})(MyApp);
server.tsts// 👇 import the httpBatchLinkimport { httpBatchLink } from '@trpc/client/links/httpBatchLink';import { withTRPC } from '@trpc/next';import { AppType } from 'next/dist/shared/lib/utils';import type { AppRouter } from 'pages/api/trpc/[trpc]';const MyApp: AppType = ({ Component, pageProps }) => {return <Component {...pageProps} />;};export default withTRPC<AppRouter>({config() {return {links: [httpBatchLink({url: '/api/trpc',maxBatchSize: 10, // a reasonable size}),],};},})(MyApp);
요청 배칭 비활성화
1. 서버에서 batching 비활성화:
[trpc].ts 파일에서:
pages/api/trpc/[trpc].tstsexport default trpcNext.createNextApiHandler({// [...]// 👇 disable batchingbatching: {enabled: false,},});
pages/api/trpc/[trpc].tstsexport default trpcNext.createNextApiHandler({// [...]// 👇 disable batchingbatching: {enabled: false,},});
2. tRPC 클라이언트에서 배치 없는 링크 사용
pages/_app.tsxtsx// 👇 import the httpLinkimport { httpLink } from '@trpc/client/links/httpLink';import { withTRPC } from '@trpc/next';import { AppType } from 'next/dist/shared/lib/utils';import type { AppRouter } from 'pages/api/trpc/[trpc]';const MyApp: AppType = ({ Component, pageProps }) => {return <Component {...pageProps} />;};export default withTRPC<AppRouter>({config() {return {links: [httpLink({url: '/api/trpc',}),],};},// ssr: false,})(MyApp);
pages/_app.tsxtsx// 👇 import the httpLinkimport { httpLink } from '@trpc/client/links/httpLink';import { withTRPC } from '@trpc/next';import { AppType } from 'next/dist/shared/lib/utils';import type { AppRouter } from 'pages/api/trpc/[trpc]';const MyApp: AppType = ({ Component, pageProps }) => {return <Component {...pageProps} />;};export default withTRPC<AppRouter>({config() {return {links: [httpLink({url: '/api/trpc',}),],};},// ssr: false,})(MyApp);
splitLink를 사용하여 요청 흐름 제어
특정 요청에 대해 배칭 비활성화
1. 클라이언트 / _app.tsx 설정
pages/_app.tsxtsximport { httpBatchLink } from '@trpc/client/links/httpBatchLink';import { httpLink } from '@trpc/client/links/httpLink';import { splitLink } from '@trpc/client/links/splitLink';import { withTRPC } from '@trpc/next';// [..]export default withTRPC<AppRouter>({config() {const url = `http://localhost:3000`;return {links: [splitLink({condition(op) {// check for context property `skipBatch`return op.context.skipBatch === true;},// when condition is true, use normal requesttrue: httpLink({url,}),// when condition is false, use batchingfalse: httpBatchLink({url,}),}),],};},})(MyApp);
pages/_app.tsxtsximport { httpBatchLink } from '@trpc/client/links/httpBatchLink';import { httpLink } from '@trpc/client/links/httpLink';import { splitLink } from '@trpc/client/links/splitLink';import { withTRPC } from '@trpc/next';// [..]export default withTRPC<AppRouter>({config() {const url = `http://localhost:3000`;return {links: [splitLink({condition(op) {// check for context property `skipBatch`return op.context.skipBatch === true;},// when condition is true, use normal requesttrue: httpLink({url,}),// when condition is false, use batchingfalse: httpBatchLink({url,}),}),],};},})(MyApp);
2. 배칭 없이 요청 수행
MyComponent.tsxtsxexport function MyComponent() {const postsQuery = trpc.useQuery(['posts'], {context: {skipBatch: true,},});return (<pre>{JSON.stringify(postsQuery.data ?? null, null, 4)}</pre>)})
MyComponent.tsxtsxexport function MyComponent() {const postsQuery = trpc.useQuery(['posts'], {context: {skipBatch: true,},});return (<pre>{JSON.stringify(postsQuery.data ?? null, null, 4)}</pre>)})
또는:
client.tstsconst postResult = client.query('posts', null, {context: {skipBatch: true,},});
client.tstsconst postResult = client.query('posts', null, {context: {skipBatch: true,},});
사용자 정의 링크 생성
pages/_app.tsxtsximport { TRPCLink } from '@trpc/client';import type { AppRouter } from 'pages/api/trpc/[trpc]';const customLink: TRPCLink<AppRouter> = (runtime) => {// here we just got initialized in the app - this happens once per app// useful for storing cache for instancereturn ({ prev, next, op }) => {// this is when passing the result to the next linknext(op, (result) => {// this is when we've gotten result from the serverif (result instanceof Error) {// maybe send to bugsnag?}prev(result);});};};export default withTRPC<AppRouter>({config() {return {links: [customLink,// [..]// ❗ Make sure to end with a `httpBatchLink` or `httpLink`],};},// ssr: false})(MyApp);
pages/_app.tsxtsximport { TRPCLink } from '@trpc/client';import type { AppRouter } from 'pages/api/trpc/[trpc]';const customLink: TRPCLink<AppRouter> = (runtime) => {// here we just got initialized in the app - this happens once per app// useful for storing cache for instancereturn ({ prev, next, op }) => {// this is when passing the result to the next linknext(op, (result) => {// this is when we've gotten result from the serverif (result instanceof Error) {// maybe send to bugsnag?}prev(result);});};};export default withTRPC<AppRouter>({config() {return {links: [customLink,// [..]// ❗ Make sure to end with a `httpBatchLink` or `httpLink`],};},// ssr: false})(MyApp);