LUMOS vs Codama: Solana의 스키마 생성 도구 이해
Source: Dev.to

Solana에서 개발 중이신가요? 이런 생각을 해보셨을 겁니다:
“LUMOS와 Codama 중 어느 것을 사용해야 할까요?”
답변: 두 가지 모두. 서로 보완 관계이며 경쟁 관계가 아닙니다.
TL;DR
| Tool | What it does | When you use it |
|---|---|---|
| LUMOS | 데이터 스키마 정의 → Rust + TypeScript 코드 생성 (배포 전) | 온‑체인 프로그램을 작성할 때 |
| Codama | 기존 프로그램 파싱 → 클라이언트 SDK 생성 (배포 후) | 프로그램을 배포한 후 |
이들은 서로 다른 계층에서 작동하며 함께 사용할 수 있습니다.
각 도구가 적용되는 위치
┌─────────────────────────────────────────────────────────────┐
│ YOUR SOLANA PROGRAM │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ┌──────────────────┐ │ │
│ │ │ Account Data │ ◄── LUMOS generates this │ │
│ │ │ (structs/enums)│ (data‑structure code) │ │
│ │ └──────────────────┘ │ │
│ │ │ │
│ │ ┌──────────────────┐ │ │
│ │ │ Instructions │ (you write this manually │ │
│ │ │ (program logic) │ or with Anchor) │ │
│ │ └──────────────────┘ │ │
│ │ │ │
│ └────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
▲
│ Codama parses program
│ and generates...
▼
┌─────────────────────────────────────────────────────────────┐
│ CLIENTS │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ JS │ │ Rust │ │ Python │ │ Dart │ │
│ │ Client │ │ Client │ │ Client │ │ Client │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
│ │
│ ◄── Codama generates these (SDK code to interact) │
└─────────────────────────────────────────────────────────────┘
핵심 인사이트:
LUMOS는 프로그램 내부에 존재하는 코드를 생성합니다.
Codama는 프로그램 외부에 존재하는 코드를 생성하여, 프로그램과 상호작용할 수 있게 합니다.
Codama란?
Codama은 Solana 프로그램의 표준화된 설명을 생성하는 코드‑생성 프레임워크이며, Codama IDL을 중심으로 합니다.
핵심 워크플로우
Existing Program → Parse → Codama IDL → Generate Clients
or
Anchor IDL → Convert → Codama IDL → Generate Clients
Codama가 하는 일
- 기존 Solana 프로그램 또는 Anchor IDL 파일을 파싱
- 60개 이상의 노드 타입을 가진 통합 IDL 표현을 생성
- 여러 언어(JS, Rust, Python, Dart)로 클라이언트 SDK 생성
- 프로그램 인터페이스에 대한 문서와 도구 제공
주요 사용 사례: “배포된 Solana 프로그램이 있는데, 이제 클라이언트 라이브러리가 필요합니다.”
LUMOS란?
LUMOS는 Rust와 TypeScript 전반에 걸쳐 보장된 타입 안전성을 제공하는 스키마‑우선 DSL로, 데이터 구조를 정의합니다.
핵심 워크플로우
.lumos Schema → Parse → IR → Generate Rust + TypeScript
LUMOS가 하는 일
- 깨끗하고 Rust와 유사한 문법으로 데이터 구조를 정의할 수 있습니다
- 적절한 Borsh 직렬화를 갖춘 Rust structs를 생성합니다
- 일치하는 Borsh 스키마를 가진 TypeScript interfaces를 생성합니다
- 온‑체인 코드와 오프‑체인 코드 간의 타입 안전성을 보장합니다
#[account]속성을 통해 Anchor 통합을 지원합니다
주요 사용 사례: “데이터 타입에 대한 단일 진실의 원천을 원합니다.”
주요 차이점
1. 워크플로우 방향
| 항목 | LUMOS | Codama |
|---|---|---|
| 방향 | 전방 (스키마 → 코드) | 역방향 (프로그램 → 클라이언트) |
| 입력 | .lumos 스키마 파일 | 기존 프로그램 또는 Anchor IDL |
| 단계 | 배포 전 | 배포 후 |
2. 생성 내용
LUMOS – 데이터 구조 코드 (프로그램 내부에 들어감)
// Input: schema.lumos
#[solana]
#[account]
struct PlayerAccount {
wallet: PublicKey,
level: u16,
experience: u64,
}
// Output: generated.rs (included in your program)
use anchor_lang::prelude::*;
#[account]
pub struct PlayerAccount {
pub wallet: Pubkey,
pub level: u16,
pub experience: u64,
}
Codama – 클라이언트 SDK 코드 (프로그램을 외부에서 호출)
// Example: TypeScript client generated by Codama
await program.methods
.createPlayer()
.accounts({
player: playerPda,
authority: wallet.publicKey,
})
.rpc();
핵심 요약: 한 번 LUMOS를 사용해 온‑체인 데이터 모델을 작성하고, Codama가 컴파일된 프로그램(또는 해당 Anchor IDL)을 읽어 필요한 오프‑체인 SDK를 생성하도록 하세요. 두 도구를 함께 사용하면 Solana에서 풀스택, 타입‑안전 개발 경험을 제공합니다.
3. 기능 비교
| 기능 | LUMOS | Codama |
|---|---|---|
| 구조체 정의 | ✅ | ✅ |
| 열거형 정의 | ✅ | ✅ |
| Borsh 직렬화 | ✅ | ✅ |
| Instruction 빌더 | ❌ | ✅ |
| 오류 타입 | ❌ | ✅ |
| CLI 생성 | ❌ | ✅ |
| Go 지원 | ✅ | ❌ |
| Ruby 지원 | ✅ | ❌ |
| Dart 지원 | ❌ | ✅ |
각각을 언제 사용할까
LUMOS를 사용할 때
- ✅ Solana 프로그램을 위한 새로운 데이터 구조 정의
- ✅ Borsh와 함께 Rust + TypeScript 타입 동기화가 필요할 때
- ✅ 새로운 프로그램을 구축하고 단일 진실 소스를 원할 때
- ✅ 타입이 일치한다는 컴파일 타임 보장을 원할 때
- ✅ Go 또는 Ruby 코드 생성이 필요할 때
Codama를 사용할 때
- ✅ 기존/배포된 프로그램용 클라이언트를 구축할 때
- ✅ 인스트럭션 빌더가 포함된 전체 SDK 생성이 필요할 때
- ✅ Dart 지원 또는 Umi 프레임워크 통합을 원할 때
- ✅ 프로그램에 대한 문서를 생성할 때
- ✅ 프로그램 상호작용을 위한 CLI 도구가 필요할 때
함께 사용하기
다음은 일반적인 워크플로우입니다:
┌─────────────────────────────────────────────────────────────┐
│ PHASE 1: 데이터 구조 정의 (LUMOS) │
│ │
│ schema.lumos → lumos generate → generated.rs + generated.ts│
└─────────────────────────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ PHASE 2: 프로그램 빌드 (Anchor/Native) │
│ │
│ 프로그램에서 generated.rs를 사용하고 + 명령어 작성 │
└─────────────────────────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ PHASE 3: 배포 및 클라이언트 생성 (Codama) │
│ │
│ 프로그램 배포 → IDL 파싱 → 전체 클라이언트 SDK 생성 │
└─────────────────────────────────────────────────────────────┘
요약
| 측면 | LUMOS | Codama |
|---|---|---|
| 철학 | Schema‑first | IDL‑centric |
| 방향 | Schema → Code | Program → Clients |
| 단계 | Pre‑deployment | Post‑deployment |
| 초점 | Data structures | Full program interface |
보완적인 도구입니다:
- 개발 중에 데이터 스키마를 정의할 때 LUMOS를 사용하세요.
- 배포용 클라이언트 라이브러리를 생성할 때 Codama를 사용하세요.
Get Started
LUMOS:
# Install LUMOS CLI
cargo install lumos-cli
# Generate from schema
lumos generate schema.lumos
Codama:
# Install Codama (example via npm)
npm install -g @codama/cli
# Generate clients from a deployed program
codama generate --program-id <PROGRAM_ID>
질문이 있나요? 아래 댓글에 남겨 주세요!

