๐ [Lv.1] ๋งํฌ ์ ์ฅ ์ ์ฌ๋ & ๋ฉ์ผ ์ค์๊ฐ ์๋ฆผ โ
IMPORTANT
์ด ๊ฐ์ด๋์์๋ ์ฐ๋ฆฌ ์๋น์ค์ ๋งํฌ๊ฐ ์ถ๊ฐ๋๋ ์๊ฐ์ ๊ฐ์งํด์, ์ง์ ํ ์ฌ๋ ์ฑ๋๊ณผ ์ด๋ฉ์ผ๋ก ์์ธ ์ ๋ณด๋ฅผ ์ ์กํ๋ ์ํฌํ๋ก์ฐ๋ฅผ ๋ง๋ญ๋๋ค.
์ต๋ํ n8n์ ๊ธฐ๋ณธ ๋ ธ๋๋ง์ ์ฌ์ฉํ์ฌ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์๋ด๋๋ฆฌ๋ฉฐ, ์ํฉ์ ๋ฐ๋ผ ์ปค์คํ ์คํฌ๋ฆฝํธ๋ ์ถ๊ฐ ๋ ธ๋๊ฐ ํ์ํ ์ ์์ต๋๋ค.
์๋ต๋ ์ ๋ณด๋ ์์ผ๋ฉฐ, n8n์ ๋ฌ๋์ปค๋ธ๊ฐ ์์ ์ ์์ผ๋, ์ต์ํ์ง ์์ ๊ฐ๋ฐ์ ๋ถ๋ค์ ์ถฉ๋ถํ ํ์ต์ด๋ ํ ์คํธ ํ ์ ์ฉํ์๊ธธ ๊ถ์ฅ๋๋ฆฝ๋๋ค.
๋ณธ ๊ฐ์ด๋๋ n8n ๋ฒ์ 1.115.3๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ฑ๋์์ต๋๋ค.
1. n8n ์ํฌํ๋ก์ฐ ๊ตฌ์ฑ โ
- Webhook Node (ํธ๋ฆฌ๊ฑฐ) โ Slack Node (์๋ฆผ) โ Gmail Node (์๋ฆผ)
2. ์์ธ ์ค์ ๋จ๊ณ โ
Step 1: n8n์์ Webhook URL ์์ฑ ๋ฐ ์๋น์ค ๋ฑ๋ก โ
- n8n์์ Webhook ๋
ธ๋๋ฅผ ์ถ๊ฐํ๊ณ HTTP Method๋ฅผ
POST๋ก ์ค์ ํฉ๋๋ค. - ์์ฑ๋ Production Webhook URL์ ๋ณต์ฌํฉ๋๋ค.
- [์ฐ๋ฆฌ ์๋น์ค -> ํ ์ค์ -> ์นํ ๊ด๋ฆฌ] ํ์ด์ง๋ก ์ด๋ํ์ฌ ๋ณต์ฌํ URL์ ๋ถ์ฌ๋ฃ๊ณ ํ์ฑํ ์ํ๋ฅผ 'ON' ์ผ๋ก ๋ณ๊ฒฝํฉ๋๋ค. (์ด ์ค์ ์ ํด์ผ ๋ฐ์ดํฐ๊ฐ ์ ์ก๋ฉ๋๋ค.)
Step 2: ์ฌ๋ ์๋ฆผ ๋ฉ์์ง ์ค์ โ
์ด์ ์ฐ๋ฆฌ๋ ์ฌ๋ ๋ ธ๋๋ฅผ ์ถ๊ฐํ์ฌ, ์๋ก์ด ๋งํฌ๊ฐ ์ ์ฅ๋ ๋๋ง๋ค ์๋ฆผ์ ๋ณด๋ด๋๋ก ์ค์ ํ ๊ฒ์ ๋๋ค.
Step 1์์ ์์ฑํ Webhook ๋ ธ๋์ ์ด์ด์ Slack ๋ ธ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
์ฌ๋ ๋ ธ๋์์ ๋ฏธ๋ฆฌ ์์ฑํ ์ฌ๋ ํฌ๋ ๋ด์ ์ ์ ํํฉ๋๋ค.
Resource๋
Message๋ก, Operation์Send๋ก, Send Message To๋Channel๋ก ์ค์ ํฉ๋๋ค.Channel ํ๋๋
By ID๋ก ์ค์ ํ๊ณ , ์๋ฆผ์ ๋ฐ์ ์ฌ๋ ์ฑ๋์ ID๋ฅผ ์ ๋ ฅํฉ๋๋ค.- ์ฑ๋ ID๋ ์ฌ๋์์ ํด๋น ์ฑ๋ ์ฐํด๋ฆญ -> ์ฑ๋ ์ธ๋ถ ์ ๋ณด ๋ณด๊ธฐ -> ํ๋จ ์ฑ๋ ID์์ ํ์ธํ ์ ์์ต๋๋ค. (์:
C01234567AB) - ์ฐธ๊ณ : ํผ๋ธ๋ฆญ ์ฑ๋์
#general๊ณผ ๊ฐ์ ์ด๋ฆ์ผ๋ก๋ ์ง์ ํ ์ ์์ง๋ง, ํ๋ผ์ด๋น ์ฑ๋์ ๋ฐ๋์ ID๋ก ์ง์ ํด์ผ ํฉ๋๋ค.
- ์ฑ๋ ID๋ ์ฌ๋์์ ํด๋น ์ฑ๋ ์ฐํด๋ฆญ -> ์ฑ๋ ์ธ๋ถ ์ ๋ณด ๋ณด๊ธฐ -> ํ๋จ ์ฑ๋ ID์์ ํ์ธํ ์ ์์ต๋๋ค. (์:
Message Text ํ๋์ ์๋์ ๊ตฌ์กฐํ๋ ํ ์คํธ๋ฅผ ๋ณต์ฌํ์ฌ ๋ฃ์ผ์ธ์.
์๋๋ ์์ ๋ฉ์์ง ํ ํ๋ฆฟ์ ๋๋ค:
text๐ *์๋ก์ด ๋งํฌ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค!* ๐ *์ ๋ชฉ*: {{ $json.body.data.title }} ๐ *URL*: {{ $json.body.data.url }} ๐ *์์น*: {{ $json.body.data.teamName }} > {{ $json.body.data.folderName }} ๐ท๏ธ *ํ๊ทธ*: {{ $json.body.data.tags.join(', ') }} ๐ *์์ฝ*: > {{ $json.body.data.summary }} ๐ค *์ ์ฅํ ์ฌ๋*: {{ $json.body.data.createdBy.nickname }}์ค์ ์ ๋ง์น ํ, ๋ ธ๋๋ฅผ ์ ์ฅํฉ๋๋ค.
Step 3: ์ง๋ฉ์ผ(Gmail) ์๋ฆผ ์ค์ โ
- Slack ๋ ธ๋ ๋ค์์ Gmail ๋ ธ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
- ์ง๋ฉ์ผ ๋ ธ๋์์ ๋ฏธ๋ฆฌ ์์ฑํ ์ง๋ฉ์ผ ํฌ๋ ๋ด์ ์ ์ ํํฉ๋๋ค.
- ์ง๋ฉ์ผ ํฌ๋ ๋ด์ ์์ฑ ์ OAuth2 ์ธ์ฆ ๋ฐฉ์์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. (์ผ๋ฐ SMTP ๋ฐฉ์์ ๋ณด์ ๋ฌธ์ ๋ก ์ธํด ๊ถ์ฅ๋์ง ์์ต๋๋ค.)
- ์ง๋ฉ์ผ ํฌ๋ ๋ด์ ์์ฑ ๋ฐฉ๋ฒ์ ๊ฐ์ข ๊ณต์ ๋ฌธ์๋ ๊ฐ์ด๋๋ฅผ ์ฐธ๊ณ ํ์ธ์.
Resource๋
Message๋ก, Operation์Send๋ก ์ค์ ํฉ๋๋ค.To ํ๋์ ์๋ฆผ์ ๋ฐ์ ์ด๋ฉ์ผ ์ฃผ์๋ฅผ ์ ๋ ฅํฉ๋๋ค.
Subject ํ๋๋ ์ํ๋ ์ ๋ชฉ์ผ๋ก ์ค์ ํฉ๋๋ค. ์:
[Lilcookie] ์ ๊ท ๋งํฌ ์ ์ฅ ์๋ฆผEmail Type์
Text๋ก ์ค์ ํฉ๋๋ค.Message ํ๋์ ์๋์ ๊ตฌ์กฐํ๋ ํ ์คํธ๋ฅผ ๋ณต์ฌํ์ฌ ๋ฃ์ผ์ธ์.
text[Lilcookie] ์ ๊ท ๋งํฌ ์ ์ฅ ์๋ฆผ ์ฐ๋ฆฌ ์๋น์ค์ ์๋ก์ด ์ง์์ด ์ ์ฅ๋์ด ์๋ด๋๋ฆฝ๋๋ค. -------------------------------------------------- ๐ ์ ์ฅ ์ ๋ณด ์์ธ -------------------------------------------------- โ ์ ๋ชฉ: {{ $('์นํ ').item.json.body.data.title }} โ ๋งํฌ: {{ $('์นํ ').item.json.body.data.url }} โ ํ/ํด๋: {{ $('์นํ ').item.json.body.data.teamName }} / {{ $('์นํ ').item.json.body.data.folderName }} โ ํ๊ทธ: {{ $('์นํ ').item.json.body.data.tags.join(', ') }} [์์ฝ ๋ด์ฉ] {{ $('์นํ ').item.json.body.data.summary }} -------------------------------------------------- ์ถ๊ฐ๋ ๋งํฌ์ ์์ธ ๋ด์ฉ์ ์๋น์ค์์ ํ์ธํ์ค ์ ์์ต๋๋ค. ์ ์ฅ ์๊ฐ: {{ $('์นํ ').item.json.body.timestamp }}์ค์ ์ ๋ง์น ํ, ๋ ธ๋๋ฅผ ์ ์ฅํฉ๋๋ค.
3. ํ ์คํธ ๋ฐ ํ์ฑํ โ
- n8n ์๋จ์ Execute Workflow๋ฅผ ํด๋ฆญํฉ๋๋ค.
- ์ฐ๋ฆฌ ์๋น์ค(์น/์ต์คํ ์ )์์ ๋งํฌ๋ฅผ ์ ์ฅํฉ๋๋ค.
- ์ฌ๋ ๋ฉ์์ง์ ์ง๋ฉ์ผ์ด ์ ์์๋๋ก ์์๊ฒ ๋์ฐฉํ๋์ง ํ์ธํฉ๋๋ค!
4. ๊ฒฐ๊ณผ ์์ โ
- ์ ๋ฌ๋ ์ฌ๋ ๋ฉ์์ง ์์:
- ์ ๋ฌ๋ ์ง๋ฉ์ผ ์์:
๐ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ฐธ๊ณ โ
์นํ ์ผ๋ก ๋์ด์ค๋ ๋ ์์ธํ ํ์ด๋ก๋ ์ ๋ณด๋ ์๋ ๋ ํผ๋ฐ์ค๋ฅผ ํ์ธํ์ธ์.
๐ API Reference: ์นํ ์ด๋ฒคํธ ํ์ด๋ก๋
๊ตฌ์ฑ๋ n8n ์ํฌํ๋ก์ฐ ํ์ผ โ
- Exam_Notification_n8n.json
- ์ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ์ํฌํ๋ก์ฐ JSON ํ์ผ์ ๋ค์ด๋ก๋ํ ํ, n8n์์ ๊ฐ์ ธ์ค๊ธฐ(import)ํ์ฌ ์ฌ์ฉํ์ธ์.