๋ฐ˜์‘ํ˜•

๐Ÿ’ก ์›Œํฌํ”Œ๋กœ์šฐ ๋ชฉํ‘œ

  1. ์ด๋ฉ”์ผ ์ฒจ๋ถ€ํŒŒ์ผ ์˜์ˆ˜์ฆ ์ด๋ฏธ์ง€์—์„œ ๋ฐ์ดํ„ฐ ์ถ”์ถœ
  2. ์ถ”์ถœํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๊ธ€ ์‹œํŠธ์— ๊ธฐ๋ก
  3. ์˜์ˆ˜์ฆ ์›๋ณธ์€ ๊ตฌ๊ธ€ ๋“œ๋ผ์ด๋ธŒ์— ๋ฐฑ์—…
  4. ์ฒ˜๋ฆฌ๋œ ์ด๋ฉ”์ผ์€ ์ž๋™ ์ •๋ฆฌ

 

 

Gmail Trigger ๋…ธ๋“œ


๋จผ์ € ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๊ตฌ๊ธ€์—์„œ walmart receipt ํ‚ค์›Œ๋“œ๋กœ ์˜์ˆ˜์ฆ ์ด๋ฏธ์ง€๋ฅผ ์ฐพ์€ ๋’ค, ๋ณธ์ธ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋กœ ์˜์ˆ˜์ฆ ์ด๋ฏธ์ง€๋ฅผ ์ฒจ๋ถ€ํ•˜์—ฌ ๋ฉ”์ผ์„ ๋ณด๋‚ด ๋‘”๋‹ค. n8n์ด ๋ฉ”์ผ์„ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฉ”์ผ ์ œ๋ชฉ์—๋Š” receipt ๋‹จ์–ด๋ฅผ ํฌํ•จ์‹œ์ผœ์•ผ ํ•œ๋‹ค.

 

n8n์œผ๋กœ ๋Œ์•„์™€์„œ Gmail Trigger ๋…ธ๋“œ(on message received)๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ์ˆ˜์‹ ์ž…๋ ฅ ํŽธ์˜๋ฅผ ์œ„ํ•ด ๋…ธ๋“œ ์ด๋ฆ„์€ get_emails๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค. ์ด ๋…ธ๋“œ๋Š” ์ง€์ •ํ•œ ๊ฐ„๊ฒฉ์œผ๋กœ ๋ฉ”์ผํ•จ์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ํ™•์ธํ•˜๋‹ค๊ฐ€, ์กฐ๊ฑด์— ๋งž๋Š” ๋ฉ”์ผ์ด ๋„์ฐฉํ•˜๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

๋…ธ๋“œ ์„ค์ • ์ฐฝ์„ ์—ด์–ด ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •ํ•œ๋‹ค.

  • Poll Times > Mode: Every Minute (1๋ถ„๋งˆ๋‹ค ์ด๋ฉ”์ผ ํ™•์ธ)
  • Event: Message Received (๋ฉ”์ผ ๋„์ฐฉํ•˜๋ฉด ํŠธ๋ฆฌ๊ฑฐ)
  • Simplify: ์ฒดํฌํ•ด์ œ (์ƒ์„ธ ๋ฐ์ดํ„ฐ ์ถœ๋ ฅ)
    Simplify ์˜ต์…˜์„ ์ฒดํฌ ํ•ด์ œํ•ด์•ผ ์ถ”๊ฐ€์ ์ธ ์˜ต์…˜์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Add Filter > Search: from:me has:attachment subject:receipt
    from:, has: ๋“ฑ์€ ๊ตฌ๊ธ€์—์„œ ์ง€์›ํ•˜๋Š” ๊ฒ€์ƒ‰ ์—ฐ์‚ฐ์ž๋‹ค. ์œ„ ์—ฐ์‚ฐ์ž๋Š” ๋‚˜์—๊ฒŒ ๋ณด๋‚ธ ๋ฉ”์ผ(from:me) ์ค‘์—์„œ ์ฒจ๋ถ€ํŒŒ์ผ์ด ์žˆ๊ณ (has:attachment) ์ œ๋ชฉ์— receipt(subject:receipt)๊ฐ€ ํฌํ•จ๋œ ๋ฉ”์ผ์„ ๊ณจ๋ผ๋‚ธ๋‹ค.
  • Add option > Download Attachments: ์ฒดํฌ (์ฒจ๋ถ€ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ)

 

์„ค์ •์„ ๋งˆ์น˜๊ณ  Fetch Test Event ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด ๋ณด์ž. ์šฐ์ธก Output ์˜์—ญ์— Binary ํƒญ์ด ์ƒˆ๋กœ ์ƒ๊ธด ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠธ๋ฆฌ๊ฑฐ ์„ค์ •์—์„œ Download Attachments ์˜ต์…˜์„ ์ฒดํฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— n8n์ด ๋ฉ”์ผ์— ์ฒจ๋ถ€๋œ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์ด Binary ํƒญ์— ๋‹ด์•„ ๋‘” ๊ฒƒ. ์ด ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋Š” ๋‹ค์Œ ๋…ธ๋“œ์—์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

AI Agent ๋…ธ๋“œ


์•ž์„œ ๋‹ค์šด๋กœ๋“œํ•œ ์˜์ˆ˜์ฆ ์ด๋ฏธ์ง€(attachment_0)์—์„œ ๊ฐ€๊ณ„๋ถ€ ์ž‘์„ฑ์— ํ•„์š”ํ•œ ํ•ต์‹ฌ ์ •๋ณด(๊ฒฐ์ œ์ผ, ๊ธˆ์•ก ๋“ฑ)๋ฅผ ์ถ”์ถœํ•  ์ฐจ๋ก€๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„  Vision(์ด๋ฏธ์ง€ ์ธ์‹) ๊ธฐ๋Šฅ์ด ์žˆ๋Š” AI ๋ชจ๋ธ์„ ํ™œ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

AI Agent ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์•„๋ž˜์ฒ˜๋Ÿผ ์„ค์ •ํ•œ๋‹ค.

  • Source for Prompt: Define below
  • Prompt: ํ˜„์žฌ ๋…ธ๋“œ๋กœ ์ „๋‹ฌ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์€ $binary ๋ณ€์ˆ˜๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
Extract the invoice data from this image: {{ $binary.attachment_0 }} Date format needs to be YYYY.MM.DD
  • Require Specific Output Format: ์ฒดํฌ (์ •ํ˜•ํ™”๋œ ๋ฐ์ดํ„ฐ๋กœ ์ถœ๋ ฅ)

 

๊ทธ ๋‹ค์Œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ด๋ฏธ์ง€๋ฅผ ์‹ค์ œ๋กœ ๋ถ„์„ํ•  '๋‘๋‡Œ' ์—ญํ• ์„ ํ•˜๋Š” AI ๋ชจ๋ธ์„ ์—ฐ๊ฒฐํ•œ๋‹ค. ์—์ด์ „ํŠธ ์„ค์ •์ฐฝ ํ•˜๋‹จ Chat Model [+] ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ณ  OpenAI Chat Model ๋“ฑ์„ ์„ ํƒํ•œ๋‹ค. Chat Model์€ ์ €๋ ดํ•œ gpt-4.1-mini ์ •๋„๋ฉด ์ถฉ๋ถ„ํ•˜๋‹ค.

 

 

๊ตฌ์กฐํ™”๋œ ์ถœ๋ ฅ (Structured Outputs)


AI ๋ชจ๋ธ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ํŽธํ•œ ์ผ๋ฐ˜ ํ…์ŠคํŠธ(์ค„๊ธ€)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํ•˜์ง€๋งŒ LLM์ด ์ถ”์ถœํ•œ ์˜์ˆ˜์ฆ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๊ธ€ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์•ˆ์ •์ ์œผ๋กœ ์ €์žฅํ•˜๋ ค๋ฉด JSON ๊ฐ™์€ ์ •ํ˜•ํ™”๋œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ๊ฐ•์ œํ•˜๊ธฐ ์œ„ํ•ด Structured Output Parser ๋…ธ๋“œ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

AI Agent ์„ค์ •์—์„œ Require Specific Output Format ์˜ต์…˜์— ์ฒดํฌํ–ˆ๋‹ค๋ฉด, ์•„๋ž˜์ชฝ์— ์ถœ๋ ฅ ํŒŒ์„œ(Output Parser)๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” [+] ๋ฒ„ํŠผ์ด ์ƒ๊ธด๋‹ค. ํด๋ฆญํ•ด์„œ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์„ค์ • ์ฐฝ์—์„œ Schema Type์„ Generate From JSON Example๋กœ ์„ ํƒํ•œ ๋’ค, ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ ํ˜•ํƒœ๋ฅผ JSON์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค.

 

JSON Example ์˜ˆ์‹œ:

{
  "date": "2025.10.31",
  "vendor": "Apple Store Gangnam",
  "totalAmount": 1400,
  "currency": "USD",
  "items": [
    {
      "description": "Apple Watch",
      "unitPrice": 200,
      "quantity": 2,
      "totalPrice": 400
    },
    {
      "description": "iPhone",
      "unitPrice": 1000,
      "quantity": 1,
      "totalPrice": 1000
    }
  ]
}

 

์ด๋ ‡๊ฒŒ ์ƒ˜ํ”Œ JSON๋งŒ ์ž…๋ ฅํ•˜๋ฉด n8n์ด ๊ตฌ์กฐ๋ฅผ ๋ถ„์„ํ•˜์—ฌ AI์—๊ฒŒ ์ „๋‹ฌํ•  ์Šคํ‚ค๋งˆ ๊ทœ์น™์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ค€๋‹ค. ๊ฐ ํ•„๋“œ์˜ ํ‚ค๊ฐ’์ด๋‚˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ผ์ผ์ด ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ ๋ผ์„œ ํŽธ๋ฆฌํ•˜๋‹ค. ํ•„์š”ํ•˜๋‹ค๋ฉด JSON Schema๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

AI Agent์— Chat Model๊ณผ Output Parser ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ๋ชจ์Šต

 

 

์ง€์ถœ ๋น„์šฉ ๊ธฐ๋ก


์ถ”์ถœํ•œ ์˜์ˆ˜์ฆ ์ •๋ณด๋ฅผ ๊ตฌ๊ธ€ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ์— ๊ธฐ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ๋‘ ๋ฐฉ์‹ ๋ชจ๋‘ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์›Œํฌํ”Œ๋กœ์šฐ ๊ตฌ์กฐ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์„ ํƒ์ด ํ•„์š”ํ•˜๋‹ค.

 

  1. AI Agent์˜ Tool๋กœ ์ถ”๊ฐ€: ์—ฌ๋Ÿฌ ๋„๊ตฌ ์ค‘ ์–ด๋–ค ๊ฒƒ์„ ์–ธ์ œ ํ˜ธ์ถœํ•ด์•ผ ํ• ์ง€ AI ์Šค์Šค๋กœ ํŒ๋‹จํ•˜๊ณ  ๊ฒฐ์ •ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ
  2. ์ผ๋ฐ˜ Google Sheets ๋…ธ๋“œ๋กœ ์—ฐ๊ฒฐ: [์˜์ˆ˜์ฆ ์ •๋ณด ์ถ”์ถœ → ๊ตฌ๊ธ€ ์‹œํŠธ ๊ธฐ๋ก]์ฒ˜๋Ÿผ ์‹คํ–‰ ๋‹จ๊ณ„๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •ํ•ด์ง„ ์ƒํ™ฉ

 

์ด๋ฒˆ ์˜ˆ์ œ์ฒ˜๋Ÿผ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ๋‹ค๋ฉด ์ผ๋ฐ˜ ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ AI ํฌ๋ ˆ๋”ง(๋น„์šฉ) ๋‚ญ๋น„๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ์›Œํฌํ”Œ๋กœ์šฐ ์‹คํ–‰ ํ๋ฆ„์ด ๋” ๋ช…ํ™•ํ•ด์ง€๋Š” ์žฅ์ ๋„ ์žˆ๋‹ค.

 

๋จผ์ € ์ƒˆ๋กœ์šด ๊ตฌ๊ธ€ ์‹œํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  Date, Vendor, Items, Total Amount, Currency ์—ด ์ด๋ฆ„์„ ์ง€์ •ํ•ด ๋‘”๋‹ค.

 

๋ฌธ์„œ ํŒŒ์ผ์„ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด n8n ์›Œํฌํ”Œ๋กœ์šฐ ํ™”๋ฉด์œผ๋กœ ๋Œ์•„์™€ ๋‹จ์ถ•ํ‚ค n > Google Sheets > Append or update row in sheet ์•ก์…˜์„ ์„ ํƒํ•ด์„œ ์ถ”๊ฐ€ํ•œ ํ›„, ์„ค์ •์ฐฝ์„ ์—ด์–ด ์•„๋ž˜์ฒ˜๋Ÿผ ์ง€์ •ํ•œ๋‹ค.

  • Resource: Sheet Within Document (๋ฌธ์„œ๋‚ด ํŠน์ • ์‹œํŠธ ๋Œ€์ƒ์œผ๋กœ ์ž‘์—…)
  • Operation: Append Row (๊ธฐ์กด ๋ฐ์ดํ„ฐ ์•„๋ž˜์— ์ƒˆ๋กœ์šด ํ–‰ ์ถ”๊ฐ€)
  • Document > From list: ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๊ตฌ๊ธ€ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ ํŒŒ์ผ๋ช…
  • Sheet > From list: ํ•ด๋‹น ๋ฌธ์„œ ๋‚ด์—์„œ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋กํ•  ์‹œํŠธ/ํƒญ
  • Mapping Column Mode: Map Each Column Manually (๊ตฌ๊ธ€ ์‹œํŠธ ๊ฐ ์ปฌ๋Ÿผ์— ์ˆ˜๋™์œผ๋กœ ๊ฐ’ ๋งคํ•‘)
  • Values to Send (์ €์žฅํ•  ๋ฐ์ดํ„ฐ ๋งคํ•‘)
    • Date: {{ $json.output.date }}
    • Vendor: {{ $json.output.vendor }}
    • Items: {{ $json.output.items }}
      items๋Š” ์—ฌ๋Ÿฌ ์ƒํ’ˆ ์ •๋ณด๋ฅผ ๋‹ด์€ ๋ฐฐ์—ด/๊ฐ์ฒด์ด๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ ์ž…๋ ฅํ•˜๋ฉด [object Object]์ฒ˜๋Ÿผ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ๋Š” JSON.stringify() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด ๋œ๋‹ค.
    • Total Amount: {{ $json.output.totalAmount }}
    • Currency: {{ $json.output.currency }}

 

 

์˜์ˆ˜์ฆ ์ด๋ฉ”์ผ ์ •๋ฆฌ


์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚œ ์ด๋ฉ”์ผ์„ ๋ฐ›์€ ํŽธ์ง€ํ•จ์— ๊ทธ๋Œ€๋กœ ๋‘๋ฉด ๋‹ค์Œ ์›Œํฌํ”Œ๋กœ์šฐ ์‹คํ–‰ ์‹œ ๋˜‘๊ฐ™์€ ์˜์ˆ˜์ฆ์„ ์ค‘๋ณต ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ์ดํ„ฐ ๊ธฐ๋ก์„ ์™„๋ฃŒํ•œ ์ด๋ฉ”์ผ์€ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์™„์ „ํžˆ ์˜๊ตฌ ์‚ญ์ œ(Delete a message ์•ก์…˜) ํ•˜๋Š” ๊ฒƒ๋ณด๋‹จ ์•ˆ์ „ํ•˜๊ฒŒ ํœด์ง€ํ†ต(Trash a thread ์•ก์…˜)์œผ๋กœ ์ด๋™์‹œํ‚ค๋Š” ๋ฐฉ์‹์„ ์ถ”์ฒœํ•œ๋‹ค.

 

๋‹จ์ถ•ํ‚ค n > Gmail > Trash a thread ์•ก์…˜์„ ์ถ”๊ฐ€ํ•œ ํ›„ ์•„๋ž˜์ฒ˜๋Ÿผ ์„ค์ •ํ•œ๋‹ค.

  • Credential: Gmail OAuth2 API (๋ฏธ๋ฆฌ ์—ฐ๋™ํ•ด๋‘” Gmail ๊ณ„์ • ์„ ํƒ)
  • Resource: Thread (๊ฐœ๋ณ„ ๋ฉ”์‹œ์ง€๊ฐ€ ์•„๋‹Œ ์Šค๋ ˆ๋“œ ์ „์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ž‘์—…)
  • Operation: Trash (ํ•ด๋‹น ์Šค๋ ˆ๋“œ๋ฅผ ํœด์ง€ํ†ต์œผ๋กœ ์ด๋™)
  • Thread ID: {{ $('get_emails').item.json.threadId }}

 

Thread ID ๊ฐ’์€ ์ง์ ‘ ํƒ€์ดํ•‘ํ•  ํ•„์š” ์—†์ด ์™ผ์ชฝ INPUT ํŒจ๋„์—์„œ ์ด๋ฉ”์ผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๋…ธ๋“œ์˜ threadID ํ•ญ๋ชฉ์„ ๋“œ๋ž˜๊ทธํ•˜๋ฉด ํ‘œํ˜„์‹์ด ์ž๋™์œผ๋กœ ์ž…๋ ฅ๋œ๋‹ค.

 

 

์˜์ˆ˜์ฆ ์›๋ณธ ๋ฐฑ์—…


ํ˜น์‹œ ๋ชจ๋ฅผ ์ƒํ™ฉ์„ ๋Œ€๋น„ํ•ด ์˜์ˆ˜์ฆ ์›๋ณธ ์ด๋ฏธ์ง€๋Š” ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐฑ์—…ํ•ด ๋‘๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋‹จ์ถ•ํ‚ค n > Google Drive > Upload file ์•ก์…˜์„ ์ถ”๊ฐ€ํ•œ ํ›„, ์„ค์ •์ฐฝ์„ ์—ด์–ด ์•„๋ž˜์ฒ˜๋Ÿผ ์ง€์ •ํ•œ๋‹ค.

  • Credential: Google Drive OAuth2 API (๊ตฌ๊ธ€ ๋“œ๋ผ์ด๋ธŒ ์—ฐ๋™ ๊ณ„์ •)
  • Resource: File (์ž‘์—… ๋Œ€์ƒ)
  • Operation: Upload (์‹คํ–‰ํ•  ์ž‘์—…)
  • Input Data Field Name: ์—…๋กœ๋“œํ•  ์ฒจ๋ถ€ํŒŒ์ผ ๋ฐ์ดํ„ฐ

$('๋…ธ๋“œ์ด๋ฆ„').item.binary ์†์„ฑ์œผ๋กœ ํŠน์ • ๋…ธ๋“œ์˜ ์ฒจ๋ถ€ ํŒŒ์ผ(๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ)์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

{{ $('get_emails').item.binary.attachment_0 }}
  • File Name: ์ €์žฅ๋  ํŒŒ์ผ๋ช…
{{ $json.output.date }}-{{ $json.output.vendor }}-{{ $json.output.totalAmount }}.{{ $('get_emails').item.binary.attachment_0.fileExtension }}
  • Parent Drive > From list: My Drive (๊ฐœ์ธ ๋“œ๋ผ์ด๋ธŒ ์ง€์ •)
  • Parent Folder > From list: Receipts (์—…๋กœ๋“œํ•  ํด๋” ์ง€์ •)

 

์ด์ œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์‹คํ–‰ํ•ด ๋ณด์ž. ๊ตฌ๊ธ€ ์‹œํŠธ ๊ธฐ๋ก, ๊ตฌ๊ธ€ ๋“œ๋ผ์ด๋ธŒ ์—…๋กœ๋“œ, ์ด๋ฉ”์ผ ํœด์ง€ํ†ต ์ด๋™๊นŒ์ง€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ–ˆ๋‹ค๋ฉด ์„ฑ๊ณต์ด๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ Publish ์ƒํƒœ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ์ง€์ •ํ•œ ์ฃผ๊ธฐ๋งˆ๋‹ค ๋ฉ”์ผํ•จ์„ ํ™•์ธํ•˜๊ณ  ์ œ๋ชฉ์— receipt๊ฐ€ ํฌํ•จ๋œ ๋ฉ”์ผ์„ ์ฐพ์•„ ์ด ๊ณผ์ •์„ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์›Œํฌํ”Œ๋กœ์šฐ ์™„์„ฑ ํ™”๋ฉด
๊ตฌ๊ธ€ ์‹œํŠธ์— ์ง€์ถœ ๋‚ด์—ญ์ด ์ž๋™์œผ๋กœ ๊ธฐ๋ก๋œ ๋ชจ์Šต

 

 

binary ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹


๋‘ ํ‘œํ˜„์‹์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์œ„์น˜์— ์žˆ๋‹ค.

 

$binary๋Š” $input.item.binary์˜ ์ถ•์•ฝ ํ‘œํ˜„์œผ๋กœ, ํ˜„์žฌ ๋…ธ๋“œ๋กœ ์ „๋‹ฌ๋œ ์ž…๋ ฅ(input) ์•„์ดํ…œ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์ฆ‰, ํ˜„์žฌ ๋…ธ๋“œ๊ฐ€ ์ฒ˜๋ฆฌ ์ค‘์ธ ์ž…๋ ฅ ์•„์ดํ…œ์ด binary ์†์„ฑ์„ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด์•ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ฐ˜๋ฉด $('๋…ธ๋“œ์ด๋ฆ„').item.binary๋Š” ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ž…๋ ฅ์ด ์•„๋‹Œ, ํŠน์ • ๋…ธ๋“œ๊ฐ€ ์ถœ๋ ฅํ•œ ์•„์ดํ…œ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋•Œ ํ˜„์žฌ ์•„์ดํ…œ์ด ํ•ด๋‹น ๋…ธ๋“œ์˜ ์•„์ดํ…œ๊ณผ ์—ฐ๊ฒฐ(Item Linking)๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

 

์ค‘๊ฐ„์— ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์น˜๋ฉด์„œ ํ˜„์žฌ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ binary ์†์„ฑ์ด ์œ ์‹ค๋๋‹ค๋ฉด $binary ๋กœ๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. ์ด ๊ฒฝ์šฐ ์›๋ณธ ํŒŒ์ผ์ด ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์ง์ ‘ ์ฐธ์กฐํ•ด์•ผ ํ•œ๋‹ค. ์˜ˆ) $('๋…ธ๋“œ์ด๋ฆ„').item.binary

 

๐Ÿ” $json ์—ญ์‹œ $input.item.json์˜ ์ถ•์•ฝ ํ‘œํ˜„์œผ๋กœ, ํ˜„์žฌ ๋…ธ๋“œ๋กœ ์ „๋‹ฌ๋œ ์ž…๋ ฅ ์•„์ดํ…œ์˜ JSON ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. $input์€ ํ˜„์žฌ ๋…ธ๋“œ๋กœ ๋“ค์–ด์˜จ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฐ์ฒด๋กœ all(), first(), last() ๋“ฑ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. $input.item์€ ๋…ธ๋“œ๊ฐ€ ํ˜„์žฌ ์ฒ˜๋ฆฌ ์ค‘์ธ ๋‹จ์ผ ์•„์ดํ…œ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ $('๋…ธ๋“œ์ด๋ฆ„').item ์—ญ์‹œ ๋‹จ์ผ ์•„์ดํ…œ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

 

n8n์—์„œ ๋…ธ๋“œ๋กœ ์ „๋‹ฌ๋˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ item์„ ๋‹ด์€ ๋ฐฐ์—ด ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๊ฐ item์€ ์ผ๋ฐ˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” json ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ๊ฐ€์ง€๋ฉฐ, ํŒŒ์ผ์„ ํฌํ•จํ•  ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ์™€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” binary ๊ฐ์ฒด๋ฅผ ํ•จ๊ป˜ ๊ฐ€์ง„๋‹ค(์ฐธ๊ณ  ๋งํฌ).

// $input.all() ๋ฐ˜ํ™˜๊ฐ’
[
  {
    // ์ผ๋ฐ˜ ๋ฐ์ดํ„ฐ
    json: {
      apple: "beets",
      carrot: {
        dill: 1,
      },
    },

    // ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ
    binary: {
      "apple-picture": {
        data: "...", // Base64, ํ•„์ˆ˜
        mimeType: "image/png",
        fileExtension: "png",
        fileName: "example.png",
      },
    },
  },
];
๋ฐ˜์‘ํ˜•