You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
문제 설명 :
본편 레슨을 전부 시청해 실제로 완강해도, 미리보기 레슨이 전체 레슨 수(total)에 포함되어 total ≠ completed가 되고, 리뷰 작성 게이트가 이를 "미완강"으로 판단해 리뷰 작성을 차단한다(NOT_ENROLLED).
완강 판정 소스: MyEnrolledCourseQueryAdapter의 total = lessons.size() (미리보기 포함) vs completed = VideoProgress.completed 개수
미리보기 레슨은 진도(completed) 이력이 없어 분자엔 안 잡히고 분모(total)엔 잡힘 → 완강해도 total > completed
같은 소스를 리뷰 게이트(ReviewPolicy → EnrollmentCompletedCheckAdapter)와 마이페이지 완강 목록이 공유 → 두 곳 모두 영향(리뷰 차단 + 마이페이지 미완강 표시)
🔄 재현 방법 (Steps to Reproduce)
미리보기 레슨(첫 섹션 첫 레슨)이 있는 강의를 수강한다.
본편 레슨을 100% 시청해 완강한다. (미리보기는 진도 이력 없음)
마이페이지 → "수강완료"로 안 뜸 (E-1)
해당 강의에 리뷰 작성 요청 → 403 NOT_ENROLLED (기대: 작성 성공)
🕵️♂️ 원인 분석 및 수정 내역
Model / Policy
UseCase / Command
Service
Port / Adapter : MyEnrolledCourseQueryAdapter.findLessonsByCourseId가 강의의 전체 레슨을 담아 total(lessons.size())에 미리보기 레슨이 포함됨. 첫 섹션의 첫 레슨(orderIndex 0,0 = 미리보기)을 제외하고 집계하도록 수정 → total이 본편 레슨 수로 정정됨.
리뷰 게이트(community/.../ReviewPolicy, EnrollmentCompletedCheckAdapter)는 별도 수정 불필요 — 동일한 MyEnrolledCourseQueryPort를 재사용하므로 위 한 곳 수정으로 리뷰 차단·마이페이지 완강 표시가 동시에 정상화됨.
미리보기 판정 기준은 기존 PreviewLessonPolicy와 동일(첫 섹션 첫 레슨). 단 해당 정책은 learning_activity 도메인 엔티티 타입을 받으므로, enrollment_management 엔티티에는 동일 기준(section.orderIndex==0 && lesson.orderIndex==0)의 로컬 판정 사용.
사전 확인 필요: EnrolledCourseSectionReferenceEntity에 orderIndex 필드 존재 여부.
🚨 검증 및 회귀 방지 (TestCode)
미리보기 포함 강의에서 본편 완강 시 total == completed → 리뷰 작성 성공 테스트
마이페이지 완강 목록에 정상 노출 확인
미완강(본편 일부 미시청) 시 여전히 차단(NOT_ENROLLED)되는지 검증
미리보기 레슨이 없는 강의는 기존과 동일 동작하는지 회귀 확인
📸 로그 및 참고 자료
E-1(미리보기 카운트 버그)과 동일한 데이터 소스에서 파생된 문제
올바른 레퍼런스: CourseProgressQueryAdapter:48 — 이미 !PreviewLessonPolicy.isPreview(...)로 미리보기 제외 집계 중
완강해도 리뷰 작성이 차단됨 (미리보기 레슨이 완강 판정 분모에 포함)
📊 버그 심각도 및 우선순위
P0P1: 완강 사용자의 리뷰 작성 기능 차단 + 마이페이지 완강 표시 불일치P2🐛 문제 상황 (현상)
연관 이슈 번호: # (E-1 미리보기 카운트 버그와 동일 뿌리)연관 도메인: enrollment_management, community문제 설명:본편 레슨을 전부 시청해 실제로 완강해도, 미리보기 레슨이 전체 레슨 수(total)에 포함되어
total ≠ completed가 되고, 리뷰 작성 게이트가 이를 "미완강"으로 판단해 리뷰 작성을 차단한다(NOT_ENROLLED).MyEnrolledCourseQueryAdapter의total = lessons.size()(미리보기 포함) vscompleted = VideoProgress.completed 개수ReviewPolicy→EnrollmentCompletedCheckAdapter)와 마이페이지 완강 목록이 공유 → 두 곳 모두 영향(리뷰 차단 + 마이페이지 미완강 표시)🔄 재현 방법 (Steps to Reproduce)
403 NOT_ENROLLED(기대: 작성 성공)🕵️♂️ 원인 분석 및 수정 내역
Model/PolicyUseCase/CommandServicePort/Adapter:MyEnrolledCourseQueryAdapter.findLessonsByCourseId가 강의의 전체 레슨을 담아total(lessons.size())에 미리보기 레슨이 포함됨. 첫 섹션의 첫 레슨(orderIndex 0,0 = 미리보기)을 제외하고 집계하도록 수정 → total이 본편 레슨 수로 정정됨.RepositoryControllerResponse/Request수정 파일
enrollment_management/infrastructure/persistence/MyEnrolledCourseQueryAdapter.java(findLessonsByCourseId에 미리보기 제외 필터 추가)참고
community/.../ReviewPolicy,EnrollmentCompletedCheckAdapter)는 별도 수정 불필요 — 동일한MyEnrolledCourseQueryPort를 재사용하므로 위 한 곳 수정으로 리뷰 차단·마이페이지 완강 표시가 동시에 정상화됨.PreviewLessonPolicy와 동일(첫 섹션 첫 레슨). 단 해당 정책은 learning_activity 도메인 엔티티 타입을 받으므로, enrollment_management 엔티티에는 동일 기준(section.orderIndex==0 && lesson.orderIndex==0)의 로컬 판정 사용.EnrolledCourseSectionReferenceEntity에orderIndex필드 존재 여부.🚨 검증 및 회귀 방지 (TestCode)
total == completed→ 리뷰 작성 성공 테스트📸 로그 및 참고 자료
CourseProgressQueryAdapter:48— 이미!PreviewLessonPolicy.isPreview(...)로 미리보기 제외 집계 중