kookmin-sw / capstone-2023-05

capstone-2023-05 created by GitHub Classroom
https://capstone-2023-05.vercel.app
0 stars 0 forks source link

Back/feat/best opinions function #67

Closed seungholee-dev closed 1 year ago

seungholee-dev commented 1 year ago

기능

테스팅 방법

  1. model.sql의 변경사항을 DB에 적용해주세요
  2. Opinion들의 status를 모두 CANDIDATE로 바꾸고 Like수를 맘대로 정해주세요
  3. Host 1명, A팀 1명, B팀 1명으로 모두 InitJoin해주세요
  4. A팀, B팀 인원 각각 Vote해주세요!
  5. Host에서 preparationStart action을 보내주세요 :)

기대 결과

아래와 같이 받으면 성공입니다 :)

{
    "action": "recvNewAds",
    "result": "success",
    "bestOpinions": [
        [
            {
                "userId": "ho@kookmin.ac.kr",
                "order": 10,
                "likes": 50,
                "content": "I like CS",
                "publishTime": "2023-05-16 04:29:43.445392",
                "dropTime": "2023-05-16 04:29:48.704257",
                "status": "DROPPED"
            },
            {
                "userId": "ho@kookmin.ac.kr",
                "order": 13,
                "likes": 33,
                "content": "I like CS",
                "publishTime": "2023-05-16 04:29:38.112082",
                "dropTime": "2023-05-16 04:29:43.437138",
                "status": "DROPPED"
            },
            {
                "userId": "ho@kookmin.ac.kr",
                "order": 7,
                "likes": 30,
                "content": "I like CS",
                "publishTime": "2023-05-16 04:29:38.112082",
                "dropTime": "2023-05-16 04:29:43.437138",
                "status": "DROPPED"
            }
        ],
        [상대팀 best의견............]

    ]
}

실시간으로 기준에 맞게 best_opinion 의견을 리턴하는지 확인해주세요! 기준은 아래와 같습니다.

3개 혹은 그 미만의 best_opinions의견 return DROPPED 의견: likes / (dropTime - publishTime) PUBLISHED 의견: likes / (now - publishTime) CANDIDATE 의견: 아직 전광판에 올라오지 않았으므로 best_opinions에 포함시키지 않습니다 :)

Jaewook-Lee commented 1 year ago

반환하는 "bestOpinions" 양식이 Notion에서 정의된 바와 다릅니다. Notion과 다르게 여기서는 "order", "publishTime", "dropTime", "status"도 있네요.
그리고 "newAds"도 "publishTime"과 "dropTime", "status"도 반환하는 내용에 추가했던데 이렇게 반환한 이유가 있나요?

Jaewook-Lee commented 1 year ago

추가적으로 테스트 결과 에러는 일어나지 않지만 결과가 이상한 것 같아요.
먼저 저는 Opinion Table을 아래와 같은 내용으로 삽입한 후 테스트를 진행했습니다.
Opinion_Table.csv
그리고 refresh 시간은 10초, refresh 횟수는 3회로 설정하고 테스트를 진행했습니다. 지금부터 아래에 적을 출력 내용은 일부 항목들만(order, likes) 작성했습니다. 실제 메세지를 받을 때는 모든 값들이 정상적으로 왔습니다.

첫 번째 refresh 후

"1"팀 참여자에게 돌아온 메세지는 다음과 같았습니다.

new_ads = [
  {"order": 26, "likes": 9},
  {"order": 36, "likes": 5},
  {"order": 1, "likes": 3},
  {"order": 31, "likes": 4},
  {"order": 61, "likes": 0},
  {"order": 6, "likes": 1},
  {"order": 16, "likes": 4},
  {"order": 76, "likes": 1},
  {"order": 11, "likes": 5},
  {"order": 56, "likes": 1},
  {"order": 51, "likes": 1},
  {"order": 21, "likes": 11}
]

두 번째 refresh 후

bestOpinions = [
  {"order": 21, "likes": 11},
  {"order": 26, "likes": 9},
  {"order": 36, "likes": 5}
]
new_ads = [
  {"order": 21, "likes": 11},
  {"order": 26, "likes": 9},
  {"order": 36, "likes": 5},
  {"order": 66, "likes": 3},
  {"order": 46, "likes": 9},
  {"order": 41, "likes": 5},
  {"order": 71, "likes": 1}
]

세 번째 refresh 후

bestOpinions = [
  {"order": 11, "likes": 5},
  {"order": 16, "likes": 4},
  {"order": 31, "likes": 4}
],
new_ads = [
  {"order": 21, "likes": 11},
  {"order": 26, "likes": 9},
  {"order": 36, "likes": 5}
]

문제점

위 과정에서의 문제점은 아래와 같습니다.

첫 번째 문제점은 Ads 중에서도 상위 3개는 좀 더 살아있게 하는 benefit을 주지만 얼만큼 살아있게 하는지 정확히 하지 못한 저의 문제인 것 같으니 이 점은 우리 팀에게 다시 물어보겠습니다.
두 번째 문제점을 느낀 이유는 다음과 같습니다.

두 번째 refresh 때의 Best3는 단위 시간 당 좋아요 수가 각각 0.9, 0.5, 1.1이다. >
새롭게 골라진 Ads의 좋아요는 3, 9, 5, 1로 설정되어있다. >
세 번째 refresh 때, 전의 Best3의 단위 시간 당 좋아요 수는 0.45, 0.25, 0.55로 줄어든다. >
전의 새로운 Ads의 단위 시간 당 좋아요는 0.3, 0.9, 0.5, 0.1이 된다. >
하지만 세 번째 refresh 때의 best3의 단위 시간 당 좋아요 수를 보면 각각 0.4, 0.4, 0.5이다. >
0.55와 0.9가 best3에 선정되지 못 했다??

그래서 best3 결과가 이상하다고 느꼈습니다. 혹시 함수 로직에 문제가 있는 건지, 아니면 제가 뭔가 잘 못 이해하고 있는건지 모르겠네요..

Binsk-dev commented 1 year ago

일단 동작은 확인했습니다. 하지만 역시나 재욱님이 만드신 preparationStart 액션의 첫 response는 Internal server error 더군요. 저도 재욱님의 문제상황을 보면서 단위 시간이라는 개념이 혼동되기 시작하는데 한번 다같이 모여서 확인해야 할 시간이 필요한 듯합니다.

seungholee-dev commented 1 year ago

자세한 리뷰 감사드려요 :)

반환하는 "bestOpinions" 양식이 Notion에서 정의된 바와 다릅니다. Notion과 다르게 여기서는 "order", "publishTime", "dropTime", "status"도 있네요. 그리고 "newAds"도 "publishTime"과 "dropTime", "status"도 반환하는 내용에 추가했던데 이렇게 반환한 이유가 있나요?

해당 부분 제가 개발을 하는 과정에서 삭제를 못했네요 ㅠㅠ 현재 삭제했어요! :)

best3의 함수 재욱님의 결과를 바탕으로 지금 확인 중이요! :100:

seungholee-dev commented 1 year ago

구현 과정에서 단위 시간당 계산 중에 PUBLISHED와 DROPPED이 다른데요, 아마 그 과정에서 나누는 시간의 크기가 달라서 아마 결과가 그렇게 나오지 않았나 싶은데 혹시 dropTime, publishTime, status를 같이 확인 부탁드려도 될까요?

PUBLISHED의 경우는 likes / (now - publishTime)으로 계산이 되고 DROPPED의 경우는 likes / (dropTime - publishTime)으로 계산이 되는데 아마도 PUBLISHED된 의견의 like의 숫자가 많아도 DROPPED된 의견의 생존 시간이 더 짧았으면 단위 시간 당 Likes가 더 크게 나와서 그런 것 같은 느낌입니다!

@Jaewook-Lee

Jaewook-Lee commented 1 year ago

@PricelessCode column 값들을 다시 보면서 계산해보니까 승호 님이 의도한대로 출력되는게 맞았네요! 제가 계산 과정에서 약간 헷갈렸던게 있었던 것 같아요.
처음에 Ads에 살아남았던 3개의 ads가 계속 끝까지 살아남아서 헷갈렸던 것 같아요.
상위 Ads 3개는 한 번의 refresh cycle 동안만 더 살아남을 수 있도록 수정해야 하는데 제가 할까요?

seungholee-dev commented 1 year ago

진행해주시면 감사할 것 같아요! 현재 프론트엔드 팀에서 요청한 기능을 구현 중이어서요!

Jaewook-Lee commented 1 year ago

또... Opinion 테이블에 publishTime과 dropTime 시간대가 우리나라 시간대가 아니네요...
로직은 다시 확인한 결과 잘 동작합니다.

seungholee-dev commented 1 year ago

감사합니다! 해당 부분 수정햇어요!