1. 개요
주변 사람의 권유로 짧게 축제때 쓸 소개팅 어플리케이션의 서버 개발자로 참여하게 되었다.
바쁜 일정으로 인해 안하려고 했으나 저번에 한 프로젝트에서 채팅을 개발해본 경험이 있으므로 손쉽게 구현할 줄 알았다.
(왜 이런 생각을 가졌을까...)

'좋아하면숭리는'은 주변에 있는 사람과 취향을 기반으로 매칭이 일어나는 소개팅 어플리케이션으로,
나는 여기서 채팅 API를 도맡아서 개발했다.
2. 일정
2025.09.07 ~ 2025.09.25, 총 3주정도 진행된 프로젝트이다.
매우 짧은 기간내에 개발이 이뤄져야 했고,
결제도 붙는 서비스다 보니 구현을 대충할 수도 없던 프로젝트이다.
3. 팀 구성
- 기획 1명
- 디자인 1명
- 프론트엔드 2명
- 백엔드 3명
- 법률 1명
- 마케팅 1명
4. 기술 스택
Language & Framework
- Java 17
- Spring Boot 3.5.5
- Spring Data JPA
- Spring Security
- JWT
- MySQL
- Redis
DevOps
- GCP
- RDS
- Route53
- Nginx
- Docker
- Firebase
- GitHub Actions
5. 아키텍처

초기 ERD는 다음과 같고, 알람과 결제 기능이 붙으며 관련 테이블이 추가되었다.
6. 결과 및 성과
- 랜딩페이지 진입 횟수 1,606회 (중복제거 실 진입자 1,235명)
- 프로필 작성 완료 사용자 257명
- 채팅방 생성 198건, 채팅 기능 사용자 137명
- 구매 사용자 18명
둘째 날(전일과 합산 수치)
- 랜딩페이지 진입 횟수 2,368회 (중복제거 실 진입자 1,725명)
- 프로필 작성 완료 사용자 297명
- 채팅방 생성 383건, 채팅 기능 사용자 220명
7. 향후 계획
일단은 디벨롭 계획은 따로 없는 것으로 보인다.
8. 후기 및 배운점
후기
짧은 시간 내에 계속해서 바꾸는 기획에 대응해야 했는데, 기존 기능의 변경은 SRP와 OCP를 지키려고 노력한덕분에 금방금방 개발해낼 수 있었다.
열정있는 PM님과 같이했다보니 개발에 대한 의욕은 계속해서 충만할 수 있어서 좋았던 거 같다.
실사용자가 있는 프로젝트를 진행해본 것도 나름의 좋은 경험이라고 생각한다. 실제 서비스 회사를 가게 되면 내 코드에 더욱 애정이 생길 것 같다.
아쉬운 점
- 데드라인 미흡
학기 중에 진행되는 사이드프로젝트이다 보니 개발에 투자할 수 있는 시간이 부족했다.
PM님의 계획과는 다르게 축제기간까지 계속 개발이 이어졌고, 푸시 알람 기능이 축제 2일차에 개발됨에 따라 초기 사용자들을 제대로 붙잡지 못한 것 같다.
배운 점
1. 실력있는 사람과의 협업 경험
저번 콕플 프로젝트는 비슷한 실력의 개발자끼리 모였다면, 이번 프로젝트는 확실한 고수분이 계셨다.
Github Actions를 사용한 CI/CD와 소셜로그인쪽을 맡아주셨는데 관련 코드를 보며 그 흐름에 대해 확실히 배울 수 있었던 것 같다.
2. 1:1 채팅 특화 구현
저번 채팅 기능을 구현할 때는 단체 채팅이 있었기에, 테이블 구조가 그에 맞게 짜여져야 했다.
이번에는 1:1 채팅만 존재했기에 메시지 테이블에 읽음 여부, 차단됨 여부 등을 관리하는 방식으로 구현해보았다.
3. React를 통합 웹앱에서의 푸시 알람 구현
문제: 어플리케이션 내 채팅 알람을 웹소켓을 통해 전송이 되었으나 어플을 끄면 채팅을 확인할 수 없다.
해결: Firebase의 FCM을 통해 푸시 알람을 구현했다. 사용자마다 FCM token을 발급해두고 서버에서 Firebase쪽으로 메시지를 보낼경우 Firebase에서 해당하는 단말기로 푸시 알람을 보내주는 방식이다.
하나하나 기능들을 구현해보며 다양한 기획에 대응할 수 있는 자신감을 쌓아가는 것 같다.
4. 인덱스의 도입
혹시나 우리 프로젝트가 너무 잘되어(?) 서버에 과부하가 올 수도 있다고 생각하고, FETCH JOIN 등으로 쿼리를 최적화했다.
또한 실시간 채팅은 조회 성능이 매우 중요하므로 인덱스를 도입해 성능을 향상시켜보았다.
어떤 기준으로 인덱스를 도입하고, 어떻게 도입하면 좋을지 배울 수 있었던 경험이었다.
Ex)
- 리포지토리 내부의 메서드에서 where 절에서 사용되는 필드로 인덱스값 생성
- 역방향 조회의 경우 역방향 인덱스를 생성
5. 역시나 채팅은 어렵다...
문제: 채팅의 경우 로직이 복잡해 하나의 클래스에 어디까지 역할을 부여할지, 어떤 기준으로 분리할지가 매우 어려운 것 같다.
business 패키지에서 implement 패키지 내의 클래스를 호출하는 방식으로 최대한 구현해보았지만 결국 순환 참조 문제가 생겼다.
해결: 이번에도 역시 이벤트와 이벤트 리스너를 통해 해결했다.
잘 짜여진 채팅 SDK의 코드를 보고 코드의 흐름을 이해해보는 경험을 방학이 되면 해볼 생각이다.
'회고록' 카테고리의 다른 글
| [프로젝트] Cockple - 배드민턴 모임 플랫폼 (4) | 2025.08.27 |
|---|---|
| [해커톤] 교내 연합 해커톤(UNITHON) 후기 (4) | 2025.08.14 |
| [PS] 2024 UCPC 예선 후기 (2) | 2024.07.13 |