DoSeungJae / dormitory

A WebView App for Group Buying Service in Dormitories (2023.07 ~ 2024.07, Planned later~ )
0 stars 0 forks source link

[BACK] (UNDER #9) netty-socket.io #18

Closed DoSeungJae closed 4 months ago

DoSeungJae commented 4 months ago

BE에서 webSocket 기능 구현을 위해 socket.io의 java 구현체인 netty-socket.io를 도입

https://dev.to/amalja0/how-to-integrating-socketio-with-spring-boot-and-react-spring-boot-implementation-1ma4 위 링크를 참조하여 (웹)소켓 도메인 모든 계층의 스켈레톤 코드를 작성했고[커밋 시점 : 4e752d0], 현재 필요한 과정은 다음과 같음:

  1. 테스트 : 위 링크에 나온 테스트 과정대로 http 요청을 보냈을 때 제대로 잘 작동하는지 확인하기

  2. 로컬라이징 : 스켈레톤 코드를 현재 프로젝트 구조/패턴에 맞게 수정하기

  3. 비즈니스 로직 : 현재 프로젝트가 요구하는 기능 구현하기

  4. 데이터베이스 변경 : 스켈레톤 코드는 message를 RDB에 저장하지만, 개인적인 견해로는 해당 방식이 적합하지 않다고 판단, 그 대안으로 실시간 처리에 용이한 redis[혹은 이 DB 역시 추후에 부적합하다고 판단되는 경우 다른 DB 도입을 고려해야할 것임]에 진행중인 room의 실시간 채팅 내용을 (List 타입으로) 저장하도록 구현할 예정[Redis에서 List 타입은 입력된 자료의 "순서"가 저장돼있기 때문에 기록을 관리하는 것이 편리할 것임] 4.1. 단, Redis가 in-memory DB인 점을 미루어볼 때, 종료된 room(group)의 채팅 내용을 해당 DB에 저장하는 것은 공간적으로 비효율적인 방식임에 분명하므로 이것들을 RDB에 저장하는 것을 고려해볼 수 있으나, 4.에서 전술한 바와 같이 관계형 데이터베이스의 테이블-컬럼 형태가 (비록 성능, 특히 공간적인 관점에서 아무런 문제가 없다고 할지라도) 이런 채팅 기록을 저장하는 것에는 맞지 않다고 보기 때문에 추가적인 의사 결정이 필요함.

(triggered by #9 )

DoSeungJae commented 4 months ago

"1." 과정을 완료함 : (FE와) BE에 위 링크에서 참조한 스켈레톤 코드를 실행하여 의도한 대로 작동되는 것을 확인함

DoSeungJae commented 4 months ago

과정 4.에 대한 첨언: 진행 중인 그룹에서 채팅방의 데이터를 관리할 때, 실시간으로 입력되는 메시지를 {메세지를 쓴 사람, 메시지 내용, 입력 시간 }등이 함께 묶여있는 상태로 DB에 저장돼야하고, 적합한 자료형은 JSON이지만, Redis에서는 이러한 복잡한 자료구조를 지원하지 않기 때문에 JSON과 같은 형태를 저장할 수 있으면서 실시간 데이터라는 점까지 고려해 빠른 액세스 속도를 지원하는 DB가 요구됨. MongoDB는 대표적인 문서 지향적 NoSQL DB중 하나로, 빠른 액세스 속도를 어느정도 보장하면서도 BSON[Binary JSON]이라는 JSON과 유사한 자료형으로 데이터를 저장할 수 있으므로 현재 맥락에 적합하다고 볼 수 있음. 또한, MongoDB는 Redis와 다르게 완전히 in-memory방식으로 데이터를 저장하지 않고 자주 액세스 되는 데이터만 메모리에 저장해 데이터가 필요할 때 Caching을 통해 빠르게 액세스하는 것을 가능하게 하고, 그렇지 않은 데이터는 전통적인 RDB의 방식과 동일하게 디스크 기반으로 저장하기 때문에 종료된 그룹의 채팅 내용을 저장하기에도 적합하다고 볼 수 있음. 아래 링크를 참조하여 spring boot에 mongoDB를 연동할 예정. https://www.mongodb.com/resources/products/compatibilities/spring-boot

DoSeungJae commented 4 months ago

MongoDB Spring Boot에 연동 후 테스트 완료

DoSeungJae commented 4 months ago

2.와 3. 과정에 대해, 스켈레톤 코드에서 구조 변경이나 추가적인 구현이 필요할 것으로 예상되었으나 현재는 그럴 필요가 없다고 보여짐, chat 도메인이 group 도메인의 하위 도메인이기 때문인데, chat(room)으로의 입장 혹은 퇴장이 group에서의 그것들과 완전히 동기화되어있고, 이러한 출입에 대한 예외처리는 group 도메인에서 먼저 기능할 것으로 기대되므로 chat 도메인은 오직 웹소켓에 대한 기능만 필요하고 해당 기능은 스켈레톤 코드로 충분함. 과정 4.는 Spring Boot에 연동된 MongoDB로 자료(채팅 기록)를 저장/조회하는 메서드를 작성함으로써 완료됨.