Node · Python · Go 런타임 비교 — 동시성 모델 3종
이벤트 루프(Node) · GIL + async(Python) · 고루틴(Go) — 어울리는 문제가 다르다.
"어떤 언어로 백엔드?" 판단의 근거. 바이브코더는 대부분 Node.js 하나면 되지만, 왜 Go·Python·Rust가 따로 쓰이는지 알면 Claude의 언어 선택 조언을 이해할 수 있다.
| 런타임 | 동시성 모델 | 타입 | 어울리는 문제 | 대표 프레임워크 |
|---|---|---|---|---|
| Node.js | 싱글 스레드 이벤트 루프 + libuv | JS/TS | I/O 집약, 실시간, 풀스택 | Express, Next.js, Nest |
| Deno/Bun | Node 호환 + 보안·TS 내장 | TS | 신규 Node 대체 | Hono, Elysia |
| Python | GIL + async/await + 멀티프로세스 | 동적(타입힌트 가능) | 데이터·AI, 스크립트 | FastAPI, Django |
| Go | 고루틴 (경량 스레드) + 채널 | 정적 | 고동시성·네트워크·CLI | Gin, Echo |
| Rust | async + 소유권(메모리 안전) | 정적 | 극한 성능, 시스템 | Axum, Actix |
| Java/Kotlin | 스레드풀 + Virtual Thread(21+) | 정적 | 대기업·엔터프라이즈 | Spring Boot |
Node.js의 이벤트 루프 복습(ch07-5 연장). JS 코드는 한 스레드에서 돌지만, libuv 스레드풀이 파일 I/O·DB·네트워크를 뒤에서 병렬 처리. 그래서 1만 동시 접속에도 메모리 경량(프로세스당 MB 단위).
// Node — I/O 집약 서버의 강자
import express from "express";
const app = express();
app.get("/api/user/:id", async (req, res) => {
// 3개 DB 호출이 동시 진행 (스레드풀이 처리)
const [user, posts, followers] = await Promise.all([
db.users.findById(req.params.id),
db.posts.findByUser(req.params.id),
db.followers.count(req.params.id),
]);
res.json({ user, posts, followers });
});I/O 3개를 병렬로 돌리면 가장 느린 하나만큼만 기다림. Node가 I/O 서버에서 빠른 이유.
Python의 GIL(Global Interpreter Lock) — CPython은 한 시점에 한 스레드만 파이썬 바이트코드 실행. 즉 스레드 늘려도 CPU 집약 작업은 병렬 안 됨. 해법: multiprocessing(프로세스 분리) · async/await(I/O 동시성) · numpy/torch(C 영역에서 GIL 해제).
FastAPI는 "파이썬 Node" 같은 경험. 데이터·AI 파이프라인 붙일 때 최강.
Go의 고루틴(goroutine)은 경량 스레드 — OS 스레드가 아닌 런타임이 관리. 수백만 개 동시 실행 가능. `go fn()` 한 줄로 동시 작업. 채널(channel)로 안전하게 통신. Node보다 더 많은 동시성 필요할 때·CPU·네트워크가 둘 다 중요할 때 선택.
// Go — 고동시성의 대가
package main
import (
"fmt"
"net/http"
"sync"
)
func main() {
var wg sync.WaitGroup
urls := []string{"https://a", "https://b", "https://c"}
for _, url := range urls {
wg.Add(1)
go func(u string) { // 고루틴 — 병렬 실행
defer wg.Done()
resp, _ := http.Get(u)
fmt.Println(u, resp.Status)
}(url)
}
wg.Wait()
}고루틴은 KB 단위 메모리로 뜨기 때문에 수만 개 동시 실행이 일상. 디스코드·Uber·Kubernetes가 Go로 쓰인 이유.
바이브코더 선택 가이드. 풀스택 웹 → Next.js(Node). 데이터·AI·스크립트 → Python(FastAPI). 초고동시성 API·CLI → Go. 극한 성능·안전 → Rust. 2026년 현재 90% 프로젝트는 Node·Python 둘 중 하나로 충분.
| 작업 유형 | 최고 성능 대략 비교 |
|---|---|
| I/O·네트워크 API 서버 | Go ≳ Rust ≳ Node ≳ Python |
| CPU 집약(이미지·암호 등) | Rust ≳ Go ≳ Node(Worker) ≳ Python(numpy 없이 ×) |
| 개발 속도 | Python ≳ Node ≳ Go ≳ Rust |
| 팀 채용 난이도 | Node ≦ Python ≪ Go/Rust |
Node.js가 싱글 스레드인데도 수천 동시 요청을 처리할 수 있는 근본 메커니즘은?
Python에서 여러 스레드를 써도 CPU 집약 작업이 병렬화되지 않는 원인은?
Go의 경량 스레드 단위의 이름은?