[๐ŸŽ์ฝ”๋”ฉ์• ํ”Œ ๊ฐ•์˜์š”์•ฝ]์ฝ”๋“œ ๊ธธ์–ด์ง€๋ฉด import export ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค ๐Ÿ“ฆ

๐ŸŒˆ KJยท2025๋…„ 6์›” 3์ผ

codingapple

๋ชฉ๋ก ๋ณด๊ธฐ
17/23
post-thumbnail

์˜ค๋Š˜์˜ ํ•™์Šต ๋ชฉํ‘œ ๐ŸŽฏ

  1. ์ƒํ’ˆ๋ชฉ๋ก์„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค๊ธฐ
  2. ์ปดํฌ๋„ŒํŠธ์— ๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ
  3. ๋ฐ˜๋ณต์ ์ธ HTML์— map ๋ฐ˜๋ณต๋ฌธ ์‚ฌ์šฉํ•˜๊ธฐ

์ค‘์š”: JSX๋ฅผ exportํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์šฉ ํŒŒ์ผ์€ .js ๋ง๊ณ  .jsx๋กœ ๋งŒ๋“ค์–ด์•ผ Vite ํ™˜๊ฒฝ์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค! โš ๏ธ

์ƒํ’ˆ ๋ฐ์ดํ„ฐ ์ค€๋น„ ๐Ÿ“Š

์‹ค์ œ ์„œ๋น„์Šค์—์„œ๋Š” ์„œ๋ฒ„์—์„œ ๋ฐ›์•„์˜ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ์ค€๋น„ํ•ด๋ด…์‹œ๋‹ค:

[
  {
    id: 0,
    title: "White and Black",
    content: "Born in France",
    price: 120000
  },
  {
    id: 1,
    title: "Red Knit", 
    content: "Born in Seoul",
    price: 110000
  },
  {
    id: 2,
    title: "Grey Yordan",
    content: "Born in the States", 
    price: 130000
  }
]

๊ตฌ์กฐ ๋ถ„์„:

  • [array์ž๋ฃŒ]์— ์ƒํ’ˆ์ •๋ณด 3๊ฐœ๊ฐ€ ๋“ค์–ด์žˆ์Œ
  • ๊ฐ ์ƒํ’ˆ์ •๋ณด๋Š” {object์ž๋ฃŒ} ํ˜•ํƒœ
  • ์ถ•์•ฝํ•˜๋ฉด [{}, {}, {}] ๊ตฌ์กฐ

export default / import ๋ฌธ๋ฒ• ๐Ÿ“ค๐Ÿ“ฅ

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

data.js ํŒŒ์ผ:

let a = 10;
export default a;

App.jsx ํŒŒ์ผ:

import a from './data.js';
console.log(a); // 10 ์ถœ๋ ฅ

์‚ฌ์šฉ๋ฒ• ์š”์•ฝ

  • export default ๋ณ€์ˆ˜๋ช…; - ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฅธ ํŒŒ์ผ๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ
  • import ์ž‘๋ช… from './ํŒŒ์ผ๊ฒฝ๋กœ' - ๋‚ด๋ณด๋‚ธ ๋ณ€์ˆ˜ ๊ฐ€์ ธ์˜ค๊ธฐ

์œ ์˜์‚ฌํ•ญ โš ๏ธ

  • ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ์ž๋ฃŒํ˜• ์ „๋ถ€ export ๊ฐ€๋Šฅ
  • ํŒŒ์ผ๋งˆ๋‹ค export default๋Š” ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ํŒŒ์ผ๊ฒฝ๋กœ๋Š” ./๋ถ€ํ„ฐ ์‹œ์ž‘ (ํ˜„์žฌ ๊ฒฝ๋กœ ์˜๋ฏธ)

export { } / import { } ๋ฌธ๋ฒ• ๐Ÿ“ค๐Ÿ“ฅ

์—ฌ๋Ÿฌ ๊ฐœ ๋ณ€์ˆ˜ ๋‚ด๋ณด๋‚ด๊ธฐ

data.js ํŒŒ์ผ:

var name1 = 'Kim';
var name2 = 'Park';
export { name1, name2 };

App.jsx ํŒŒ์ผ:

import { name1, name2 } from './data.js';

ํŠน์ง•

  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ณ€์ˆ˜, ํ•จ์ˆ˜๋ฅผ ํ•œ ๋ฒˆ์— ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์Œ
  • ์ž์œ ์ž‘๋ช… ๋ถˆ๊ฐ€๋Šฅ - exportํ•œ ๋ณ€์ˆ˜๋ช… ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•จ

์ƒํ’ˆ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ„๋„ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜๊ธฐ ๐Ÿ“

๊ธธ๊ณ  ๋ณต์žกํ•œ state ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ํŒŒ์ผ์— ์ €์žฅํ•˜๊ณ  importํ•ด์™€์„œ ์‚ฌ์šฉ:

data.js:

let data = [
  {
    id: 0,
    title: "White and Black",
    content: "Born in France", 
    price: 120000
  },
  // ... ๋‚˜๋จธ์ง€ ๋ฐ์ดํ„ฐ
];

export default data;

App.jsx:

import data from './data.js';
import { useState } from 'react';

function App(){
  let [shoes] = useState(data);
  // ...
}

์ƒํ’ˆ ๋ฐ์ดํ„ฐ๋ฅผ HTML์— ๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ ๐Ÿ”—

importํ•ด์˜จ ์ƒํ’ˆ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์ œ ํ™”๋ฉด์— ํ‘œ์‹œ:

function App(){
  let [shoes] = useState(data);
  
  return (
    <div className="App">
      {/* ์ƒ๋žต */}
      <div className="container">
        <div className="row">
          <div className="col-md-4">
            <img src="https://codingapple1.github.io/shop/shoes1.jpg" width="80%" />
            <h4>{shoes[0].title}</h4>
            <p>{shoes[0].price}</p>
          </div>
          <div className="col-md-4">
            <img src="https://codingapple1.github.io/shop/shoes2.jpg" width="80%" />
            <h4>{shoes[1].title}</h4>
            <p>{shoes[1].price}</p>
          </div>
          <div className="col-md-4">
            <img src="https://codingapple1.github.io/shop/shoes3.jpg" width="80%" />
            <h4>{shoes[2].title}</h4>
            <p>{shoes[2].price}</p>
          </div>
        </div>
      </div>
    </div>
  )
}

๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๋ฐฉ๋ฒ•:

  • shoes[0].title - ์ฒซ ๋ฒˆ์งธ ์ƒํ’ˆ์˜ ์ œ๋ชฉ
  • shoes[0].price - ์ฒซ ๋ฒˆ์งธ ์ƒํ’ˆ์˜ ๊ฐ€๊ฒฉ

๋ณด์ถฉ ์„ค๋ช… ๐Ÿ’ก

ES6 ๋ชจ๋“ˆ ์‹œ์Šคํ…œ ์‹ฌํ™” ๐Ÿ”

1. Named Export vs Default Export

// Named Export (์—ฌ๋Ÿฌ ๊ฐœ ๊ฐ€๋Šฅ)
export const function1 = () => {};
export const function2 = () => {};

// Default Export (ํŒŒ์ผ๋‹น ํ•˜๋‚˜๋งŒ)
export default function MainFunction() {}

// ํ˜ผํ•ฉ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
export const helper = () => {};
export default MainComponent;

2. Import ๋ฐฉ์‹ ์กฐํ•ฉ

// Default + Named Import ํ˜ผํ•ฉ
import MainComponent, { helper, utils } from './module.js';

// ์ „์ฒด Import
import * as MyModule from './module.js';

// ๋ณ„์นญ ์‚ฌ์šฉ
import { longFunctionName as short } from './module.js';

ํŒŒ์ผ ๊ตฌ์กฐ ์ตœ์ ํ™” ๐Ÿ“

๊ถŒ์žฅ ํด๋” ๊ตฌ์กฐ:

src/
โ”œโ”€โ”€ components/
โ”‚   โ”œโ”€โ”€ ProductCard.jsx
โ”‚   โ””โ”€โ”€ Navbar.jsx
โ”œโ”€โ”€ data/
โ”‚   โ”œโ”€โ”€ products.js
โ”‚   โ””โ”€โ”€ constants.js
โ”œโ”€โ”€ utils/
โ”‚   โ””โ”€โ”€ helpers.js
โ””โ”€โ”€ App.jsx

์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ ์ „๋žต ๐Ÿงฉ

1. ProductCard ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ

// components/ProductCard.jsx
export default function ProductCard({ product, index }) {
  return (
    <div className="col-md-4">
      <img src={`https://codingapple1.github.io/shop/shoes${index + 1}.jpg`} width="80%" />
      <h4>{product.title}</h4>
      <p>{product.price.toLocaleString()}์›</p>
    </div>
  );
}

2. map() ํ•จ์ˆ˜๋กœ ๋ฐ˜๋ณต ๋ Œ๋”๋ง

// App.jsx
import ProductCard from './components/ProductCard';

function App() {
  const [shoes] = useState(data);
  
  return (
    <div className="container">
      <div className="row">
        {shoes.map((product, index) => (
          <ProductCard 
            key={product.id} 
            product={product} 
            index={index}
          />
        ))}
      </div>
    </div>
  );
}

๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ํŒจํ„ด ๐Ÿ“Š

1. ํƒ€์ž… ์ •์˜ (TypeScript ์‚ฌ์šฉ ์‹œ)

interface Product {
  id: number;
  title: string;
  content: string;
  price: number;
  image?: string;
  category?: string;
}

2. ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ํ•จ์ˆ˜

// utils/validation.js
export const validateProduct = (product) => {
  const required = ['id', 'title', 'price'];
  return required.every(field => product[field] !== undefined);
};

3. ๋ฐ์ดํ„ฐ ํฌ๋งทํŒ… ์œ ํ‹ธ๋ฆฌํ‹ฐ

// utils/formatters.js
export const formatPrice = (price) => {
  return new Intl.NumberFormat('ko-KR', {
    style: 'currency',
    currency: 'KRW'
  }).format(price);
};

export const formatProductForDisplay = (product) => ({
  ...product,
  formattedPrice: formatPrice(product.price),
  shortTitle: product.title.length > 20 
    ? product.title.substring(0, 20) + '...' 
    : product.title
});

์„ฑ๋Šฅ ์ตœ์ ํ™” ํŒ โšก

1. React.memo ์‚ฌ์šฉ

import React from 'react';

const ProductCard = React.memo(({ product, index }) => {
  return (
    // ์ปดํฌ๋„ŒํŠธ ๋‚ด์šฉ
  );
});

2. useMemo๋กœ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ ์บ์‹ฑ

import { useMemo } from 'react';

function ProductList({ products }) {
  const sortedProducts = useMemo(() => {
    return products.sort((a, b) => a.price - b.price);
  }, [products]);
  
  return (
    // ๋ Œ๋”๋ง
  );
}

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