ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ž€

date
2025-10-19
order
1

ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ž€?

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

ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ํ•ญ๋ชฉ

  • ํŠน์ • ์ƒํƒœ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ์กฐํ•ฉ
  • API์™€ ํ•จ๊ป˜ ์ƒํ˜ธ์ž‘์šฉ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ์กฐํ•ฉ
  • ๋‹จ์ˆœ UI ๋ Œ๋”๋ง ๋ฐ ๊ฐ„๋‹จํ•œ ๋กœ์ง์„ ์‹คํ–‰ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ(๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜์ง€ ์•Š์•˜๋˜) ๊ฐ€ ์ œ๋Œ€๋กœ ๋ Œ๋”๋ง ๋˜๋Š”์ง€ ํ•œ๋ฒˆ์— ๊ฒ€์ฆ

์˜ˆ์‹œ

์ˆ˜์—… ์ž๋ฃŒ์˜ ProductList์™€ ProductCard ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณด์ž.

const ProductCard = ({
  product,
  onClickAddCartButton,
  onClickPurchaseButton,
}) => {
 const navigate = useNavigate();

  if (!product) {
    return null;
  }

  const { title, images, price, category, id } = product;

  const handleClickItem = () => {
    navigate(pathToUrl(pageRoutes.productDetail, { productId: id }));
  };
  
  const handleClickAddCartButton = ev => {
    onClickAddCartButton(ev, product);
  };
  
  const handleClickPurchaseButton = ev => {
    onClickPurchaseButton(ev, product);
  };
  
  return (.....);
};

ํ”„๋กœ๋•ํŠธ ์นด๋“œ๋Š” ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋Š” ํ”„๋กœ๋•ํŠธ๋ฆฌ์ŠคํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ „๋‹ฌ๋ฐ›์€ prop๋“ค(product ๊ฐ์ฒด, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋“ค)์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

  • ๋‹จ์œ„ํ…Œ์ŠคํŠธ์—์„œ๋Š” ๊ฐ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋“ค์ด ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ํ˜ธ์ถœ ๋˜๋Š”์ง€ ์—ฌ๋ถ€๋งŒ ๊ฒ€์ฆ ๊ฐ€๋Šฅํ–ˆ๋‹ค.
  • ์‹ค์ œ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ์˜ ๋™์ž‘์€ ๊ฒ€์ฆ ๋ถˆ๊ฐ€๋Šฅํ–ˆ๋‹ค.
  • ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๋™์ž‘์ด๋ž€ ์ •๋ง ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ˆซ์ž๊ฐ€ ๋Š˜์–ด๋‚˜๋Š”์ง€ ๋“ฑ์„ ์˜๋ฏธ
const ProductList = ({ limit = PRODUCT_PAGE_LIMIT }) => {
	...
	...
	
	const products =
    data?.pages.reduce((acc, cur) => [...acc, ...cur.products], []) ?? [];

  const handleClickCart = (ev, product) => {
    ev.stopPropagation();
    if (isLogin) {
      addCartItem(product, user.id, 1);
      toast.success(`${product.title} ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ถ”๊ฐ€ ์™„๋ฃŒ!`, { id: TOAST_ID });
    } else {
      navigate(pageRoutes.login);
    }
  };
  
  const handleClickPurchase = (ev, product) => {
    ev.stopPropagation();
    if (isLogin) {
      addCartItem(product, user.id, 1);
      navigate(pageRoutes.cart);
    } else {
      navigate(pageRoutes.login);
    }
  };
	return (
	    <Grid container spacing={1} rowSpacing={1} justifyContent="center">
	      {products.map((product, index) => (
	        <ProductCard
	          key={`${product.id}_${index}`}
	          product={product}
	          onClickAddCartButton={handleClickCart}
	          onClickPurchaseButton={handleClickPurchase}
	        />
			))}
		...
		...
	);
};

๋จผ์ € ProductCard๋ฅผ ๋‹จ์œ„ํ…Œ์ŠคํŠธ ํ–ˆ์„ ๋•Œ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š” ํ•ญ๋ชฉ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค :

  1. prop ๊ธฐ์ค€์œผ๋กœ ์ œํ’ˆ ์ •๋ณด๊ฐ€(price, name ..) ์ œ๋Œ€๋กœ ๋ Œ๋”๋ง ๋˜๋Š”์ง€
  2. ์ƒํ’ˆ์„ ํด๋ฆญ ํ–ˆ์„ ๋•Œ(handleClickItem) navigate ๋ชจํ‚น์„ ํ†ตํ•ด ์ƒ์„ธํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•˜๋Š”์ง€
  3. ์žฅ๋ฐ”๊ตฌ๋‹ˆ, ๊ตฌ๋งค ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ spy ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ฐ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ๋˜๋Š”์ง€
    • ํ˜ธ์ถœ์ด ๋˜๋Š”์ง€๋Š” ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•  ์ˆ˜ ์—†๋‹ค.

๋ฐ˜๋ฉด ProductList๋ฅผ ํ†ตํ•ฉํ…Œ์ŠคํŠธ ํ–ˆ์„ ๋•Œ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š” ํ•ญ๋ชฉ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค :

  1. ์ƒํ’ˆ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ api์— ๋งž๊ฒŒ ์ƒํ’ˆ ์ •๋ณด ๊ฐ€ ์ œ๋Œ€๋กœ ๋ Œ๋”๋ง ๋˜๋Š”์ง€
  2. ์ƒํ’ˆ์„ ํด๋ฆญ ํ–ˆ์„ ๋•Œ navigate ๋ชจํ‚น์„ ํ†ตํ•ด ์ƒ์„ธํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•˜๋Š”์ง€
  3. ์žฅ๋ฐ”๊ตฌ๋‹ˆ ํ˜น์€ ๊ตฌ๋งค ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ ํ•˜๋Š”์ง€
    • ๋กœ๊ทธ์ธ : ์ƒํ’ˆ ์ถ”๊ฐ€ ํ›„ ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋กœ ์ด๋™
    • ๋น„๋กœ๊ทธ์ธ : ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™
  4. ์ƒํ’ˆ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋” ์žˆ๋Š” ๊ฒฝ์šฐ show more ๋ฒ„ํŠผ์ด ๋…ธ์ถœ๋˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋” ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š”์ง€

์œ„์˜ ๋‘ ํ•ญ๋ชฉ๋“ค์„ ๋น„๊ตํ•ด๋ณด๋ฉด 1,2,3๋ฒˆ์€ ์ค‘๋ณต๋œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. (ํ†ต1,2,3 ์ด ์„ฑ๊ณตํ•œ๋‹ค๋Š”๊ฒƒ์€ ๋‹จ1,2,3 ์ด ์„ฑ๊ณตํ•จ์„ ํ•จ์˜ํ•œ๋‹ค) ๊ทธ๋ž˜์„œ ํ”„๋กœ๋•ํŠธ ์นด๋“œ์— ๋Œ€ํ•œ ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜์ง€ ์•Š๊ณ  ํ”„๋กœ๋•ํŠธ๋ฆฌ์ŠคํŠธ์˜ ํ†ตํ•ฉํ…Œ์ŠคํŠธ์—์„œ ํ•œ๋ฒˆ์— ๊ฒ€์ฆํ•˜๋Š”๊ฒƒ์ด ๋” ํšจ์œจ์ ์ด๋‹ค.