๐์ด ๊ธ์ ๋์ค๋ ํด ์ ๋ณด๐
1๏ธโฃ n8n
-url: https://n8n.io/
-์ฌ๋ฌ api๋ฅผ ํ ๋ฒ์ ์ฐ๋ํด ๋๋ง์ AI ์์ด์ ํธ ์์ฑ ๊ฐ๋ฅ "๊ตฌ๋ ํ์"
2๏ธโฃfirecrawl
-url: https://www.firecrawl.dev/
-๋ค์ด๋ฒ ์ผํ, ๋ค์ด๋ฒ ๋ด์ค, ๊ตฌ๊ธ ์ผํ ๋ฑ ์ฌ๋ฌ api ๋ค์ ๋ชจ์๋์ ๊ณณ "๊ฐ์ ํ์"
์ค๋์ ๋ค์ด๋ฒ ์ฆ๊ถ(https://finance.naver.com/)์ ๋์์๋ ์ฝ์คํผ, S&P500, ๋ค์ฐ์ง์, ํ์จ, ๊ตญ์ ์ ๊ฐ, ๊ตญ์ ๊ธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ํฌ๋กค๋งํด ๊ตฌ๊ธ ์คํ๋ ๋์ํธ์ ์๋ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํด ๋ณด๋ ค ํ๋ค.
'๋ค์ด๋ฒ ์ฆ๊ถ โบ S&P500 โบ ์ผ๋ณ ์์ธ'์ ๋์์๋ ์ข ๊ฐ ๋ฐ์ดํฐ๊ฐ ๊ตฌ๊ธ ์คํ๋ ๋์ํธ์ ๋งค์ผ ์ ๋ฐ์ดํธ๋๋๋ก ํ๋ ์์ ์ด๋ผ ๋ณด๋ฉด ๋๋ค. (S&P500, ๋ค์ฐ์ง์๋ ์ ๋ ์ข ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๊ฑฐ๋ผ S&P500 2/12 ๋ฐ์ดํฐ๋ ๊ตฌ๊ธ ์คํ๋ ๋์ํธ 2/13๋ก ์ ๋ฐ์ดํธ๋ ๊ฒ์ด๋ค.)

๐๊ธ ์์
-์ฒซ๋ฒ์งธ, n8n ์ firecrawl API ์ฐ๋ํ๊ธฐ
-๋๋ฒ์งธ, ํฌ๋กค๋ง ๋ฐ์ดํฐ+๊ตฌ๊ธ ์คํ๋ ๋์ํธ์ ์ฐ๊ฒฐํ๊ธฐ
-์ธ๋ฒ์งธ, ์ ๋ฐ์ดํธ ์ผ์ ์ ํ๊ธฐ
-๋ค๋ฒ์งธ, S&P500 ์ธ ๋ค๋ฅธ ์งํ๋ค๋ ๊ฐ์ ธ์ค๊ณ ์ถ๋ค๋ฉด?
์ฐ์ , n8n ์ํฌํ๋ก์ฐ๋ฅผ ์๋ก ์์ฑํ๊ณ "trigger manually"๋ฅผ ์ฐ๊ฒฐํ๋ค. ์ด๊ฑธ ์ฐ๊ฒฐํ๋ ์ด์ ๋ ์ธํ ์ค๊ฐ์ค๊ฐ ์คํํด์ ๊ฒฐ๊ณผ๋ฌผ์ ํ์ธํ๊ธฐ ์ํจ์ด๋ค.


[์ฒซ๋ฒ์งธ, n8n ์ firecrawl API ์ฐ๋ํ๊ธฐ]
firecrawl( https://www.firecrawl.dev/ )โบ Scrap โบ ์ฐฝ์ ํฌ๋กค๋งํ๋ ค๋ URL์ ๋ฃ์ผ๋ฉด ์๋์ ๊ฐ์ด ๋์จ๋ค. ์ฐฝ ํ๋จ "forma=JSON"์ ์ ํํ๊ณ GET CODE์์ cURL์ ๋ณต์ฌํ๋ค.


n8n์์ Http request ๋ฅผ ํด๋ฆญํ๊ณ cURL์ ๋ถ์ฌ๋ฃ๊ณ , execute step ์ ํด๋ฆญํ๋ฉด? ๋ญ๊ฐ ์ ๋์จ ๊ฒ ๊ฐ์ง๋ง, ์ผ๋ณ ์์ธ ๋ฐ์ดํฐ๊ฐ ๋์ค์ง ์๋๋ค.

์ด๋ฐ ์ค๋ฅ๊ฐ ๋ฌ์ ๋๋? ์ฑgpt ํํ ๋ฌผ์ด๋ณด๋ฉด ๋๋ค. ๊ฒฐ๋ก ์ http request ์ธํ ์์ ์๋์ ๊ฐ์ด ์์ ํด์ผ ํ๋ค.

โผJOSN ์์ญ์๋ ์ด๊ฑธ ๋ณต๋ถํ๋ฉด ๋๋คโผ
{
"url": "https://finance.naver.com/world/sise.naver?symbol=SPI@SPX&page=1",
"onlyMainContent": false,
"maxAge": 0,
"waitFor": 2000,
"proxy": "auto",
"storeInCache": false,
"formats": [
{
"type": "json",
"prompt": "Extract the S&P 500 (SPI@SPX) daily prices table rows. Return an array 'daily' with: date, close, diff, rate, volume, amount. date format YYYY.MM.DD. Keep numbers as strings with commas if present.",
"schema": {
"type": "object",
"properties": {
"daily": {
"type": "array",
"items": {
"type": "object",
"properties": {
"date": { "type": "string" },
"close": { "type": "string" },
"diff": { "type": "string" },
"rate": { "type": "string" },
"volume": { "type": "string" },
"amount": { "type": "string" }
},
"required": ["date", "close"]
}
}
},
"required": ["daily"]
}
}
]
}
๊ทธ๋ฆฌ๊ณ ์ค๋ฅธ์ชฝ ์๋จ "execute step"์ ํด๋ฆญํ๋ฉด ์ผ๋ณ ์์ธ ๋ถ๋ถ์ด ์ ์์ ์ผ๋ก ๋์ด์ ์ง๋ค.
[๋๋ฒ์งธ, ํฌ๋กค๋ง ๋ฐ์ดํฐ+๊ตฌ๊ธ ์คํ๋ ๋์ํธ์ ์ฐ๊ฒฐํ๊ธฐ]
n8n์์ + ๋ ธ๋๋ฅผ ํด๋ฆญํ๊ณ google sheet โบ update row in sheet ๋ฅผ ํด๋ฆญํ๋ค.

credendtial to connect with ์์ "+crete new credential"์ ํด๋ฆญํ๋ฉด ํ์ ์ฐฝ ํ๋จ์ sign in with google ์ด ๋์จ๋ค. ๊ฑฐ๊ธฐ์ ๋ด google ๊ณ์ ์ ์ฐ๋ํ๋ค.

๊ทธ๋ฌ๋ฉด ์๋์ ๊ฐ์ด document ํญ๋ชฉ์ ๋ด ๊ตฌ๊ธ ๋๋ผ์ด๋ธ์ ์๋ ๋ชจ๋ ๊ตฌ๊ธ ์คํ๋ ๋์ํธ๋ค์ด ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋๋ค.


์ฌ๊ธฐ์ ๋๋ S&P500 ์งํ๋ง ์ ๋ฐ์ดํธํ ๊ฒ์ด๋ฏ๋ก ๋ ์ง์ S&P500์ ์ ์ธํ๊ณ ๋ ๋ชจ๋ ์ญ์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ผ์ชฝ์์ ๋์ด์ค๊ธฐ๋ง ํ๋ฉด ๋์ด๋ค.
โ๏ธ๋ง์ฝ ์ ์ผ ์ข ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ถ๋ค๋ฉด? ๋ฐฉ๋ฒ1๏ธโฃ
S&P500 ์ ๋ ์ข ๊ฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ด๋ค. 2์ 12์ผ ํญ๋ชฉ์ 2์ 11์ผ ์ข ๊ฐ๊ฐ ๋ค์ด๊ฐ๋๋ก ํ๊ณ ์ถ์ ๊ฒ. ์ด ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด ๋ ์ง์๋ 2์ 12์ผ, S&P500๊ฐ์๋ ์ ๋ close ๋ฐ์ดํฐ๋ฅผ ๋์ด์ค๋ฉด ๋๋ค.

โ๏ธ2์ 13์ผ ์ต๊ทผ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ถ๋ค๋ฉด? ๋ฐฉ๋ฒ2๏ธโฃ
์์ ๊ฐ์ด ํ๋ฉด ์์ฌ์ด ์ ์ ์ต๊ทผ ๋ฐ์ดํฐ ํ์ธ์ด ์ด๋ ต๋ค๋ ๊ฑฐ๋ค. ์ค๋์ด 2/13์ด๋ผ 2/12 ์ข ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ถ์๋ฐ 2/12์ 2/11 ์ข ๊ฐ ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ค๊ฒ ๋๋ ๊ฒ! ๊ทธ๋์ 2/13์ 2/12 ์ข ๊ฐ ๋ฐ์ดํฐ, ๋ง ๊ทธ๋๋ก ๊ฐ์ฅ ์ต๊ทผ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ค๋ฉด ๋ง์ง๋ง ๋ฐ์ดํฐ ๋ ์ง(2/12)์ ํ๋ฃจ๋ฅผ ๋ํด์, 2/12 ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ํ๋ฉด ๋๋ค.
โ ๋ ์ง์๋ ์๋ JSON์ ๋ฃ๊ณ ,
{{ DateTime.fromFormat($json.data.json.daily[0].date, 'yyyy.MM.dd')
.plus({ days: 1 })
.toFormat('yyyy-MM-dd') }}
โก2/12 colse ๊ฐ์ S&P500์ ๋๊ณ ์ค๋ฉด ๋๋ค.

โผ๏ธ์ฌ๊ธฐ์ ์ค์ํ ๊ฑด
๊ตฌ๊ธ ์คํ๋ ๋์ํธ์ ๋ ์ง ํํ์ n8n์ ๋ ์ง ํํ๊ฐ ๋ง์ง ์์ผ๋ฉด ์ ์์ ์ผ๋ก ์ ๋ฐ์ดํธ๊ฐ ์๋๋ค๋ ๊ฒ์ด๋ค.
n8n์ ๋ ์ง ํํ๊ฐ "yyyy.mm.dd"์ด๊ณ ๊ตฌ๊ธ ์คํ๋ ๋์ํธ๋ "yyyy-mm-dd"๋ค. ํํ๊ฐ ๋ง์ง ์์ผ๋ฉด ์ ๋ฐ์ดํธ๊ฐ ๋์ง ์์ผ๋ฏ๋ก ์ด๊ฑธ ๋ง์ถฐ์ค์ผ ํ๋ค. ๋๋ n8n ๋ ์ง ํญ๋ชฉ json์ ์๋์ ๊ฐ์ด ๋ฐ๊ฟ์ฃผ์๋ค. (๋ฌผ๋ก ๋๋ ๊ฐ๋ฐ์ฝ๋๋ฅผ 1๋ ๋ชจ๋ฅด๋ฏ๋ก ์ฑgpt๊ฐ ์๋ ค์ค ์ฝ๋๋ฅผ ๊ทธ๋๋ก ๋ณต๋ถํ๋ค.)
๋ง์ฝ ์ด๋ ๊ฒ ํ๋๋ฐ๋ ์ค๋ฅ๊ฐ ๋๋ค๋ฉด ๊ตฌ๊ธ ์คํ๋ ๋์ํธ ํํ์์ 0์ด ์ ์ธ๋ ๋ ์ง๋ก ์ค์ ๋์๋์ง ํ์ธํด๋ณด๋ฉด ๋๋ค. (2026-02-10 ์ด ์๋ 2026-2-10 ์ด๋ฉด ์ค๋ฅ๊ฐ ๋๊ธฐ ๋๋ฌธ)
#์์ ์
{{ $json.data.json.daily[0].date }}
#์์ ํ
{{ $json.data.json.daily[0].date.replace(/\./g, '-') }}

์ด๋ ๊ฒ ํด์ ์ค๋ฅธ์ชฝ ์๋จ execute step์ ํด๋ฆญํด ๋ณด๋ฉด ์๋์ ๊ฐ์ด ์ ์์ ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค๋ ๊ฑธ ํ์ธํ ์ ์๋ค.

[์ธ๋ฒ์งธ, ๋งค์ผ ํน์ ์๊ฐ์ ์ ๋ฐ์ดํธ๋๋๋ก ํ๊ธฐ]
์ค๋ฅธ์ชฝ + ๋ฅผ ํด๋ฆญํด schedule trigger ๋ฅผ ํด๋ฆญํด ์ํ๋ ์ผ์ ์ ๋ฃ๊ณ ๋งจ ์์ชฝ์ ์ฐ๊ฒฐํด์ฃผ๋ฉด ๋๋ค.



[๋ค๋ฒ์งธ, ๋ค์ด๋ฒ ์ฆ๊ถ์์ S&P500 ๋ง๊ณ ๋ค๋ฅธ ์ํ๋ ์งํ๋ค๋ ๋๊ณ ์ค๊ณ ์ถ๋ค๋ฉด?]
์ ์์ ์ ๋ฐ๋ณตํด์ ์๋์ ๊ฐ์ด ์ถ๊ฐํ๋ฉด ๋๋ค.

์ฌ๊ธฐ๊น์ง ์์ ํ๋ค๋ฉด ์ด๋ฐ ๊ณ ๋ฏผ์ด ๋ค ์ ์๋ค.
์ต๊ทผ 7์ผ ์ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์ ๋ฐ์ดํธ ํ ์ ์์๊น?
์ด๊ฑด ๋ค์ ๊ธ์์ ๊ตฌ์ฒด์ ์ผ๋ก ์ค๋ช ํ๊ฒ ๋ค. ์ด๊ฒ๊น์ง ๊ฐ๋ฅํ๋ฉด ์์ฉํ ๊ฒ๋ค์ด ๋ง์์ง๋ค.
์๋ฅผ ๋ค์ด, ๋ง์ผํฐ ์ ์ฅ์์ ๋ฉํ/๊ตฌ๊ธ ๊ด๊ณ ๊ด๋ฆฌ์ API๋ฅผ ์ฐ๋ โบ ๊ฐ ๋งค์ฒด ๊ด๊ณ ์ฑ๊ณผ๋ฅผ ์ต๊ทผ 30์ผ ์ ๋ฐ์ดํฐ๊น์ง ์๋์ผ๋ก ๊ตฌ๊ธ ์คํ๋ ๋์ํธ(๋ฐ์ผ๋ฆฌ ๋ฆฌํฌํธ ๋ด ๋ก์ฐ ์ํธ)์ ์ ๋ฐ์ดํธํ๋ ๊ฒ ๊ฐ๋ฅํ๋ค. ๋งค์ฒด ๊ด๊ณ ๊ด๋ฆฌ์ ๋ค์ด๊ฐ์ ๋ฆฌํฌํธ ๋ค์ด๋ฐ๊ณ ๋ฐ์ผ๋ฆฌ ๋ฆฌํฌํธ์ ๋ก์ฐ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ ์๊ฐ์ ์ค์ผ ์ ์๋ ๊ฒ์ด๋ค.
์ฌํผ, ์ ๊ด๋ จ ๋ด์ฉ์ ๋ค์ ๊ธ์์ ์ข ๋ ์์ธํ ๋ค๋ฃจ๊ฒ ๋ค.