프로젝트 포트폴리오 · Android 우선 MVP · Flutter · Spring Boot · AWS Lightsail
서비스 : https://mogako.xyz
모각코는 온라인 라운지에 모여 각자의 작업에 집중하는 서비스다. 서로 대화하지 않아도 같은 공간에서 누군가 작업하고 있다는 느낌을 주는 것을 목표로 만들었다.
| 영역 | 기술 | 역할 |
|---|---|---|
| 클라이언트 | Flutter | Android 우선 앱, iOS·Windows 타깃 공유 |
| 웹 | Vite | 랜딩·안내·관리자 페이지 |
| 백엔드 | Java 17 · Spring Boot 3.5.16 | REST API·Raw JSON WebSocket·도메인 로직 |
| 데이터 | PostgreSQL · Redis 7.4 | 영속 데이터와 실시간 상태 분리 |
| 인프라 | AWS Lightsail · Docker Compose · Caddy | HTTPS, 정적 파일, 컨테이너 운영 |
| 외부 연동 | Google OAuth · Firebase Analytics/Crashlytics · S3 | 인증, 운영 관측성, 이미지 저장 |

사용자는 Flutter 앱 또는 웹 브라우저로 HTTPS :443에 접근한다. Caddy가 TLS를 처리하고
정적 랜딩 페이지는 직접 제공하며, API와 WebSocket 요청은 Spring Boot로 전달한다.
AWS Lightsail에서는 Caddy·Spring Boot·Redis를 Docker Compose로 운영한다. PostgreSQL은 외부 관리형 DB에 두어 애플리케이션 컨테이너와 데이터의 수명을 분리했다.
실제 도메인 기준으로 mogako.xyz는 랜딩·관리자 페이지, api.mogako.xyz는 API·WebSocket,
downloads.mogako.xyz는 Windows 설치 파일을 제공한다.
이미지의 FCM·Kakao 로그인은 외부 연동 확장 지점이다. 현재 구현 기준으로 Firebase는 Analytics·Crashlytics, 소셜 로그인은 Google OAuth를 사용한다.
membership ≠ active presence ≠ personal focus
라운지 멤버인지, 현재 좌석에 연결되어 있는지, 개인 집중 타이머가 실행 중인지는 서로 다른 상태다. 이 경계를 나누어 네트워크가 잠시 끊겨도 집중 세션과 좌석 상태가 불필요하게 함께 종료되지 않도록 했다.
WebSocket 이벤트에는 sequence를 두고, 재연결 시 REST snapshot을 기준으로 상태를 다시 맞춘다. 실시간 연결을 정답 저장소로 만들지 않은 것이 핵심이다.
PostgreSQL에는 사용자·멤버십·채팅·집중 기록처럼 보존해야 하는 데이터를 저장한다. Redis에는 세션·presence·좌석 lease·rate limit처럼 빠르게 바뀌고 만료될 수 있는 상태를 저장한다.