🌐 웹개발

Hono

호노 (炎, 불꽃)

Hono는 Edge 런타임에 최적화된 초경량 웹 프레임워크입니다. Cloudflare Workers, Deno, Bun, Node.js 등 다양한 런타임을 지원하며, Express와 유사한 API로 빠른 학습이 가능합니다. 번들 사이즈가 매우 작아 서버리스 환경에 이상적입니다.

📖 상세 설명

Hono(炎, 일본어로 "불꽃")는 2022년 등장한 TypeScript 기반 초경량 웹 프레임워크입니다. 핵심 라이브러리가 약 12KB(gzip)에 불과하며, Cloudflare Workers의 1MB 제한에서도 여유롭게 동작합니다. Web Standard API(Request, Response)를 기반으로 하여 런타임 간 이식성이 뛰어납니다.

Express와 유사한 라우팅 API를 제공하지만, 내부적으로는 Trie 기반 라우터로 더 빠른 매칭 성능을 보입니다. app.get(), app.post() 같은 익숙한 패턴으로 라우트를 정의하고, c.json(), c.html() 같은 컨텍스트 헬퍼로 응답을 생성합니다. TypeScript 지원이 우수하여 라우트 파라미터와 요청/응답 타입이 자동으로 추론됩니다.

미들웨어 생태계가 풍부합니다. CORS, JWT 인증, 로깅, 캐싱, 압축 등 공식 미들웨어가 제공되며, Express 미들웨어 스타일과 호환됩니다. Zod Validator 미들웨어를 사용하면 요청 본문 검증과 타입 추론을 동시에 처리할 수 있어 타입 안전성이 높아집니다.

멀티 런타임 지원이 핵심 강점입니다. Cloudflare Workers, Deno Deploy, AWS Lambda, Vercel Edge, Bun, Node.js에서 동일한 코드가 실행됩니다. Cloudflare Workers에서는 KV, D1, R2 같은 바인딩에 직접 접근할 수 있고, hono/adapter를 통해 각 플랫폼 특화 기능도 활용됩니다.

💻 코드 예제

import { Hono } from 'hono';
import { cors } from 'hono/cors';
import { jwt } from 'hono/jwt';
import { zValidator } from '@hono/zod-validator';
import { z } from 'zod';

// Hono 앱 생성 (타입 안전한 환경 변수)
type Env = {
  Bindings: {
    DB: D1Database;
    JWT_SECRET: string;
  };
};

const app = new Hono<Env>();

// 미들웨어 적용
app.use('*', cors());
app.use('/api/*', jwt({ secret: (c) => c.env.JWT_SECRET }));

// 기본 라우트
app.get('/', (c) => {
  return c.json({ message: 'Hello, Hono!' });
});

// 파라미터가 있는 라우트 (타입 자동 추론)
app.get('/users/:id', async (c) => {
  const id = c.req.param('id'); // string으로 추론
  const user = await c.env.DB
    .prepare('SELECT * FROM users WHERE id = ?')
    .bind(id)
    .first();

  if (!user) {
    return c.json({ error: 'User not found' }, 404);
  }
  return c.json(user);
});

// Zod 스키마로 요청 검증
const createUserSchema = z.object({
  name: z.string().min(2),
  email: z.string().email(),
});

app.post(
  '/users',
  zValidator('json', createUserSchema),
  async (c) => {
    const body = c.req.valid('json'); // 타입 자동 추론

    const result = await c.env.DB
      .prepare('INSERT INTO users (name, email) VALUES (?, ?)')
      .bind(body.name, body.email)
      .run();

    return c.json({ id: result.lastRowId }, 201);
  }
);

// 그룹 라우팅
const apiRoutes = new Hono<Env>()
  .get('/posts', (c) => c.json([]))
  .post('/posts', (c) => c.json({ created: true }));

app.route('/api', apiRoutes);

// 에러 핸들링
app.onError((err, c) => {
  console.error(err);
  return c.json({ error: 'Internal Server Error' }, 500);
});

// Cloudflare Workers 엔트리포인트
export default app;

// Node.js에서 실행 시
// import { serve } from '@hono/node-server';
// serve(app, { port: 3000 });

🗣️ 실무 대화 예시

👨‍💻 프론트엔드 개발자
"Cloudflare Workers에 간단한 API 서버 올리려는데, Express 쓰기엔 번들이 너무 커지네요. 가벼운 대안 없을까요?"
👩‍💻 풀스택 개발자
"Hono 써보세요. 코어가 12KB밖에 안 되고, Express랑 API가 비슷해서 적응 빨라요. TypeScript 지원도 훌륭하고, Zod 연동하면 요청 검증이랑 타입 추론이 자동으로 돼요. Workers의 D1이나 KV 바인딩도 깔끔하게 사용할 수 있어요."
👨‍💼 기술 면접관
"Hono와 Express의 주요 차이점은 무엇인가요?"
👨‍💻 지원자
"Express는 Node.js 전용이고 req/res 객체를 사용하지만, Hono는 Web Standard Request/Response를 사용해서 Edge 런타임에서도 동작합니다. 번들 크기가 훨씬 작고, TypeScript 지원이 우수하며, 라우터 성능도 더 빠릅니다. 다만 Express의 방대한 생태계에 비하면 미들웨어가 아직 적습니다."

⚠️ 주의사항

🔗 관련 용어

📚 더 배우기