미들웨어와 컨텍스트
프로시저에 인증과 공유 컨텍스트를 추가합니다.
미들웨어와 컨텍스트은(는) CoddyKit의 무료 TypeScript Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 TypeScript Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
컨텍스트란 무엇인가요
모든 tRPC 요청에는 컨텍스트가 포함됩니다. 컨텍스트는 데이터베이스 클라이언트, 요청, 현재 사용자처럼 모든 절차에서 사용할 수 있는 공유 데이터입니다. createContext 함수로 요청마다 한 번씩 만듭니다.
export async function createContext({ req }: { req: Request }) {
const token = req.headers.get('authorization');
const user = await getUserFromToken(token);
return { user };
}컨텍스트 유형 지정하기
tRPC는 createContext에서 컨텍스트 유형을 추론하고 이를 모든 절차에 전달합니다. 해당 컨텍스트 유형으로 인스턴스를 초기화하면 리졸버에서 ctx의 유형이 올바르게 지정됩니다.
import { initTRPC } from '@trpc/server';
type Context = Awaited<ReturnType<typeof createContext>>;
const t = initTRPC.context<Context>().create();리졸버에서 ctx 읽기
모든 절차 내부에서는 컨텍스트를 유형이 완전히 지정된 ctx로 사용할 수 있습니다. 여기서는 절차가 컨텍스트에서 현재 사용자를 읽습니다.
const me = t.procedure.query(({ ctx }) => {
// ctx.user is typed from createContext
return ctx.user;
});middleware란 무엇인가요
middleware는 절차 리졸버 전에 실행됩니다. 권한을 확인하거나 log를 남기거나 컨텍스트를 수정할 수 있습니다. 계속 진행하려면 next()를 호출하고, 요청을 거부하려면 예외를 발생시킵니다.
const logger = t.middleware(async ({ path, next }) => {
console.log('calling', path);
return next();
});인증 middleware
일반적인 middleware는 인증을 강제합니다. 컨텍스트에 사용자가 없으면 UNAUTHORIZED 오류를 발생시키고, 사용자가 있으면 리졸버로 계속 진행합니다.
import { TRPCError } from '@trpc/server';
const isAuthed = t.middleware(({ ctx, next }) => {
if (!ctx.user) {
throw new TRPCError({ code: 'UNAUTHORIZED' });
}
return next();
});next를 사용한 컨텍스트 범위 좁히기
middleware는 새로운 ctx를 next에 전달해 컨텍스트 유형을 더 구체화할 수 있습니다. 인증 확인이 끝나면 사용자가 반드시 존재하므로 user의 유형을 null일 수 있는 유형에서 null이 아닌 유형으로 좁힙니다.
const isAuthed = t.middleware(({ ctx, next }) => {
if (!ctx.user) throw new TRPCError({ code: 'UNAUTHORIZED' });
return next({ ctx: { user: ctx.user } }); // user now non-null
});보호된 절차 만들기
.use로 middleware를 연결해 재사용 가능한 보호된 절차를 만듭니다. 이 절차를 기반으로 만든 모든 절차는 인증을 요구하며 null이 아닌 사용자를 볼 수 있습니다.
export const protectedProcedure = t.procedure.use(isAuthed);
const secret = protectedProcedure.query(({ ctx }) => {
return 'Hello ' + ctx.user.name; // user is guaranteed
});공개 절차와 보호된 절차
이제 두 가지 구성 요소를 사용할 수 있습니다. 공개 엔드포인트에는 publicProcedure를, 인증된 엔드포인트에는 protectedProcedure를 사용합니다. 올바른 기반을 선택하면 유형 수준과 런타임 수준에서 접근을 문서화하고 강제할 수 있습니다.
const ping = publicProcedure.query(() => 'pong');
const account = protectedProcedure.query(({ ctx }) => ctx.user);유형이 지정된 ctx 전파
범위가 좁혀진 컨텍스트는 계속 전달됩니다. protectedProcedure가 ctx.user를 반드시 존재하는 값으로 보장하므로 이를 기반으로 만든 모든 리졸버는 다시 확인하지 않아도 null이 아닌 유형을 받습니다. middleware가 불변 조건을 한 번만 표현합니다.
// In any protectedProcedure resolver:
// ctx.user is User, not User | nullmiddleware 조합하기
middleware는 .use를 연결해 조합합니다. 로그 기록, 인증, 역할 확인을 차례로 적용할 수 있습니다. 각 middleware는 순서대로 실행되며 다음 middleware를 위해 컨텍스트를 더 구체화할 수 있습니다.
const adminProcedure = protectedProcedure.use(({ ctx, next }) => {
if (ctx.user.role !== 'admin') {
throw new TRPCError({ code: 'FORBIDDEN' });
}
return next();
});전체 그림
컨텍스트는 요청별 데이터를 제공하고, middleware는 이를 보호하고 구체화하며, 특화된 절차는 이러한 보장을 내장합니다. 입력 스키마 및 유형이 지정된 클라이언트와 결합하면 런타임에서 및 컴파일 시점에, 처음부터 끝까지 안전한 API를 얻을 수 있습니다.
// createContext -> ctx
// middleware -> auth + narrowing
// protectedProcedure -> guaranteed ctx.user
// typed client -> end-to-end safety빠른 확인
컨텍스트와 middleware에 대한 이해도를 확인해 보세요.
복습
컨텍스트와 middleware로 tRPC API를 보호했습니다.
createContext는 요청마다 공유되는 데이터를 만들며,initTRPC.context를 통해 유형이 지정됩니다.- middleware는 리졸버 전에 실행되어 컨텍스트를 보호하고 구체화합니다.
ctx를next에 전달하면 해당 유형의 범위가 좁아집니다.protectedProcedure가 인증을 내장하므로 리졸버는 null이 아닌 사용자를 받습니다.
종단 간 유형 안전성 과정을 모두 마쳤습니다.
자주 묻는 질문
“미들웨어와 컨텍스트” 강의는 무료인가요?
네 — “미들웨어와 컨텍스트” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 TypeScript Academy 강의 전체를 잠금 해제할 수 있습니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“미들웨어와 컨텍스트”에서 뭘 배우나요?
프로시저에 인증과 공유 컨텍스트를 추가합니다. 브라우저에서 직접 실행하는 실습 코드로 TypeScript Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
TypeScript Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 TypeScript Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“미들웨어와 컨텍스트” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 TypeScript Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 TypeScript Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- tRPC 아키텍처
- 라우터와 프로시저 정의
- 클라이언트-서버 타입 추론
- 미들웨어와 컨텍스트