///
Search
Duplicate

SNS 채널 분석

문서 소개 - 이 문서에서는 SNS 채널 분석 관련 db 명세만을 다룹니다. - 채널분석 내 컨텐츠분석은 다루지 않습니다. - 이 문서는 SNS 채널 분석 백엔드의 1차 명세로, 얼마든지 논의를 통해 바뀔 수 있습니다. - 논의하고 싶으면, 이 문서에 코멘트를 남겨주세요. - sns 채널분석 기획안은 여기 에서 확인 가능합니다.

1. 제공해야 할 기능

정의

sns 채널 이란?
페이스북, 인스타그램, 틱톡 등의 sns 에서 비즈니스 계정으로 운영하는 sns 페이지
sns 채널 운영 현황 이란?
sns 채널별로 운영되는 과정에서 볼 수 있는 좋아요, 팬, 댓글, 공유수 등의 수치가 있음
sns 채널 분석이란
sns 채널 운영 현황을 점수화함. 그리고 이 점수를 테이블과 차트 등의 형태로 시각화
이를 통해, 채널별 운영상태가 어떤지 파악할 수 있음

목적

채널 분석
현재 운영중인 sns 채널 운영 현황 파악
경쟁사의 sns 채널 운영 현황 파악
sns 채널에 업데이트 된 컨텐츠의 사용자 반응 분석

제공할 기능

사용자가 보고 싶은 sns 채널을 등록할 수 있다
사용자가 등록된 sns 채널의 운영현황을 매일 자동으로 수집하고 점수를 계산한다
사용자는, sns 채널별 매일의 계산된 점수를 채널별로 확인할 수 있다.

2. db table

모든 테이블은 공통적으로 아래 필드를 가집니다 - created_at (공통적으로 인덱스 적용) - deleted_at (soft delete를 위함)

1) SnsChannel

목적

분석할 SNS 채널 정보를 저장

주요 필드

type
페이스북, 인스타그램, 유튜브, 네이버블로그 중 한 값
enum / int / string 중 어떻게 저장할지 고민
name: 채널명
url: 채널 url

2) UserSnsChannel

목적

User가 등록한 SnsChannel 을 저장
Snschannel 과 1(Snschannel):N(UserSnsChannel)
User 와 1(User):N(UserSnsChannel)

주요 필드

user_id
sns_channel_id
(type 필드를 둘지 말지 고민)

3) SnsChannelMetricsDaily

목적

SnsChannel 별로 매일의 점수를 계산하여 저장
Snschannel 과 1(Snschannel):N(SnsChannelMetricsDaily)

필드

sns_channel_id
SnsChannel의 레코드 Id 저장
이 필드에 인덱스 지정 필요
type
OVERALL, FAN, LIKE, COMMENT, SHARE, CREATED_CONTENTS 중 하나의 값을 가짐
score: 점수 절대값
grade
콘텐츠 평균 점수에서 “매우좋음, 좋음, 보통, 나쁨, 아주나쁨” 5개로 나누어 시그널 자체 평균 등급 표시
score_delta: 전날 대비 변화량
rate: 종합점수를 백분률 상대값을 계산하여 시그널 자체 백분률로 표시

저장 방법

한 sns 채널 당 매일 총 6개의 레코드가 생성
각 타입(OVERALL, FAN, LIKE, COMMENT, SHARE, CREATED_CONTENTS) 당 레코드가 1개 생김

3. 정보 저장 방법

1) 사용자가 SNS 채널을 등록할 때

채널명과 url에 해당하는 기존 SnsChannel 레코드가
없으면
SnsChannel 레코드 생성
생성된 SnsChannel 와 로그인된 사용자의 id를 기반으로 SnsChannel 생성
있으면
기존 SnsChannel 와 로그인된 사용자의 id를 기반으로 SnsChannel 생성

2) 등록된 sns 채널별 점수를 수집할 때

저장할 정보

수집해야 하는 항목
좋아요
코멘트
댓글
콘텐츠등록
항목별 수집해야 하는 항목
수집 당시 항목의 수치
수집된 항목을 바탕으로 계산해야 하는 점수
전날과의 비교 수치
점수를 기반으로 각 항목의 시그널 자체등급
점수를 기반으로 각 항목의 시그널 자체 백분률

정보를 수집하는 곳

크롤러 서버에서 정보를 수집

정보를 저장

메인 서버에서는 SnsChannel 레코드를 기반으로 수집할 채널 목록 추출
추출된 채널 목록을 바탕으로 크롤러 서버에 정보수집 요청
정보수집요청의 응답값을 바탕으로 채널별 점수 계산하여 저장

저장하는 시점

정보를 수집해야 할 채널이 많을 것을 대비하여, 크롤러 서버에는 채널목록을 chunk하여 천천히 요청
매일 자정 ~ 2-3시까지 채널별 수치 수집

4. 예상 api

예상 api는 graphql 로 쿼리 구현시 예상될 쿼리를 작성한 것입니다. - graphql 에 대한 기본적인 이해가 있어야, query/mutation 을 쉽게 이해할 수 있을 듯 합니다. 아래와 같은 코딩컨벤션에 대한 논의가 진행된 이후, 쿼리형태는 바뀔 수 있습니다. - 목록 타입을 어떻게 할지 - 페이지네이션은 어떻게 할지 - camel과 snake중 어떤 네이밍컨벤션으로 정할지

1) Query

화면기획안 과 같이 보면 이해가 쉽습니다.

사용자가 등록한 sns 채널 목록

type Query { getUserSnsChannelList(type: SnsChannelType!): [UserSnsChannel!]! } type SnsChannelType { FACEBOOK, INSTAGRAM, YOUTUBE, NAVER_BLOG } type UserSnsChannel { type: SnsChannelType! snsChannel: SnsChannel! } type SnsChannel { name: String! url: String! }
GraphQL
복사

사용자의 등록된 채널 요약 정보

type Query { getUserSnsChannelList(type: SnsChannelType!): [UserSnsChannel!]! } type UserSnsChannel { snsChannel: SnsChannel! } type SnsChannel { name: String! todayMetrics: [SnsChannelMetricsDaily!]! } type SnsChannelMetricsDaily { type: SnsChannelMetricsDailyType! score: Int! scoreDelta: Int! grade: SnsChannelMetricsDailyGrade! rate: Int! } enum SnsChannelMetricsDailyType { OVERALL FAN LIKE COMMENT SHARE CREATED_CONTENTS } enum SnsChannelMetricsDailyGrade { VERY_GOOD GOOD NORMAL BAD VERY_BAD } # 호출은 아래와 같이 하면 됨 query { getUserSnsChannelList { snsChannel { name todayMetrics { type score scoreDelta grade rate } } } }
GraphQL
복사

채널 성장 추이

type Query { getSnsChannelMetricsDailyList( $snsChannelIdList: [ID!]!, # 같은 화면에 있는, 사용자가 등록한 sns 채널 목록 을 바탕으로 입력 $dateFrom: Date!, $dateTo: Date!, $type: SnsChannelMetricsDailyType! ): [SnsChannelMetricsDaily!]! } type SnsChannelMetricsDaily { createdAt: Date! score: Int! # 누적 scoreDelta: Int! # 일별 }
GraphQL
복사

2) Mutation

채널 등록하기

type Mutation { createUserChannel(input: CreateUserChannelInput): UserSnsChannel! } input CreateUserChannelInput { name: String! url: String! }
GraphQL
복사

채널 삭제하기

type Mutation { deleteUserChannel(id: ID!): Boolean }
GraphQL
복사