비즈스프링에서 현재 진행중인 애드몬스터 쇼츠 광고시스템을 기술적으로 살펴보려고 합니다.
지난 시간에는 쇼츠 광고시스템 중 광고 송출에 대한 내용에 대해 살펴보았었는데요, 마지막으로 광고 성과의 정제 및 집계에 대한 내용에 관해 기술적 관점으로 살펴보겠습니다.
이전 글 보기: 비즈스프링 쇼츠 광고시스템 기술적 관점으로 살펴보기 (2)
해당 기술들은 이전 게시글에 설명이 있으니 해당 게시글을 확인해주세요.
쇼츠 광고시스템 광고의 송출 ~ 리포트 데이터 생성 과정은 다음과 같습니다.
- 노출/잔액요건에 따른 광고 소재 선별 및 출력
- 광고 조회부터 리워드 취득까지의 행동 데이터 저장
- 광고 조회 혹은 랜딩 후 데이터 원천 데이터 저장
- 원천 데이터를 이용하여 리포트 데이터 집계 및 저장
이 과정에 대해 기술적으로 살펴보겠습니다.
노출/잔액요건에 따른 광고 소재 선별 및 출력
광고 소재의 집합인 광고 그룹에는 타겟 관리가 가능합니다.
예를 들어서, A 광고 그룹에 소속되는 광고의 경우 모든 지역, 10 ~ 60대, 안드로이드 OS 사용자에게만 광고가 출력될 수 있도록 설정할 수 있습니다.

사용자에게 보여 줄 광고를 선별하고 광고 페이지에 출력하기 위해 광고 소재의 데이터가 필요합니다.
일반적으로는 기존 데이터와 동일하게 관계형 DB에 저장 및 조회를 하면 되지만, 불특정 다수를 대상으로 출력하는 광고의 특성 상 광고의 개수가 많아질수록, 또 사용자가 많아질수록 데이터를 생성 및 조회를 하는 데 오랜 시간이 걸릴 수 밖에 없습니다.
또, 동시에 많은 요청을 받게 되면 Table 조회를 위해 Lock이 걸리고, Lock이 걸린 사이에 소재 추가, 수정 혹은 삭제 시 반영이 되지 않는 등 문제가 발생할 수 있습니다.
이를 해결하기 위해 다수의 데이터를 저장 및 조회하는 것에 특화된 Elasticsearch에 광고 소재의 정보를 저장하고 있습니다.

“hits” : [ |
위와 같이 소재의 정보(소재명, 소재ID, 유튜브 쇼츠 ID, 랜딩 URL 등)과 광고 송출 및 재생에 필요한 데이터를 모두 Elasticsearch에 적재 하고 사용함으로써 트래픽 과부하 방지 및 검색 속도를 향상을 통해 빠르게 광고 목록을 송출 할 수 있습니다.

출력된 광고 조회 및 리워드 획득 시에도 Elasticsearch에서 해당 소재에 대한 데이터를 조회하여 광고 소재의 사용 여부와 같은 정합성을 확인합니다.
광고 조회부터 리워드 취득까지의 행동 데이터 저장
사용자는 광고 목록을 확인하게 되고, 이 중에 특정 광고를 시청하게 될 것 입니다. 그리고 해당 광고 시청으로 제공되는 리워드 받기 버튼을 눌러 랜딩 페이지로 이동해 리워드를 받게 됩니다. 그렇다면 이러한 단계를 어떻게 저장할까요?
바로 스크립트를 통하여 액션 데이터를 저장한 뒤, 집계에 사용하게 됩니다.
광고 클릭/재생, 리워드 클릭 시 각 행동에 맞는 Event Type(이벤트 종류)가 생성됩니다.
- 클릭: click
- 재생: playing
- 리워드: reward
각 액션을 저장하는 데이터는 다음과 같은 형식으로 되어 있습니다.
{ “part_dd” : 2, “event_date” : “2025-04-02T06:02:02.000Z”, “event_timestamp” : 1743573722056, “event_type” : “view”, “platform” : “android”, “user_id” : “queen001”, “properties” : “{\”pack_name\”:\”kr.co.nasmedia.biorhythm\”,\”carrier\”:\”skt\”,\”postback\”:\”bizspring.co.kr\”, \”app_id\”:\”com.kbcard.cxh.appcard\”,\”device\”:\”pc\”,\”user_agent\”:\”Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/134.0.0.0 Safari\/537.36\”}”, …, “client_no” : 1, “account_no” : 1, “campaign_id” : “cmp-20-000000000001”, “adgroup_id” : “grp-20-000000000001”, “creative_id” : “ads-20-000000000001”, “items” : “{}”
} |
이벤트가 발생한 날짜와 시간, 종류, 해당 광고의 정보(캠페인, 광고그룹, 소재), 최종적으로 랜딩될 페이지의 정보 등 각 액션을 처리하는 데 필요한 데이터들을 함께 저장하고 있습니다.
각 이벤트 종류와 해당 이벤트를 적재하는데 필요한 데이터를 합쳐서 Redis와 실시간 DB에 저장을 하게 됩니다.
Redis는 광고 시청 및 리워드 획득 여부를 저장하기 위해 해당 데이터를 사용하고, 실시간 DB에도 동일한 데이터를 저장하여 집계 데이터를 생성하는 데 사용합니다.
동일한 사용자가 광고를 재조회 시, Redis에서 해당 사용자의 데이터를 추출한 후 사용자가 시청한 광고 목록에서 리워드를 얻으려는 광고 데이터가 존재하는 지 확인하여 리워드를 받아도 되는 조건인지 확인합니다.
그렇다면 해당 광고를 12시간마다 리워드를 얻을 수 있게 설정하려면 어떻게 해야 할까요?
이는 Redis에서 제공하는 ttl을 이용하여 특정 시간이 지나면 데이터를 삭제함으로써 리워드를 받아도 되는 조건에 부합할 수 있습니다.
광고 조회 혹은 랜딩 후 데이터 원천 데이터 저장
광고 조회, 랜딩 시 위 설명처럼 이벤트 종류와 해당 이벤트를 적재하는데 필요한 데이터를 합쳐 DB에 저장합니다.
MariaDB ColumnStore
현재 비즈스프링 숏츠 광고플랫폼에는 MariaDB ColumnStore라는 DB를 사용하고 있습니다.

MariaDB ColumnStore란?
MariaDB ColumnStore는 대규모 병렬 분산 데이터 아키텍처를 활용하는 컬럼형 스토리지 엔진입니다.
페타바이트 규모의 데이터를 처리하기 위한 빅데이터 확장, 선형 확장성 및 분석 쿼리에 대한 실시간 응답을 통한 뛰어난 성능을 위해 설계되었습니다. 컬럼형 스토리지, 압축, 적시 프로젝션, 수평 및 수직 분할의 I/O 이점을 활용하여 대규모 데이터 세트를 분석할 때 엄청난 성능을 제공합니다.

MariaDB의 경우 각 행의 모든 열이 함께 저장되는 Row-Oriented DB인 것에 비해 MariaDB ColumnStore의 경우 모든 데이터를 열 단위로 저장하는 Column-Oriented DB인 것이 특징입니다.
열 단위로 데이터를 저장하기 때문에 비슷한 내용의 데이터가 있는 경우 데이터를 압축이 가능합니다.
또, 이러한 특성으로 인하여 여러 개의 클러스터에 각각의 데이터를 별도로 저장할 수 있고, 조회 시에 필요한 컬럼 데이터만 가져올 수 있기 때문에 Row-Oriented DB보다 조회 수가 월등히 빠른 장점이 있습니다.
리포트 데이터 생성
광고주의 경우 자신이 설정한 광고가 얼마나 노출 되었는지, 클릭은 얼마인지 등 해당 광고의 리포트를 조회할 수 있습니다. 이런 리포트 데이터를 생성하기 위해 위 과정에서 쌓아 놓은 원천 데이터를 이용하여 리포트 데이터를 생성합니다.

해당 원천 데이터를 이용하여 다음과 같이 리포트 데이터를 생성합니다.

이상으로, 애드몬스터 쇼츠 광고시스템 중 광고 송출에 필요한 내용에 대해 정리해보았습니다. 쇼츠 광고플랫폼에 대해 궁금한 점이 있다면 언제든지 문의 해주시길 바랍니다.
감사합니다.
최신 마케팅/고객 데이터 활용 사례를 받아보실 수 있습니다.