당근에서는 우리 주변 이웃을 만날 수 있습니다. 근처 사는 친구도, 단골 가게 사장님도 당근을 통해 만날 수 있죠. 중고거래, 커뮤니티, 모임뿐 아니라 당근 광고도 화면 구성만 다를 뿐 ‘이웃을 만나고 연결한다’는 본질은 같습니다.
지난 글에서 DSP(Demand Side Platform)를 통해 광고를 만들고 효율을 올리는 법을 소개했는데요. 이번 글을 통해서는 DSP로 만든 광고들이 어떤 과정을 거쳐 사용자에게 전달되는지 정리했어요. 온라인 광고 시장뿐 아니라 당근의 광고 시스템을 이해하고자 하는 분들에게 이 글이 도움이 되기를 바랍 니다.
이 글을 읽고 나면 당근 광고 아키텍처 중 검은색으로 표시한 영역을 이해할 수 있습니다. 지난 2편에 비해 이해할 수 있는 영역이 넓어졌는데요. 더 자세한 내용이 궁금하다면... 당근 광고실에 합류해보세요!
AdServer는 광고 지면에 나갈 광고를 결정하고 송출하는 소프트웨어 플랫폼입니다. 광고 지면을 가진 매체(Publisher)들은 지면에 광고를 띄우기 위해 어딘가로 광고를 요청해야 하는데요. 바로 그 요청을 받아주는 곳이 AdServer죠. 광고 지면에 나가고 싶은 광고들이 모여 있는 일종의 경매장과 비슷하다고 이야기할 수 있는데요. 인터넷에서 보이는 광고들은 대부분 AdServer, 혹은 그와 비슷하게 동작하는 시스템을 통해 송출됩니다.
만약 인터넷에서 광고를 보고 부정적으로 생각한 경험이 있다면, 아마 내가 관심 없는 혹은 싫어할 만한 물건이나 서비스를 보여줬기 때문일 거예요. 일상에서 꼭 필요한 정보가 광고를 통해 주어진다면, 오히려 광고 배너를 클릭하는 것만으로도 제때 도움을 받을 수 있죠. 이처럼 사용자에게도, 또 해당 광고를 집행한 광고주에게도 도움을 줄 수 있도록 효율적으로 광고를 처리해야 하는 시스템이 바로 AdServer입니다.
그렇다 면 어떤 AdServer가 좋은 AdServer일까요? 지면과 오디언스(Audience)에게 적합한 광고를 빠르게 선택할수록 좋은 AdServer일 거예요. 광고를 볼 사람들인 오디언스가 광고 지면을 지나치기 전에 그들의 눈길을 끌 만한 광고를 송출하는 거죠. 그 대가로 AdServer는 DSP로부터 광고와 수수료를 받습니다. 광고주가 만족할 만한 높은 효율이 나와야 DSP도 AdServer도 살아 남을 수 있죠. 당근은 DSP, AdServer 뿐만 아니라 데이터 플랫폼, 연구 조직, 심지어 광고 지면까지 가지고 있기 때문에 광고 플랫폼의 모든 구성요소를 활용하여 광고 효율을 높이고 있습니다.
AdServer의 정의를 이해했으니 이번에는 AdServer가 어떻게 광고를 선정하고 송출하는지 알아보겠습니다. 구체적인 작동 방식은 회사마다 차이가 있기 때문에 일반적인 수준에서 설명해보겠습니다.
AdServer가 가장 먼저 하는 일은 어느 지면에서 광고를 요청하는지 확인하는 것입니다. 광고가 나가는 지면은 크게 맥락(Context) 여부에 따라 두 종류로 나눌 수 있습니다. 여기서 맥락은, 화면 내 다른 정보들과의 연관성을 의미합니다. 가령 검색 결과를 보여주는 화면에 광고 지면이 있다면, 이 지면은 맥락이 있는 지면이죠. 오디언스가 “자전거”를 검색했을때 오디언스는 광고 또한 “자전거”와 관련 있는 내용이기를 기대합니다.
이에 반해 맥락이 없는 광고 지면은 화면 내 다른 정보들과의 연관성이 없는 광고 지면이에요. 웹사이트의 메인화면 이 대표적인 예시입니다. 여러 주제의 정보들이 한 번에 표시되죠. 이런 경우 AdServer는 화면 내 다른 정보들과의 연관성을 고려하지 않고 다양한 광고를 송출할 수 있습니다. 당근의 AdServer는 이러한 지면에 걸어서 갈 수 있는 가게나 평소 관심 있던 먹거리를 보여주면서 오디언스 취향에 맞는 광고 콘텐츠를 보여주는 곳으로 활용하고 있습니다.
광고가 나갈 지면을 확인했다면 다음으로 AdServer는 광고를 볼 오디언스가 어떤 사람인지 추론합니다. 어느 지역에서 활동하며, 성별은 무엇이고, 나이대 관심사는 어떻게 되는지 등 오디언스 정보를 머신러닝으로 예측하는 것인데요.
누가 광고를 볼지 예측하는 것은 광고효과를 높이는 데 도움이 됩니다. 타겟팅 적용이 가능해지기 때문인데요. 만약 광고주가 DSP를 통해 ‘30대 여성이 보는 광고 지면을 구매하고 싶다’고 했다면 AdServer는 30대 여성으로 추정되는 오디언스를 찾아야 합니다. 오디언스가 좋아할 만한 광고는 곧 광고주의 광고 비용 대비 수익(ROAS, Return On Advertisement Spend)을 올리는 데 도움이 되죠.
지면과 오디언스를 이해했다면 다음으로 AdServer는 송출 가능한 광고들을 불러옵니다. 이는 곧 광고 예산이 남아있는 광고 중 타겟팅 조건이 맞는 광고를 찾아야 함을 의미하는데요. 여기서 타겟팅 조건이 맞는 광고란 광고 지면, 오디언스 그리고 광고의 송출 가능 시간까지 세 조건이 모두 맞는 광고를 의미합니다.
예를 들어 저녁 8시, 서초4동에서 30대 남성이 당근의 홈 피드를 둘러보고 있다고 가정하겠습니다. 이 남성에게 광고를 보여주기 위해 AdServer는 ‘저녁 8시’에 보여줘도 되는 광고 중 ‘홈 피드’라는 지면, ‘서초4동, 30대, 남성’의 특성을 가진 오디언스를 모두 타겟팅하는 광고를 송출 가능한 후보로 판단합니다.
송출 가능한 광고를 불러온 후에 AdServer는 광고들을 경쟁시킵니다. 광고주와 사용자 모두에게 가장 효율적으로 소비될 만한 광고를 고르는 거예요. 지면 경쟁의 승자를 가리는 기준은 여러 가지가 있습니다. 이번 글에서는 가장 널리 쓰이는 기준인 eCPM(effective Cost Per Mille)을 살펴보겠습니다.
eCPM은 광고 지면을 가진 매체가 광고를 1000회 노출했을 때 벌어 들이는 수익입니다. 사용자가 보기에는 비슷한 광고라도 광고주의 지불 용의, 광고 품질 등에 따라 eCPM은 10배 이상 차이 날 수 있죠. 일반적으로는 광고주가 광고를 내보내기 위해 지불하려는 금액이 클수록, 그리고 오디언스가 광고에 반응할 가능성이 높을수록 eCPM이 높아집니다. 그렇기 때문에 ‘광고를 경쟁시킨다’는 말은 ‘경쟁에 참여하는 광고들을 eCPM순으로 정렬한다’는 것을 의미합니다. 이처럼 광고 플랫폼에서 정해둔 기준에 따라 선택된 최선의 광고들이, 사용자의 화면에 나타나게 되는 것이죠.
지면 경쟁이 끝나고 나면 AdServer는 경쟁에서 이긴 광고들에 성과 추적 링크를 붙이고 송출합니다. 추적 링크가 있어야 광고플랫폼은 정확한 광고 성과를 계산할 수 있고 광고주에게 공유할 수 있기 때문인데요. AdServer를 지나는 광고들은 오디언스에게 바로 노출되기 때문에 AdServer는 성과 추적 링크를 붙이는 역할을 겸하는 경우가 많습니다.
다섯 단계로 나눠 설명한 AdServer의 동작을 한 문장으로 요약하면 다음과 같아요. AdServer는 지면과 오디언스를 확인하고 송출할 광고를 경쟁시킨 후 추적 링크를 붙여 매체에 송출합니다. 이제부터는 오디언스가 광고를 보고, 클릭하고, 광고주가 원하는 클릭, 가입, 구매 등의 행동을 해주기를 바랄 뿐입니다.
AdServer는 지면에 적합한 광고를 빠르게 선택해야 하는 소프트웨어 플랫폼입니다. 그러다 보니 AdServer가 풀어야 하는 문제들은 주로 기술과 연관돼 있는데요. 이번 글에서는 그중 확장성, 관측가능성, 내결함성, 머신러닝 설명가능성을 알아보겠습니다.
DSP가 그렇듯 AdServer 또한 규모에서 오는 문제들이 있습니다. DSP가 빠르게 늘어나는 광고들을 연관 시스템에 전달해야 했다면 AdServer는 그렇게 늘어나는 수십만 개의 광고 중 송출할 광고를 고르는 과정을 1초에 수천 번 해야 하죠. 그러다 보니 인프라, 네트워크, 저장소, 코드 등 모든 프로세스에 최적화가 들어가지 않은 곳이 없습니다. 부하가 늘어날 때 몇 초 후에 서버가 자동으로 증설되게 해야 에러가 생기지 않는지, 어떻게 해야 네트워크 대역폭을 초과하지 않으면서 필요한 데이터들을 모두 가져올 수 있는지 등 문제를 AdServer 엔지니어들은 고려해야 합니다.
다음으로 AdServer는 내부 동작이 투명해야 합니다. 광고를 선별하는 모든 과정을 관측할 수 없다면 우리는 광고가 왜 나갔는지 혹은 왜 나가지 않았는지 설명할 수 없을 거예요. 이는 광고 플랫폼의 신뢰도에 영향을 미치며 광고주의 문의에 답변하기 위해 엔지니어, 세일즈, 고객 문의 담당자가 들여야 하는 시간이 길어진다는 점에서 비효율적이죠.
문제는 최소 수천 개의 광고가 초당 수천 번 경쟁하는 과정을 모두 기록할 수는 없다는 점인데요. 네트워크와 저장소 비용을 감당하기 위해 당근 광고실 엔지니어들은 어느 정도 추상화된 수준에서 내부 동작을 기록하고 있습니다. 관측 가능성을 정의하고 발전시켜야 하는 것은 앞으로의 과제입니다.
AdServer는 광고실 내외의 다른 시스템들이 고장 나도 광고를 송출해야 합니다. AdServer가 광고를 송출하지 않으면 광고 매출에 직접적인 타격이 발생할 수 있기 때문이죠. 따라서 AdServer는 일부 시스템의 결함을 견디도록 설계 돼 있어요. 예컨대 오디언스 분석에 실패할 경우 논타겟 광고를 내보내고, 송출 가능한 광고 목록을 찾지 못할 경우 일정 시간 동안 광고 목록을 재활용하고, 그것마저 할 수 없다면 연관 있는 다른 DSP의 광고를 내보냅니다. 대량의 트래픽이 오가는 과정에서 생길 수 있는 다양한 문제 상황을 예측하고 대응해야 하죠.
AdServer는 동작의 많은 부분을 머신러닝에 의존하고 있습니다. 오디언스를 추론할 때도, 광고의 eCPM을 계산할 때도, 심지어는 송출 가능한 광고를 가져올 때도 머신러닝을 사용하죠. AdServer가 마주한 문제들은 최적화와 연관된 경우가 많기 때문에 당근을 포함한 많은 회사들은 머신러닝을 이용해서 최적화 문제들을 풀고 있습니다. 머신러닝 엔지니어분들이 큼직한 기능을 배포할 때면 지표들이 급격히 좋아질 때가 많은데요. 당근은 이제 막 머신러닝으로 광고 플랫폼 최적화를 시작했다는 것을 생각하면, 광고 플랫폼으로서의 당근의 미래가 더욱 기대되기도 합니다.
하지만 그럼에도 AdServer는 ‘관측가능성’이 가장 중요한 컴포넌트예요. 따라서 머신러닝을 이용해 푸는 문제일지라도 플랫폼 측에서 그 과정을 설명할 수 있어야 합니다. “이 광고 왜 나갔어요?”라는 질문에 “잘 몰라요”라는 답이 나오지 않도록 해야 한다는 철학을 가지고 AdServer는 발전시켜야 하는 것이죠. 설명가능한 인공지능을 만드는 것이 또 하나의 과제가 되겠으며, 현재 기술적 한계로 인해 어렵다면 적어도 설명할 수 있는 범주 내의 문제를 머신러닝으로 풀어가야 할 것입니다.
이번 글을 통해 우리는 AdServer의 정의와 동작, 그리고 풀어야 하는 문제들을 알아보았습니다. 기술적인 내용이 많아 이해가 어렵진 않았을지 걱정이 들지만 한편으로는 이 글을 통해 당근과 광고실에 대한 이해가 높아지셨기를 바라 봅니다. 또 광고를 만드는 분들이 아니시라면, 평소 접하던 광고가 어떤 과정을 통해 나에게 전달되는지 대략적으로 이해하는 계기가 되었기를 바랍니다.
당근 광고 플랫폼의 AdServer는 사장님과 사용자 모두에게 가장 가치 있는 연결을 만들기 위해 노력하고 있습니다. 광고라는 매개를 통해 동네를 더욱 활기차게 만들어갈 여러분을 기다리겠습니다!
Software Engineer, Backend