KEDA를 활용한 로그 시스템 오토스케일링 경험담

우아한형제들은 KEDA를 활용하여 100만 TPS의 로그 시스템에 오토스케일링을 성공적으로 적용하였습니다. 이 경험을 통해 로그 처리의 변동성을 관리하며 비용 효율성을 높이는데 기여하게 되었습니다. 본 문서에서는 KEDA 도입 과정과 실제 운영 사례를 통한 운영 환경 개선 방안에 대해 설명합니다. KEDA 적용을 통한 로그 시스템 아키텍처 변화 KEDA를 도입하기 전, 우아한형제들은 기존 HPA를 이용하여 로그 시스템의 오토스케일링을 시도했습니다. 하지만 평균 CPU 및 메모리 사용량을 기준으로 스케일링이 진행되면서 한계에 봉착하게 되었습니다. KEDA의 도입 이후, 이벤트 기반으로 스케일링을 설정함으로써, 로그 시스템의 아키텍처를 유연하게 설계할 수 있었습니다. KEDA는 다양한 이벤트 소스를 지원하여 로그 시스템의 특성에 맞는 스케일링 기준을 설정할 수 있게 해줍니다. 예를 들어, Fluentd의 버퍼 사용률을 기준으로 스케일링 트리거를 설정함으로써, 시스템이 실제로 부하를 받기 시작하기 전에 프로세스를 조정할 수 있었습니다. 이는 로그 처리의 안정성을 크게 향상시켰고, 유연한 리소스 관리로 비용을 줄일 수 있는 기반을 마련하였습니다. 이러한 변화는 로그 시스템 아키텍처의 효율성을 높이고, 운영 환경을 개선하는 데에 결정적인 역할을 했습니다. 다양한 메트릭을 조합하여 스케일링 미세 조정이 가능해짐으로써, 시스템 부하가 예상되는 피크 시간대에도 원활하게 처리할 수 있는 역량을 갖추게 되었습니다. KEDA 도입을 통한 메트릭 기반 스케일링 효과 KEDA의 도입은 로그 시스템의 메트릭 기반 스케일링을 가능하게 하였습니다. 기존 HPA와 달리, KEDA는 프로메테우스를 이용해 다양한 지표를 직접적으로 활용할 수 있게 해줍니다. 이를 통해 CPU 및 메모리 사용량 외에도 Fluentd 버퍼와 같은 중요한 메트릭을 스케일링 기준으로 설정할 수 있었습니다. Fluentd의 버퍼가 일정 사용률을 초과할 경우 이를 위기 상황으로 간주하여 스케일 아웃을...

Kotlin으로 전환한 Java 레거시 시스템 개선 사례




2025년 상반기, 배민페이 플랫폼팀은 Java 기반의 레거시 시스템을 Kotlin으로 전환하는 대규모 프로젝트를 수행했습니다. 이 과정에서 기술적 이슈를 해결하고, 팀의 개발 언어 통일과 함께 생산성을 높이는 것을 목표로 했습니다. 이번 글에서는 Kotlin으로의 전환이 어떻게 이루어졌고, 어떤 결과를 가져왔는지에 대해 자세히 살펴보겠습니다.

Java 레거시 시스템의 전환 전략

Kotlin으로의 전환은 단순한 언어 변경을 넘어 팀의 전반적인 개발 프로세스와 코드 품질에 긍정적인 영향을 미쳤습니다. 우선, 시스템의 유지보수를 개선하기 위해 처음으로 도입한 전략은 테스트 코드부터 Kotlin으로 전환하는 것이었습니다. 테스트 코드는 실제 운영 로직에 직접적인 영향을 주지 않으면서도 Kotlin 문법을 실험해보기 안전한 영역이기 때문입니다. 이 단계에서는 기존 테스트 코드의 커버리지를 점검하여, 커버리지가 부족한 부분을 보완하기 위한 작업도 동시에 진행했습니다. 또한, 테스트 스타일을 통일하기 위해 Kotest와 MockK를 도입했습니다. 이는 테스트 코드의 가독성과 작성 경험을 향상시켜 팀원 간의 협업 효율성을 높이는 데 기여했습니다. 배포 전략에서도 변화가 있었습니다. 기능 단위로 잘게 나누어 점진적으로 배포하는 방식은 장애 가능성을 최소화하고, 코드 리뷰 및 QA 과정을 간소화하는 데 도움을 주었습니다. 이러한 전략적 접근은 프로젝트 수행 중 단 한 번의 장애 없이 진행할 수 있던 요인이 되었습니다.

프로그래밍 언어 변경으로 인한 기술적 이슈

전환 과정에서 Java 코드를 Kotlin으로 변환할 때 다양한 기술적 이슈들이 발생하기 마련입니다. 유의미한 코드 품질 개선을 위해 가장 주의 깊게 다뤄야 하는 부분 중 하나는 null 처리였습니다. Java에서 모든 객체는 null이 될 수 있는 반면, Kotlin은 nullable과 non-nullable 타입을 명확히 구분하는 구조입니다. 이를 점검하며 수작업으로 코드 수정 진행을 하였고, 이 과정에서 발생할 수 있는 오류를 방지하기 위해 null 체크 작업을 필수적으로 수행했습니다. 이 외에도 Lombok을 데이터를 공통적으로 사용하는 방식으로 변환해야 했습니다. Lombok에서 제공하는 @Getter, @Setter와 같은 어노테이션은 Kotlin에서는 불필요하므로, 이를 간단한 data class로 재작성했습니다. 이는 코드의 복잡도를 줄이고 가독성을 높이는 데 기여했습니다. 나아가, Java의 Stream API를 제거하고 Kotlin의 컬렉션 함수로 변경함으로써 코드 흐름을 더욱 간결하게 만들 수 있었습니다. 이러한 일련의 과정들은 팀이 Kotlin의 특성을 최대한 활용하도록 도와주었습니다.

안정적인 전환과 팀 문화의 발전

Kotlin 전환 프로젝트는 단순히 언어를 변경한 것에 그치지 않고, 개발 문화에서도 긍정적인 변화를 조성하였습니다. 전환되는 동안 약 82개의 작업 티켓이 처리되었고, 10회에 걸친 운영 배포가 이뤄졌지만, 그 과정에서 단 한 건의 장애도 발생하지 않았습니다. 이러한 결과는 팀 내 개발 표준을 확립하는 데 큰 도움이 되었습니다. 기술적 일관성이 확보됨에 따라 협업 과정이 한층 원활해졌습니다. Kotlin으로 통일된 개발 언어는 코드 리뷰 및 신규 개발 시 진입 장벽을 낮췄고, 팀원 간의 소통을 강화했습니다. 더불어, 테스트와 배포 전략을 함께 설계한 경험은 팀원들에게 변화를 함께 설계하고 논의하는 협업 문화를 자연스럽게 자리잡게 했습니다. 올해의 Kotlin 전환 경험은 앞으로 유사한 프로젝트를 진행하는 데 자신감을 주었습니다. 안정성을 우선으로 하면서도 점진적으로 추진한 이번 전환은 팀의 미래에 대한 기반을 다지는 계기가 되었음을 자부합니다.

이번 Kotlin 전환 프로젝트는 Java 기반 레거시 시스템을 개선하기 위한 다각적인 접근의 결과물로 요약됩니다. 사용자는 향상된 코드 품질과 안정성을 직접적으로 느낄 수 있으며, 다음 단계로는 이러한 경험을 바탕으로 지속적인 기술 개선과 새로운 도전에 맞서겠다는 의지를 가지고 있습니다. 이는 결국 팀의 기술 자산을 더욱 풍부하게 할 것입니다.

이 블로그의 인기 게시물

우아한형제들의 실시간 알림 혁신: SSE(Server-Sent Events)로 이룬 효율성과 안정성

물어보새의 진화와 지식 공유 확장

우아한 디버깅 툴 개선으로 QA 업무 효율화