feat: 담지 않고 공유 링크만 발급하는 API - #262
Conversation
- POST /api/v1/courses/share — 요청은 저장과 같은 payload, 응답은 shareToken 하나 - 추천 결과 화면에서 공유를 누르면 "먼저 담아주세요" 안내만 띄우고 있었다. 담기는 여행 날짜 선택까지 거쳐야 해서, 그냥 보여주려는 사람에게는 단계가 과했다 - 링크로 열려면 코스가 어딘가 있어야 하므로 코스 자체는 영속한다. 다만 **주인 없이** 저장해 "내 코스" 어디에도 안 나오게 했다 — 목록·상세·삭제가 전부 guest_id 로 좁히므로 주인이 없으면 어느 질의에도 안 걸린다. 플래그 컬럼을 더하고 질의마다 조건을 붙이는 안도 있었지만, 그러면 기존 질의 넷을 모두 고쳐야 하고 하나라도 빠뜨리면 담지 않은 코스가 남의 목록에 뜬다 - 그 대가로 이 코스는 아무도 지울 수 없다(삭제도 소유자 범위로만 돈다). 정리는 발급 시각 (course_share.created_at)을 근거로 나중에 일괄로 한다 — 지금 배치까지 만들지는 않는다 - X-Guest-Id 를 받지 않는다. 소유 관계를 만들지 않으므로 쓸 데가 없고, 받아두면 "담긴다" 는 오해만 남는다 - 응답에 코스 내용을 싣지 않는다. 화면이 방금 보던 코스를 그대로 들고 있고, 붙여 보내려면 혜택·날씨를 다시 조립해야 해서 기상청 호출이 딸려온다 - 구성 검증은 저장과 같은 길을 탄다. 두 경로가 갈리면 같은 payload 가 한쪽에서만 통과한다 — CourseSaveRequest 의 출발지 검사·예외 번역을 한 곳으로 모아 두 팩토리가 함께 쓴다
- 발급한 링크가 실제로 열리고 공개 응답에 내부 courseId 가 없는지 확인한다 - **담지 않은 코스가 내 코스 목록에 안 나오는지**를 단언한다. 이 PR 의 전제가 "주인이 없으면 게스트 범위 질의에 안 걸린다" 라, 그 전제가 깨지면 여기서 걸려야 한다 - 구성이 틀린 요청이 저장과 같은 400(ITINERARY-002)을 받는지 본다 — 두 경로의 검증이 갈리는 회귀를 잡는다 - 같은 payload 를 두 번 보내면 링크가 두 개라는 것도 잠근다. 문서에 적은 동작이라 우연히 바뀌면 안 된다 - 도메인 단위 테스트로 sharedOnly 가 주인 없이 만들어지고 구성 불변식은 그대로 지키는지 본다
|
Warning Review limit reached
Next review available in: 38 minutes You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (9)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
- 나눠 저장하면 코스만 커밋되고 링크 발급이 실패했을 때 아무도 닿을 수 없는 행이 남는다. 주인이 없어 목록·상세·삭제 어디에도 안 걸리고, 공유 행이 없어 링크로도 못 연다 - 정리 배치가 공유 행의 발급 시각으로 나이를 재므로(코스 테이블에 생성 시각이 없다) 그 배치조차 이 행을 못 찾는다 — 영영 남는 죽은 데이터가 된다 - "담지 않은 코스는 반드시 공유 행과 짝" 이라는 정리의 전제를 여기서 지킨다 - 이 경로는 발급 경합을 다루지 않는다. 방금 만든 코스라 그 id 를 아는 요청이 하나뿐이라 유니크 제약에 걸릴 상대가 없다
- 정리 배치가 이 전제 위에 서는데 그것을 확인하는 단언이 없었다
리뷰 (CodeRabbit 레이트리밋 대신 수동) + 대응로컬 검증 — 테스트 1,315건 통과 · 실패 0 · 컨벤션 훅 차단 0. 좋았던 것
고친 것 — 코스와 공유 행이 짝이 아닐 수 있었다 →
|
…-saving # Conflicts: # src/test/java/com/offway/core/itinerary/controller/CourseShareIntegrationTest.java
Situation
Task
핵심 질문 하나: 담지 않는다면서 무엇을 저장하는가. 링크로 열려면 코스 데이터가 어딘가 있어야 한다. 그러면서도 "내 코스" 에는 안 보여야 한다.
Action
엔드포인트
POST /api/v1/courses/share— 요청 본문은 저장(POST /courses)과 같고, 응답은shareToken하나. 성공은 201.X-Guest-Id를 받지 않는다. 소유 관계를 만들지 않으므로 쓸 데가 없고, 받아 두면 "담긴다" 는 오해만 남는다.남는 것 (retention)
담지 않은 코스는 쌓이기만 한다. 주인이 없어 삭제 API 로도 지울 수 없기 때문이다. 지금 배치를 만들지는 않았고, 대신 지울 수 있는 근거를 남겨 뒀다.
Result
shareToken채우기)과 같은 파일(CourseStorageApi·CourseStorageService·공유 통합 테스트)을 건드린다. fix: 코스 상세·목록 응답에 shareToken 을 채운다 #260 이 먼저 들어가면 이 브랜치에서dev를 한 번 머지해야 한다.작업을 마치기 전 자문 셋
연관 이슈