해스켈(Haskell)로 200만 라인 코드, 핀테크 기업 머큐리의 생존 전략

by DD
2개월 전
조회수 12

핀테크 기업 머큐리(Mercury)는 200만 라인 규모의 해스켈(Haskell) 코드베이스를 운영하며, SVB 사태 당시 대규모 예치금 유입을 성공적으로 처리함.

해스켈(Haskell)의 타입 시스템(Type System)을 활용하여 운영 지식(Operational Knowledge)을 코드에 통합하고, 팀의 성장에 따른 지식 격차를 해소함.

안정성(Reliability) 확보를 위해 경계(Boundary) 중심의 설계를 강조하며, 코드의 순수성(Purity)보다는 무결성(Integrity) 유지에 집중함.

Temporal과 같은 Durable Execution Framework를 활용하여, 분산 시스템(Distributed System)의 복잡성을 관리하고, 운영 효율성을 높임.

해스켈(Haskell)의 순수성(Purity)과 경계(Boundary)의 중요성

머큐리(Mercury)는 해스켈(Haskell)의 순수성(Purity)을 언어 자체의 속성으로 보기보다는, 인터페이스(Interface)를 통해 관리해야 할 경계(Boundary)로 정의한다. 즉, 내부적으로는 mutable allocation, buffer writes, unsafe coercions 등 위험한 연산을 허용하더라도, 외부로 노출되는 인터페이스를 통해 안전성을 확보하는 것이다. 이러한 접근 방식은 코드의 가독성(Readability)을 높이고, 새로운 엔지니어가 시스템을 이해하는 데 도움을 준다. 특히, 데이터 격리 아키텍처(Data Isolation Architecture)를 통해 안전한 코드를 작성하는 것이 중요하다고 강조한다.

타입 시스템(Type System)을 활용한 운영 지식(Operational Knowledge)의 보존

머큐리(Mercury)는 해스켈(Haskell)의 타입 시스템(Type System)을 단순한 오류 방지 도구가 아닌, 운영 지식(Operational Knowledge)을 코드에 담아두는 수단으로 활용한다. 예를 들어, 트랜잭션(Transaction)과 이벤트 발행(Event Publication)의 순서를 타입 시스템을 통해 강제함으로써, 개발자가 실수로 잘못된 순서로 코드를 작성하는 것을 방지한다. 이러한 접근 방식은 팀의 지식 격차(Knowledge Gap)를 줄이고, 시스템의 안정성을 높이는 데 기여한다. 특히, 코드 리뷰(Code Review)를 통해 타입 시스템의 제약 조건을 확인하고, 코드의 무결성을 유지하는 것이 중요하다.

Temporal을 활용한 Durable Execution Framework 구축

머큐리(Mercury)는 Temporal을 사용하여 분산 시스템(Distributed System)의 복잡성을 관리하고, 운영 효율성을 높였다. Temporal은 워크플로우(Workflow)의 각 단계를 기록하고, 작업자(Worker)가 실패할 경우 자동으로 재시도(Retry) 및 복구(Recovery)를 수행한다. 이를 통해 개발팀은 분산 시스템(Distributed System)의 복잡한 로직을 직접 구현하는 대신, 비즈니스 로직에 집중할 수 있게 되었다. 특히, hs-temporal-sdk를 통해 해스켈(Haskell) 환경에서 Temporal을 더욱 효과적으로 활용하고 있다.

도메인 모델(Domain Model)과 전송 계층(Transport Layer)의 분리

머큐리(Mercury)는 도메인 모델(Domain Model)전송 계층(Transport Layer)을 분리하여, 코드의 재사용성(Reusability)과 유지보수성(Maintainability)을 높였다. 예를 들어, HTTP 상태 코드(HTTP Status Code)를 도메인 에러(Domain Error)로 변환하여, 다양한 환경(웹 핸들러, CLI, cron job 등)에서 동일한 비즈니스 로직을 사용할 수 있도록 한다. 이러한 접근 방식은 코드의 결합도(Coupling)를 줄이고, 시스템의 유연성을 높이는 데 기여한다. 특히, 멀티모달 분석(Multimodal Analysis)을 통해 다양한 입력 소스(Input Source)를 처리하는 시스템에서 유용하다.

A Couple Million Lines of Haskell: Production Engineering at Mercury