안 읽은 채팅 구현기 : STOMP의 ChannelInterceptor 를 사용하여
·
🌱 Spring
이 글은 당근마켓을 모티브로 한 프로젝트 Secondhand 구현시 이슈 사항을 정리한 글입니다. 들어가며 Secondhand 프로젝트를 진행할 때 가장 마지막에 구현했던 기능인 ‘아직 안 읽은 채팅’에 대해 백엔드 개발자 2명이 한 고민과 구현 과정을 정리해보았습니다. 채팅 시스템은 처음 이 프로젝트를 시작할 당시에 BE는 물론 FE, iOS에게도 굉장히 큰 과제였습니다. 유저간 실시간 채팅을 어떻게 구현할 것이며, 어떻게 DB에 저장할 것인가도 어려운 미션이었는데요. (이것에 대해서는 추후에 따로 글을 적어보기로…) 산넘어 산… “안 읽은 채팅을 어떻게 구현할 것인가”는 다른 의미로 어려웠던 미션이었습니다. 전자는 “새로운 기술을 어떻게 도입할 것인가”라는 고민에 가까웠다면 후자는 채팅 도메인에 대한..
MySQL 검색 기능 개선하기 : Full-text search
·
🥞 Database
이 글은 당근마켓을 모티브로 한 프로젝트 Secondhand 구현시 이슈 사항을 정리한 글입니다. mysql 8.0 InnoDB 환경에서 테스트 되었습니다. 발단 : 왜 검색 기능 개선이 필요했나? Secondhand는 동네를 검색할 수 있는 기능이 있습니다. 예를 들어 이런거요. [이미지 출처 : https://kikimong.com/7179] 먼저 데이터는 이런식으로 들어가 있습니다. 법정동 코드를 pk 로 하였습니다. 행정동 코드보다 법정동 코드를 선택한 이유는 변동이 더 적기 때문입니다. [참고링크 : 법정동과 행정동의 차이는?] 그리고 검색을 용이하게 하기 위해 일부러 비정규화하였습니다. 그래서 지역 검색을 어떻게 구현하면 좋을까요? 전개 초기 구현 방법 Where ~ like 사실 이 프로젝트..
Spring Event를 사용하여 도메인간 의존성 낮추기
·
🌱 Spring
이 글은 당근마켓을 모티브로 한 프로젝트 Secondhand 구현시 이슈 사항을 정리한 글입니다. 상황 Secondhand에는 실시간 채팅 어플리케이션이 있습니다. 웹소켓 통신을 기반으로 하며 STOMP와 Redis pub/sub 으로 구현하였는데요. 이 채팅에 대한 요구사항 중에 다른 도메인의 서비스를 참조하는 경우가 많아져 Facade가 비대해지고 각 도메인의 서비스 로직이 복잡하게 구성이 되며 의존성이 높아지는 우려가 생겼습니다. @Component @RequiredArgsConstructor public class ChatroomFacade { private final ChatroomService chatRoomService; private final ItemService itemService; ..