Skip to content

[FEAT] 컬렉션 좋아요 기능 구현 #562

Description

@GiJungPark

Description

작업 배경

사용자가 관심 있는 컬렉션에 좋아요를 표시하고 좋아요한 컬렉션을 모아볼 수 있도록 좋아요 저장 구조와 조회 정책이 필요합니다.

현재 상태

  • 컬렉션 좋아요 저장 구조와 API가 없습니다.
  • 비공개 전환, 본인 컬렉션, 차단 관계에 따른 좋아요 노출 정책이 구현되어 있지 않습니다.

목표 상태

  • 로그인한 사용자가 컬렉션 좋아요를 등록하거나 취소할 수 있습니다.
  • 중복 등록 및 이미 취소된 좋아요 요청은 멱등하게 처리합니다.
  • 사용자가 좋아요한 컬렉션을 커서 기반으로 조회할 수 있습니다.
  • 컬렉션의 공개 상태가 변경되더라도 좋아요 데이터는 유지하되 조회 권한에 따라 노출 여부를 결정합니다.

확정 정책

  • 로그인하지 않은 사용자는 좋아요를 등록하거나 취소할 수 없습니다.
  • 사용자는 자신이 만든 컬렉션에도 좋아요를 누를 수 있습니다.
  • 본인이 자신의 비공개 컬렉션에 누른 좋아요는 본인의 ‘좋아요한 컬렉션’ 목록에 노출합니다.
  • 공개 컬렉션이 비공개로 전환되어도 기존 좋아요 데이터와 좋아요 수는 유지합니다.
  • 비공개로 전환된 다른 사용자의 컬렉션은 좋아요한 컬렉션 목록에서 숨깁니다.
  • 로그인한 사용자와 컬렉션 소유자 사이에 차단 관계가 있으면 좋아요한 컬렉션 목록에서 숨깁니다.
  • 컬렉션 삭제 시 해당 컬렉션의 좋아요 데이터는 함께 삭제합니다.
  • 동일 사용자와 컬렉션 조합의 좋아요는 하나만 저장합니다.
  • 좋아요 등록·취소 API는 동일 요청을 반복해도 같은 최종 상태를 보장합니다.

작업 범위

  • 컬렉션 좋아요 엔티티·테이블 및 유니크 제약조건 설계
  • 컬렉션 좋아요 등록 API 구현
    • PUT /collections/{collectionId}/likes
  • 컬렉션 좋아요 취소 API 구현
    • DELETE /collections/{collectionId}/likes
  • 좋아요한 컬렉션 목록 조회 API 구현
    • GET /users/me/liked-collections
  • 등록·취소 멱등성 보장
  • 컬렉션 좋아요 수 조회 반영
  • 본인 비공개 컬렉션 및 타인 비공개 컬렉션 노출 정책 적용
  • 차단 관계 컬렉션 제외
  • 생성 시점과 식별자를 이용한 커서 페이지네이션 구현
  • 컬렉션 삭제 시 좋아요 종속 데이터 정리
  • 관련 Controller·Application·Service·Repository 테스트 작성
  • 신규 테이블과 유니크 제약조건을 실제 DB에 반영할 DDL 정리

제외 범위

  • 컬렉션 생성·수정·삭제
  • 일반 컬렉션 목록 및 상세 조회
  • 비로그인 사용자의 좋아요 요청 이후 로그인 화면 이동과 원래 컬렉션 복귀 처리
  • 좋아요 기반 추천

완료 조건

  • 로그인한 사용자가 컬렉션 좋아요를 멱등하게 등록·취소할 수 있습니다.
  • 동일 사용자와 컬렉션 조합의 좋아요가 중복 저장되지 않습니다.
  • 본인의 비공개 컬렉션 좋아요는 본인 목록에 노출됩니다.
  • 타인의 비공개 컬렉션 및 차단 관계 사용자의 컬렉션은 목록에서 숨겨집니다.
  • 공개 상태 변경 후에도 기존 좋아요 데이터가 유지됩니다.
  • 좋아요한 컬렉션 목록이 중복·누락 없이 커서 페이지네이션됩니다.
  • 신규 DB 구조와 제약조건에 필요한 DDL 및 데이터 영향을 확인합니다.
  • 관련 테스트가 통과합니다.

To-Do

  • 컬렉션 좋아요 엔티티·테이블 설계
  • 좋아요 등록·취소 API 구현
  • 좋아요 요청 멱등성 보장
  • 좋아요한 컬렉션 목록 조회 구현
  • 공개 범위 및 차단 정책 적용
  • 컬렉션 삭제 시 종속 데이터 정리
  • DB DDL 정리
  • 관련 테스트 작성

Reference

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions