-
Notifications
You must be signed in to change notification settings - Fork 0
feat: 도메인 이벤트 시스템 도입 및 MemberEvent 기능 구현 #37
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
- 불필요한 파일 로깅 설정 삭제 - 로그백 롤링 정책 제거 (max-file-size, max-history) - 프로덕션 환경에서는 콘솔 로깅만 사용하도록 변경
Backend: - 이미지 업로드 메서드명 명확화 (generatePresignedPostUrl → generatePresignedUploadUrl) - 불필요한 파일명 검증 로직 제거로 업로드 제약 완화 Frontend: - 포스트 목록에서 authorId 변수 오류 수정 (authorId → author.id) - 프로필 이미지 동적 표시 기능 추가 - Thymeleaf 템플릿의 일관성 확보
Backend: - Author Value Object에 imageId 필드 추가 및 검증 로직 강화 - Post 생성 시 authorImageId 전달하도록 수정 - 불필요한 My Posts 관련 API/View 제거 (/posts/mine 경로 삭제) - MemberFragmentView에서 중복 모델 속성 제거 Frontend: - 프로필 이미지 동적 표시 기능 개선 - Thymeleaf 템플릿 변수명 오류 수정 - member-profile.html에서 프로필 링크 수정 Test: - Author 관련 테스트 케이스 추가 (imageId 검증) - 이미지 업로드 테스트에서 파일명 검증 로직 수정 - My Posts 관련 테스트 케이스 제거
- 이미지 캐러셀 및 편집 뷰에서 사용하지 않는 @AuthenticationPrincipal 파라미터 제거 - 불필요한 import 정리로 코드 단순화 - 이미지 조회는 인증 없이 가능하도록 설계 변경
Domain Layer: - AggregateRoot 추상 클래스 도입으로 도메인 이벤트 관리 기반 확립 - Member, Post, Comment, Friendship 엔티티에 이벤트 발행 로직 통합 - 도메인 이벤트들을 domain/event 패키지로 이동 및 재구성 - 각 애그리거트별 비즈니스 이벤트 정의 (MemberRegistered, PostCreated 등) - CommentDeletedEvent에 parentCommentId 필드 추가 - FriendRequestCommand에 프로필 이미지 ID 정보 추가 Application Layer: - DomainEventPublisherService로 이벤트 발행자 통합 - MemberEventListener를 MemberDomainEventListener로 리팩토링 - 애플리케이션 서비스들에서 도메인 이벤트 기반으로 수정 - 각 도메인별 이벤트 리스너 추가 (Comment, Friend, Post) - 이벤트 리스너들에서 @transactional(propagation = Propagation.REQUIRES_NEW) 사용 Infrastructure: - MemberPrincipal에서 도메인 이벤트 관련 의존성 제거 - Repository들에 도메인 이벤트 저장 및 조회 메서드 추가 Test: - FriendRequestCommand 관련 테스트들에 프로필 이미지 ID 파라미터 추가 - FriendshipResponseTest, FriendRequestorTest 등 테스트 코드 수정 - 불필요한 테스트 헬퍼 메서드 제거 Breaking Changes: - 애플리케이션 이벤트들을 도메인 이벤트로 이동으로 인한 패키지 변경 - FriendRequestCommand 생성자 파라미터 변경 (프로필 이미지 ID 추가) - 이벤트 리스너들의 인터페이스 변경
Domain:
- MemberEvent 도메인 클래스 추가 (회원 활동 이력 관리)
- MemberEventType enum으로 활동 유형 정의 (REGISTERED, PROFILE_UPDATED, POST_CREATED 등)
- CommentCreatedEvent에 필요한 필드 추가
Application:
- MemberEventService로 활동 기록 비즈니스 로직 구현
- MemberEventQueryService로 활동 이력 조회 기능 제공
- MemberEventRepository로 데이터 접근 인터페이스 정의
- 각 도메인 이벤트 리스너들에서 MemberEvent 저장 로직 추가
- CommentDomainEventListener: 댓글 작성 활동 기록
- FriendshipDomainEventListener: 친구 관련 활동 기록
- MemberDomainEventListener: 회원 관련 활동 기록
- PostDomainEventListener: 포스트 작성 활동 기록
Adapter:
- MemberEventApi로 활동 기록 REST API 엔드포인트 구현
- MemberEventResponse로 API 응답 DTO 정의
- /api/members/{id}/events 엔드포인트로 회원 활동 이력 조회
Features:
- 회원별 활동 이력 실시간 기록
- 페이징 지원 활동 이력 조회
- 이벤트 타입별 필터링 기능
Application Layer: - MemberEventService를 CQRS 패턴에 따라 분리: - MemberEventQueryService: 조회 전담 (MemberEventReader 구현) - MemberEventCreationService: 생성 전담 (MemberEventCreator 구현) - MemberEventUpdateService: 수정/삭제 전담 (MemberEventUpdater 구현) - 포트 인터페이스 도입으로 의존성 역전 강화 Domain Layer: - MemberEvent에서 불필요한 markAllAsRead() 메서드 제거 - 단일 책임 원칙에 따른 도메인 모델 단순화 Event Listeners: - 각 도메인 리스너에서 MemberEvent 저장 로직 제거: - CommentDomainEventListener: 댓글 수 업데이트에만 집중 - FriendshipDomainEventListener: 친구 관계 업데이트에만 집중 - MemberDomainEventListener: 팔로우/팔로잉 수 업데이트에만 집중 - PostDomainEventListener: 댓글 수 업데이트에만 집중 - MemberEventDomainEventListener로 모든 이벤트 저장 로직 중앙화 Adapter Layer: - MemberEventApi에서 서비스명 변경 및 메서드명 정규화 (get → read) - 불필요한 의존성 제거로 코드 단순화 Benefits: - 단일 책임 원칙(SRP) 적용으로 유지보수성 향상 - CQRS 패턴 도입으로 명령/조회 분리 - 이벤트 저장 로직 중앙화로 일관성 확보
Adapter Layer:
- MemberEventView로 활동 이력 웹 뷰 구현
- MemberEventApi에 읽음 상태 업데이트 API 추가 (/events/{eventId}/read)
- 이벤트 목록 조회 API 경로 수정 (/api/v1/events → /api/v1/members/events)
Application Layer:
- FollowCreationService에서 팔로우 시 MemberEvent 생성 로직 추가
Domain Layer:
- Member 도메인에 팔로우/언팔로우 시 이벤트 발행 로직 추가
Frontend:
- 이벤트 목록 프래그먼트 템플릿 추가 (events.html)
- 사이드바에서 알림 아이콘을 MemberEvent 링크로 변경
- 프로필 페이지에서 활동 이력 링크 추가
- 설정 페이지에서 MemberEvent 관련 링크 업데이트
Features:
- 회원 활동 이력 실시간 조회 (웹 뷰)
- 이벤트 읽음 상태 개별 업데이트
- 팔로우/언팔로우 활동 기록 자동화
Test: - TestEntityExtensions.kt 추가로 테스트 유틸리티 확장 - CommentTest에서 반복적인 테스트 코드 단순화 - FriendshipTest와 MemberTest에서 테스트 헬퍼 사용 개선 - PostFixture에서 불필요한 코드 제거 - TestMemberHelper에서 프로필 이미지 ID 설정 로직 개선 Benefits: - 테스트 코드 재사용성 향상 - 중복 코드 제거로 가독성 개선 - 테스트 유지보수성 향상
Domain Layer: - DomainEvent 기반 인터페이스 도입 (모든 도메인 이벤트의 공통 계약) - MemberDomainEvent 추상 클래스 추가 (회원 관련 이벤트의 기반 클래스) - 도메인 이벤트 계층 구조 확립: DomainEvent → MemberDomainEvent → 구체적 이벤트 - 모든 회원 도메인 이벤트들이 MemberDomainEvent 상속하도록 수정: - MemberRegisteredDomainEvent - MemberActivatedDomainEvent - MemberDeactivatedDomainEvent - MemberProfileUpdatedDomainEvent - PasswordChangedDomainEvent Application Layer: - 애플리케이션 서비스들에서 이벤트 생성 로직 수정 - MemberDomainEventListener에서 MemberDomainEvent 타입으로 이벤트 처리 Test: - 도메인 이벤트 계층 구조 반영하여 테스트 코드 수정 - MemberTest에 도메인 이벤트 검증 로직 추가 - PostFixture 및 각 서비스 테스트에서 이벤트 생성 코드 수정 Benefits: - 도메인 이벤트들의 타입 안전성 확보 - 이벤트 계층 구조로 확장성 향상 - 회원 관련 이벤트들의 일관성 있는 관리
Domain Layer: - 도메인 이벤트 계층 구조 전체 도메인으로 확장: - CommentDomainEvent 인터페이스 추가 (댓글 관련 이벤트 기반) - PostDomainEvent 인터페이스 추가 (게시글 관련 이벤트 기반) - FriendDomainEvent 인터페이스 추가 (친구 관계 이벤트 기반) - 모든 도메인 이벤트들이 각 계층 인터페이스 상속 및 withXXXId 메서드 구현 - AggregateRoot의 drainDomainEvents 메서드 단순화: - when-else 분기 제거, 각 이벤트의 withXXXId 메서드 활용 - 타입 안전성 확보 및 코드 중복 제거 - MemberEvent 엔티티 추가: - 회원 활동 기록을 저장하는 도메인 엔티티 - MemberEventType enum으로 이벤트 타입 분류 - 읽음 상태 관리 및 관련 엔티티 ID 추적 기능 Domain Value Objects: - FriendRelationship에 프로필 이미지 ID 검증 강화 - FriendRequestCommand에 프로필 이미지 ID 양수 검증 추가 Test: - 모든 도메인 이벤트 테스트 추가 (MemberActivatedEventTest, MemberRegisteredEventTest 등) - CommentTest, PostTest, FriendshipTest에 drainDomainEvents 검증 로직 추가 - MemberEventTest 및 MemberEventTypeTest 추가 - FriendRequestCommandTest에 프로필 이미지 ID 경계값 테스트 추가 Benefits: - 도메인 이벤트들의 일관된 계층 구조 확립 - 타입 안전한 이벤트 처리 및 ID 설정 - 회원 활동 기록을 위한 일급 엔티티 도입 - 코드 중복 제거 및 유지보수성 향상
Test: - 도메인 이벤트 리스너 테스트 전체 추가: - CommentDomainEventListenerTest (댓글 이벤트 처리 검증) - MemberEventDomainEventListenerTest (회원 이벤트 생성 검증) - FriendshipDomainEventListenerTest (친구 관계 이벤트 처리 검증) - MemberDomainEventListenerTest (회원 도메인 이벤트 처리 검증) - PostDomainEventListenerTest (게시글 이벤트 처리 검증) - MemberEvent 서비스 테스트 추가: - MemberEventCreatorTest (이벤트 생성 검증) - MemberEventReaderTest (이벤트 조회 검증) - MemberEventUpdaterTest (이벤트 업데이트 검증) - PostRepositoryTest 추가 (게시글 저장소 테스트) Application Layer: - PostDomainEventListener에서 이벤트 처리 로직 개선 - PostRepository에 findById 메서드 추가 - PostCreationService에서 이벤트 발행 로직 수정 - MemberEventUpdateService에서 불필요한 코드 제거 - MemberEventRepository에 existsById 메서드 추가 Domain Layer: - 도메인 이벤트들에 occurredAt 필드 추가 (이벤트 발생 시간 추적) - Post 엔티티에서 이벤트 발행 시점 개선 Benefits: - 도메인 이벤트 시스템의 전체 테스트 커버리지 확보 - 이벤트 처리 로직의 신뢰성 향상 - 서비스 계층의 코드 품질 개선 - 이벤트 추적 기능 강화
Adapter Layer (Web API): - MemberEventRestExceptionHandler 추가: - MemberEventNotFoundException 처리 (404 Not Found) - MemberEventApplicationException 처리 (400 Bad Request) - 일반 예외 처리 로직 개선 - MemberEventApiTest 추가 (REST API 전체 기능 테스트) Adapter Layer (WebView): - MemberEventViewTest 추가 (WebView 전체 기능 테스트) Application Layer: - MemberEventQueryService에 예외 처리 로직 추가 - MemberEventUpdateService에서 예외 발생 시점 명확화 - MemberEventReader 포트에 existsById 메서드 추가 - 새로운 예외 클래스들 도입: - MemberEventApplicationException (애플리케이션 예외 기반) - MemberEventNotFoundException (이벤트 조회 실패 예외) Domain Layer: - 도메인 이벤트들에 occurredAt 필드 추가 (이벤트 발생 시간 추적): - FriendRequestAcceptedEvent, FriendRequestSentEvent, FriendshipTerminatedEvent - MemberDeactivatedDomainEvent, PostCreatedEvent, PostDeletedEvent - Friendship, Member 엔티티에서 이벤트 발행 시 occurredAt 설정 Test: - TestEventHelper 유틸리티 추가 (이벤트 테스트용 헬퍼 메서드) - 관련 테스트들에서 occurredAt 필드 검증 로직 추가 - MemberEventDomainEventListenerTest, MemberDomainEventListenerTest 수정 Benefits: - MemberEvent 시스템의 웹 계층 완성 - 일관된 예외 처리 체계 확립 - 이벤트 발생 시간 추적 기능 추가 - API 신뢰성 향상 및 테스트 커버리지 확대
Documentation: - README.md: 프로젝트 개요 및 빠른 시작 가이드 보강 - API_DOCUMENTATION.md: REST API 명세 221줄 추가 - 회원, 게시글, 컬렉션, 친구, 팔로우, 댓글 API 상세화 - 요청/응답 예시, 인증 방법, 에러 코드 명시 - ARCHITECTURE.md: 헥사고날 아키텍처 상세 설명 267줄 추가 - Clean Architecture + DDD 적용 사례 - 레이어별 책임, 의존성 방향, 패턴 설명 - DOMAIN_MODEL.md: DDD 기반 도메인 설계 331줄 추가 - 14개 애그리거트 상세 명세, Value Objects 설계 - 도메인 이벤트 시스템, 비즈니스 규칙 정리 - DOMAIN_REQUIREMENTS.md: 도메인 요구사항 268줄 추가 - 핵심 유스케이스, 비즈니스 규칙, 제약조건 상세화 - TODO.md: 프로젝트 로드맵 체계적 재구성 (675줄 수정) - 9개 카테고리, 우선순위별 작업 현황 - 상태 추적 기능, 구현 완료 항목 표시 Benefits: - 프로젝트 이해도 향상을 위한 체계적 문서 구축 - 신규 참여자 온보딩 시간 단축 - 기술 의사결정 및 설계 철학 명문화 - 개발 방향성 및 로드맵 가시성 확보
Database: - member_event 테이블 생성: - 회원 이벤트 기록을 위한 기본 테이블 - member_id, event_type, title, message 등 필수 컬럼 정의 - 관련 엔티티 ID (member, post, comment) 외래 키 컬럼 추가 - 5개 인덱스 생성: - idx_member_event_member_id (회원별 조회 최적화) - idx_member_event_created_at (시간순 조회 최적화) - idx_member_event_event_type (이벤트 타입별 필터링) - idx_member_event_is_read (읽음 상태 필터링) - idx_member_event_member_unread (복합 인덱스, 읽지 않은 이벤트 조회 최적화) - posts 테이블에 author_image_id 컬럼 추가 (NOT NULL) - friendships 테이블에 friend_image_id, image_id 컬럼 추가 (NOT NULL) Test: - application-devdb.yml에서 테스트 데이터베이스 설정 수정 Chore: - 불필요한 http/auth.http 파일 삭제 Benefits: - MemberEvent 기능을 위한 데이터베이스 스키마 준비 완료 - 조회 성능 최적화를 위한 인덱스 전략 적용 - 회원 이미지 정보 저장을 위한 컬럼 확장
|
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.



📋 주요 변경 내용 요약
🔔 도메인 이벤트 시스템 완성
@Async,@EventListener)🗄️ MemberEvent 기능 구현
🧪 테스트 커버리지 대폭 확장
🔧 데이터베이스 및 인프라
🎯 아키텍처 개선
이 PR은 도메인 이벤트 시스템을 통해 시스템의 확장성과 유지보수성을 크게 향상시키는 중요한 아키텍처 개선입니다. 모든 사용자 활동을 이벤트로 기록하고 실시간 알림 기능의 기반을 마련했습니다.