{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":600352708,"defaultBranch":"develop","name":"seat-view-reviews","ownerLogin":"Seongjun-Kwon","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2023-02-11T08:11:51.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/82152173?v=4","public":true,"private":false,"isOrgOwned":false},"refInfo":{"name":"","listCacheKey":"v0:1698563282.0","currentOid":""},"activityList":{"items":[{"before":"5313c32aa9c5e88550268bb15062f65ec258af94","after":null,"ref":"refs/heads/feat/#190","pushedAt":"2023-10-29T07:08:02.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"}},{"before":"1e26ce4d9d806ee33f0a2a7fabd572303056ecec","after":"94504e1a4da6d158b7b83e60bb1639f5d327a070","ref":"refs/heads/develop","pushedAt":"2023-10-29T07:08:01.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"},"commit":{"message":"Feat: 회원 포인트 관련 엔티티 구현 (#191)","shortMessageHtmlLink":"Feat: 회원 포인트 관련 엔티티 구현 (#191)"}},{"before":null,"after":"5313c32aa9c5e88550268bb15062f65ec258af94","ref":"refs/heads/feat/#190","pushedAt":"2023-10-29T07:02:14.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"},"commit":{"message":"Feat: 회원 포인트 관련 엔티티 구현","shortMessageHtmlLink":"Feat: 회원 포인트 관련 엔티티 구현"}},{"before":"c40aaebb709c183b2d1ebea3e8093d99f3c4de68","after":null,"ref":"refs/heads/style/#188","pushedAt":"2023-09-08T12:49:12.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"}},{"before":"5fe806d4172bda9fcb9e2c4055c27f5ea9d8926f","after":"1e26ce4d9d806ee33f0a2a7fabd572303056ecec","ref":"refs/heads/develop","pushedAt":"2023-09-08T12:49:12.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"},"commit":{"message":"Style: ReviewVote 이름을 Vote 로 변경 (#189)","shortMessageHtmlLink":"Style: ReviewVote 이름을 Vote 로 변경 (#189)"}},{"before":null,"after":"c40aaebb709c183b2d1ebea3e8093d99f3c4de68","ref":"refs/heads/style/#188","pushedAt":"2023-09-08T12:45:23.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"},"commit":{"message":"Style: ReviewVote 이름을 Vote 로 변경","shortMessageHtmlLink":"Style: ReviewVote 이름을 Vote 로 변경"}},{"before":"6f214ae99b9870c414a18064ed7c722c4548bf50","after":null,"ref":"refs/heads/chore/#185","pushedAt":"2023-09-08T12:26:32.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"}},{"before":"09b079041625ffd3a3eed5ab90f9105aabd493b8","after":"5fe806d4172bda9fcb9e2c4055c27f5ea9d8926f","ref":"refs/heads/develop","pushedAt":"2023-09-08T12:26:31.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"},"commit":{"message":"Chore: 불필요한 파일 제거 (#187)","shortMessageHtmlLink":"Chore: 불필요한 파일 제거 (#187)"}},{"before":null,"after":"6f214ae99b9870c414a18064ed7c722c4548bf50","ref":"refs/heads/chore/#185","pushedAt":"2023-09-08T12:23:42.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"},"commit":{"message":"Chore: 불필요한 파일 제거","shortMessageHtmlLink":"Chore: 불필요한 파일 제거"}},{"before":"639a8b497b2a660621bccd47994c82d491f26998","after":null,"ref":"refs/heads/chore/#184","pushedAt":"2023-09-08T12:19:41.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"}},{"before":"c5999481c0e2a56ef888cdc7ba822fdd1c702317","after":"09b079041625ffd3a3eed5ab90f9105aabd493b8","ref":"refs/heads/develop","pushedAt":"2023-09-08T12:19:40.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"},"commit":{"message":"Chore: 패키지 구조 변경 (#186)","shortMessageHtmlLink":"Chore: 패키지 구조 변경 (#186)"}},{"before":null,"after":"639a8b497b2a660621bccd47994c82d491f26998","ref":"refs/heads/chore/#184","pushedAt":"2023-09-08T12:16:11.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"},"commit":{"message":"Chore: 패키지 구조 변경","shortMessageHtmlLink":"Chore: 패키지 구조 변경"}},{"before":"882445b307bdbcb08db1880889eb5f8b78aeb9d9","after":null,"ref":"refs/heads/docs/#182","pushedAt":"2023-09-05T20:54:48.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"}},{"before":"e9dbd3a69e1177cbba2a1005213b50b1b95ecf80","after":"c5999481c0e2a56ef888cdc7ba822fdd1c702317","ref":"refs/heads/develop","pushedAt":"2023-09-05T20:54:47.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"},"commit":{"message":"Docs: 리드미 수정 (#183)","shortMessageHtmlLink":"Docs: 리드미 수정 (#183)"}},{"before":null,"after":"882445b307bdbcb08db1880889eb5f8b78aeb9d9","ref":"refs/heads/docs/#182","pushedAt":"2023-09-05T20:51:00.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"},"commit":{"message":"Docs: 리드미 수정","shortMessageHtmlLink":"Docs: 리드미 수정"}},{"before":"d90426fed5839eeda372697276a5176af014b9d1","after":null,"ref":"refs/heads/chore/#175","pushedAt":"2023-09-03T11:42:59.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"}},{"before":"6d479abacfea5e96e6f27c8265e1bd3ab9e6393d","after":"e9dbd3a69e1177cbba2a1005213b50b1b95ecf80","ref":"refs/heads/develop","pushedAt":"2023-09-03T11:42:58.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"},"commit":{"message":"Chore: 불필요한 CookieUtils 클래스 제거 (#181)","shortMessageHtmlLink":"Chore: 불필요한 CookieUtils 클래스 제거 (#181)"}},{"before":null,"after":"d90426fed5839eeda372697276a5176af014b9d1","ref":"refs/heads/chore/#175","pushedAt":"2023-09-03T11:39:00.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"},"commit":{"message":"Chore: 불필요한 CookieUtils 클래스 제거","shortMessageHtmlLink":"Chore: 불필요한 CookieUtils 클래스 제거"}},{"before":"a7c07047da438a64ab062f1fddacf4d9b514d2f1","after":null,"ref":"refs/heads/fix/#179","pushedAt":"2023-09-03T08:58:24.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"}},{"before":"6a9ed882747635a092b692d6ccb796d68745e904","after":"6d479abacfea5e96e6f27c8265e1bd3ab9e6393d","ref":"refs/heads/develop","pushedAt":"2023-09-03T08:58:23.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"},"commit":{"message":"Fix: 잘못된 락 이름 수정 (#180)\n\n- 문제\r\n - 후기 투표(좋아요/싫어요) 변경, 후기 조회 수 갱신 시 생성되는 락 이름을 후기와는 상관 없이 전역적으로(ex.reviewVoteLock, viewCountLock) 지었다. 그래서 후기 1에 투표를 생성할 때, 후기 1의 투표 변경 로직에만 락이 걸려야 하는데 다른 후기의 투표를 변경하는 로직도 락이 걸리게 되었다.\r\n\r\n- 해결\r\n - 락 이름에 후기 이름을 추가해주어 구분 가능하게 하였다.","shortMessageHtmlLink":"Fix: 잘못된 락 이름 수정 (#180)"}},{"before":null,"after":"a7c07047da438a64ab062f1fddacf4d9b514d2f1","ref":"refs/heads/fix/#179","pushedAt":"2023-09-03T08:47:53.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"},"commit":{"message":"Fix: 잘못된 락 이름 수정","shortMessageHtmlLink":"Fix: 잘못된 락 이름 수정"}},{"before":"25e51e2d74bd328ff7cfdd11fa5974be54e16827","after":null,"ref":"refs/heads/refactor/#156","pushedAt":"2023-09-02T13:02:29.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"}},{"before":"f77cfe7fed88718a0b79b77c1d8a1532069efea7","after":"6a9ed882747635a092b692d6ccb796d68745e904","ref":"refs/heads/develop","pushedAt":"2023-09-02T13:02:28.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"},"commit":{"message":"Refactor: redis 에서 최근 조회 수 조회하는 로직 성능 개선 (#178)\n\n- 문제\r\n - 후기의 조회 수 데이터를 기존에는 (key, value) 가 ('후기 id + 조회 시간', '조회 수') 형태인 Map 에 저장했다. 그렇기에 조회 수 갱신 시 필요한 최신 조회 수 탐색 시 O(N) 의 시간이 걸렸다.\r\n\r\n- 해결\r\n - Redis sorted set 을 이용하여 저장하였다. set 의 이름에 후기 id 를 포함해 후기를 구분할 수 있게 하고, set 의 score 로 조회 시간(유닉스타임 형식), value 로 조회 수를 저장하도록 하였다. 조회 시간을 score 로 두어 최신 조회 수를 O(1) 에 조회할 수 있게되었다.\r\n\r\n- 결과\r\n - JMeter 를 활용하여 변경 전후를 비교해본 결과 데이터가 200개 있는 상황에서도 TPS 가 18% 가량 증가했다. 대규모로 데이터가 많을수록 TPS 가 월등히 개선될 것이다.","shortMessageHtmlLink":"Refactor: redis 에서 최근 조회 수 조회하는 로직 성능 개선 (#178)"}},{"before":null,"after":"25e51e2d74bd328ff7cfdd11fa5974be54e16827","ref":"refs/heads/refactor/#156","pushedAt":"2023-09-02T12:41:02.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"},"commit":{"message":"Refactor: redis 에서 최근 조회 수 조회하는 로직 성능 개선","shortMessageHtmlLink":"Refactor: redis 에서 최근 조회 수 조회하는 로직 성능 개선"}},{"before":"914799ff32c7dbc4afc7271cc96bbc9d85a33558","after":null,"ref":"refs/heads/fix/#176","pushedAt":"2023-09-01T10:14:54.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"}},{"before":"01bcd93b59edfeb800efd4b811be5e34762fdb14","after":"f77cfe7fed88718a0b79b77c1d8a1532069efea7","ref":"refs/heads/develop","pushedAt":"2023-09-01T10:14:53.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"},"commit":{"message":"Fix: 회원만 조회 수 증가 가능하도록 수정 (#177)\n\n- 기존 방식은 userKey 쿠키에 UUID 를 담아서 사용자를 구분하고, UUID + 조회한 후기 id 형태의 데이터를 redis 에 저장하여 조회 수 중복 증가를 방지하였다. 하지만, 이 방식은 사용자가 쿠키를 비우면 새로운 사용자로 취급되므로 조회 수 어뷰징의 가능성이 있다. 그러므로, 회원만 조회 수 증가가 이루어지도록 방식을 변경하였다.","shortMessageHtmlLink":"Fix: 회원만 조회 수 증가 가능하도록 수정 (#177)"}},{"before":null,"after":"914799ff32c7dbc4afc7271cc96bbc9d85a33558","ref":"refs/heads/fix/#176","pushedAt":"2023-09-01T10:08:43.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"},"commit":{"message":"Style: 메서드명 가독성 좋게 수정\n\n- hasNotViewedReview -> doNotViewReview\n - 회원이 후기를 봤는지를 판별하는 메서드임","shortMessageHtmlLink":"Style: 메서드명 가독성 좋게 수정"}},{"before":"7d5b194c7d2321db2426b31822b890d10b58c423","after":null,"ref":"refs/heads/fix/#172","pushedAt":"2023-08-25T16:47:16.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"}},{"before":"d62f30c763282020eb686fd16b41fdbf048a0096","after":"01bcd93b59edfeb800efd4b811be5e34762fdb14","ref":"refs/heads/develop","pushedAt":"2023-08-25T16:47:15.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"},"commit":{"message":"Fix: 후기 테이블의 투표 수 컬럼 추가로 인한 동시성 제어 로직 추가 (#174)\n\n- 락을 걸지 여부\r\n - 투표 수가 실시간으로 정합성이 맞아야하는 것은 아님. 일정 주기로 투표 테이블에 있는 수를 count 해서 후기의 투표 수 컬럼에 반영해줘도 됨. 다만 후기의 수가 많아질수록 부담이 커지므로 락을 거는 방식으로 해결하기로 함.\r\n\r\n- 어떤 식으로 락을 걸 것인가?\r\n - synchronized, 비관적락, 낙관적락, 분산락 정도가 있음.\r\n - 비관적락\r\n - 투표 테이블에 쓰기 락이 걸림. 투표 생성 중에는 다른 트랜잭션에서 투표 테이블의 조회도 불가능하게 됨. 투표는 생성보다도 조회가 잦음. 성능적으로 이슈 있음.\r\n - 낙관적락\r\n - 투표 생성은 충돌이 자주 일어나지 않을 것이라 판단됨. 대규모 커뮤니티 실시간 인기글을 보아도 투표 수가 많아야 300개 정도임. 프론트 단에서 투표 생성 시 모달 창 단계를 추가한다면 더더욱 충돌이 줄어들 것임.\r\n - 결론\r\n - 현재 서버는 싱글 서버, 싱글 DB 라서 낙관적락으로도 충분함. 다만, 분산 서버, 분산 DB 환경임을 가정한다면 버전을 동기화해주는 추가적인 리소스가 필요함. synchronized 도 같은 이유로 배제하고 Redis 를 활용한 분산락을 선택함.","shortMessageHtmlLink":"Fix: 후기 테이블의 투표 수 컬럼 추가로 인한 동시성 제어 로직 추가 (#174)"}},{"before":null,"after":"7d5b194c7d2321db2426b31822b890d10b58c423","ref":"refs/heads/fix/#172","pushedAt":"2023-08-24T15:40:52.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"Seongjun-Kwon","name":"Seongjun Kwon","path":"/Seongjun-Kwon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/82152173?s=80&v=4"},"commit":{"message":"Test: 동시성 로직 추가에 따른 테스트 코드 작성 및 문서화","shortMessageHtmlLink":"Test: 동시성 로직 추가에 따른 테스트 코드 작성 및 문서화"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"startCursor":"Y3Vyc29yOnYyOpK7MjAyMy0xMC0yOVQwNzowODowMi4wMDAwMDBazwAAAAOiRMUT","endCursor":"Y3Vyc29yOnYyOpK7MjAyMy0wOC0yNFQxNTo0MDo1Mi4wMDAwMDBazwAAAANxz2hC"}},"title":"Activity · Seongjun-Kwon/seat-view-reviews"}