프로젝트 개요
Momo는 지역 기반 모임 플랫폼으로, 사용자들이 다양한 카테고리의 모임을 생성하고 참여할 수 있는 서비스입니다. 아직 MVP 단계이지만, 도메인 주도 설계(DDD)를 기반으로 설계되었으며, 각 애그리거트 간의 명확한 경계를 통해 확장 가능하고 유지보수가 용이한 구조를 구현했습니다.
주요 기능
- 사용자 관리 및 인증 (일반 로그인, OAuth2)
- 모임 생성, 수정, 참가 관리
- 카테고리 기반 모임 분류
- 결제 시스템 (토스페이먼츠 연동)
- 실시간 알림 (WebSocket)
- 사용자 평가 및 점수 시스템
- 팔로우 기능
DDD 애그리거트 설계
1. User Aggregate (사용자 애그리거트)
핵심 엔티티: User (Root Entity) 구성 엔티티: UserCategory, UserFollow, UserRating
User 애그리거트는 사용자의 모든 정보와 관련된 비즈니스 로직을 관리합니다. 특징적인 부분은 모든 연관관계를 단방향 OneToMany로 설계하여 애그리거트 내부의 일관성을 보장한 점입니다.

2. Meeting Aggregate (모임 애그리거트)
핵심 엔티티: Meeting (Root Entity) 구성 엔티티: MeetingParticipant
Meeting 애그리거트는 모임의 생명주기를 관리하며, 참가자 관리를 통해 모임의 일관성을 보장합니다.

3. Category Aggregate (카테고리 애그리거트)
단순한 마스터 데이터를 관리하는 애그리거트로, 다른 애그리거트에서 ID 참조 방식으로 사용됩니다.
4. Payment Aggregate (결제 애그리거트)
토스페이먼츠와 연동된 결제 처리를 담당하며, 중복 결제 방지를 위한 UNIQUE 제약조건을 포함합니다.
5. Notification Aggregate (알림 애그리거트)
WebSocket을 통한 실시간 알림 서비스를 제공하며, 조회 성능 최적화를 위한 인덱스를 포함합니다.
6. Auth Aggregate (인증 애그리거트)
OAuth2 소셜 로그인을 위한 UserSocial 엔티티를 관리합니다.
핵심 설계 원칙
1. 애그리거트 경계 준수
각 애그리거트는 명확한 경계를 가지며, 애그리거트 간의 직접적인 객체 참조를 피하고 ID 참조 방식을 사용했습니다.
JPA 연관관계 매핑 (애그리거트 내부)
- user_categories.user_id ← User (@JoinColumn)
- user_follow.follower_id ← User (@JoinColumn)
- user_ratings.target_user_id ← User (@JoinColumn)
- meeting_participants.meeting_id ← Meeting (@JoinColumn)
- user_social.user_id ← User (@ManyToOne)
ID 참조 (애그리거트 간)
- user_categories.category_id → Category.id
- meetings.host_user_id → User.id
- meetings.category_id → Category.id
- payments.user_id → User.id
- payments.meeting_id → Meeting.id
2. 단방향 연관관계
User와 Meeting 애그리거트는 모두 단방향 OneToMany 관계를 사용하여 복잡성을 줄이고 성능을 향상시켰습니다.
3. 최종 일관성
애그리거트 간의 데이터 정합성은 서비스 레이어에서 관리하며, 필요에 따라 이벤트 기반의 비동기 처리를 활용했습니다.
데이터 흐름

1. 모임 생성 플로우
User → Meeting 생성 → Category 참조 → Notification 발송
2. 모임 참가 플로우
User → Meeting 참가 → Payment 처리 → MeetingParticipant 생성 → Notification 발송
3. 사용자 평가 플로우
User → UserRating 생성 → 점수 재계산 → User 업데이트
기술적 특징
1. 결제 시스템
- 토스페이먼츠 API 연동
- 낙관적 락을 통한 동시성 제어
- 중복 결제 방지 제약조건
2. 실시간 알림
- WebSocket을 통한 실시간 메시지 전송
- 이벤트 기반 비동기 처리
- 조회 성능 최적화 인덱스
3. 사용자 점수 시스템
- 평점(60%) + 참석률(30%) + 활동도(10%) 기반 계산
- 모임 참가 이력을 통한 신뢰도 측정
확장 가능성
1. 마이크로서비스 분리
각 애그리거트가 독립적으로 설계되어 있어 향후 마이크로서비스로 분리가 용이합니다.
2. 이벤트 소싱
현재 이벤트 기반 구조를 바탕으로 이벤트 소싱 패턴 도입이 가능합니다.
3. CQRS 패턴
읽기와 쓰기 모델의 분리를 통한 성능 최적화가 가능합니다.
결론
DDD 기반의 애그리거트 설계를 통해 복잡한 도메인 로직을 명확하게 분리하고, 각 애그리거트의 독립성을 보장했습니다. 특히 ID 참조 방식을 통한 느슨한 결합과 단방향 연관관계를 통한 복잡성 감소는 프로젝트의 확장성과 유지보수성을 크게 향상시켰습니다.
이러한 설계 원칙을 통해 팀원들이 각자의 도메인에 집중할 수 있었고, 변경에 대한 영향도를 최소화할 수 있었습니다. 향후 서비스 확장 시에도 이러한 구조를 바탕으로 안정적인 개발이 가능할 것으로 기대됩니다.
'Spring 7기 프로젝트 > 모임 플렛폼 프로젝트' 카테고리의 다른 글
| List.containsAll() vs HashSet.containsAll() 성능 비교 (0) | 2025.07.24 |
|---|---|
| Flyway와 데이터베이스 마이그레이션 관리 (0) | 2025.07.23 |
| 모임 플랫폼의 사용자 신뢰도 시스템과 성능 최적화 (0) | 2025.07.21 |
| Spring Data JPA에서 미리 집계된 카운트를 활용한 팔로우 목록 조회 최적화 (1) | 2025.07.20 |
| Java Record 클래스: 올바른 예외처리와 역할 분담 (0) | 2025.07.18 |