본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 06. 16:24

새벽 2시의 장애 발생에서 10배의 속도 향상까지: 우리가 Stored Procedure 감옥을 탈출한 방법

요약

레거시 SAP HANA의 복잡한 Stored Procedure 시스템을 Databricks와 PySpark로 마이그레이션하여 성능을 혁신한 사례를 다룹니다. 블랙박스 로직과 기술 부채의 위험성을 경고하며, 커서 기반의 행 단위 처리에서 집합 기반의 분산 처리로 전환하는 방법론을 제시합니다.

핵심 포인트

  • 문서화되지 않은 중첩된 Stored Procedure는 심각한 기술 부채임
  • 특정 DB 방언에 종속된 로직은 벤더 종속 및 확장성 저해의 원인
  • 커서를 제거하고 PySpark의 집합 기반 연산으로 전환 시 성능 극대화
  • 실제 사례에서 프로세스 시간을 최대 15.6배 단축하는 성과 달성

도입부: 새벽 2시의 깨우는 전화

화요일 새벽 2시였습니다. 또다시 말이죠.

너무나 익숙한 알림과 함께 제 휴대폰이 울렸습니다: “SAP HANA ETL 작업 실패 — 타임아웃 초과.” 이것은 단순한 기술적 결함이 아니었습니다. 한계까지 밀어붙여진 아키텍처의 시스템적 실패였습니다. 200개 이상의 깊게 중첩된 Stored Procedure (저장 프로시저)로 구동되는 우리의 야간 배치 프로세스는 취약한 생태계가 되어 있었습니다. 이번 달에만 벌써 세 번째로, 재무 팀은 오전 8시까지 보고서를 받지 못하게 될 것이었고, 데이터 엔지니어링 리드 (Data Engineering Lead)로서 그 책임은 온전히 제 어깨에 놓여 있었습니다.

이러한 레거시 시스템 (Legacy systems)을 관리하는 현실은, 결국 당신이 엔지니어가 아니라 고고학자가 되어간다는 것입니다. 이 프로시저들은 7년에 걸쳐 진화해 왔습니다. 이미 떠나버린 컨설턴트들이 작성했고, 문서화도 남기지 않은 채 퇴사한 개발자들이 수정해 온 것들입니다. 이를 디버깅하는 것은 기술 부채 (Technical debt)를 발굴하는 고고학적 발굴 작업처럼 느껴졌습니다. 우리의 SLA (Service Level Agreement)를 지키고(그리고 제 수면 시간을 확보하기) 위해서는, Databricks와 PySpark로 마이그레이션(Migration)해야 한다는 것을 저는 알고 있었습니다.

핵심 교훈 1: "블랙박스" 로직은 당신의 가장 큰 부채입니다

제 경험상, 레거시 SAP HANA 환경의 주요 위험은 단순히 성능 저하만이 아닙니다. 그것은 바로 "블랙박스 (Black box)" 로직이라는 실존적 위험입니다. 비즈니스 로직이 독점적인 SQLScript에 갇혀 있을 때, 그것은 부채가 됩니다. 버전 관리 (Version control)나 단위 테스트 (Unit tests)가 없다면, 회사 데이터 인텔리전스의 핵심은 검증되지 않은 채 확장 불가능한 상태가 됩니다.

이는 벤더 종속 (Vendor lock-in)이라는 "독점적 감옥"을 만듭니다. 비즈니스 로직이 특정 데이터베이스 방언 (Database dialect)에 너무 밀접하게 결합되어 있으면, 확장 능력은 값비싼 수직 확장형 (Vertically-scaled) 하드웨어의 물리적 제약에 의해 제한됩니다. 비즈니스 연속성 (Business continuity) 관점에서 볼 때, 문서화되지 않은 중첩된 로직은 단순히 짜증 나는 문제가 아니라, 경영진 사이에서 부서 전체의 입지를 위협하는 리스크입니다.

“가장 최악인 점은 무엇이었을까요? 그 누구도 더 이상 저장 프로시저 (Stored Procedure)를 진정으로 이해하지 못했다는 것입니다. 그것들은 7년에 걸쳐 진화해 왔습니다. 떠나버린 컨설턴트들이 작성하고, 문서화를 잊어버린 개발자들이 수정했으며, 너무 깊게 중첩되어 있어 디버깅 (Debugging)이 마치 고고학적 발굴 작업처럼 느껴질 정도였습니다.”

핵심 요약 2: 커서 (Cursor)를 제거하는 것이 10배 성능 향상의 열쇠입니다

가장 유의미한 성능 도약은 사고방식의 근본적인 전환, 즉 커서 (Cursor)를 없애는 것에서 비롯되었습니다. SAP HANA는 본질적으로 순차적이고 리소스 집약적인 행 단위 처리 (Row-by-row processing) 패턴에 의존하는 경우가 많습니다. PySpark의 집합 기반 연산 (Set-based operations)으로 전환함으로써, 우리는 단순히 미미한 이득을 얻은 것이 아니라 완전히 탈바꿈하는 경험을 했습니다.

수치가 이를 증명합니다. 마이그레이션 과정에서 SAP HANA 커서 (Cursor)를 사용하여 45분이 걸리던 프로세스가 단 90초로 단축되었습니다. 하지만 우리 팀에게 진정한 “아하! (aha!)” 모먼트는 가장 복잡한 프로시저였습니다. 이 프로시저는 94분에서 단 6분으로 줄어들며 15.6배의 성능 향상을 기록했습니다. 이것이 바로 순차적인 데이터베이스 실행에서 분산 처리 (Distributed processing) 사고방식으로 전환했을 때 나타나는 힘입니다.

SAP HANA 패턴PySpark 대응 방식더 빠른 이유
커서 (Cursors) 및 수동 루프 (Manual Loops)집합 기반 연산 (Set-Based Operations)클러스터 노드 전반에 걸친 분산 실행
.........

핵심 요약 3: 비용 절감은 단순한 미미한 수준이 아니라, 엄청난 규모입니다

Databricks Lakehouse를 도입한 첫 달 이후 청구 보고서를 발표했을 때, 수치는 단순히 기대치를 충족하는 수준을 넘어 CFO (최고재무책임자)와의 관계를 근본적으로 바꾸어 놓았습니다. 우리는 월간 컴퓨팅 비용을 $18,500에서 단 $3,200로 줄이며, 무려 82%라는 놀라운 비용 절감을 달성했습니다.

이는 매월 $15,300, 즉 연간 약 $183,600를 절약하는 것입니다. 이는 팀에 시니어 인력을 한 명 더 채용할 수 있는 충분한 예산입니다.

SAP HANA의 재정적 소모는 수직적 확장 (Vertical Scaling) 모델에서 비롯됩니다. 즉, 피크 부하 (Peak loads)를 처리하기 위해 유휴 상태이거나 활용도가 낮은 고사양의 비싼 노드 (Nodes) 비용을 지불해야 한다는 것입니다. Lakehouse 아키텍처 (Architecture)로 전환함으로써, 우리는 24시간 내내 피크 용량에 대한 비용을 지불하는 것을 중단했습니다. 이제 우리는 탄력적 확장 (Elastic scaling)과 비용 효율적인 클라우드 스토리지 (Cloud storage)를 활용하여, 변환 (Transformations) 과정에서 실제로 사용하는 컴퓨팅 (Compute) 자원에 대해서만 비용을 지불합니다.

핵심 요약 4: 기술적 "함정"은 NULL과 소수점의 세부 사항에 숨어 있다

이러한 전환을 계획하고 있다면, 어디에 위험 요소가 숨겨져 있는지 정확히 말씀드리겠습니다. 성능 향상은 매우 매혹적이지만, 규율이 없다면 기술적인 미묘한 차이들이 데이터 무결성 (Data integrity)을 해칠 수 있습니다.

  • NULL 집계 (NULL Aggregations): SAP HANA와 Spark는 NULL을 다루는 방식이 다릅니다. 제 경험상, 이러한 차이에 대한 철저한 검증을 건너뛰는 것은 재무 이해관계자들의 신뢰를 잃는 가장 빠른 방법입니다.
  • 소수점 정밀도 (Decimal Precision): SAP HANA는 기본적으로 더 높은 정밀도를 지원합니다. 대차대조표를 망가뜨릴 수 있는 반올림 오차를 방지하려면, PySpark의 스키마 (Schema) 수준에서 소수점을 명시적으로 캐스팅 (Cast)해야 합니다.
  • "부작용 (Side Effect)"의 악몽: 저장 프로시저 (Stored procedures)는 종종 선언된 범위를 벗어나 데이터를 수정합니다. 이는 PySpark의 함수형이며 부작용이 없는 (Side-effect-free) 프로그래밍 모델에는 생소한 개념입니다. 우리는 새로운 로직이 모든 "유령" 규칙을 포착할 수 있도록 이러한 숨겨진 동작들을 역공학 (Reverse-engineer)해야 했습니다.
  • 아키텍트 수준의 파티셔닝 (Partitioning): 자동 파티셔닝 (Auto-partitioning)에 의존하지 마세요. 제 워크로드의 경우, 높은 카디널리티 (High-cardinality)를 가진 컬럼에 대해 order_year로 파티셔닝을 수행함으로써 스캔 시간을 80% 단축했습니다.

안전성을 보장하기 위해, 우리는 전환 (Cutover) 전 일주일 동안 행 단위 (Row-for-row) 검증을 의무화했습니다. 실행 엔진 (Execution engine)은 바뀌었지만, 데이터는 100% 동일하게 유지되었습니다.

핵심 요약 5: 데이터베이스에서 개발 플랫폼으로의 전환

레거시 감옥으로부터의 진정한 "탈출"은 단순히 코드에 관한 것이 아닙니다. 그것은 엔지니어링의 엄격함 (Engineering rigor)에 관한 것입니다. 우리는 데이터베이스 중심의 세계에서 플랫폼 중심의 세계로 이동했습니다.

Databricks를 도입함으로써, 우리는 워크플로(workflow)에 CI/CD, Git 버전 관리(version control), 그리고 자동화된 단위 테스트(unit testing)를 도입했습니다. 이러한 코드베이스의 민주화는 주니어 엔지니어들이 이전에는 시니어들만의 SQLScript 지식이라는 "블랙박스(black box)" 뒤에 갇혀 있던 변환(transformations) 로직을 마침내 이해하고 수정할 수 있게 되었음을 의미합니다.

나아가, Delta Time Travel과 같은 기능은 우리의 "무죄 석방권(get out of jail free card)"이 되었습니다. 몇 시간 동안 고고학적 발굴을 하듯 데이터를 뒤지는 대신, 데이터의 이전 상태로 "타임 트래블(time travel)"하여 단 몇 분 만에 장애를 디버깅할 수 있게 된 것은 우리의 운영 속도(operational velocity)를 완전히 바꾸어 놓았습니다. 우리는 더 이상 단순히 일일 배치(daily batches)를 실행하는 것에 그치지 않고, 이제 실시간에 가까운(near real-time) 스트리밍(streaming) 준비를 마쳤습니다.

결론: 여러분의 미래 수면 시간은 이 도약에 달려 있습니다

이번 마이그레이션(migration)의 결과는 결정적이었습니다. 우리는 총 야간 ETL 실행 시간을 5시간 23분에서 단 28분으로 대폭 단축했습니다. 연간 22만 달러의 부채(liability)를 3만 8천 달러의 효율적인 고성능 자산(asset)으로 전환했습니다.

저장 프로시저(stored procedures)라는 독점적인 감옥에서 탈출함으로써, 우리는 팀에 권한을 부여하고, 데이터 무결성(data integrity)을 확보했으며, 우리의 수면 시간을 되찾았습니다. 데이터 팀은 더 이상 병목 현상(bottleneck)이 아닙니다. 우리는 회사의 엔진입니다.

여러분께 질문을 던집니다. 현재 여러분의 기술 부채(technical debt)는 관리 가능한 비용입니까, 아니면 새벽 2시에 여러분을 깨우기 위해 기다리고 있는 부채입니까? 이제는 도약을 해야 할 때일지도 모릅니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0