프로젝트/싹쓰리

[프로젝트] 스프링에서 채팅 기능 구현해보기

라임온조 2023. 7. 16. 16:57

1. 채팅 기능을 왜 구현하게 되었나?

현재 진행하고 있는 프로젝트에서 사용자들끼리 1:1로 대화를 하는 기능이 필요하다. 이를 소켓을 활용한 채팅 기능이 아닌 그냥 일반적으로 글을 주고 받는 쪽지 형식으로 구현해도 되긴 했으나 소켓으로 채팅기능을 구현해보는 걸 이번 기회 아니면 언제 해보겠냐는 생각에 적용해보기로 하였다. 다행히 프론트엔드 개발자 분도 동의해주셨다.

 

2. 근데 socket이 뭔데

추후 정리

 

3. 채팅 기능 구현을 위한 의존성

implementation 'org.springframework.boot:spring-boot-starter-websocket'

4. socket 처리를 위한 핸들러

추후 정리

 

5. 내가 구현할 채팅 환경 및 이를 위해 필요한 엔티티 정리(+레포지토리)

1) 환경

사용자들끼리 1:1 채팅 진행

2) 필요한 엔티티

① 채팅 방

채팅을 진행하려면 채팅 방이 있어야 한다. 채팅 방 id, 방에 들어와 있는 유저1의 id, 방에 들어와 있는 유저2의 id, 채팅방이 만들어진 시각, 이 방에서 이루어진 메시지 리스트를 담고 있는 엔티티를 만들었다.

 

② 채팅 메시지

각 채팅 방에서 이루어진 메시지들을 어딘가에 저장을 해 놔야 계속 보여줄 수가 있을 것이다. 다양한 방법이 있을테지만, 나는 졸업 프로젝트 목적으로 엄청난 양의 데이터를 다루는 것이 아니기 때문에 aws ec2에 올려 놓은 mysql 서버에 저장을 하기로 하고 메시지만을 위한 엔티티를 만들었다. 근데 실제로 많이 쓰는 방법은 무엇인지 궁금하다.

각 메시지의 고유 id, 이 메시지가 속한 채팅 방 id, 보낸 사용자의 id, 받는 사용자의 id, 내용, 작성 시각을 담은 엔티티를 만들었다.

 

물론 각 엔티티에 맞는 repository도 각각 만들어주었다.

 

6. 필요한 컨트롤러 정리

채팅방 생성, 채팅방 목록 보기, 채팅방에 있는 메시지 내역 보기가 필요했다.

물론 채팅 메시지 생성도 필요하지만 이는 컨트롤러에서 다루지 않고 핸들러에서 다루었기 때문에 컨트롤러에서는 제외했다.

 

7. 필요한 Dto 정리

이건 각자 필요한 api에 따라 다양하게 만들 수 있을 것 같다. 일단 내가 필요했던 기능은 채팅 방 생성하기, 로그인한 사용자가 속한 채팅방 목록 보기, 로그인한 사용자가 특정 채팅방에 들어갔을 때 해당 채팅방의 메시지 내역 보기, 채팅 메시지 보내기 이 정도 였다.

 

채팅방 생성을 위한 ChatRoomRequestDto, ChatRoomResponseDto를 만들었다.

채팅방 목록을 보기 위해 ChatListResponseDto를 만들었다.

채팅방에 있는 메시지 목록을 보기 위해 ChatMessageListResponseDto를 만들었다.

채팅 메시지를 보내기 위해 ChatMessageRequestDto를 만들었다.

 

8. 필요한 Service 정리

1) 채팅방 생성 createChatRoom

이미 두 사용자 사이에 채팅방이 존재는지 아닌지에 따라 나누어서 처리를 진행해줘야 한다. 이미 존재하면 그걸 리턴해야 하고, 존재하지 않으면 새로 방을 만든다.

 

2) 채팅 메시지 생성 createChatMessage

그냥 메시지를 생성해주면 된다.

 

3) 채팅방 목록 보기 showChatRoomList

유저가 속한 채팅방 중 주고 받은 메시지가 1개라도 있는 방만을 보여주도록 하였다. 그리고, 프로젝트 특성상 점주와도 채팅을 할 수 있고, 일반 손님과도 채팅을 할 수 있기에 두 역할을 나누어 목록 dto를 리턴해야 해서 해당 로직도 넣었다.

 

4) 채팅방의 메시지 내역 showChatMessageList

해당 방에 있는 모든 메시지 내역을 보여준다.

 

9. 포스트맨에서 테스트 해보기