๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Frontend Dev/React

React์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„ - React๋กœ UI๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋‹จ๊ณ„

๋ฐ˜์‘ํ˜•

๐Ÿ‘พ React๋กœ UI๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋‹จ๊ณ„

 ๐Ÿ’ฌ ์ด๋ฒˆ ๊ธ€์€ React ๊ณต์‹๋ฌธ์„œ์˜ ๊ธ€์„ ๊ณต๋ถ€ํ•˜๋ฉฐ ๋‚˜๋ฆ„๋Œ€๋กœ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ React ๊ณต์‹๋ฌธ์„œ ์ฐธ๊ณ ํ•˜๋ฉฐ ํ•™์Šตํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๐Ÿ™‚

 

React๋กœ ์‚ฌ๊ณ ํ•˜๊ธฐ – React

The library for web and native user interfaces

ko.react.dev

 

 

 1. UI๋ฅผ ์ปดํฌ๋„ŒํŠธ ๊ณ„์ธต์œผ๋กœ ์ชผ๊ฐœ๊ธฐ

๐Ÿ“Œ ์ปดํฌ๋„ŒํŠธ๋กœ ์ƒ๊ฐํ•˜๊ธฐ

์ถœ์ฒ˜: ๋ฆฌ์•กํŠธ ๊ณต์‹๋ฌธ์„œ

 → ๋‹จ์ผ์ฑ…์ž„ ์›์น™์„ ๋ฐ˜์˜ํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ์ปดํฌ๋„ŒํŠธ๋Š” ์ด์ƒ์ ์œผ๋กœ๋Š” ํ•œ ๊ฐ€์ง€ ์ผ๋งŒ ํ•ด์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ ์  ์ปค์ง„๋‹ค๋ฉด ์ž‘์€ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ์ชผ๊ฐ ๋‹ค.

 

 

 2. React๋กœ ์ •์ ์ธ UI ๊ตฌํ˜„ํ•˜๊ธฐ

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

 • ๋ฐ์ดํ„ฐ ๋ชจ๋ธ(์ œํ’ˆ์˜ ์›๋ณธ ๋ชฉ๋ก)์„ ๋ Œ๋”๋งํ•˜๋Š” ์•ฑ์˜ ์ •์  ๋ฒ„์ „์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ณ , props๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. (์ •์ ์ธ ๋ฒ„์ „์„ ๋งŒ๋“ค ๋•Œ state ์‚ฌ์šฉ์€ X)

 

 โœ”๏ธ ์•ฑ์„ ๋งŒ๋“ค ๋•Œ ๊ณ„์ธต ๊ตฌ์กฐ์— ๋”ฐ๋ผ ์ƒ์ธต๋ถ€์— ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋ถ€ํ„ฐ ํ•˜ํ–ฅ์‹(top-down)์œผ๋กœ ๋งŒ๋“ค๊ฑฐ๋‚˜, ํ•˜์ธต๋ถ€์— ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ ๋ถ€ํ„ฐ ์ƒํ–ฅ์‹(bottom-up)์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ์—์„œ๋Š” ๋ณดํ†ต ํ•˜ํ–ฅ์‹์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒŒ ์‰ฝ์ง€๋งŒ, ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง€๋ฉด ์ƒํ–ฅ์‹์œผ๋กœ ๋งŒ๋“ค๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ๊ฐœ๋ฐœํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ๋‹ค.

 

 → ๊ณ„์ธต๊ตฌ์กฐ์˜ ์ตœ์ƒ๋‹จ ์ปดํฌ๋„ŒํŠธ๋Š” props๋กœ ์ œํ’ˆ์˜ ์›๋ณธ ๋ชฉ๋ก์„ ๋ฐ›๋Š”๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ์ตœ์ƒ๋‹จ ์ปดํฌ๋„ŒํŠธ๋ถ€ํ„ฐ ํŠธ๋ฆฌ์˜ ๋งจ ์•„๋ž˜ ๊นŒ์ง€ ํ˜๋Ÿฌ๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„(one-way data flow)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

 

 3. ์ตœ์†Œํ•œ์˜ ๋ฐ์ดํ„ฐ๋งŒ ์ด์šฉํ•ด์„œ ์™„๋ฒฝํ•˜๊ฒŒ UI State ํ‘œํ˜„ํ•ด๋‚ด๊ธฐ

 • UI๋ฅผ ์ƒํ˜ธ์ž‘์šฉ(interactive)ํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๋ฉด ์œ ์ €๊ฐ€ ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค. React๋Š” state๋ฅผ ํ†ตํ•ด ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

 • ๋ณ€ํ•˜๋Š” ๊ฐ’๊ณผ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ’์„ ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค. ๋ณ€ํ•˜๋Š” ๊ฐ’์„ ์ƒํƒœ(state)๋กœ ๋‘”๋‹ค. ์ƒํƒœ๋Š” ์ตœ์†Œํ™”ํ™”๋Š” ๊ฒƒ์ด ์ข‹์œผ๋ฉฐ, ์ƒํƒœ๊ฐ€ ๋งŽ์„์ˆ˜๋ก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ณต์žกํ•ด์ง„๋‹ค.

 • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ•„์š”๋กœ ํ•˜๋Š” ๊ฐ€์žฅ ์ตœ์†Œํ•œ์˜ state๋ฅผ ์ฐพ๊ณ  ์ด๋ฅผ ํ†ตํ•ด ๋‚˜๋จธ์ง€ ๋ชจ๋“  ๊ฒƒ๋“ค์ด ํ•„์š”์— ๋”ฐ๋ผ ๊ทธ๋•Œ๊ทธ๋•Œ ๊ณ„์‚ฐ๋˜๋„๋ก ๋งŒ๋“ ๋‹ค. → ์•ฑ์„ ๋™์ž‘ํ•˜๋Š” ์ตœ์†Œํ•œ์˜ state๋“ค๋งŒ ์ด์šฉํ•˜๋Š” ์ค‘๋ณต๋ฐฐ์ œ์›์น™(Don’t repeat Yourself)

 

 ์˜ˆ์‹œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 1. ์ œํ’ˆ์˜ ์›๋ณธ ๋ชฉ๋ก → props๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— state๊ฐ€ ์•„๋‹˜

 2. ์œ ์ €๊ฐ€ ์ž…๋ ฅํ•œ ๊ฒ€์ƒ‰์–ด → ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋ฐ”๋€Œ๊ณ , ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ ๊ณ„์‚ฐ์ด ๋ถˆ๊ฐ€ํ•˜๋ฏ€๋กœ state

 3. ์ฒดํฌ๋ฐ•์Šค์˜ ๊ฐ’ → ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋ฐ”๋€Œ๊ณ , ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ ๊ณ„์‚ฐ์ด ๋ถˆ๊ฐ€ํ•˜๋ฏ€๋กœ state

 4. ํ•„ํ„ฐ๋ง ๋œ ์ œํ’ˆ๋“ค์˜ ๋ชฉ๋ก → ์ œํ’ˆ์˜ ์›๋ณธ ๋ชฉ๋ก๊ณผ ๊ฒ€์ƒ‰์–ด, ์ฒดํฌ๋ฐ•์Šค์˜ ๊ฐ’์„ ์กฐํ•ฉํ•ด์„œ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— state๊ฐ€ ์•„๋‹˜

 

 

 4. State๊ฐ€ ์–ด๋””์— ์žˆ์–ด์•ผ ํ• ์ง€ ์ •ํ•˜๊ธฐ

 1. ํ•ด๋‹น state๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ Œ๋”๋งํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ ์ฐพ๊ธฐ

 2. ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณตํ†ต ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ ์ฐพ๊ธฐ

   → ๋งŒ์•ฝ state๊ฐ€ ํŠน์ • ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ์œ ์˜๋ฏธํ•˜๋‹ค๋ฉด, ํŠน์ • ์ปดํฌ๋„ŒํŠธ์— ๋‘๋ฉด ๋œ๋‹ค.

   → state๋Š” ์—ฌ๊ธฐ ์œ„์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

   → ํ˜น์€ ๊ณตํ†ต ๋ถ€๋ชจ ์ƒ์œ„์˜ ์ปดํฌ๋„ŒํŠธ์— ๋‘๊ฑฐ๋‚˜, ์ ์ ˆํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜์˜€๋‹ค๋ฉด state๋ฅผ ์†Œ์œ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ์ƒ์œ„ ๊ณ„์ธต์— ์ถ”๊ฐ€ํ•œ๋‹ค.

 

 

 5. ์—ญ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์ถ”๊ฐ€ํ•˜๊ธฐ

 React๋Š” ์ „ํ†ต์ ์ธ ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ(two-way data binding)๊ณผ ๋น„๊ตํ•˜๋ฉด ๋” ๋งŽ์€ ํƒ€์ดํ•‘์„ ํ•ด์•ผ ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋ช…์‹œ์ ์œผ๋กœ ๋ณด์ด๊ฒŒ ๋งŒ๋“ค์–ด์„œ ํ”„๋กœ๊ทธ๋žจ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค€๋‹ค.

 

 ์˜ˆ์‹œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 • state๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ → FilterableProductTable

 • ์‚ฌ์šฉ์ž๊ฐ€ input์„ ๋ณ€๊ฒฝํ•  ๋•Œ๋งˆ๋‹ค state๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์•ผํ•˜๋Š ์ปดํฌ๋„ŒํŠธ → SearchBar

 

 SearchBar์— FilterableProductTable ๋Œ€์‹  state๋ฅผ ์—…๋ฐ์ดํŠธ์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ณ€๊ฒฝ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ SearchBar๋กœ ์ „๋‹ฌํ•ด state๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์–ด์•ผ ํ•  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋˜๋„๋ก ํ•˜๋ฉด ๋œ๋‹ค.

function FilterableProductTable({ products }) {
  const [filterText, setFilterText] = useState('');
  const [inStockOnly, setInStockOnly] = useState(false);

  return (
    <div>
      <SearchBar 
        filterText={filterText} 
        inStockOnly={inStockOnly} 
        onFilterTextChange={setFilterText} 
        onInStockOnlyChange={setInStockOnly} 
      />
    ...
<input 
  type="text" 
  value={filterText} 
  placeholder="Search..." 
  onChange={(e) => onFilterTextChange(e.target.value)} 
 />

 


โœ๏ธ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ์ •๋ณด๋‚˜ ๋” ๊ณต์œ ํ•  ๋‚ด์šฉ์ด ์žˆ์œผ๋ฉด ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์„ธ์š”!

์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜Š

๋ฐ˜์‘ํ˜•