Search

FILLIN

시기
2025/12/20 → 2026/02/20
역할
백엔드
개인/회사
동아리
설명
UMC 9기 데모데이 출품작
FILLIN_BE
FILLIN-UMC
도로 위의 빈틈을 함께 채우는 실시간 도로 상황 제보 플랫폼 ‘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)을 적용해 "사진 업로드 완료"라는 이벤트만 발행하고, 미션 서비스가 이를 알아서 처리하도록 구조를 변경하여 책임을 명확히 분리했습니다.