๋ฐ๋๋ผ JS๋ก ์งํํ๋ ํ๋ก์ ํธ์์ ์ฝ๋์ ๊ตฌ์กฐํ์ ๋ชจ๋ํ๊ฐ ํ์ํ ์ํฉ์ด์๋ค.
๊ธฐ๋ณธ์ ์ธ ์ํ ๋ฆฌ์คํธ์ ์์ธ ๋ชจ๋ฌ์ ๋ณด์ฌ์ฃผ๋ ์นํ์ด์ง์ธ์ง๋ผ app.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 # ์ฑ์ ์ง์
์
๊ฐ ๋๋ ํ ๋ฆฌ์ ์ฃผ์ ์ญํ :
src/
โโโ assets/ # ์ ์ ๋ฆฌ์์ค
โโโ components/ # UI ์ปดํฌ๋ํธ
โโโ constants/ # ์์๊ฐ
โโโ services/ # API ํต์
โโโ utils/ # ์ ํธ๋ฆฌํฐ ํจ์
โโโ main.js # ์ง์
์
// src/constants/config.js
export const BASE_IMAGE_URL = "https://image.tmdb.org/t/p/w500";
// 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);
};
};
// 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";
}
}
์ด๊ธฐํ ๋จ๊ณ
๋ฐ์ดํฐ ํ๋ฆ
์ฌ์ฉ์ ์ธํฐ๋์