🌐웹개발

ElysiaJS

일라이시아

Bun 기반 TypeScript 웹 프레임워크. 엔드투엔드 타입 안전.

📖상세 설명

ElysiaJS는 Bun 런타임에 최적화된 TypeScript 웹 프레임워크입니다. 2023년 출시된 신생 프레임워크지만, 엔드투엔드 타입 안전성과 뛰어난 성능으로 빠르게 성장하고 있습니다. Express.js 대비 18배, Fastify 대비 3배 빠른 벤치마크 결과를 보여줍니다.

핵심 기능은 'Eden Treaty'라는 클라이언트 생성기입니다. 서버에서 정의한 API 스키마를 기반으로 타입이 완벽히 추론되는 클라이언트 SDK를 자동 생성합니다. OpenAPI/Swagger 문서도 별도 설정 없이 자동 생성되어 API 문서화 부담이 크게 줄어듭니다.

ElysiaJS는 플러그인 시스템이 강력합니다. JWT 인증, CORS, 정적 파일 서빙, WebSocket, GraphQL 등 다양한 공식 플러그인이 있으며, 플러그인을 체이닝하면 타입 추론도 함께 확장됩니다. 이는 Express의 미들웨어와 비슷하지만 타입 안전성 면에서 훨씬 우수합니다.

다만 Bun 런타임에 종속되어 있어 Node.js 환경에서는 사용할 수 없고, 생태계가 Express나 Fastify에 비해 작습니다. 프로덕션 검증 사례도 아직 많지 않아 새 프로젝트나 개인 프로젝트에서 시작해보는 것을 권장합니다.

💻코드 예제

// ElysiaJS 서버 및 Eden Treaty 클라이언트
import { Elysia, t } from 'elysia';
import { swagger } from '@elysiajs/swagger';
import { jwt } from '@elysiajs/jwt';

// 서버 정의
const app = new Elysia()
  .use(swagger())
  .use(jwt({ name: 'jwt', secret: process.env.JWT_SECRET! }))

  // 사용자 라우트 그룹
  .group('/users', (app) =>
    app
      .post('/signup', async ({ body, jwt }) => {
        const token = await jwt.sign({ email: body.email });
        return { token };
      }, {
        body: t.Object({
          email: t.String({ format: 'email' }),
          password: t.String({ minLength: 8 })
        }),
        response: t.Object({ token: t.String() })
      })

      .get('/:id', ({ params }) => {
        return { id: params.id, name: 'User Name' };
      }, {
        params: t.Object({ id: t.Numeric() }),
        response: t.Object({ id: t.Number(), name: t.String() })
      })
  )
  .listen(3000);

// 타입 내보내기 (클라이언트에서 사용)
export type App = typeof app;

// ─────────────────────────────────────────
// 클라이언트 (Eden Treaty)
import { treaty } from '@elysiajs/eden';
import type { App } from './server';

const client = treaty<App>('localhost:3000');

// 완벽한 타입 추론!
const { data, error } = await client.users.signup.post({
  email: 'user@example.com',
  password: 'securepassword123'
});
// data.token → string 타입으로 추론됨

const user = await client.users({ id: 1 }).get();
// user.data.name → string 타입으로 추론됨

🗣️실무 대화 예시

💼기술 스택 선정 회의에서

"새 마이크로서비스는 ElysiaJS로 해볼까요? Bun이 1.0 나온 지 얼마 안 됐지만 성능이 정말 좋고, Eden Treaty로 프론트엔드 타입 연동이 자동이라 tRPC처럼 쓸 수 있어요. 리스크는 있지만 작은 서비스부터 시험해볼 만합니다."

🎯기술 면접에서

"면접관: ElysiaJS의 장점은 무엇인가요?

지원자: 세 가지입니다. 첫째, Bun 네이티브라 벤치마크 기준 초당 270만 요청 처리가 가능합니다. 둘째, Eden Treaty로 서버 타입이 클라이언트까지 자동 전파되어 API 계약 불일치를 컴파일 타임에 잡습니다. 셋째, OpenAPI 문서가 자동 생성됩니다."

🔍코드 리뷰에서

"body 스키마에 t.Object 정의할 때 optional 필드는 t.Optional()로 감싸주세요. 그래야 클라이언트에서도 해당 필드가 optional로 추론됩니다. 지금은 required로 잡혀서 프론트에서 항상 값을 넣어야 해요."

⚠️주의사항

🔗관련 용어

📚더 배우기