프로그래머스 데브코스 데이터 엔지니어링[5기] Final Project
Team: S4tify | 2025.02.24 ~ 2025.03.20
- 프로젝트 개요
- 프로젝트 아키텍처
- Infra 구성
- 데이터 파이프라인
- 결과물(대시보드)
- 프로젝트 회고
- 실시간 음악 스트리밍 데이터와 국내 및 국외 차트 데이터를 수집
- 수집한 데이터를 처리하여 국내외 차트 및 스트리밍 데이터와 음악 메타 정보를 적재하는 데이터 파이프라인 구축
- 실시간 음악 소비 패턴 분석의 필요성
- 현재 음악 산업은 실시간 데이터 분석이 중요한 요소로 작용하고 있음
- 국내외 음악 플랫폼 사이트의 데이터가 빠르게 변동되며, 음악 산업의 의사결정에도 영향을 미침
- 대용량 데이터의 효과적인 처리 및 분석 요구 증가
- 일일 스트리밍 이벤트가 대용량 발생하며, 이를 분석하기 위한 대용량 데이터 처리가 가능한 분산 처리 시스템 이 필수적
- 기존의 정적 데이터 분석 방식이 아닌 실시간 스트리밍 데이터 처리 및 적재가 가능한 시스템을 요구
- 비즈니스 실무에서 활용 가능한 데이터 파이프라인 구축
- 실제 기업 환경에서 실시간 데이터 분석을 활용하여 트렌드 예측 및 마케팅 전략을 최적화하는 것이 중요
- 클라우드 및 빅데이터 기술을 결합한 ETL/ELT 파이프라인을 구축
- 실무에서도 적용할 수 있는 데이터 처리 및 분석 구조로 설계
윤여준: 시스템 아키텍처 설계, AWS 인프라 구축, EC2 서버 개발, 개발 환경 통합부상혁: 스트리밍 데이터 생성과 수집 및 처리, 인프라 구성, 데이터 시각화신예린: spotify 웹 크롤링 및 api를 활용한 ETL 파이프라인 구축 및 ELT 파이프라인 구축, 데이터 시각화윤병훈: 데이터 플로우 아키텍처 설계, 국내 차트 데이터 ETL 파이프라인 구축 및 ELT 파이프라인 구축, 데이터 시각화
- PR 트리거 : PR이 main 브랜치로 병합될 때 자동실행
- Python 환경 설정 :Python 3.10 환경을 자동으로 설정
- 코드 포맷팅 수행 : black, isort, autopop8을 실행하여 코드스타일 정리
- 자동 커밋&푸시 : 변경 사항이 있을 경우 PR 브랜치에 자동 커밋 & 푸시
국외 차트 데이터
데이터 수집
- Spotify Website
- Spotify Artist API
- Spotify Artist Track API
데이터 변환
- 수집된 데이터를 모두 CSV 형식으로 변환하여 저장
+ Spotify Global Top 50 chart의 경우 1위부터 50위까지 순차적 저장 → 랭킹 컬럼 추가
+ potify Global Top 50 Chart의 artist 컬럼과 artist info의 genre 컬럼은 리스트 형태로 저장
데이터 적재
- CSV로 변환된 데이터를 AWS S3 Bucket에 저장
+ 기존 파일이 있을 경우 덮어쓰기 수행
국내 차트 데이터
데이터 수집
- 곡 제목, 아티스트, 순위 등 핵심 데이터 확보
- Spotify API를 활용하여 아티스트의 장르 정보를 검색 및 추가
- DATE 컬럼을 추가하여 데이터 수집 날짜 기록
데이터 변환
- JSON 형식으로 저장된 데이터를 CSV 형식으로 변환
- csv.writer를 활용하여 모든 데이터를 자동으로 따옴표 처리하여 저장
- 장르 데이터는 리스트 형태로 저장
- DAG 실행 날짜를 컬럼에 추가
데이터 적재
- S3Hook을 활용하여 변환된 CSV 파일을 지정된 S3 버킷에 업로드
- 기존 파일이 존재할 경우, 덮어쓰기 수행
스트리밍 데이터
데이터 수집
- Eventsim을 사용하여 음악 스트리밍 데이터 생성
+ 음악 스트리밍 웹 사이트(Spotify)의 사용자 데이터 시뮬레이션
+ 실제 데이터와 유사한 이벤트 로그를 지정된 기간만큼 생성 가능
데이터 변환
- Kafka Topic 생성: Kafka Admin Client를 사용해 지정된 토픽이 없으면 새로 생성
- Eventsim 실행 대기: Eventsim이 동작하는 컨테이너가 실행될 때 까지 확인하고, 실행되면 해당 컨테이너 ID 추적
- Docker 컨테이너 로그 스트리밍: Eventsim이 실시간으로 생성한 로그 데이터 중 JSON 데이터만 필터링
- Kafka Broker로 전송: 필터링된 JSON 데이터를 Kafka Producer를 통해 Kafka Broker로 전송
데이터 적재
- S3 Sink Connector 설정 파일 생성 및 Kafka Connect API를 통해 S3 Sink Connector 등록
- Kafka에 적재된 데이터를 S3 버킷으로 자동 저장
국외 차트 데이터
데이터 수집
- S3 Bucket에 저장 되어 있는 CSV 파일을 Spark Dataframe으로 read
+ 일관된 형식으로 읽어올 수 있도록 각 CSV 파일에 형식에 맞춘 데이터 스키마 정의 → 데이터 형식 명시
+ Array로 저장된 컬럼의 경우 문자열로 변환하여 읽어온 뒤 다시 Array로 변경
데이터 변환
- 중복 데이터 제거, 테이블 join, 날짜 데이터 컬럼 추가
- 파이썬 스크립트를 통해 join된 Dataframe 정보를 기반, 노래 장르 API 요청 및 컬럼 추가
데이터 적재
- 테이블을 적재하기 전 해당 테이블이 있는지 확인, 만약 없다면 테이블 생성 진행
- write_pandas함수를 사용하여 snwoflake 테이블에 적재
국내 차트 데이터
데이터 수집
- S3 버킷에서 데이터를 읽어 Spark DataFrame API로 변환 및 처리
- 여러 차트 소스를 병합, genre, date 등의 추가 컬럼 포함
데이터 변환
- Spark의 DataFrame API를 활용하여 CSV 파일로 저장된 차트 데이터를 읽고, 필요한 변환 작업을 수행
- 테이블 존재 여부 확인 후 필요 시 생성
- 컬럼별 적절한 데이터 유형 지정 및 SQL 쿼리 작성
데이터 적재
- 변환된 데이터를 Snowflake의 RAW_DATA 스키마에 삽입
- 문자열 및 NULL 값 처리로 데이터 정합성 유지
스트리밍 데이터
데이터 수집
- Airflow의 SparkSubmitOperator를 활용해 S3에서 지정된 날짜의 이벤트 데이터 동적 추출
데이터 변환
- 필요한 컬럼(song, artist, location 등)만 유지하고, 불필요한 이벤트 제거
- 결측값(NULL) 처리 및 데이터 정제
데이터 적재
- Snowflake 임시 테이블에 데이터 저장 후 MERGE INTO를 통해 UPSERT 수행
- 기존 데이터가 존재하면 업데이트, 없으면 신규 삽입
리소스 정리
- MERGE 완료 후 임시 테이블 제거하여 불필요한 리소스 정리
국외 차트 데이터
데이터 수집
- Snowflake에 저장되어 있는 테이블을 Spark Dataframe으로 read
+ format을 snowflak로 지정하여 spark로 테이블을 load
데이터 변환
- filter함수를 사용하여 오늘 날짜의 데이터만 read
- explode 함수를 사용, array 형식이었던 데이터를 펼치고 group by 및 count 진행
- date_time 컬럼 추가
데이터 적재
- 테이블을 적재하기 전 해당 테이블이 있는지 확인, 만약 없다면 테이블 생성 진행
- spark-snowflake connector를 사용하여 생성한 spark dataframe을 snowflake 테이블에 적재
국내 차트 데이터
데이터 수집
- RAW_DATA.music_charts 테이블에서 최신 데이터 필터링
- 1분 대기 시간 설정으로 안정적인 데이터 적재 보장
- RAW_DATA 스키마에서 데이터를 가져와 ANALYTICS 스키마로 변환 및 저장
데이터 변환
- 최신 차트 데이터를 정제하고 장르·아티스트·신규 진입 곡 트렌드 분석
- 순위 변동·1위 곡 유지 기간·상위 10위 곡 안정성 평가 등 차트 흐름 분석
- 분석 결과를 ANALYTICS 스키마에 저장하여 비즈니스 인사이트 제공
데이터 적재
- 분석 결과를 ANALYTICS 스키마에 저장
- Preset.io 등 대시보드 툴을 활용한 시각화 및 보고서 작성
스트리밍 데이터
데이터 수집
- TriggerDagRunOperator를 사용하여 eventsim_ETL DAG 실행
- Snowflake EVENTSIM_LOG 테이블에서 데이터를 읽어 Spark DataFrame으로 변환
데이터 변환
- 노래별·아티스트별 재생 횟수 집계 (groupBy(), count(), orderBy())
- 컬럼명 변경 및 정렬하여 분석용 데이터 생성
데이터 적재
- 변환된 데이터를 Snowflake EVENTSIM_SONG_COUNTS 테이블에 덮어쓰기
- Kafka Connect를 사용하여 Kafka Consumer를 개발하는 부담을 줄이고, 보다 안정적인 데이터 적재 환경을 조성
- Airflow를 활용하여 스트리밍 데이터와 차트 데이터를 자동으로 수집, 변환, 적재하는 ETL/ELT 파이프라인을 구축
- 기존 Consumer 기반 적재 방식에서 Kafka Connect 기반의 적재방식으로 변경하여 Snowflake로 손쉽게 확장 가능하도록 개선
- S3 → Snowflake → Preset까지 이어지는 단계적인 데이터 적재 구조를 설계하여 다양한 데이터 활용 가능성 확보
- GitHub Actions 및 Docker를 활용하여 CI/CD 파이프라인을 구축, 개발된 DAG 및 Spark Job이 자동으로 실행되도록 설정
- 팀 내 코드 리뷰 및 역할 분배를 통해 체계적인 협업 진행
- Kafka, Spark, Snowflake 등의 빅데이터 기술을 직접 사용하며 대규모 데이터 처리 및 운영 경험을 쌓을 수 있었음
- 데이터 엔지니어링 및 데이터 아키텍처 설계에 대한 이해도를 높이는 계기가 됨
- 실시간으로 수집된 스트리밍 데이터를 기반으로 어떤 아티스트와 곡이 가장 많이 재생되는지 등의 데이터 분석
- 사용자의 청취 패턴을 기반으로 개인 맞춤형 음악 추천 모델 개발 가능
- 예측 분석을 활용하여 다음 주의 음악 차트를 미리 예측하는 AI 기반 서비스로 확장 가능
- 국내외 음악 차트 데이터를 종합하여 현재 가장 핫한 아티스트 및 트랙을 분석
- 특정 아티스트의 시간대 및 플랫폼 별 인기 트렌드 등을 분석하여 마케팅 전략 수립 가능
- 신곡이 발매된 후의 초기 반응을 실시간으로 분석하여 마케팅 효과를 최적화
- 특정 아티스트의 곡이 어떤 국가, 지역에서 가장 많이 재생되고 있는지 시각화하여 글로벌 시장에서의 반응 분석
- 각 플랫폼의 차트 데이터를 비교하여, 어떤 서비스에서 특정 장르가 더 인기 있는지 데이터 기반의 평가 가능
- 데이터 분석 통해 음악 제작사 및 음원 유통사가 시장 전략을 수립할 수 있도록 인사이트 제공
- 최신 클라우드 및 빅데이터 기술을 활용하여 대규모 실시간 데이터 처리 아키텍처를 설계
- 데이터 수집(ETL), 적재, 분석(ELT)까지 자동화된 파이프라인을 구축하여 기업에서도 바로 활용할 수 있도록 구성
- 실시간 대시보드를 통해 비즈니스 의사결정을 위한 데이터 시각화 가능
- 초기 기획 단계에서 Spark ML을 활용한 개인화 음악 추천 시스템 구축이 예정되어 있었으나, 일정 및 리소스 부족으로 구현실패
- 향후 Spark ML 또는 Snowflake ML을 활용하여 사용자의 음악 감상 패턴을 분석하고
- 협업 필터링(Collaborative Filtering) 또는 콘텐츠 기반 필터링(Content-Based Filtering) 기법을 적용한 추천 시스템 구현
- 현재는 Snowflake에 적재된 데이터를 SQL 기반으로만 분석 가능
- 이후에는 BI 도구(Superset, Power BI 등) 를 연계하여 대시보드를 구축
- 외부 연동을 위한 API 엔드포인트 제공을 통해 다른 서비스와의 연계 가능성을 확대할 필요가 있음
- Eventsim을 통한 현재 테스트 데이터는 규모가 제한적
- 실제 운영 환경에서 발생할 수 있는 수백만 건 이상의 데이터를 다룰 준비가 부족
- Kafka의 파티셔닝 전략, S3 적재 효율성, Snowflake의 쿼리 성능 및 파티셔닝 전략을 포함한 성능 테스트 및 최적화 작업이 필요
- Airflow DAG 실패, Kafka/Snowflake 성능 이상 등의 운영 오류 발생 시 자동 재시도 및 Slack 알림 연동 필요
- Kafka, Airflow 등의 로그와 상태를 모니터링하기 위해 Prometheus + Grafana 기반의 실시간 모니터링 시스템 도입이 요구됨










