[๐Ÿ’ป ์ฝ”๋“œ์Šคํ…Œ์ด์ธ  FE 44๊ธฐ]pre-project - 11์ผ์ฐจ

JiEunยท2023๋…„ 6์›” 23์ผ
0

โœ”๏ธ ์‹œ์ž‘

์งˆ๋ฌธ ํƒœ๊ทธ API๊ฐ€ ์ˆ˜์ •๋˜์–ด ๋ณ€๊ฒฝํ–ˆ๋‹ค.
์งˆ๋ฌธ ๋“ฑ๋ก/์ˆ˜์ •์‹œ ํƒœ๊ทธ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ์‹์ด ๋‹ฌ๋ผ ์ด๋ถ€๋ถ„์—์„œ ์• ๋ฅผ ๋จน์—ˆ๋‹ค.


๐Ÿ“ ์งˆ๋ฌธ ๋“ฑ๋ก/์ˆ˜์ • ํƒœ๊ทธ

์งˆ๋ฌธ ๋“ฑ๋ก

  • ํƒœ๊ทธ ์ด๋ฆ„๋งŒ ๊ฐ€์ ธ์˜จ๋‹ค. tagName : string

์งˆ๋ฌธ ์ˆ˜์ •

  • ์„ ํƒ๋œ ํƒœ๊ทธ๊ฐ€ ์ฒดํฌ๋˜์–ด ์žˆ์–ด์•ผํ•œ๋‹ค.
  • API ๋ช…์„ธ์„œ์—๋Š” select : boolean ์ด ์ถ”๊ฐ€ ๋˜์—ˆ๋‹ค.
    - ์งˆ๋ฌธ ๋“ฑ๋ก์€ ํƒœ๊ทธ ์ด๋ฆ„๋งŒ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ ์งˆ๋ฌธ ์ˆ˜์ •์€ ๋ชจ๋“  ํƒœ๊ทธ๋ฆฌ์ŠคํŠธ์—์„œ select๋กœ ์ฒดํฌ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•œ๋‹ค.

๊ณตํ†ต

  • ํƒœ๊ทธ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋ณด์—ฌ์ง„๋‹ค.
  • 3๊ฐœ๊นŒ์ง€ ์„ ํƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์งˆ๋ฌธ ๋“ฑ๋ก/์ˆ˜์ • ํƒœ๊ทธ ๋ฆฌ์ŠคํŠธ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ์‹์ด ๋‹ฌ๋ผ์„œ ๋‹ค๋ฅด๊ฒŒ ์ž‘์—…์„ ํ•ด์ค˜์•ผ ํ–ˆ์—ˆ๋‹ค.

์ˆ˜์ • ํŽ˜์ด์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ select : boolean ์—ฌ๋ถ€๋กœ ํŒ๋‹จํ•˜๊ธฐ์—” ์ˆ˜์›”ํ•˜๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋“ฑ๋ก/์ˆ˜์ • ๊ฐ™์ด ์‚ฌ์šฉ์ค‘์œผ๋กœ ์งˆ๋ฌธ ์ˆ˜์ • ํŽ˜์ด์ง€์—์„œ๋งŒ ํƒœ๊ทธ ์ปดํฌ๋„ŒํŠธ์—
memtags={tags}๋ฅผ ์ค˜ ๋ถ„๋ฅ˜ํ–ˆ๋‹ค.

memtags.map((el) => (
  <TagCheckBoxed key={el.tagName}>
    <TagCheck
      type="checkbox"
      id={el.tagName}
      value={el.tagName}
      checked={el.select}
      ></TagCheck>
    <TagLabel htmlFor={el.tagName}>
      <span>{el.tagName}</span>
    </TagLabel>
  </TagCheckBoxed>
))

memtags์˜ ํ•ญ๋ชฉ์„ ๋ณด์—ฌ์ฃผ๊ณ 
checked๋ฅผ select ์—ฌ๋ถ€๋กœ ์ž‘์„ฑํ•ด์ฃผ๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ์‹์ด์˜€๋‹ค.

3๊ฐœ ์ด์ƒ ์ฒดํฌ๊ฐ€ ๋˜๋ฉด ์•ˆ๋˜๊ฒŒ ํ•ด์•ผํ•˜๋Š”๋ฐ ๋‹ค์ค‘ ์ฒดํฌ ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.
disabled ์กฐ๊ฑด์ด ์งˆ๋ฌธ ๋“ฑ๋ก ์กฐ๊ฑด์œผ๋กœ ๋˜์–ด์žˆ์–ด ์กฐ๊ฑด ์ˆ˜์ •์ด ํ•„์š” ํ–ˆ๋‹ค.

const handlerTag = (name, selectType) => {    
      const newTag = { tagName: name, select: !selectType };
      const updatedTag = tags.map((el) => el.tagName === name ? newTag : el)
      dispatch(updateTags(updatedTag));
  };
  • ํƒœ๊ทธ ํด๋ฆญ ์‹œ tagName, select๊ฐ’์ด ์ธ์ž๋กœ ๋ฐ›์•„ ์˜ค๊ณ 
    !selectType์„ ์ค˜์„œ false๋ฉด true๋กœ, true๋ฉด false๋กœ ๋ณ€๊ฒฝํ•˜๋„๋ก ํ•ด์คฌ๋‹ค.
  • el.tagName === name ? newTag : el tags ๋ฆฌ์ŠคํŠธ์˜ tagName๊ณผ ์ธ์ž๋กœ ์ „๋‹ฌ๋˜๋Š” tagName์ด ๋™์ผํ•  ๊ฒฝ์šฐ newTag๋กœ, ์•„๋‹ˆ๋ฉด ๊ธฐ์กด ๊ฐ’์œผ๋กœ ๋‘๊ฐœ ์กฐ๊ฑด์„ ๊ฑธ์—ˆ๋‹ค.

๋‹ค์Œ์€ ํƒœ๊ทธ๋ฅผ 3๊ฐœ๊นŒ์ง€๋งŒ ์ฒดํฌ ๋˜๋„๋ก ์ˆ˜์ •ํ•ด์•ผํ•œ๋‹ค.

disabled={selectMemTags.length >= 3}

์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋‹ˆ ์ฒดํฌ๋Š” ์•ˆ ๋˜๋Š”๋ฐ ์ฒดํฌ๋œ input์—์„œ๋„ disabled๊ฐ€ ๊ฑธ๋ฆฌ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

const selectMemTags = memtags.filter((el) => el.select)
.
.
.
disabled={selectMemTags.length >= 3 && !el.select}
  • memtags์—์„œ select๊ฐ€ true์ธ ํƒœ๊ทธ๋งŒ ์ถ”์ถœํ•ด ๊ธธ์ด๋ฅผ ๊ตฌํ–ˆ๋‹ค.
  • !el.select ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•ด ์ด๋ฏธ ์„ ํƒ๋œ ์ฒดํฌ ๋ฐ•์Šค๊ฐ€ ์žˆ๊ณ  3๊ฐœ์ธ ๊ฒฝ์šฐ
    ์ฒดํฌ๋œ input์„ ๋‹ค์‹œ ํด๋ฆญ์‹œ select๊ฐ€ false๋กœ ๋ณ€๊ฒฝ ๋˜๋„๋ก ์ˆ˜์ •ํ–ˆ๋‹ค.

โ—๏ธ

const selectMemTags = memtags.filter((el) => el.select)

ํ•ด๋‹น ๋ณ€์ˆ˜๋Š” ์งˆ๋ฌธ ์ˆ˜์ • ํŽ˜์ด์ง€์—์„œ๋งŒ ์‚ฌ์šฉ๋˜์ง€๋งŒ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด
์งˆ๋ฌธ ๋“ฑ๋ก ํŽ˜์ด์ง€์—์„œ memtags๊ฐ€ ์—†๋‹ค๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ์—ˆ๋‹ค.

์ด๋ถ€๋ถ„์€ ์˜ต์…”๋„?๋ฅผ ์ด์šฉํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

const selectMemTags = memtags?.filter((el) => el.select)
const selectMemTags = memtags?.filter((el) => el.select)
.
.
.
memtags.map((el) => (
  <TagCheckBoxed key={el.tagName}>
    <TagCheck
      type="checkbox"
      id={el.tagName}
      value={el.tagName}
      checked={el.select}
      disabled={selectMemTags.length >= 3 && !el.select}
      onChange={() => handlerTag(el.tagName, el.select)}
    ></TagCheck>
    <TagLabel htmlFor={el.tagName}>
    	<span>{el.tagName}</span>
    </TagLabel>
  </TagCheckBoxed>
)

ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์งˆ๋ฌธ ๋“ฑ๋ก/์ˆ˜์ • ํŽ˜์ด์ง€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด
์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ํ•ด๊ฒฐํ–ˆ๋‹ค.

memtags
  ?
  memtags.map((el) => (
  //์งˆ๋ฌธ ์ˆ˜์ • ํŽ˜์ด์ง€
))
:
	tagList.map((el) => (
  //์งˆ๋ฌธ ์ž‘์„ฑ ํŽ˜์ด์ง€
))

โœ”๏ธ Keep

  • ์–ด๋– ํ•œ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”์ง€, ์งˆ๋ฌธ ๋“ฑ๋ก/์ˆ˜์ • ํŽ˜์ด์ง€์—์„œ ํƒœ๊ทธ ๋ฆฌ์ŠคํŠธ ๋ฐ›์•„์˜ค๋Š” ์ฐจ์ด๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋“ฑ
    ์—ฌ๋Ÿฌ ๊ณ ๋ฏผ์„ ํ–ˆ๊ณ  ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ์ˆ˜์ • ํŽ˜์ด์ง€์—์„œ ํƒœ๊ทธ ์ˆ˜์ • ํ›„ ๋ณ€๊ฒฝ์ด ๋˜๋Š”์ง€ ๊ณ ๋ฏผ์„ ๋งŽ์ดํ•ด๋ณด๊ณ 
    ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ๋‹ค.

โœ๏ธ Problem

  • ์งˆ๋ฌธ ๋“ฑ๋ก ํŽ˜์ด์ง€์—์„œ์˜ ํƒœ๊ทธ ๋ฆฌ์ŠคํŠธ API์™€ ์งˆ๋ฌธ ์ˆ˜์ • ํŽ˜์ด์ง€์—์„œ์˜ ํƒœ๊ทธ ๋ฆฌ์ŠคํŠธ API๊ฐ€ ๋‹ฌ๋ผ์„œ ๋กœ์ง ์ž‘์„ฑํ•˜๋Š”๋ฐ ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค.
  • ์ดˆ๋ฐ˜์— API ๋ช…์„ธ์„œ ๊ตฌ์กฐ ์š”์ฒญํ–ˆ์„ ๋•Œ ๊ตฌ์ฒด์ ์œผ๋กœ ์ „๋‹ฌ์„ ํ–ˆ์–ด์•ผํ–ˆ๋‚˜ ์‹ถ๋‹ค.

๐Ÿš€ Try

  • ์ž‘์—… ์ „ API์˜ ๊ตฌ์กฐ๋ฅผ ํŒŒ์•…ํ•˜๊ณ  ์–ด๋–ค๊ฒŒ ์ „๋‹ฌํ•ด์•ผํ•˜๋Š”์ง€ ๋“ฑ ๊ณ ๋ฏผํ•ด๋ณด๊ธฐ.

โœ๏ธ ๋งˆ์น˜๋ฉฐ

์งˆ๋ฌธ ๋“ฑ๋ก์€ ์ž˜ ๋์—ˆ๊ณ  ์งˆ๋ฌธ ์ˆ˜์ • ํŽ˜์ด์ง€๋Š” API ๋ฌธ์ œ๋กœ ๊ณ„์† ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.

์ด๋ฒˆ์— API๊ฐ€ ์ˆ˜์ • ๋˜๋ฉด์„œ ๋“œ๋””์–ด ์ง€๊ฒจ์šด ํƒœ๊ทธ ์˜์—ญ์„ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

profile
๐Ÿ’ป ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๋ชฉํ‘œ๋กœ ์„ฑ์žฅ ์ค‘! (์•Œ์•„๋ดค๋˜ ๋‚ด์šฉ ๋“ฑ์„ ์ •๋ฆฌํ•˜๊ธฐ)

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