kookmin-sw / capstone-2023-05

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

feat: Send opinion #49

Closed Jaewook-Lee closed 1 year ago

Jaewook-Lee commented 1 year ago

This PR resolves #32

WebSocket을 통해 처음 room에 접속하면 room에 있는 team 이름들을 WebSocket 메시지를 통해 얻을 수 있습니다.
또한 의견을 보낼 때 본인과 같은 팀원들에게 broadcasting 됩니다. 작성한 의견은 AWS RDS(PostgreSQL DB)에 저장됩니다.
현재 구현 사항은 jwlee 스테이지에 배포가 된 상태입니다. WebSocket 통신에 사용하는 API Gateway 주소는 jwlee-serverless-naruhodoo-websockets 에서 확인할 수 있습니다.

테스트 전

기능 테스트를 위해 임의의 유저를 생성하고 유저 정보로 접속을 진행할 것입니다. 이를 위해 임의의 유저 등의 정보들을 DB에 저장해야 합니다. 테스트 하면서 직접 정보들을 추가하면서 할 수 있고, 기존에 존재하는 정보들을 이용해 확인할 수 있습니다.

테스트 방법

  1. Postman, wscat 등 WebSocket을 테스트 할 수 있는 도구를 사용합니다.
  2. 위에 있는 API Gateway에 연결합니다. 연결이 정상적으로 되는지 확인합니다. 그리고 DynamoDB에 connection 정보가 저장됐는지 확인합니다.
  3. 아래와 같이 데이터를 보냅니다. 이를 통해 team 테이블의 값이 반환되는지 확인합니다.
    {
    "action": "initJoin",
    "battleId": <배틀 아이디 값>,
    "userId": <유저 아이디(이메일 형식)>,
    "nickname": <유저 닉네임>
    }
  4. 아래와 같이 데이터를 보냅니다. 이를 통해 본인(여러 개를 접속해서 할 때 접속한 모든 유저)에게 의견이 broadcasting 되는지 확인합니다. 그리고 opinion 테이블에 작성한 의견이 저장됐는지 확인합니다.
    {
    "action": "sendOpinion",
    "round": <라운드 넘버>,
    "opinion": <유저의 의견>
    }
Binsk-dev commented 1 year ago

테스트 후 승인할게요~

seungholee-dev commented 1 year ago

짱이네욥

다른 분들 테스트 쉬우시라고 올립니다. Websocket URL: wss://4a6dvup00h.execute-api.ap-northeast-2.amazonaws.com/jwlee

  1. initJoin (테스트 성공!)

    요청 값
    {
    "action": "initJoin",
    "battleId": "000001",
    "userId": "user123@example.com",
    "nickname": "John Doe"
    }

    image

  2. sendOpinion (테스트 실패)

    요청 값
    {
    "action": "sendOpinion",
    "round": 1,
    "opinion": "I like Computer"
    }

@Jaewook-Lee 제가 sendOpinion 같은 경우 위의 값으로 요청을 보냈는데 서버 에러가 뜨는데 혹시 코드가 중간에 업데이트 되어서 그런건지 문의합니다 감사합니다.

Jaewook-Lee commented 1 year ago

@Jaewook-Lee 제가 sendOpinion 같은 경우 위의 값으로 요청을 보냈는데 서버 에러가 뜨는데 혹시 코드가 중간에 업데이트 되어서 그런건지 문의합니다

@PricelessCode AWS CloudWatch 로그를 확인한 결과 아래와 같은 메시지를 확인했습니다.

[ERROR] ForeignKeyViolation: insert or update on table "opinion" violates foreign key constraint "fk_2" DETAIL: Key (battleid, roundno)=(DDD111, 1) is not present in table "round". Traceback (most recent call last):   File "/var/task/src/utility/websocket.py", line 37, in wrapper     return func(event, context, wsclient)   File "/var/task/src/lambda/handler.py", line 184, in send_handler     psql_cursor.execute(insert_query)

battleid 값으로 "DDD111" 값이 들어왔는데 제 기억으로 이 값은 현재 AWS RDS 테이블에 존재하지 않는 값입니다. 아마 "Jone Doe" 닉네임으로 연결한 WebSocket을 사용해서 sendOpinion 을 시도하셨을텐데 어째서 "000001" 값이 "DDD111" 값으로 변하는지는 모르겠네요. DynamoDB에 저장되어있는 내용을 보니 battleID 값으로 "000001"이 있는 것을 확인했는데...
그런데 제가 방금 같은 입력으로 Postman에서 테스트 했을 때는 정상 작동함을 확인했습니다...
혹시 battleID 값이 "DDD111"인 예시로 sendOpinion 시도하신 걸까요?

seungholee-dev commented 1 year ago

조언 덕분에 정상 작동 성공했습니다! 웹소켓의 커넥션이 연결되는 동안은 Connection ID가 클라이언트(postman)에 저장이 되는 것 같은데 제 이해가 맞나요?!

ChangHoon-Sung commented 1 year ago

@PricelessCode connection_id는 AWS Websocket API에서 서로 다른 클라이언트의 웹소켓 연결을 구분하기 위해 사용하는 id입니다. 이 정보는 AWS Lambda로 전달되어서 클라이언트에게 Websocket 메세지를 전송하는데 사용됩니다.

아래 Lambda 코드에서 post_to_connection()는 AWS API Gateway를 통해서 클라이언트에게 Websocket 메세지를 전송하는 메소드인데요. connection_id를 인자로 받는 것을 확인할 수 있습니다.

https://github.com/kookmin-sw/capstone-2023-05/blob/86ed79cf769f9b99151447dcc57640d3a1b7956c/backend/src/utility/websocket.py#L8-L25

따라서 클라이언트에서는 해당 정보가 필요하지 않을 것으로 보입니다.

seungholee-dev commented 1 year ago

apigatewaymanagementapi에서 자동으로 관리를 해주는 것인가 보네요! 설명 감사합니다.

Binsk-dev commented 1 year ago

테스트 중인데 첫번째, 팀 지지와 관련된 API는 정상 작동하는 것을 확인했습니다. 승호님께 깊은 감사를~ 하지만 이상하게도 sendOpinion 관련 API는 작동이 되질 않네요? 웹 소캣 연결까지는 정상 작동하지만 request를 보낸 후 response가 오질 않습니다. 그리고 DB의 Opinion 테이블도 변하지 않고 그대로고요.

해당 사진은 Postman으로 API 호출했을 때, 얻은 결과입니다. 캡처

Jaewook-Lee commented 1 year ago

하지만 이상하게도 sendOpinion 관련 API는 작동이 되질 않네요? 웹 소캣 연결까지는 정상 작동하지만 request를 보낸 후 response가 오질 않습니다. 그리고 DB의 Opinion 테이블도 변하지 않고 그대로고요.

@Binsk-dev
흠... CloudWatch에 특별한 로그가 찍힌 상황도 아니라서 당장 정확한 원인을 파악하기는 힘들 것 같습니다.
Comment 보고 바로 Postman으로 sendOpinion 요청을 보냈을 때 아래와 같이 응답이 왔습니다.
스크린샷 2023-04-24 20-49-10 원인 파악되는 대로 바로 comment 남기겠습니다.

Binsk-dev commented 1 year ago

아 원인을 찾았습니다. 단순한 실수였네요. Postman을 이용해서 API 테스트를 하는데 1번째 API를 확인한 후, 실수로 웹소켓 연결을 disconnect 하고 2번째 API를 테스트 했네요 🤣 정상작동 확인했습니다.