-
mongo db로 채팅에 데이터를 입력백엔드 관련 강의 공부/채팅 시스템 - mongo db 2024. 2. 22. 20:06
mongo db를 이용해서 데이터를 넣고 조회하는 기능을 해 볼 것이다.
application.yml
spring: data: mongodb: host: localhost port: 27017 database: chatdb
mongo db 설정을 해주는데, 기본 포트가 27017이다.
Chat.class
@Data @Document(collection = "chat") // mongo db - collection 이름 지정 public class Chat { @Id private String id; private String msg; private String sender; private String receiver; private Integer roomNum; private LocalDateTime createdTime; }
ChatRepository
public interface ChatRepository extends ReactiveMongoRepository<Chat, String> { @Tailable // find하고 나서도 안닫고 계속 유지한다는 뜻 @Query("{sender: ?0, receiver: ?1}") Flux<Chat> mFindBySender(String sender, String receiver); // Flux는 흐름 - 데이터를 끊어서 받는게 아니라 response를 유지하며 흐름으로 데이터를 계속 받겠다. @Tailable @Query("{roomNum: ?0}") Flux<Chat> mFindByRoomNum(Integer roomNum); }
@Tailable 어노테이션은 클라이언트가 채팅창에 들어갔을 때 채팅을 조회하는데, 다른 누군가가 db에 save를 할 때 응답을 그대로 흘려보내주면서 Flux로 응답하는 것이다.
클라이언트가 요청을 하고 서버가 응답을 할 때 서버가 데이터를 응답할 때 응답 이후에 @Tailable로 데이터를 계속해서 받기 위해 http가 아니라 sse 프로토콜을 사용한다.
ChatController
@RequiredArgsConstructor @RestController public class ChatController { private final ChatRepository chatRepository; // MediaType.TEXT_EVENT_STREAM_VALUE는 SSE 프로토콜로 어떤 데이터가 생길때마다 지속적으로 보내줌 @CrossOrigin @GetMapping(value = "/sender/{sender}/receiver/{receiver}", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<Chat> getMsg(@PathVariable String sender, @PathVariable String receiver) { return chatRepository.mFindBySender(sender, receiver) .subscribeOn(Schedulers.boundedElastic()); } @CrossOrigin @GetMapping(value = "/chat/roomNum/{roomNum}", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<Chat> findByRoomNum(@PathVariable Integer roomNum) { return chatRepository.mFindByRoomNum(roomNum) .subscribeOn(Schedulers.boundedElastic()); } @CrossOrigin @PostMapping("/chat") public Mono<Chat> setMsg(@RequestBody Chat chat) { // Mono는 Flux의 반대다. chat.setCreatedTime(LocalDateTime.now()); return chatRepository.save(chat); } }
sse 프로토콜을 사용하기 위해 붙여진 MediaType.TEXT_EVENT_STREAM_VALUE는 어떤 데이터가 생길때마다 지속적으로 데이터를 보내준다.
실제로 사용할 때에는 첫 번째의 api가 아니라 2번째의 api를 사용할 것이다. 로그인 등의 기능을 구현하지 않았기 때문에 roomNumber를 통해 프론트에서의 접근을 할 것이기 때문이다.
postman에서 위와 같이 JSON 형태로 sender, receiver, msg를 입력해주고 send를 하면 mongo db에 데이터가 저장된다.
데이터 조회
@Tailable 어노테이션은 buffer 사이즈가 커야하기 때문에 mongodb shell에 아래와 같은 명령어를 입력한다.
aaa가 bbb에게 메시지를 보냈으니 /sender/aaa/receiver/bbb라는 url로 들어가면 해당 데이터가 나온다.
url 위에 로딩창처럼 계속 돌아가는데 Flux로 응답을 하고, TEXT_EVENT_STREAM_VALUE로 데이터를 지속적으로 끊기지 않고 보내주기 때문이다.
두 번째 메시지를 위와 같이 보냈는데, 새로고침을 하지 않았음에도 postman으로 send를 하자마자 아까의 url에 데이터가 추가되었다. 데이터를 반환하고 끝내는게 아니라 계속해서 데이터를 받아오는 것이기 때문이다.
이러한 요청은 보통 브라우저로 하지않고 자바 스크립트로 한다.
'백엔드 관련 강의 공부 > 채팅 시스템 - mongo db' 카테고리의 다른 글
MongoDB의 배포 형태 (0) 2024.03.07 프론트엔드, 디자인 추가 및 채팅 시스템 완성 (0) 2024.02.23 mongo db를 사용하는 이유 (0) 2024.02.22