반응형
0. 기본 조건
- 채팅은 일대일로 이루어진다. (일대다는 현재 고려하지 않음)
- A가 채팅방을 나간 경우, B는 대화 내용을 확인할 수 있다.
- 모든 채팅 데이터는 database에 저장된다.
- 챗봇이 응답하는 대화 내용 역시 채팅 데이터로 저장해야 한다.
1. 설계
1-1. 시나리오(기존에 채팅 내역이 존재하지 않는 경우)
- 브라우저(사용자-멘티): 멘토를 선택한 뒤, 대화 시작 버튼을 누른다.
- 클라이언트: roomId(UUID 사용), menteNickname, mentorNickname 정보를 json 형식으로 담아서 서버로 채팅방 생성 요청(POST 요청) 전송
- 서버: 채팅방 생성 요청을 받아 새로운 채팅방을 생성하고 db에 저장한다.
- 서버: 방 생성이 정상적으로 완료되었다는 응답을 클라이언트로 보낸다(만약 서버, db 등의 오류로 인해 방 생성이 정상적으로 되지 않는 경우 문제가 발생할 수 있으니, 해당 절차가 필요)
- 클라이언트: 위의 응답에서, 서버로부터 roomId를 받은 다음, 방 입장 요청을 다시 보낸다.
- 서버: STOMP 프로토콜 연결 이후, 바로 챗봇의 Welcome Message를 클라이언트로 보낸다.
- 클라이언트: 챗봇의 Welcome Message를 사용자에게 보여준다.
- 브라우저(사용자-멘티): 대화를 입력한다.
시나리오(기존에 채팅 내역이 존재하는 경우)
- 사용자가 홈 화면에서 "채팅" 카테고리로 이동하면 채팅방 목록이 보인다.
- 채팅방 대화 목록은 id를 기준, 혹은 닉네임을 기준으로 오름차순 정렬하며, 정렬의 가장 첫번째에 있는 대화 내용이 보여진다.
- ㅁㄴㅇㄹ
고민할 내용
- 현재 채팅은 챗봇 대화 형식으로 구성할 계획이며, 챗봇과 사용자가 서로 한 번씩 메시지를 주고 받는 방식을 구현하려고 한다. 그렇다면, 만약 챗봇의 응답이 오기 전에 사용자가 메시지를 계속 입력하는 경우는 어떻게 대응할지?
2. STOMP 프로토콜을 사용한 통신
WebSocket 프로토콜 대신 STOMP 프로토콜을 사용하는 이유
- 첫 번째 링크 내용 참고하였음
- STOMP는 Simple Text Oriented Messaging Protocol의 약자이다. WebSocket 프로토콜은 Text 또는 Binary 두 가지 유형의 메시지 타입은 정의하지만 메시지의 내용에 대해서는 정의하지 않는다. 즉, WebSocket만 사용해서 구현하게 되면 해당 메시지가 어떤 요청인지, 어떤 포맷으로 오는지, 메시지 통신 과정을 어떻게 처리해야 하는지 정해져 있지 않아 일일이 구현해야 한다. 따라서 STOMP라는 프로토콜을 서브 프로토콜로 사용한다. STOMP는 클라이언트와 서버가 서로 통신하는 데 있어 메시지의 형식, 유형, 내용 등을 정의해주는 프로토콜이라고 할 수 있다. STOMP를 사용하게 되면 단순한 Binary, Text가 아닌 규격을 갖춘 메시지를 보낼 수 있다. 스프링은 spring-websocket 모듈을 통해서 STOMP를 제공하고 있다.
3. 데이터베이스 설계
참고 링크
2. STOMP 라이브러리를 사용한 통신
- 웹 소켓에 대해 알아보자! - 실전 편. https://tecoble.techcourse.co.kr/post/2021-09-05-web-socket-practice/
- Spring Boot WebSocket 코드 예시 1 https://ws-pace.tistory.com/106
- Spring Boot WebSocket 코드 예시 2 https://www.daddyprogrammer.org/post/4691/spring-websocket-chatting-server-stomp-server/
- APIC 툴 사용법 기초 https://velog.io/@soluinoon/STOMP-테스트를-위한-apic-알아보기
3. 데이터베이스 설계
- 채팅 서비스 구현시 DB 설계 질문입니다! https://okky.kr/questions/1317634
- [Django] 카카오톡 같은 채팅 시스템 데이터베이스 설계, 구현, 테스트 코드 만들어보기 https://youngminz.netlify.app/posts/django-1-to-1-chat-service
반응형
'Spring Boot' 카테고리의 다른 글
Spring Boot] ResponseEntity vs Custom DTO (0) | 2023.07.15 |
---|---|
Spring Boot] org.springframework.orm.jpa.JpaSystemException: ids for this class must be manually assigned before calling save() (0) | 2023.07.15 |
Spring Boot] java.lang.IllegalArgumentException: Key argument cannot be null (0) | 2023.07.08 |
Spring Boot] NCP Chatbot과 연동하기-기초 (0) | 2023.07.06 |
Spring Boot] JWT 토큰을 사용한 사용자 인증/인가 (0) | 2023.07.03 |