Repository navigation
✨ feat: 연습 장소 지도 검색·상세·수정·삭제와 일정 삭제 - #263
Merged
Merged
Conversation
"동방 1호"처럼 이름만으로 통하는 장소가 많은데 address가 필수라 아무 글자나 채워야 했다. 주소를 선택값으로 풀고, 지도 검색으로 고른 위치는 위도·경도를 함께 저장한다. 좌표를 따로 두는 이유: 주소 문자열만으로는 지도에서 고른 것인지 손으로 적은 것인지 구분할 수 없다. 손으로 적은 "동방 1호"로 지도를 열면 엉뚱한 곳이 나오므로, 좌표가 있는 장소만 지도를 띄우는 기준으로 쓴다. - 좌표는 위도·경도 쌍으로, 주소와 함께만 받는다. 반쪽 좌표나 주소 없는 좌표는 400. - PATCH로 주소를 바꾸면서 좌표를 안 보내면 이전 좌표를 비운다. 남겨 두면 새 주소에 옛 위치의 지도가 붙는다. - PATCH에서 address·detailAddress·imageUrl은 null(또는 빈 문자열)을 "지움"으로 받는다. 기존에는 빈 값을 undefined로 접어 한 번 넣은 값을 지울 방법이 없었다. - name은 @IsOptional이 null을 통과시켜 DB NOT NULL에서 500이 났다. null을 400으로 막는다. - 기존 행의 주소는 전부 손으로 적은 값이라 마이그레이션에서 비운다(테스트 데이터뿐). - 일정 상세 응답의 place.address도 nullable이 된다. 장소 모듈에 빠져 있던 Swagger 데코레이터도 컨벤션대로 채운다. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
주소를 도로명으로 직접 치게 하는 대신, 이름만 필수로 두고 위치는 원할 때 지도에서 상호명으로 찾아 붙이게 한다. 상세 화면에서는 고른 위치를 정적 지도로 보여준다. 검색은 카카오맵 JS SDK의 키워드 검색을 브라우저에서 바로 부른다. REST API는 비밀 키라 백엔드 중계 엔드포인트가 하나 더 필요한데, JS 키는 등록 도메인으로 보호되는 공개값이라 같은 결과를 중계 없이 얻는다. 우편번호 검색은 상호명으로 찾을 수 없어 "도로명을 외워서 쳐야 하는" 원래 문제가 그대로 남는다. SDK는 index.html이 아니라 처음 쓸 때 불러온다 — 장소 검색·상세를 여는 사람만 쓴다. VITE_KAKAO_MAP_KEY가 없으면 검색 진입점과 상세 지도를 숨긴다. - 장소 추가 폼: 이름 / 위치(지도에서 찾기) / 상세 위치 / 커버. 고른 장소의 상호명은 이름 칸이 비어 있을 때만 채운다. - 상세: 카드를 누르면 열린다. 좌표가 있는 장소만 정적 지도를 보여주고, 누르면 카카오맵으로 간다. 움직이는 지도는 세로 스크롤 화면에서 손가락이 걸릴 때마다 스크롤을 막아서 쓰지 않는다. - 수정: 상세의 "수정"이 같은 폼을 값이 채워진 채로 연다. PATCH는 안 보낸 필드를 유지하므로 지운 값은 null로 보낸다. - 상세는 장소 객체가 아니라 ID를 들고 목록에서 다시 찾는다. 수정 후 목록이 갱신되면 열려 있는 상세도 따라 바뀐다. - 곡 추가 화면에만 있던 폼 안쪽 보조 버튼 크기를 버튼 size(inline)로 올려 함께 쓴다. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Note Currently processing new changes in this PR. This may take a few minutes, please wait... ⚙️ Run configuration
📒 Files selected for processing: 53
✨ Finishing Touches
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 |
장소 상세의 "수정"이 폼 시트를 한 겹 더 띄우던 것을, 일정 상세처럼 한 시트 안에서 화면만 바꾸게 한다. 같은 장소 위에 시트가 또 올라오면 뒤로 가기가 어디로 가는지 헷갈리고, 닫을 때도 두 번 닫아야 했다. 그러려고 폼 본문을 PlaceFormView로 떼어 추가 시트(PlaceCreateModal)와 상세 시트 (PlaceDetailModal)가 함께 쓴다. 폼은 시트가 열릴 때마다 새로 마운트되므로, 열림을 감지해 값을 되돌리던 초기화 로직은 없앤다. 삭제는 투표·팀 삭제와 같은 패턴(앱바 우측 액션 + 확인창)으로 넣는다. - 장소 삭제는 리더·부리더만 가능해(백엔드 규칙) 그 역할에게만 보인다. - 장소 삭제는 소프트 삭제(isActive=false)라, 라이브러리와 일정 추가 폼이 활성 장소만 받도록 where__is_active=true를 붙인다. 안 붙이면 지운 장소가 그대로 남아 보인다. - 일정 삭제는 상세·수정 화면에서만 보인다. 추가 폼에는 지울 대상이 없다. - 일정 삭제 후에는 목록 캐시만 무효화한다. 상세까지 무효화하면 아직 열려 있는 상세가 방금 지운 일정을 다시 조회해 404를 만든다. 상세 캐시는 구독이 끊긴 뒤에 지운다. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This branch had an error being deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
⏱ 소요 시간
📌 작업 요약
연습 장소를 "이름만 필수"로 풀고, 위치는 원할 때 지도에서 상호명으로 찾아 붙이게 바꿔요. 고른 위치는 상세 화면에서 정적 지도로 보여주고, 상세 안에서 수정·삭제할 수 있어요. 같은 패턴으로 일정 삭제도 넣었어요.
적용 범위: 밴드 라이브러리의 연습 장소, 일정 추가 폼 안의 장소 추가, 일정 상세(삭제). 백엔드는
places모듈과 마이그레이션 1건.📝 작업 내용
1. 주소를 선택값으로, 좌표는 별도 컬럼으로
"동방 1호"처럼 이름만으로 통하는 장소가 많은데 주소가 필수라 아무 글자나 채워야 했어요.
좌표를 따로 저장하는 이유는 지도를 띄울지 판단하는 기준이 필요해서예요. 주소 문자열만으로는 지도에서 고른 것인지 손으로 적은 것인지 구분할 수 없고, 손으로 적은 글자로 지도를 열면 엉뚱한 곳이 나와요. 좌표가 있으면 지도에서 고른 장소예요.
address·detailAddress·imageUrl은null(빈 문자열 포함)이 "지움"undefined로 접어서, 한 번 넣은 값을 지울 방법이 없었어요2. 검색은 카카오맵 JS SDK를 브라우저에서 바로 호출
SDK는
index.html이 아니라 처음 쓸 때 불러와요(shared/lib/kakao-maps.ts). 장소 검색·상세를 여는 사람만 쓰는 스크립트라서요.3. 상세는 정적 지도
움직이는 지도는 세로 스크롤 화면에서 손가락이 지도에 걸릴 때마다 스크롤을 막아요. 정적 지도(이미지)로 보여주고, 누르면 카카오맵이 새 탭으로 열려요. SDK가 만드는 링크는 이름이 없고 좌표만 담겨 있어서, 장소명이 붙는 링크와
aria-label로 바꿔 둬요.좌표가 없는 장소는 "위치" 섹션이 통째로 빠져요.
4. 수정은 상세와 같은 시트 안에서 전환
일정 상세(
ScheduleCreateModal)와 같은 방식이에요. 폼 본문을PlaceFormView로 떼어 추가 시트(PlaceCreateModal)와 상세 시트(PlaceDetailModal)가 함께 써요. 폼은 시트가 열릴 때마다 새로 마운트돼서, 열림을 감지해 값을 되돌리던 초기화 로직은 없앴어요.PATCH는 안 보낸 필드를 유지하므로 지운 값은
null로, 손대지 않은 커버는 보내지 않아요. 상세는 장소 객체가 아니라 ID를 들고 목록에서 다시 찾아요 — 수정 후 목록이 갱신되면 열려 있는 상세도 따라 바뀌어야 해서요.5. 삭제 — 투표·팀 삭제와 같은 패턴
앱바 우측 액션 + 확인창이에요(
SchedulePollDeleteAction과 같은 모양).Changes
51ffe6843dad1b9059e99함께 고친 것
name: null을 보내면@IsOptional이 통과시켜 DB NOT NULL에서 500이 나던 것 → 400Button의size="inline"으로 올려 "지도에서 찾기"와 함께 사용시안과 다르게 간 곳 (장소 상세)
typo-xl-sb(24 SemiBold),typo-lg-b(18 Bold)의도적으로 안 한 것
🚨 주요 고민 및 해결 과정
문제
주소 입력에 지도·주소 검색을 붙이려 했는데, 사람들은 합주실을 도로명이 아니라 상호명으로 기억하고, 주소가 아예 필요 없는 장소도 많았어요.
해결 과정
주소 입력을 "검증된 주소 입력"으로 조이는 대신 반대로 풀었어요. 이름만 필수로 두고, 위치는 지도에서 고른 것만 구조화된 값(주소+좌표)으로 받고, 손으로 적는 메모는 "상세 위치"가 맡아요. 그래서 주소가 있으면 지도와 이어지고, 없으면 지도를 띄우지 않는다는 한 가지 기준으로 화면이 갈려요.
📑 참고 문서/ ADR
backend/docs/backend/api-docs/place.md(이번 PR에서 갱신)✅ Test plan
sh ./scripts/verify.sh(lint → format:check → build → test) — 779 tests 통과pnpm --dir frontend exec tsc -b— 통과pnpm --dir frontend run lint— 에러 0 (기존 경고 1건:BandMemberSettings.tsxexhaustive-deps)pnpm --dir frontend test— 498 tests 통과band-co.vercel.app)에서 카카오 검색·지도 — 미실행💬 리뷰 요구사항
UPDATE "places" SET "address" = NULL— 기존 주소를 지워도 되는지. 되돌릴 수 없어요.update-place.dto.ts) — 빈 문자열이 "유지"에서 "지움"으로 바뀌어요. 장소 수정 API를 쓰는 화면은 이번에 처음 생겨서 기존 호출부는 없어요.schedules.controller.ts의 PATCH·DELETE) — 이번 PR 이전부터 그랬고 건드리지 않았어요. 삭제 버튼이 생기면서 눈에 띄게 돼서 적어 둬요. 별도 PR로 막을지 의견 주세요.PlaceStaticMap.tsx— SDK가 그린 DOM(a,img)을 직접 고쳐요(링크 주소·aria-label·alt). SDK가 구조를 바꾸면 조용히 빠질 수 있는 자리예요.VITE_KAKAO_MAP_KEY도 필요해요.🔜 후속
place가 이름·주소만 내려줘요. 백엔드가 좌표를 함께 내려줘야 시작할 수 있어요.VITE_KAKAO_MAP_KEY문서화 — 예시 env 파일 위치가 정해지면 추가해요.🤖 Generated with Claude Code