본문 바로가기
C.W.K.
Stream
Lesson 06 of 07 · published

서버 TypeScript: Node와 Bun에서 실행 경계 세우기

~8 min · frameworks, node, bun, backend

Level 0Curious
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete
"런타임을 고르는 일과 타입 시스템을 고르는 일은 같지 않아."

TypeScript 소스를 실행하는 길

Node에서는 빌드된 JavaScript를 실행하거나 tsx 같은 개발 도구로 TypeScript 소스를 변환해 실행할 수 있어. Bun은 TypeScript 파일을 직접 실행하는 흐름을 제공해. 어느 쪽도 실행 명령만으로 프로젝트 전체 타입 검사가 끝났다고 가정하면 안 돼.

개발 편의와 프로덕션 경로가 다르면 모듈 해석, 소스맵, 환경 변수 로딩 차이를 확인해야 해. 출시 환경에서 실제로 쓰는 명령을 CI와 스테이징에서 반복해.

프레임워크 타입은 입력 검증이 아니다

Express, Fastify, Hono 같은 서버 프레임워크는 요청과 응답에 TypeScript 타입을 연결할 수 있어. 하지만 HTTP 본문과 쿼리는 외부 값이므로 제네릭에 Body를 적는 것만으로 검증되지 않아. 스키마 검증 결과에서 타입이 파생되게 만들면 중복 계약을 줄일 수 있어.

오류 처리 미들웨어와 인증 정보 보강도 프레임워크의 실제 런타임 순서와 타입 선언이 맞아야 해. 전역 선언 보강만 하고 미들웨어를 빠뜨리면 타입에는 있는 값이 실행 중에 사라져.

호환성과 운영으로 선택하기

속도 수치 하나보다 필요한 패키지, 네이티브 모듈, 배포 플랫폼, 디버깅과 관측 도구를 기준으로 런타임을 골라. Node 호환이라는 넓은 표현 대신 애플리케이션의 대표 경로를 직접 시험해.

런타임 전용 API를 얇은 어댑터 뒤에 두면 선택을 바꿀 때 영향이 줄어. 다만 추상화가 실제 교체 가능성을 만들지 못하고 두 런타임의 최소 공통분모만 강요한다면 오히려 복잡해질 수 있어.

Express는 @types/express가 필요하지만 Fastify와 Hono는 자체 타입을 제공해. 새 백엔드 TypeScript에서는 속도와 타입 경험을 중시하면 Bun+Hono를, 기존 생태계 호환성이 중요하면 Node+Express를 기본 선택으로 볼 수 있어.

서버 TypeScript의 안전은 런타임, 타입 검사, 입력 검증이 함께 있을 때 생겨. 셋 중 하나의 성공을 나머지 둘의 증거로 쓰지 마.

Code

최소 Hono + Bun server·typescript
// Hono + Bun — modern 최소 예시.
import { Hono } from 'hono';

const app = new Hono();

app.get('/', (c) => c.text('Hello from Hono'));

app.get('/users/:id', (c) => {
  const id = c.req.param('id');     // id: string — 타입 붙음
  return c.json({ id, name: `User ${id}` });
});

export default app;

// 실행: bun run server.ts
// 또는 Node + tsx: npx tsx server.ts (Hono 가 둘 다 작동)
Express + Node + tsx — 자리잡은 stack·typescript
// Express + Node + tsx — classic stack.
import express, { Request, Response } from 'express';

const app = express();
app.use(express.json());

app.get('/users/:id', (req: Request<{ id: string }>, res: Response) => {
  const { id } = req.params;     // id: string
  res.json({ id, name: `User ${id}` });
});

app.listen(3000);

// 실행: npx tsx server.ts
// 또는 먼저 build: npx tsc && node dist/server.js

External links

Exercise

TypeScript로 hello world HTTP 서버를 두 번 만들어. 한 번은 Bun과 Hono, 한 번은 Node와 tsx와 Express를 사용하고 시작 시간과 타입 사용감을 비교해.
Hint
작은 서버에서는 Bun의 시작 속도가 눈에 띄고 Hono의 API가 더 좁게 느껴질 수 있어. 새 코드의 현대적 기본값과 기존 Express 투자를 유지하는 선택을 둘 다 실제 제약으로 비교해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.