๐Ÿš€ ํด๋ผ์šฐ๋“œ ํ•จ์ˆ˜์˜ ์„ธ๊ณ„๋กœ ๋– ๋‚˜๋ณผ๊นŒ์š”? Firebase Cloud Functions ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ! ๐ŸŒŸ

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ ํด๋ผ์šฐ๋“œ ํ•จ์ˆ˜์˜ ์„ธ๊ณ„๋กœ ๋– ๋‚˜๋ณผ๊นŒ์š”? Firebase Cloud Functions ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ! ๐ŸŒŸ

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐœ๋ฐœ์ž ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ ์ •๋ง ํฅ๋ฏธ์ง„์ง„ํ•œ ์ฃผ์ œ๋กœ ์—ฌ๋Ÿฌ๋ถ„๊ณผ ํ•จ๊ป˜ํ•  ๊ฑฐ์˜ˆ์š”. ๋ฐ”๋กœ Firebase Cloud Functions! ์ด๊ฑฐ ์ง„์งœ ๋Œ€๋ฐ•์ด์—์š”, ์—ฌ๋Ÿฌ๋ถ„. ํด๋ผ์šฐ๋“œ ์ปดํ“จํŒ…์˜ ๊ฝƒ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์ฃ . ๐Ÿ˜Ž

์•„, ๊ทธ๋ฆฌ๊ณ  ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ž ๊น! ์—ฌ๋Ÿฌ๋ถ„, ํ˜น์‹œ ์žฌ๋Šฅ๋„ท์ด๋ผ๋Š” ์‚ฌ์ดํŠธ ์•„์„ธ์š”? ๊ฐœ๋ฐœ์ž๋“ค์˜ ์žฌ๋Šฅ์„ ๊ณต์œ ํ•˜๊ณ  ๊ฑฐ๋ž˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ดˆ๋Œ€๋ฐ• ํ”Œ๋žซํผ์ด์—์š”. ๋‚˜์ค‘์— ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด Firebase Cloud Functions ์Šคํ‚ฌ๋กœ ๋ฉ‹์ง„ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์žฌ๋Šฅ๋„ท์—์„œ ๋ฝ๋‚ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? ใ…Žใ…Ž

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ์ค€๋น„๋˜์…จ๋‚˜์š”? ์•ˆ์ „๋ฒจํŠธ ๊ฝ‰ ๋งค์„ธ์š”. ์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ๋ถ€ํ„ฐ ํด๋ผ์šฐ๋“œ ํ•จ์ˆ˜์˜ ์‹ ์„ธ๊ณ„๋กœ ์—ฌํ–‰์„ ๋– ๋‚  ๊ฑฐ์˜ˆ์š”! ๐Ÿš€

๐Ÿค” ์ž ๊น๋งŒ์š”! Firebase Cloud Functions๊ฐ€ ๋ญ๋ƒ๊ณ ์š”?

๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ, Firebase Cloud Functions๋Š” ์„œ๋ฒ„๋ฆฌ์Šค ์ปดํ“จํŒ…์„ ์œ„ํ•œ ๊ตฌ๊ธ€์˜ ์†”๋ฃจ์…˜์ด์—์š”. ๋ณต์žกํ•œ ์„œ๋ฒ„ ๊ด€๋ฆฌ ์—†์ด๋„ ๋ฐฑ์—”๋“œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋งˆ๋ฒ• ๊ฐ™์€ ๊ธฐ์ˆ ์ด์ฃ !

์ด์ œ ์šฐ๋ฆฌ์˜ ์—ฌ์ •์„ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ๋ฒŒ์จ๋ถ€ํ„ฐ ๋‘๊ทผ๋‘๊ทผํ•˜๋„ค์š”! ใ…‹ใ…‹ใ…‹

๐Ÿ“š Firebase Cloud Functions์˜ ๊ธฐ์ดˆ

์ž, ์—ฌ๋Ÿฌ๋ถ„! Firebase Cloud Functions์˜ ์„ธ๊ณ„์— ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! ๐ŸŽ‰ ์ด ๋†€๋ผ์šด ๊ธฐ์ˆ ์€ ์šฐ๋ฆฌ์˜ ๊ฐœ๋ฐœ ์ƒํ™œ์„ ์™„์ „ํžˆ ๋ฐ”๊ฟ”๋†“์„ ๊ฑฐ์˜ˆ์š”. ์–ด๋–ป๊ฒŒ์š”? ๊ธ€์Ž„์š”, ํ•œ๋ฒˆ ๊ฐ™์ด ์•Œ์•„๋ณผ๊นŒ์š”?

๐Ÿค” Firebase Cloud Functions๊ฐ€ ๋ญ๊ธธ๋ž˜?

Firebase Cloud Functions๋Š” ๊ตฌ๊ธ€์ด ๋งŒ๋“  ์„œ๋ฒ„๋ฆฌ์Šค ์ปดํ“จํŒ… ํ”Œ๋žซํผ์ด์—์š”. ๋ญ”๊ฐ€ ์–ด๋ ค์›Œ ๋ณด์ด์ฃ ? ํ•˜์ง€๋งŒ ๊ฑฑ์ • ๋งˆ์„ธ์š”! ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”.

imagine ์šฐ๋ฆฌ๊ฐ€ ํ”ผ์ž๋ฅผ ์ฃผ๋ฌธํ•˜๋Š” ์ƒํ™ฉ์„ ์ƒ๊ฐํ•ด๋ด์š”. ํ”ผ์ž๋ฅผ ์ฃผ๋ฌธํ•˜๋ ค๋ฉด ๋ณดํ†ต ์ด๋Ÿฐ ๊ณผ์ •์„ ๊ฑฐ์น˜์ฃ :

  1. ํ”ผ์ž ๊ฐ€๊ฒŒ์— ์ „ํ™”ํ•œ๋‹ค.
  2. ์ฃผ๋ฌธ์„ ํ•œ๋‹ค.
  3. ํ”ผ์ž๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.
  4. ๋ฐฐ๋‹ฌ์ด ์˜จ๋‹ค.
  5. ๋ง›์žˆ๊ฒŒ ๋จน๋Š”๋‹ค! ๐Ÿ•

์—ฌ๊ธฐ์„œ Firebase Cloud Functions๋Š” ๋ญ˜๊นŒ์š”? ๋ฐ”๋กœ ํ”ผ์ž ๊ฐ€๊ฒŒ์˜ˆ์š”! ์šฐ๋ฆฌ(๊ฐœ๋ฐœ์ž)๋Š” ๊ทธ์ € ์ฃผ๋ฌธ(ํ•จ์ˆ˜ ํ˜ธ์ถœ)๋งŒ ํ•˜๋ฉด ๋˜๊ณ , ๋‚˜๋จธ์ง€๋Š” Firebase๊ฐ€ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๊ฑฐ์ฃ . ํ”ผ์ž ๋งŒ๋“ค๊ณ (์ฝ”๋“œ ์‹คํ–‰), ๋ฐฐ๋‹ฌํ•˜๊ณ (๊ฒฐ๊ณผ ๋ฐ˜ํ™˜) ๋‹ค ์•Œ์•„์„œ ํ•ด์ค˜์š”. ์šฐ๋ฆฌ๋Š” ๊ทธ๋ƒฅ ๋ง›์žˆ๊ฒŒ ๋จน๊ธฐ๋งŒ ํ•˜๋ฉด ๋ผ์š”! (๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ผ์š”!)

๐Ÿšจ ์ฃผ์˜! ํ”ผ์ž๋Š” ๋จน์„ ์ˆ˜ ์žˆ์ง€๋งŒ, Firebase Cloud Functions์˜ ๊ฒฐ๊ณผ๋Š” ๋จน์„ ์ˆ˜ ์—†์–ด์š”! ใ…‹ใ…‹ใ…‹

๐ŸŒŸ Firebase Cloud Functions์˜ ์žฅ์ 

์ž, ์ด์ œ Firebase Cloud Functions๊ฐ€ ๋ญ”์ง€ ๋Œ€์ถฉ ๊ฐ์ด ์˜ค์‹œ๋‚˜์š”? ๊ทธ๋Ÿผ ์ด ๋†€๋ผ์šด ๊ธฐ์ˆ ์˜ ์žฅ์ ์„ ์•Œ์•„๋ณผ๊นŒ์š”?

  • ์„œ๋ฒ„ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š” ์—†์–ด์š”: ์„œ๋ฒ„? ๊ทธ๊ฒŒ ๋ญ์˜ˆ์š”? ๋จน๋Š” ๊ฑด๊ฐ€์š”? Firebase Cloud Functions๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋ฒ„ ๊ด€๋ฆฌ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์–ด์š”. ๊ตฌ๊ธ€์ด ๋‹ค ์•Œ์•„์„œ ํ•ด์ฃผ๋‹ˆ๊นŒ์š”! ๐Ÿ‘
  • ์ž๋™ ํ™•์žฅ: ํŠธ๋ž˜ํ”ฝ์ด ํญ์ฆํ•ด๋„ ๊ฑฑ์ • ์—†์–ด์š”. Firebase๊ฐ€ ์•Œ์•„์„œ ํ™•์žฅํ•ด์ค˜์š”. ๋งˆ์น˜ ๋ฌดํ•œ์œผ๋กœ ๋Š˜์–ด๋‚˜๋Š” ํ”ผ์ž ๋„์šฐ ๊ฐ™์•„์š”! ๐Ÿ•
  • ๋น„์šฉ ํšจ์œจ์ : ์‚ฌ์šฉํ•œ ๋งŒํผ๋งŒ ์ง€๋ถˆํ•˜๋ฉด ๋ผ์š”. ์•ˆ ์“ฐ๋ฉด ๋ˆ ์•ˆ ๋‚ด๋„ ๋˜๋Š” ๊ฑฐ์ฃ . ์™„์ „ ์ด๋“! ๐Ÿ’ฐ
  • ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ ํŠธ๋ฆฌ๊ฑฐ: HTTP ์š”์ฒญ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณ€๊ฒฝ, ์ธ์ฆ ์ด๋ฒคํŠธ ๋“ฑ ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์— ๋ฐ˜์‘ํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ์Šˆํผํžˆ์–ด๋กœ์ฒ˜๋Ÿผ์š”! ๐Ÿฆธโ€โ™‚๏ธ

์–ด๋•Œ์š”? ๋ฒŒ์จ๋ถ€ํ„ฐ Firebase Cloud Functions๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋Œ€๋‹จํ•œ์ง€ ๋Š๊ปด์ง€์ง€ ์•Š๋‚˜์š”? ์ด์ œ ์šฐ๋ฆฌ์˜ ๊ฐœ๋ฐœ ์ƒํ™œ์ด ์–ผ๋งˆ๋‚˜ ํŽธํ•ด์งˆ์ง€ ์ƒ์ƒ์ด ๊ฐ€์‹œ๋‚˜์š”? ใ…Žใ…Ž

๐Ÿ›  Firebase Cloud Functions ์‹œ์ž‘ํ•˜๊ธฐ

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ Firebase Cloud Functions๋ฅผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ์ค€๋น„๋ฌผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•„์š”:

  • Node.js (๋ฒ„์ „ 10 ์ด์ƒ)
  • Firebase CLI (๋ช…๋ น์ค„ ๋„๊ตฌ)
  • ์ฝ”๋”ฉํ•  ์ค€๋น„๊ฐ€ ๋œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์†๊ฐ€๋ฝ! ๐Ÿ‘

๋จผ์ €, Firebase CLI๋ฅผ ์„ค์น˜ํ•ด๋ณผ๊นŒ์š”? ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”:

npm install -g firebase-tools

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด, Firebase์— ๋กœ๊ทธ์ธํ•ด์•ผ ํ•ด์š”. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”:

firebase login

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์—ด๋ฆฌ๋ฉด์„œ ๊ตฌ๊ธ€ ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธํ•˜๋ผ๊ณ  ํ•  ๊ฑฐ์˜ˆ์š”. ๋กœ๊ทธ์ธํ•˜๋ฉด ๋!

์ด์ œ Firebase ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊นŒ์š”? Firebase ์ฝ˜์†”(https://console.firebase.google.com/)์— ๊ฐ€์„œ ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”. ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์€ ๋งˆ์Œ๋Œ€๋กœ ์ง€์–ด๋„ ๋ผ์š”. "SuperCoolProject"๋ผ๋“ ๊ฐ€ "AwesomeFirebaseApp"์ด๋ผ๋“ ๊ฐ€... ์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ "MyFirstFirebaseProject"๋„ ์ข‹์•„์š”! ใ…‹ใ…‹ใ…‹

ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด, ์ด์ œ ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•  ์ฐจ๋ก€์˜ˆ์š”. ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด์ฃผ์„ธ์š”:

firebase init functions

์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์งˆ๋ฌธ๋“ค์ด ๋‚˜์˜ฌ ํ…๋ฐ, ๋Œ€๋ถ€๋ถ„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋‘์‹œ๋ฉด ๋ผ์š”. ์–ธ์–ด ์„ ํƒ์—์„œ๋Š” JavaScript๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฑธ ์ถ”์ฒœํ•ด์š”. (TypeScript๋„ ์ข‹์ง€๋งŒ, ์šฐ๋ฆฌ ์—ฌ์ •์˜ ์ฒซ ๊ฑธ์Œ์œผ๋กœ๋Š” JavaScript๊ฐ€ ๋” ์นœ์ˆ™ํ•  ๊ฑฐ์˜ˆ์š”!)

๋ชจ๋“  ์„ค์ •์ด ๋๋‚˜๋ฉด, ์ถ•ํ•˜๋“œ๋ ค์š”! ๐ŸŽ‰ ์—ฌ๋Ÿฌ๋ถ„์€ ์ด์ œ Firebase Cloud Functions๋ฅผ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋œ ๊ฑฐ์˜ˆ์š”!

๐Ÿ’ก ๊ฟ€ํŒ: Firebase ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ, ์—ฌ๋Ÿฌ๋ถ„์˜ ์žฌ๋Šฅ๋„ท ํ”„๋กœํ•„๊ณผ ์—ฐ๋™ํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? ๋‚˜์ค‘์— ์—ฌ๋Ÿฌ๋ถ„์ด ๋งŒ๋“  ๋ฉ‹์ง„ Firebase ํ”„๋กœ์ ํŠธ๋ฅผ ์žฌ๋Šฅ๋„ท์—์„œ ์ž๋ž‘ํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”!

์ž, ์ด์ œ ๊ธฐ์ดˆ์ ์ธ ์„ธํŒ…์€ ๋๋‚ฌ์–ด์š”. ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์‹ค์ œ๋กœ ์šฐ๋ฆฌ์˜ ์ฒซ ๋ฒˆ์งธ Cloud Function์„ ๋งŒ๋“ค์–ด๋ณผ ๊ฑฐ์˜ˆ์š”. ๊ธฐ๋Œ€๋˜์ง€ ์•Š๋‚˜์š”? ์ €๋Š” ๋ฒŒ์จ๋ถ€ํ„ฐ ๋‘๊ทผ๋‘๊ทผํ•ด์š”! ใ…Žใ…Ž

์—ฌ๋Ÿฌ๋ถ„, ์ž ๊น ์‰ฌ์–ด๊ฐ€๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณผ๊นŒ์š”? ์ปคํ”ผ ํ•œ ์ž” ํ•˜์‹œ๋ฉด์„œ ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ๋‚ด์šฉ์„ ๋ณต์Šตํ•ด๋ณด์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ์„น์…˜์—์„œ ๋งŒ๋‚ ๊ฒŒ์š”! ์šฐ๋ฆฌ์˜ Firebase Cloud Functions ์—ฌ์ •์€ ์ด์ œ ๋ง‰ ์‹œ์ž‘๋์„ ๋ฟ์ด์—์š”. ๋” ์žฌ๋ฏธ์žˆ๊ณ  ํฅ๋ฏธ์ง„์ง„ํ•œ ๋‚ด์šฉ๋“ค์ด ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋‹ต๋‹ˆ๋‹ค! ๐Ÿ˜‰

๐Ÿ”ฅ ์ฒซ ๋ฒˆ์งธ Firebase Cloud Function ๋งŒ๋“ค๊ธฐ

์ž, ์—ฌ๋Ÿฌ๋ถ„! ์ปคํ”ผ ํ•œ ์ž” ํ•˜์…จ๋‚˜์š”? ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์šฐ๋ฆฌ์˜ ์ฒซ ๋ฒˆ์งธ Firebase Cloud Function์„ ๋งŒ๋“ค์–ด๋ณผ ๊ฑฐ์˜ˆ์š”. ์—„์ฒญ ์‹ ๋‚˜์ง€ ์•Š๋‚˜์š”? ์ €๋Š” ๋ฒŒ์จ ์†๊ฐ€๋ฝ์ด ๊ทผ์งˆ๊ทผ์งˆํ•ด์š”! ใ…‹ใ…‹ใ…‹

๐Ÿ‘‹ Hello, World!

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์„ธ๊ณ„์—์„œ๋Š” ํ•ญ์ƒ "Hello, World!"๋กœ ์‹œ์ž‘ํ•˜์ฃ ? Firebase Cloud Functions๋„ ์˜ˆ์™ธ๋Š” ์•„๋‹ˆ์—์š”. ์šฐ๋ฆฌ์˜ ์ฒซ ๋ฒˆ์งธ ํ•จ์ˆ˜๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ "Hello, World!"๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ณผ ๊ฑฐ์˜ˆ์š”.

์ž, ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์˜ favorite ์ฝ”๋“œ ์—๋””ํ„ฐ๋ฅผ ์—ด์–ด์ฃผ์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  functions/index.js ํŒŒ์ผ์„ ์—ด์–ด๋ณผ๊นŒ์š”? ์•„๋งˆ ์ด๋Ÿฐ ๋‚ด์šฉ์ด ์žˆ์„ ๊ฑฐ์˜ˆ์š”:

const functions = require('firebase-functions');

// // Create and Deploy Your First Cloud Functions
// // https://firebase.google.com/docs/functions/write-firebase-functions
//
// exports.helloWorld = functions.https.onRequest((request, response) => {
//   functions.logger.info("Hello logs!", {structuredData: true});
//   response.send("Hello from Firebase!");
// });

์ž, ์ด์ œ ์ด ์ฃผ์„๋“ค์„ ์ง€์šฐ๊ณ  ์šฐ๋ฆฌ์˜ ์ฒซ ๋ฒˆ์งธ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด๋ณผ๊นŒ์š”? ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟ”์ฃผ์„ธ์š”:

const functions = require('firebase-functions');

exports.helloWorld = functions.https.onRequest((request, response) => {
  response.send("์•ˆ๋…•ํ•˜์„ธ์š”! Firebase Cloud Functions์˜ ์„ธ๊ณ„์— ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! ๐ŸŽ‰");
});

์šฐ์™€! ๋ฒŒ์จ ์šฐ๋ฆฌ์˜ ์ฒซ ๋ฒˆ์งธ Cloud Function์ด ์™„์„ฑ๋์–ด์š”! ๐Ÿ‘๐Ÿ‘๐Ÿ‘

๐Ÿš€ ํ•จ์ˆ˜ ๋ฐฐํฌํ•˜๊ธฐ

์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ํ•จ์ˆ˜๋ฅผ Firebase์— ๋ฐฐํฌํ•ด๋ณผ ์ฐจ๋ก€์˜ˆ์š”. ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”:

firebase deploy --only functions

์ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด Firebase๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์˜ ํ•จ์ˆ˜๋ฅผ ํด๋ผ์šฐ๋“œ๋กœ ์˜ฌ๋ ค์ค„ ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ํ”ผ์ž๋ฅผ ๋ฐฐ๋‹ฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”! ๐Ÿ•

๋ฐฐํฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ํ„ฐ๋ฏธ๋„์— ํ•จ์ˆ˜์˜ URL์ด ํ‘œ์‹œ๋  ๊ฑฐ์˜ˆ์š”. ๊ทธ URL์„ ๋ธŒ๋ผ์šฐ์ €์— ์ž…๋ ฅํ•ด๋ณด์„ธ์š”. ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ํ™˜์˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚  ๊ฑฐ์˜ˆ์š”!

๐ŸŽˆ ์ถ•ํ•˜ํ•ด์š”! ์—ฌ๋Ÿฌ๋ถ„์€ ๋ฐฉ๊ธˆ ์ฒซ ๋ฒˆ์งธ Firebase Cloud Function์„ ์„ฑ๊ณต์ ์œผ๋กœ ๋งŒ๋“ค๊ณ  ๋ฐฐํฌํ–ˆ์–ด์š”! ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ ๊ณต์‹์ ์œผ๋กœ ํด๋ผ์šฐ๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋œ ๊ฑฐ์˜ˆ์š”! ๐Ÿ‘จโ€๐Ÿ’ป๐Ÿ‘ฉโ€๐Ÿ’ป

๐Ÿค” ํ•จ์ˆ˜ ๋™์ž‘ ์›๋ฆฌ ์ดํ•ดํ•˜๊ธฐ

์ž, ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์‚ดํŽด๋ณผ๊นŒ์š”?

  1. functions.https.onRequest(): ์ด ๋ถ€๋ถ„์€ HTTP ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ์šฐ๋ฆฌ์˜ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ผ๊ณ  Firebase์— ์•Œ๋ ค์ฃผ๋Š” ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ํ”ผ์ž ๊ฐ€๊ฒŒ์˜ ์ „ํ™”๋ฒจ ๊ฐ™์€ ๊ฑฐ์ฃ !
  2. (request, response) => { ... }: ์ด๊ฑด ์šฐ๋ฆฌ ํ•จ์ˆ˜์˜ ๋ณธ์ฒด์˜ˆ์š”. request๋Š” ๋“ค์–ด์˜จ ์š”์ฒญ์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๊ณ , response๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ณด๋‚ผ ์‘๋‹ต์„ ๋‹ด๋‹นํ•ด์š”.
  3. response.send("..."): ์ด ๋ถ€๋ถ„์ด ์‹ค์ œ๋กœ ์‘๋‹ต์„ ๋ณด๋‚ด๋Š” ๋ถ€๋ถ„์ด์—์š”. ์šฐ๋ฆฌ์˜ ํ™˜์˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋‹ด์•„์„œ ๋ณด๋‚ด๊ณ  ์žˆ์ฃ .

๊ฐ„๋‹จํ•˜์ฃ ? ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ Firebase Cloud Functions์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜์…จ์–ด์š”! ๐Ÿ‘

๐ŸŽจ ํ•จ์ˆ˜ ๊พธ๋ฏธ๊ธฐ

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ํ•จ์ˆ˜๋ฅผ ์กฐ๊ธˆ ๋” ์žฌ๋ฏธ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด๋ณผ๊นŒ์š”? ์š”์ฒญ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์‘๋‹ต์„ ๋ณด๋‚ด๋„๋ก ํ•ด๋ณผ๊ฒŒ์š”:

const functions = require('firebase-functions');

exports.greetings = functions.https.onRequest((request, response) => {
  const name = request.query.name || '์ต๋ช…์˜ ๊ฐœ๋ฐœ์ž';
  const time = new Date().getHours();
  
  let greeting;
  if (time < 12) {
    greeting = '์ข‹์€ ์•„์นจ์ด์—์š”';
  } else if (time < 18) {
    greeting = '์ข‹์€ ์˜คํ›„์˜ˆ์š”';
  } else {
    greeting = '์ข‹์€ ์ €๋…์ด์—์š”';
  }
  
  response.send(`${greeting}, ${name}๋‹˜! Firebase Cloud Functions์˜ ์„ธ๊ณ„์— ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! ๐ŸŽ‰ 
                 ์ง€๊ธˆ ์‹œ๊ฐ์€ ${time}์‹œ์ž…๋‹ˆ๋‹ค. ์ฝ”๋”ฉํ•˜๊ธฐ ์ข‹์€ ์‹œ๊ฐ„์ด์ฃ ? ใ…Žใ…Ž`);
});

์ด ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•ด์š”:

  • URL ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ด๋ฆ„์„ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ์–ด์š”. ์˜ˆ: ?name=์ฒ ์ˆ˜
  • ํ˜„์žฌ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ธ์‚ฌ๋ง์„ ๋ณด๋‚ด์š”.
  • ํ˜„์žฌ ์‹œ๊ฐ๋„ ํ•จ๊ป˜ ์•Œ๋ ค์ค˜์š”.

์ด ํ•จ์ˆ˜๋ฅผ ๋ฐฐํฌํ•˜๊ณ  ๋‚˜์„œ https://your-project-id.cloudfunctions.net/greetings?name=์˜ํฌ ๊ฐ™์€ URL๋กœ ์ ‘์†ํ•ด๋ณด์„ธ์š”. ์–ด๋–ค๊ฐ€์š”? ๋” ์žฌ๋ฏธ์žˆ์–ด์กŒ์ฃ ? ใ…Žใ…Ž

๐Ÿ’ก ์žฌ๋Šฅ๋„ท ํŒ: ์ด๋Ÿฐ ์‹์œผ๋กœ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์‘๋‹ต์„ ์ฃผ๋Š” ๊ธฐ๋Šฅ์€ ์žฌ๋Šฅ๋„ท์—์„œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•  ๋•Œ๋งˆ๋‹ค ์‹œ๊ฐ„์— ๋งž๋Š” ์ธ์‚ฌ๋ง์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๊ฒ ์ฃ ?

๐Ÿงช ํ•จ์ˆ˜ ํ…Œ์ŠคํŠธํ•˜๊ธฐ

ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด ํ…Œ์ŠคํŠธ๋„ ํ•ด์•ผ๊ฒ ์ฃ ? Firebase์—์„œ๋Š” ๋กœ์ปฌ์—์„œ ํ•จ์ˆ˜๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ด์š”. ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด๋ณด์„ธ์š”:

firebase emulators:start --only functions

์ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋กœ์ปฌ์—์„œ Firebase ํ™˜๊ฒฝ์„ ์—๋ฎฌ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ์šฐ๋ฆฌ ์ง‘์—์„œ ํ”ผ์ž ๊ฐ€๊ฒŒ๋ฅผ ์ฐจ๋ฆฐ ๊ฒƒ์ฒ˜๋Ÿผ์š”! ๐Ÿ ๐Ÿ•

์ด์ œ http://localhost:5001/your-project-id/us-central1/greetings?name=์˜ํฌ ๊ฐ™์€ URL๋กœ ์ ‘์†ํ•ด๋ณด์„ธ์š”. ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ํ•จ์ˆ˜๊ฐ€ ๋กœ์ปฌ์—์„œ ๋™์ž‘ํ•˜๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”!

๐ŸŽญ ๋‹ค์–‘ํ•œ ํ•จ์ˆ˜ ํŠธ๋ฆฌ๊ฑฐ

์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” HTTP ์š”์ฒญ์— ๋ฐ˜์‘ํ•˜๋Š” ํ•จ์ˆ˜๋งŒ ๋งŒ๋“ค์–ด๋ดค์–ด์š”. ํ•˜์ง€๋งŒ Firebase Cloud Functions๋Š” ํ›จ์”ฌ ๋” ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ์— ๋ฐ˜์‘ํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณผ๊นŒ์š”?

  1. Firestore ํŠธ๋ฆฌ๊ฑฐ: Firestore ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์— ๋ฐ˜์‘ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  2. Authentication ํŠธ๋ฆฌ๊ฑฐ: ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ, ๋กœ๊ทธ์•„์›ƒ ๋“ฑ์˜ ์ธ์ฆ ์ด๋ฒคํŠธ์— ๋ฐ˜์‘ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  3. Realtime Database ํŠธ๋ฆฌ๊ฑฐ: Realtime Database์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์— ๋ฐ˜์‘ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  4. Cloud Storage ํŠธ๋ฆฌ๊ฑฐ: ํŒŒ์ผ ์—…๋กœ๋“œ, ์‚ญ์ œ ๋“ฑ์˜ ์ด๋ฒคํŠธ์— ๋ฐ˜์‘ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  5. Analytics ํŠธ๋ฆฌ๊ฑฐ: ํŠน์ • ๋ถ„์„ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋ฐ˜์‘ํ•  ์ˆ˜ ์žˆ์–ด์š”.

์ด๋Ÿฐ ๋‹ค์–‘ํ•œ ํŠธ๋ฆฌ๊ฑฐ๋“ค์„ ํ™œ์šฉํ•˜๋ฉด ์ •๋ง ๊ฐ•๋ ฅํ•œ ์„œ๋ฒ„๋ฆฌ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ์Šˆํผํžˆ์–ด๋กœ๊ฐ€ ๋œ ๊ฒƒ ๊ฐ™์ง€ ์•Š๋‚˜์š”? ๐Ÿฆธโ€โ™‚๏ธ๐Ÿฆธโ€โ™€๏ธ

๐Ÿ ์ฒซ ๋ฒˆ์งธ ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ ๋งˆ๋ฌด๋ฆฌ

์šฐ์™€! ์šฐ๋ฆฌ๊ฐ€ ์ฒซ ๋ฒˆ์งธ Firebase Cloud Function์„ ๋งŒ๋“ค๊ณ , ๋ฐฐํฌํ•˜๊ณ , ํ…Œ์ŠคํŠธ๊นŒ์ง€ ํ•ด๋ดค์–ด์š”. ์ •๋ง ๋Œ€๋‹จํ•˜์ง€ ์•Š๋‚˜์š”? ๐Ÿ‘๐Ÿ‘๐Ÿ‘

์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ Firebase Cloud Functions์˜ ๊ธฐ๋ณธ์„ ๋งˆ์Šคํ„ฐํ–ˆ์–ด์š”. ์ด๊ฑธ๋กœ ๋ญ˜ ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ์Œ... ์˜ˆ๋ฅผ ๋“ค๋ฉด:

  • ์ฑ„ํŒ… ๋ด‡์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”. (์žฌ๋Šฅ๋„ท์—์„œ ์‚ฌ์šฉ์ž ๋ฌธ์˜์— ์ž๋™์œผ๋กœ ๋‹ต๋ณ€ํ•˜๋Š” ๋ด‡์„ ๋งŒ๋“ค๋ฉด ์–ด๋–จ๊นŒ์š”?)
  • ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”. (์‚ฌ์šฉ์ž๊ฐ€ ์—…๋กœ๋“œํ•œ ํ”„๋กœํ•„ ์‚ฌ์ง„์„ ์ž๋™์œผ๋กœ ๋ฆฌ์‚ฌ์ด์ฆˆํ•˜๋Š” ๊ธฐ๋Šฅ ๊ฐ™์€ ๊ฑฐ์š”!)
  • ์ •๊ธฐ์ ์ธ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์–ด์š”. (๋งค์ผ ๋ฐค 12์‹œ์— ์žฌ๋Šฅ๋„ท์˜ ์ธ๊ธฐ ์„œ๋น„์Šค ์ˆœ์œ„๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒ ์ฃ ?)

๊ฐ€๋Šฅ์„ฑ์€ ๋ฌดํ•œํ•ด์š”! ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ์ƒ๋ ฅ์ด ๊ณง ํ•œ๊ณ„๋ž๋‹ˆ๋‹ค. ใ…Žใ…Ž

๐Ÿšจ ์ฃผ์˜: Firebase Cloud Functions๋Š” ์ •๋ง ์žฌ๋ฏธ์žˆ์ง€๋งŒ, ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๋น„์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด์š”. ํ•ญ์ƒ ๋น„์šฉ์— ์ฃผ์˜ํ•˜๋ฉด์„œ ์‚ฌ์šฉํ•˜์„ธ์š”!

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ์ฒซ ๋ฒˆ์งธ Firebase Cloud Function ์—ฌ์ •์ด ๋๋‚ฌ์–ด์š”. ์–ด๋– ์…จ๋‚˜์š”? ์žฌ๋ฏธ์žˆ์—ˆ์ฃ ? ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ๋” ๋ณต์žกํ•˜๊ณ  ํฅ๋ฏธ๋กœ์šด ํ•จ์ˆ˜๋“ค์„ ๋งŒ๋“ค์–ด๋ณผ ๊ฑฐ์˜ˆ์š”. ๊ธฐ๋Œ€๋˜์ง€ ์•Š๋‚˜์š”?

๊ทธ๋Ÿผ ์ž ์‹œ ํœด์‹ ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณผ๊นŒ์š”? ์ปคํ”ผ ํ•œ ์ž” ๋” ํ•˜์‹œ๋ฉด์„œ ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ๋‚ด์šฉ์„ ๋ณต์Šตํ•ด๋ณด์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ์„น์…˜์—์„œ ๋งŒ๋‚˜์š”! ์šฐ๋ฆฌ์˜ Firebase Cloud Functions ๋ชจํ—˜์€ ์ด์ œ ๋ง‰ ์‹œ์ž‘๋์„ ๋ฟ์ด์—์š”. ๋” ์‹ ๋‚˜๋Š” ๋‚ด์šฉ๋“ค์ด ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋‹ต๋‹ˆ๋‹ค! ๐Ÿ˜‰

๐Ÿš€ Firebase Cloud Functions ์‹ฌํ™” ๊ณผ์ •

์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐœ๋ฐœ์ž ์—ฌ๋Ÿฌ๋ถ„! ํœด์‹์€ ์ž˜ ์ทจํ•˜์…จ๋‚˜์š”? ์ด์ œ ์šฐ๋ฆฌ๋Š” Firebase Cloud Functions์˜ ๋” ๊นŠ์€ ์„ธ๊ณ„๋กœ ๋“ค์–ด๊ฐˆ ์ค€๋น„๊ฐ€ ๋์–ด์š”. ์‹ฌํ˜ธํก ํ•œ ๋ฒˆ ํฌ๊ฒŒ ํ•˜์‹œ๊ณ , ์ถœ๋ฐœํ•ด๋ณผ๊นŒ์š”? ๐Ÿƒโ€โ™‚๏ธ๐Ÿ’จ

๐Ÿงฉ ํ•จ์ˆ˜ ๋ชจ๋“ˆํ™”ํ•˜๊ธฐ

์ง€๊ธˆ๊นŒ์ง€๋Š” ๋ชจ๋“  ํ•จ์ˆ˜๋ฅผ index.js ํŒŒ์ผ ํ•˜๋‚˜์— ์ž‘์„ฑํ–ˆ์ฃ ? ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง€๋ฉด ์ด๋ ‡๊ฒŒ ํ•˜๋‚˜์˜ ํŒŒ์ผ์— ๋ชจ๋“  ๊ฑธ ๋„ฃ๋Š” ๊ฑด ์ข‹์ง€ ์•Š์•„์š”. ๋งˆ์น˜ ํ”ผ์ž ํ† ํ•‘์„ ์ „๋ถ€ ํ•œ ๊ณณ์— ์Œ“์•„๋‘๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ . ๐Ÿ˜… ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ํ•จ์ˆ˜๋ฅผ ๋ชจ๋“ˆํ™”ํ•  ๊ฑฐ์˜ˆ์š”!

๋จผ์ €, functions ํด๋” ์•ˆ์— greetings.js ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด๋ณผ๊นŒ์š”? ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”:

const functions = require('firebase-functions');

exports.sayHello = functions.https.onRequest((request, response) => {
  const name = request.query.name || '์ต๋ช…์˜ ๊ฐœ๋ฐœ์ž';
  const time = new Date().getHours();
  
  let greeting;
  if (time < 12) {
    greeting = '์ข‹์€ ์•„์นจ์ด์—์š”';
  } else if (time < 18) {
    greeting = '์ข‹์€ ์˜คํ›„์˜ˆ์š”';
  } else {
    greeting = '์ข‹์€ ์ €๋…์ด์—์š”';
  }
  
  response.send(`${greeting}, ${name}๋‹˜! Firebase Cloud Functions์˜ ์„ธ๊ณ„์— ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! ๐ŸŽ‰ 
                 ์ง€๊ธˆ ์‹œ๊ฐ์€ ${time}์‹œ์ž…๋‹ˆ๋‹ค. ์ฝ”๋”ฉํ•˜๊ธฐ ์ข‹์€ ์‹œ๊ฐ„์ด์ฃ ? ใ…Žใ…Ž`);
});

exports.sayGoodbye = functions.https.onRequest((request, response) => {
  const name = request.query.name || '์ต๋ช…์˜ ๊ฐœ๋ฐœ์ž';
  response.send(`์•ˆ๋…•ํžˆ ๊ฐ€์„ธ์š”, ${name}๋‹˜! ๋‹ค์Œ์— ๋˜ ๋งŒ๋‚˜์š”! ๐Ÿ‘‹`);
});

์ด์ œ index.js ํŒŒ์ผ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”:

const greetings = require('./greetings');

exports.sayHello = greetings.sayHello;
exports.sayGoodbye = greetings.sayGoodbye;

์™€์šฐ! ์ด์ œ ์šฐ๋ฆฌ์˜ ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๊น”๋”ํ•ด์กŒ์–ด์š”. ๋งˆ์น˜ ํ”ผ์ž ํ† ํ•‘์„ ์˜ˆ์˜๊ฒŒ ์ •๋ฆฌํ•œ ๊ฒƒ ๊ฐ™์ฃ ? ๐Ÿ•โœจ

๐Ÿ’ก ๊ฟ€ํŒ: ์ด๋ ‡๊ฒŒ ํ•จ์ˆ˜๋ฅผ ๋ชจ๋“ˆํ™”ํ•˜๋ฉด ์ฝ”๋“œ ๊ด€๋ฆฌ๊ฐ€ ํ›จ์”ฌ ์‰ฌ์›Œ์ ธ์š”. ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํฐ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•  ๋•Œ ํŠนํžˆ ์œ ์šฉํ•˜๋‹ต๋‹ˆ๋‹ค!

๐Ÿ”ฅ Firestore์™€ ํ•จ๊ป˜ ์ถค์„!

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ํ•จ์ˆ˜๋ฅผ ์กฐ๊ธˆ ๋” ์‹ค์šฉ์ ์œผ๋กœ ๋งŒ๋“ค์–ด๋ณผ๊นŒ์š”? Firestore ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๋™ํ•ด๋ณผ ๊ฑฐ์˜ˆ์š”. ๋จผ์ €, Firebase ์ฝ˜์†”์—์„œ Firestore๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ , ์ƒˆ๋กœ์šด ์ปฌ๋ ‰์…˜ 'messages'๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”.

์ด์ œ functions ํด๋”์— database.js ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณผ๊นŒ์š”?

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

exports.addMessage = functions.https.onRequest(async (req, res) => {
  const original = req.query.text;
  const writeResult = await admin.firestore().collection('messages').add({original: original});
  res.json({result: `Message with ID: ${writeResult.id} added.`});
});

exports.makeUppercase = functions.firestore.document('/messages/{documentId}')
    .onCreate((snap, context) => {
      const original = snap.data().original;
      console.log('Uppercasing', context.params.documentId, original);
      const uppercase = original.toUpperCase();
      return snap.ref.set({uppercase}, {merge: true});
    });

์ด ์ฝ”๋“œ๋Š” ๋‘ ๊ฐ€์ง€ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์š”:

  1. addMessage: HTTP ์š”์ฒญ์„ ํ†ตํ•ด ๋ฉ”์‹œ์ง€๋ฅผ Firestore์— ์ถ”๊ฐ€ํ•ด์š”.
  2. makeUppercase: ์ƒˆ๋กœ์šด ๋ฉ”์‹œ์ง€๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ๋Œ€๋ฌธ์ž ๋ฒ„์ „์„ ๋งŒ๋“ค์–ด์š”.

index.js ํŒŒ์ผ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”:

const greetings = require('./greetings');
const database = require('./database');

exports.sayHello = greetings.sayHello;
exports.sayGoodbye = greetings.sayGoodbye;
exports.addMessage = database.addMessage;
exports.makeUppercase = database.makeUppercase;

์ด์ œ ํ•จ์ˆ˜๋ฅผ ๋ฐฐํฌํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•ด๋ณผ๊นŒ์š”? ๋‹ค์Œ URL๋กœ ์ ‘์†ํ•ด๋ณด์„ธ์š”:

https://us-central1-YOUR-PROJECT-ID.cloudfunctions.net/addMessage?text=hello world

Firestore๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด 'messages' ์ปฌ๋ ‰์…˜์— ์ƒˆ๋กœ์šด ๋ฌธ์„œ๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ , ๋Œ€๋ฌธ์ž ๋ฒ„์ „๋„ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”!

๐ŸŒŸ ์žฌ๋Šฅ๋„ท ํ™œ์šฉ ํŒ: ์ด๋Ÿฐ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋ฉด ์žฌ๋Šฅ๋„ท์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ƒˆ๋กœ์šด ์„œ๋น„์Šค๋ฅผ ๋“ฑ๋กํ•  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ํƒœ๊ทธ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜, ๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”!

โฐ ์˜ˆ์•ฝ ์ž‘์—… ๋งŒ๋“ค๊ธฐ

Firebase Cloud Functions์˜ ๋˜ ๋‹ค๋ฅธ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์€ ์˜ˆ์•ฝ ์ž‘์—…์ด์—์š”. ๋งค์ผ, ๋งค์ฃผ, ๋˜๋Š” ๋งค๋‹ฌ ํŠน์ • ์‹œ๊ฐ„์— ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์ฃ . ํ•œ๋ฒˆ ๋งŒ๋“ค์–ด๋ณผ๊นŒ์š”?

functions ํด๋”์— scheduled.js ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”:

const functions = require('firebase-functions');
const admin = require('firebase-admin');

exports.dailyCleanup = functions.pubsub.schedule('every 24 hours').onRun(async (context) => {
  const now = admin.firestore.Timestamp.now();
  const cutoff = admin.firestore.Timestamp.fromMillis(now.toMillis() - 7 * 24 * 60 * 60 * 1000);

  const snapshot = await admin.firestore().collection('messages')
    .where('timestamp', '<', cutoff)
    .get();

  const deletePromises = [];
  snapshot.forEach(doc => {
    deletePromises.push(doc.ref.delete());
  });

  await Promise.all(deletePromises);

  console.log('Deleted old messages');
  return null;
});

์ด ํ•จ์ˆ˜๋Š” ๋งค์ผ ํ•œ ๋ฒˆ์”ฉ ์‹คํ–‰๋˜๋ฉฐ, 7์ผ ์ด์ƒ ์ง€๋‚œ ๋ฉ”์‹œ์ง€๋ฅผ ์‚ญ์ œํ•ด์š”. ๊น”๋”ํ•˜์ฃ ? ๐Ÿ˜Ž

index.js ํŒŒ์ผ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”:

const greetings = require('./greetings');
const database = require('./database');
const scheduled = require('./scheduled');

exports.sayHello = greetings.sayHello;
exports.sayGoodbye = greetings.sayGoodbye;
exports.addMessage = database.addMessage;
exports.makeUppercase = database.makeUppercase;
exports.dailyCleanup = scheduled.dailyCleanup;

๐Ÿ”’ ๋ณด์•ˆ ๊ฐ•ํ™”ํ•˜๊ธฐ

Firebase Cloud Functions๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ณด์•ˆ์€ ๋งค์šฐ ์ค‘์š”ํ•ด์š”. ๋ช‡ ๊ฐ€์ง€ ํŒ์„ ๋“œ๋ฆด๊ฒŒ์š”:

  1. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์‚ฌ์šฉํ•˜๊ธฐ: API ํ‚ค๋‚˜ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์ €์žฅํ•˜์„ธ์š”.
  2. Firebase Security Rules: Firestore์™€ Realtime Database์— ์ ์ ˆํ•œ ๋ณด์•ˆ ๊ทœ์น™์„ ์„ค์ •ํ•˜์„ธ์š”.
  3. ์ž…๋ ฅ ๊ฒ€์ฆ: ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ํ•ญ์ƒ ๊ฒ€์ฆํ•˜๊ณ  sanitizeํ•˜์„ธ์š”.
  4. HTTPS ์‚ฌ์šฉ: ๋ชจ๋“  ์™ธ๋ถ€ ํ†ต์‹ ์—๋Š” HTTPS๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊นŒ์š”? security.js ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”:

const functions = require('firebase-functions');

exports.secretMessage = functions.https.onRequest((req, res) => {
  const secretKey = functions.config().secrets.key;
  if (req.query.key === secretKey) {
    res.send("์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค! ๋น„๋ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์ฐพ์•˜์–ด์š”! ๐ŸŽ‰");
  } else {
    res.status(403).send("์ ‘๊ทผ ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค. ๐Ÿ˜ข");
  }
});

์ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ด์š”:

firebase functions:config:set secrets.key="your-secret-key-here"

โš ๏ธ ์ฃผ์˜: ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋” ๋ณต์žกํ•˜๊ณ  ์•ˆ์ „ํ•œ ์ธ์ฆ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ด์š”. ์ด๊ฑด ๊ทธ๋ƒฅ ์˜ˆ์‹œ์ผ ๋ฟ์ด์—์š”!

๐Ÿ ๋งˆ๋ฌด๋ฆฌ

์™€์šฐ! ์šฐ๋ฆฌ๊ฐ€ Firebase Cloud Functions์˜ ์‹ฌํ™” ๊ณผ์ •์„ ๋ชจ๋‘ ์™„๋ฃŒํ–ˆ์–ด์š”. ์ •๋ง ๋Œ€๋‹จํ•˜์ง€ ์•Š๋‚˜์š”? ๐Ÿ‘๐Ÿ‘๐Ÿ‘

์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€:

  • ํ•จ์ˆ˜๋ฅผ ๋ชจ๋“ˆํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • Firestore์™€ ์—ฐ๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ์˜ˆ์•ฝ ์ž‘์—…์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•
  • ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•

์„ ๋ชจ๋‘ ์•Œ๊ฒŒ ๋์–ด์š”. ์ด ์ง€์‹๋“ค์„ ํ™œ์šฉํ•˜๋ฉด ์ •๋ง ๊ฐ•๋ ฅํ•œ ์„œ๋ฒ„๋ฆฌ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”!

์žฌ๋Šฅ๋„ท์—์„œ๋„ ์ด๋Ÿฐ ๊ธฐ์ˆ ๋“ค์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋ฌด๊ถ๋ฌด์ง„ํ•ด์š”. ์˜ˆ๋ฅผ ๋“ค๋ฉด:

  • ์‚ฌ์šฉ์ž ํ™œ๋™์— ๋”ฐ๋ฅธ ์ž๋™ ์•Œ๋ฆผ ์‹œ์Šคํ…œ
  • ์ฃผ๊ธฐ์ ์ธ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋ฐ ๋ฆฌํฌํŠธ ์ƒ์„ฑ
  • ์‚ฌ์šฉ์ž ์ƒ์„ฑ ์ฝ˜ํ…์ธ ์˜ ์ž๋™ ํ•„ํ„ฐ๋ง
  • API ์—”๋“œํฌ์ธํŠธ ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ

๊ฐ€๋Šฅ์„ฑ์€ ๋ฌดํ•œํ•ด์š”! ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ์ƒ๋ ฅ์ด ๊ณง ํ•œ๊ณ„๋ž๋‹ˆ๋‹ค. ใ…Žใ…Ž

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ Firebase Cloud Functions ์—ฌ์ •์ด ๋๋‚ฌ์–ด์š”. ์–ด๋– ์…จ๋‚˜์š”? ์žฌ๋ฏธ์žˆ์—ˆ์ฃ ? ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ ์„œ๋ฒ„๋ฆฌ์Šค์˜ ๋งˆ๋ฒ•์‚ฌ๊ฐ€ ๋œ ๊ฑฐ์˜ˆ์š”! ๐Ÿง™โ€โ™‚๏ธโœจ

์•ž์œผ๋กœ ์—ฌ๋Ÿฌ๋ถ„์ด ๋งŒ๋“ค ๋ฉ‹์ง„ ํ”„๋กœ์ ํŠธ๋“ค์ด ์ •๋ง ๊ธฐ๋Œ€๋ผ์š”. ํ™”์ดํŒ…! ๐Ÿ’ช๐Ÿ˜„