wongakim-99 / websocket-chatting

웹소켓을 활용한 채팅 연습
0 stars 0 forks source link

채팅 고도화 #3

Closed wongakim-99 closed 1 month ago

wongakim-99 commented 1 month ago

구현할 과제

  1. 채팅 메시지
  2. 채팅방
  3. 채팅 서비스
  4. 채팅 컨트롤러
wongakim-99 commented 1 month ago

채팅 메시지

step1. 채팅 메시지를 주고받기 위한 DTO를 하나 생성. 상황에 따라 채팅방 입장, 채팅방에 메시지 보내기 두 가지 상황이 있으므로 ENTER(채팅방 입장), TALK(대화하기)을 enum으로 선언.

나머지 멤버 필드는 채팅별 구별id, 메시지를 보낸 사람, 메시지로 구성

wongakim-99 commented 1 month ago

채팅방 DTO

채팅방을 구현하기 위해 DTO를 하나 만듭니다. 채팅방은 입장한 클라이언트들의 정보를 가지고 있어야 하므로 WebsocketSession 정보 리스트를 멤버 필드로 갖습니다. 나머지 멤버 필드로 채팅방 id, 채팅방 이름을 추가합니다. 채팅방에서는 입장, 대화하기의 기능이 있으므로 handleAction을 통해 분기 처리합니다. 입장 시에는 채팅룸의 session정보에 클라이언트의 session리스트에 추가해 놓았다가 채팅룸에 메시지가 도착할 경우 채팅룸의 모든 session에 메시지를 발송하면 채팅이 완성됩니다.

wongakim-99 commented 1 month ago

채팅 service

채팅방을 생성, 조회하고 하나의 세션에 메시지 발송을 하는 서비스를 아래와 같이 구현합니다. 채팅방 Map은 서버에 생성된 모든 채팅방의 정보를 모아둔 구조체입니다. 채팅룸의 정보 저장은 빠른구현을 위해 일단 외부 저장소를 이용하지 않고 HashMap에 저장하는 것으로 구현하였습니다. 채팅방 조회 – 채팅방 Map에 담긴 정보를 조회. 채팅방 생성 – Random UUID로 구별ID를 가진 채팅방 객체를 생성하고 채탕방 Map에 추가. 메시지 발송 – 지정한 Websocket 세션에 메시지를 발송.

wongakim-99 commented 1 month ago

채팅 controller

채팅방의 생성 및 조회는 Rest api로 구현할 것이므로 아래와 같이 Controller를 생성하여 내용을 작성

@RequiredArgsConstructor
@RestController
@RequestMapping("/chat")
public class ChatController {

    private final ChatService chatService;

    @PostMapping
    public ChatRoom createRoom(@RequestParam String name) {
        return chatService.createRoom(name);
    }

    @GetMapping
    public List<ChatRoom> findAllRoom() {
        return chatService.findAllRoom();
    }
}