문서 소개
- 이 문서에서는 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
복사