server : api.fillin.site
도로 위의 빈틈을 함께 채우는 실시간 도로 상황 제보 플랫폼 ‘FILLIN’
Tech Stack
•
Core: Java 17, Spring Boot 3.x, Spring Security
•
Database: MySQL (JPA), Redis
•
Architecture: Event-Driven Architecture (Spring Event)
My Contributions
1. Spring Event 기반 미션 달성 시스템 (Gamification)
•
기능: 사용자의 활동(사진 업로드, 댓글 작성 등)에 따라 실시간으로 미션을 달성하고 뱃지를 부여하는 로직 구현.
•
설계(Deep Dive):
◦
문제: 핵심 비즈니스 로직(예: 사진 업로드)에 미션 달성 확인 로직이 섞여 있어 코드가 복잡해지고, 미션 로직 에러가 메인 기능에 영향을 주는 문제 발생.
◦
해결: Spring Event(ApplicationEventPublisher)를 도입하여 로직을 분리.
◦
구현: ReportCreatedEvent 발행 → MissionEventListener가 이를 구독(Subscribe)하여 미션 달성 여부를 비동기로 판단하고 DB를 갱신하도록 설계하여 서비스 간 결합도를 낮춤.
2. 마이페이지 데이터 애그리게이션
•
구현: 흩어져 있는 사용자 데이터(프로필, 작성한 필름, 달성한 미션, 통계)를 하나의 API로 효율적으로 조회하는 로직 구현.
•
최적화: MyReportService에서 DTO Projection을 활용하여 불필요한 엔티티 조회를 줄이고, 응답 속도를 개선.
3. 사용자 맞춤형 알림 제어
•
기능: 마케팅, 활동 알림 등 다양한 알림 종류별로 사용자가 수신 여부를 선택할 수 있는 NotificationSetting 도메인 설계.
•
로직: 알림 발송 전(Interceptor 혹은 Service단) 사용자의 설정값을 검증하여 불필요한 FCM 요청 비용을 절감.
Trouble Shooting & Growth
•
[아키텍처] 강결합된 비즈니스 로직의 리팩토링:
◦
초기에는 사진 업로드 서비스(ReportService) 안에 "미션 달성 체크 로직"이 포함되어 있었습니다. 이로 인해 사진 업로드가 느려지거나, 미션 에러로 업로드가 실패하는 문제가 있었습니다.
◦
이를 Observer 패턴(Spring Event)을 적용해 "사진 업로드 완료"라는 이벤트만 발행하고, 미션 서비스가 이를 알아서 처리하도록 구조를 변경하여 책임을 명확히 분리했습니다.
