Skip to content

[REFACTOR] Recommendation cross-context lookup 계약 고도화 #453

Description

@Dimo-2562

Parent: #419

✨ 리팩토링 할 부분

Recommendation 컨텍스트가 사용하는 cross-context lookup seam을 JPA 엔티티/지연 프록시가 아닌 ID·projection 중심의 명시적 계약으로 고도화한다.


🏷️ 도메인 (해당하는 것에 체크)

  • 📝 domain:post (게시글)
  • 👤 domain:useraccount (사용자 계정)
  • 🧠 domain:personalization (개인화 프로필)
  • 🏢 domain:source (테크블로그 출처)
  • 🔍 domain:search (검색)
  • 🔔 domain:notification (알림)
  • 📊 domain:recommendation (추천)
  • 🎯 domain:activity (사용자 활동)
  • 🔐 domain:auth (인증/보안)
  • 🌐 infra (인프라/배포)

📌 현재 코드의 문제점

  • #421에서 cross-context repository 직접 참조는 application lookup seam 뒤로 이동했지만, 일부 seam은 User, Post JPA 엔티티와 getReferenceById() 지연 프록시 의미를 그대로 노출한다.
  • 현재 seam은 의존 진입점을 통제하는 효과는 있지만 bounded-context 간 안정적인 published contract로 보기 어렵다.
  • ReadPostLookupService는 ID 집합을 반환하지만 내부 쿼리가 ReadPostPost 전체 엔티티를 fetch join한다.
  • getRecentReadPostIds 이름만으로는 readDuration >= 10초 또는 null이라는 “의미 있는 읽기” 정책이 드러나지 않는다.
  • 이 상태가 RecommendationSet에 그대로 흡수되면 임시 엔티티 결합이 새 도메인 모델의 영구 계약으로 굳어질 수 있다.

🎯 리팩토링 방향

  • Recommendation이 소비하는 User/Post 계약을 ID 또는 최소 projection 기반으로 좁힌다.
  • JPA reference가 필요한 경우 해석 책임을 Recommendation infrastructure/persistence 경계 안에 둔다.
  • RecommendationSet과 추천 생성 도메인 API가 cross-context JPA 엔티티를 새 공개 파라미터로 확장하지 않도록 한다.
  • 최근 읽은 게시글 제외 쿼리를 post ID projection으로 변경해 전체 엔티티 fetch join을 제거한다.
  • “의미 있는 읽기” 조건과 최신순/최대 1,000개 정책을 lookup 계약명 또는 명시적 문서로 드러낸다.
  • 기존 API 응답, DB/Elasticsearch schema, 추천 결과와 누락 사용자 처리 의미는 유지한다.

✅ 완료 조건

  • Recommendation application/domain 코드가 cross-context JPA entity/proxy 계약을 새로 노출하지 않는다.
  • User/Post reference 해석 위치와 트랜잭션 경계가 테스트로 고정된다.
  • ReadPost 제외 목록 조회가 ID projection 쿼리를 사용한다.
  • 의미 있는 읽기 조건, 정렬, 최대 조회 수가 repository/lookup 테스트로 보호된다.
  • 변경 전후 쿼리 수 또는 SQL 호출 경로의 회귀가 검증된다.

💡 기대 효과

  • 가독성 향상
  • 성능 개선
  • 유지보수성 향상
  • 코드 중복 제거
  • 기타: bounded-context 계약에서 JPA persistence 의미 제거

순서

4.5 1차 로드맵(#422~#425)에서는 현재 schema를 유지하고 임시 계약의 확산만 막는다.
본 이슈는 1차 문서 동기화 이후 수행하는 2차 경계 고도화 작업으로 둔다.

Metadata

Metadata

Assignees

Labels

🌟 REFACTOR리팩터링 (기능 변화 X)🎯 domain:activity사용자 활동 관련 (읽은 게시글, 북마크, 검색 히스토리)📊 domain:recommendation추천 시스템

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions