Files
sodalive-backend-spring-boot/docs/20260324_차단유저구매콘텐츠상세조회예외처리.md

2.8 KiB

20260324 차단 유저 구매 콘텐츠 상세 조회 예외 처리

목적

  • 차단 관계가 있어도 조회자가 해당 콘텐츠를 구매한 경우에는 상세 조회를 허용한다.
  • 차단 예외 경로에서는 댓글 및 시리즈 내 이전/다음 콘텐츠 정보를 노출하지 않는다.

구현 체크리스트

  • AudioContentService.getDetail에서 구매 여부(isExistOrderedAndOrderType)를 차단 판정보다 먼저 계산
  • 차단 + 미구매인 경우 기존 content.error.blocked_access 예외 유지
  • 차단 + 구매인 경우 상세 조회 허용
  • 차단 + 구매인 경우 댓글 목록/댓글 수 조회 쿼리 미실행 및 응답을 [], 0으로 반환
  • 차단 + 구매인 경우 previousContent, nextContent 조회 쿼리 미실행 및 응답을 null로 반환
  • 정적 진단/테스트/빌드 검증 수행

완료 기준 (Pass/Fail)

  • AC1: 차단 + 미구매 요청 시 SodaException(messageKey = "content.error.blocked_access")가 발생해야 한다.
    • QA: getDetail 분기 코드 확인 및 관련 테스트/빌드 통과
  • AC2: 차단 + 구매 요청 시 상세 조회가 실패하지 않아야 한다.
    • QA: getDetail 분기 코드 확인 및 관련 테스트/빌드 통과
  • AC3: 차단 + 구매 요청 시 댓글/이전/다음 콘텐츠 조회 로직이 실행되지 않아야 한다.
    • QA: 조건문 가드로 commentRepository.findByContentId, totalCountCommentByContentId, findPreviousContent, findNextContent 호출 차단 확인

검증 기록

  • 1차 구현: 진행 전

    • 무엇을: 요구사항 분석 및 기존 패턴 탐색
    • 왜: 차단/구매 예외 규칙을 기존 서비스 로직과 일관되게 반영하기 위해
    • 어떻게: grep, ast-grep, explore/librarian 백그라운드 탐색 수행
  • 2차 구현: 기능 반영 및 시나리오 검증

    • 무엇을: AudioContentService.getDetail에서 차단+구매 예외를 허용하고, 해당 경로에서 댓글/이전·다음 조회를 생략하도록 분기 로직을 수정했다. 또한 AudioContentServiceTest를 추가해 차단+미구매/차단+구매 시나리오를 실제 메서드 호출로 검증했다.
    • 왜: 요청사항(구매자 접근 허용 + 댓글/이전·다음 비조회)을 코드 레벨뿐 아니라 실행 가능한 테스트로 재현해 회귀를 방지하기 위해.
    • 어떻게:
      • 명령: lsp_diagnostics (AudioContentService.kt, AudioContentServiceTest.kt)
      • 결과: 실패 (현재 실행 환경에 Kotlin LSP 미구성으로 .kt 진단 불가)
      • 명령: ./gradlew test --tests "kr.co.vividnext.sodalive.content.AudioContentServiceTest"
      • 결과: 성공 (신규 2개 시나리오 테스트 통과)
      • 명령: ./gradlew test
      • 결과: 성공
      • 명령: ./gradlew build
      • 결과: 성공