고객의 목소리를 한눈에! — 데이터 파이프라인 편

IMWEB tech
imweb tech
Published in
6 min readNov 30, 2023

안녕하세요, 데이터 큐브팀의 데이터 엔지니어 허준혁입니다. 저희 팀은 아임웹 서비스에서 발생하는 데이터를 신속하고 효율적으로 관리하여 사용자들이 쉽게 접근할 수 있도록 데이터 인프라와 문화를 구축하는 데 주력해 왔습니다. 현재 저희는 다양한 데이터 파이프라인을 구축하고 운영 중이며, 이 중 VoC(Voice of Customer) 데이터 파이프라인에 대해 자세히 소개하고자 합니다.

요구사항

  1. 채널톡 문의 데이터 확보
  2. 데이터 전처리 및 통합
  3. 지속적인 데이터 업데이트를 위한 파이프라인 구축

목표

  1. VoC 대시보드 데이터 파이프라인 구축: 주요 목표는 VoC 대시보드에 필요한 데이터를 확보하고 전처리하는 파이프라인을 구축하는 것입니다. 이 파이프라인은 채널톡을 통해 유입되는 고객 문의 데이터를 수집, 정제, 통합하여 대시보드에서 사용할 수 있도록 데이터를 준비합니다.
  2. 정기적인 데이터 업데이트: 구축된 데이터 파이프라인은 일정 시간마다 자동으로 실행되도록 설정합니다. 이는 VoC 대시보드가 항상 최신 데이터로 업데이트되어 실시간 피드백과 모니터링이 가능하도록 보장하기 위함입니다. 이렇게 빈번한 업데이트는 데이터를 최신으로 유지하고, 신속한 의사결정 및 대응을 가능하게 합니다.

VoC 데이터 파이프라인 로드맵

Figure 1. VoC 데이터 파이프라인 로드맵

과정

VoC 데이터 파이프라인은 크게 두 단계로 구성되었습니다: 원천 데이터 수집 및 가공

채널톡 OpenAPI를 통한 채널톡 원천 데이터 수집

채널톡에서 오는 고객 문의 데이터를 효율적으로 관리하는 방법에 대해 설명해 드리겠습니다. 우선, 채널톡의 OpenAPI를 통해 필요한 데이터를 수집합니다. 이 과정에서 ‘channel’이라는 클래스를 만들어 각 API 요청마다 인스턴스를 생성하는 방식으로 구조를 설정했습니다.

데이터 수집 과정은 자동화를 위해 Apache Airflow를 사용해 구성했습니다. 이를 통해 필요한 스크립트들이 자동으로 실행되도록 배치 작업을 설정하였습니다.

Figure 2. 수집 스크립트 import

채널톡의 요청량 제한 정책 적용

채널톡의 요청량 제한 정책과 그 적용 방법에 대해 설명하겠습니다. 채널톡은 효율적인 데이터 관리와 시스템 안정성을 위해 특정 요청량 제한 정책을 채택하고 있습니다. 이 정책은 ‘토큰 버킷 알고리즘’을 기반으로 합니다. 이해를 돕기 위해 간단히 요약해보겠습니다:

  1. 토큰 버킷 알고리즘: 채널톡의 요청량 제한은 토큰 버킷 알고리즘에 따라 운영됩니다. 이는 각 요청을 보낼 때마다 토큰이 필요하며, 각 토큰은 최대 요청 용량을 가지고 있습니다.
  2. 개별 채널 관리: 토큰 버킷은 각각의 채널(예: 아임웹 채널) 단위로 관리됩니다.
  3. 초당 최대 요청 수 제한: 토큰 버킷에는 초당 최대 요청 수의 제한이 있으며, 이는 초 단위로 재설정됩니다.
  4. Endpoint 그룹별 토큰 할당: 각 endpoint 그룹마다 별도의 토큰 버킷이 할당됩니다. 현재 두 가지 그룹이 있으며, 토큰 버킷 용량은 다음과 같습니다:
  • GET /open/{v4,v5}/user-chats API: 100개의 토큰
  • 나머지 API: 1000개의 토큰
Figure 3. 요청량 제한 적용 메소드
  • 헤더 정보 활용: API 요청 시 반환되는 헤더 정보에는 초당 최대 요청 제한 수, 잔여 요청 수, 다음 리필 시간 등이 포함됩니다.
  • 요청 수 임계값 설정: 잔여 요청 가능 수가 전체 제한의 10% 미만일 경우, 다음 리필 시간까지 요청을 보내지 않고 기다립니다. 예를 들어, 전체 제한이 1000번이면 잔여 요청 가능 수가 99 이하일 때 다음 리필까지 대기합니다.

데이터브릭스 클러스터를 활용한 S3 데이터 통합 및 가공

  1. 데이터 통합: Structured Streaming을 통한 S3 데이터 통합
  • S3에 저장된 원천 데이터는 데이터브릭스 클러스터로 통합되는데, 이 과정에서 Apache Spark의 Structured Streaming API를 활용합니다.
  • Structured Streaming은 실시간 데이터 스트리밍 애플리케이션 구축을 위해 개발된 고급 스트리밍 API입니다.
  • 이 API의 사용 이유는 그 편의성과 일관성에 있습니다. 스트리밍 처리와 배치 처리를 유사한 방식으로 코딩할 수 있게 해주며, 데이터를 쉽게 처리할 수 있는 DataFrame 및 Dataset API를 제공합니다.
Figure 4. Spark Structured Streaming문 예시
  • 일정 시간마다 S3에 증분적으로 적재되는 데이터는 Structured Streaming을 활용해 checkpoint를 설정, 마지막으로 수집된 데이터 이후의 새로운 데이터만을 수집합니다. 이는 데이터 처리량 감소와 파이프라인 실행 시간을 절반 이상 줄이는 효과를 가져왔습니다.
Figure 5. 배치 작업 시간 UI

2. 데이터 가공: Spark SQL과 DataFrame API 활용한 데이터 가공

  • 데이터브릭스 내에서 통합된 데이터는 Spark SQL API와 DataFrame API를 사용하여 가공됩니다.
  • Spark SQL API는 관계형 데이터를 쿼리하는 데 중요한 역할을 하며, 사용자에게 전통적인 데이터베이스 시스템과 유사한 쿼리 방식을 제공합니다.
  • DataFrame API는 이름이 지정된 컬럼으로 구성된 분산 데이터 컬렉션을 제공하여, 관계형 데이터베이스의 테이블처럼 데이터를 조작할 수 있게 해줍니다.
Figure 6. Spark SQL 문 예시

3. 배치 작업 스케줄링 및 실행

  • 데이터브릭스의 batch job scheduler를 사용하여 데이터 통합과 가공 작업을 일정 주기로 자동 실행합니다.
  • 데이터브릭스 요금 정책을 고려하여, 작업은 평일에 실행되도록 설정하였습니다.

마무리하며

이 파이프라인을 구축하면서 많은 시행착오들이 있었습니다. 하지만 구축 끝에 이 파이프라인을 통하여 멋있는 대시보드가 구축이 되고, 해당 대시보드가 CX팀에서 유용하게 사용이 되고 있다는 긍정적인 피드백을 받았을 때 뿌듯함을 느꼈습니다. 작업을 하는 동안 옆에서 기다려 준 데이터큐브 팀원들에게 감사드립니다 🙂 앞으로도 아임웹에서 다양한 데이터 프로덕트가 나올 수 있도록 파이프라인 구축에 열심을 다 할 것이며, 이로 인하여 아임웹이 데이터 기반으로 좋은 선택과 결정들을 내리고 앞으로 나아갈 수 있도록 기대합니다 🔥

--

--