๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“š Database/Firebase

[Firebase] Cloud Function์„ ์‚ฌ์šฉํ•ด์„œ Hello World๋ฅผ ๋„์›Œ๋ณด์ž

by Fomagran ๐Ÿ’ป 2020. 12. 6.
728x90
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š” Foma ์ž…๋‹ˆ๋‹ค!

 

์˜ค๋žœ๋งŒ์— ํŒŒ์ด์–ด๋ฒ ์ด์Šค ๊ด€๋ จํ•ด์„œ ๊ธ€์„ ์“ฐ๊ฒŒ ๋˜์—ˆ๋„ค์š”.

 

์˜ค๋Š˜ ์•Œ์•„๋ณผ๊ฑด ํด๋ผ์šฐ๋“œ ํŽ‘์…˜์ด๋ผ๋Š” ๊ฒƒ์ธ๋ฐ์š”.

 

 

 

 

Cloud Function


 

๋จผ์ € ํด๋ผ์šฐ๋“œ ํŽ‘์…˜์ด๋ž€?

๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…๋“œ๋ฆฌ๋ฉด ์ €๋ฒˆ์— ์ €ํฌ๊ฐ€ ํŒŒ์ด์–ด์Šคํ† ์–ด์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜์ž–์•„์š”? (ํ˜น์‹œ ๋ชจ๋ฅด์‹œ๋Š” ๋ถ„๋“ค์€ ์—ฌ๊ธฐ ์—์„œ ๋จผ์ € ๋ณด๊ณ ์™€์ฃผ์„ธ์š”~)

 

์ธ์Šคํƒ€๊ทธ๋žจ์œผ๋กœ ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด ๋งŒ์•ฝ ํŒ”๋กœ์›Œ๊ฐ€ 100๋งŒ๋ช…์ด ์žˆ๊ณ  ๊ทธ ํŒ”๋กœ์›Œ๋“ค์˜ ํฌ์ŠคํŠธ๋ฅผ ์ •๋ ฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ์š”?

 

์ง์ ‘ ์•ฑ ๋‚ด์˜ ์ฝ”๋“œ์—์„œ ํŒŒ์ด์–ด์Šคํ† ์–ด ์•ˆ์˜ ์ˆ˜๋ฐฑ๋งŒ๊ฐœ์˜ ๋ฌธ์„œ๋ฅผ ์ฝ๊ณ  ๋ฐ›์•„์™€์„œ ์ •๋ ฌํ•ด์•ผ ํ• ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋ฉด ์•ฑ์˜ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋ชจ๋„ ๋„ˆ๋ฌด ์‹ฌํ•ด์ง€๊ณ  ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ด€๋ฆฌํ•˜๊ธฐ ๋ถ€๋‹ด์Šค๋Ÿฌ์›Œ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์ด ํด๋ผ์šฐ๋“œ ํŽ‘์…˜์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด node.js์—์„œ ์›ํ•˜๋Š” Httpํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋†“๊ณ  ์•ฑ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ด ํ•จ์ˆ˜๋ฅผ

 

ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด ํŠน์ • ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค!

 

๊ทธ๋ž˜์„œ ์˜ค๋Š˜ ํ•ด๋ณผ๊ฑด node.js์— ํ—ฌ๋กœ์›”๋“œ๋ผ๋Š” httpํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ์ด ํ•จ์ˆ˜๋ฅผ iOS์•ฑ์—์„œ ์‹คํ–‰์‹œ์ผœ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅ์‹œ์ผœ๋ณผ๊ฑฐ์—์š”!

 

node.js๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด์„  javascript์–ธ์–ด๋ฅผ ์กฐ๊ธˆ ์•Œ์•„์•ผํ•ด์š” ใ…œ (์ €๋„ ์ž˜ ๋ชจ๋ฆ…๋‹ˆ๋‹ค... ๊ทธ๋ƒฅ ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ๋กœ ๋”ฐ๋ผํ•ด๋ณด์•˜์–ด์š”. ์˜ค๋Š˜ ํ•ด๋ณผ๊ฑด ํฌ๊ฒŒ ์ƒ๊ด€์—†์œผ๋‹ˆ ๊ฑฑ์ •์€ ใ„ดใ„ด)

 

์ž! ๊ฐ€์žฅ ๋จผ์ € ํ•ด์•ผํ• ๊ฑด  ์—ฌ๊ธฐ ์—์„œ node.js๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•ด์ฃผ์„ธ์š”.

 

๊ทธ๋ฆฌ๊ณ  npm์„ ์„ค์น˜ํ•ด์ฃผ์…”์•ผํ•˜๋Š”๋ฐ์š”.

 

Homebrew๋ผ๋Š” ๋งฅOS ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ์—ฌ๊ธฐ์„œ ๋‹ค์šด๋กœ๋“œ ํ•ด์ฃผ์‹œ๊ณ 

 

๊ฐ„๋‹จํ•˜๊ฒŒ ํ„ฐ๋ฏธ๋„์— ๋ถ™์—ฌ๋„ฃ๊ธฐํ•˜์‹  ๋’ค์—

ํ„ฐ๋ฏธ๋„์— "brew install node"๋ผ๊ณ  ํ•ด์ฃผ์‹œ๋ฉด npm์ด ์„ค์น˜๋ฉ๋‹ˆ๋‹ค!

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ์„ค์น˜ํ•ด์ฃผ์…”์•ผ ํ•  ๊ฒƒ์€ node.js๋ฅผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ค„ IDE Visual Studio๋ฅผ ์—ฌ๊ธฐ์—์„œ ๋‹ค์šด๋กœ๋“œ ํ•ด์ค๋‹ˆ๋‹ค.

์ด์ œ ์„ค์น˜ํ•  ๊ฒƒ์€ ๋ชจ๋‘ ๋๋‚ฌ๊ตฌ์š”.

 

ํŒŒ์ด์–ด๋ฒ ์ด์Šค ์ฝ˜์†”๋กœ ์—ฌ๊ธฐ ์ด๋™ํ•˜์…”์„œ ํŒŒ์ด์–ด๋ฒ ์ด์Šค ์š”๊ธˆ์ œ๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•ด์ฃผ์…”์•ผ ํด๋ผ์šฐ๋“œ ํŽ‘์…˜ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

 

๋ณธ๊ฒฉ์ ์œผ๋กœ ํด๋ผ์šฐ๋“œํŽ‘์…˜์„ ์„ค์น˜ํ•ด์ค์‹œ๋‹ค.

 

ํ„ฐ๋ฏธ๋„๋กœ ์ด๋™ํ•˜์…”์„œ "npm install -g firebase-tools" ๋ผ๊ณ  ์ณ์ฃผ์„ธ์š”.

 

๋งŒ์•ฝ ์•„๋ž˜์™€ ๊ฐ™์ด ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค๋ฉด "sudo npm install -g firebase-tools" ์ด๋ผ๊ณ  ์ณ์ฃผ์„ธ์š”. 

๊ทธ๋ฆฌ๊ณ  "firebase login"์ด๋ผ๊ณ  ์ณ์ฃผ์‹œ๊ณ  "Allow Firebase to collect CLI usage and error reporting information?" ์ด๋ผ๊ณ  ๋œฐ๊ฑด๋ฐ Y๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.

๊ทธ๋Ÿฌ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ™ˆํŽ˜์ด์ง€๋กœ ์ž๋™์œผ๋กœ ์ด๋™๋ ํ…๋ฐ ๊ณ„์ •์„ ์„ ํƒํ•œ๋’ค Fibase CLI ์•ก์„ธ์Šค๋ฅผ ํ—ˆ์šฉํ•ด์ฃผ์„ธ์š”.

๊ทธ๋ฆฌ๊ณค  Xcode์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค.

 

ํ„ฐ๋ฏธ๋„์—์„œ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋Š” ์ฃผ์†Œ๋กœ ์ด๋™ํ•ด์ค๋‹ˆ๋‹ค. "cd ํ”„๋กœ์ ํŠธ์ฃผ์†Œ"

๊ทธ๋ฆฌ๊ณ  "firebase init"์„ ํ•ด์ฃผ์‹œ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋œฐ๊ฑฐ์—์š”.

์•„๋ž˜๋กœ ๋‚ด๋ ค๋ณด์‹œ๋ฉด ์•„๊นŒ์ฒ˜๋Ÿผ ๋˜ ๋ฌผ์–ด๋ณด๋Š”๊ฒŒ ์žˆ์„๊ฑฐ์—์š”. ํŒŒ์ด์–ด๋ฒ ์ด์Šค์— ์–ด๋–ค ํ”„๋กœ์ ํŠธ๋ฅผ ์“ธ๊ฑฐ๋ƒ๊ณ  ๋ฌผ์–ด๋ณด๋Š”๊ฑด๋ฐ ์›ํ•˜์‹œ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ๊ณจ๋ผ์ฃผ์„ธ์š”.

 

๊ทธ ๋‹ค์Œ Functions: Configure and deploy Colud Functions๋ฅผ ์ŠคํŽ˜์ด์Šค๋ฐ”๋กœ ๋ˆŒ๋Ÿฌ์ฃผ์„ธ์š”

๊ทธ ๋‹ค์Œ์œผ๋กœ ์–ด๋–ค ์–ธ์–ด๋ฅผ ์“ธ๊ฑฐ๋ƒ๊ณ  ๋ฌผ์–ด๋ณด๋ฉด JavaScript๋ฅผ ์„ ํƒํ•ด์ฃผ์‹œ๊ณ  ๊ทธ ๋‹ค์Œ์€ ๋ชจ๋‘ Y๋ฅผ ํ•ด์ฃผ์‹œ๋ฉด ์„ค์น˜๊ฐ€ ๋ ๊ฒ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋กœ ์ด๋™ํ•˜์‹œ๋ฉด functions๋ž€ ํŒŒ์ผ์ด ์ƒ๊ฒผ์„๊ฑฐ์—์š”.

์ด์ œ Visual Studio๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์•„๊นŒ ๋งŒ๋“ค์–ด์คฌ๋˜ Xcode ํ”„๋กœ์ ํŠธ๋ฅผ ์—ด์–ด์ฃผ์„ธ์š”.

 

๊ทธ๋Ÿฌ๋ฉด ์™ผ์ชฝ์— ๋ณด์‹œ๋ฉด node_modules๋ผ๋Š”๊ฒŒ ์žˆ์„๊ฑฐ์—์š”.

๊ฑฐ๊ธธ ๋ˆŒ๋Ÿฌ์„œ ํ™•์žฅ์‹œ์ผœ์ฃผ์‹œ๊ณ  .gitinnore์ด๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค.

.gitignoreํŒŒ์ผ์— "node_modules/"๋ผ๊ณ  ์ž…๋ ฅํ•ด์ค๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  index.js์— ์ด๋™ํ•˜์…”์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ด์ฃผ์‹œ๊ณ  ๋ฐ˜๋“œ์‹œ command + s๋ฅผ ๋ˆŒ๋Ÿฌ์„œ ํŒŒ์ผ์„ ์ €์žฅํ•ด์ค๋‹ˆ๋‹ค.

๊ทธ ๋‹ค์Œ ํ„ฐ๋ฏธ๋„๋กœ ์ด๋™ํ•˜์…”์„œ firebase deploy๋ผ๊ณ  ์ž…๋ ฅํ•ด์ค๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํŒŒ์ด์–ด๋ฒ ์ด์Šค ์ฝ˜์†”๋กœ ์ด๋™ํ•ด ํด๋ผ์šฐ๋“œ ํŽ‘์…˜์„ ๋“ค์–ด๊ฐ€๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ•จ์ˆ˜ ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์„๊ฑฐ์—์š”!.

Pod


์ด์ œ ์ด๊ฑธ ์•ฑ์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋จผ์ € ํ•ด์ฃผ์…”์•ผ ํ• ๊ฑด pod์„ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์— ์„ค์น˜ํ•ด์ฃผ์…”์•ผํ•ฉ๋‹ˆ๋‹ค.

 

ํ„ฐ๋ฏธ๋„์—์„œ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์— ์ด๋™ํ•ด์„œ "pod init" ์„ ํ•ด์ฃผ์‹œ๋ฉด ํ”„๋กœ์ ํŠธ ํด๋”์— podfile์ด ์ƒ๊ธธ๊ฒ๋‹ˆ๋‹ค.

 

podfile์— ์•„๋ž˜์™€ ๊ฐ™์ด pod 'Firebase/Functions'๋ฅผ ๋„ฃ์–ด์ฃผ์‹œ๊ณ 

 

ํ„ฐ๋ฏธ๋„์— pod install์„ ํ•ด์ค๋‹ˆ๋‹ค.

Storyboard


Storyboard์—์„œ Hello World๋ฅผ ๋„์šธ ๋ ˆ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•ด์ค๋‹ˆ๋‹ค.

ViewController


๊ทธ ๋‹ค์Œ ViewController๋กœ ์ด๋™ํ•ด์„œ "import FirebaseFunctions" ๋ฅผ ํ•ด์ค๋‹ˆ๋‹ค.

๊ทธ ๋‹ค์Œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ด์ฃผ๊ณ  ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์‹คํ–‰ํ•ด์ค๋‹ˆ๋‹ค.(์†Œ์Šค์ฝ”๋“œ๋Š” ์•„๋ž˜์— ์žˆ์Šต๋‹ˆ๋‹ค!)

๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด Hello World!๊ฐ€ ๋„์›Œ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค!!

Source Code 


 

 

fomagran/CloudFunctionExample

ํด๋ผ์šฐ๋“œํŽ‘์…˜ ํ—ฌ๋กœ์›”๋“œ ๋„์šฐ๊ธฐ. Contribute to fomagran/CloudFunctionExample development by creating an account on GitHub.

github.com

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import UIKit
import FirebaseFunctions
 
class ViewController: UIViewController {
    
    @IBOutlet weak var label: UILabel!
    lazy var functions = Functions.functions()
 
    override func viewDidLoad() {
        super.viewDidLoad()
        let data = ["text""Hello World!"]
 
              functions.httpsCallable("helloWorld").call(data) { (result, error) in
                  print("Function returned")
                  if let err = error {
                      print(err)
                  }
                
                  if let res = result {
                    let resdic = res.data as? [String:Any]
                    self.label.text = resdic!["message"asString
                  }
              }
    }
 
 
}
 

 

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€