오늘은 앞서 개발한 채팅방별 채팅을 저장 하도록 하겠다.
채팅을 저장하는 방법으로 생각해본것은 socket으로 연결된 페이지에서 사용자가 채팅을 입력하면 구독된 url 로 메세지가 전달되는데 이 과정중 api를 이용해 채팅방 id와 유저 id 채팅 내용을 저장한다.
채팅 저장 Controller
chatSaveRequestDto 형태로 메세지를 입력한 유저와 채팅방 id 채팅 내용을 받아 Service로 넘겨주도록 한다.
채팅 저장 Service
전달된 유저 id 와 채팅방 id를 이용해 id 에 해당하는 유저와 채팅방 데이터를 가져오고 채팅 테이블에 저장될 형태인 Chat 엔티티 형태로 객체를 생성후 저장한다.
위와 같은 형태로 메세지를 보낸 시간과 채팅 내용, 채팅방 id, 유저 id 형태로 저장된다.
다음으로 채팅 데이터를 조회하는 api를 통해서 해당 방에서 이루어졌던 채팅들을 보여주도록 한다.
특정 채팅방 조회
채팅방의 id 를 PatnVariable 형태로 받고 Service에 넘겨준다.
id를 이용해 채팅테이블에 저장된 데이터들중 해당 채팅방 id를 가진 데이터를 조회한다.
위의 결과 화며은 조회한 채팅 데이터들을 프론트앤드에 나타낸 결과이다.
추가적으로 사용자가 속한 채팅방을 조회 하는 api를 보자.
사용자의 id 를 PatnVariable 형태로 Service에 넘겨준다.
사용자의 id 를 이용해 채팅방에 속한 유저들의 데이터를 가진 UserChatRoom 테이블에서 해당 사용자가 있는 채팅방 데이터를 조회한다.
위의 결과는 로그인한 유저의 id값을 이용해 해당 사용자가 속한 채팅방을 프론트앤드에 나타낸 것이다.
해당 리스트를 클릭하면 위와같은 url로 채팅방에 접속하게 되고 number 의 값이 /topic/roomNember 에서 roomNember 값이 될 데이터이다.
이러한 방법으로 채팅방을 나누고 해당하는 방의 채팅을 나누고 조회해 불러오는 형식으로 채팅기능을 구현하였다.
여기서 사용자가 url을 변경해서 자신이 속하지 않는 채팅방으로 접속하려 할때 api를 이용해 채팅방 id 에 속한 유저가 아니면 접속을 막아줘야 한다.
이와 같은 기능은 다음과 같은 api로 처리한다.
채팅방 사용자 조회 Controller
채팅방의 id를 PathVariable을 이용해 Service로 전달한다.
채팅방 사용자 조회 Service
전달된 채팅방 id를 이용해 해당 채팅방이 존재하는지를 판단하고 다음으로 채팅방 id 에 속한 유저들을 조회하고 반환한다.
예를들면 채팅방 1 에 속한 유저의 수가 a,b 두명이면 a,b를 모두 조회하는 것이다.
위와 같은 ajax 코드로 로그인한 유저의 id가 해당 api에서 조회한 유저 id 와 맞지 않는다면 다른 페이지로 전환되는 코드를 작성해 위에서 살펴본 사용자가 url을 이용해 속하지 않은 채팅방을 들어가려 할때 막아주도록 한다.