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

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

Vite CSS 우선순위 문제 해결 사례

## 서론 우아한공방은 일관된 UI/UX를 제공하기 위해 개발된 디자인 시스템으로, 이번 글에서는 Vite 환경에서 발생한 CSS 우선순위 문제를 해결한 사례를 공유하고자 합니다. 이 문제는 컴포넌트의 스타일이 의도와 다르게 나타나는 원인이 되었으며, 일관성을 유지하기 위해 여러 시행착오를 거쳤습니다. 이를 통해 Vite에서 CSS 우선순위를 관리하는 방법을 깊이 있게 살펴보겠습니다.

## Vite에서 발생한 CSS 우선순위 문제 ### Step 1: 현상 파악 우아한공방은 코어 패키지를 중심으로 운영되며, 각 패키지는 서로 다른 스타일 파일을 갖고 있습니다. 특정 컴포넌트를 추가하거나 빌드 시 발생하는 CSS 우선순위 충돌은, 주로 스타일 import 순서에 따라 발생합니다. 특히 Chip 컴포넌트에서 발생한 스타일 문제는, reset CSS와 공용 스타일이 아닌 Flex 컴포넌트의 스타일이 덮어쓰는 현상을 보여주었습니다. 이는 의도하지 않은 스타일 적용으로, 사용자의 혼란을 초래할 수 있습니다. 우아한공방에서는 이와 같은 스타일 우선순위 문제를 해결하기 위해, import 순서에 따라 클래스가 변동하는 구조를 명확히 이해할 필요가 있었습니다. 이를 위해 다양한 테스트와 분석을 수행하였고, Vite의 빌드 프로세스가 ESM import 규칙을 준수한다는 사실을 발견했습니다. 이를 통해 import 순서가 최종 style.css에 어떻게 영향을 미치는지를 명확히 이해하게 되었습니다.

### Step 2: 문제 재현과 원인 분석 정확한 원인 분석 후, Vite의 CSS 우선순위 문제를 해결하기 위한 단계로 나아갔습니다. Vite는 Core CSS Plugin을 통해 각 스타일 청크를 load하고 build 과정에서 순차적으로 결합하는 방식을 취합니다. 이러한 과정에서 import 순서가 변동되면, 최종적으로 생성되는 style.css의 순서에도 영향을 미친다는 점을 확인했습니다. 특히, VanillaExtract와 같은 CSS 모듈 방식은 각 청크가 Vite Core CSS Plugin에 의해 순차적으로 추가되기 때문에, 각 청크의 load 순서가 매우 중요하다는 사실을 깨달았습니다. 이러한 문제는 특히, 스타일이 모듈화되어 있거나 패키지 간 의존관계가 복잡한 상황에서 더 두드러지게 나타났습니다. 올바른 import 순서가 보장되지 않으면 클래스명이 중복되거나, 의도한 스타일 적용이 실패할 가능성이 높아지기 때문에, 이 문제를 해결하기 위한 방법을 포괄적으로 탐색할 필요가 있었습니다.

### Step 3: 근본적 해결책 제안 마침내 문제 해결을 위해 새로운 접근 방식을 모색했습니다. 각 스타일 청크에 뱅코멘트를 추가하여 ID를 부여하고, 해당 ID를 기준으로 우선순위를 정렬하는 두 가지 플러그인을 개발하기로 하였습니다. 이러한 방식은 기존의 import 순서에 의한 불안정성을 해소하고, 항상 같은 우선순위를 보장할 수 있습니다. 이를 통해 우아한공방의 개발자들은 코드 수정이 이루어지더라도 CSS 우선순위 문제에서 자유로워질 것입니다. 이후 구현된 BangCommentPlugin과 ReorderPlugin이 각 스타일 청크의 헤더에 뱅코멘트를 추가하고, 이를 기준으로 청크를 재정렬하는 과정을 거쳤습니다. 이로써 다양한 패키지에서 발생할 수 있는 스타일 충돌 문제 또한 효과적으로 방지하게 되었습니다. 이 경험은 CSS 우선순위 문제를 해결하는 데 실질적인 인사이트를 제공하였습니다.

## 결론 이번 글에서는 Vite에서의 CSS 우선순위 문제에 대한 원인 분석과 그 해결 과정을 자세히 살펴보았습니다. Vite의 구조와 CSS 빌드 과정에서 발생하는 이슈를 이해하고, 이를 해결하기 위한 새로운 접근 방식을 개발함으로써, 프로젝트 환경에서 문제를 성공적으로 해결하였습니다. 다음 단계로, 이제 각자가 적용한 BangCommentPlugin과 ReorderPlugin을 차별적으로 활용하여, 더욱 효율적인 CSS 관리 체계로 발전시킬 수 있을 것입니다. 또한, 이 과정에서 얻은 인사이트를 바탕으로 더 다양한 경우의 수를 고려하여 우아한공방의 디자인 시스템을 한층 더 발전시키기를 기대합니다.

이 블로그의 인기 게시물

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

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

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