ํ—ˆ์„ธ์ž„
ํ—ˆ์„ธ์ž„
โš”๏ธ ๋ฒ ํ…Œ๋ž‘ ํŒŒํŠธ๋„ˆ
๐Ÿ“น SNS ์ฐ์นœ

๐Ÿ“ ์•„์ดํŒจ๋“œ๋กœ ๊ณต๋ถ€ํ•˜๋Š” ์‚ฌ๋žŒ ์ง‘์ค‘ - n8n, appscript, ๊ตฟ๋…ธํŠธ ์ž๋™ํ™”

๐Ÿ—ฃ๏ธ ์˜์–ด๊ณต๋ถ€ ํ•˜์‹ค๋ถ„ ํ•œ๋ฒˆ ํ•ด๋ณด์„ธ์š”~ https://english.huhsame.com


์†Œ๊ฐœ

๊ณต๋ถ€ํ•˜๊ณ  ์‹ถ์€ ์˜์–ด ์œ ํŠœ๋ธŒ๋‚˜, ์˜์–ด ๊ธฐ์‚ฌ URL๋ฅผ ๊ฐ€์ง€๊ณ  ์˜์–ด ํ•™์Šต ์ž๋ฃŒ๋ฅผ ๋งŒ๋“ค์–ด, ์•„์ดํŒจ๋“œ์—์„œ ๋ฐ”๋กœ ๊ณต๋ถ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ž๋™ํ™”๋ฅผ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

ํ‰์†Œ์— ํ† ์ต ํ† ํ”Œ์ฑ…์œผ๋กœ ๊ณต๋ถ€ํ•˜๊ธฐ๋Š” ์‹ซ๊ณ , ์ฐจ๋ผ๋ฆฌ ๊ด€์‹ฌ์žˆ๋Š” ๋ถ„์•ผ์˜ ์˜์ƒ์ด๋‚˜ ๊ธฐ์‚ฌ๋กœ ๊ณต๋ถ€ํ•˜์ž ์‹ถ์—ˆ์ง€๋งŒ, ์•„๋ฌด๋ž˜๋„ ์ฑ…์ด ์•„๋‹ˆ๋‹ค๋ณด๋‹ˆ ๋‹จ์–ด๋‚˜ ํ‘œํ˜„ ์ •๋ฆฌ๊ฐ€ ์•ˆ๋˜์–ด์žˆ์–ด ํ•œ๊ณ„๊ฐ€ ์žˆ๋”๋ผ๊ตฌ์š”. Claude์—๊ฒŒ ๋งค๋ฒˆ ๋ฌผ์–ด๊ฐ€๋ฉฐํ•˜๋‹ค ์ด๋ฒˆ ์Šคํ„ฐ๋””๋ฅผ ํ†ตํ•ด ์ž๋™ํ™”๋ฅผ ์™„์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋ชจ๋ฐ”์ผ ์žฅ์น˜ ์‚ฌ์šฉ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋‹ค์ด์–ด๊ทธ๋žจ

์ง„ํ–‰ ๋ฐฉ๋ฒ•

n8n ์™€ google Apps Script ํ˜ผํ•ฉ ์‚ฌ์šฉ

  • n8n: AI agent๊ธฐ๋Šฅ์œผ๋กœ ๊ธฐ์‚ฌ์›๋ฌธ์ด๋‚˜ ์œ ํŠœ๋ธŒ์Šคํฌ๋ฆฝํŠธ์—์„œ ์œ ์šฉํ•œ ํ‘œํ˜„ ์ถ”์ถœ ๋ฐ ์˜ˆ๋ฌธ ์ƒ์„ฑ

  • Apps Script: ๋ฐ์ดํ„ฐ๋ฅผ HTML ํ…œํ”Œ๋ฆฟ์— ์ ์šฉ ํ›„ pdfํŒŒ์ผ ์ƒ์„ฑ ๋ฐ ๊ตฟ๋…ธํŠธ ์ „๋‹ฌ

[n8n]

ํ”„๋กœ์„ธ์Šค์˜ ๋‹ค๋ฅธ ๋‹จ๊ณ„๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋‹ค์ด์–ด๊ทธ๋žจ
  1. URL ๋ถ„๋ฅ˜ ํ›„ ๋ถ„๊ธฐ

    • ์œ ํŠœ๋ธŒ์ธ์ง€ ์›นํŽ˜์ด์ง€์ธ์ง€

  2. ์ œ๋ชฉ๊ณผ ์›๋ฌธ ์ถ”์ถœ

    • ์œ ํŠœ๋ธŒ

      • ์ปค๋ฎค๋‹ˆํ‹ฐ๋…ธ๋“œ youtube transcript ์‚ฌ์šฉ

    • ์›นํŽ˜์ด์ง€

      • ์ปค๋ฎค๋‹ˆํ‹ฐ๋…ธ๋“œ webpage content extracter ์‚ฌ์šฉ

  1. ๋ฌธ์žฅ ๋ณ„ ํ‘œํ˜„ ์ถ”์ถœ

    • AI Agent

      • Claude Sonnet 3.7

      • ๋ฌธ์žฅ ๋ณ„๋กœ ์œ ์šฉํ•œ ํ‘œํ˜„๋“ค ์ถ”์ถœ

      • ์ถœ๋ ฅํฌ๋งท JSON

        • sentences์— ๋ฌธ์žฅ๋“ค์ด ๋ฆฌ์ŠคํŠธ๋กœ ๋‚˜์˜ด

          {
            "sentences": [
              {
                "original_sentence": "์›๋ฌธ์— ์žˆ๋Š” ํ•œ ๋ฌธ์žฅ",
                "original_meaning": "์›๋ฌธ ๋ฌธ์žฅ ํ•ด์„",
                "expressions": "์›๋ฌธ ๋ฌธ์žฅ์— ์žˆ๋Š” ์œ ์šฉํ•œ ํ‘œํ˜„๋“ค (์—ฌ๋Ÿฌ๊ฐœ์ผ ๊ฒฝ์šฐ ๋ฆฌ์ŠคํŠธ ๋Œ€์‹  ๊ตฌ๋ถ„์ž๋ฅผ ๋„ฃ๊ณ  ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด๋กœ)"
              }
            ]
          }
  2. ๋ฐ์ดํ„ฐ ๋ถ„ํ•  ๋ฐ ์ „์†ก

    • ํ•œ ๋ฌธ์žฅ ์”ฉ ๋‚˜๋ˆ„์–ด ๋‹ค์Œ ์›Œํฌํ”Œ๋กœ์šฐ๋กœ ์š”์ฒญ

    • ์š”์ฒญ์€ 5๋ถ„๋งˆ๋‹ค 5๊ฐœ์”ฉ ๋ฐฐ์น˜

    • POST https://n8n.huhsame.com/webhook/sentence

    • body

      • title, url, original_sentence. original_meaning, expressions

  3. ํ‘œํ˜„ ๋ณ„ ์˜ˆ๋ฌธ ์ƒ์„ฑ

    • ์›นํ›…์œผ๋กœ 1๋ฌธ์žฅ์”ฉ ์š”์ฒญ ๋ฐ›์Œ

    • AI Agent

      • Claude Sonnet 3.7

      • ๋ฌธ์žฅ์—์„œ ์ถ”์ถœํ•œ ํ‘œํ˜„๋“ค ๋งˆ๋‹ค ๋‚˜์˜ ๋งž์ถคํ˜• ์ƒํ™ฉ๋ณ„ ์˜ˆ๋ฌธ 4๊ฐœ์”ฉ ์ƒ์„ฑ

      • ์ถœ๋ ฅ ํฌ๋งท JSON

        {
          "expressions": [{
            "expression": "์œ ์šฉํ•œ ํ‘œํ˜„",
            "meaning": "์œ ์šฉํ•œ ํ‘œํ˜„ ํ•œ๊ตญ์–ด ๋œป",
            "situation_description": "์ด ํ‘œํ˜„ํ•˜๋Š” ์ƒํ™ฉ ์„ค๋ช…",
            "original_sentence": "์›๋ฌธ์— ์žˆ๋˜ ๋ฌธ์žฅ",
            "original_meaning": "์›๋ฌธ ๋ฌธ์žฅ ํ•ด์„",
            "example1": "AI๋‚˜ ์ž๋™ํ™”์— ๊ด€๋ จ๋œ ์ƒํ™ฉ ์˜ˆ๋ฌธ",
            "example2": "๊ฐ•์˜๋‚˜ ๋„คํŠธ์›Œํ‚น์— ๊ด€๋ จ๋œ ์ƒํ™ฉ ์˜ˆ๋ฌธ",
            "example3": "์ผ์ƒ, ์ทจ๋ฏธ์— ๊ด€๋ จ๋œ ์ƒํ™ฉ ์˜ˆ๋ฌธ",
            "example4": "์—ฌํ–‰, ๋ฏธ๋ž˜์— ๊ด€๋ จ๋œ ์ƒํ™ฉ ์˜ˆ๋ฌธ"
          }]
        }
  4. ๋ฐ์ดํ„ฐ ์ €์žฅ

    • Google Sheets

      ํ•ญ๋ชฉ ๋ชฉ๋ก์„ ๋ณด์—ฌ์ฃผ๋Š” ์Šคํ”„๋ ˆ๋“œ ์‹œํŠธ์˜ ์Šคํฌ๋ฆฐ ์ƒท

  1. Apps Script ํ˜ธ์ถœ

    • ๋ฌธ์žฅ๋ณ„ ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ๋‹ค ์ง„ํ–‰ ๋  ๋•Œ ๊นŒ์ง€ ๋Œ€๊ธฐ (์•ฝ 1์‹œ๊ฐ„)

    • Apps Script ์›นํ›…

      • POST https://script.google.com/macros/s/AKfycbyKL-HrFJs69ngy4M9ABjIfd86Xwv-TvxTCP29F4iuc52zQg5UE9WJb1158CL6q24o/exec

      • body

        • url

[Apps Script]

์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฝ”๋“œ ํŽธ์ง‘๊ธฐ์˜ ์Šคํฌ๋ฆฐ ์ƒท

  1. ์˜์–ด ํ‘œํ˜„ ๋ฐ์ดํ„ฐ ์ฝ์–ด์˜ค๊ธฐ

    • webhook์œผ๋กœ ๋ฐ›์€ URL ์ถ”์ถœ

    • ๊ตฌ๊ธ€์‹œํŠธ์—์„œ ํ•ด๋‹น URL์˜ ์˜์–ด ํ‘œํ˜„ ๋ฐ์ดํ„ฐ๋“ค ์ฝ์–ด์˜ค๊ธฐ

      // JSON ๋ฐ์ดํ„ฐ์—์„œ URL ํŒŒ๋ผ๋ฏธํ„ฐ ์ถ”์ถœ (ํ‘œํ˜„ ํ•™์Šต ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ์˜์ƒ/๋ฌธ์„œ URL)
        const data = JSON.parse(e.postData.contents || '{}');
        const inputUrl = data.url;
        if (!inputUrl) return ContentService.createTextOutput('No URL received.');
      
        // 'ํ‘œํ˜„๊ณต๋ถ€์‹œํŠธ' ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ ์—ด๊ธฐ - ์˜์–ด ํ‘œํ˜„๊ณผ ์˜ˆ๋ฌธ์ด ์ €์žฅ๋œ ์‹œํŠธ
        const sheet = SpreadsheetApp.openById('๋ฐ์ดํ„ฐ ์ €์žฅ๋œ ๊ตฌ๊ธ€์‹œํŠธ ์•„์ด๋””')
                      .getSheetByName('ํ‘œํ˜„๊ณต๋ถ€์‹œํŠธ');
        // ๋ชจ๋“  ํ‘œํ˜„ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
        const rows = sheet.getDataRange().getValues();
        // ์ž…๋ ฅ๋œ URL๊ณผ ์ผ์น˜ํ•˜๋Š” ์˜์–ด ํ‘œํ˜„ ๋ฐ์ดํ„ฐ ์ฐพ๊ธฐ (2๋ฒˆ์งธ ์—ด[์ธ๋ฑ์Šค 1]์— ์›๋ณธ URL ์ €์žฅ)
        const matched = rows.filter((row, i) => i > 0 && row[1] === inputUrl);
      
        // ํ•ด๋‹น URL์— ๊ด€๋ จ๋œ ์˜์–ด ํ‘œํ˜„์ด ์—†์œผ๋ฉด ๋ฉ”์‹œ์ง€ ๋ฐ˜ํ™˜
        if (matched.length === 0) {
          return ContentService.createTextOutput('No matching rows.');
        }

  1. HTML ํ…œํ”Œ๋ฆฟ ์ ์šฉ

    • Claude๋กœ HTML ๊ตฌ์„ฑ

    • ์•„์ดํŒจ๋“œ์—์„œ ํ•„๊ธฐํ•˜๊ธฐ ์œ„ํ•ด ํ•„๊ธฐ๊ณต๊ฐ„ ์ถ”๊ฐ€

      
      // ===================================================================
      // buildStyledHtml ํ•จ์ˆ˜: ์˜์–ด ํ‘œํ˜„ ํ•™์Šต ์นด๋“œ HTML ์ƒ์„ฑ
      // ===================================================================
      function buildStyledHtml(rows) {
        // ์˜์–ด ํ‘œํ˜„ ํ•™์Šต ์นด๋“œ์˜ HTML ๊ตฌ์กฐ์™€ ์Šคํƒ€์ผ ์ •์˜
        let html = `
        <!DOCTYPE html><html lang="ko"><head><meta charset="UTF-8">
        <title>์˜์–ด ํ‘œํ˜„ ํ•™์Šต ์นด๋“œ</title>
        <style>
        @font-face {
          font-family: 'Pretendard';
          src: url(data:font/ttf;base64,${FONT_REGULAR}) format('truetype');
          font-weight: 400;
          font-style: normal;
        }
      
        @font-face {
          font-family: 'Pretendard';
          src: url(data:font/ttf;base64,${FONT_BOLD}) format('truetype');
          font-weight: 700;
          font-style: normal;
        }
      
          * { box-sizing: border-box; margin: 0; padding: 0; }
        @page {
          size: A4 portrait;
          margin: 40px 80px 20px 20px; /* top right bottom left */
        }
          body {
            font-family: 'Noto Sans KR', sans-serif;
            background-color: white;
            color: #333;
            line-height: 1.6;
            padding: 0px;
          }
      
        .container {
          width: 500px;            /* A4 - ์—ฌ๋ฐฑ ๊ณ ๋ คํ•œ ๋„ˆ๋น„ */
          margin-left: 0;          /* ์™ผ์ชฝ ์ •๋ ฌ */
          margin-right: auto;      /* ์˜ค๋ฅธ์ชฝ ์—ฌ๋ฐฑ ํ™•๋ณด */
        }
          .expression-card {
            background-color: white;
            padding: 30px;
            margin-bottom: 60px;
            page-break-after: always;  /* ๊ฐ ํ‘œํ˜„ ์นด๋“œ๋งˆ๋‹ค ํŽ˜์ด์ง€ ๋‚˜๋ˆ” */
          }
      
          .expression-header {
            margin-bottom: 15px;
            border-bottom: 1px solid #eee;
            padding-bottom: 8px;
            line-height: 1.2;
      
          }
      
          .expression-original-meaning,
          .expression-meaning,
          .expression-situation {
            font-family: 'Pretendard', sans-serif;
          }
          .expression-title {
            font-size: 24px;
            font-weight: 700;
            color: #4f46e5;
            margin-bottom: 8x;
      
          }
      
          .expression-meaning {
            font-size: 18px;
            font-weight: 700;
            color: #4b5563;
            padding: 8px 0px;
          }
      
          .expression-situation {
            background-color: #f3f4f6;
            padding: 5px;
            border-radius: 8px;
            margin: 8px 0px;
            font-size: 15px;
            color: #4b5563;
          }
      
          .expression-original {
            font-style: italic;
            color: #6366f1;
            font-weight: 400;
            padding: 4px 0px;
          }
      
          .expression-original-meaning {
            font-weight: 400;
            font-size: 8px
            padding: 4px 0px;
            margin-bottom: 10px;
          }
      
          .examples-section { margin-top: 30px; }
      
          .examples-section h3 {
            font-size: 16px;
            margin-bottom: 15px;
            color: #4b5563;
          }
      
          .example-item {
            background-color: #f9fafb;
            padding: 0px 12px;
            border-radius: 8px;
            margin-bottom: 30px;
            border-left: 3px solid #a5b4fc;
            font-size: 15px;
            line-height: 2;
          }
      
          .highlight {
            font-weight: 700;
            background: none;
          }
        </style>
        </head><body><div class="container">
        `;
      
        // ๊ฐ ์˜์–ด ํ‘œํ˜„๋งˆ๋‹ค ํ•™์Šต ์นด๋“œ ์ƒ์„ฑ
        rows.forEach(row => {
          // ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น
          // [์ œ๋ชฉ, URL, ํ‘œํ˜„, ์˜๋ฏธ, ์‚ฌ์šฉ์ƒํ™ฉ, ์›๋ฌธ, ์›๋ฌธ์˜๋ฏธ, ์˜ˆ๋ฌธ1, ์˜ˆ๋ฌธ2, ์˜ˆ๋ฌธ3, ์˜ˆ๋ฌธ4]
          const [ , , expression, meaning, situation, original, original_meaning, ex1, ex2, ex3, ex4 ] = row;
      
          // ์˜์–ด ํ‘œํ˜„ ํ•™์Šต ์นด๋“œ HTML ๊ตฌ์กฐ ์ƒ์„ฑ
          html += `
          <div class="expression-card">
            <div class="expression-header">
              <h2 class="expression-title">${expression}</h2>
              <div class="expression-meaning">${meaning}</div>
      
            </div>
            <div class="expression-situation">${situation}</div>
            <div class="expression-original">${highlight(expression, original)}</div>
            <div class="expression-original-meaning">${original_meaning}</div>
      
            <div class="examples-section">
              ${[ex1, ex2, ex3, ex4].filter(Boolean).map(e =>
                `<div class="example-item">${highlight(expression, e)}</div>`).join('')}
            </div>
          </div>`;
        });
      
        // HTML ๋งˆ๋ฌด๋ฆฌ ํƒœ๊ทธ ์ถ”๊ฐ€
        html += `</div></body></html>`;
        return html;
      }
  2. PDF ํŒŒ์ผ ์ƒ์„ฑ ๋ฐ ๊ตฌ๊ธ€ ๋“œ๋ผ์ด๋ธŒ ์ €์žฅ

    // ์˜์–ด ํ‘œํ˜„ ํ•™์Šต ์ž๋ฃŒ๋ฅผ ์ €์žฅํ•  ๊ตฌ๊ธ€ ๋“œ๋ผ์ด๋ธŒ ํด๋”์— PDF ํŒŒ์ผ ์ €์žฅ
      const folder = DriveApp.getFolderById('1DTJFVOAnrq5mS1l3nQwcWfw5rVazEc1b');
      const file = folder.createFile(blob.setName(filename));
      

  1. ์•„์ดํŒจ๋“œ Goodnotes ์•ฑ์— ์ถ”๊ฐ€

    • ์ž๋™ํ™” ์ „์šฉ ์ด๋ฉ”์ผ๋กœ ๋ฐœ์†ก

      ํ™”๋ฉด์— ๋ฌธ์„œ๊ฐ€์žˆ๋Š” iPad
      iPad์— ๋ฌธ์„œ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜์žˆ๋Š” ์˜ต์…˜์ด์žˆ๋Š” iPad ํ™”๋ฉด
    • ์•ฑ์— pdfํŒŒ์ผ ์ž๋™ ์ž„ํฌํŠธ

      // ์ƒ์„ฑ๋œ PDF ํ•™์Šต ์ž๋ฃŒ๋ฅผ GoodNotes๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์ด๋ฉ”์ผ๋กœ ๋ฐœ์†ก
        GmailApp.sendEmail(
          "[email protected]",  // GoodNotes ์ž๋™ ๊ฐ€์ ธ์˜ค๊ธฐ์šฉ ์ด๋ฉ”์ผ ์ฃผ์†Œ
          `๐Ÿ“˜ ํ•™์Šต์ž๋ฃŒ ์™„์„ฑ: ${title}`,      // ํ•™์Šต ์ž๋ฃŒ ์ œ๋ชฉ
          "์ฒจ๋ถ€๋œ PDF๋ฅผ ํ™•์ธํ•ด์ฃผ์„ธ์š”.",  // ์ด๋ฉ”์ผ ๋ณธ๋ฌธ
          {
            attachments: [file.getAs(MimeType.PDF)],  // ํ•™์Šต ์ž๋ฃŒ PDF ์ฒจ๋ถ€
            cc: "[email protected]",  // ์ฐธ์กฐ ์ˆ˜์‹ ์ž (์™„๋ฃŒ ์•Œ๋ฆผ์šฉ)
            name: "ํ—ˆ์„ธ์ž„AI"         // ๋ฐœ์‹ ์ž ์ด๋ฆ„
          }
        );

๊ฒฐ๊ณผ

Shana English์˜ ๊ฐ€์ž… ์–‘์‹
ํŽœ์œผ๋กœ iPad์— ์“ฐ๋Š” ์‚ฌ๋žŒ

ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

  • n8n์˜ execution data ํฌ๊ธฐ๊ฐ€ ํฐ ๊ฒฝ์šฐ ํ•œ ๋…ธ๋“œ์”ฉ ์‹คํ–‰ ๋ถˆ๊ฐ€ โžก๏ธ data๋ฅผ pin ํ•ด๋‘๊ณ  ์ „์ฒด ํ”Œ๋กœ์šฐ ์‹คํ–‰

  • n8n์˜ output parser๋Š” ์ƒ๊ฐ๋ณด๋‹ค ์—๋Ÿฌ๊ฐ€ ๋งŽ์ด ๋‚จ โžก๏ธ ๊ทธ๋ƒฅ OpenAI JSON๋ชจ๋“œ๋กœ ๋’ค์— ํ•œ๋ฒˆ ๊ฑฐ์น˜๋Š” ๊ฒƒ์ด ๊ฐ„๋‹จ

  • ํ•œ๋ฒˆ์— ๋ชจ๋“  ๋ฌธ์žฅ์— ๋Œ€ํ•œ ํ‘œํ˜„๊ณผ ์˜ˆ๋ฌธ๋“ค์„ ๋‹ค ์‘๋‹ต๋ฐ›๊ธฐ์—” ์ตœ๋Œ€ ํ† ํฐ๋Ÿ‰์ด ๋ชจ์ž๋žŒ โžก๏ธ ํ•œ ๋ฌธ์žฅ๋งˆ๋‹ค ๋”ฐ๋กœ OpenAI ์ฝœ

  • 30๋ฌธ์žฅ์˜ ๊ฒฝ์šฐ ๋™์‹œ์— 30๊ฐœ์˜ OpenAI ์š”์ฒญ์œผ๋กœ TPM(Token Per Minute) ์ดˆ๊ณผ โžก๏ธ 5๋ถ„๋งˆ๋‹ค 5๊ฐœ ์š”์ฒญ์”ฉ ๋‚˜๋ˆ„์–ด ์‹œํ–‰

  • Google Apps Script์—์„œ PDF ๋ณ€ํ™˜์‹œ HTML์— ์ ์šฉํ•œ ์ด์œํšจ๊ณผ๋“ค ์‚ฌ๋ผ์ง โžก๏ธ ๋ฐฐ๊ฒฝ์ƒ‰๋Œ€์‹  ๊ตต๊ธฐ, ๊ธ€์”จ์ƒ‰์œผ๋กœ ์กฐ์ •

  • Google Apps Script์—์„œ PDF ๋ณ€ํ™˜์‹œ CSS์— importํ•œ ํฐํŠธ ๋ฌด์‹œ โžก๏ธ ์ง์ ‘ base64๋กœ ๋„ฃ์Œ (๊ธฐ๋ณธ ๋‚ด์žฅ ํฐํŠธ๋Š” ํ•œ๊ธ€์ด ์ฐธ์„ ์ˆ˜ ์—†์ด ๋ชป์ƒ๊น€)

๋А๋‚€์ 

  • ์ƒ๊ฐ๋ณด๋‹ค ์˜ค๋ž˜๊ฑธ๋ ธ๋‹ค.

  • ํŠนํžˆ ๋‚˜์—๊ฒŒ ๋งž๋Š” ํ‘œํ˜„ ์ถ”์ถœ, ๊ทธ๋ฆฌ๊ณ  ๋‚˜์—๊ฒŒ ๋งž๋Š” ์˜ˆ๋ฌธ ์ƒ์„ฑํ•ด์ฃผ๋Š” ํ”„๋กฌํ”„ํŠธ ๊ณ ๋„ํ™”์— ์‹œ๊ฐ„์„ ๋งŽ์ด ์ผ๋‹ค.

  • ํ–ฅํ›„ ๋” ํ•˜๊ณ ์‹ถ์€ ๊ฒƒ

    • ์•„์ดํฐ ๋‹จ์ถ•์–ด, ๊ณต์œ ํ•˜๊ธฐ, ํฌ๋กฌํ™•์žฅํ”„๋กœ๊ทธ๋žจ

    • ์›น์„œ๋น„์Šค ๋ฐฐํฌ

      • ํ”„๋ก ํŠธ์—”๋“œ ์ž‘์—… ํ•„์š”

      • ๋งž์ถค ์˜ˆ๋ฌธ ์ƒ์„ฑ์„ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด ์ž…๋ ฅ ๋‹จ๊ณ„ ํ•„์š”

  • ๊ท€์ฐฎ์•„์„œ ๊ทธ๋ƒฅ ๋‚˜๋งŒ ์“ฐ๊ณ  ๋๋‚ผ์ˆ˜๋„ ์žˆ๋‹ค. โžก๏ธ sonnet 4 ํ…Œ์ŠคํŠธ๊ฒธ cursor๋กœ ๋งŒ๋“ค์–ด๋ดค๋Š”๋ฐ ๋˜‘๋˜‘ํ•ฉ๋‹ˆ๋‹ค!

  • MyZample https://english.huhsame.com

์†Œ์Šค์ฝ”๋“œ

n8n workflow: https://drive.google.com/file/d/1w3C5YEptkOnG49GeDbmIM-FsWkGHpM3B/view?usp=drive_link

google app script: https://drive.google.com/file/d/1_jQMyW39pxOhzL-5r4xwnCrlVcAGnfhu/view?usp=drive_link


8
6๊ฐœ์˜ ๋‹ต๊ธ€

๐Ÿ‘‰ ์ด ๊ฒŒ์‹œ๊ธ€๋„ ์ฝ์–ด๋ณด์„ธ์š”