-
[리팩토링] 챗봇 추가하기Project 2021. 7. 25. 01:45
처음에 오쿠의 채팅방은 거래 성사 이후 생성이 되도록 하는것이 목표였다.
그러나 정작 채팅기능을 만들고나니 첫 화면에 모든 사람들과 채팅을 할 수 있는 방이 생겼다.
원인은, 채팅방(room)의 정의를 productId-userId-userId 로 하였는데,
세가지가 undefined인 경우에 대해 예외처리를 하지 않아서이다.
즉, 아래 채팅방에서 리스트의 목록을 누르지 않은채로 있으면 room은 undefined-undefined-undefined가 되어버리고,
그럴 경우 모든 유저들은 undefined 방에 접속되어 말 그대로 아무나 채팅이 되어버리는 것이었다.
그런대로 나쁘지않은 기능이었지만, 의도하지 않은 기능을 그냥 두는것은 뭔가 .. 휘뚜루 마뚜루 오 됐지 뭐~! 이런 느낌이어서
해당 기능에 대해 수정을 하였다.
우선 첫번째로, undefined room에 대한 분기처리를 해주었다.
첫 화면은 간단한 안내사항과, 만약 클라이언트측에서 emit을 할 경우
값을 저장하지 않고 거래 이후 채팅 가능하다는 안내 메시지를 띄우도록 하였다.
또, 오쿠의 경우 안타깝게도 ㅠㅠ 이용 유저가 현재는 없는 사이트여서.
경매가 이루어지지않아도 채팅 기능을 맛 볼 수 있도록 챗봇 기능을 넣어주었다.
몇가지 지정된 단어를 입력하면, 안내사항이 나온다. 또는 그냥 메모용으로도 사용할 수 있도록 데이터를 저장하기로 했다.
작동원리는,
클라이언트에서 받은 data 내에 특정 단어가 들어있다면, 클라이언트가 준 메세지를 재송신하는 대신에 안내사항을 송신한다.
이 기능을 구현하면서 여러 고민을 했었는데,
소규모 웹 서비스의 장점이란건 그런거 아닐까? 초기 멤버면서 운영자와 직접 대화도 해보고..??
.. 작은 앱들은 운영자가 빠르게 답변해준다구... 매크로 답변이 아니라...
그래서 처음에는 직접 운영자 계정과 대화하는 채팅방을 심어둘 생각이었다.
내가 생각한 방법은, 채팅 리스트를 클라이언트에게 응답하는 target 배열에 미리 운영자의 정보를 넣어놓는 것이었다.
그런데 이 방법을 직접 해보니까,
회원의 입장에서는 productId-운영자-userid로 room이 생성되는데,
운영자의 입장에서는 이 회원에 대한 room이 생성되지 않아서 서로 메세지를 주고 받을 수 없었다;
그래서
1. 운영자에게 모든 유저의 정보를 미리 넣어놓는다
-> 유저가 추가 될 때 마다 작업을 새로 하거나, 아니면 for문을 돌면서 user의 정보를 갖다 넣는 방식이 될 것 같은데,
소규모 유저라고하면 대충 넣을 수 있을 것 같지만 만약에!! 유저가 아주~ 많아지면 운영자 아이디로 채팅방에 들어가는일이...
많은 작업을 거치게 되므로 하지말자고 생각했다.
2. 유저가 운영자에게 메세지를 보낸다면(유저가 송신한 room의 상대 유저가 운영자라면),
그 때 운영자에게 해당 회원과의 room을 만든다.
-> 이것도 꽤 괜찮은 방법일 것 같았다.... 아마 프론트엔드의 코드를 안건드리고 구현하려고 한다면,
클라이언트가 메세지 emit을 하면, 해당 데이터가 db에 저장된다.
만약 로그인 한 유저가 운영자 계정이라면, 분기 처리를 하여 db에서 쿼리문으로 room 에 운영자의 userId가 includes되어있는 데이터를 찾고, room에서 productId, userId를 뽑고, 그 데이터를 토대로 targets에 필요한 데이터를 추가해서 응답해주면 될 .. 것.. 같다...
(아마 엄청나게 많은 채팅 데이터를 찾게될텐데, 그렇게 하지않고 DB인덱싱을 걸어서 찾아야하지않을까?)
(그런게 안된다면 안하는게 나은 방법일 것 같다..)
3. 운영자 말고 챗봇으로 만들어버리자
-> 일단 2도 해보고싶은데, 뭔가 다른 방법이 생각날 때 까지의 임시방편으로 걸어두기로 했다. 생각보다 너무 편하고 좋은데..?
다만 이전부터.. 만약 채팅 데이터가 너무나 많이 쌓이게 된다면? 을 여전히 한켠에 불편하게 남겨두고있어야하지만
우선은 오늘은 여기까지 하기로했다.
https://github.com/danaisboss/OKU/commit/3658df62e90cf320e7a2403448a322995aed8bd0
아..유저 id를 그대로 넣어버렸네...하...뭔가 오늘은 취미같은 코딩을 해서 즐거웠다.
또 이걸 빌미로 오랜만에 팀원들에게 연락도 해보고, 다들 날 두고 취업을..
이렇게 개발자 친구들이 생기다니 기쁘다..기뻐..
'Project' 카테고리의 다른 글
테스트코드 작성하기 (2) 2021.08.08 [리팩토링] socket.js 코드 분리하기 (0) 2021.08.05 [리팩토링] 유저 가입 코드 수정 (0) 2021.07.15 [OKU] 유효성 검사는 어디에서 발생하는가? (0) 2021.07.02 채팅 생성하기 (0) 2021.05.27