번개장터 CPC 광고 도입 후기 Part2

 

번개장터 / 19. 12. 18. 오후 6:24

안녕하세요. 번개장터 주식회사 엔지니어 이명휘 입니다. CPC(Cost Per Click) 광고 도입 후기 2번째 글을 시작하겠습니다. 전 포스팅에서는 번개장터가 서비스하고 있는 광고 소개를 중심으로 글을 풀어 나갔습니다. 이번 글에서는 개발을 진행하면서 사용했던 기술들과 문제사항을 위주로 상세하게 다뤄보려 합니다.

본격적으로 글을 시작하기에 앞서 참고로 말씀드릴 부분은 번개장터의 CPC 광고는 여타 대형 오픈마켓과는 지향점이 다르다는 것을 알아주셨으면 좋겠습니다. 애초에 번개장터의 디지털 광고는 섬세하고 다양한 기능보다는, 몇 번의 클릭으로 광고주가 가장 쉽고 빠르게 사용할 수 있도록 직관적인 광고를 제작하는데 초점이 맞춰져 있습니다. 이를 기반으로 기획 및 디자인이 진행되었으며, 여기서 소개하는 CPC 광고 또한 기술적으로나 기능적으로 생각하시는 것만큼 많이 부족하실 수 있으리라 생각하실 수 있습니다. 디지털 광고 업계에 종사하신다면 더욱 그렇게 느껴지실 수 있으실거라 생각합니다. 다만 이 글의 목적은 번개장터가 생소한(?) 광고를 제작함에 있어서 느꼈던 부분을 다른 분들과 나눠보자는 취지에서 글을 썼습니다. 이 부분 감안하여 봐주셨으면 감사하겠습니다.

1. 번개장터 CPC광고 소개

먼저 전체적인 광고를 소개 드린 후 세부 기능단위로 나누어 설명하도록 하겠습니다. 해당 광고는 크게 광고를 운영하는 광고주 사이드와, 광고를 이용하는 사용자(클라이언트) 사이드로 나눠서 생각해 볼 수 있습니다.

  • 광고주 사이드에서는 집행한 광고의 성과를 제공받아야 하므로 광고센터(파트너 페이지)에 대한 수요가 높아지게 됩니다. 아래 그림과 같이 특정 CPC 광고의 클릭, 노출, 비용 등에 대한 정보를 차트를 이용해 제공하고 있습니다. 다양한 기능보다는 필수적인 기능만으로 광고 집행과 상태 확인을 할 수 있는 것이 특징입니다. 이외에도 광고 응대 및 문제사항 해결을 위해서 번개장터 운영진이 사용하는 관리자 페이지도 함께 제작하였습니다.

  • 사용자(클라이언트) 사이드에서는 검색 지면에서 광고 물품에 관심을 가지고 클릭한 로그정보가 데이터베이스에 저장이 됩니다. 저장된 데이터를 활용해 검색 노출에 필요한 점수를 산출하게 됩니다. 추가로 검색 지면에서 사용자들에게 더욱 매력적인 광고들을 보여주기 위한 타겟팅 기능이 함께 제공됩니다.

2. 실시간 로깅

  • 광고에 대한 전체적인 설명을 했으니 조금 더 기술적인 부분으로 파고들어 보겠습니다. CPC 광고를 제작하기 위해서는 가장 기본적으로 실시간 로그를 수집할 수 있어야 합니다. 광고주에게 실시간으로 클릭과 노출에 대한 정보를 제공할 수 있어야 하며, CTR(노출 대비 클릭)과 같이 노출 로직에 중요하게 작용하는 정보를 계산하기 위해서도 필요합니다.
  • 번개장터의 CPC광고의 실시간 로깅 구조는 다음과 같습니다.

  • 번개장터에서 대부분의 기능이 시작되는 중앙 API 서버(EC2)에는 분산 로그 수집기인 Fluentd가 적용되어 있습니다. 수십대로 구성된 API 서버로 들어오는 데이터를 유실 없이 수집해야 하는 임무를 맡고 있습니다. 요즘 유행하고 있는 로그 수집기인 Logstash에 비해 비교적 관리와 사용이 까다롭지만, 다른 서비스 및 컴포넌트(예 : Kafka 및 RDBMS 등)와 연동이 수월하다는 장점을 가지고 있습니다.(사실 번개장터에서는 침입탐지용 로그 수집을 위해 Logstash도 이용하고 있습니다.)
  • 사용자를 통해 Fluentd에 의해 수집된 로그는 AWS S3와 Kinesis(Kafka)로 전송이 됩니다. S3에 저장된 정적 로그들은 Redshift와 Redash로 이관되며, 통계 및 데이터 분석에 활용됩니다. 반대로 Kinesis로 전송된 로그들은 실시간 처리 및 CPC 광고에 활용됩니다.
  • 그림에서 Kinesis와 ElasticSearch 사이에 Lambda 함수가 자리 잡고 있는 이유는 저장된 로그 데이터에서 핵심적으로 필요한 노출 정보와 클릭정보를 따로 구분하는 기능을 맡고 있기 때문입니다. AWS에서는 서비스 간 트리거를 아주 잘 제공해주고 있기 때문에 Kinesis에서 유입된 데이터를 유연하고 유실 없이 ElasticSearch로 저장할 수 있게 해줍니다.
  • 최종적으로 ElasticSearch 구성된 노출 정보와 클릭정보는 광고주에게 실시간으로 제공되며, 각각 광고에 대한 CTR을 주기적으로 갱신하는 역할을 하게 됩니다.

3. 노출로직(스코어링)

  • 검색 지면에 노출되는 CPC 광고인만큼 각각 광고에 대한 노출 순서를 논리적으로 계산해야 합니다. 번개장터에서는 검색 키워드 유사도(TF-IDF 기반)와 CTR 그리고 광고예산을 노출 점수에 활용하고 있습니다. 각각의 점수들은 각기 다른 스케일과 아웃라이어를 가지고 있기 때문에 정규화를 진행해야 하며, 통계 및 머신러닝 분야에서는 이를 스케일링이라고도 칭합니다. 번개장터의 노출 로직을 완전히 공개할 순 없지만 간단한 예를 들어보려 합니다.

  • 정규화 식은 위와 같이 간단합니다.

  • 각각의 요소들이 정규분포를 따르는 광고 무작위 샘플 200개를 만들어보겠습니다. 위 코드를 통해 CTR, 광고예산(bid_price), 검색 키워도 유사도(normal_es_score) 속성이 추가된 광고 샘플 200개가 만들어졌습니다.

  • 모두 0-1의 소수 범위를 가지는 동일 기준의 속성으로 만들기 위해 위의 정규화식을 활용해 정규화를 진행합니다.

  • 각각의 요소에 적절한 가중치를 주어 모두 더하면 스코어링이 완료됩니다. 위 예에서는 CTR에 0.3, 검색 키워드 유사도에 0.2, 예산에 0.5의 가중치를 부여하였습니다. 각각의 요소에 따른 중요도가 다르기 때문에 기호에 맞게 부여하게 됩니다.

  • 스코어링 결과를 확인합니다. 번개장터는 이런 식으로 간단하게 스코어링을 진행했습니다. (실제론 이 개념에 조금 더 복잡한 수식들이 첨가됩니다.)

4. 가변차감

  • 일반적인 타 회사의 CPC 광고들은 클릭당 차감되는 입찰가가 고정되어 있는 구조입니다. 만약 광고주가 클릭당 90원이 차감되도록 입찰가를 설정한다면 광고가 노출되는 모든 지면에서 90원이 차감됩니다. 이와 반대로 번개장터의 CPC 광고는 일반적인 형태와 다른 가변차감 구조를 가지고 있습니다. 검색 키워드에 따라 지면의 가치가 모두 다르다고 생각하여 지면마다 각각 다른 베이스 차감금액이 경쟁에 의해 설정됩니다.
  • 예를 들어 번개장터에서 인기가 많은 ‘아이폰’이라는 검색어는 CPC 광고의 경쟁이 많이 일어나는 지면이기 때문에 비교적 클릭당 많은 금액을 소진하여야 상위에 노출이 됩니다. 물론 광고의 품질을 판단할 수 있는 지표도 점수 산출 과정에 들어가기 때문에 물품의 CTR도 함께 높아야 합니다.

현재까지 번개장터가 CPC 광고를 처음 도입하면서 개발했던 부분을 글로 적어봤습니다. 많은 분들께 최대한 쉽게 보여 드리려 노력했지만, 디지털 광고라는 분야 자체가 워낙 생소하기 때문에 글쓰는 것이 수월하지 않았습니다. 실제로 개발을 진행하면서도 복잡성이 상당했기 때문에 더 많은 공을 들였던 프로젝트였습니다. 제가 사실 CPC 광고 개발에 대해서 포스팅을 한 가장 큰 이유는 직접 개발을 진행하면서 과거 사례나 레퍼런스가 부족하여 개발에 어려움이 많았기 때문입니다. 이미 CPC 서비스를 오래전부터 제공하고 있던 대형 오픈마켓들은 나름의 노하우가 많이 쌓여있어 이를 논문 등으로 사례를 소개하고 있지만, 사실상 세부 기술사항보다는 마케팅(?)과 관련된 내용들이 주를 이루고 있었습니다. 번개장터 또한 현재는 많이 부족하지만 제가 작성한 이 글이 디지털 광고를 시작하려는 다른 개발자에게 도움이 되었으면 합니다.


글쓴이 - 이명휘 : 번개장터 주식회사 엔지니어(컴퓨터공학 학사 / 건축공학 석사)
머신러닝에 기반한 최적화 및 신재생에너지에 대한 연구를 했습니다.
흥미로운 논문에 대한 리뷰를 취미로 합니다.
Web : developeco.com
ResearchGate : bit.ly/2HF9M9x
Github : /Myeonghwi

기업문화 엿볼 때, 더팀스

로그인

/