Published:

Last Updated:

์ฟ ํŒก ์ƒํ’ˆ ์ž๋™ ๋…ธ์ถœ ๋ฐฉ๋ฒ•

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


๋ธ”๋กœ๊ทธ ์ฝ˜ํ…์ธ ์™€ ์™„๋ฒฝํžˆ ์ผ์น˜ํ•˜๋Š” ์ฟ ํŒก ์ƒํ’ˆ์„ ์ž๋™์œผ๋กœ ๋…ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ๋” ์ด์ƒ ์ผ์ผ์ด ์ƒํ’ˆ ๋งํฌ๋ฅผ ์‚ฝ์ž…ํ•˜๋А๋ผ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด ์‹œ์Šคํ…œ์€ ๊ธ€ ์ œ๋ชฉ(h1)์ด๋‚˜ ์ง€์ • ํƒœ๊ทธ(p class="shoptag")๋ฅผ ์ •๊ตํ•˜๊ฒŒ ๋ถ„์„ํ•˜์—ฌ, ํ•ด๋‹น ์ฝ˜ํ…์ธ ์™€ ๊ฐ€์žฅ ๊ด€๋ จ์„ฑ ๋†’์€ ์ƒํ’ˆ์„ ์Šค๋งˆํŠธํ•˜๊ฒŒ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

1. ์ฃผ์š” ๊ธฐ๋Šฅ ๋ฐ ์žฅ์ 

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

2. ์ฟ ํŒก ์ƒํ’ˆ ์ž๋™ํ™” ์ ์šฉ ๋ฐฉ๋ฒ• (7๋‹จ๊ณ„)

1๋‹จ๊ณ„: ํด๋ผ์ด์–ธํŠธ ์Šคํฌ๋ฆฝํŠธ ์„ค์น˜

์•„๋ž˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ธ”๋กœ๊ทธ ์Šคํ‚จ์˜ body ํ•˜๋‹จ์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

script
const API_URL = 'https://๋ณธ์ธ์˜_์•ฑ์Šค_์Šคํฌ๋ฆฝํŠธ_URL';
const DEFAULT_LIMIT = 3;

document.addEventListener('DOMContentLoaded', function () {
 const path = window.location.pathname;
 if (path === '/' || path.startsWith('/category')) return;
 searchProductsAndInsert();
});

function searchProductsAndInsert() {
 const tagElement = document.querySelector('p.shoptag');
 const h1Element = document.querySelector('h1');
 let keyword = tagElement?.textContent.trim() || h1Element?.textContent.split('-')[0].trim();

 if (!keyword) return;

 const resultsContainer = document.createElement('div');
 resultsContainer.id = 'coupangProductContainer';
 const firstH3 = document.querySelector('h3');
 if (firstH3) firstH3.parentNode.insertBefore(resultsContainer, firstH3.nextSibling);

 fetch(`${API_URL}?keyword=${encodeURIComponent(keyword)}&limit=${DEFAULT_LIMIT}`)
 .then(res = res.json())
 .then(data = {
 if (data.data?.productData) {
 displayResults(data.data.productData, resultsContainer);
 addAffiliateDisclaimer(resultsContainer);
 }
 });
}

function displayResults(products, container) {
 products.forEach(p = {
 const card = document.createElement('div');
 card.className = 'product-card';
 card.innerHTML = `
 img src="${p.productImage}" class="product-image"
 div class="product-title"${p.productName}/div
 div class="product-price"${p.productPrice.toLocaleString()}์›/div
 a href="${p.productUrl}" target="_blank" class="product-link"์ฟ ํŒก์—์„œ ๋ณด๊ธฐ/a`;
 container.appendChild(card);
 });
}

function addAffiliateDisclaimer(container) {
 const p = document.createElement('p');
 p.className = 'coupang-disclaimer';
 p.textContent = 'โ€ป ์ด ๊ด‘๊ณ ๋Š” ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค.';
 container.after(p);
}
/script

2๋‹จ๊ณ„: ์„ค์ • ํ•ญ๋ชฉ ๊ฐ€์ด๋“œ

ํ•ญ๋ชฉ ์„ค๋ช… ์‚ฌ์šฉ ์˜ˆ์‹œ
API_URL ๊ตฌ๊ธ€ ์•ฑ์Šค ์Šคํฌ๋ฆฝํŠธ ๋ฐฐํฌ ์ฃผ์†Œ https://script.google.com/.../exec
shoptag ์ˆ˜๋™ ํ‚ค์›Œ๋“œ ์ง€์ • ํƒœ๊ทธ p class="shoptag"์—์–ดํ”„๋ผ์ด์–ด/p

3. ๊ตฌ๊ธ€ ์•ฑ์Šค ์Šคํฌ๋ฆฝํŠธ(Backend) ์—ฐ๋™

์ฟ ํŒก API ํ†ต์‹ ์„ ์œ„ํ•œ ์„œ๋ฒ„ ์ธก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ๋ณธ์ธ์˜ API Key๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”.

const COUPANG_ACCESS_KEY = "YOUR_ACCESS_KEY";
const COUPANG_SECRET_KEY = "YOUR_SECRET_KEY";

function doGet(e) {
 const keyword = e.parameter.keyword;
 const limit = e.parameter.limit || 3;
 const result = fetchCoupangProducts(limit, keyword);
 return ContentService.createTextOutput(JSON.stringify(result))
 .setMimeType(ContentService.MimeType.JSON);
}

// (์ƒ์„ธ API ํ˜ธ์ถœ ๋กœ์ง์€ ๊ธฐ์กด ๊ฐ€์ด๋“œ์™€ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€)

4. ๋ฐ˜์‘ํ˜• ๋””์ž์ธ ์Šคํƒ€์ผ (CSS)

๋‹คํฌ ๋ชจ๋“œ์™€ ๋ผ์ดํŠธ ๋ชจ๋“œ์— ์ตœ์ ํ™”๋œ ๋ฐ˜์‘ํ˜• ์นด๋“œ ์Šคํƒ€์ผ์ž…๋‹ˆ๋‹ค.

#coupangProductContainer { display: flex; gap: 20px; flex-wrap: wrap; }
.product-card { flex: 1 1 calc(33.3% - 20px); border: 1px solid #ddd; padding: 10px; border-radius: 8px; text-align: center; }
@media (max-width: 768px) {
 #coupangProductContainer { flex-wrap: nowrap; overflow-x: auto; scroll-snap-type: x mandatory; }
 .product-card { flex: 0 0 80%; }
}

์งˆ๋ฌธ 1: ์ฟ ํŒก ์ž๋™ ์ƒํ’ˆ ๋…ธ์ถœ ์‹œ์Šคํ…œ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋‚˜์š”?

๋ธ”๋กœ๊ทธ ๊ธ€์˜ ์ œ๋ชฉ(h1)์ด๋‚˜ ์ˆ˜๋™ ์ง€์ • ํƒœ๊ทธ(p class="shoptag")๋ฅผ ๋ถ„์„ํ•ด ํ•ด๋‹น ์ฝ˜ํ…์ธ ์™€ ๊ฐ€์žฅ ๊ด€๋ จ์„ฑ ๋†’์€ ์ฟ ํŒก ์ƒํ’ˆ์„ ์ž๋™์œผ๋กœ ์ถ”์ฒœํ•ด์ฃผ๋Š” ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ์ˆ˜๋™ ์ž‘์—… ์—†์ด ์ตœ์‹  ์ธ๊ธฐ ์ƒํ’ˆ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋…ธ์ถœํ•˜์—ฌ ๊ด€๋ฆฌ์™€ ์šด์˜ ํšจ์œจ์„ฑ์„ ๋†’์—ฌ์ค๋‹ˆ๋‹ค.

์งˆ๋ฌธ 2: ์ž๋™์œผ๋กœ ์ƒํ’ˆ์ด ์‚ฝ์ž…๋˜๋Š” ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

๋„ค, ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณธ๋ฌธ ๋‚ด ์ฒซ ๋ฒˆ์งธ h3 ํƒœ๊ทธ ๋‹ค์Œ์— ์‚ฝ์ž…๋˜๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ ๋‚ด์˜ 'querySelector('h3')' ๋ถ€๋ถ„์„ ๋‹ค๋ฅธ ํƒœ๊ทธ๋‚˜ ํด๋ž˜์Šค๋ช…์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ์›ํ•˜๋Š” ์œ„์น˜๋กœ ์ž์œ ๋กญ๊ฒŒ ์กฐ์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์งˆ๋ฌธ 3: ์‹œ์Šคํ…œ ๋„์ž… ์‹œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ •์ฑ…์  ์‚ฌํ•ญ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ์šด์˜ ์ •์ฑ…์— ๋”ฐ๋ผ '์ˆ˜์ˆ˜๋ฃŒ ์ œ๊ณต' ์•ˆ๋‚ด ๋ฌธ๊ตฌ(๋””์Šคํด๋ ˆ์ด๋จธ)๋Š” ๋ฐ˜๋“œ์‹œ ๋…ธ์ถœ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ณผ๋„ํ•œ API ํ˜ธ์ถœ์€ ์ œํ•œ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ถ„๋‹น ํ˜ธ์ถœ ํšŸ์ˆ˜๋ฅผ ์กฐ์ ˆํ•˜์—ฌ ์•ˆ์ •์ ์œผ๋กœ ์šด์˜ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.