๐Ÿ“– TIL - ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๋ฒ•: ๋ฐ”๋‹๋ผ JS ๋ชจ๋“ˆํ™” ์ „๋žต ๐Ÿ

์Š˜ยท2025๋…„ 1์›” 15์ผ

๐Ÿ“– TIL

๋ชฉ๋ก ๋ณด๊ธฐ
26/90

๐Ÿ“Œ ๋ฌธ์ œ ์„ค๋ช…

๋ฐ”๋‹๋ผ JS๋กœ ์ง„ํ–‰ํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์ฝ”๋“œ์˜ ๊ตฌ์กฐํ™”์™€ ๋ชจ๋“ˆํ™”๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ์ด์˜€๋‹ค.
๊ธฐ๋ณธ์ ์ธ ์˜ํ™” ๋ฆฌ์ŠคํŠธ์™€ ์ƒ์„ธ ๋ชจ๋‹ฌ์„ ๋ณด์—ฌ์ฃผ๋Š” ์›นํŽ˜์ด์ง€์ธ์ง€๋ผ app.js์™€ api.js๋กœ๋งŒ ๊ตฌ์„ฑํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜์˜€๋Š”๋ฐ.. ๋ชจ๋“ˆํ™”์™€ ๊ตฌ์กฐํ™”๋„ ๋‹ค๋ฃจ์–ด๋ณด๋ฉด ์ข‹์„ ๋“ฏํ•˜์—ฌ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ์ „๋žต์„ ์งœ๋ณด์•˜๋‹ค.

๊ธฐ์กด ์ƒํƒœ

  • main.js์™€ api.js๋กœ๋งŒ ๋ถ„๋ฆฌ๋œ ๋‹จ์ˆœํ•œ ๊ตฌ์กฐ
  • ์ปดํฌ๋„ŒํŠธ๋ณ„ ์ฑ…์ž„๊ณผ ์—ญํ• ์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์Œ
  • ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ๊ณผ ์œ ์ง€๋ณด์ˆ˜์˜ ์–ด๋ ค์›€

์ผ๋ฐ˜์ ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ ๋ช…

src/
โ”œโ”€โ”€ assets/        # ์ด๋ฏธ์ง€, ํฐํŠธ, ์Šคํƒ€์ผ ๋“ฑ ์ •์  ๋ฆฌ์†Œ์Šค
โ”œโ”€โ”€ components/    # UI ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ชจ์•„๋‘” ๋””๋ ‰ํ† ๋ฆฌ
โ”œโ”€โ”€ constants/     # ์ƒ์ˆ˜ ๊ฐ’๋“ค์„ ๋ชจ์•„๋‘” ๋””๋ ‰ํ† ๋ฆฌ
โ”œโ”€โ”€ contexts/      # Context API ๊ด€๋ จ ํŒŒ์ผ (React)
โ”œโ”€โ”€ hooks/         # ์ปค์Šคํ…€ ํ›… (React)
โ”œโ”€โ”€ layouts/       # ํŽ˜์ด์ง€ ๋ ˆ์ด์•„์›ƒ ์ปดํฌ๋„ŒํŠธ
โ”œโ”€โ”€ lib/           # ์จ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์ •
โ”œโ”€โ”€ mocks/         # ํ…Œ์ŠคํŠธ์šฉ ๋ชฉ์—… ๋ฐ์ดํ„ฐ
โ”œโ”€โ”€ modules/       # ๋„๋ฉ”์ธ๋ณ„ ๋กœ์ง ๋ชจ์Œ
โ”œโ”€โ”€ pages/         # ํŽ˜์ด์ง€ ๋‹จ์œ„ ์ปดํฌ๋„ŒํŠธ
โ”œโ”€โ”€ services/      # ์™ธ๋ถ€ ์„œ๋น„์Šค(API) ํ†ต์‹  ๊ด€๋ จ ๋””๋ ‰ํ† ๋ฆฌ
โ”œโ”€โ”€ store/         # ์ƒํƒœ ๊ด€๋ฆฌ (Redux, Vuex ๋“ฑ)
โ”œโ”€โ”€ styles/        # ์Šคํƒ€์ผ ๊ด€๋ จ ํŒŒ์ผ
โ”œโ”€โ”€ types/         # ํƒ€์ž… ์ •์˜ (TypeScript)
โ”œโ”€โ”€ utils/         # ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋“ค์„ ๋ชจ์•„๋‘” ๋””๋ ‰ํ† ๋ฆฌ
โ””โ”€โ”€ main.js        # ์•ฑ์˜ ์ง„์ž…์ 

๊ฐ ๋””๋ ‰ํ† ๋ฆฌ์˜ ์ฃผ์š” ์—ญํ• :

  • assets/: ์ด๋ฏธ์ง€, ํฐํŠธ, ๋น„๋””์˜ค ๋“ฑ ์ •์  ํŒŒ์ผ๋“ค์„ ๋ณด๊ด€
  • components/: ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ UI ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ณด๊ด€
  • constants/: ์•ฑ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ƒ์ˆ˜๊ฐ’๋“ค์„ ์ •์˜
  • contexts/: React์˜ Context API ๊ด€๋ จ ํŒŒ์ผ๋“ค์„ ๋ณด๊ด€
  • hooks/: React์˜ ์ปค์Šคํ…€ ํ›…๋“ค์„ ๋ณด๊ด€
  • layouts/: ๊ณตํ†ต ๋ ˆ์ด์•„์›ƒ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ณด๊ด€
  • lib/: ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์ • ํŒŒ์ผ๋“ค์„ ๋ณด๊ด€
  • mocks/: ๊ฐœ๋ฐœ/ํ…Œ์ŠคํŠธ์šฉ ๋”๋ฏธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€
  • modules/: ํŠน์ • ๋„๋ฉ”์ธ๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“  ํŒŒ์ผ๋“ค์„ ๋ณด๊ด€
  • pages/: ๋ผ์šฐํŠธ์— ๋Œ€์‘๋˜๋Š” ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ณด๊ด€
  • services/: API ํ†ต์‹  ๊ด€๋ จ ๋กœ์ง์„ ๋ณด๊ด€
  • store/: ์ƒํƒœ ๊ด€๋ฆฌ(Redux ๋“ฑ) ๊ด€๋ จ ํŒŒ์ผ๋“ค์„ ๋ณด๊ด€
  • styles/: ๊ธ€๋กœ๋ฒŒ ์Šคํƒ€์ผ, ํ…Œ๋งˆ ๋“ฑ ์Šคํƒ€์ผ ๊ด€๋ จ ํŒŒ์ผ์„ ๋ณด๊ด€
  • types/: TypeScript ํƒ€์ž… ์ •์˜ ํŒŒ์ผ๋“ค์„ ๋ณด๊ด€
  • utils/: ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋“ค์„ ๋ณด๊ด€
  • main.js: ์•ฑ์˜ ์ง„์ž…์ 

๐Ÿ’ก ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ ์„ค๊ณ„

src/
โ”œโ”€โ”€ assets/        # ์ •์  ๋ฆฌ์†Œ์Šค
โ”œโ”€โ”€ components/    # UI ์ปดํฌ๋„ŒํŠธ
โ”œโ”€โ”€ constants/     # ์ƒ์ˆ˜๊ฐ’
โ”œโ”€โ”€ services/      # API ํ†ต์‹ 
โ”œโ”€โ”€ utils/         # ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜
โ””โ”€โ”€ main.js        # ์ง„์ž…์ 

๐Ÿ” ์ฝ”๋“œ ์„ค๋ช…

1. ์ƒ์ˆ˜๊ฐ’ ๊ด€๋ฆฌ (constants)

// src/constants/config.js
export const BASE_IMAGE_URL = "https://image.tmdb.org/t/p/w500";

2. ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜ (utils)

// src/utils/storage.js
export const getFromStorage = (key) => JSON.parse(localStorage.getItem(key));
export const setToStorage = (key, value) => 
    localStorage.setItem(key, JSON.stringify(value));

// src/utils/throttle.js
export const throttle = (func, delay) => {
  let timer;
  return (...args) => {
    clearTimeout(timer);
    timer = setTimeout(() => func.apply(this, args), delay);
  };
};

3. ์ปดํฌ๋„ŒํŠธ ์„ค๊ณ„ (components)

// src/components/MovieList.js
export class MovieList {
  constructor(selector) {
    this.$element = document.querySelector(selector);
  }
  
  render(data) {
    // ์˜ํ™” ๋ชฉ๋ก ๋ Œ๋”๋ง ๋กœ์ง
  }
}

// src/components/Loading.js
export class Loading {
  constructor(selector) {
    this.$element = document.querySelector(selector);
  }
  
  toggle(show) {
    this.$element.style.display = show ? "block" : "none";
  }
}

โœจ ์ƒˆ๋กญ๊ฒŒ ๋ฐฐ์šด ์ 

1. ๋ชจ๋“ˆํ™”์˜ ์ด์ 

  • ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ ํ–ฅ์ƒ
  • ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด์„ฑ
  • ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ
  • ์ฑ…์ž„๊ณผ ์—ญํ• ์˜ ๋ช…ํ™•ํ•œ ๋ถ„๋ฆฌ

2. ์›Œํฌํ”Œ๋กœ์šฐ ์„ค๊ณ„

  1. ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„

    • App ํด๋ž˜์Šค์—์„œ ์ปดํฌ๋„ŒํŠธ ์ดˆ๊ธฐํ™”
    • ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ฐ”์ธ๋”ฉ
    • ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ ๋กœ๋“œ
  2. ๋ฐ์ดํ„ฐ ํ๋ฆ„

    • API ์š”์ฒญ ์ฒ˜๋ฆฌ (services)
    • ๋ฐ์ดํ„ฐ ๋ Œ๋”๋ง (components)
    • ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ ๊ด€๋ฆฌ (utils)
  3. ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜

    • ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
    • ์ƒํƒœ ๊ด€๋ฆฌ
    • UI ์—…๋ฐ์ดํŠธ

๐Ÿš€ ์ด๋Ÿฐ ์ ์ด ํšจ์œจ์ ์ด์—์š”

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

โญ๏ธ ์ฐธ๊ณ  ์ž๋ฃŒ

profile
์ฃผ๋‹ˆ์–ด ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ์žฅ๊ธฐ ๊ธฐ๋ก๊ธฐ๋ก

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