들어가며
신상애드는 작년 10월에 오픈한 ‘신상마켓’의 광고 플랫폼입니다. 2020년 5월부터 10월까지 약 6개월간의 개발 기간을 가진 비교적 큰 프로젝트이며, 그만큼 기대도 컸던 프로젝트였습니다. ‘신상애드’를 만드는 팀은 어떤 팀이고 기존 신상마켓 광고와 무엇이 다르며 개발 과정에서 어떤 고민을 했는지 소개하고자 합니다.
기존 신상마켓 광고의 한계
‘신상애드’가 개발되기 전에도 신상마켓 광고 서비스는 존재했지만, 기존 광고 서비스에는 아래와 같은 문제점이 있었습니다.
- CPT 방식의 구좌형 광고로, 광고주의 수요에 맞게 공급할 수 없는 구조
- 광고 지면 확대, 구좌 추가 등의 유연성이 떨어짐
먼저 CPT(Cost Per Time)는 기간제로 진행되는 광고를 이야기합니다. 지정된 광고 영역(배너)을 며칠, 혹은 몇 주 동안 임대하여 그 기간 광고가 지속해서 노출되는 방식입니다. 구좌란 하나의 배너 위치에 들어갈 수 있는 광고 소재의 수를 의미하며, 구좌는 정해진 수량만큼만 존재합니다. 일정 기간 광고 할 수 있는 구좌를 선착순으로 구매하는 방식이며, 구매에 성공한 일부 광고주에게만 광고할 기회가 주어지기 때문에 나머지 광고주들은 광고하고 싶어도 할 수 없는 구조입니다.
이 구좌형 광고 시스템은 PHP로 개발된 오래된 시스템입니다. 광고 구좌를 입찰, 낙찰, 집행의 단계를 진행하는 과정에서 사람이 수작업으로 운영하는 부분도 일부 존재하여 휴먼에러가 발생할 가능성이 높았습니다. 더 많은 광고주가 입찰할 수 있게 하거나 광고의 지면을 늘리는 것은 매우 어려운 상황이었으며, 새로운 광고 플랫폼의 필요성은 점점 커지게 되었습니다.
새로운 신상마켓 광고 플랫폼 개발
팀 빌딩
새로운 프로젝트를 시작하기 위해 먼저 프로젝트 단위의 팀을 구성해야 했습니다. 최초에는 기획자와 ‘광고검색파트’ 백앤드 개발자들의 소수의 인원으로 준비 작업을 시작했습니다.
일반적인 워터폴 구조에서 프로젝트를 진행하면 어느 정도 기획이 나오고, 그를 바탕으로 개발 설계를 시작하며 프로젝트를 진행했을 것입니다. 하지만 신상애드는 처음 도입하는 시스템이며 중간중간 신상마켓의 광고주들의 니즈를 반영하며 시스템을 완성할 필요가 있었습니다. 또한 비록 팀이 경험 많은 개발자들로 구성되어 있긴 했지만 전체적으로 광고 플랫폼에 대한 도메인 지식이 부족한 상태였고, 기획자를 포함해 개개인 간의 도메인 지식 차이도 있었기 때문에 이 부분도 해결할 문제였습니다.
이에 신상애드 팀은 기획이 나오기까지 마냥 기다리는 것이 아니라 기획 단계부터 개발자들이 참여하며 함께 설계하고, 짧은 주기로 목표를 정하고 여러 번의 이터레이션을 거치며 제품을 완성하기로 했습니다. 그래서 우리는 먼저 1차 스프린트의 목표를 정하고 프로젝트를 시작했습니다.
1차 스프린트
광고 플랫폼 전체 도메인 설계
가장 많은 시간을 투자하고 심혈을 기울인 작업은 시스템 설계였습니다. 도메인을 어떻게 나눌 것이며 필요한 기능은 무엇인지, 발생 가능한 이벤트를 정의하고 이벤트에 필요한 도메인은 무엇인지 정의하는 큰 그림을 그리는 작업이었습니다. (한 마디로 짧게 적긴 했는데 정말 힘들었습니다 @.@)
이 과정에서 우리는 도메인 주도 설계(Domain Driven Design)의 이벤트 스토밍 방법을 참고하여 우리만의 방식을 찾고자 노력했습니다.
약 3주 가량 이 과정을 거치며 팀원들에게 두 가지 변화가 생겼습니다. 첫 번째는 소통하는 과정에서 통일된 용어를 사용하기 시작했고, 두 번째는 우리가 무엇을 만들려고 하는지에 대한 목표를 같은 시각으로 바라볼 수 있게 되었습니다. 또한 이로 인해 위에서 언급했던 개인 간의 도메인 지식 차이를 어느 정도 해결할 수 있는 계기가 되었습니다.
광고 소재 등록 및 광고를 서빙하는 프로토타입 개발
두 번째 목표인 광고 소재를 등록하고 서빙하는 기능의 프로토타입 개발은 지금까지 설계된 자료를 바탕으로 팀에서 각자 작업할 범위를 정하고 진행했습니다.
Core는 광고의 등록, 수정, 삭제 등 광고 정보의 모든 것을 컨트롤하며, 노출 가능한 광고가 발생하면 AD Pool에 소재를 등록하는 역할을 합니다. 여기서 AD Pool은 광고로 나갈 수 있는 소재들만 존재하는 저장소입니다.
DSP(Demand-Side Platform)는 신상애드의 핵심이 되는 부분으로 가장 효율적인 광고를 찾을 수 있도록 합니다. 광고 선택 과정은 RTB(RealTime Bidding)로 구현되어 있는데, AD Pool에서 노출 대상이 되는 광고 소재를 조회하여 알고리즘을 통해 스코어를 구하고 노출될 광고를 낙찰하여 사용자에게 전달합니다.
Composer는 신상마켓 플랫폼에 특화된 서비스로 기존 광고 시스템을 지원하기 위해 구 광고와 새 광고의 위치를 컨트롤하는 역할을 담당하는 일종의 CMS 서비스입니다.
2차 스프린트
광고 소재 상태 정의
상태 정의 초기 버전 (음… 너무 복잡한데?)
광고주가 등록한 광고 소재가 사용자에게 노출되기 위해서는 여러 단계를 거쳐야만 합니다. 먼저 심사를 통과해야 하고, 통과되더라도 계정의 상태 또는 예산에 따라 노출 가능 여부가 달라지기 때문에, 광고의 상태값 및 이벤트를 통한 상태 전이를 효과적으로 컨트롤 할 수 있도록 상태 중심의 설계를 가져갔습니다.
(참고 : 상태 일병 구하기 - State Machine)
광고 소재의 심사 기능 구현
광고 등록 이후 노출까지 가는 첫 관문은 소재 정보가 광고로 적절한 상품인지 관리자가 확인하고 승인하는 심사 과정입니다.
광고주가 광고 등록을 하면 Core는 관련 정보를 저장하고 Admin에게 심사 등록 요청을 합니다. Admin은 심사 정보를 저장하고 관리자가 심사할 수 있는 대기 상태로 넘어가며, 이후 관리자가 심사 승인을 하면 Core에게 승인되었으니 상태 변경을 요청하게 됩니다. Core는 소재의 상태 변경 후 노출 가능 여부를 판단하고 AD Pool에 등록하여 노출 가능한 상태로 만들어 줍니다.
AD Filter 서비스 구축
광고 플랫폼은 광고의 노출/클릭에 대해서 과금 처리를 진행하는데, 이 때 노출/클릭된 모든 광고를 무조건 과금처리 한다면 문제가 될 수도 있습니다. 악의적인 목적으로 매크로를 통해 광고를 무한히 노출 한다거나 특정 광고를 무수히 클릭하여 광고주의 비용을 증가시킬 수도 있기 때문입니다.
AD Filter는 소매에게 노출된 광고가 과금 대상인지 판단하는 역할을 합니다. 데이터 플랫폼에서 수집한 데이터를 분석하고 이를 근거로 하여 과금 방식(CPM, CPC)에 따른 어뷰징 여부를 판단하고 이상이 없는 경우에만 결제 프로세스를 진행하도록 합니다.
3차 스프린트
상품 업데이트에 대한 광고 심사 처리
2차 스프린트에서 광고 심사에 대한 구현이 완료되었지만 여기서 끝이 아닙니다. 광고주의 광고 소재는 이미 신상마켓에서 등록해 판매되고 있는 상품 정보가 기준이 됩니다. 만약 심사를 통과해 광고가 노출되고 있는 상황에서 광고주가 신상마켓의 상품 정보를 변경하면 광고 정보와 상품 정보의 불일치가 야기됩니다.
신상마켓에서 상품 수정 이벤트를 전달받으면 Admin은 집행 중인 광고를 심사 상태로 변경합니다. 다만 이 경우에도 광고는 계속 노출 상태로 유지하는데, 이는 광고주의 상품 수정으로 인해 의도치 않게 노출 중인 광고가 중지되는 일이 없도록 하기 위함입니다. 이후 심사 상태로 바뀐 광고를 신상애드 관리자가 승인하게 되면 Core에게 변경된 상품 내용으로 소재 업데이트를 요청하고, Core는 광고 DB 및 AD Pool의 소재 정보를 갱신하며 상품 정보와 일치하는 내용의 광고를 노출하게 됩니다.
결제 프로세스 구축
가장 중요한 결제 관련 이야기입니다. AD Filter를 통과한 과금 대상 로그는 아래과 같은 프로세스를 거치게 됩니다.
AD Filter를 통해 전달받은 로그는 AD Payment에서 효율적인 결제를 위해 도매 단위로 aggregation 하여 저장소에 저장합니다. 저장소에 저장된 결제 정보는 AD Payment Batch를 통해 주기적으로 신상마켓 시스템으로 포인트 차감 요청을 보내 최종 결제가 이루어집니다.
4차 스프린트
Frequncy Capping 적용
신상애드는 매 광고 노출 건마다 낙찰이 이루어지지만 높은 낙찰가를 제시한 경우에는 같은 광고가 한동안 계속 서빙되기도 합니다. 이는 광고를 보는 소매 사업자의 입장에서 광고 피로도가 증가하는 문제가 있으며 광고 효율에도 좋지 않은 영향을 주게 됩니다. 이러한 문제를 해결하기 위해 Frequency Capping을 적용하여 하나의 광고가 특정 소매 사업자에게 노출되는 횟수를 제한하는 기능을 추가했습니다. 소매 사업자의 광고 피로도를 낮추는 동시에, 입찰가 높은 광고 상품이 집중 노출되어 예산이 너무 빨리 소진되는 경우도 막을 수 있었습니다.
기능별 고도화 및 정식 오픈 준비
마지막 스프린트이므로 곧 있을 정식 오픈을 위해 그동안 개발한 기능의 완성도를 높이는 작업에 집중했습니다.
- Composer : 더 많은 지면을 지원할 수 있도록 개선
- DSP : 낙찰 알고리즘에 CTR 정보와 잔여 예산 정보를 고려한 스코어 계산
- AD Payment : 광고비에 VAT 적용하여 계산하도록 개선
- Core : 같은 이미지로 구성된 상품은 중복으로 등록되지 않도록 제한하고, 운영 효율화를 위해 다양한 검색 기능을 제공
- 풍부한 광고 리포트 정보 제공
그리고 광고주에게 필요한 안내 자료 준비와 전달 방법 등을 고민했습니다.
정식 오픈
네 번에 걸친 스프린트를 마무리하고 일부 도매 대상으로 CBT를 진행하게 되었습니다. 이슈가 발생하면 원인을 찾기 위한 로그를 추가하며, 운영에 필요한 정보를 조금씩 쌓아 한눈에 볼 수 있는 대시보드를 구축하여 모니터링할 수 있는 환경도 준비했습니다. 그리고 얼마 간의 CBT 기간이 지난 후 ‘신상애드’가 정식으로 탄생했고, 현재는 신상마켓 광고 포트폴리오의 주력 상품으로 자리 잡았습니다.
마치며
현재는 많은 도매 광고주가 사용할 수 있는 광고 플랫폼을 제공한다는 최초의 목표를 어느 정도 이뤘다고 평가할 수 있습니다. 6개월간의 프로젝트를 성공적으로 마무리 할 수 있었던 이유로는, 한 번의 빅뱅을 목표하지 않고 문제를 작게 쪼개어 하나씩 해결해 나갔다는 점과 초기 설계부터 기획자와 개발자가 같은 목표를 공유하며 진행했다는 점을 들 수 있습니다. 스프린트가 끝날 때마다 회고를 통해 다음 스프린트의 목표를 세웠고, 이는 짧지 않은 프로젝트 기간 동안 지치지 않고 진행할 수 있는 원동력이었다고 생각합니다.
신상애드는 사용자의 데이터를 수집/분석하는 DMP(Data Management Platform)를 구축해 고도화된 타게팅 기술을 바탕으로 광고를 노출하고 효율을 높이려 하고 있습니다. 동시에 과금 구조의 다변화, 동영상 및 브랜드 광고 등의 포트폴리오 다양화, 중국/일본 고객 대상의 서비스에 맞는 글로벌 광고 등을 플랫폼 차원에서 쉽게 지원할 수 있는 환경을 구축하고 있습니다.
도매 사업자들이 신상마켓이라는 플랫폼을 통해 사업을 전개하고 있다고 한다면, 신상애드는 그들의 사업에 부스터를 달아줄 수 있는 서비스로 자리매김한다는, 더 큰 목표를 향해 달려가려 합니다.
이진우
딜리셔스 백앤드 개발자
"성장은 하나를 더하는 것, 성숙은 하나를 빼는 것"