์˜ค๋Š˜์€ ์ œ๊ฐ€ Context API์—์„œ Zustand๋กœ ์ƒํƒœ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ์ „ํ™˜ํ•˜๊ฒŒ ๋œ ๊ณผ์ •๊ณผ 2024๋…„ ํ˜„์žฌ ๋ฆฌ์•กํŠธ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์˜ ํ˜„ํ™ฉ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค.

 

1. Context API์˜ ํ•œ๊ณ„์™€ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•„์š”์„ฑ

Context API๋กœ ์‹œ์ž‘ํ•œ ์ด์œ 

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

// ์ดˆ๊ธฐ Context API ์‚ฌ์šฉ ์˜ˆ์‹œ
const PetContext = React.createContext<PetContextType | undefined>(undefined);

export const PetProvider: React.FC<PropsWithChildren> = ({ children }) => {
  const [petData, setPetData] = useState<PetData>({
    allergies: [],
    symptoms: [],
    foodLog: []
  });

  return (
    <PetContext.Provider value={{ petData, setPetData }}>
      {children}
    </PetContext.Provider>
  );
};

 

ํ•œ๊ณ„์  ๋ฐœ๊ฒฌ

ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง€๋ฉด์„œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ•œ๊ณ„์ ์ด ๋“œ๋Ÿฌ๋‚˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค:

 

  • ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง: Context์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น Context๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 
  • ์ฝ”๋“œ ๋ณต์žก๋„ ์ฆ๊ฐ€: ์—ฌ๋Ÿฌ ๊ฐœ์˜ Context๋ฅผ ์ค‘์ฒฉํ•ด์„œ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋‹ˆ Provider Hell์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋กœ์ง ๊ด€๋ฆฌ์˜ ์–ด๋ ค์›€: ๋น„๋™๊ธฐ ์ž‘์—…๊ณผ ๋ณต์žกํ•œ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ํ•œ๊ณ„๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

2. ์ฃผ์š” ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋น„๊ต ๋ถ„์„

Redux

Redux๋Š” ์˜ค๋žซ๋™์•ˆ ๋ฆฌ์•กํŠธ ์ƒํƒœ๊ณ„์˜ ํ‘œ์ค€๊ณผ ๊ฐ™์€ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž…๋‹ˆ๋‹ค.

Redux์˜ ํ•ต์‹ฌ ๊ฐœ๋…

 

  • Action: ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์œ„ํ•œ ์ด๋ฒคํŠธ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๊ฐ์ฒด
  • Reducer: Action์„ ๋ฐ›์•„ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜
  • Store: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „์ฒด ์ƒํƒœ๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ๊ฐ์ฒด

Redux ๋ฏธ๋“ค์›จ์–ด ์ƒํƒœ๊ณ„

 

  • Redux Thunk: ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ฏธ๋“ค์›จ์–ด
  • Redux Saga: ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ํ๋ฆ„์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ๋ฏธ๋“ค์›จ์–ด
    • Generator ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ์„ ์–ธ์  ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ
    • ๋ณต์žกํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค(API ์š”์ฒญ ์ทจ์†Œ, ์žฌ์‹œ๋„ ๋“ฑ) ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
  • Redux Toolkit: ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•œ ๊ณต์‹ ๋„๊ตฌ

๊ทธ๋Ÿฌ๋‚˜ Redux๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค:

 

  • ๋งŽ์€ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ
  • ํ•™์Šต ๊ณก์„ ์ด ๊ฐ€ํŒŒ๋ฆ„
  • ์ž‘์€ ์ƒํƒœ ๋ณ€ํ™”์—๋„ ๋งŽ์€ ์ฝ”๋“œ ํ•„์š”

Recoil

Facebook์—์„œ ๋งŒ๋“  ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

 

์žฅ์ 

  • React์™€์˜ ๋†’์€ ํ˜ธํ™˜์„ฑ
  • ๊ฐ„๋‹จํ•œ API (atom, selector)
  • ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ์‰ฌ์›€

๋‹จ์ 

  • ์•„ํ†ฐ์œผ๋กœ ๊ด€๋ฆฌ๋˜๋Š” ์ „์—ญ ์ƒํƒœ๋ฅผ ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๋ผ๋„ ๋ฐ”๋กœ ์•„ํ†ฐ์„ ๊ตฌ๋…ํ•ด์„œ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›๊ธฐ์—, ์˜์กด์„ฑ์ด ์—ฌ๋Ÿฌ ๋ฐฉํ–ฅ์œผ๋กœ ์—ฎ์ด๋ฉด์„œ ์˜ˆ์ธกํ•˜๊ธฐ ํž˜๋“ค์–ด์ง‘๋‹ˆ๋‹ค.

Zustand

๊ฐ€๋ณ๊ณ  ์ง๊ด€์ ์ธ API๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ˜„๋Œ€์ ์ธ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

 

์ฃผ์š” ํŠน์ง•

  • ์ตœ์†Œํ•œ์˜ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ
  • TypeScript ์ง€์›์ด ํ›Œ๋ฅญํ•จ
  • Redux DevTools ์ง€์›
  • ๋ฏธ๋“ค์›จ์–ด ์‹œ์Šคํ…œ (persist, devtools ๋“ฑ)

์˜ˆ์‹œ ์ฝ”๋“œ:

import create from 'zustand'

interface PetStore {
  symptoms: Symptom[]
  addSymptom: (symptom: Symptom) => void
  foodLogs: FoodLog[]
  addFoodLog: (log: FoodLog) => void
}

const usePetStore = create<PetStore>((set) => ({
  symptoms: [],
  addSymptom: (symptom) => set((state) => ({
    symptoms: [...state.symptoms, symptom]
  })),
  foodLogs: [],
  addFoodLog: (log) => set((state) => ({
    foodLogs: [...state.foodLogs, log]
  }))
}))

 

3. ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ์˜ ์„ ํƒ: Zustand

์•Œ๋ฆฌ๋‹ˆ ํ”„๋กœ์ ํŠธ์—์„œ์˜ ์š”๊ตฌ์‚ฌํ•ญ

  1. ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ
  2. ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ (์•Œ๋ ˆ๋ฅด๊ธฐ ์ฆ์ƒ, ์Œ์‹ ๊ธฐ๋ก, ๋ถ„์„ ๋ฐ์ดํ„ฐ)
  3. ์„ฑ๋Šฅ ์ตœ์ ํ™”
  4. TypeScript ์ง€์›

Zustand ์„ ํƒ ์ด์œ 

  1. ๊ฐ„๋‹จํ•œ ์„ค์ •๊ณผ ์‚ฌ์šฉ๋ฒ•: ๋ณ„๋„์˜ Provider ์„ค์ •์ด ํ•„์š” ์—†๊ณ , ์ง๊ด€์ ์ธ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  2. ์„ฑ๋Šฅ ์ตœ์ ํ™”: ํ•„์š”ํ•œ ์ƒํƒœ๋งŒ ๊ตฌ๋…ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  3. TypeScript ์ง€์›: ํƒ€์ž… ์ถ”๋ก ์ด ์ž˜ ๋™์ž‘ํ•˜์—ฌ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  4. ๋ฏธ๋“ค์›จ์–ด ์ง€์›: persist ๋ฏธ๋“ค์›จ์–ด๋ฅผ ํ†ตํ•ด ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ ์—ฐ๋™์ด ์‰ฌ์› ์Šต๋‹ˆ๋‹ค.

Context API์™€์˜ ์กฐํ™”

Context API์™€ Zustand๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—ญํ• ์„ ๊ตฌ๋ถ„ํ–ˆ์Šต๋‹ˆ๋‹ค:

  • Context API: ํ…Œ๋งˆ, ์ธ์ฆ ๋“ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „๋ฐ˜์ ์ธ ์„ค์ •๊ณผ ๊ด€๋ จ๋œ ์ƒํƒœ ๊ด€๋ฆฌ (๋‹จ์–ด ๊ทธ๋Œ€๋กœ ํŠน์ • ๋งฅ๋ฝ์„ ์”Œ์šธ๋•Œ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.)
  • Zustand: ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๊ด€๋ จ๋œ ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ

 

4. ๊ฒฐ๋ก 

2024๋…„ ํ˜„์žฌ, ์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ์ค€์œผ๋กœ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค:

  1. ์ž‘์€ ํ”„๋กœ์ ํŠธ: Context API๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„
  2. ์ค‘๊ฐ„ ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ: Zustand
  3. ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ: Redux Toolkit ๋˜๋Š” Zustand

์•Œ๋ฆฌ๋‹ˆ์™€ ๊ฐ™์ด ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์™€ ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ํ”„๋กœ์ ํŠธ์—๋Š” Zustand๊ฐ€ ํŠนํžˆ ์ ํ•ฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•˜๋ฉด์„œ๋„ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, ํŠนํžˆ TypeScript์™€์˜ ํ˜ธํ™˜์„ฑ์ด ๋›ฐ์–ด๋‚˜ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์ด ๋งค์šฐ ์ข‹์•˜์Šต๋‹ˆ๋‹ค.

 

 

 

 

๋ฌดํ•œ ์Šคํฌ๋กค๊ณผ ๋ฒ„์ธ„์–ผ ์Šคํฌ๋กค์„ ๋„์ž… ์ค‘์ธ ํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค!

 

ํ”„๋กœ์ ํŠธ์— ๋„์ž…๋  ๋ฌดํ•œ ์Šคํฌ๋กค์„ ๊ฐœ๋ฐœ ์ค‘์ธ ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๋˜ ์ค‘ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌด์ˆ˜ํžˆ ๋งŽ์•„์งˆ ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง„ ์•Š์„๊นŒ๋ผ๋Š” ์ƒ๊ฐ์— ๋ฌดํ•œ ์Šคํฌ๋กค์— ๋Œ€ํ•œ ์ตœ์ ํ™”๋ฅผ ๊ณ ๋ฏผํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!
์—ฌ๋Ÿฌ ์ตœ์ ํ™” ์ค‘ ํ•˜๋‚˜๋Š” ๋ฒ„์ธ„์–ผ ์Šคํฌ๋กค์— ๋Œ€ํ•ด ํŒŒํŠธ๋ฅผ ๋‚˜๋ˆ  ๊ธฐ๋กํ•ด๋‘๋ ค ํ•ด์š”!

 

๋ฒ„์ธ„์–ผ ์Šคํฌ๋กค ์ด๋ž€?

๋ฒ„์ธ„์–ผ ์Šคํฌ๋กค(Virtual Scroll)์€ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ˆ ๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ๋ณด๊ณ  ์žˆ๋Š” ํ•ญ๋ชฉ๋งŒ ๋ Œ๋”๋งํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.

 

ํŠนํžˆ, ๋ฆฌ์ŠคํŠธ๋‚˜ ๊ทธ๋ฆฌ๋“œ ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฒˆ ๋ธ”๋กœ๊ทธ์—์„œ๋Š” ๋ฒ„์ธ„์–ผ ์Šคํฌ๋กค์„ ์‚ฌ์šฉํ•ด์•ผ ํ•  ์ƒํ™ฉ๊ณผ, ์‹ค์ œ ์ƒ์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ์˜ ๊ตฌํ˜„ ๋ฐฉ์‹์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์ƒ์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ๋ณ„๋„์˜ ๊ธ€๋กœ ๋ถ„๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค!

 

๋ฒ„์ธ„์–ผ ์Šคํฌ๋กค์„ ์–ด๋А ์ƒํ™ฉ์—์„œ ์จ์•ผ ํ• ๊นŒ?

๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

๋ฒ„์ธ„์–ผ ์Šคํฌ๋กค์€ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•„์ˆ˜์ ์ด๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž์—๊ฒŒ ์ˆ˜์ฒœ ์ˆ˜๋งŒ ๊ฐœ์˜ ํ•ญ๋ชฉ์ด ํฌํ•จ๋œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณด์—ฌ์ค˜์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ๋ชจ๋“  ํ•ญ๋ชฉ์„ ํ•œ ๋ฒˆ์— ๋ Œ๋”๋งํ•˜๋ฉด ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋Ÿด ๋•Œ, ํ˜„์žฌ ํ™”๋ฉด์— ๋ณด์ด๋Š” ํ•ญ๋ชฉ๋งŒ ๋ Œ๋”๋งํ•จ์œผ๋กœ์จ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šคํฌ๋กค ์„ฑ๋Šฅ ๊ฐœ์„ 

์ผ๋ฐ˜์ ์ธ ์Šคํฌ๋กค ๋ฐฉ์‹์—์„œ๋Š” ๋ชจ๋“  ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์ด DOM์— ์กด์žฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์Šคํฌ๋กคํ•  ๋•Œ ํ™”๋ฉด์— ๋ณด์ด๋Š” ํ•ญ๋ชฉ์€ ๋ฐ”๋€Œ์ง€๋งŒ, DOM์—์„œ ๋ชจ๋“  ์š”์†Œ๊ฐ€ ๊ณ„์† ์œ ์ง€๋˜๋ฏ€๋กœ ์ง€์›Œ์ง€๊ฑฐ๋‚˜ ์ถ”๊ฐ€๋˜๋Š” ๊ณผ์ •์ด ์—†์Šต๋‹ˆ๋‹ค.

๋Œ€์‹ , ๋ธŒ๋ผ์šฐ์ €๋Š” ์Šคํฌ๋กค์— ๋”ฐ๋ผ ๋ณด์ด์ง€ ์•Š๋Š” ํ•ญ๋ชฉ๋“ค์„ ์—ฌ์ „ํžˆ ๋ฉ”๋ชจ๋ฆฌ์— ๋‘๊ณ  ์žˆ์–ด, ์ „์ฒด ๋ฆฌ์ŠคํŠธ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๋ Œ๋”๋ง ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋ฐ˜๋ฉด, ๊ฐ€์ƒ ์Šคํฌ๋กค์—์„œ๋Š” ์Šคํฌ๋กคํ•  ๋•Œ ํ˜„์žฌ ํ™”๋ฉด์— ๋ณด์ด๋Š” ํ•ญ๋ชฉ๋งŒ DOM์— ๋ Œ๋”๋งํ•˜๊ณ , ๋‚˜๋จธ์ง€ ํ•ญ๋ชฉ์€ DOM์—์„œ ์ง€์šฐ๊ฑฐ๋‚˜ ์ˆจ๊น๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ, ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€๋˜๋Š” ์š”์†Œ์˜ ์ˆ˜๊ฐ€ ์ค„์–ด๋“ค์–ด ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์Šคํฌ๋กคํ•  ๋•Œ ํ•„์š”ํ•œ ๋งŒํผ์˜ ํ•ญ๋ชฉ๋งŒ ์ƒ์„ฑํ•˜๊ณ , ๋ณด์ด์ง€ ์•Š๋Š” ํ•ญ๋ชฉ์€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œํ•˜๊ฒŒ ๋˜์–ด, ๋ Œ๋”๋ง ๊ณผ์ •์—์„œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์š”์†Œ์˜ ์ˆ˜๊ฐ€ ์ ์–ด์ง€๋ฏ€๋กœ ์Šคํฌ๋กค ์„ฑ๋Šฅ์ด ๋”์šฑ ์›ํ™œํ•ด์ง€๊ฒ ์ฃ ?!

 

๊ฒฐ๋ก ์ ์œผ๋กœ, ์ผ๋ฐ˜ ์Šคํฌ๋กค์—์„œ๋Š” DOM์˜ ํ•ญ๋ชฉ์ด ์ง€์›Œ์ง€์ง€ ์•Š์ง€๋งŒ, ๊ฐ€์ƒ ์Šคํฌ๋กค์€ ํ•„์š” ์—†๋Š” ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ํ–ฅ์ƒ

ํŽ˜์ด์ง€ ๋‚ด์—์„œ์˜ ์›ํ™œํ•œ ์Šคํฌ๋กค๋ง ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ๋„ ๋ฒ„์ธ„์–ผ ์Šคํฌ๋กค์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ํ•ญ๋ชฉ์„ ํ•œ ๋ฒˆ์— ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ , ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ๋กœ๋“œํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋น ๋ฅด๊ณ  ์›ํ™œํ•œ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋ฆฌ๋ Œ๋”๋ง ์„ฑ๋Šฅ ๋˜ํ•œ ๊ณ ๋ คํ•ด์•ผ ํ•  ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ์Šคํฌ๋กค ๋ฐฉ์‹์—์„œ๋Š” ๋ชจ๋“  ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์ด DOM์— ์กด์žฌํ•˜๋ฏ€๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ์Šคํฌ๋กคํ•  ๋•Œ๋งˆ๋‹ค ๊ธฐ์กด ์š”์†Œ๊ฐ€ ์žฌ๋ Œ๋”๋ง๋˜๊ฑฐ๋‚˜ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ณผ์ •์—์„œ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๋ฉด ์„ฑ๋Šฅ ์ €ํ•˜๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด, ๋ฒ„์ธ„์–ผ ์Šคํฌ๋กค์—์„œ๋Š” ํ˜„์žฌ ํ™”๋ฉด์— ๋ณด์ด๋Š” ํ•ญ๋ชฉ๋งŒ ๋ Œ๋”๋งํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฆฌ๋ Œ๋”๋ง์ด ํ•„์š”ํ•œ ํ•ญ๋ชฉ์˜ ์ˆ˜๊ฐ€ ์ค„์–ด๋“ค์–ด ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋ฉ๋‹ˆ๋‹ค.

 

๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋„ ํ™”๋ฉด์— ๋ณด์ด๋Š” ํ•ญ๋ชฉ๋งŒ์„ ํšจ์œจ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์–ด, ์ „์ฒด์ ์ธ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

 

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

 

์‹ค์ œ๋กœ ๋ฒ„์ธ„์–ผ ์Šคํฌ๋กค์„ ์ƒ์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋งŒ๋“  ๊ณณ์—์„  ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ–ˆ์„๊นŒ?

์ƒ์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ตฌํ˜„ ๋ฐฉ์‹

 react-window, react-virtualized, react-virtuoso ๊ด€๋ จ๋œ ๋ณ„๋„์˜ ๊ธ€๋กœ ๋ถ„๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค!

 

๋งˆ๋ฌด๋ฆฌ

๋ฒ„์ธ„์–ผ ์Šคํฌ๋กค์€ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ , ์‚ฌ์šฉ์ž์—๊ฒŒ ์›ํ™œํ•œ ์Šคํฌ๋กค๋ง ๊ฒฝํ—˜์„ ์ œ๊ณตํ• ๋•Œ ๋งค๋ ฅ์žˆ๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค!

๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํ”„๋กœ์ ํŠธ์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์ ํ•ฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

 

์ €๋Š” ํ•™์Šต ๋ฐ ๊ฐœ์„ ์ ์„ ์ฐพ๊ธฐ์œ„ํ•ด ์Šค์Šค๋กœ ๊ตฌํ˜„์ค‘์— ์žˆ์Šต๋‹ˆ๋‹ค!

 

๋ฒ„์ธ„์–ผ ์Šคํฌ๋กค์ด ํ•„์š”ํ•œ ์ด์œ ์— ๋Œ€ํ•œ ๊ฒฝํ—˜

์‹ค์ œ๋กœ ํ˜„์žฌ ํšŒ์‚ฌ์—์„œ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ฒŒ ๋  ๊ฒฝ์šฐ, DOM์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์—ˆ์–ด์š”.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ณ ๊ฐ๋‹น ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ 10๋งŒ ๊ฐœ์— ๋‹ฌํ•  ๊ฒฝ์šฐ, ์œ ์ €์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋ฉด์„œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ๋ฒ„์ธ„์–ผ ์Šคํฌ๋กค์„ ๋„์ž…ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹น์žฅ์€ ๊ตฌํ˜„๋œ ํ”„๋กœ์ ํŠธ์— ๋ฌธ์ œ๊ฐ€ ์—†์–ด๋ณด์—ฌ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ , ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ์„ ์ œ์ ์ธ ์กฐ์น˜๋กœ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

 

๋ฒ„์ธ„์–ผ ์Šคํฌ๋กค์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ธฐ๋ฒ•๋“ค์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์Šคํฌ๋กค์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•  ๋•Œ, ๋‚จ์€ ๊ฐ€์ƒ ์Šคํฌ๋กค ์•„์ดํ…œ์ด ์žˆ๋Š”์ง€ ํŒ๋‹จํ•˜๋Š” ๋กœ์ง์„ ํ†ตํ•ด ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๋„๋ก ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ณผ์ •์—์„œ ๋ฐ์ดํ„ฐ์˜ ์–‘๊ณผ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ณต์žก์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ์ตœ์ ์˜ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์†์ ์ธ ๋…ธ๋ ฅ์ค‘์ž…๋‹ˆ๋‹ค!

 

 

 

๐Ÿ“ƒ ์ฐธ๊ณ  ๋ฌธํ—Œ  
์˜ค๋Š˜์˜์ง‘ ๋‚ด ๋ฌดํ•œ ์Šคํฌ๋กค ๊ฐœ๋ฐœ๊ธฐ
React Window ๊นƒํ—™
React Virtualized ๊นƒํ—™
React Virtuoso ๊นƒํ—™

 

์›ํ‹ฐ๋“œ ํ”„๋ฆฌ์˜จ๋ณด๋”ฉ ๊ณผ์ œ๋กœ ์ง„ํ–‰ํ–ˆ๋˜ ๋ฌดํ•œ์Šคํฌ๋กค์— ์ ์šฉํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

ํ•ด๋‹น ๊ธ€์—์„  ๋ฒ„์ถ”์–ผ ์Šคํฌ๋กค์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „์— ๋„์ž…์„ ์œ„ํ•ด ์ฐพ์•„๋ณธ ์ด๋ฏธ ์ƒ์šฉํ™”๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

 

์ธ๊ธฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ์š”

๊ฒ€ํ† ํ•ด๋ณธ ๋ฒ„์ธ„์–ผ ์Šคํฌ๋กค์„ ์ง€์›ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ๋Š” react-window, react-virtualized, react-virtuoso๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ณ ์œ ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ํ†ตํ•ด ๋ฒ„์ธ„์–ผ ์Šคํฌ๋กค์„ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์™€ ์„ฑ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž์ถ”์–ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

์ด ์ค‘์—์„œ React Virtualized๋Š” ๊ฐ€๋ฒผ์›Œ์ง„ ๋ฒ„์ „์ธ React Window๊ฐ€ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋ฉฐ, React Virtuoso๋Š” ๋น„๊ต์  ์ตœ๊ทผ์— ์ถœ์‹œ๋˜์–ด ์‚ฌ์šฉ๋Ÿ‰์ด ์ ์ง€๋งŒ ์ ์  ์ธ๊ธฐ๋ฅผ ๋Œ๊ณ  ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. React Virtuoso๋Š” React Window์—๋Š” ์—†๋Š” ๊ธฐ๋Šฅ๋“ค์„ ์ง€์›ํ•˜์—ฌ ๊ฐ€๋ณ๊ณ  ๊ฐ„๋‹จํ•˜๋ฉด์„œ๋„ ๋‹ค์–‘ํ•œ ์š”๊ตฌ์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ฐ€์ƒ ์Šคํฌ๋กค์„ ํ†ตํ•ด ์Šคํฌ๋กค์„ ๋‚ด๋ฆด ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ๋Š๊น€ ์—†์ด ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋Š” windowing ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

 

Windowing

Windowing์€ ํ˜„์žฌ ํ™”๋ฉด์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ธด ๋ฆฌ์ŠคํŠธ์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ๋ Œ๋”๋งํ•˜๋ฉด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋˜๊ณ  ๋ ‰์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, windowing ๊ธฐ์ˆ ์„ ํ†ตํ•ด ํšจ์œจ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์—˜๋ฆฌ๋‹˜์˜ ๋“œ๋ฆผ ์ฝ”๋”ฉ Express ๊ฐ•์˜์˜ Rate Limit ๊ด€๋ จ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ•™์Šตํ•˜๋ฉฐ ์•Œ๊ฒŒ ๋๋˜ ๊ฐœ๋…์ธ๋ฐ ๋‹ค์‹œ ๋ณด๋‹ˆ ๊ดœํžˆ ๋ฐ˜๊ฐ‘๋„ค์š”! ใ…Žใ…Ž

 

์Šคํฌ๋กค ์œ„์น˜

  • React Virtualized๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์Šคํฌ๋กคํ•œ ์œ„์น˜๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์–ด ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•ด๋„ ๊ทธ ์œ„์น˜์—์„œ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • React Window๋Š” ์Šคํฌ๋กค ์œ„์น˜ ์ €์žฅ ๊ธฐ๋Šฅ์ด ์—†์–ด, ์ƒˆ๋กœ๊ณ ์นจ ํ›„ ์ตœ์ƒ๋‹จ ํ•ญ๋ชฉ์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ๋ถˆํŽธํ•จ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 1000๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ ์ค‘ 700๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ๋ณด๊ณ  ์žˆ๋‹ค๊ฐ€ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด ์ตœ์ƒ๋‹จ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ผ์šฐํŒ…์œผ๋กœ ์ธํ•ด ํŽ˜์ด์ง€ ๊ฐ„ ์ด๋™ ์‹œ ์ƒํƒœ๊ฐ€ ์œ ์ง€๋˜์ง€๋งŒ, URL์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์Šคํฌ๋กค ์œ„์น˜๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์–ด ํŽ˜์ด์ง€๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋˜๊ณ  ์ƒˆ๋กœ์šด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๊ธฐ ์ƒํƒœ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.
  • ์–ธ๋งˆ์šดํŠธ ์‹œ API ์š”์ฒญ์ด ๋‹ค์‹œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Context API, Redux, React Query ๋“ฑ์˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ API ์š”์ฒญ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋†’์ด ๊ณ„์‚ฐ (์ •์ , ๋™์ )

  • React Window๋Š” ์ •์ ์ธ ๋†’์ด๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์˜ ๋†’์ด๊ฐ€ ์ผ์ •ํ•ด์•ผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • React Virtualized๋Š” ๋™์ ์ธ ๋†’์ด๋ฅผ ์ง€์›ํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์˜ ๋‚ด์šฉ์— ๋”ฐ๋ผ ๋†’์ด๊ฐ€ ๋‹ฌ๋ผ์ ธ๋„ ์ž๋™์œผ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด CellMeasurer ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ์ปดํฌ๋„ŒํŠธ๋Š” ์ƒˆ๋กœ์šด ์ฝ˜ํ…์ธ ๊ฐ€ ๋‚˜ํƒ€๋‚  ๋•Œ ๋†’์ด๋ฅผ ์ž๋™์œผ๋กœ ์žฌ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  • CellMeasurer์™€ ํ•จ๊ป˜ CellMeasurerCache๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋†’์ด๋ฅผ ์บ์‹œํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

React Window

 

  • ๋ชฉ์ : ๋งŽ์€ ๋ฐ์ดํ„ฐ ๋ฆฌ์ŠคํŠธ์™€ ํ‘œ ํ˜•์‹ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜์—ฌ ๋ทฐํฌํŠธ์— ๋ณด์ด๋Š” ํ•ญ๋ชฉ๋งŒ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.
  • ์ฃผ์š” ๊ธฐ๋Šฅ:
    • React Window๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ •์ ์ธ ๋†’์ด๋ฅผ ๊ฐ€์ง„ ๋ฆฌ์ŠคํŠธ์™€ ๊ทธ๋ฆฌ๋“œ๋งŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ๊ฒฝ๋Ÿ‰ํ™”๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
    • DOM ๋…ธ๋“œ ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜์—ฌ ๋ Œ๋”๋ง ์‹œ๊ฐ„๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ž…๋‹ˆ๋‹ค.
    • ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•ด ์„ค๊ณ„๋œ ๊ฐ„๋‹จํ•œ API๋กœ ์„ฑ๋Šฅ์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค.
    • react-window-infinite-loader์™€ ๊ฐ™์€ ์™ธ๋ถ€ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ์ง€์—ฐ ๋กœ๋”ฉ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ๋ฒ•: ์ตœ์†Œํ•œ์˜ ์„ค์ •์œผ๋กœ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ๊ณผ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋˜ํ•œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

React Virtualized

 

  • ๋ชฉ์ : React Window์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋” ๋ณต์žกํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์œ„ํ•œ ํญ๋„“์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ฃผ์š” ๊ธฐ๋Šฅ:
    • React Virtualized๋Š” ๊ฐ€์ƒํ™”๋œ ๊ทธ๋ฆฌ๋“œ, ํ•„ํ„ฐ๋ง, ์ •๋ ฌ, ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
      • ๊ฐ€์ƒํ™”๋œ ๊ทธ๋ฆฌ๋“œ๋Š” ๋™์ ์ธ ๋†’์ด ๊ณ„์‚ฐ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด๊ธฐ ์ข‹์€ ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.
      • ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ์€ ํŠน์ • ์กฐ๊ฑด์— ๋งž๋Š” ํ•ญ๋ชฉ๋งŒ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • ์ •๋ ฌ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๊ธฐ์ค€์œผ๋กœ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์˜ ์ˆœ์„œ๋ฅผ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • ์ผ๋ถ€ ์Šคํƒ€์ผ์— CSS๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ํŠน์ • ๊ตฌ์„ฑ ์š”์†Œ๋งŒ ์ž„ํฌํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด shallowCompare๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ props๋‚˜ state๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ๋ฒ•: ๋ณต์žกํ•œ API ๋•Œ๋ฌธ์— ์„ค์ •์ด ๋” ๋ณต์žกํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, react-window๋‚˜ react-virtuoso์™€ ๋น„๊ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

React Virtuoso

  • ๋ชฉ์ : ๊ฐ€๋ณ€ ํฌ๊ธฐ ํ•ญ๋ชฉ์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํฌ๊ด„์ ์ธ ๊ตฌ์„ฑ ์š”์†Œ ์„ธํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ฃผ์š” ๊ธฐ๋Šฅ:
    • ์ˆ˜๋™ ํฌ๊ธฐ ์กฐ์ • ์—†์ด ๊ฐ€๋ณ€ ํฌ๊ธฐ ํ•ญ๋ชฉ์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ ๋ฆฌ์ŠคํŠธ
    • ์Šคํ‹ฐํ‚ค ํ—ค๋”๊ฐ€ ์žˆ๋Š” ๊ทธ๋ฃนํ™”๋œ ํ•ญ๋ชฉ
      • ๋ฆฌ์ŠคํŠธ์˜ ํ•ญ๋ชฉ์„ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„๋กœ ๊ทธ๋ฃนํ™” ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค!(์ œ๊ฐ€ ํ—ท๊ฐˆ๋ ธ๋˜ ๋ถ€๋ถ„์ด๋ผ ํ’€์–ด ์ ์„๊ฒŒ์š”!) ์˜ˆ๋ฅผ ๋“ค์–ด, ์ œํ’ˆ ๋ฆฌ์ŠคํŠธ๊ฐ€ "๊ณผ์ผ"์ด๋‚˜ "์ฑ„์†Œ"์™€ ๊ฐ™์€ ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ๋‚˜๋‰˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๊ทธ๋ฃน์—๋Š” ์ƒ๋‹จ์— ๊ณ ์ •๋œ ํ—ค๋”๊ฐ€ ์žˆ์–ด ์‚ฌ์šฉ์ž๊ฐ€ ๋ฆฌ์ŠคํŠธ๋ฅผ ์Šคํฌ๋กคํ•  ๋•Œ ํ˜„์žฌ ์–ด๋–ค ๊ทธ๋ฃน์„ ๋ณด๊ณ  ์žˆ๋Š”์ง€ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์ด ์Šคํ‹ฐํ‚ค ํ—ค๋” ๊ธฐ๋Šฅ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋” ๋‚˜์€ ๋งฅ๋ฝ์„ ์ œ๊ณตํ•˜์—ฌ ์‚ฌ์šฉ ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
    • ๋ฌดํ•œ ์Šคํฌ๋กค ๋“ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
    • CSS ํด๋ž˜์Šค ์†์„ฑ์„ ํ†ตํ•ด ๋™์ผํ•œ ํฌ๊ธฐ์˜ ํ•ญ๋ชฉ์„ ์—ฌ๋Ÿฌ ์—ด๋กœ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ๋ฒ•: ๋ณต์žกํ•œ ๋ฆฌ์ŠคํŠธ ๋ทฐ ๊ตฌํ˜„์„ ๋‹จ์ˆœํ™”ํ•˜์—ฌ ์ง๊ด€์ ์ธ API๋กœ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

์š”์•ฝ ๋ฐ ๋งˆ๋ฌด๋ฆฌ

  • ์„ฑ๋Šฅ: ์„ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชจ๋‘ DOM ๋…ธ๋“œ๋ฅผ ์ค„์ด๊ณ  ๋ Œ๋”๋ง์„ ์ตœ์ ํ™”ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค.
  • ๋ณต์žก์„ฑ: React Window๊ฐ€ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ณ  ๊ฒฝ๋Ÿ‰์ด๋ฉฐ, React Virtualized๋Š” ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. React Virtuoso๋Š” ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๊ณผ ์‚ฌ์šฉ ํŽธ์˜์„ฑ์˜ ๊ท ํ˜•์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž ์ •์˜: ๊ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ•„์š”์— ๋งž๊ฒŒ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์˜ต์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ React Virtuoso์™€ React Virtualized๋Š” ์Šคํƒ€์ผ์ด๋‚˜ ๋ ˆ์ด์•„์›ƒ์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆํ•˜๋Š” ๋ฐ ๋” ๋งŽ์€ ์œ ์—ฐ์„ฑ์„ ์ค๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๋“ค์€ ์ž์‹ ๋งŒ์˜ ๋””์ž์ธ ์š”๊ตฌ์— ๋งž์ถฐ ํ•ญ๋ชฉ์˜ ํฌ๊ธฐ, ์ƒ‰์ƒ, ๋ฐฐ์น˜ ๋“ฑ์„ ์ž์œ ๋กญ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
  • React Window๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฆฌ์ŠคํŠธ์™€ ๊ทธ๋ฆฌ๋“œ, ์ •์ ์ธ ๋†’์ด๋ฅผ ์ง€์›ํ•˜๋ฉฐ, ํ•„์š” ์—†๋Š” ๊ธฐ๋Šฅ๋“ค์€ ์ œ๊ฑฐํ•˜์—ฌ ๊ฐ€๋ณ๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์€ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•˜์ง€๋งŒ, ๊ธฐ๋Šฅ์ด ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค.
  • React Virtualized๋Š” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋ฉฐ, ๋ณต์žกํ•œ UI/UX๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ ์œ ์šฉํ•˜์ง€๋งŒ, ์„ค์ •์ด ๋ณต์žกํ•˜๊ณ  ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ํฐ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • React Virtuoso๋Š” ๊ฒฝ๋Ÿ‰ํ™”์™€ ๊ฐ„ํŽธํ•จ์„ ์ถ”๊ตฌํ•˜๋ฉฐ, ์ตœ๊ทผ ์ธ๊ธฐ๋ฅผ ๋Œ๊ณ  ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด ๋งŽ๋‹ค๋ฉด ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ ๊ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ฐ๊ธฐ ๋‹ค๋ฅธ ํŠน์„ฑ๊ณผ ์žฅ๋‹จ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ํ”„๋กœ์ ํŠธ์˜ ์š”๊ตฌ์— ๋งž์ถฐ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿ“ƒ ์ฐธ๊ณ  ๋ฌธํ—Œ  
React Window ๊นƒํ—™
React Virtualized ๊นƒํ—™
React Virtuoso ๊นƒํ—™
react-virtualized vs react-virtuoso vs react-window (npm-trends)
Which is Better Virtual Scrolling Libraries? (npm-compare)

 

SVGR์˜ Props TypeErorr?!

 

SVG๋ฅผ ๋ณ„๋„์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ ๋„ ์ปดํฌ๋„ŒํŠธ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก Webpack ์„ค์ •์„ ์ถ”๊ฐ€ํ•œ ๊ณผ์ •์„ ๊ณต์œ ํ•ด ๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์—์„œ ์ฒซ ๋ฒˆ์งธ SVG์ธ ํ–„๋ฒ„๊ฑฐ ์•„์ด์ฝ˜์„ SVG๋กœ ์ ์šฉํ•˜๋ฉด์„œ ๊ฒช์€ ๋ฌธ์ œ์™€ ๊ทธ ํ•ด๊ฒฐ ๊ณผ์ •์„ ํ•จ๊ป˜ ๋‚˜๋ˆ„๊ฒ ์Šต๋‹ˆ๋‹ค.

 

SVG ํŒŒ์ผ์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

SVG๋ฅผ img ํƒœ๊ทธ๊ฐ€ ์•„๋‹Œ ์ปดํฌ๋„ŒํŠธ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ, ์ €๋Š” .svg ํ™•์žฅ์ž๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํŒŒ์ผ ๊ด€๋ฆฌ ์ธก๋ฉด์—์„œ ๋” ํŽธํ•˜๋‹ค๊ณ  ๋А๊ผˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ํŒŒ์ผ ๊ด€๋ฆฌ ์šฉ์ด์„ฑ: SVG ํŒŒ์ผ์„ ๋ณ„๋„์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค ํ•„์š” ์—†์ด, ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์–ด ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๊ฐ€ ๊น”๋”ํ•ด์ง‘๋‹ˆ๋‹ค.
  2. ์žฌ์‚ฌ์šฉ์„ฑ: ๋™์ผํ•œ SVG ํŒŒ์ผ์„ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๋ฉด ๋ชจ๋“  ์ฐธ์กฐ์—์„œ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.
  3. ๋””์ž์ธ ํˆด๊ณผ์˜ ํ˜ธํ™˜์„ฑ: ๋งŽ์€ ๋””์ž์ธ ํˆด์ด SVG ํฌ๋งท์„ ์ง€์›ํ•˜๋ฏ€๋กœ, ๋””์ž์ด๋„ˆ์™€์˜ ํ˜‘์—…์ด ์›ํ™œํ•ฉ๋‹ˆ๋‹ค. SVG ํŒŒ์ผ์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋ฉด ๋””์ž์ด๋„ˆ๊ฐ€ ์ž‘์—…ํ•œ ํŒŒ์ผ์„ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ด์  ๋•๋ถ„์—, ์ €๋Š” svgr/webpack์„ ์ถ”๊ฐ€๋กœ ์„ค์น˜ํ•˜์—ฌ SVG ํŒŒ์ผ์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

๋ฌธ์ œ์˜ ์‹œ์ž‘

SVG ์•„์ด์ฝ˜์„ ์ปดํฌ๋„ŒํŠธ์ฒ˜๋Ÿผ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด svgr/webpack์„ ์„ค์ •ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์—๋Ÿฌ: ํ˜„์žฌ ๊ฐœ๋ฐœํ•œ <Svg /> ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” props๋ฅผ ๋„˜๊ธธ ์ˆ˜ ์—†์–ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, <Hamburger width="24" /> ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•˜๋ ค ํ–ˆ์„ ๋•Œ, “Type '{width: string} is not assignable to type 'IntrinsicAttributes'.”๋ผ๋Š” ํƒ€์ž… ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด props๋ฅผ ์ œ๋Œ€๋กœ ์ „๋‹ฌํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , ๊ฒฐ๊ณผ์ ์œผ๋กœ CSS์—์„œ ์ง์ ‘์ ์œผ๋กœ svg { }์— ์„ค์ •ํ•˜๊ฒŒ ๋˜์–ด ์œ ์—ฐ์„ฑ์ด ๋–จ์–ด์ง„ ์ƒํ™ฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
  2. ํƒ€์ž… ์„ ์–ธ ๋ฌธ์ œ: declarations.d.ts ํŒŒ์ผ์—์„œ SVG ํƒ€์ž…์„ any๋กœ ์„ ์–ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ ์—๋Ÿฌ์˜€์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํƒ€์ž…์„ string์œผ๋กœ ๋ณ€๊ฒฝํ•˜์˜€๊ณ , ์ด๋Š” tsconfig ์„ค์ •๊ณผ ๊ด€๋ จ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. 

 

์ƒ์„ธ ํ•ด๊ฒฐ ๊ณผ์ •

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์ณค์Šต๋‹ˆ๋‹ค.

  1. ํƒ€์ž… ์„ ์–ธ ์ˆ˜์ •: ์ดˆ๊ธฐ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ์–ธํ–ˆ์Šต๋‹ˆ๋‹ค.
// declarations.d.ts
declare module "*.svg?url" {
  const url: any;
  export default url;
}

 

ํ•˜์ง€๋งŒ any ๋Œ€์‹  string์œผ๋กœ ์ˆ˜์ •ํ•˜์—ฌ ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

// declarations.d.ts
declare module "*.svg?url" {
  const url: string;
  export default url;
}

 

PR ์ฝ”๋“œ๋ฆฌ๋ทฐ ๊ณผ์ •์—์„œ SVGR ๋ฌธ์„œ๋ฅผ ์ž˜๋ชป ํ•ด์„ํ•œ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ฝ”๋ฉ˜ํŠธ๋ฅผ ๋ฐ›์•˜๊ณ , resourceQuery: /url/์™€ ๊ฐ™์€ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์˜คํ•ดํ•œ ๋ถ€๋ถ„์€, SVG ํŒŒ์ผ์„ URL๋กœ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ•ด๋‹น ํŒŒ์ผ์— ?url ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์„ ๋ถ™์—ฌ์•ผ ํ•œ๋‹ค๋Š” ์ ์ด์—ˆ์–ด์š”..!

์ด๋กœ ์ธํ•ด url์˜ ํƒ€์ž…์ด string์œผ๋กœ ์„ ์–ธ๋˜์–ด์•ผ ํ•˜๋Š” ์ด์œ ๋ฅผ ๋†“์ณค๊ณ  ์–ด๋–ค ํƒ€์ž…์œผ๋กœ ์„ค์ •ํ•ด ์ค„์ง€๋ฅผ ๋ชฐ๋ผ any ํƒ€์ž…์œผ๋กœ ์„ค์ •ํ•ด๋’€์—ˆ์Šต๋‹ˆ๋‹ค.

 

  2. Webpack ์„ค์ • ์กฐ์ •: ๋‹ค์Œ์œผ๋กœ, Webpack ์„ค์ •์—์„œ SVG ๊ด€๋ จ ๊ทœ์น™ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •์„ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

 {
    test: /\.(jpg|jpeg|gif|png|eot|woff|ttf)$/i,
    type: "asset/resource",
  },
  {
    test: /\.svg$/,
    oneOf: [
      {
        use: ["@svgr/webpack"],
        issuer: /\.[jt]sx?$/,
        resourceQuery: { not: [/url/] },
      },
      {
        type: "asset",
        resourceQuery: /url/, // *.svg?url
      },
    ],
  },

 

 

๋ฐฐ์—ด์˜ ์ˆœ์„œ๋Œ€๋กœ ๊ทœ์น™์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์›นํŒฉ์„ ์œ„ํ•ด @svgr/webpack ๊ทœ์น™์„ assets/resource ๊ทœ์น™๋ณด๋‹ค ์ƒ์œ„๋กœ ์˜ฌ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์—ˆ์œผ๋‚˜, ๋‘ ๊ทœ์น™ ์ค‘ ํ•˜๋‚˜์˜ ๊ทœ์น™๋งŒ์ด. svg ํŒŒ์ผ์— ์ ์šฉ๋˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด @svgr/webpack์˜ svg ๊ทœ์น™๋งŒ์„ ์œ ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

๋А๋‚€ ์ 

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

SVG ์ปดํฌ๋„ŒํŠธ๋กœ์˜ ์ „ํ™˜์ด ์‰ฝ์ง€ ์•Š์•˜์ง€๋งŒ, ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋” ์œ ์—ฐํ•œ ๋””์ž์ธ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„๋„ SVG๋ฅผ ๋‹ค์–‘ํ•˜๊ฒŒ ํ™œ์šฉํ•ด ๋ณด์‹œ๊ธธ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

 

๐Ÿ“ƒ ์ฐธ๊ณ  ๋ฌธํ—Œ  
svgr/webpack ๋ฌธ์„œ

 

Allini๋Š” Create React App(CRA)์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์ง์ ‘ Webpack๊ณผ Babel์„ ์„ค์ •ํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.
ํšŒ์‚ฌ์—์„œ Webpack์„ ์„ค์ •ํ•ด๋ณธ ๊ฒฝํ—˜์ด ์žˆ์–ด, ์ฒ˜์Œ์—๋Š” ๊ทธ ๊ธฐ์–ต์— ์˜์กดํ•ด ์ž‘์—…์„ ์‹œ์ž‘ํ–ˆ์–ด์š”.

๊ทธ๋Ÿฐ๋ฐ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ๋„์ค‘ Pretendard-Black.subset.woff2 ๋ฐ Pretendard-ExtraBold.subset.woff2 ํฐํŠธ ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

 

์ด ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ผ ์œ„์น˜, font.css์˜ ๊ฒฝ๋กœ, ํŒŒ์ผ๋ช…, ๋นŒ๋“œ ์บ์‹œ ์‚ญ์ œ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ,

๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๊ณ ..๐Ÿ˜ข

์ œ๊ฐ€ ์ž‘์„ฑํ•œ Webpack ์„ค์ • ์ž์ฒด์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€ ์˜์‹ฌํ•˜๊ฒŒ ๋์Šต๋‹ˆ๋‹ค.

 

Webpack ์„ค์ • ์ ๊ฒ€: file-loader๋Š” ์ž˜ ๋“ฑ๋กํ–ˆ๋Š”๋ฐ...

์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ์ด์œ ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด webpack.config.js ํŒŒ์ผ์—์„œ ํŒŒ์ผ ๋กœ๋” ์„ค์ •์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

file-loader๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •ํ•ด๋‘์—ˆ๊ธฐ์—, ๋ฌธ์ œ๊ฐ€ ์—†์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์—ˆ์ฃ ..! 

{
  test: /\.(png|jpe?g|gif|webp)$/i,
  use: [
    {
      loader: "file-loader",
      options: {
        name: "[path][name].[ext]",
      },
    },
  ],
}

 

๊ทธ๋ ‡๊ธฐ์— ์ด ์„ค์ •์—๋Š” ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๊ณ , ์™œ ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ๋„์ €ํžˆ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

 

์—‰๋šฑํ•œ ๊ณ ๋ฏผ: MSW๊ฐ€ ๋ฌธ์ œ์ธ๊ฐ€?

์ด์ฏค ๋˜๋‹ˆ MSW(Mocking Service Worker)๊ฐ€ ํฐํŠธ ํŒŒ์ผ์กฐ์ฐจ ๊ฐ€๋กœ์ฑ„๋Š” ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€ ํ•˜๋Š” ์—‰๋šฑํ•œ ์ƒ๊ฐ๊นŒ์ง€ ํ•˜๊ฒŒ ๋˜์—ˆ์–ด์š”..!

MSW๋Š” ๋ฐฑ์—”๋“œ๊ฐ€ ๊ตฌ์ถ•๋˜๊ธฐ ์ „์— ํ”„๋ก ํŠธ์—”๋“œ UI ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ์‚ฌ์šฉ ์ค‘์ด์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณธ ๊ฒฐ๊ณผ, MSW๋Š” ์ •์  ๋ฆฌ์†Œ์Šค(์˜ˆ: ํฐํŠธ ํŒŒ์ผ)์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

MSW๊ฐ€ ํฐํŠธ ํŒŒ์ผ ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„์ง€ ์•Š๋Š” ํ•œ, ์ด ๋ฌธ์ œ๋Š” MSW์™€ ๊ด€๋ จ์ด ์—†์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•˜์Šต๋‹ˆ๋‹ค.

 

์ง„์งœ ๋ฌธ์ œ: Webpack ๋ฒ„์ „ ์ฐจ์ด

๊ณ ๋ฏผ์„ ๊ฑฐ๋“ญํ•˜๋˜ ์ค‘, ํ˜น์‹œ ๋‚ด๊ฐ€ ์•Œ๊ณ  ์žˆ๋˜ Webpack ์„ค์ •๊ณผ ํ˜„์žฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ„์ „ ๊ฐ„์— ์ฐจ์ด๊ฐ€ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹๊นŒ ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ์ƒ๊ฐ์ด ๋ฐ”๋กœ ์ •๋‹ต์ด์—ˆ์ฃ !!!  แ•ฆ( แ› )แ•ก

 

๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ž˜ ๋ด์•ผํ•ด์š”!!

 

Webpack 5์—์„œ๋Š” ํŒŒ์ผ ๋กœ๋” ์„ค์ •์ด ๊ฐ„์†Œํ™”๋˜์—ˆ๊ณ , ๋” ์ด์ƒ file-loader๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

Webpack 5์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค:

{
  test: /\.(jpg|jpeg|gif|png|svg|eot|woff|ttf)$/i,
  type: "asset/resource",
}

 

Webpack 5์—์„œ๋Š” file-loader์™€ url-loader๋“ฑ์„ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , asset/resource, asset/inline, ๊ทธ๋ฆฌ๊ณ  asset์„ ํ†ตํ•ด ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • asset/resource: ๋ณ„๋„์˜ ํŒŒ์ผ์„ ๋‚ด๋ณด๋‚ด๊ณ  URL์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. (file-loader ๋Œ€์ฒด)
  • asset/inline: ๋ฐ์ดํ„ฐ URL๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ (url-loader ๋Œ€์ฒด)
  • asset: ์ž๋™์œผ๋กœ ๋ฐ์ดํ„ฐ URL๊ณผ ํŒŒ์ผ ๋‚ด๋ณด๋‚ด๊ธฐ ์ค‘ ์„ ํƒํ•˜๋ฉฐ, ๊ธฐ์กด์˜ ํฌ๊ธฐ ์ œํ•œ ์„ค์ •๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฐธ๊ณ ํ–ˆ๋˜ Webpack ๊ณต์‹ ๋ฌธ์„œ ๋งํฌ๋ฅผ ๋‚จ๊ฒจ๋‘˜๊ฒŒ์š”!!

 

ํ•™์Šต ๋ฐฉ์‹์— ๋Œ€ํ•œ ๋ฐ˜์„ฑ, ๊ทธ๋ฆฌ๊ณ  ์•ž์œผ๋กœ์˜ ๊ณ„ํš

์ด์ „์— TOAST Editor๊ฐ€ React 17 ๋ฒ„์ „๊นŒ์ง€๋งŒ ์ง€์›๋œ๋‹ค๋Š” ์ด์Šˆ๋ฅผ ๊ฒช์—ˆ๋˜ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ€๋„๋Ÿฝ์ง€๋งŒ ๊ทธ๋•Œ๋„ ์ด์ „ ์ง€์‹์—๋งŒ ์˜์กดํ–ˆ๋˜ ํƒ“์—, ์‚ฌ์šฉ๋œ ๊ธฐ์ˆ  ์Šคํƒ์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํžˆ ๊ฒ€ํ† ํ•˜์ง€ ์•Š์•˜๋˜ ๊ฒฝํ—˜์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ Webpack ์„ค์ • ๋ฌธ์ œ๋ฅผ ๊ฒช์œผ๋ฉด์„œ, ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ €์˜ ํ•™์Šต ๋ฐฉ์‹์— ๋Œ€ํ•ด ๋Œ์•„๋ณด๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค..!

Webpack ๋ฒ„์ „์„ ์˜ฌ๋ฆฐ ํ›„์—๋„ ๋‹ค๋ฅธ ์ž‘์—…์— ๊ธ‰๊ธ‰ํ•ด ์ค‘์š”ํ•œ ๋ณ€ํ™”๋ฅผ ๋ฏธ์ฒ˜ ํ™•์ธํ•˜์ง€ ์•Š์•˜๋˜ ๊ฒƒ์ด ์›์ธ์ด์—ˆ์œผ๋‹ˆ๊นŒ์š”.

 

Allini ํ”„๋กœ์ ํŠธ๋Š” ํŒ€์›๋“ค์˜ ํšŒ์‚ฌ ์—…๋ฌด๋กœ ์ธํ•ด ์ž ์‹œ ์ค‘๋‹จ๋˜์—ˆ์—ˆ์ง€๋งŒ, ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

ํ˜„์žฌ๋Š” ๋””์ž์ด๋„ˆ๋‹˜์ด ์š”์ฒญํ•œ ์ˆ˜์ •๋œ UI๋ฅผ ๋น ๋ฅด๊ฒŒ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ, ์ด ๋ถ€๋ถ„๋ถ€ํ„ฐ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 

๊ทธ๋ ‡๊ธฐ์— Webpack 5 ๋ฒ„์ „์— ๋งž์ถ˜ ์ „์ฒด์ ์ธ ์„ค์ • ์ˆ˜์ •์€ ํ”„๋กœ์ ํŠธ๊ฐ€ ์™„์„ฑ๋œ ํ›„์— ์ง„ํ–‰ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์šฐ์„ ์€ ํ”„๋กœ์ ํŠธ์˜ ์™„์„ฑ๋„๋ฅผ ๋†’์ด๋Š” ๋ฐ ์ง‘์ค‘ํ•˜๊ณ , ์ž‘์—… ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋“ค์€ ํ•˜๋‚˜์”ฉ ํ•ด๊ฒฐํ•ด ๋‚˜๊ฐˆ ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

 

ํ”„๋กœ์ ํŠธ๊ฐ€ ๋งˆ๋ฌด๋ฆฌ๋˜๋ฉด, CSS ํŒŒ์ผ์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ถ”์ถœํ•˜๊ธฐ ์œ„ํ•œ MiniCssExtractPlugin ๋“ฑ์˜ ๋ฆฌํŒฉํ† ๋ง๋„ ์ง„ํ–‰ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

์ด ๊ณผ์ •์—์„œ ์ž‘์„ฑ๋œ ์ตœ์ข… ์ฝ”๋“œ๋„ ๋‚˜์ค‘์— ๋ธ”๋กœ๊ทธ์— ๊ณต์œ ํ•  ์˜ˆ์ •์ด๋‹ˆ, ๊ธฐ๋Œ€ํ•ด ์ฃผ์„ธ์š”! ๐Ÿ’ช

 

๐Ÿ“ƒ ์ฐธ๊ณ  ๋ฌธํ—Œ  
Webpack Asset Modules ๊ณต์‹๋ฌธ์„œ ์›๋ฌธ
Webpack Asset Modules ๊ณต์‹๋ฌธ์„œ ๋ฒˆ์—ญ

 

React.js์™€ Next.js ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋˜ ์ค‘, ์ฒ˜์Œ ๊ฐœ๋ฐœ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ๊ณ ๋ฏผํ–ˆ๋˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•ด ๋‹ค์‹œ ํ•œ๋ฒˆ ์ •๋ฆฌํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ณผ๊ฑฐ์—๋Š” ์ด๋“ค์„ ์™„์„ฑ๋œ ๋กœ๋ด‡๊ณผ ์กฐ๋ฆฝํ˜• ๋กœ๋ด‡์— ๋น„์œ ํ•˜๊ณค ํ–ˆ์ง€๋งŒ, ์ง€๊ธˆ์€ ๋‹ค๋ฅด๊ฒŒ ์ ‘๊ทผํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ์— ์•ž์„œ ๊ธ€ ์ œ๋ชฉ๊ณผ ๊ฐ™์ด React.js์— ๋Œ€ํ•ด "๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ๋ฌด์—‡์ธ์ง€" ํ˜ผ๋™ํ•˜๋Š” ๋ถ„๋“ค์ด ๊ณ„์‹ค๊นŒ์š”?

https://ko.legacy.reactjs.org/

 

๊ทธ๋ ‡๋‹ค๋ฉด ๊ณต์‹ ๋ฌธ์„œ๋ถ€ํ„ฐ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

๊ณต์‹ ๋ฌธ์„œ์˜ ๋ฉ”์ธ ํŽ˜์ด์ง€์—์„œ์กฐ์ฐจ "์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ" ๋ผ๋Š” ๋ฌธ๊ตฌ๋กœ ์šฐ๋ฆฌ๋ฅผ ํ™˜์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด ์ˆ˜๋งŽ์€ ์‚ฌ๋žŒ๋“ค์€ ๋„๋Œ€์ฒด ๋ฌด์—‡ ๋•Œ๋ฌธ์— ํ˜ผ๋™ํ•˜๊ฒŒ ๋œ ๊ฑธ๊นŒ์š”?

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•ด ๊ฐ„๋žตํžˆ ์„ค๋ช…๋“œ๋ฆฐ ํ›„ "React.js๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ผ๊นŒ?"  ๋ชฉ์ฐจ์—์„œ ๋‹ค์‹œ ํ•œ๋ฒˆ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 


๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ”„๋ ˆ์ž„์›Œํฌ๋ž€?

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

๊ฒ€์ƒ‰ ์‹œ ์‰ฝ๊ฒŒ ์•„๋ž˜์˜ ๋‚ด์šฉ๋“ค์„ ํ™•์ธํ•ด ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

"ํŠน์ •ํ•œ ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฏธ๋ฆฌ ์ž‘์„ฑ๋œ ์ฝ”๋“œ์˜ ์ง‘ํ•ฉ"

"๊ฐœ๋ฐœ์ž๊ฐ€ ํ•„์š”์— ๋”ฐ๋ผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ๋„๊ตฌ์ฒ˜๋Ÿผ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉ"

 

์ •๋ฆฌํ•ด ๋ณด์ž๋ฉด, ๋ฌด์–ธ๊ฐ€๋ฅผ ๋งŒ๋“ค ๋•Œ ์œ ์šฉํ•œ ๋„๊ตฌ ๊ฐ™์€ ์นœ๊ตฌ๋„ค์š”.

๋งˆ์น˜ ๋ฏธ์šฉ์‹ค์—์„œ ์“ฐ๋Š” ๋„๊ตฌ๋‚˜ ๊ณต์‚ฌ ํ˜„์žฅ์—์„œ ์“ฐ๋Š” ๋„๊ตฌ์ฒ˜๋Ÿผ, ํŠน์ •ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด ์ค๋‹ˆ๋‹ค.

๋“œ๋ผ์ด๊ธฐ๋กœ ๋จธ๋ฆฌ๋ฅผ ๋ง๋ฆด ํ•„์š”๋Š” ์—†์ง€๋งŒ, ํ•„์š”ํ•˜๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ด๋Ÿฐ ๋„๊ตฌ๋“ค์€ ํ•„์š”์— ๋งž๊ฒŒ ๊ณจ๋ผ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋ ˆ์ž„์›Œํฌ

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ณด๋‹ค ๋” ํฐ ๋‹จ์œ„์˜ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ์˜ ์˜ˆ์‹œ๋ฅผ ๊ฐ€์ ธ์™€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฏธ์šฉ์‹ค์—์„œ ๋จธ๋ฆฌ๋ฅผ ๋ง๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค ์ •ํ•ด์ฃผ๊ณ , ๊ทธ ์•ˆ์—์„œ ์ •ํ•ด์ง„ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•ด ๋จธ๋ฆฌ๋ฅผ ๋ง๋ฆฌ๋Š”(ํ•„์š”ํ•œ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋Š”) ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ Next.js๋Š” React.js๋ฅผ ๋ฒ ์ด์Šค๋กœ ํ•ด ์›น์„ ๋งŒ๋“œ๋Š”๋ฐ ํ•„์š”ํ•œ ์ „์ฒด์ ์ธ ํ•ด๊ฒฐ์ฑ…์„ ์ œ๊ณตํ•ด ์ค๋‹ˆ๋‹ค!

React.js์™€ Next.js์˜ ๊ด€๊ณ„

  • React.js๋Š” UI๋ฅผ ์„ ์–ธ์ ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Next.js๋Š” ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ์ „์ฒด์ ์ธ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•˜๋ฉฐ, React๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ํ”„๋ ˆ์ž„์›Œํฌ์™€ React,js, Next.js์— ๋Œ€ํ•ด ๊ฐ„๋žตํžˆ ์„ค๋ช…๋“œ๋ ธ์Šต๋‹ˆ๋‹ค.

์ด์ œ ๋ณธ๋ก ์œผ๋กœ ๋“ค์–ด๊ฐ€ ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

 

React.js๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ผ๊นŒ?

์ €๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ํ•™์Šต์—์„œ "ํ”„๋ ˆ์ž„์›Œํฌ ์—†๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ | ํ”„๋ž€์„ธ์Šค์ฝ” ์ŠคํŠธ๋ผ์ธจ๋กœ" ๊ต์žฌ์˜,

"ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์ฝ”๋“œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค"๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๊ฐ€์žฅ ์™€๋‹ฟ์•˜์Šต๋‹ˆ๋‹ค.

๊ต์žฌ๋ฅผ ํ•™์Šตํ•˜๋ฉฐ ํ•ด๋‹น ๋ฌธ๊ตฌ๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์ •๋ง ์ž˜ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์–ด์š”.

 

๋ฐœ์ทŒํ•œ ๋ฌธ์žฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์‹œ ์ •๋ฆฌํ•˜์ž๋ฉด,

  • ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‹คํ–‰ ํ๋ฆ„์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋‚˜๋ˆ ๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”!
์—ฌ๊ธฐ์„œ ์ฝ”๋“œ๋ž€ ๊ตฌ์ฒด์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

๋ฐœ์ทŒํ•œ ๋ฌธ์žฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ธ€์„ ์จ ๋‚ด๋ ค๊ฐˆ ์˜ˆ์ •์ด์—์š”.

์ฐธ๊ณ ํ•˜์—ฌ ์ฝ์œผ์‹ ๋‹ค๋ฉด ์ข€ ๋” ๋„์›€์ด ๋˜์‹ค ๊ฑฐ๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค!

๋‹ค์‹œ ๊ฐ•์กฐํ•˜์ž๋ฉด React.js๋Š” ๊ณต์‹์ ์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค.

์ด๋Š” React๊ฐ€ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ ์ €๋ฅผ ํฌํ•จํ•œ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์€ React๋ฅผ ํ”„๋ ˆ์ž„์›Œํฌ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด์œ ๊ฐ€ ๋ญ˜๊นŒ์š”?

 

์ด๋Š” ๋ฆฌ์•กํŠธ ์ƒํƒœ๊ณ„์™€ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๊ฐ•๋ ฅํ•œ ์˜ํ–ฅ๋ ฅ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
React๋Š” UI๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ, ์ƒํƒœ๊ณ„์˜ ๋ฐœ์ „๊ณผ ํ•จ๊ป˜ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด React๋ฅผ ์ด์šฉํ•ด ํ”„๋ ˆ์ž„์›Œํฌ์ฒ˜๋Ÿผ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์กฐํ™”ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 

 

์ด์ œ ์ง€๊ธˆ๊นŒ์ง€์˜ ๋‚ด์šฉ์„ ํ† ๋Œ€๋กœ ์‹ค์ œ ๊ฐœ๋ฐœ๊ณผ์ •์„ ์˜ˆ์‹œ๋กœ ๋“ค์–ด ๋‹ค์‹œ ํ•œ๋ฒˆ ์ •๋ฆฌํ•ด ๋ณด๋„๋ก ํ• ๊ฒŒ์š”!

 

์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ๋ ๊นŒ?

 

ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ, ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์‚ฌ์šฉ ๋ฐฉ์‹๊ณผ ๋ชฉ์ ์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

React๋ฅผ ํ”„๋ ˆ์ž„์›Œํฌ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ๋•Œ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ๋•Œ์˜ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•˜๋ฉด ๋” ๋‚˜์€ ์„ ํƒ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

React๋ฅผ ํ”„๋ ˆ์ž„์›Œํฌ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ๋•Œ

์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ์ƒํƒœ๊ณ„์˜ ์˜ํ–ฅ๋ ฅ

  • ๋ฆฌ์•กํŠธ๋Š” ์ดˆ๊ธฐ ์„ค์ •๊ณผ ๊ตฌ์กฐ๊ฐ€ ์ด๋ฏธ ์žกํ˜€์žˆ๋Š” ์ƒํƒœ์—์„œ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์€ ์ด๋ฅผ ํ”„๋ ˆ์ž„์›Œํฌ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, npm create-react-app์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ์ •ํ•ด์ง„ ๊ตฌ์กฐ ์•ˆ์—์„œ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ปดํฌ๋„ŒํŠธ ๋‚ด์˜ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ

  • ๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ปดํฌ๋„ŒํŠธ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, API ํ˜ธ์ถœ ๋“ฑ์„ ๋ชจ๋‘ ํฌํ•จ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ ๋ฆฌ์•กํŠธ๊ฐ€ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜์—ฌ ํ”„๋ ˆ์ž„์›Œํฌ์ฒ˜๋Ÿผ ๋А๊ปด์ง€๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ฆ‰, React ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ชจ๋“  ์‹คํ–‰ ํ๋ฆ„์„ ์ œ์–ดํ•˜๋ฉฐ, ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์žฅ์ :

  • ๋น ๋ฅธ ๊ฐœ๋ฐœ ์†๋„: ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— ํ†ตํ•ฉํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ๊ตฌ์กฐ๊ฐ€ ๋ช…ํ™•ํ•˜๊ณ  ์ผ๊ด€์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹จ์ :

  • ์˜์กด์„ฑ ์ฆ๊ฐ€: ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์— ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ์–ด, ๋ฆฌ์•กํŠธ๋ฅผ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋Œ€์ฒดํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
  • ์ด๋Š” ํ–ฅํ›„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹œ ํฐ ๋น„์šฉ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

React๋ฅผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ๋•Œ

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI ๋ Œ๋”๋ง์„ ๋ถ„๋ฆฌํ•˜๊ณ , ์ด ๋‘˜์„ ์—ฐ๊ฒฐํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‘๋Š” ๋ฐฉ๋ฒ•

 

์ƒํƒœ ๊ด€๋ฆฌ์™€ UI ์—…๋ฐ์ดํŠธ

  • ๋ฆฌ์•กํŠธ์—์„œ setState๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด UI๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋ฉ๋‹ˆ๋‹ค. ์ด ์ ์„ ํ™œ์šฉํ•˜์—ฌ, setState๋ฅผ UI๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์š”์†Œ๋กœ ๊ฐ„์ฃผํ•˜๊ณ , UI ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•œ ์‹œ์ ์—๋งŒ setState๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋Ÿฐ์‹์œผ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ๋ฆฌ์•กํŠธ์™€ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฆฌ์•กํŠธ๋Š” ์˜ค๋กœ์ง€ UI๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ์—ญํ• ๋งŒ ํ•˜๊ฒŒ ๋˜๋ฉฐ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ถ„๋ฆฌ

  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ํ“จ์–ดํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์„ฑํ•˜์—ฌ ๋ฆฌ์•กํŠธ์™€ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ํ†ตํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ UI์™€ ๋ณ„๊ฐœ๋กœ ์ž‘๋™ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

UI ๋ Œ๋”๋ง์—๋งŒ ์ง‘์ค‘

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

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•œ ํ†ต์‹ 

  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ํ†ต์‹ (์—ฐ๊ฒฐ)์„ ๋‹ด๋‹นํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ค๊ณ„ํ•˜์—ฌ, ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๋ฆฌ์•กํŠธ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜๊ณ , ํ•„์š”ํ•œ ์‹œ์ ์— ๋ฆฌ์•กํŠธ์˜ setState๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ UI๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ๊ตฌํ˜„ ์˜ˆ์‹œ

/**
* ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง - ์ˆœ์ˆ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค
*/
class BusinessLogic {
  constructor() {
    this.data = null;
    this.listeners = [];
  }

  setData(newData) {
    this.data = newData;
    this.notifyListeners();
  }

  getData() {
    return this.data;
  }

  addListener(listener) {
    this.listeners.push(listener);
  }

  notifyListeners() {
    this.listeners.forEach(listener => listener(this.data));
  }
}

/**
* ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ - UI ๋ Œ๋”๋ง
*/
import React, { useState, useEffect } from 'react';

const TestComp = ({ businessLogic }) => {
  const [data, setData] = useState(businessLogic.getData());

  useEffect(() => {
    const handleDataChange = (newData) => {
      setData(newData);
    };

    businessLogic.addListener(handleDataChange);

    return () => {
      businessLogic.removeListener(handleDataChange);
    };
  }, [businessLogic]);

  return (
    <div>
      <h1>{data}</h1>
    </div>
  );
};

/**
* ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ
*/
const logic = new BusinessLogic();
logic.setData("์ปคํ”ผ ๋งˆ์‹œ๊ณ ์‹ถ๋‹ค..");

const App = () => (
  <TestComp businessLogic={logic} />
);

export default App;

 

์žฅ์ 

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

๋‹จ์ 

  • ์‹ค์ œ ์‚ฌ๋ก€ ๋“œ๋ฌพ: ๋งŽ์€ ํšŒ์‚ฌ๋“ค์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ฒ˜๋Ÿผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์„ ์ฑ„ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐœ๋ฐœ ๋น„์šฉ๊ณผ ์‹œ๊ฐ„์ด ๋งŽ์ด ๋“ค๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ๋†’์€ ๊ฐœ๋ฐœ ๋น„์šฉ: ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ชจ๋“  ๊ฒƒ์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ด€๋ฆฌํ•˜๋ฉด ๊ฐœ๋ฐœ ๋น„์šฉ์ด ๋งŽ์ด ๋“ญ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ดˆ๊ธฐ ๋Ÿฐ์นญ์ด ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์•„๋ž˜์—์„œ ์ข€ ๋” ์ƒ์„ธํžˆ ์ €์˜ ์ƒ๊ฐ์„ ํ’€์–ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค.

์œ„์™€ ์ค‘๋ณต๋˜๋Š” ๋‚ด์šฉ์ด ์žˆ์ง€๋งŒ ํ๋ฆ„์„ ์œ„ํ•ด ๊ทธ๋Œ€๋กœ ์ ์–ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

 

๊ธฐ์ˆ  ๋ถ€์ฑ„์™€ ๊ทธ ๊ด€๋ฆฌ

์ €๋Š” ๊ธฐ์ˆ  ๋ถ€์ฑ„์— ๋Œ€ํ•ด ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๋‹จ๊ธฐ์ ์ธ ์ด์ต์„ ์œ„ํ•ด ์žฅ๊ธฐ์ ์ธ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์„ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ์„ ํƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด ๊ธฐ์ˆ  ๋ถ€์ฑ„์˜ ๊ฐœ๋…์€ "React.js์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐฉ์‹์˜ ๊ฒฐ์ •"์— ๋„์›€์„ ์ค„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•ด์š”!

 

๊ทธ๋ž˜์„œ ์ง€๊ธˆ๋ถ€ํ„ฐ React๋ฅผ ํ”„๋ ˆ์ž„์›Œํฌ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ๋•Œ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ๋•Œ์˜ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ๋น„๊ตํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ”„๋ ˆ์ž„์›Œํฌ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ๋•Œ์˜ ๊ธฐ์ˆ  ๋ถ€์ฑ„

  • ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์œผ๋กœ ์ธํ•ด ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ „ํ™˜์ด ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด React ์ปดํฌ๋„ŒํŠธ์— ๊นŠ์ด ๊ฒฐํ•ฉ๋˜์–ด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ๋•Œ์˜ ๊ธฐ์ˆ  ๋ถ€์ฑ„

  • ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ๋น„์šฉ์ด ๋†’์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ ๊ธฐ๋Šฅ์ด ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์–ด ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์ˆ  ๋ถ€์ฑ„ ๊ด€๋ฆฌ์˜ ์ค‘์š”์„ฑ

๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์˜ ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ์ผ์ •์— ๋งž๊ฒŒ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ž˜ ์กฐ์ •ํ•˜๋ฉด, ์žฅ๊ธฐ์ ์œผ๋กœ ๋” ๋‚˜์€ ์œ ์ง€๋ณด์ˆ˜์™€ ํ™•์žฅ์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋ฌด์—‡๋ณด๋‹ค ์ €๋Š” ๊ธฐ์ˆ  ๋ถ€์ฑ„๊ฐ€ ์ƒ๊ฒจ๋„ ์ฒญ์‚ฐ๋งŒ ์ž˜ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ž˜ ๋‚ด๋Š” ๊ฒƒ๋„ ์ €๋Š” ์ค‘์š”ํ•œ ๋Šฅ๋ ฅ์ด๋ผ๊ณ  ๋ณด๊ณ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž๊ฐ€ ์ด์œ ์ฝ”๋“œ๋งŒ ์ž‘์„ฑํ•˜๋Š” ์˜ˆ์ˆ ๊ฐ€๋Š” ์•„๋‹ˆ๋‹ˆ๊นŒ์š”.

๊ทธ๋Ÿฌ๋‹ˆ ๋ฌด์–ธ๊ฐ€๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋‹จ์ˆœํ•˜๊ฒŒ ์ •์˜๋œ ํŠน์ • ๋‹จ์–ด๋‚˜ ๋ฌธ์žฅ๋งŒ์„ ๋ฐ›์•„๋“ค์ด๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ์ƒ๋Œ€์ ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋น ๋ฅธ ์„ฑ์žฅ์— ์œ ๋ฆฌํ•˜์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

 


๊ฒฐ๋ก 

React๋Š” ๊ณต์‹์ ์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด์ง€๋งŒ, ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ํ”„๋ ˆ์ž„์›Œํฌ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์˜ ํŠน์„ฑ๊ณผ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ React๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉด์„œ, ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ ์ ˆํ•˜๊ฒŒ ํ™œ์šฉํ•˜๋ฉด ์„ฑ๊ณต์ ์ธ ๊ฐœ๋ฐœ์„ ์ด๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ๋Œ€์ ์œผ๋กœ ์‚ฌ๊ณ ํ•˜๊ณ , ์ƒํ™ฉ์— ๋งž๋Š” ์ตœ์„ ์˜ ์„ ํƒ์„ ํ•˜๋Š” ์Šต๊ด€์„ ๊ธฐ๋ฅด๋ฉด ๋”์šฑ ๋น ๋ฅด๊ฒŒ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค!

 

์—ฌ๋Ÿฌ๋ถ„๋“ค๊ป˜์„œ ์ด ๊ธ€์„ ์ฝ๊ณ  ๋‚œ ํ›„์—๋„, ๊ณ„์† ํ•™์Šตํ•˜๋ฉฐ ๋‹ค์–‘ํ•œ ์˜๊ฒฌ์„ ์ ‘ํ•˜๊ฒŒ ๋˜์‹œ๊ฒ ์ฃ ?!

์ž์‹ ๋“ค๋งŒ์˜ ๋‹จ์–ด๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๊ณ , ๊ฐœ๋ฐœ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๊ธธ์žก์ด ์—ญํ• ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ผ๋ฉฐ ์ด๋งŒ ๋งˆ์น˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

'CS' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Chrome ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง - Critical Path ์ด์ „ ๊ณผ์ •์€?  (0) 2024.03.20

+ Recent posts