Rust vs Go: 서버, CLI, 시스템 프로그래밍에서 무엇으로 만들지 고르는 기준
“성능 좋은 컴파일 언어를 하나 배우려는데 Rust와 Go 중 무엇이 좋나요"는 꾸준히 나오는 질문입니다. 두 언어는 겉보기 스펙이 비슷해서(정적 타입, 컴파일, 단일 바이너리, 동시성 강조) 더 헷갈립니다. 결론부터 말하면 철학이 반대에 가까운 언어들이라, 용도를 정하면 답이 따라옵니다. 이 글은 그 판단 기준을 정리합니다. 각 언어 자체는 Go 기초와 Rust 기초에서 다뤘습니다.
같은 점부터: 둘 다 “배포가 쉬운 빠른 언어” #
공통분모는 분명합니다. 정적 타입 검사, 네이티브 컴파일, 런타임 설치가 필요 없는 단일 바이너리, 그리고 파이썬·루비 대비 수십 배 수준의 처리 성능. “스크립트 언어로 만든 서비스가 느려져서 갈아탈 곳을 찾는” 상황이라면 둘 다 정답 후보입니다. 갈림길은 그다음입니다.
갈림길 1: 메모리 — GC의 단순함 vs 소유권의 통제력 #
- Go: 가비지 컬렉터가 메모리를 관리합니다. 개발자는 할당·해제를 잊고 로직에 집중하고, 대가로 GC가 개입하는 순간의 지연과 런타임의 메모리 오버헤드를 받아들입니다. 현대 Go의 GC 일시 정지는 밀리초 미만 수준으로 짧아, 대부분의 서비스에서 문제가 되지 않습니다.
- Rust: 소유권 규칙으로 컴파일 타임에 해제 시점을 확정합니다. GC가 없으므로 일시 정지도 없고 메모리 사용량도 예측 가능하지만, 그 규칙을 배우는 비용을 선불로 냅니다.
“평균은 충분히 빠르고 최악의 순간이 문제인가"가 판별 질문입니다. p99 지연이나 메모리 상한이 계약 조건인 시스템(트레이딩, 실시간 처리, 메모리 제약 환경)이면 Rust의 통제력이 값을 하고, 그렇지 않은 일반 서비스면 Go의 단순함이 이깁니다.
갈림길 2: 동시성 — 내장 고루틴 vs async 생태계 #
- Go: 고루틴과 채널이 언어에 내장되어 있습니다.
go f()한 줄로 수십만 개의 경량 스레드를 띄우고, 런타임 스케줄러가 알아서 배분합니다. 동시성 코드의 진입 장벽이 주류 언어 중 가장 낮은 축입니다. - Rust: async/await는 언어 문법이지만 실행기는 생태계(tokio가 사실상 표준)에서 가져옵니다. 조합의 자유와 세밀한 제어를 얻는 대신, “어떤 런타임, 어떤 크레이트"라는 선택지가 학습 곡선에 추가됩니다. 대신 컴파일러가 데이터 레이스를 원천 차단하는 것은 Rust만의 이점입니다(실전 5편에서 실제 장면을 다뤘습니다).
동시성 코드를 빨리, 많이 쓰는 팀이라면 Go의 내장 모델이 생산성에서 앞서고, 동시성 버그의 비용이 치명적인 도메인이라면 Rust의 컴파일 타임 보증이 앞섭니다.
갈림길 3: 학습 곡선과 팀 #
- Go: 언어 명세가 작고 문법이 단순해서, 경력자라면 며칠에서 1〜2주면 생산적인 코드를 씁니다. “누가 짜도 비슷한 코드"가 나오는 것이 설계 목표라서 코드 리뷰와 온보딩 비용이 낮습니다.
- Rust: 소유권·빌림·수명이라는 선불 비용이 있습니다. 팀원 전체가 이 곡선을 넘어야 하므로, 도입은 개인 취향이 아니라 팀 투자 결정입니다. 대신 넘고 나면 “컴파일이 되면 대체로 돈다"는 배포 신뢰가 곡선 값을 상환합니다.
채용 시장과 조직 규모도 변수입니다. 빠르게 인원을 늘려야 하는 조직에서는 Go의 낮은 온보딩 비용이 실질적인 이점입니다.
용도별 추천 #
| 용도 | 추천 | 근거 |
|---|---|---|
| 웹 API·마이크로서비스 | Go 우세 | GC로 충분한 지연 특성, 낮은 온보딩, 표준 라이브러리와 생태계가 이 용도에 최적화 |
| CLI 도구 | Rust 우세 | 시작 속도·단일 바이너리·크기에서 강점. ripgrep·uv 계보(실전 강좌의 주제) |
| 인프라·네트워크 소프트웨어 | 양쪽 실적 | Docker·Kubernetes가 Go, 프록시·데이터베이스 엔진 등 성능 크리티컬 계열에 Rust 채택 증가 |
| 임베디드·커널·WASM | Rust | GC 없는 런타임과 메모리 통제가 사실상 요구 조건. 리눅스 커널의 공식 두 번째 언어 |
| 파이썬 가속(확장 모듈) | Rust | PyO3 생태계가 표준 경로. Polars·Ruff·pydantic 계보 |
정리 #
- 둘 다 “빠르고 배포 쉬운 언어"라는 공통분모 위에 있고, 갈림길은 메모리·동시성·학습 곡선의 3개 축입니다.
- 판별 질문은 “최악의 순간(GC 일시 정지, 동시성 버그, 메모리 상한)이 계약 조건인가"입니다. 그렇다면 Rust의 선불 비용이 값을 하고, 아니라면 Go의 단순함이 이깁니다.
- 웹 API와 빠른 팀 확장은 Go, CLI·임베디드·파이썬 가속·성능 크리티컬 코어는 Rust가 기본 추천입니다.
- 하나를 골라야 하는 학습 순서라면, 백엔드 지향은 Go 먼저, 시스템·도구 지향은 Rust 먼저가 무난합니다. 두 언어는 경쟁 관계라기보다 덮는 영역이 다른 도구입니다.