๐Ÿš€ ์˜จํ•(on-fit) ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… & ํ˜‘์—… ํšŒ๊ณ 

์กฐ์ค€ํ˜•ยท2025๋…„ 12์›” 5์ผ

์˜จํ•

๋ชฉ๋ก ๋ณด๊ธฐ
15/16

โ€œ๋ถ€์‚ฐ๊ด‘์—ญ์‹œ ์ „์ฒด๊ฐ€ ์™œ ์•ˆ ๋‚˜์˜ฌ๊นŒ?โ€

- ๊ฐ’์˜ ๊ทœ์น™์ด ๊ณต์œ ๋˜์ง€ ์•Š์•„ ์ƒ๊ธด ํ•„ํ„ฐ๋ง ๋ฒ„๊ทธ ํ•ด๊ฒฐ๊ธฐ

ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ฐ€์žฅ ๋งŽ์ด ๋А๋ผ๋Š” ๊ฒƒ์€

์ฝ”๋“œ๋ณด๋‹ค ์ค‘์š”ํ•œ ๊ฑด โ€˜ํŒ€์› ๊ฐ„์˜ ๊ทœ์น™ ๊ณต์œ โ€™๋ผ๋Š” ์‚ฌ์‹ค์ด๋‹ค.

์ด๋ฒˆ์— ๋‚˜๋Š” โ€˜๋ฐ˜๊ฒฝ ๊ธฐ๋ฐ˜ ๊ฒŒ์‹œ๊ธ€ ํ•„ํ„ฐ๋งโ€™ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ

๋‹ค๋ฅธ ํŒ€์›์ด ๋งŒ๋“  Filter ์ปดํฌ๋„ŒํŠธ์™€ ๋ฏธ๋ฌ˜ํ•œ ๋ถˆ์ผ์น˜ ๋•Œ๋ฌธ์—

์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฒ„๊ทธ๋ฅผ ๊ฒช์—ˆ๋‹ค.

๊ทธ ๊ณผ์ •์„ ๊ธฐ๋กํ•ด๋ณธ๋‹ค.


๐Ÿงฉ 1. ๋ฌธ์ œ ์ƒํ™ฉ: โ€œ๋ถ€์‚ฐ๊ด‘์—ญ์‹œ๋งŒ ์„ ํƒํ–ˆ๋Š”๋ฐ ๊ธ€์ด ํ•˜๋‚˜๋„ ์•ˆ ๋‚˜์™€์š”โ€

๋‚˜๋Š” FitList ํŽ˜์ด์ง€์—์„œ ๋‹ค์Œ ์กฐ๊ฑด์„ ๊ตฌํ˜„ํ–ˆ๋‹ค.

  • ์‹œ/๋„ ๋˜๋Š” ์‹œ๊ตฐ๊ตฌ๋ฅผ ์„ ํƒํ•˜๋ฉด ์ง€์—ญ ํ•„ํ„ฐ ๋ชจ๋“œ
  • ๋‘˜ ๋‹ค ์„ ํƒ ์•ˆ ํ•˜๋ฉด ๋ฐ˜๊ฒฝ ํ•„ํ„ฐ ๋ชจ๋“œ

๊ทธ๋Ÿฐ๋ฐ ์‹ค์ œ๋กœ ํ…Œ์ŠคํŠธํ•ด๋ณด๋‹ˆ,

์‹œ/๋„ = ๋ถ€์‚ฐ๊ด‘์—ญ์‹œ

์‹œ๊ตฐ๊ตฌ = (์„ ํƒ ์•ˆ ํ•จ)

์ด ๊ฒฝ์šฐ ๋ถ€์‚ฐ๊ด‘์—ญ์‹œ ์ „์ฒด ๊ฒŒ์‹œ๊ธ€์ด ๋‚˜์™€์•ผ ํ•˜๋Š”๋ฐ,

ํ•„ํ„ฐ๋ง๋œ ๋ชฉ๋ก์€ 0๊ฐœ์˜€๋‹ค.

์ฝ˜์†”์—๋Š” ์ด๋Ÿฐ ๊ฐ’์ด ์ฐํ˜”๋‹ค.

filter.sido: "๋ถ€์‚ฐ๊ด‘์—ญ์‹œ"
filter.sigungu: ""

์—ฌ๊ธฐ์„œ ๋‚˜๋Š” ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค.


๐Ÿ•ต๏ธ 2. ๋ฌธ์ œ ์›์ธ: โ€œ์‹œ๊ตฐ๊ตฌ ๋ฏธ์„ ํƒ = ๋นˆ ๋ฌธ์ž์—ดโ€ ๊ทœ์น™์„ ๋ชฐ๋ž๋‹ค

Filter ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“  ํŒ€์›์€,

์‹œ/๋„ ๋ณ€๊ฒฝ ์‹œ ์‹œ๊ตฐ๊ตฌ ํ•„ํ„ฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋กœ์ง์„ ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด๋†จ๋‹ค.

onChange({ ...value, sido: next, sigungu: '' })

์ฆ‰,

  • ์‹œ๊ตฐ๊ตฌ๋ฅผ ์„ ํƒ ์•ˆ ํ–ˆ์„ ๋•Œ ๊ฐ’์€ "์‹œยท๊ตฐยท๊ตฌ ์„ ํƒ"์ด ์•„๋‹ˆ๋ผ
  • ๋นˆ ๋ฌธ์ž์—ด ''

์ด์—ˆ๊ณ , ๋‚˜๋Š” ์ด ์‚ฌ์‹ค์„ ๋ชจ๋ฅด๊ณ  ์ด๋ ‡๊ฒŒ ํ•ด์„ํ•ด๋ฒ„๋ฆฐ ๊ฒƒ์ด๋‹ค:

const hasSigunguFilter =
  filter.sigungu !== "์‹œยท๊ตฐยท๊ตฌ ์„ ํƒ" && filter.sigungu !== "์ „์ฒด"

์—ฌ๊ธฐ์— filter.sigungu = '' ์ด ๋“ค์–ด์˜ค๋ฉด ๊ฒฐ๊ณผ๋Š”?

'' !== "์‹œยท๊ตฐยท๊ตฌ ์„ ํƒ" โ†’ true
'' !== "์ „์ฒด" โ†’ true
=> hasSigunguFilter = true

์ฆ‰,

์‹œ๊ตฐ๊ตฌ๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์•˜์Œ์—๋„

์‹œ๊ตฐ๊ตฌ ํ•„ํ„ฐ๊ฐ€ ์ผœ์ง„ ๊ฒƒ์œผ๋กœ ๋กœ์ง์ด ์˜คํ•ดํ–ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•„ํ„ฐ๋Š” ์ด๋ ‡๊ฒŒ ์ ์šฉ๋๋‹ค:

item.sigungu === filter.sigungu(๋นˆ ๋ฌธ์ž์—ด)

๋‹น์—ฐํžˆ '๋‚จ๊ตฌ' === '' ๊ฐ™์€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ๊ฒŒ์‹œ๊ธ€์€ ์—†๋‹ค.

๊ทธ๋ž˜์„œ ๋ถ€์‚ฐ๊ด‘์—ญ์‹œ๋งŒ ์„ ํƒํ•ด๋„ ์•„๋ฌด ๊ธ€๋„ ๋‚˜์˜ค์ง€ ์•Š์•˜๋˜ ๊ฒƒ.


โš’๏ธ 3. ํ•ด๊ฒฐ: ์‹œ๊ตฐ๊ตฌ ๊ฐ’์ด ๋นˆ ๋ฌธ์ž์—ด์ผ ๋•Œ๋Š” ํ•„ํ„ฐ OFF ์ฒ˜๋ฆฌ

๋‚˜๋Š” ์‹œ๊ตฐ๊ตฌ ํ•„ํ„ฐ ์กฐ๊ฑด์„ ์ด๋ ‡๊ฒŒ ์ˆ˜์ •ํ–ˆ๋‹ค.

const hasSigunguFilter =
  !!filter.sigungu &&
  filter.sigungu !== "์‹œยท๊ตฐยท๊ตฌ ์„ ํƒ" &&
  filter.sigungu !== "์ „์ฒด"

์ด์ œ filter.sigungu === ''์ด๋ฉด:

!!'' โ†’ false
=> hasSigunguFilter = false  // ํ•„ํ„ฐ ๊บผ์ง

์ฆ‰,

์‹œ/๋„ = ๋ถ€์‚ฐ๊ด‘์—ญ์‹œ๋งŒ ์„ ํƒํ•ด๋„

โ†’ ๋ถ€์‚ฐ๊ด‘์—ญ์‹œ ์ „์ฒด ๊ธ€์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ Œ๋”๋ง๋œ๋‹ค.


๐Ÿ’ก 4. ์ด๋ฒˆ ๋ฌธ์ œ์—์„œ ๋ฐฐ์šด ๊ฒƒ: ํ˜‘์—…์—์„œ๋Š” โ€œ๊ทœ์น™โ€์ด ์ฝ”๋“œ๋ณด๋‹ค ์ค‘์š”ํ•˜๋‹ค

์ด ๋ฌธ์ œ๋Š” ๊ธฐ์ˆ ์ ์œผ๋กœ ์–ด๋ ต์ง€ ์•Š์•˜๋‹ค.

ํ•˜๋ฒ„์‚ฌ์ธ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ๋„ ์•„๋‹ˆ๊ณ , ์ขŒํ‘œ ์—ฐ์‚ฐ๋„ ์•„๋‹ˆ์—ˆ๋‹ค.

๋ฌธ์ œ์˜ ๋ณธ์งˆ์€ ํŒ€ ๊ฐ„์˜ โ€œ๊ฐ’ ๊ทœ์น™(value contract)โ€์ด ๊ณต์œ ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ.

์˜ˆ๋ฅผ ๋“ค์–ด:

์˜๋ฏธFilter๊ฐ€ ๋„˜๊ธด ๊ฐ’FitList๊ฐ€ ๊ธฐ๋Œ€ํ•œ ๊ฐ’
์‹œ๊ตฐ๊ตฌ ์„ ํƒ ์•ˆ ํ•จ"""์‹œยท๊ตฐยท๊ตฌ ์„ ํƒ"
โ€œ์ „์ฒดโ€ ์„ ํƒ์—†์Œ(๋ฏธ๊ตฌํ˜„)"์ „์ฒด"

์„œ๋กœ๊ฐ€ ๋‹ค๋ฅธ ๊ทœ์น™์œผ๋กœ ๊ฐœ๋ฐœํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—,

๊ฒ‰์œผ๋กœ ๋ณด๊ธฐ์—” ๋ฉ€์ฉกํ•œ ๊ธฐ๋Šฅ์ด์ง€๋งŒ ๋‚ด๋ถ€์—์„œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ ๊ฒƒ์ด๋‹ค.


๐Ÿค 5. ๊ตํ›ˆ: ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ทœ์น™์„ ๋จผ์ € ์ •์˜ํ•˜์ž

์•ž์œผ๋กœ ํŒ€์—์„œ ๊ธฐ๋Šฅ์„ ๋‚˜๋ˆ  ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” ๋‹ค์Œ์„ ๊ผญ ๋จผ์ € ์ •๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

โœ”๏ธ 1) ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๊ฐ’์˜ ๊ทœ์น™(Value Contract)

  • ์„ ํƒ ์•ˆ ํ–ˆ์„ ๋•Œ ์–ด๋–ค ๊ฐ’? null, "", "์„ ํƒ"โ€ฆ
  • ๊ธฐ๋ณธ๊ฐ’์€ ๋ฌด์—‡?
  • โ€œ์ „์ฒดโ€์˜ ์˜๋ฏธ๋Š”?

โœ”๏ธ 2) ์ƒํƒœ ๋ณ€ํ™”์— ๋”ฐ๋ฅธ ๊ฐ’์˜ ํ๋ฆ„

  • ์‹œ/๋„ ๋ฐ”๋€Œ๋ฉด ์‹œ๊ตฐ๊ตฌ๋Š” ๋ฌด์—‡์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜๋Š”๊ฐ€?
  • ๊ฐ’์€ ๋ฌธ์ž์—ด์ธ๊ฐ€? null์ธ๊ฐ€?

โœ”๏ธ 3) ๋ช…์‹œ์ ์ธ ํƒ€์ž… ์ •์˜

type SigunguValue = '' | '์ „์ฒด' | '์‹œยท๊ตฐยท๊ตฌ ์„ ํƒ' | string

โœ”๏ธ 4) ๋ฌธ์„œํ™”

Notion์ด๋ผ๋“ ์ง€ confluence๋ผ๋“ ์ง€

๋ช‡ ๊ธ€์ž์ด๋ฉด ๋œ๋‹ค.

โ€œ์‹œ๊ตฐ๊ตฌ ๋ฏธ์„ ํƒ ์‹œ ''์„ ๋ณด๋‚ธ๋‹ค.โ€

์ด ํ•œ ๋ฌธ์žฅ๋งŒ ์žˆ์—ˆ์–ด๋„

์ด๋ฒˆ ์ดํ‹€์งœ๋ฆฌ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…์€ 5๋ถ„ ๋งŒ์— ํ•ด๊ฒฐ๋์„ ๊ฒƒ์ด๋‹ค.


๐Ÿงญ 6. ๋งˆ๋ฌด๋ฆฌ

์ด๋ฒˆ ๊ฒฝํ—˜์€ ์ž‘์€ ๋ฒ„๊ทธ์ฒ˜๋Ÿผ ๋ณด์˜€์ง€๋งŒ

๊ฐœ๋ฐœ ํ˜‘์—…์—์„œ ์ •๋ง ์ค‘์š”ํ•œ ๋ณธ์งˆ์„ ๊นจ๋‹ซ๊ฒŒ ํ•ด์คฌ๋‹ค.

โ€œ์ฝ”๋“œ๋ฅผ ์ž˜ ์งœ๋Š” ๊ฒƒ๋ณด๋‹ค,

๊ทœ์น™์„ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ค‘์š”ํ•˜๋‹ค.โ€

์•ž์œผ๋กœ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ

์ด ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ๋”์šฑ ๋‹จ๋‹จํ•œ ํ˜‘์—…์„ ๋งŒ๋“ค์–ด๊ฐˆ ๊ฒƒ์ด๋‹ค.

profile
์ฝ”๋ฆฐ์ด

0๊ฐœ์˜ ๋Œ“๊ธ€