LINE Corporation이 2023년 10월 1일부로 LY Corporation이 되었습니다. LY Corporation의 새로운 기술 블로그를 소개합니다. LY Corporation Tech Blog

Blog


LINE Timeline의 새로운 도전 1편 - 추천 컨텐츠 탐색을 위한 Discover와 새로운 구독 모델 Follow

들어가며

LINE 타임라인 서비스에 'Discover'와 새로운 구독 모델인 'Follow' 기능이 추가되었습니다. 사용자에게는 많이 낯설지 않은 기능일 것이나, 그 속에서 우리가 고민하고 노력했던 부분들이 무엇인지 공유하고 싶어 이 글을 작성하게 되었습니다. 이번 소개 글을 시작으로 조금 더 자세한 내용까지 전해 드리고자 총 3부작으로 기획했습니다.

  • LINE Timeline의 새로운 도전 1편 - 추천 컨텐츠 탐색을 위한 Discover와 새로운 구독 모델 Follow
  • LINE Timeline의 새로운 도전 2편 - Discover Delivery System 소개
  • LINE Timeline의 새로운 도전 3편 - Discover 추천 모델 자세히 살펴보기

새로운 도전의 시작

Discover와 Follow는 서비스 관점에서 몇 년 전부터 논의되어 왔던 주제였으나, 개인을 위한 공간이라는 인식이 강한 LINE의 소셜 환경을 고려해야 했기에 오래 고민해 왔습니다. 현재 타임라인은 친구 관계를 맺어야 콘텐츠를 구독할 수 있습니다. 하지만 앱을 사용하다 보면 단순 연락을 위해 친구로 추가한 사람으로까지 내 소셜 그래프가 확장되기 때문에, 아무래도 글쓰기가 점점 망설여지기 마련입니다. 그 결과, 타임라인은 친구 소식이 줄어들고 비즈니스 계정들이 쏟아내는 글로 도배되기 일쑤였습니다. 개발자도 한편으론 서비스의 사용자이기 때문에, 저희는 사용자의 입장에서 이런 환경을 탈피하기 위해 정말 많은 이야기를 나누며 논의해 왔습니다. LINE 타임라인은 이 두 가지 기능을 통해 서비스와 기술적 관점에서 새로운 도전을 해보고자 합니다. 

Discover와 Follow란?

타임라인은 지인 기반의 다소 닫힌 SNS에 속합니다. 공식 계정을 통해 각종 정보를 수신할 수는 있으나, 이 역시 친구 관계를 맺은 경우에 한해서만 구독이 가능합니다. 이 점은 장점이 되면서 단점이 되기도 합니다. 누구나 볼 수 있는 전체 공개 콘텐츠가 많지만 그 콘텐츠에 도달하기가 매우 어렵습니다. 타임라인의 공개(public) 포스트는 전체 공개로 권한이 설정됩니다. 하지만 이는 누구나 읽을 수 있도록 권한이 설정됐다는 것이지 모든 사람에게 딜리버리된다는 뜻은 아닙니다. 타임라인은 오로지 친구 관계인 경우에만 콘텐츠를 딜리버리합니다. 그래서 사용자에게 도달하지 못하는 좋은 콘텐츠를 발견하고 소비할 수 있는 공간과, 관심 있는 콘텐츠를 지속적으로 구독할 수 있는 장치를 도입했습니다. 그것이 바로 Discover와 Follow입니다.

참고. Discover와 Follow 기능은 LINE 10.3.0 이상 버전에서 사용할 수 있습니다. 현재 일본과 대만, 태국에서 서비스하고 있으며 이후 다른 국가로 확대하는 것을 고려하고 있습니다.

Discover

타임라인 탭 오른쪽 상단에 위치한 행성 아이콘()을 누르면 Discover를 사용할 수 있습니다. 또는 타임라인 피드 내에 'Discover 미리 보기'를 통해 들어갈 수도 있습니다. 일본어 버전에선 'ディスカバー', 영문 버전에선 'Explore'로 표시됩니다.

 

타임라인과 Discover는 무엇이 다를까?

타임라인과 Discover는 사용자 또는 비즈니스 계정이 생산한 콘텐츠를 보여주는 공간입니다. 하지만 이 두 공간은 조금 다른 역할을 수행합니다.

  • 타임라인: 친구 또는 Follow의 콘텐츠를 구독하는 공간
  • Discover: 그동안 나에게 도달하지 못했던, 내가 관심을 가질만한 콘텐츠를 탐색하고 소비하는 공간

특히 Discover는 보기 불편하거나 질이 낮다고 판단되는 콘텐츠는 추천 시스템이 적절히 걸러낸 뒤, 볼만한 콘텐츠만 노출시킵니다. 이 과정에서 각 사용자가 관심 있게 본 콘텐츠를 기반으로 개인화가 진행되며, 사용자가 콘텐츠를 선택하면 다시 유사 콘텐츠를 계속해서 탐색할 수 있는 사용자 경험을 제공합니다. 그리고, 콘텐츠 생산자 입장에서도 바뀌는 부분이 있습니다. 아래 그림에서 보는 바와 같이, 전체 공개 포스트를 작성하면 더 많은 사람들이 내 콘텐츠를 볼 수 있는 기회를 얻게 됩니다. LINE에서도 유명 인플루언서가 될 수 있는 기회가 생긴 것입니다. 이를 지원하기 위해 여러 가지를 고민하고 있으니 기대해 주시기 바랍니다.

Follow

Follow는 친구가 아닌 사용자의 콘텐츠를 구독할 수 있는 방법을 제공합니다. Follow는 대화를 지원하지 않기 때문에 LINE에서 대화를 하고 싶진 않지만 콘텐츠는 구독하고 싶은 경우에 사용할 수 있고, 내 프로필 홈에서 Follow 현황을 확인할 수 있습니다. 

 

Discover와 Follow에 대한 좀 더 자세한 안내는 이곳을 참고하시기 바랍니다.

Discover의 기본 동작 방식

이미 블로그의 여러 글에서 소개되었지만, LINE은 Redis나 HBase와 같은 NoSQL 기반의 제품들로 대규모 서비스를 개발하고 운영하고 있습니다. LINE 타임라인과 Discover도 같은 기술을 사용해 서비스를 제공하는데요. 이미 다년간의 노하우로 잘 준비되어 있었기 때문에 큰 어려움 없이 개발할 수 있었습니다. 항상 고려해야 하는 안정성(reliability), 확장성(scalability), 내고장성(fault tolerance) 등에 대한 대응까지 포함해서요. 그래서 우리는 다른 것에 더 집중할 여유가 생겼습니다.

어떻게(how)보다는 무엇(what)에 집중

Discover는 어떤 콘텐츠를 보여줄 것인가가 핵심인 프로젝트입니다. 불과 몇 년 전만 해도 대규모 데이터 저장과 빠른 딜리버리가 주된 주제였다고 하면, 이제는 어떤 관심사 기반으로 데이터를 끄집어내고 발굴해 낼 것인가가 핵심 역량이 되었습니다. LINE DEVELOPER DAY 2019에서도 소개됐던 PicCell(참고)과 같은 이미지/영상 분석 컴포넌트와 머신 러닝 기술을 조합해서, 유사한 사용자들을 묶어 세그먼트를 나누거나 비슷한 관심사를 가진 그룹으로 나누는 등의 작업이 가능하게 되었습니다. 타임라인이 확보한 데이터를 기반으로 학습 모델을 만들고, 그 모델을 이용해 콘텐츠를 분류하고, 사용자가 원하는 관심사를 딜리버리하는 것입니다. 작업 공정 사이클은 다음과 같습니다.

관심사 딜리버리 사이클과 주요 컴포넌트

참고. Discover에 추천되는 데이터는 접근 권한이 읽기 전체 공개로 설정된 콘텐츠로 한정합니다.

1. 콘텐츠를 추천하려면 가장 먼저 콘텐츠의 인기도 또는 관심도를 판단할 데이터가 필요한데요. 사용자가 본 콘텐츠 정보와 '좋아요'나 댓글과 같은 리액션 정보를 분석할 수 있는 형태로 데이터를 쌓습니다.
2, 3, 4. 데이터는 Analysis Data Storage에 모이고, 추천 시스템이 여러 가지 모델의 ML(Machine Learning)을 통해 결과를 만들어 냅니다. 여기에서 어떤 주제로 분류할지, 어떤 콘텐츠를 추천하지 않을지가 결정됩니다.
5. ML을 통해 만들어진 데이터 모델과 그 결과물은 서비스에 서빙할 수 있는 형태로 변환하여 읽기 속도가 빠른 저장소(Recommended Contents Pool)에 저장됩니다. 이제 데이터는 서비스 가능 영역으로 넘어왔습니다.
6. 클라이언트가 Discover 내용을 요청합니다.
7, 8, 9, 10. 요청은 Discover Curator Server에 전달되며, Recommender Server를 통해 추천 콘텐츠를 얻어낸 뒤 그리드 뷰를 구성합니다. 이때 내 소셜 그래프를 참조하여 이미지와 영상 등을 적절히 배치합니다.
11. 데이터가 클라이언트에게 전송되어 화면에 렌더링됩니다.

주요 컴포넌트에 대해 조금 더 자세히 설명하겠습니다.

Discover Curator Server
Recommender Server와 Contents Storage에서 콘텐츠를 가져와 Discover 그리드 뷰를 만드는 역할을 합니다. 이후 광고나 LINE Story 등 다양한 콘텐츠를 Discover에 붙일 수 있도록 확장 가능한 형태로 구현되어 있습니다.

Recommender Server
Recommended Contents Pool의 데이터를 서비스에서 사용할 수 있도록 딜리버리하는 역할을 합니다. Recommended Contents Pool의 데이터를 관리하고 정돈하며, 각종 요구 사항에 맞게 데이터를 분류하여 저장하는데요. 예를 들어 성별, 연령대, 국가, 미디어 유형(이미지 혹은 동영상), 콘텐츠 유형(동물이나 사람 등) 등과 같이 다양한 주제로 분류합니다.

Recommender System
공개 포스트 중 Discover에서 추천할 만한 품질을 가진 추천 후보군인 Recommended Contents Pool을 생성합니다. 품질이 낮거나 유용하지 않다고 판단된 콘텐츠는 여기서 탈락시킵니다. 콘텐츠 유사도를 측정하여 유사 콘텐츠 그래프를 만들고, 서빙에 필요한 로(raw) 데이터를 생성하여 Recommended Contents Pool에 저장하는데요. 내부적으로 아래와 같은 작업을 처리합니다.

  • Similarity Measurement: 사용자가 과거에 관심 있게 보았던 포스트와 유사한 포스트를 추천 후보군에서 찾아 유사 콘텐츠 목록 생성
  • Ranking: 사용자의 선호에 맞게 콘텐츠 정렬
  • Testing: 다양한 ML 기법을 통해 Discover 추천 모델 실험

Contents & Reaction Storage
타임라인 포스트, 라이크나 코멘트와 같은 리액션 정보, 외부 연동 콘텐츠 등 모든 콘텐츠를 저장하는 저장소이며, 모든 데이터는 영구 보관이기 때문에 대용량 데이터 시스템으로 구성되어 있습니다. 위 그림에선 하나의 박스로 표현되었지만, 실제로는 여러 가지 컴포넌트로 구성되어 있습니다. 오래된 콜드(cold) 데이터부터 빠르게 액세스해야 하는 최근 데이터까지 서빙해야 하므로 여러 가지 스토리지 제품을 사용하고 있습니다.

Social Graph DB
타임라인은 구독 관계가 매우 중요합니다. Social Graph DB는 친구와의 Follow 관계를 기반으로 사용자를 차단하거나 피드에서 숨기는 등의 상호 설정을 고려하여 최종 구독 관계를 저장하고 서빙합니다. 내부적으로는, 자체 개발한 HBase 기반의 그래프 데이터 베이스를 사용하고 있습니다. 이와 관련된 부분은 Follow에서 다시 한 번 설명하겠습니다.

Discover의 추천 모델

매우 거창하게 설명했지만, 결국에는 여러 사람들에게 인기 있는 콘텐츠와 내가 관심 있게 본 콘텐츠를 추천해 주는 모델입니다. 여기에 내가 보고 있는 콘텐츠와 유사한 콘텐츠도 같이 추천해 줍니다. 추천에 대한 내용은 지면상 다음 편으로 넘기고, 대략적인 흐름만 간단하게 살펴보겠습니다.

유사성을 판단하기 위해 데이터를 벡터 형태로 변환할 필요가 있습니다. 대상이 되는 공개(public) 포스트를 필터링하고 1차 가공하여 각 카테고리별 벡터 데이터를 생성합니다. 여기서 벡터란 포스트별로 콘텐츠의 특성을 숫자로 바꿔서 표현한 데이터라고 생각하시면 됩니다.

콘텐츠를 벡터로 표현하면, 이 벡터들의 코사인 유사도(cosine similarity)로 콘텐츠의 유사성을 측정할 수 있습니다. 포스트 하나당 네 가지 종류(텍스트, 이미지, 비디오, 소비 이력 기반)의 벡터를 생성하고 이들을 잘 조합하여 하나로 정렬합니다. 내가 관심 있게 본 콘텐츠와 텍스트가 유사한 포스트, 이미지가 유사한 포스트, 비디오가 유사한 포스트, 유사한 패턴으로 소비된 포스트를 모두 포함하는 추천 리스트를 만들 수 있습니다.

Follow 도입 과정과 고민

Follow는 기존 친구 기반의 내 소셜 그래프를 타임라인 공간에서 더 확장할 수 있는 방법을 제공합니다. 이런 관계 확장을 위해서는 지금까지 사용자에게 도달하지 않았던 콘텐츠가 도달하는 공간이 필요하며 그것이 Discover입니다. 둘은 찰떡궁합입니다.

수많은 자기 질문

'과연 소셜 미디어로서의 소셜 그래프는 LINE의 친구 목록과 같을까 다를까?' 저희가 정말 많이 고민하고 논쟁했던 주제입니다. LINE은 메신저지만 소셜 미디어 성격의 타임라인 서비스도 제공합니다. 그래서 다음 공식이 맞기도 하고 아니기도 합니다.

대화(talk) 교류 관계 = 타임라인 교류 관계 ?

실제로 한번 따져봅시다. 나는 내 친구의 소식이 궁금합니다. 하지만 타임라인 공간에는 내 소식을 전하고 싶지 않은 친구도 있고, 보고 싶지 않은 친구의 소식도 있습니다. 그렇기 때문에 위의 공식이 일부 맞긴 하지만, 그렇게 만들고 싶지 않습니다. 그래서 타임라인에는 여러 가지 필터링 기능이 존재합니다. 예를 들면 이런 것들입니다.

  • 내 콘텐츠 공개하지 않기(close/exclude)
  • 피드에서 특정 사용자 보지 않기(user hide)
  • 피드에서 특정 포스트만 보지 않기(post hide)
  • 친구 차단하기(block, 가장 강력한 차단 수단이며 대화까지 차단됨)

이런 기능들을 이용하면 내가 원하는 소식만 받는 공간을 만들 수 있습니다. 하지만 조금 어렵습니다. 그러면 어떻게 해야 할까요?

소셜 그래프의 분리 또는 확장

가장 좋은 것은 LINE 친구 관계에서 시작하지만, 별도로 관리하는 관계 목록으로 분리시킨 뒤 친구와 상관없이 타임라인 공간에서만 소통하고 싶은 사람들로 채우는 것입니다. 하지만 이는 쉽지 않은 일이기 때문에 당장 분리하는 것보다는 확장하는 방법을 선택했습니다. 이렇게 하면 앞서 말씀드린 대로 타임라인 공간을 조금 더 열린 공간으로 만들고자 하는 취지와도 맞습니다. 

Follow는 LINE 연락처라는 큰 틀에 묶이지 않고 구독 관계를 설정할 수 있습니다. 여기에 주목할 필요가 있습니다. 타임라인에서의 관계들을 Follow 기반으로 정리하면, 기존 LINE의 소셜 그래프와는 다른 그래프를 만들 수 있습니다. 기존의 친구들 중 소통하고 싶은 사람만 Follow로 설정할 수 있다면, 즉 마이그레이션할 수 있다면 소셜 그래프를 분리할 수 있습니다. 물론 콘텐츠 구독만을 위한 소셜 그래프가 정리되기까지는 시간이 조금 더 필요하지만, 결과적으로 원하는 형태와 방향으로 갈 수 있을 것이라고 생각합니다.

거대한 관계 정보 서비스를 위한 고민과 노력

타임라인에서는 콘텐츠 생산자와 소비자를 이어주는 공간이 필요하고, 이런 관계를 데이터화해서 저장해야 합니다. 전자는 타임라인 피드이고, 후자는 구독 관계입니다. 구독 관계는 친구, Follow 관계와 각종 필터링 정보를 조합하면 얻을 수 있습니다. 필터링은 타임라인 피드에서 숨기거나, 특정 사용자에게 내 콘텐츠를 비공개하는 등의 기능입니다.

친구의 콘텐츠를 구독한다는 것은 다음과 같은 그래프로 표현할 수 있습니다. 편의상 구독 관계 대신에 친구 관계로 대체해 보겠습니다. 아래 그림에서 왼쪽은 친구 관계를 표현한 것이고, 오른쪽은 포스트 작성 에지(edge)까지 표현해 본 것입니다. 오른쪽이 구독 관계를 표현한다고 할 수 있습니다.

타임라인에서는 이 구독 관계 정보를 효과적으로 저장하고 유지하는 것이 중요합니다. 최초에는 단순한 키-밸류 형태로 저장해 사용했으나, 기능을 수정하거나 확장할 때 매번 키를 재설계하거나 다시 만들어야 하는 일이 많았습니다. 현재는 이런 관계 정보를 효과적으로 저장하고 사용하기 위해 자체 개발한 그래프 데이터베이스를 사용하고 있습니다. 그래프 데이터베이스의 장점은 새로운 관계가 생길 때 그에 대응하는 키-밸류 셋을 정의하고 개발할 필요 없이 존재하는 버텍스(vertex)에 새로운 에지를 연결하면 그만이라는 것입니다. 그래프 데이터베이스는 버텍스와 에지의 CRUD(Create, Read, Update, Delete)와 그래프 탐색 방법을 제공하므로 매번 키-밸류를 다시 만들 필요가 없습니다. 다만, 그래프 데이터베이스만으로는 성능의 한계와 같이 극복해야 할 이슈들이 있기 때문에 이를 한 번 더 감싼 그래프 서비스를 이용해 관계 정보를 저장하고 서비스에 사용합니다.

아래 그림은 친구 에지를 따라가서 친구의 친구가 작성한 포스트를 찾는 것을 나타냅니다. 그래프 데이터베이스를 사용하면 아래 그림과 같은 탐색도 추가 개발 없이 가능합니다. 

실제 서비스는 이런 정보를 매우 빠르게 조회할 수 있어야 하기 때문에 그래프 데이터베이스에만 의존하지는 않습니다. 깊이(depth)가 깊은 그래프 탐색은 성능이 나오지 않기 때문에 각 단계별 버텍스를 빠르게 찾아서 동시에 조회하는 병렬성이 핵심이 됩니다. 이상과 현실은 항상 다르기 때문에 이런 부분을 개선하기 위해 많은 노력을 기울이고 있습니다.

다시 Follow 이야기로 돌아와서, Follow가 등장하면서 구독 관계는 친구와 Follow로 확장되어 최종 구독 관계 에지가 훨씬 더 많아질 것입니다. 

그래프 시스템 관점에선 안티 패턴이지만, 유명 인플루언서나 유명 공식 계정같이 우리에게 필요한 사용자는 이런 패턴을 보입니다. 그래서 우리는 한 사람의 구독 그래프를 성능상 이점을 가질 수 있는 형태로 쪼개고 분류하여 문제를 해결하고 있습니다. 이런 분류 작업은 서비스 내용과 요구 사항에 따라 달라지는 부분이기 때문에 일반화될 수는 없으며, 서비스에 맞게 만들어 나가야 합니다.

Follow도 참 간단하고 단순한 기능 같아 보이지만, 내면에는 서비스와 기술 측면에서 많은 고민과 노력이 필요합니다. 비슷한 고민을 하는 분들에게 참고가 되었으면 좋겠습니다.

맺으며

Discover는 기존에는 발견할 수 없었던 콘텐츠를 끄집어 냈다는 것에 큰 의의가 있습니다. 그리고 Follow는 LINE에서 친구 외에 다른 사람의 콘텐츠를 구독할 수 있는 새로운 소셜 관계를 제공합니다. 이 두 새로운 기능을 통해 타임라인이 조금 더 주목받고 발전하는 공간이 되었으면 좋겠습니다. 저희가 정말 원하는 것은, 타임라인 공간이 사용자에게는 재미와 정보를 찾을 수 있는 공간으로, LINE이라는 서비스 차원에서는 여러 패밀리 서비스와 외부 서비스의 콘텐츠 교류 및 홍보의 장이 되는 것입니다. 타임라인 공간만큼은 조금 더 열린 공간이 되길 바라며, 새로운 소셜 그래프를 만들 수 있는 시작점이 되길 원합니다. 우리는 이것을 Discover와 Follow로 풀어보려고 합니다. 이를 위해 LINE에서 활용할 수 있는 모든 기술을 사용해 볼 예정입니다. 앞으로의 업데이트도 기대해 주시기 바랍니다. 

다음 글에선 'Discover Delivery System'을 소개하겠습니다. 많은 기대 바랍니다.