[기술검토] 주문 도메인(주문수집·배송) 차세대 언어 전환 검토 — Go vs Kotlin
이커머스 주문수집·배송 워크로드의 PHP·Python 외 제3언어 전환 타당성 검토. 운영·모니터링·트러블슈팅·장애대응을 1급 평가 기준으로 Go 1순위, Kotlin/JVM 2순위 권고. Kafka consumer 경계 점진 전환 + shadow 병행 검증 + 운영 기준 Phase 게이트 전략 포함.
주문 도메인(주문수집·배송) 차세대 언어 전환 기술검토
이커머스 주문수집·배송 워크로드를 PHP·Python 외 제3언어로 전환할 타당성을 개발 생산성 + 운영·모니터링·트러블슈팅·장애대응을 동등한 평가 기준으로 검토한 문서다. 결론: Go 1순위, Kotlin/JVM 2순위 — 단, 언어보다 운영 체계 구축이 전환의 전제 조건이다.
작성일: 2026-07-02 (v2: 운영·모니터링·트러블슈팅·장애대응 관점 보강) 대상: 마켓 통합관리 서비스의 주문 도메인 (주문수집, 배송, 클레임, RTQ) — PHP 레거시 시스템 / Python 신규 시스템 목적: PHP·Python 외 제3언어로의 전환 타당성 검토 — 개발 생산성뿐 아니라 운영/장애대응 역량을 1급 평가 기준으로 포함
1. 배경 및 목적
마켓 통합관리 서비스의 주문 도메인은 현재 PHP 레거시 시스템(이하 레거시) → Python 신규 시스템 이관이 진행 중인 이중 스택 상태다. 본 검토는 주문수집·배송 등 주문 관련 워크로드에 한해 PHP/Python보다 장점이 많은 제3언어로의 전환 가능성을 분석한다.
주문 도메인의 장애는 판매자의 주문 누락·중복 발주·배송 지연으로 직결되는 금전·CS 피해이므로, 언어 선정에서 "빨리 만드는 능력"보다 "장애를 빨리 발견하고(모니터링), 빨리 원인을 찾고(트러블슈팅), 빨리 복구하는(장애대응) 능력" 을 동등 이상의 가중치로 평가한다.
2. 현행 시스템 분석
2.1 PHP 레거시 시스템
| 항목 | 내용 |
|---|---|
| 규모 | 주문 도메인 약 1,000+ 파일 / 15만 LOC 이상 (주문 코어 587파일 12.8만 LOC + 도메인 모듈 336파일 2.6만 LOC + console 43파일 등) |
| 런타임 | PHP 8.0.7 (Docker 실배포 기준), 자체 사내 프레임워크, composer 미사용(vendored) |
| 아키텍처 | Cron → Gearman Worker → 마켓 API(curl) → Redis → 후처리(Filter/Market/쇼핑몰연동/후속연동) → DB |
| 마켓 어댑터 | 크롤러 91개 마켓, 후처리 Action 79개 마켓 디렉토리 (클래스명 prefix 팩토리) |
| 데이터스토어 | MariaDB(PDO 커스텀 ORM), MongoDB(주문 원본), Redis(수집 임시저장·락, TTL 2h 암호화 JSON), ClickHouse(로그/통계), Memcache |
| 특이사항 | 전환 여부 판별 로직으로 전환 완료 마켓은 Python 신규 시스템에 위임. 고트래픽 마켓(zigzag/ably/gmarket 등)은 Gearman 워커 분리 |
2.2 Python 신규 시스템 (전환 중)
| 항목 | 내용 |
|---|---|
| 규모 | 주문 도메인 약 300 파일 / 7.4만 LOC (주문 파이프라인 모듈 기준) |
| 런타임 | Python 3.11, FastAPI 0.101 + Uvicorn/Gunicorn |
| 아키텍처 | Kafka 단계형 파이프라인: list → detail → bind → post-before(filter/market) → post-after(쇼핑몰연동/후속연동). 대용량 payload는 Redis에 두고 key만 Kafka로 전달 |
| 마켓 어댑터 | 37개 마켓 전환 완료. importlib 동적 팩토리 — 마켓별 api/bind 각 1파일 + post 4파일(filter/market/쇼핑몰연동/후속연동) |
| 데이터스토어 | SQLAlchemy 2.0(sync+async 병존), pymongo, redis-py, pymemcache, ClickHouse |
| 특이사항 | 주문 로직 대부분 동기(sync) 코드 — asyncio 활용 미흡. RTQ(배송/입고/클레임확정)도 Kafka 토픽 기반. PHP 원본과 주석으로 1:1 동등성 추적, 별도 동등성 검증 체계(주문검증) 운영. OpenTelemetry + Prometheus 계측 구성 존재 |
2.3 현행 운영·장애대응 현황 (전환 시 반드시 승계/개선할 것)
- 장애 조사 경로: 실서버 로그 조회 시스템 → ClickHouse 수집/처리 로그 테이블 → Redis 락·진행상태 관리 모듈 확인. 프로세스 내부(메모리/스레드) 가시성은 사실상 없음 — 로그 기반 사후 추적에 의존.
- 장애 유형(실측): 마켓 API 응답의 키 누락/
null로 인한 런타임 오류(예:is_representative=null사례), 크로스-레포(생산자↔소비자) 데이터 기인 장애, Redis 락 경합/커넥션 누수, 특정 마켓 트래픽 폭주로 인한 워커 적체. - 핫픽스 방식: PHP는 파일 수정 = 즉시 반영(빌드 없음)이라 복구 속도가 빠른 반면, 요청/잡 단위 shared-nothing이라 상태 오염·메모리 누수 유형 장애가 거의 없었음. 상주 데몬형 언어로 가면 이 두 가지가 모두 바뀐다 — 4장에서 상세 평가.
- 재처리: Gearman은 유실 잡 재처리가 어렵고, Kafka 기반 신규 파이프라인은 offset 되감기로 구간 재처리 가능 — 언어와 무관하게 Kafka 파이프라인 유지가 장애대응력의 핵심 자산.
2.4 워크로드 특성 (언어 선정 기준)
- I/O 바운드 대량 팬아웃: 수천 개 몰 × 마켓 API 동시 호출이 핵심. CPU 작업은 JSON 매핑/암복호화 정도.
- 메시지 기반 파이프라인: Kafka(신) / Gearman(구) 소비자 데몬이 주 실행 형태.
- 마켓별 어댑터 다수: 마켓당 4~6파일의 정형화된 어댑터 수십 개 — 반복 구조.
- 멀티 데이터스토어: MariaDB, MongoDB, Redis, Memcached, ClickHouse.
- 운영 환경: Docker/k8s, 역할별 pod 분기(web/worker/cron), 24/7 수집 — 무중단·부분 장애 격리가 필수.
3. 후보 언어 비교 (개발 + 운영 통합 평가)
3.1 Go ★ 1순위 권고
개발 관점 장점
- goroutine + channel 경량 동시성: 수천 몰 병렬 수집에 구조적으로 최적. 단일 프로세스에서 수만 동시 I/O.
- 정적 컴파일 단일 바이너리: 이미지 수십 MB, cold start 수십 ms, 의존성 지옥 없음.
- 정적 타입: 마켓 API 응답을 struct로 강제 —
null/키 누락형 런타임 장애를 역직렬화 단계에서 차단. - 생태계 부합: franz-go/confluent-kafka-go, go-redis, mongo-go-driver, clickhouse-go 모두 성숙.
- PHP/Python 팀 기준 학습곡선 최소, 국내 채용풀 견고.
운영·트러블슈팅 관점 장점
- pprof 상시 프로파일링: HTTP 엔드포인트로 운영 중 프로세스의 CPU/heap/goroutine/블로킹 프로파일을 무중단 채취 — "지금 왜 느린가/왜 메모리가 오르는가"를 로그 없이 직접 진단. 현행 PHP의 로그 기반 사후 추적 대비 질적 개선.
- goroutine dump(SIGQUIT): 행(hang) 상태에서 전체 고루틴 스택 즉시 확보 — 락 경합·API 타임아웃 적체 진단에 직효.
- Prometheus/Grafana 네이티브(사실상 Go가 표준 생태계), OpenTelemetry 성숙 — 현행 Python 신규 시스템의 OTel 구성 이식 용이.
- 컴파일 수십 초 + 단일 바이너리 → 핫픽스 커밋에서 운영 반영까지 CI/CD 기준 수 분 확보 가능. 이미지 태그 롤백 즉시.
- race detector(테스트 단계에서 데이터 레이스 검출), panic 시 전체 스택트레이스.
단점
if err != nil장황, ORM 빈약(raw SQL 중심), 동적 임포트 부재로 어댑터 팩토리 재설계 필요(컴파일 타임 검증이 되므로 장기적으론 장점).- APM 자동 계측이 JVM보다 약함: Pinpoint/Datadog류의 바이트코드 자동 계측이 불가 — HTTP/DB/Kafka 클라이언트에 미들웨어·래퍼 방식 수동 계측을 컨벤션으로 강제해야 함(초기 구축 비용).
- 상주 데몬이므로 goroutine 누수·전역 상태 오염이 새 장애 유형 — pprof 정기 점검 런북 필요.
- panic 미복구 시 프로세스 전체 종료 — consumer 루프에 recover 미들웨어 표준화 필수.
3.2 Kotlin (JVM, Java 21+ 가상스레드) ★ 2순위 — 운영 관측성 단일 기준으로는 최강
개발 관점 장점
- 가상 스레드(Loom)/코루틴으로 sync 스타일 코드 유지하며 대량 I/O 처리 — 현행 sync 위주 Python 코드 구조를 거의 그대로 이식 가능.
- Kafka 생태계의 본진(Kafka 자체가 JVM): Kafka Streams, Spring Kafka 등 파이프라인 도구 최성숙.
- 국내 백엔드 채용풀 최대, null-safety.
운영·트러블슈팅 관점 장점
- 사후 분석 도구가 후보 중 최강: 살아있는 프로세스에 attach하여 thread dump/heap dump 채취, async-profiler, JFR(Flight Recorder) 상시 비행기록 — "죽지 않았는데 이상한" 장애(행, 누수, GC 폭주) 분석에서 타의 추종 불허.
- APM 자동 계측: Pinpoint(국내 표준급)·Scouter·Datadog 등이 바이트코드 계측으로 코드 수정 없이 전 구간 분산 트레이싱 — 관측성 구축 비용 최소.
- 예외 격리 우수: 스레드 하나의 예외가 프로세스를 죽이지 않음.
단점
- JVM 메모리 footprint(pod당 힙 수백 MB) — 마켓별 워커를 잘게 쪼개는 운영 방식에서 컨테이너 밀도 불리. GC 튜닝이라는 별도 운영 기술 부채 발생.
- cold start 느림, Gradle 빌드 무거움 → 핫픽스 리드타임이 Go보다 김(GraalVM native로 완화 가능하나 빌드 복잡도 급증 + JFR 등 진단 도구 일부 제약).
- PHP/Python 팀 기준 Spring 생태계 학습 부담. DI/AOP 마법이 오히려 트러블슈팅 난도를 높이는 면 존재.
3.3 Rust — 부적합
- 장점: 최고 성능·최소 메모리, 소유권 모델이 데이터 레이스 원천 차단, tokio 성숙.
- 단점: 학습곡선 최악, 국내 채용풀 극소. 운영 관점에서도 감점: 컴파일이 매우 느려 핫픽스 리드타임 최장, 프로파일링/APM 도구 상대적 미성숙. 마켓별 비즈니스 로직 변경 속도가 중요한 도메인에 과잉 스펙.
3.4 Node.js / TypeScript — 이점 부족
- 장점: 이벤트 루프 네이티브 비동기, TS 타입 표현력, 채용풀·생태계 큼, 프론트와 언어 통일 여지.
- 단점: 싱글스레드 이벤트 루프 — 대량 JSON 매핑·암복호화 CPU 스파이크가 전체 consumer를 블로킹(이벤트 루프 랙은 대표적 잠복 장애 유형이며 별도 랙 모니터링 필수). TS 타입은 런타임 보장 없음(zod 등 별도 구축 = pydantic 대비 이점 소멸). heap snapshot 분석 등 진단은 가능하나 JVM/Go 대비 상시 프로파일링 접근성 낮음. npm 공급망 리스크. Python 대비 "전환할 만큼의 장점"이 성립하지 않음.
3.5 Elixir (BEAM) — 부적합 (단, 설계 사상은 차용)
- 장점: 액터 + supervisor 트리 — 몰/마켓 단위 프로세스 격리·자동 재시작으로 장애 격리·자기복구는 이론적 이상형. 운영 중 원격 콘솔(iex attach) 진단 강력.
- 단점: 국내 채용풀 사실상 부재 — 새벽 장애 온콜을 설 수 있는 인력을 구할 수 없다는 것 자체가 장애대응 리스크. 동적 타입, 생태계 협소. 채택 불가하되, "마켓 단위 격리 + 자동 재시작" 사상은 k8s pod 분리 + consumer group 설계로 차용한다(4.3).
3.6 종합 비교 매트릭스
| 기준 | Go | Kotlin/JVM | Rust | Node/TS | Elixir |
|---|---|---|---|---|---|
| I/O 팬아웃 동시성 | ◎ | ◎(Loom) | ◎ | ○ | ◎ |
| Kafka/스토어 드라이버 성숙도 | ◎ | ◎ | ○ | ○ | △ |
| 데이터 정합성(타입 안전) | ◎ | ◎ | ◎ | ○ | △ |
| 모니터링/APM 구축 비용 | ○(수동 계측) | ◎(자동 계측) | △ | ○ | △ |
| 런타임 진단(프로파일/덤프) | ◎(pprof) | ◎(JFR/dump) | △ | ○ | ○ |
| 핫픽스 리드타임(빌드+배포) | ◎(수십초 빌드) | △(무거운 빌드) | ✕ | ◎ | ○ |
| 장애 격리/자기복구 | ○(recover+pod) | ◎(예외 격리) | ○ | △(루프 블로킹) | ◎ |
| 리소스 footprint/컨테이너 밀도 | ◎ | △ | ◎ | ○ | ○ |
| PHP/Python 팀 학습곡선 | ◎ | ○ | ✕ | ◎ | △ |
| 국내 채용풀(온콜 가능 인력) | ○ | ◎ | ✕ | ◎ | ✕ |
| 종합 | 1순위 | 2순위 | 부적합 | 이점 부족 | 부적합 |
💡 정직한 평가: 운영 관측성·사후 분석 단일 기준으로는 JVM(Kotlin)이 최강이다. Go가 종합 1순위인 이유는 핫픽스 리드타임·컨테이너 밀도·학습곡선에서의 우위가 APM 수동 계측 비용을 상회하기 때문이며, 조직이 Pinpoint 등 JVM APM 인프라를 이미 보유·운영 중이라면 Kotlin으로 역전될 수 있다.
4. 운영 설계: 모니터링 · 트러블슈팅 · 장애대응 (전환의 전제 조건)
언어 전환의 성패는 코드 이식이 아니라 운영 체계의 승계·개선에서 갈린다. 아래는 언어와 함께 반드시 구축해야 할 운영 아키텍처다 (Go 기준으로 기술하되 Kotlin 선택 시에도 동일 구조 적용).
4.1 모니터링 (장애를 "빨리 발견")
| 계층 | 구성 | 현행 대비 |
|---|---|---|
| 메트릭 | Prometheus + Grafana. 표준 지표: 몰/마켓별 수집 성공·실패율, 마켓 API latency/에러코드 분포, Kafka consumer lag(토픽·파티션별), Redis 락 보유 시간, goroutine 수/heap 사용량 | 현행: ClickHouse 사후 집계 중심 → 실시간 지표로 전환 |
| 알람 | consumer lag 임계치, 마켓별 수집 실패율 급등, 특정 마켓 0건 수집(무소식 장애), panic/재시작 횟수 | 현행: 사실상 CS 인입으로 인지하는 경우 존재 → CS보다 먼저 아는 것이 목표 |
| 분산 트레이싱 | OpenTelemetry — 수집 요청 1건이 list→detail→bind→post 파이프라인을 통과하는 전 구간 trace. Python 신규 시스템의 기존 OTel 구성 승계 | Kafka 단계 간 trace context 전파를 표준 라이브러리로 강제 |
| 구조화 로깅 | JSON 구조화 로그 + mall_id / market_code / order_id / trace_id 필수 필드 컨벤션 → 로그 조회 시스템/ClickHouse 파이프라인 승계 | 현행 로그 기반 조사 경로(로그 조회 시스템·ClickHouse 주문 로그)와 호환 유지 — 조사 절차 단절 방지 |
4.2 트러블슈팅 (원인을 "빨리 찾기")
- 상시 프로파일링 엔드포인트: 전 consumer pod에 pprof(내부망 한정) 노출 — CPU 스파이크, 메모리 증가, goroutine 누수를 운영 중 즉시 채취. 주기적 heap 프로파일 저장(continuous profiling — Pyroscope/Parca류)으로 "어제와 오늘의 diff" 분석.
- 행(hang) 진단 런북: SIGQUIT goroutine dump → 락/외부 API 대기 지점 식별 절차를 런북화. 현행 "Redis 락 상태 수동 확인"을 대체.
- 재현 가능성: 정적 타입 + 단일 바이너리 = 운영과 동일한 바이너리를 로컬/스테이징에서 동일 입력(Kafka 메시지 replay)으로 재현 — 현행 "실서버 로그 보고 추정" 방식 대비 결정적 개선.
- 크로스-레포 장애 대응: 생산자↔소비자 데이터 기인 장애(마켓 API 응답 키 누락 유형)를 위해 bind 단계에서 스키마 검증 실패를 삼키지 않고 전용 DLQ(dead letter queue) 토픽 + 원본 payload 보존으로 라우팅 — "어느 시스템이 만든 데이터가 문제인가"를 즉시 판별.
4.3 장애대응 (서비스를 "빨리 복구") — 가장 중요
- 부분 장애 격리 (blast radius 최소화)
- 마켓(군)별 consumer group / pod 분리 — 특정 마켓 API 장애·트래픽 폭주가 타 마켓 수집을 막지 않음. 현행 고트래픽 마켓별 Gearman 워커 분리 사상을 k8s 배포 단위로 승격.
- 마켓 API 호출부에 circuit breaker + 지수 백오프 + 타임아웃 예산 표준화 — 죽은 마켓 API를 계속 두드리며 워커를 소진하는 현행 적체 패턴 차단.
- consumer 루프 panic recover 미들웨어 표준화(해당 메시지만 DLQ로, 프로세스는 지속).
- 복구 속도
- 핫픽스 리드타임 목표를 SLO로 명시: 커밋 → 운영 반영 15분 이내(빌드 수십 초 + 카나리 배포). PHP의 "파일 수정 즉시 반영"을 잃는 대신 CI/CD로 보상 — 이 파이프라인이 준비되기 전에는 전환 트래픽을 늘리지 않는다(Phase 게이트 조건).
- 이미지 태그 기반 즉시 롤백 + k8s 롤링. 배포·롤백 절차 런북화.
- 데이터 복구 (주문 도메인 특화)
- Kafka offset 되감기 재처리: 장애 구간의 수집 재실행 절차를 도구화(마켓·시간 범위 지정 replay CLI). Gearman 대비 차세대 주문 파이프라인 아키텍처의 최대 장애대응 자산 — 언어 전환 후에도 유지.
- 멱등성 필수: 재처리 시 중복 발주·중복 저장이 없도록 주문 처리 전 단계 멱등키(
mall_id|market|order_id|item_no— 현행 Memcached 상태 키 체계 승계) 설계. 재처리가 안전해야 "일단 되감고 다시 돌린다"는 대응이 가능. - DLQ 누적분의 수동/자동 재투입 절차.
- 병행 실행(shadow) 안전망: 전환 기간 중 Go consumer와 기존 Python consumer를 별도 consumer group으로 동일 토픽 병행 소비(Go 측은 쓰기 차단 dry-run) → 결과 diff를 기존 주문검증 동등성 체계로 상시 비교. 이상 시 트래픽 스위치백(설정 1회)으로 즉시 원복.
- 온콜 체계: 병존 기간 스택별 소유권 명확화(Kafka 토픽 = 소유 경계). 마켓별 장애 대응 런북(자주 죽는 마켓 API의 증상·확인 쿼리·복구 절차)을 코드와 같은 레포에서 관리.
4.4 관리(지속 운영) 관점
- 의존성/보안: Go modules +
govulncheck정기 스캔 — 현행 레거시의 vendored(사실상 업데이트 방치) 대비 구조적 개선. 런타임 업그레이드도 Go1 하위호환 보장으로 부담 최소(Python 마이너 업그레이드·JVM GC 튜닝 대비 우위). - 상주 데몬의 새 장애 유형 관리: PHP shared-nothing에는 없던 메모리 누수·전역 상태 오염·goroutine 누수를 정기 점검 항목으로 편입(heap 프로파일 주간 리뷰 + pod 메모리 추세 알람). 필요시 pod 주기 재시작은 최후 수단으로만.
- 표준 코드 컨벤션: 에러 래핑, 로깅 필드, 계측 미들웨어, DB 접근 패턴을 초기 확정 — Go는 APM 자동 계측이 없으므로 계측 컨벤션 준수가 곧 관측성이다. 어댑터 코드젠 템플릿에 계측 코드를 내장해 마켓별 편차 제거.
- AI 자동전환 파이프라인 승계: 자체 구축한 마켓 어댑터 자동전환용 코드젠 가이드(주문 API 코드 생성기 등)를 Go 템플릿으로 갱신 — 운영 컨벤션이 템플릿에 박혀 있으면 신규 마켓 추가 시 모니터링 누락이 원천 차단됨.
5. 권고안
5.1 권고: Go 채택 (조건부)
주문 도메인의 본질은 "수천 몰 × 수십 마켓 API의 동시 수집과 메시지 파이프라인 처리"이며, 장애대응 관점에서는 "부분 격리·빠른 진단·빠른 핫픽스·안전한 재처리"가 요구된다. Go는 ① 경량 동시성으로 병렬도 한계를 제거하고, ② pprof/goroutine dump로 운영 중 직접 진단이 가능하며, ③ 수십 초 빌드 + 단일 바이너리로 핫픽스 리드타임과 롤백을 최단으로 만들고, ④ 정적 타입으로 마켓 데이터 정합성 장애를 원천 축소한다. APM 자동 계측 부재는 계측 컨벤션 + 코드젠 내장으로 보상 가능하다. 단, 조직이 JVM APM 인프라(Pinpoint 등)를 이미 운영 중이라면 Kotlin이 역전 가능 — 이 한 가지는 인프라팀 확인 후 최종 확정할 것.
5.2 전환 전략 (기존 자산 최대 보존)
현행 차세대 주문 파이프라인의 Kafka 토픽 경계가 이미 언어 중립적이므로 빅뱅 없이 consumer 단위로 교체한다.
- Phase 0 — PoC (1~2개월): 고트래픽 마켓 1~2개(zigzag 등)의 수집(list/detail/bind) consumer를 Go로 구현, shadow 병행 실행 + 주문검증 동등성 비교. 이 단계에서 4장의 운영 체계(메트릭/알람/pprof/DLQ/replay CLI/런북)를 함께 구축 — 코드보다 운영 체계가 PoC의 진짜 산출물.
- Phase 1 — 수집 코어 전환: crawl/manual 파이프라인의 list·detail·bind 단계 이관 (I/O 팬아웃 이득 최대 구간). post 4단계는 비즈니스 로직 밀도가 높아 후순위.
- Phase 2 — RTQ/배송: 배송·입고·클레임확정 RTQ consumer 이관 — 실시간성 요구가 높아 Phase 1에서 검증된 운영 체계 위에서만 진행.
- Phase 3 — 후처리 및 레거시 잔여 마켓: 레거시의 잔여 미전환 마켓은 Python을 거치지 않고 PHP → Go 직행 (이중 포팅 방지).
Phase 게이트 (다음 단계 진입 조건 — 운영 기준)
- 핫픽스 리드타임 SLO(커밋→운영 15분) 실측 통과
- Kafka replay + 멱등 재처리 실전 리허설 1회 이상
- 대시보드·알람·런북 완비 + 온콜자 트러블슈팅 훈련(goroutine dump/pprof 실습)
- shadow 기간 동등성 diff 0건 (또는 전건 원인 규명)
- 이전 Phase의 구 consumer 폐기 완료 (병존 상한 강제)
5.3 리스크 및 완화
| 리스크 | 심각도 | 완화 |
|---|---|---|
| 3중 스택 병존(PHP+Python+Go) 기간의 온콜·운영 부담 | 높음 | Kafka 토픽 = 소유 경계로 명확화, Phase 게이트에 "구 consumer 폐기"를 포함해 병존 기간 상한 강제 |
| PHP의 즉시 핫픽스 상실 — 빌드·배포가 복구 경로에 추가됨 | 높음 | 핫픽스 리드타임을 SLO로 명문화(15분), 파이프라인 미비 시 트래픽 확대 금지 (Phase 게이트) |
| 상주 데몬의 신규 장애 유형(메모리/goroutine 누수, 상태 오염) | 중간 | continuous profiling + 메모리 추세 알람 + 주간 heap 리뷰를 운영 루틴으로 편입 |
| APM 자동 계측 부재로 관측성 편차 | 중간 | 계측 미들웨어 표준화 + 어댑터 코드젠 템플릿에 계측 내장(마켓별 누락 원천 차단) |
| Python 전환 매몰비용(37개 마켓·7.4만 LOC 이식 완료) | 높음 | 안정 운영 중인 Python 마켓 유지, Go는 신규 전환분·고트래픽 코어부터. 전량 재이식은 Phase 1 성과 검증 후 결정 |
| 수집 데이터 정합성 회귀 / 재처리 중 중복 발주 | 높음 | shadow 병행 + 주문검증 동등성 확장, 멱등키 설계를 Phase 0 필수 산출물로 |
| 동적 팩토리 → 정적 레지스트리 재설계 | 중간 | 정형화된 어댑터 구조라 코드젠으로 흡수 |
| 팀 Go 역량 부재 | 중간 | PoC 기간 페어 작업 + 컨벤션 확립 + 온콜 훈련 후 확산 |
5.4 대안 시나리오
- 보수안: 언어 추가 없이 Python 신규 시스템 sync 코드의 asyncio 전환 + 4장의 운영 체계(메트릭/알람/DLQ/replay/멱등성)만 Python 위에 구축. 운영 체계 개선은 언어와 무관하게 즉시 가치가 있으므로, 전환 여부와 별개로 착수 권장.
- Kotlin안: 사내 JVM APM 인프라 보유 or Kafka Streams 고도화가 로드맵 핵심이면 Kotlin으로 결정 변경. 컨테이너 밀도·빌드 리드타임 감수.
6. 결론
주문수집·배송 워크로드를 개발 생산성과 운영·모니터링·트러블슈팅·장애대응 역량을 통합해 평가한 결과 Go가 1순위, Kotlin/JVM이 2순위다 (관측성 단일 기준으로는 JVM 최강 — 사내 APM 인프라 보유 여부가 최종 변수). Rust는 과잉, Node/TS는 Python 대비 차별성 부족, Elixir는 온콜 인력 리스크로 제외하되 격리·자기복구 사상은 k8s 설계로 차용한다.
핵심 결론은 두 가지다. 첫째, 언어보다 운영 체계가 먼저다 — 실시간 메트릭/알람, DLQ, Kafka replay + 멱등 재처리, 핫픽스 리드타임 SLO는 어떤 언어를 선택하든 전환의 전제 조건이며, PoC의 진짜 산출물이다. 둘째, 빅뱅 재전환이 아닌 Kafka consumer 경계 기반 점진 전환 + shadow 병행 검증 + 운영 기준 Phase 게이트를 전제로만 전환을 진행한다.
| 항목 | 결론 |
|---|---|
| 권고 언어 | Go (조건부 1순위) — JVM APM 인프라 기보유 시 Kotlin 재검토 |
| 2순위 | Kotlin/JVM — 운영 관측성·사후 분석 단일 기준으로는 최강 |
| 제외 | Rust(과잉 스펙), Node/TS(차별성 부족), Elixir(온콜 인력 리스크 — 격리 사상만 차용) |
| 전제 조건 | 실시간 메트릭/알람 · DLQ · Kafka replay + 멱등 재처리 · 핫픽스 SLO 15분 |
| 전환 방식 | Kafka consumer 경계 점진 전환 + shadow 병행 검증 + 운영 기준 Phase 게이트 |
댓글
아직 댓글이 없어요. 첫 댓글을 남겨보세요!
★이 강의 후기
후기 남기기아직 이 강의에 대한 후기가 없어요.