Rust 크레이트 지도 — 분야별로 많이 쓰는 것과 고르는 법
Rust 실무에서 자주 만나는 크레이트를 분야별로 정리한다. JSON 은 serde, 명령줄은 clap, 비동기는 tokio, 웹은 axum, 에러는 thiserror·anyhow 다. 직접 적은 4개가 실제로는 25개를 끌어온다는 것을 cargo tree 로 확인하고, 크레이트를 고르는 기준을 본다.
01 분야별 지도
표준 라이브러리는 일부러 작게 두었다. 그래서 JSON·명령줄 옵션·웹 서버 같은 것은 크레이트를 쓰는 것이 기본이다. 아래는 커뮤니티 추천 목록(blessed.rs)과 실무에서 가장 많이 겹치는 것들이다.
| 분야 | 크레이트 | 하는 일 | 이 시리즈 |
|---|---|---|---|
| 직렬화 | serde + serde_json | 구조체 ↔ JSON(·TOML·YAML) | 5편 |
| 명령줄 | clap | 옵션·인자 읽기, --help 자동 | 6편 |
| 비동기 런타임 | tokio | async 실행·네트워크·타이머 | 입문 46편 |
| 웹 서버 | axum | 경로·핸들러·JSON 응답 | 7편 |
| 에러 | thiserror · anyhow | 라이브러리용 에러 타입 · 앱용 에러 처리 | 8편 |
| 로그 | tracing | 구조화된 로그·추적 | — |
| DB | sqlx | 컴파일할 때 SQL 을 검사하는 비동기 DB | — |
| HTTP 클라이언트 | reqwest | 다른 서버 부르기 | — |
| 병렬 처리 | rayon | iter() 를 par_iter() 로 바꿔 코어 여러 개 쓰기 | — |
새 프로젝트라면 이 표의 크레이트부터 본다. 같은 일을 하는 크레이트가 여럿일 때, 이 크레이트들은 많은 사람이 오래 써서 문서와 예제가 많다.
02 직접 적은 것보다 많이 들어온다
크레이트 넷을 적은 프로젝트에서 cargo tree 를 돌렸다.
[package]
name = "notes"
version = "0.1.0"
edition = "2024"
[dependencies]
anyhow = "=1.0.104"
clap = { version = "=4.6.7", features = ["derive"] }
serde = { version = "=1.0.229", features = ["derive"] }
serde_json = "=1.0.154"cargo tree --depth 1 Updating crates.io index
Locking 29 packages to latest Rust 1.95.0 compatible versions
notes v0.1.0 (~/projects/notes)
├── anyhow v1.0.104
├── clap v4.6.7
├── serde v1.0.229
└── serde_json v1.0.154--depth 1 은 직접 적은 것만 보여 준다. 그 아래까지 모두 세면 이렇다.
cargo tree --prefix none --no-dedupe | sort -u | wc -l Updating crates.io index
Locking 29 packages to latest Rust 1.95.0 compatible versions
2626줄은 우리 프로젝트 하나와 크레이트 25개다. 넷을 적었는데 스물다섯이 들어왔다. clap 은 터미널 색(anstyle 등)을, serde 의 derive 기능은 코드를 만드는 크레이트(syn·quote·proc-macro2)를 끌어온다. 2편의 컴파일 시간과 실행 파일 크기는 이 숫자에 비례한다. 12편에서 볼 공급망 위험도 이 25개 모두에 걸린다.
03 실습 — 크레이트를 고르는 기준
crates.io 나 lib.rs 에서 크레이트를 볼 때 다섯 가지를 확인한다.
- 내려받기 수와 쓰는 크레이트 수 — 많을수록 많은 사람이 이미 밟아 본 길이다.
- 최근 갱신일 — 몇 년째 멈춰 있으면 새 Rust 판에서 문제가 생겨도 고쳐 줄 사람이 없다.
- 버전 — 1.0 이상이면 호환을 약속한다. 0.x 면 가운데 숫자가 바뀔 때 깨질 수 있다(2편).
- 딸려 오는 의존성 —
cargo tree로 본다. 작은 기능에 큰 크레이트를 들이지 않는다. 기능을 고르는features로 줄일 수 있는지 본다. - 라이선스 — 대부분 MIT 나 Apache-2.0 이다. 회사 코드라면 쓸 수 있는 라이선스인지 확인한다.
자기 프로젝트에서 cargo tree --depth 1 과 전체 수를 세어 보자. 다음 편부터 표의 크레이트를 하나씩 쓴다. 첫 번째는 serde 다.