4 min read

CH1 ๋ฆฌ์•กํŠธ ์•ˆํ‹ฐํŒจํ„ด ์ •๋ฆฌ

Table of Contents

์„œ๋ก  ๐Ÿ‘€

์•ˆํ‹ฐํŒจํ„ด(anti-pattern)์€ ๋ช…๋ฐฑํ•œ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹˜์—๋„ ์ฒ˜์Œ์—” ๋ฌธ์ œ์—†์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๊ธฐ๋Šฅ์ด ๋Š˜์ˆ˜๋ก, ์ด๋Ÿฌํ•œ ์ฝ”๋“œ ๊ตฌ์กฐ๋Š” ์ ์ฐจ ๋ณต์žก์„ฑยท์œ ์ง€๋ณด์ˆ˜์„ฑ์˜ ํ•จ์ •์„ ๋“œ๋Ÿฌ๋ƒ…๋‹ˆ๋‹ค.

๐Ÿ’ก โ€œ์ฝ”๋“œ์˜ โ€˜๊ธฐ๋Šฅโ€™์ด๋ž€ ์–ด๋–ค ๋‹จ์œ„๋ฅผ ๋งํ• ๊นŒ?
์šฐ๋ฆฌ๊ฐ€ ์ง„์งœ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋ฌธ์ œ๋Š” โ€˜๋ถˆ์™„์ „ํ•œ ์ฝ”๋“œโ€™ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ, ํ™•์žฅ ยท ๋ณ€๊ฒฝ ๊ณผ์ •์—์„œ ๋ฒŒ์–ด์ง€๋Š” ์ˆจ์€ ๋น„์šฉ์ž…๋‹ˆ๋‹ค.โ€

์ด ์ฑ…(ใ€ŽํŒจํ„ด์œผ๋กœ ์ตํžˆ๊ณ  ์„ค๊ณ„๋กœ ์™„์„ฑํ•˜๋Š” ๋ฆฌ์•กํŠธใ€)์€ ์•ž์œผ๋กœ ์˜ค๋ฅ˜๋กœ ์ด์–ด์ง€๊ธฐ ์‰ฌ์šด ์ž˜๋ชป๋œ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ณ ,
๊ฒ€์ฆ๋œ ํŒจํ„ด๊ณผ ์›์น™์œผ๋กœ ์ด๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ฐœ์„ ํ•˜๋Š” ๊ณผ์ •์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ด๋ฒˆ ์žฅ์—์„œ๋Š” ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ์™€ ๋น„๋™๊ธฐ ์ž‘์—…์ด ๊ฐ€๋…์„ฑ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ,
๊ทธ๋ฆฌ๊ณ  ๊ณ ๊ธ‰ ๋ฆฌ์•กํŠธ ์•ฑ์—์„œ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๊ตฐ์„ ํ•œ๋ˆˆ์— ์กฐ๋งํ•ฉ๋‹ˆ๋‹ค.

  • UI ๊ตฌ์ถ•์˜ ์–ด๋ ค์›€
  • ์ƒํƒœ ๊ด€๋ฆฌ์˜ ๋ณต์žก์„ฑ
  • ์˜ˆ์™ธ ํ๋ฆ„
  • ๋Œ€ํ‘œ์ ์ธ ๋ฆฌ์•กํŠธ ์•ˆํ‹ฐํŒจํ„ด

1.1 UI ๊ตฌ์ถ•์˜ ์–ด๋ ค์›€

HTML ๋งŒ์œผ๋กœ๋Š” ํ˜„๋Œ€์ ยท๋™์ ์ธ ์›น UI๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

  • ์›น ์–ธ์–ด์˜ ํ•œ๊ณ„
    ๋‹จ์ˆœ ๋ฌธ์„œ๊ฐ€ ์•„๋‹Œ ํ‹ฐ์ผ“ ์˜ˆ๋งค, ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ ๋„๊ตฌ, ์ด๋ฏธ์ง€ ๊ฐค๋Ÿฌ๋ฆฌ ๋“ฑ ๋ณต์žกํ•œ UI๋Š”
    HTML ยท CSS๋กœ๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์ปค์Šคํ…€ ์š”์†Œ ํ•„์š”
    ์•„์ฝ”๋””์–ธ, ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ, ๋“œ๋กญ๋‹ค์šด ๋“ฑ์€ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ณธ ์š”์†Œ๊ฐ€ ์•„๋‹ˆ๊ธฐ์—
    ๊ฐœ๋ฐœ์ž๊ฐ€ ์ถ”๊ฐ€ ๋งˆํฌ์—…ยท์Šคํƒ€์ผยท๋กœ์ง์„ ๊พธ์ค€ํžˆ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์‹œ๊ฐ์  ํˆด ๋ถ€์žฌ
    Figma์ฒ˜๋Ÿผ ๋“œ๋ž˜๊ทธ-์•ค-๋“œ๋กญ์œผ๋กœ UI๋ฅผ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ,
    ์ƒ‰์ƒยทํŒจ๋”ฉยทํฐํŠธ๋ฅผ ๋ฏธ์„ธ ์กฐ์ •ํ•˜๊ณ , ์•„์ด์ฝ˜ยท๋ ˆ์ด๋ธ”์„ ์ง์ ‘ ์กฐ๋ฆฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ UI ๊ฐœ๋ฐœ ์–ธ์–ด์˜ ๋ถˆ์ผ์น˜๋Š” โ€˜์•ˆํ‹ฐํŒจํ„ดโ€™ ๊ทธ ์ž์ฒด๋ผ๊ธฐ๋ณด๋‹ค,
ํŒจํ„ด / ์ปดํฌ๋„ŒํŠธ ์ถ”์ƒํ™”๊ฐ€ ์™œ ํ•„์š”ํ•œ์ง€ ๋ณด์—ฌ์ฃผ๋Š” ๊ทผ๋ณธ ๋ฐฐ๊ฒฝ์ž…๋‹ˆ๋‹ค.


1.2 ์ƒํƒœ ๊ด€๋ฆฌ์˜ ์ดํ•ด

ํ”„๋ก ํŠธ์—”๋“œ ์ƒํƒœ๋Š” ์›๊ฒฉ(์„œ๋ฒ„) ยท ๋กœ์ปฌ ยท ํŒŒ์ƒ ์ƒํƒœ๊ฐ€ ๋’ค์„ž์ด๋ฉฐ ๋น ๋ฅด๊ฒŒ ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค.

์›๊ฒฉ ์ƒํƒœ์˜ ๋ณต์žก์„ฑ

  • ๋น„๋™๊ธฐ: ์—ฌ๋Ÿฌ API๋ฅผ ๋™๊ธฐํ™”ํ•  ๋•Œ ํƒ€์ด๋ฐ ์ด์Šˆ ๋ฐœ์ƒ
  • ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ: ๋„คํŠธ์›Œํฌ ์‹คํŒจยท์„œ๋ฒ„ ์˜ค๋ฅ˜๊นŒ์ง€ ๊ณ ๋ คํ•ด์•ผ ํ•จ
  • ๋กœ๋”ฉ: ๋ฐ์ดํ„ฐ ๋„์ฐฉ ์ „ UI ํ”Œ๋ ˆ์ด์Šคํ™€๋” ํ•„์š”
  • ์ผ๊ด€์„ฑ: ๋‹ค์ค‘ ์‚ฌ์šฉ์žยท์‹ค์‹œ๊ฐ„ ์•ฑ์ผ์ˆ˜๋ก ์„œ๋ฒ„์™€ ๋™๊ธฐ ์œ ์ง€๊ฐ€ ์–ด๋ ค์›€
  • ์บ์‹ฑ: ์„ฑ๋Šฅ โ†” ๋ฐ์ดํ„ฐ ๋ฌดํšจํ™” ์ „๋žต ๊ฐ„ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„
  • ๋‚™๊ด€์  UI: ์‹คํŒจ ์‹œ ๋กค๋ฐฑ ๋กœ์ง ํ•„์ˆ˜

๊ฒฐ๊ณผ์ ์œผ๋กœ ์ •์  ๋ฐ์ดํ„ฐ ๋ Œ๋”๋ง๋ณด๋‹ค ํ›จ์”ฌ ๋งŽ์€ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ,
๋กœ์ปฌ ์ƒํƒœ๊นŒ์ง€ ๋”ํ•ด์ง€๋ฉด ์ฝ”๋“œ๋ฒ ์ด์Šค๋Š” ๊ธ‰๊ฒฉํžˆ ๋ฐฉ๋Œ€ํ•ด์ง‘๋‹ˆ๋‹ค.


1.3 ์˜ˆ์™ธ ํ๋ฆ„ ํƒ์ƒ‰ํ•˜๊ธฐ

1.3.1 ํƒ€์‚ฌ / ํƒ€ํŒ€ ์ปดํฌ๋„ŒํŠธ ์˜ค๋ฅ˜

  • ์™ธ๋ถ€ ์ปดํฌ๋„ŒํŠธ ์˜ค๋ฅ˜ โ†’ UI ์ค‘๋‹จยท์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘
  • ํ•ด๊ฒฐ: ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง, Error Boundary, ํด๋ฐฑ UI ๋“ฑ์„ ์ถ”๊ฐ€

1.3.2 ์˜ˆ์ธก ๋ถˆ๊ฐ€ํ•œ ์‚ฌ์šฉ์ž ํ–‰๋™

  • Edge case๋ฅผ ๋Œ€๋น„ํ•œ ์ž…๋ ฅ ๊ฒ€์ฆยท๊ฐ€๋“œ ๋กœ์ง ํ•„์ˆ˜
  • ๊ทธ๋งŒํผ ์ฝ”๋“œ ๋ณต์žก์„ฑ ์ƒ์Šน

๋Œ€๊ทœ๋ชจ React ์•ฑ์€ ๊ณต์‹ ๊ฐ€์ด๋“œ๋งŒ์œผ๋ก  ์ถฉ๋ถ„์น˜ ์•Š์Šต๋‹ˆ๋‹ค.
๋ช…ํ™•ํ•œ ์„ค๊ณ„ ์›์น™์ด ์—†์œผ๋ฉด ์•ˆํ‹ฐํŒจํ„ด์ด ๋ˆ„์ ๋˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.


1.4 ๋ฆฌ์•กํŠธ์˜ ์ผ๋ฐ˜์ ์ธ ์•ˆํ‹ฐํŒจํ„ด

์•ˆํ‹ฐํŒจํ„ด์€ ๊ฒ‰์œผ๋กœ๋Š” โ€œ๋™์ž‘ํ•˜๋Š” ์†”๋ฃจ์…˜โ€์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ,
์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ๋ณต์žก์„ฑยท๋น„ํšจ์œจ์„ ํ‚ค์šฐ๋Š” ์ˆจ์€ ๋ถ€์ฑ„์ž…๋‹ˆ๋‹ค.

1.4.1 Prop Drilling

  • ๋ฐ์ดํ„ฐ๊ฐ€ ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ณ„์† ํ†ต๊ณผ โ†’ ๊ฐ€๋…์„ฑยท๋””๋ฒ„๊น… ์•…ํ™”
  • Context API๋‚˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ํ•ด๊ฒฐ

1.4.2 ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜

  • API ์‘๋‹ต์„ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ์ง์ ‘ ๊ฐ€๊ณต
  • ๐Ÿ‘‰ ์žฌ์‚ฌ์šฉ์„ฑยทํ…Œ์ŠคํŠธ์„ฑ ํ•˜๋ฝ โ†’ ์œ ํ‹ธ ํ•จ์ˆ˜ยทAdapter ํŒจํ„ด์œผ๋กœ ๋ถ„๋ฆฌ

1.4.3 ๋ทฐ ์˜์—ญ์˜ ๋ณต์žกํ•œ ๋กœ์ง

  • ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊นŒ์ง€ ๋‹ด๋‹น
  • ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ๋ฅผ ๊นจ๋œจ๋ ค ํ…Œ์ŠคํŠธยท์žฌ์‚ฌ์šฉยท์œ ์ง€๋ณด์ˆ˜ ๋‚œ์ด๋„ ์ƒ์Šน
  • ๐Ÿ‘‰ ๊ณ„์ธตํ™” ์•„ํ‚คํ…์ฒ˜, Custom Hook/HOC๋กœ ์—ญํ•  ๋ถ„๋ฆฌ

1.4.4 ํ…Œ์ŠคํŠธ ๋ถ€์กฑ

  • ํ•ต์‹ฌ ๊ธฐ๋Šฅ(์˜ˆ: ์‡ผํ•‘ ์นดํŠธ)์กฐ์ฐจ ํ…Œ์ŠคํŠธ ๋ฏธ๋น„ ์‹œ
    ๊ฐ€๊ฒฉ ์˜ค๋ฅ˜ยท๋ณด์•ˆ ์ทจ์•ฝ์ ยทUI ๊นจ์ง ์œ„ํ—˜
  • TDD / ํ…Œ์ŠคํŠธ ์ž๋™ํ™”๋กœ ์‹ ๋ขฐ ํ™•๋ณด

1.4.5 ์ค‘๋ณต ์ฝ”๋“œ

  • ๋™์ผ ๋กœ์ง์ด ๊ณณ๊ณณ์— ๋ณต์‚ฌ โ†’ DRY ์›์น™ ์œ„๋ฐ˜
  • ๐Ÿ‘‰ ๊ณตํ†ต ๋กœ์ง์„ ์œ ํ‹ธ ํ•จ์ˆ˜ยทHOCยท์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ค‘์•™ํ™”

1.4.6 ๊ฑฐ๋Œ€ ์ปดํฌ๋„ŒํŠธ

  • ๊ธฐ๋Šฅ์ด ๊ณ„์† ์ถ”๊ฐ€๋˜์–ด ๋ฉ€ํ‹ฐ-๋ ˆ๋ฒจ ์ฑ…์ž„์„ ์ง€๊ฒŒ ๋จ
  • SRP(๋‹จ์ผ ์ฑ…์ž„ ์›์น™) ์œ„๋ฐฐ โ†’ ๋ถ„ํ• ยท๋ฆฌํŒฉํ„ฐ๋ง ํ•„์š”

1.4.7 ์•ˆํ‹ฐํŒจํ„ด ์ œ๊ฑฐ ์ „๋žต

  • ์‹๋ณ„(Identify) โ†’ ์ถ”์ถœ(Extract) โ†’ ์น˜ํ™˜(Replace)
    1. ์ฝ”๋“œ ๋ƒ„์ƒˆ๋ฅผ ์ฐพ๊ณ 
    2. ํŒจํ„ดยท๋ชจ๋“ˆยท์ถ”์ƒํ™”๋กœ ๋ถ„๋ฆฌํ•˜๋ฉฐ
    3. ํ…Œ์ŠคํŠธ๋กœ ํšŒ๊ท€ ๋ฒ„๊ทธ๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค.

๋งˆ๋ฌด๋ฆฌ

React ์•ฑ์€ ํ’๋ถ€ํ•œ UI ๊ฒฝํ—˜๊ณผ ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋™์‹œ์— ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ํŒจํ„ด์— ๊ธฐ๋ฐ˜ํ•œ ์„ค๊ณ„ ์—†์ด๋Š” ์•ˆํ‹ฐํŒจํ„ด์ด ํ•„์—ฐ์ ์œผ๋กœ ์Šค๋ฉฐ๋“ญ๋‹ˆ๋‹ค.
์ด๋ฒˆ ์žฅ์„ ํ†ตํ•ด โ€œ์–ด๋””์„œ๋ถ€ํ„ฐ ์„ค๊ณ„๊ฐ€ ์–ด๊ธ‹๋‚˜๊ธฐ ์‹œ์ž‘ํ•˜๋Š”์ง€โ€๋ฅผ ํŒŒ์•…ํ•˜๊ณ ,
๋‹ค์Œ ์žฅ๋ถ€ํ„ฐ๋Š” ๊ตฌ์ฒด์  ๋ฆฌํŒฉํ„ฐ๋ง ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.