kookmin-sw / capstone-2023-05

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

refactor: Insert query in send-handler #58

Closed Jaewook-Lee closed 1 year ago

Jaewook-Lee commented 1 year ago

56 PR로 인해 생긴 변경 사항에 대한 PR입니다.

Opinion 테이블의 "time" 컬럼의 위치 변경 및 "order" 컬럼 추가에 따라 insert query에 약간의 변동이 생겼습니다.
이것 이외로 dev 브랜치에 있는 핸들러 함수들 중 #56 PR로 인한 side effect 없습니다. (2022.04.28)

61 PR로 인해 전체적인 WebSocket 람다 함수에서 사용된 쿼리들을 수정했습니다.

(2022.04.29)
추가적으로 용준 님이 보여준 오류에 대한 핸들링 방법을 send-handler , vote-handler 에 적용했습니다.

Binsk-dev commented 1 year ago

기능의 정상작동을 확인했습니다만 한 가지 궁금한게 있습니다.

Screenshot 2023-04-27 at 10 39 10 PM

위의 사진은 의견 보내기 기능을 실행한 과정인데요. 맨 아래에서 ws connection을 연결하고 이후 initJoin action까지는 무난히 진행되는데 중간에 제가 실수로 round 테이블에 없는 round 넘버를 이용해 opinion을 보내려다가 opinion 삽입이 실패했습니다. 그런데 결과를 보면 정상 response처럼 보이는 것이 먼저 반환되고 이후에 인터널 서버 오류 응답이 오는 것을 확인할 수 있습니다. 이건 의도된건가요???

Jaewook-Lee commented 1 year ago

네. 의도된 것입니다.

정상 response처럼 보이는 것이 먼저 반환

_sendhandler 함수 내부를 보면 테이블에 저장하기 전에 같은 팀에게 메시지를 뿌립니다.
메시지를 뿌릴 때 확인하는 조건은 두 가지 입니다.

round 넘버 값에 대해서는 확인하지 않기 때문에 battle 아이디와 team 아이디만 같으면 메시지는 뿌려집니다.

Internal Server Error

CloudWatch에서 잡힌 로그를 보면 아래와 같습니다.

[ERROR] ForeignKeyViolation: insert or update on table "opinion" violates foreign key constraint "fk_2" DETAIL: Key (battleid, roundno)=(000001, 4) 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)

용준 님이 얘기한대로 존재하지 않은 round 넘버를 가지고 INSERT를 실행했으므로 당연히 발생하는 오류입니다.
따라서 겪으신 상황에 대해서는 정상적인 상황입니다.

Binsk-dev commented 1 year ago

음... 그럼 일단 같은 팀에게 어떤 의견 제출 되었는지 broadcast를 먼저 한다는건데, 그러면 문제가 있지 않을까요? 요청이 올바르지 않을 경우 결국 테이블에 삽입되지 않습니다. 위의 경우 잘못된 요청이면 다른 유저들은 테이블에 들어가지도 않는 의견을 응답 받는 건데 이는 제 생각에는 문제라고 생각합니다. 요청이 유효한 요청인지(ex. 위에서는 round가 유효하지 않은 경우) 확인해서 유효하지 않다면 에러를 응답해줘야 하지 않을까 생각합니다.

추가로 기능 자체는 동작하지만 문제는 AWS RDB 구조는 그대로입니다. 여전히 PK 요소로 time 필드가 들어가 있죠... 업데이트 된 모델로 다시 수정해야 할 것 같습니다.

Jaewook-Lee commented 1 year ago

음.. 확실히 유효하지 않은 요청에 대한 적절한 응답도 필요한 것 같군요. 테이블 삽입을 먼저 진행하고 실패하면 해당 의견은 뿌리지 않고 400 error response를 return 하는 등의 방향으로 수정하겠습니다.
그리고 "time" 컬럼의 값을 삽입하는 부분을 그대로 남겨놓은 이유는 라운드 시작 시각 이후의 의견들 중 CANDIDATE 의견을 고르기 위해 넣어야 할 정보( + NOT NULL 정의됨 )라고 판단했기 때문입니다. 그런데 지금 생각해보면 DiscussionBattle 테이블의 "maxNoOfOpinion" 컬럼 값을 사용해서 (라운드 참가자) * ("maxNoOfOpinion" 값) 수식을 사용해서 Opinion 테이블의 "order" 컬럼 값을 이용해 시각 기준으로 검색한 것을 대신할 수 있을 것으로 판단되네요.

Jaewook-Lee commented 1 year ago

@Binsk-dev 쿼리 다시 수정해봤으니 검토 부탁드려요~

Binsk-dev commented 1 year ago

음... 원래 처음에 initJoin 액션을 취하기 전에 dynamodb에서 ws-connection 테이블이 만들어지지 않나요? 뭔가 테이블이 안 만들어지네요;;

seungholee-dev commented 1 year ago

고생하셨습니다. 에러처리와 새로운 Query문 확인했습니다!

seungholee-dev commented 1 year ago

@Binsk-dev initJoin을 하기 전에 로컬에서 RDS 테이블을 만드는 것 처럼 DynamoDB에서 ws-connections를 생성해주셔야하는 것으로 알고 있습니다!

Binsk-dev commented 1 year ago

좋습니다. 정상작동 확인했습니다!