Hono
호노 (炎, 불꽃)
Hono는 Edge 런타임에 최적화된 초경량 웹 프레임워크입니다. Cloudflare Workers, Deno, Bun, Node.js 등 다양한 런타임을 지원하며, Express와 유사한 API로 빠른 학습이 가능합니다. 번들 사이즈가 매우 작아 서버리스 환경에 이상적입니다.
호노 (炎, 불꽃)
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 });