diff --git a/README.md b/README.md index b4935a3..5b70c1e 100644 --- a/README.md +++ b/README.md @@ -47,20 +47,28 @@ Get Your Feeds는 소셜 미디어 통합 Feed 서비스입니다. ### 2️⃣ 통계(Statistics) -| 필드 | 속성 | 설명 | 예시 값 | -| ---- | ---- | ---- | ------- | -| | | | | +| 필드 | 속성 | 설명 | 예시 값 | +| ------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | +| contentId | string | 게시물이 속한 SNS에서 관리하는 고유 게시물 인식 값입니다. | | +| snsType | enum | SNS 채널 이름입니다.
가능한 값은 "facebook", "twitter", "instagram", "threads" 입니다. | | +| hashtags | string[] | 게시물이 가지고 있는 해시태그(string)의 배열입니다. | ['apple','mobile','WWDC'] | +| viewCountByDate | enum[] | 게시물의 일자별 조회수를 담고있는 배열입니다. 일자별 게시물 조회 수를 집계할 때 사용합니다. enum의 타입은 {count:number, measurementDate:Date}[] 입니다. | [{count: 10, measurementDate:2023-01-01T00:00:01.991Z }, {count: 65, measurementDate:2023-01-02T00:00:01.991Z }] | +| likeCountByDate | enum[] | 게시물의 일자별 좋아요 수를 담고있는 배열입니다. 일자별 게시물 좋아요 수를 집계할 때 사용합니다. enum의 타입은 {count:number, measurementDate:Date}[] 입니다. | [{count: 10, measurementDate:2023-01-01T00:00:01.991Z }, {count: 65, measurementDate:2023-01-02T00:00:01.991Z }] | +| shareCountByDate | enum[] | 게시물의 일자별 공유 수를 담고있는 배열입니다. 일자별 게시물 공유 수를 집계할 때 사용합니다. enum의 타입은 {count:number, measurementDate:Date}[] 입니다. | [{count: 10, measurementDate:2023-01-01T00:00:01.991Z }, {count: 65, measurementDate:2023-01-02T00:00:01.991Z }] | +| articleCreationDate | Date | 게시물이 생성된 시간입니다. 기간별 게시물 생성 수를 집계할 때 사용합니다. | [{count: 10, measurementDate:2023-01-01T00:00:01.991Z }, {count: 65, measurementDate:2023-01-02T00:00:01.991Z }] | + +- hashtags와 measurementDate로 일정 기간동안의 게시물 조회 수, 좋아요 수, 공유 수 read와 write(create, update)가 자주 진행되므로 복합 인덱스를 생성하였습니다. +- hashtags와 articleCreationDate로 일정 기간동안의 게시물 생성 수로 read가 자주 진행되고 지속해서 write(create)되는 많은 양의 도큐먼트를 빠르게 조회하기 위해 복합 인덱스를 생성하였습니다.
### 3️⃣ 사용자(User) -| 필드 | 속성 | 설명 | 예시 값 | -|------------------|-------------------------------------------------|------------------------|----------------------------------------------| -| email | `unique: true` | 사용자의 이메일 주소 | "user@example.com" | -| password | | 사용자의 비밀번호 | "SecureP@ssw0rd1" | -| connectedServices| `Array of { service: String, accountTag: String }` | 연결된 소셜 미디어 서비스들 | [{ service: "twitter", accountTag: "@user" }] | - +| 필드 | 속성 | 설명 | 예시 값 | +| ----------------- | -------------------------------------------------- | --------------------------- | --------------------------------------------- | +| email | `unique: true` | 사용자의 이메일 주소 | "user@example.com" | +| password | | 사용자의 비밀번호 | "SecureP@ssw0rd1" | +| connectedServices | `Array of { service: String, accountTag: String }` | 연결된 소셜 미디어 서비스들 | [{ service: "twitter", accountTag: "@user" }] |
@@ -204,15 +212,36 @@ project-root --- -## 게시물 통계(Statistics) +### 게시물 통계(Statistics) -#### 1. 게시물 통계 데이터 조회 : 해시태그(hashtag)로 검색된 게시물의 시계열 통계 지표(게시물 생성, 조회, 좋아요, 공유 등의 수)를 조회 할 때 사용되는 API +#### 1. 게시물 통계 데이터 조회 -**Endpoint:** `GET /articles` +**Endpoint:** `GET /statistics/articles` **Method:** `GET` -**Description:** Retrieve statistics for articles over a specific period. +**Description:** 해시태그(hashtag)로 검색된 게시물의 시계열 통계 지표(게시물 생성, 조회, 좋아요, 공유 등의 수)를 조회 할 때 사용되는 API **Query Parameters:** `GetArticleStatisticsDto` +| query | 속성 | default(미입력 시 값) | 설명 |예시| +| --- | --- | --- | --- |---| +| hashtags | string[] | sns의 계정태그 | 게시물 통계 검색을 희망하는 해시태그(string)입니다. 여러개의 해시태그를 검색하는 경우 공백(white space) 없이 컴마(,)로 구분합니다.
해시태그를 보내지 않는 경우, 유저의 계정태그(accountTag)로 검색됩니다.'|'apple,mobile,WWDC'| +| periodType | string (열거형) | 필수 값 | 게시물 통계 검색 시 설정하는 조회 기간 유형입니다. 열거형으로 'date','hour'입니다.
1시간 단위 검색은 hour이며 1일 단위 검색은 date입니다. || +| startDate | date | 오늘로 부터 7일전 | periodType이 hour일 때, 조회 기간의 시작 "시간"이 되며, periodType이 date일 때, 조회 기간의 시작"일자"가 됩니다.
periodType이 date일 경우 시작 일자의 시간은 생략할 수 있습니다. || +| endDate | date | 오늘 | periodType이 hour일 때, 조회 기간의 끝 "시간"이 되며, 최대 7일을 조회할 수 있습니다. periodType이 date일 때, 조회 기간의 끝 "일자"가 되며, 최대 30일을 조회할 수 있습니다.
periodType이 date일 경우 끝 일자의 시간은 생략할 수 있습니다.|| +| value | enum | count |'어떤 통계 지표를 검색 할 지 선택하는 값 입니다. 게시물 수(count), 게시물 조회수(viewCount), 게시물 좋아요 수(likeCount), 게시물 공유 수(s hareCount)를 선택할 수 있습니다.|| + **Response:** `GetArticleStatisticsResDto` +| field | 속성 | 설명 |예시| +| --- | --- | --- | --- | +|isExistData|boolean|요청한 데이터가 해당 기간에 존재하는지에 대한 유무입니다.|| +|data|IGetArticleStatisticsData[]|요청한 데이터의 값 배열입니다.|[ { date: '2023-09-15T00:00:00.000Z', likeCount: 8 },{ date: '2023-09-15T08:00:00.000Z', likeCount: 1 },{ date: '2023-09-15T12:00:00.000Z', likeCount: 2 }]| + +
+Request/Response Flow +
+- 요청 dto(GetArticleStatisticsDto)에서 query가 요구사항에 부합하는 값을 보냈는지를 검증합니다. +- 하나의 api로 다양한 쿼리가 가능하도록 쿼리 필드의 값에 따라 쿼리가 자동 생성되는 OperatorFactory를 레포지토리 레이어에 함수로 작성하였습니다. OperatorFactory 함수에서 만들어진 operator로 mongoose의 aggregate(집계)메소드가 실행되며 통계 데이터를 데이터베이스에서 조회합니다. +- 응답 dto(GetArticleStatisticsResDto)에서, 데이터베이스에서 조회된 값을 클라이언트가 값을 조회하기 쉽도록 가공합니다. + +
---