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
Reference
Description
작업 배경
사용자가 관심 있는 컬렉션에 좋아요를 표시하고 좋아요한 컬렉션을 모아볼 수 있도록 좋아요 저장 구조와 조회 정책이 필요합니다.
현재 상태
목표 상태
확정 정책
작업 범위
PUT /collections/{collectionId}/likesDELETE /collections/{collectionId}/likesGET /users/me/liked-collections제외 범위
완료 조건
To-Do
Reference