-
Web_ project 진행_8 : Spring Boot + Sring chat, 스프링 채팅 시스템 구현(1) :: MS (tistory.com)
에서 이어지는 글입니다.
채팅 서버(서버B)는 jdk 11버전을, STS4, mongoDB, Lombok, Flux가 사용되었습니다.
application.yml
spring: data: mongodb: host: localhost port: 27017 database: chatdb
기본 mongoDB의 설정을 진행해줍니다. 포트는 몽고디비 기본 포트를 사용했습니다.
chat.java
@Data @Document(collection = "chat") public class Chat { @Id private String id; private String msg; private String sender; // 보내는 사람 private String receiver; // 받는 사람 (귓속말) private Integer roomNum; // 방 번호 private LocalDateTime createdAt; }
Lombok을 사용해서 따로 getter, setter의 구현이 필요하지 않습니다. 원하는 데이터 값만을 설정합니다.
ChatRepository.java
public interface ChatRepository extends ReactiveMongoRepository<Chat, String>{ @Tailable @Query("{ roomNum: ?0 }") Flux<Chat> mFindByRoomNum(Integer roomNum); }
몽고디비에서 채팅 관련한 내용을 출력할 수 있게 해줍니다. roomNum을 통해서 채팅이 구분됩니다.
또한 Flux을 통해서 응답을 유지한 상태(서버B->서버A)를 유지한 상태로 계속 새로운 데이터가 있다면 불러옵니다.
ChatController.java
@CrossOrigin @PostMapping("/chat") public Mono<Chat> setMsg(@RequestBody Chat chat){ chat.setCreatedAt(LocalDateTime.now()); return chatRepository.save(chat); // Object를 리턴하면 자동으로 JSON 변환 (MessageConverter) }
앞서 JSP에서 입력된 채팅의 내용을 해당 채팅서버/chat으로 보내므로 이를 컨트롤러에서 저장할 수 있게 설정해놓습니다.
@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()); }
그 외에 채팅창을 출력하기 위해서 채팅방 번호를 수집해서 채팅방번호로 매칭해주고 해당 채팅방번호로 저장한 mongoDB의 데이터 값들을 출력해줍니다.
채팅방으로 들어가서 확인해보면 다음과 같이 데이터들을 불러옴을 알 수 있습니다. 이를 서버A에서 정제하여 출력하는 것입니다.
이렇게 서버 A에서 서버B로 즉시 이동하고 서버B에서 몽고디비로 저장한 데이터가 지속적인 출력을 보여줍니다.
'개발 > WEB' 카테고리의 다른 글
Web_ project 진행_10 : 최종 구현/시연 화면, 프로젝트 종료 및 후기 (0) 2022.04.24 Web_ project 진행_8 : Spring Boot + Sring chat, 스프링 채팅 시스템 구현(1) (0) 2022.04.24 Web_ project 진행_7 : JSP을 이용하여 원하는 정보 전달하기 (0) 2021.11.17 Web_ project 진행_6 : Spring 회원 로그인 시스템 (0) 2021.11.05 Web_ project 진행_5 : Spring DB 게시글 삭제 (두 개의 테이블) (0) 2021.11.04 댓글 (비로그인 댓글 허용하지 않습니다.)