diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c44e9a..a682b5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,15 @@ --- +## 2026-06-28 + +### ๐ ์ง์ญ ํ์ ๊ณ์ธตํ โ "ํ๊ตญ|์์ธ" โ "ํ๊ตญ โบ ์์ธ" (#532) +- ๋ฌธ์ : ์๋น ์์ธ/๋ฆฌ์คํธ๊ฐ region ์๋ณธ(`ํ๊ตญ|์์ธ|๊ฐ๋จ๊ตฌ`, ํ์ดํ ๋ ธ์ถ)์ ๊ทธ๋๋ก ํ์ +- ํด๊ฒฐ: ๊ณต์ฉ ์ ํธ `lib/region.ts` `formatRegion()` ์ ์ค โ ๋นํ ํฐ/`null`/๋๋ฏธ(`๋๋ผ`) ์ ๊ฑฐ ํ ` โบ ` ๊ณ์ธต ์กฐ์ธ +- ์ ์ฉ: `RestaurantDetail.tsx`(์ง์ญ ํ๊ธฐ), `RestaurantList.tsx`(์นด๋ ์ง์ญ) +- ๊ฒ์ ์ฟผ๋ฆฌ์ฉ `buildSearchQuery`(๊ณต๋ฐฑ ์กฐ์ธ)๋ ์ ์ง โ ์ธ๋ถ ์ง๋ ๊ฒ์ ํธํ +- ์ค๊ณ์: `docs/design/532-region-display/README.md` + ## 2026-06-17 ### ๐ฏ ํด๋ฌ์คํฐ expansion ํ ๋ง์ปค ํด๋ฆญ ์ ์ฌ๋ฌถ์ ๋ฐฉ์ง (v0.1.66) diff --git a/docs/design/532-region-display/README.md b/docs/design/532-region-display/README.md new file mode 100644 index 0000000..3888270 --- /dev/null +++ b/docs/design/532-region-display/README.md @@ -0,0 +1,43 @@ +# #532 โ ์ง์ญ ํ์ ๊ณ์ธตํ (formatRegion) + +## ๋ฐฐ๊ฒฝ / ๋ฌธ์ +์ง์ญ(`region`)์ `๋๋ผ|์๋|๊ตฌ๊ตฐ` ํ์ดํ ๊ตฌ๋ถ ๋ฌธ์์ด(์: `ํ๊ตญ|์์ธ|๊ฐ๋จ๊ตฌ`). +์ฌ์ฉ์ ํ๋ฉด์ **์๋ณธ์ด ๊ทธ๋๋ก ๋ ธ์ถ**๋์ด `ํ๊ตญ|์์ธ|๊ฐ๋จ๊ตฌ`(ํ์ดํ) ๋๋ ํ๋ฌธ `ํ๊ตญ ์์ธ`๋ก ๋ณด์. +๊ธฐ๋: **`ํ๊ตญ โบ ์์ธ โบ ๊ตฌ๊ตฐ`** ๊ณ์ธต(breadcrumb) ํ์. + +## ๋ฒ์ +- ์๋น ์์ธ ์ํธ์ "์ง์ญ" ํ๊ธฐ (`RestaurantDetail.tsx`) +- ์๋น ๋ฆฌ์คํธ ์นด๋์ ์ง์ญ ํ๊ธฐ (`RestaurantList.tsx`) +- ๊ณต์ฉ ์ ํธ `formatRegion()` ์ ์ค (`lib/region.ts`) + +๋น๋ฒ์: ์ง์ญ *ํํฐ* ๋์/์ ๋ ฌ(์ ์), ์ธ๋ถ ์ง๋ ๊ฒ์ ์ฟผ๋ฆฌ(`buildSearchQuery` โ ๊ณต๋ฐฑ ์กฐ์ธ ์ ์ง), ๋ฐ์ดํฐ ์ ํฉ์ฑ(๋ณ๋ ์ด์). + +## ํจ์ ์ค๊ณ + +### `formatRegion(region: string | null | undefined): string` +- **์ ๋ ฅ**: ํ์ดํ ๊ตฌ๋ถ ์ง์ญ ๋ฌธ์์ด (์: `"ํ๊ตญ|์์ธ|๊ฐ๋จ๊ตฌ"`, `"์ผ๋ณธ|null"`, `"ํ๊ตญ||๊ด์ ๊ตฌ"`, `""`) +- **์ฒ๋ฆฌ**: + 1. falsy โ `""` ๋ฐํ + 2. `split("|")` โ ๊ฐ ํ ํฐ `trim()` + 3. ๋น ํ ํฐ, `"null"`(๋์๋ฌธ์ ๋ฌด์), ๋๋ฏธ `"๋๋ผ"` ์ ๊ฑฐ + 4. ๋จ์ ํ ํฐ์ `" โบ "`(U+203A)๋ก ์กฐ์ธ +- **์ถ๋ ฅ ์**: + | ์ ๋ ฅ | ์ถ๋ ฅ | + |---|---| + | `ํ๊ตญ\|์์ธ\|๊ฐ๋จ๊ตฌ` | `ํ๊ตญ โบ ์์ธ โบ ๊ฐ๋จ๊ตฌ` | + | `์ผ๋ณธ\|null` | `์ผ๋ณธ` | + | `ํ๊ตญ\|\|๊ด์ ๊ตฌ` | `ํ๊ตญ โบ ๊ด์ ๊ตฌ` | + | `""` / `null` | `""` (ํธ์ถ๋ถ์์ ๋ฏธํ์) | +- **์์ ํจ์**(I/O ์์) โ ๋จ์ ํ ์คํธ ์ฉ์ด. + +### ์ ์ฉ +- `RestaurantDetail.tsx:132`: `{restaurant.region}` โ `{formatRegion(restaurant.region)}` +- `RestaurantList.tsx:54`: `{r.region}` โ `{formatRegion(r.region)}` + +## ์ฃ์ง์ผ์ด์ค +- ๋ชจ๋ ํ ํฐ์ด ๋๋ฏธ/๋น ๊ฐ(`"ํ๊ตญ|"`, `"|"`) โ ์ ํจ ํ ํฐ๋ง ๋จ๊น(`ํ๊ตญ`) ๋๋ `""`. ํธ์ถ๋ถ๋ `region &&` ๊ฐ๋๊ฐ ์์ด `""`์ด๋ฉด ๋ฏธํ์. +- ๋จ์ผ ํ ํฐ(`"ํ๊ตญ"`) โ `ํ๊ตญ` ๊ทธ๋๋ก. + +## ๊ฒ์ฆ +- ๋จ์ ํ ์คํธ(๊ฐ๋ฅ ์) ๋๋ dev ํ๋ฉด์์ ์์ธ/๋ฆฌ์คํธ ์ง์ญ ํ๊ธฐ๊ฐ `โบ` ๊ณ์ธต์ผ๋ก ๋ณด์ด๋์ง. +- `npm run build`(๋๋ tsc/lint) ํต๊ณผ. diff --git a/frontend/src/components/RestaurantDetail.tsx b/frontend/src/components/RestaurantDetail.tsx index 790df49..22f1d92 100644 --- a/frontend/src/components/RestaurantDetail.tsx +++ b/frontend/src/components/RestaurantDetail.tsx @@ -7,6 +7,7 @@ import ReviewSection from "@/components/ReviewSection"; import MemoSection from "@/components/MemoSection"; import { RestaurantDetailSkeleton } from "@/components/Skeleton"; import Icon from "@/components/Icon"; +import { formatRegion } from "@/lib/region"; interface RestaurantDetailProps { restaurant: Restaurant; @@ -129,7 +130,7 @@ export default function RestaurantDetail({ )} {restaurant.region && (
- ์ง์ญ {restaurant.region} + ์ง์ญ {formatRegion(restaurant.region)}
)} {restaurant.price_range && ( diff --git a/frontend/src/components/RestaurantList.tsx b/frontend/src/components/RestaurantList.tsx index a9aca30..5431891 100644 --- a/frontend/src/components/RestaurantList.tsx +++ b/frontend/src/components/RestaurantList.tsx @@ -3,6 +3,7 @@ import type { Restaurant } from "@/lib/api"; import { getCuisineIcon } from "@/lib/cuisine-icons"; import Icon from "@/components/Icon"; +import { formatRegion } from "@/lib/region"; import { RestaurantListSkeleton } from "@/components/Skeleton"; interface RestaurantListProps { @@ -51,7 +52,7 @@ export default function RestaurantList({ {r.name} {r.region && ( - {r.region} + {formatRegion(r.region)} )} {r.rating && ( โ {r.rating} diff --git a/frontend/src/lib/region.ts b/frontend/src/lib/region.ts new file mode 100644 index 0000000..7924478 --- /dev/null +++ b/frontend/src/lib/region.ts @@ -0,0 +1,22 @@ +// ์ง์ญ ํ์ ์ ํธ โ #532 +// region ์ "๋๋ผ|์๋|๊ตฌ๊ตฐ" ํ์ดํ ๊ตฌ๋ถ ๋ฌธ์์ด. ์ฌ์ฉ์์๊ฒ๋ ๊ณ์ธต(breadcrumb)์ผ๋ก ๋ณด์ฌ์ค๋ค. + +/** ํ์์์ ์ ์ธํ ๋๋ฏธ/๋ฌด์๋ฏธ ํ ํฐ. */ +const DUMMY_TOKENS = new Set(["", "null", "๋๋ผ"]); + +/** + * ํ์ดํ ๊ตฌ๋ถ region ์ "๋๋ผ โบ ์๋ โบ ๊ตฌ๊ตฐ" ๊ณ์ธต ๋ฌธ์์ด๋ก ๋ณํํ๋ค. + * ๋น ํ ํฐยท"null"ยท๋๋ฏธ("๋๋ผ")๋ ์ ๊ฑฐํ๋ค. ์ ํจ ํ ํฐ์ด ์์ผ๋ฉด "". + * + * ์) "ํ๊ตญ|์์ธ|๊ฐ๋จ๊ตฌ" โ "ํ๊ตญ โบ ์์ธ โบ ๊ฐ๋จ๊ตฌ" + * "์ผ๋ณธ|null" โ "์ผ๋ณธ" + * "ํ๊ตญ||๊ด์ ๊ตฌ" โ "ํ๊ตญ โบ ๊ด์ ๊ตฌ" + */ +export function formatRegion(region: string | null | undefined): string { + if (!region) return ""; + return region + .split("|") + .map((t) => t.trim()) + .filter((t) => !DUMMY_TOKENS.has(t.toLowerCase())) + .join(" โบ "); +}