Springboot/WebSocket

Springboot WebSocket 배달방만들기 (1)

디비드킴 2022. 1. 27. 22:55

이제 배달원의 좌표를 줘야 하는데
어떻게 해야 하나 생각하다
결국 이것도 채팅방처럼
배달끼리 묶어서 방을 파면되는 거 아니야?
라는 결론에 도달했다
그래서 방을 만드는 원리를 찾아보았다
https://myhappyman.tistory.com/103?category=873296

 

SpringBoot - 스프링부트에서 채팅프로그램(소켓통신) 만들기-4(채팅방 만들기2)

1장부터 확인해보실분들은 아래 url을 확인해주세요. https://myhappyman.tistory.com/100 SpringBoot - 스프링부트에서 채팅프로그램(소켓통신) 만들기-1 이번엔 소켓통신을 통하여 채팅프로그램을 스프링부

myhappyman.tistory.com

1. 배달요청 처리(사장님)
배달요청(손님)->물건 픽업 완료 클릭-> 요청 db에 배달 방 번호부여(사장님) 배 달방 생성-> 배달 시작 버튼 클릭(사장님)->웹소켓 연결
->n번방에 배달이 종료될 때까지 위치정보 계속 전달
2. 배달조회(손님)
배달조회 페이지 입성(자동 웹소켓 연결)->db에 접속해 부여된 배달 방 번호 가져오기->배열에 넣기

어려워 보일 수 있는데 웹소켓 배열에 넣을 때
방 번호를 키값으로 넣어주면 된다

db세팅

delivery_rooms=매장이 만드는 배달 방이다

room

delivery_rooms_details=그 배달 방에 있는 손님들이다

테스트를 위해 대충 만들어준다
db내용에 따르면
1/2/3번 방이 있고
1번 방에는 11/17번 유저
2번 방에는 17/18번 유저가 있다

테스트 시 17번 유저는 1/2번 방 메시지를 모두 받아야 하고
나머지는 각자 있는 방의 메시지만 받아야 한다
3번 방은 회원이 입장한 회원이 없다고 세팅했으니 나오면 안 된다

afterConnectionEstablished

deliverPostionHandler.java

1. 회사 이용자
배달할 게 있는지 먼저 db를 다녀와야 한다
하지만 결제 테이블 없이 먼저 만들었으므로 나중에 추가해주자
2. 일반 이용자
actionAtUser(session, id);
이제 방에 입장해주자

actionAtUser

deliverPostionHandler.java

db에서 할당받은 방 번호를 가져온다List<Integer>roomIds=deliveryService.selectRoomIdByUserIdAndFlag(id,intenums.NOT_FLAG.get());
(물론 배달이 완료된 방 번호는 가져오지 않는다)
방이 있을 수도 있고 없을 수도 있다
만들어주거나
방 번호를 키값으로 배열을 map에 담아준다
roomList.put(roomId, room);
입장한다
room.add(makeRoomDetail(session, roomId, id));
소켓이 끊겼다 다시 들어온다면 세션정보를 갱신해준다
if(rd.get("userId").equals(id)){

makeRoomDetail

deliverPostionHandler.java

map을 만들어 주는 함수

getLoginInfor

deliverPostionHandler.java

웹소켓 세션에서는 로그인 정보를 꺼내려면
비슷한 듯 다른 방법으로 꺼내야 했다

handleTextMessage

deliverPostionHandler.java

db에 있는 방 번호 모두에게 전송한다
(물론 배달이 완료된 방 번호는 가져오지 않는다)

테스트

배달 시작을 누르면 웹소켓이 연결되고
테스트 코드를 작성하고
(자바스크립트로 1초에 한 번씩 무언가 전송하는 코드를 써놓았다)

vscode

회원이 입장하는 말든 계속 보내고 있다
아주 좋다
11 회원 입장

입장 동시에 웹소켓이 연결되어 받아온다
1번 방에 있으니 1번 방 메시지만 아주 잘 받아오고 있다

18 회원 입장

2번 방에만 있는 손님이니
2번방 메시지만 잘 받고 있다

대망의 17번 손님

두방 다 속해 있으니
두 개의 메시지 모두 온다



문제가 있다..

손님쪽 로직은 잘만들어 졌는데

사장님 위치발송 로직을착각해서 

모든 손님에게 메세지를 보내고 있다


예를들어
손님이 주문 했을때
매장에서 a/b 배달이 시작됐을때
손님이주문한 차량만 위치서비스를 받아야하는데
A/b 둘다 받게 된다
버그를 수정해 보자