1.๋ฐฐ๊ฒฝ
์๋ฏธ์๋ ๋ฐฐ์ก์ ๋ณด ์์ฒญํ๊ธฐ๋ผ๋ ๊ธฐ๋ฅ์ด ์๋ค. ์์ง๊น์ง ์๋น์ค์์ ๋ฐฐ์ก์ ๋ณด๋ฅผ ๋ฏธ๋ฆฌ ์๋ ค์ฃผ์ง ์๊ณ ๋ฐฐ์ก ์ ๋ณด ์์ฒญ์ ์ํ๋ ์ ์ ์๊ฒ๋ง ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์๋ค.
๊ธฐ๋ฅ์ด ๊ณ ๋ํ ๋์ง ์์ ์ด๋๋ฏผ์ด ์์ฒญ ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ์ํด์ ์ผ๋ จ์ ์๋์์ ์ ๊ฑฐ์น๊ฒ ๋๋ค.
1.์ด์์๋ ๋น ๋ฅด๊ฒ ํญ์ ์ ํํ์ฌ ๋ฐฐ์ก์ ๋ณด๋ฅผ ํ์ธํ๋ฌ ํน์ ์ฌ์ดํธ์ ๋ค์ด๊ฐ๋ค.
2.๋ก๊ทธ์ธ์ ์๋ํ๋ค.
3.๋ฐฐ์ก ์ ๋ณด๋ฅผ ์์ฒญํ ์ฃผ๋ฌธ ์ ๋ณด๋ค์ ํ๋์ฉ ์ฐพ์๋ณธ๋ค. ์ฃผ๋ฌธํ์ง ๊ฝค๋ ์ค๋ ๋ ๊ฒ์ด๋ผ๋ฉด ํ์ด์ง๋ฅผ ๋๊ฒจ ๋ค๋ก ๊ฐ์ผ ํ๋ค. ํน์ ๋ฌดํ ์คํฌ๋กค๋ก UI๊ฐ ๋์ด ์๋ค๋ฉด ์คํฌ๋กค์ ๊ณ์ ๋ด๋ฆฌ๊ณ ์์ ๊ฒ์ด๋ค.
- ์ ๋ณด๋ฅผ ์ฐพ์๋ค๋ฉด ํ ์คํธ๋ฅผ ๋๋๊ทธ ํ์ฌ ๋ณต์ฌํ๊ณ
- ๋ค์ ์ด๋๋ฏผ ํญ์ผ๋ก ๋์์ ์ด์ก์ฅ ๋ฒํธ๋ฅผ ๋ถ์ฌ ๋ฃ๊ธฐ ํ๊ณ ํ๋ฐฐ์ฌ๋ฅผ ์ ํํ ํ ๋ฐฐ์ก ์ ๋ณด ์ ์ก ๋ฒํผ์ ๋๋ฆ์ผ๋ก์จ ๋น๋ก์ ์์ ์ด ์๋ฃ๋๋ค.
์ด ๊ณผ์ ์ด ์๊ฐ ๋ณด๋ค ์๋์ง๋ฅผ ๋ง์ด ์๋ชจ ํ๊ฒ ํ๋ ์ผ์ด๋ค.
๋งฅํจ์ง ์กฐ์ฌ์ ๋ฐ๋ฅด๋ฉด, ์ง์ฅ์ธ์ ํ๋ฃจ ํ๊ท 2.2์๊ฐ ์ด์ ๋ฉ์ ์ ๋ ์ด๋ฉ์ผ ์๋ฆผ์ ๋ฐฉํด ๋ฐ๋๋ค๊ณ ๋ํ๋ฌ๋ค '๋ฅ์ํฌ(Deep Work)'์ ์ ์์ธ ์นผ ๋ดํฌํธ(Cal Newport)๋ ์ด๋ฉ์ผ, ๋ฉ์ ์ ์ ๊ฐ์ ํผ์์ ์ธ ์ ๋ฌด์ ์ปจํ ์คํธ ์ค์์นญ(Context-Switching)์ ์ค์ด๋ ์ผ์ด ์ ๋ฌด ๋ชฐ์ ์ ๊ฐ์ฅ ์ค์ํ๋ค๊ณ ๋ฐํ๋ค. ์ค์ ์ํ์ด์ง ํ์ ํด '๋ ธ์ '์ ์กฐ์ฌ ๊ฒฐ๊ณผ์ ๋ฐ๋ฅด๋ฉด, ์ด์ฉ์ ์ค 98%๊ฐ ๋ ธ์ ์ผ๋ก ์ ๋ฌด ์๊ฐ์ ์ ์ฝํ ๊ฒ์ผ๋ก ๋ํ๋ฌ๋ค. ๋ ํ๋ก์ ํธ ์์ ์๊ฐ ํ๊ท 32%๋ฅผ ๋จ์ถ ์ํค๊ณ ์ด๋ฉ์ผ ์์ ๋ฐ ๋ฐ์ ๋๋ 26% ์ค์ด๋ ํจ๊ณผ๋ฅผ ๊ฑฐ๋๋ค๊ณ ๋ตํ๋ค.
์ฌ์ง์ด ์์ง ์ก์ฅ๋ฒํธ๊ฐ ์ค๋น๋์ง ์์ ๋ฐฐ์ก์ค๋น์ธ ๊ฒฝ์ฐ, ๋ค์๋ ๋ค์ ํ์ธํด์ ๋ฒํธ๋ฅผ ์ค์ผ ํ๋ค.
๋ฐฐ์ก ์๋ฆผ ๊ธฐ๋ฅ ์คํ๋ฆฐํธ๋ฅผ ์์ํ๋ ๊ฒ๋ ๋ฐฉ๋ฒ ์ด๋ค. ์๋ก์ด ๋ฐฐ์ก ์ ๋ณด ์๋ฆผ ๊ธฐ๋ฅ์ ์ธ๋ถ API๋ฅผ ํตํด ๋์ ํ๋ ๊ฒ์ ๊ฐ๋ฅํ์ง๋ง, ์ด ๊ณผ์ ์ ์ฌ๋ฌ ๋ด๋น์๊ฐ ๊ด์ฌํ๊ฒ ๋๋ฉด์ ์คํ๋ฆฐํธ์ ์ ์ํ ์งํ์ด ์ด๋ ค์์ง ์ ์๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ ์ถ๊ฐ๋ ํ ๋ด์์ ์ฑ ์์ด ํ๋๋๋ฉฐ, ์ฌ๋ฌ ์ดํด๊ด๊ณ์ ์กฐ์จ ๊ณผ์ ์ด ํ์ํด์ง๊ธฐ ๋๋ฌธ์ ์ ์๋ฉด์์๋ ๋จ์ด์ง๋ค.
๋น ๋ฅด๊ณ ๊ฐ๋ณ๊ฒ ์์ฐ์ฑ์ ์ฆ๋ ์ํฌ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ๋์ผ๋ก ๋งค์ผ ์ค์ ์ ํด์ง ์๊ฐ์ ๋ด์ผ๋ก ์๋ ค์ฃผ๋ ๋ฐฉ์์ ์ ํํ๋ค. ์ฌ๋์ ๋ชจ๋ ํ์๋ค์ ์ค์ ์์คํ ์ด๋ฏ๋ก, ์ฌ๋์ด ์ ๋ฌด์ ์ํํธ์จ์ด ํด ์ปจํ ์คํธ ์ค์์นญ์๋ ๋์์ด ๋ ๊ฒ์ด๋ผ ์๊ฐํ๋ค.
2.ํด ์ ํ
AWS Lambda ์ ํ ์ด์ ์ ํธ๋ ์ด๋ ์คํ
AWS Lambda๋ฅผ ์ ํํ ์ฃผ๋ ์ด์ ๋ ๋ฌด์๋ณด๋ค๋ "์๋ฒ๋ฆฌ์ค(Serverless)" ์ํคํ ์ฒ์ ์ด์ ์ด๋ค. ์์ฐ์ฑ์ ์ํ ๊ฐ๋ฒผ์ด ํด์ ๋ฐฑ์๋ ์๋ฒ์ ์์กดํ์ฌ ๊ฐ์ด ๋ณํํ๊ธฐ ๋ณด๋ค ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ์ ธ ๊ฐ๋๊ฒ ์ ์ง๋ณด์๊ฐ ๋ ์ข์ ๊ฒ์ด๋ผ ์๊ฐํ๊ณ , ๋ง์ฝ ์๋น์ค ๊ณ ๋ํ๋ก ์ด ๊ธฐ๋ฅ์ด ์ฌ๋ผ์ง ์๋ ์๊ธฐ ๋๋ฌธ์ Lambda๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฒ ๊ด๋ฆฌ์ ๋ถ๋ด ์์ด ์ฝ๋๋ฅผ ์คํํ ์ ์๋ค. ์ด๋ ํนํ ์ฐ๋ฆฌ์ ๊ฐ์ด ๊ฐ๋ณ์ ์ธ ํธ๋ํฝ์ ์ฒ๋ฆฌํ๋ ์๋น์ค์ ์ ํฉํ๋ฉฐ ํ๋ฃจ์ ํ๋ฒ ํน์ ๋๋ฒ์ ํธ์ถ์ด ์๊ธฐ๋ ๋น์ฉ์ ์ผ๋ก๋ ๋ถ๋ด์ด ๋์ง ์๋๋ค๊ณ ์๊ฐํ๋ค.
๋ฌผ๋ก , ํธ๋ ์ด๋ ์คํ๋ ์กด์ฌ ํ๋ค. Lambda์ ๊ฒฝ์ฐ, ์คํ ์๊ฐ, ๋ฉ๋ชจ๋ฆฌ ๋ฑ์ ์ ํ์ด ์์ด์, ๋ ๋ณต์กํ๊ณ ์์ ์ง์ฝ์ ์ธ ์์ ์๋ ์ ํฉํ์ง ์์ ์ ์๊ณ , ๋ํ "์ฝ๋ ์คํํธ" ๋ฌธ์ ๋ก ์ด๊ธฐ ์๋ต ์๊ฐ์ด ๊ธธ์ด์ง ์ ์๋ค๋ ์ ์ ๋ฆฌ์์น๋ฅผ ํตํด ์๊ฒ ๋์๋๋ฐ ์ฌ์ค ์ด ๋ถ๋ถ์ ๋ํด์๋ ์์ธํ ๋ค์ฌ๋ค ๋ณด์ง ๋ชปํ๋ค. ์ฌ๋์๋ ๋์์ด ๋ ๊ฑธ ํ์ธ ํ ์ดํ๋ก๋ ๋ค์ ํ์ธํด ๋ณผ ๊ธฐํ๊ฐ ์ ์์๋ค.๐
Playwright ์ ํ์ด์
playwright๋ ์ด์ ํ์ฌ์์ E2Eํ ์คํธ ์์ฑ์ ํ ๋ ์ฌ์ฉํ๋ ๋๊ตฌ๋ก ๊ทธ ๋ ๋น์ ํํ์๋ฅผ ํตํด puppeteer์ ๋น๊ตํ์ฌ playwright์ ์ด์ ์ ์ด๋์ ๋๋ ์ธ์ง ํ๊ณ ์์๋ค.
๋๊ตฌ๋ค ์ค ํฐ ์ฐจ์ด๊ฐ ์๋ค๋ฉด ๊ทธ๋๋ง ์ต์ํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด First Time To Hello
๋ฅผ ๋ณด๊ธฐ์ ์ ๊ฒฉ์ด๋ผ๊ณ ์๊ฐํ๊ณ ์ผ๋จ ๋น ๋ฅด๊ฒ ๋ง๋ ๋ค ๋ผ๋ ๋ชฉํ์ ์ง์คํด์ ์ ํํ๋ค.
playwright๋ puppeteer๋ณด๋ค developer experience๊ฐ ๋ ์ข๋ค๊ณ ์ฃผ์ฅํ์๋ค.
ํนํ ์๋ ์ง์ฐ ์ฒ๋ฆฌ๋ถ๋ถ์ ์ ์ฉํ๊ณ ๊ฐ์ ํ๋ค๊ณ ํ์๋ค.
์์ puppeteer๋ฅผ ์ฌ์ฉํ ๋น์ ์ ์ ์ ์ก์
์ฒ๋ฆฌ ๊ณผ์ ์์ ๋๋๋๋ ํ์๋ค์ด ๋น๋ฒํ์ฌ ์ด๋ด ๋ wait()
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ง์ฐ์ ์ฃผ๊ณค ํ๋๋ฐ, ์ง์ฐ์ด ๋ง์ ์๋ก ์ฑ๋ฅ์ ์ผ๋ก ์ข์ง ์์ ๊ฑด ๋น์ฐํ๋ค.์ด๋ฐ ๋ถ๋ถ์ playwright์์๋ ๊ฐ์ ํ๋ค๊ณ ํ๋ค.
3. AWS Lambda์ ๊ตฌ์กฐ ๊ฐ๋ต ์ค๋ช
AWS Lambda๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ, ์๋ฒ๋ฆฌ์ค ์ปดํจํ ์๋น์ค ์ด๋ค. ๊ฐ๋จํ ๋งํด์, ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด AWS์์ ์ฝ๋๋ฅผ ์๋์ผ๋ก ์คํํด์ฃผ๋ ์๋น์ค์ด๋ค. Lambda ํจ์๋ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋๋ฉฐ, ํ์ํ ๋ชจ๋ ๊ฒ์ AWS๊ฐ ๊ด๋ฆฌ ํ๋ค. ์ด๋ ๊ฐ๋ฐ์๋ก ํ์ฌ๊ธ ์ธํ๋ผ ๊ด๋ฆฌ๋ณด๋ค ๋น์ฆ๋์ค ๋ก์ง ๊ฐ๋ฐ์ ๋ ์ง์คํ ์ ์๊ฒ ํด์ค๋ค. aws ์์๋ค์ ๋ณด๋ฉด ์ด ๋ถ๋ถ์ ๊ฝค๋ ๊ฐ์กฐ ํ๊ณ ์๋ค.
์๋ ์ด๋ฏธ์ง๋ ํ์ฌ ์ ์ฉ๋ aws lambda ํ์ด์ง์ ๊ธฐ๋ณธ์ ์ธ ์ ์ฒด๊ตฌ์กฐ ๋ฐ ํ๋ฆ์ด๋ค.
- API Gateway: Amazon API Gateway๋ ํด๋ผ์ด์ธํธ์ ๋ฐฑ์๋ ์ฌ์ด์ โ๋ฌธโ๊ณผ ๊ฐ์ ์ญํ ์ ํ๋ค. API Gateway์ ์ ์๋ URL๋ก HTTP ์์ฒญ์ ๋ณด๋ด๋ฉด, API GateWay๊ฐ ์ด ์์ฒญ์ ๋ฐ์ Lambdaํจ์๋ฅผ ํธ์ถํ๊ณ , Lambdaํจ์์ ์ฒ๋ฆฌ๊ฒฐ๊ณผ๋ฅผ ๋ค์ API Gateway๋ฅผ ํตํด ํด๋ผ์ด์ธํธ์๊ฒ ์๋ตํ ์ ์๋ค. ์ดHTTP์์ฒญ์ query paramerter ๋ฅผ ์ด์ฉํ์ฌ ์์ฒญ๋ ๊ฐ๋ฅํ๋ค.
- Lambda ํจ์ ํธ์ถ: API Gateway๋ ์์ฒญ์ ๋ง๋ Lambda ํจ์๋ฅผ ํธ์ถ ํ๋ค.
- EventBridge ์ด๋ฒคํธ ์ฒ๋ฆฌ: EventBridge๋ ๋ค์ํ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๊ณ , ์ด์ ๋ฐ์ํ์ฌ Lambda ํจ์๋ฅผ ํธ๋ฆฌ๊ฑฐํ ์ ์๊ฒ ํด์ค๋ค.
- Cron Job ์ค์ผ์ค๋ง: CloudWatch Events์ Cron ํํ์์ ์ฌ์ฉํ๋ฉด ์ ํด์ง ์๊ฐ ์๋ฅผ ๋ค์ด ์์นจ 9์์ Lambdaํจ์๋ฅผ ์๋์ผ๋ก ํธ์ถ ํ ์ ์๋ค. ์ด๋ฅผ ํตํด ์ฃผ๊ธฐ์ ์ธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฑ์ ์์ ์ ์๋ํํ ์ ์๋ค.
- Lambda ํจ์ ์คํ: Lambda ํจ์๊ฐ ์คํ๋์ด ํ์ํ ์์ ์ ์ํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ ํ๋ค.
- ๊ฒฐ๊ณผ ์ฒ๋ฆฌ: API Gateway๋ฅผ ํตํด ํด๋ผ์ด์ธํธ์๊ฒ ๊ฒฐ๊ณผ๋ฅผ ์๋ตํ๋ค. ์ด ํ๋ก์ ํธ์์๋ ์ฌ๋์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ์๋ตํ๋ค.
ํธ์ถ ์งํ ๊ณผ์
๋ค์์ ์ํ์ค ๋ค์ด์ด๊ทธ๋จ์ ๊ทธ๋ ค์ง ์์์ ์ํ ํ๋ฆ์ผ๋ก ์งํ๋ ๊ฒ์ด๋ค. ์์ ์ ๊ฐ๋ตํ๊ฒ ์ด์ผ๊ธฐ ํ์๋ฉด,
- ์ด๋ฒคํธ ํธ๋ฆฌ๊ฑฐ: ๋งค์ผ ์์นจ๋ง๋ค ํน์ ์๊ฐ์ Lambda ํจ์๋ฅผ ํธ๋ฆฌ๊ฑฐํ๊ธฐ ์ํด AWS CloudWatch Events๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ ๊ฒ ์ค์ ํ๋ฉด, ์ ํด์ง ์๊ฐ์ ์๋์ผ๋ก Lambda ํจ์๊ฐ ํธ์ถ๋๋ค.
- ๋ฐ์ดํฐ ์ฒ๋ฆฌ: ํธ์ถ๋ Lambda ํจ์๋ Playwright๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ด๋ฒ ์ฃผ๋ฌธ ๋ฆฌ์คํธ์ ์ ๊ทผํ๋ค. ์ฌ๊ธฐ์ ํ์ํ ๋ฐฐ์ก ์ ๋ณด๋ฅผ ์ถ์ถํ๋ค.
- ์ฌ๋ ์ฑ๋ด ํต์ : ์ถ์ถ๋ ๋ฐฐ์ก ์ ๋ณด๋ ์ฌ๋ API๋ฅผ ํตํด ์ฌ๋ ์ฑ๋ด์ผ๋ก ์ ์ก๋๋ค. ์ฑ๋ด์ ์ด ์ ๋ณด๋ฅผ ์ ์ ํ ํฌ๋งท์ผ๋ก ๊ฐ๊ณตํ์ฌ ์ฌ๋ ์ฑ๋์ ๋ฉ์์ง๋ฅผ ๋ณด๋ธ๋ค.
๋ค์์ AWS ์ ์ฉ์ ์ฐธ๊ณ ํ๋ฉด ์ข์ ์ฌํญ์ด๋ค.
ํจ์์๋ ์ ํ์ด ์๋ค. 15๋ถ, ๊ทธ๋ฆฌ๊ณ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๋๋ 10GB๊น์ง ๋ํ๋ธ๋ค.
์ ์ฉํ๋ ๊ณผ์ ์์ ๋ง์ฃผํ ์ด์๋ค๋ ์์๋ค.
4 ์งํํ๋ฉด์ ๊ฒช์ ์ด์
AWS Lambda ํ๊ฒฝ ์์์ Playwright ์ฌ์ฉ ์ด์
๋น ๋ฅด๊ฒ ์ฝ๋๋ฅผ ์์ฑํ ํ, zipํ์ผ๋ก ๋ฌถ์ด aws gui๋ฅผ ํตํด ์ ๋ก๋ ํ ๊ฒฐ๊ณผ๋ ์คํจ์๋ค.
{
"errorType": "Error",
"errorMessage": "browserType.launch: Executable doesn't exist at /home/sbx_user1051/.cache/ms-playwright/chromium-1067/chrome-linux/chrome\nโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\nโ Looks like Playwright Test or Playwright was just installed or updated. โ\nโ Please run the following command to download new browsers: โ\nโ โ\nโ npx playwright install โ\nโ โ\nโ <3 Playwright Team โ\nโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ",
"trace": [
"browserType.launch: Executable doesn't exist at /home/sbx_user1051/.cache/ms-playwright/chromium-1067/chrome-linux/chrome",
"โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ",
"โ Looks like Playwright Test or Playwright was just installed or updated. โ",
"โ Please run the following command to download new browsers: โ",
"โ โ",
"โ npx playwright install โ",
"โ โ",
"โ <3 Playwright Team โ",
"โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ",
" at initCrawler (file:///var/task/index.js:21:34)",
" at Runtime.handler (file:///var/task/index.js:205:30)",
" at Runtime.handleOnceNonStreaming (file:///var/runtime/index.mjs:1086:29)"
]
}
์๋ฌ๊ฐ ๋ฌ์ ๋
๋ก์ปฌํ๊ฒฝ์์์ playwright๋ฅผ ์ฌ์ฉํ ๋๋ playwright๋ฅผ ์ค์น ํ ๋, headless browser ๋์์ ์ํด ์๋์ผ๋ก Chrome, Firefox, Webkit ๋ฑ๊ณผ ๊ฐ์ ํ์ํ ๋ธ๋ผ์ฐ์ ๋ค์ ๋ค์ด๋ฐ๊ณ ์ค์นํ๋ค. ์ด ๊ณผ์ ์์ ํ์ํ ๋ธ๋ผ์ฐ์ ์คํ ํ์ผ๋ค์ด ๋ก์ปฌ ์์คํ ์ ์ ์ฅ๋๋๋ฐ, Lambda์ ์๋ฒ๋ฆฌ์ค ์ปดํจํ ํ๊ฒฝ์์๋ Playwright๊ฐ ํ์๋ก ํ๋ ๋ธ๋ผ์ฐ์ ์คํํ์ผ์ด ํฌํจ๋์ด ์์ง ์๋ค.
์ด๋ AWS Lambda์ stateless ํน์ฑ๊ณผ๋ ์ฐ๊ด์ด ์๋๋ฐ, ๋๋คํจ์๊ฐ ์ด๋ฒคํธ์ ์ํด ํธ๋ฆฌ๊ฑฐ ๋ ๋๋ง๋ค ์์ ํ ์๋ก์ด ํ๊ฒฝ์์ ํธ์ถ๋๋ค.
๊ฒฐ๊ตญ AWS Lambdaํ๊ฒฝ์์ Playwright๊ฐ headless browser ๋์์ ํ๊ธฐ ์ํด ๋ธ๋ผ์ฐ์ ๋ฐ์ด๋๋ฆฌ๊ฐ ํ์ํ๋ค.
puppeteer ๋ฅผ ์ฐธ๊ณ ํ ์๋ฃ์์ ์ฐพ์ ์ ์์๋๋ฐ, chrome-aws-lambda ๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด๋ค.
chrome-aws-lambda ๋ ์น๋ธ๋ผ์ฐ์ ๋ฅผ ์คํํ๋๋ฐ ํ์ํ ๋ฐ์ด๋๋ฆฌ๋ก chrome ๋ฐ์ด๋๋ฆฌ์ด๋ค.
๊ทธ๋ฆฌ๊ณ Memory๋ 512MB๋ก ์ฌํ ๋น ํด์ค๋ค. ๋ฉ๋ชจ๋ฆฌ ์ค์ ์ lambda โ configuration์์ ๊ฐ๋ฅํ๋ค.
์ด์ ์ฝ๋๋ก ๋์๊ฐ์ ๋ค์ ๋ํ๋์๋ฅผ ์ค์นํ ํ ๋ผ๋ ์ฝ๋ ๋ฒ ์ด์ค๋ ๋ค์๊ณผ ๊ฐ๋ค.
const express = require("express");
const chromium = require("chrome-aws-lambda"); //โ
chrome binary
const playwright = require("playwright-core"); //โ
playwright-core, โplaywright
const { WebClient } = require("@slack/web-api"); //โ
slack api
const { initCrawler } = require("./service");
const app = express();
const port = 3000;
//http
const http = require("http");
const server = http.createServer(app);
const isDev = process.env.NODE_ENV !== "production";
// env
const SLACK_BOT_TOKEN = process.env.SLACK_BOT_TOKEN;
const SLACK_CHANNEL = process.env.SLACK_CHANNEL;
const NAVER_ID = process.env.NAVER_ID;
const NAVER_PW = process.env.NAVER_PW;
const naverLoginUrl =
"https://nid.naver.com/nidlogin.login?mode=form&url=https://www.naver.com";
const slack = new WebClient(SLACK_BOT_TOKEN);
//create lambda function โ
์ค์ ๋๋คํจ์๊ฐ ํธ์ถ์ ๋ด๋นํ๋ handler ํจ์์ด๋ค.
exports.handler = async (event, context, callback) => {
// โ
playwright-core ์ ์๋ chromium ๋ธ๋ผ์ฐ์ ์์ง์ ์์ํ๋ค.
const browser = await playwright.chromium.launch({
args: chromium.args,
executablePath: await chromium.executablePath,
headless: chromium.headless, // ์ด ๊ตฌ๊ฐ์ด headless์ฌ์ผ ์ค์ ์ฐฝ์ด ๋จ์ง ์๋๋ค(GUI๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ ํ์ํ๊ธฐ ๋๋ฌธ)
});
let shippingOrders = [];
try {
shippingOrders = await initCrawler(browser);
// shippingOrders์ ์ฒซ๋ฒ์งธ ์ฃผ๋ฌธ ๋ฒํธ json์ ๋ด๊ธฐ
}catch(){}
}
popup์ฐฝ ๋ด์ element์ ์๋ ๋ฐฐ์ก์ํ ํ ์คํธ๋ฅผ ๊ฐ์ ธ์ค๋๊ฒ ๊ฐ๋ฅํ ๊น?
ํ๋์ ์ฃผ๋ฌธ๋ฒํธ์ ๋ค๋ฅธ ์์ ์์ ๊ตฌ๋งคํ ์ฌ๋ฌ๊ฐ์ ์์ดํ ์ ๋ฐฐ์ก์ ๋ณด๋ค์ด popup์ผ๋ก ๋์ด์๋ ๊ฒฝ์ฐ, ๊ฐ๊ฐ์ ๋ชจ๋ ์์ดํ ๋ค์ popup ๋ด element๋ฅผ ์ฝ์ด์ ๋ฐฐ์ก์ํ ๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ค. ๋ค๋ฅธ ์ฐํ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐฐ์ก์ํ๋ฅผ ์ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์๊น ํ๊ณ ์ด์ฌํ naver๋ฅผ ํ์ํ์ง๋ง ๊ฒฐ๊ตญ ์ด ๋ฐฉ๋ฒ๋ง์ด ์ ์ผํ๊ฒ ๋ฐฐ์ก์ํ๋ฅผ ๋ณผ ์ ์์๋ค.
playwright์์ popup๋ ์ง์ํด์ค๊น?
page.waitForEvent(โpopupโ) ์ ํตํด ๊ฐ๋ฅํ๋ค.
const popup = await popupPromise;
์ด ๊ตฌ๋ฌธ์ ํตํด ์์์ ๋๊ธฐํ๋ popup์ด๋ฒคํธ๊ฐ ์ค์ ๋ก ํ๋ฉด์ popup์ด ๋ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ(await), popup
๋ณ์์ ์ฐธ์กฐ๋ฅผ ์ ์ฅํ๋ค.
์ด์ popup ์์ ๋ด์ ํ์ํ ์ ๋ณด๋ค์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
์ฌ๋๋ด ์ฐ๋
initCrawler()
๋ฅผ ํตํด ํจ์๋ฅผ ์คํ ์ํจ ํ ๊ฒฐ๊ณผ๋ค์ ๊ฐ๋
์ฑ์๊ฒ ํฌ๋งคํ
ํ ํ, slack api๋ฅผ ํ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ค.
์ฌ๋ฌ๊ฐ์ ์๋ฃ๋ค์ ๋ณด์๋๋ฐ, ์๋์ ์ฌ๋ ๊ณต์ ๋ฌธ์ ๋ณด๋ค ๋ ํ์คํ๊ฑด ์๋ค.
ํ๋ฐฐํ์ฌ๋ฅผ ํตํ ์ผ๋ฐ์ ์ธ ์ํ์ ๋ฐฐ์ก
์์ ์์ ์ง์ ๋ฐฐ๋ฌํ๋ ๊ฒฝ์ฐ์ ์ฃผ๋ฌธ์ํ์ ์์ ์์ ๋จ๊ธด ๋ฉ์์ง๋ฅผ ๋๊ฒจ ์ค์ผ ํ๋ค.
๊ฒฐ๊ณผ
๋น ๋ฅด๊ฒ ๋ง๋ค์ด ๋ณธ ๋ฐฐ์ก ์ ๋ณด ํธ๋์ปค๋, 5 ๋จ๊ณ๋ฅผ ๊ฑธ์น ์์ฒญ ์ฒ๋ฆฌ์์ ์ด๋ฏธ ์ฐฝ์ ๋์ด์ง ์ฌ๋ ์ฑ๋์์ cmd+f๋ฅผ ํตํด ์ฃผ๋ฌธ ์ ๋ณด๋ฅผ ์ฐพ๋ ๊ณผ์ ์ผ๋ก ๋๋ผ ์ ์๋ค.๋ฌด๋ ค 2~3๋จ๊ณ๊ฐ ๊ฐ์ถ๋๋ ํจ๊ณผ๋ฅผ ๊ฐ์ ธ์๋ค. ์์ง ๊ฐ์ ํ ์ ์ด ๋ง์ง๋ง ํ์ ๋์์ด ๋๋ค๋ ๋ถ๋ถ์์ ๋ฟ๋ฏํ ๊ฒฝํ์ ํ ์ ์์๋ค.
์ฐธ๊ณ ์๋ฃ
https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/gettingstarted-limits.html