๐ŸŒ„ Sandamso ํ”„๋กœ์ ํŠธ - 2

kkominยท2023๋…„ 10์›” 16์ผ
0

Android Studio

๋ชฉ๋ก ๋ณด๊ธฐ
38/44
post-thumbnail

Firebase ๋กœ๊ทธ์ธ ๋ฐ ํšŒ์›๊ฐ€์ž… ์—ฐ๊ฒฐ? ํ•˜๋‚˜๋„ ์–ด๋ ต์ง€ ์•Š์•„์š” ! ใ…‹


Firebase ์—ฐ๊ฒฐ

์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ Firebase๋ฅผ ๋จผ์ € ์—ฐ๊ฒฐํ•ด์ฃผ์ž. ์ƒ๋‹จ์˜ Tools - Firebase๋ฅผ ๋ˆŒ๋Ÿฌ Firebase๋ฅผ ์—ด์–ด์ค€ ๋’ค, Authentication์„ ํด๋ฆญํ•ด ์‚ฌ์ดํŠธ๋ฅผ ์—ด์–ด์ค€๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์œ„์˜ ์ˆœ์„œ๋Œ€๋กœ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด ์—ฐ๊ฒฐ์„ ์ง„ํ–‰ํ•ด์ค€๋‹ค.

Connect to Firebase

์‚ฌ์ดํŠธ์—์„œ ์นœ์ ˆํ•˜๊ฒŒ ๋‹จ๊ณ„๋ณ„๋กœ ํ•˜๋ผ๋Š” ๊ฒƒ์ด ๋‚˜์™€์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Œ€๋กœ ์ง„ํ–‰ํ•˜๊ณ  ๋‚˜๋ฉด ์ด๋ ‡๊ฒŒ ์•ฑ์ด ์ƒ์„ฑ๋˜์—ˆ๋‹ค๋Š” ์•Œ๋ฆผ์ด ๋œจ๊ณ  ์—ฐ๊ฒฐ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์ฃผ๋ฉด ๋œ๋‹ค.

ADD SDK

์—ฐ๊ฒฐ ๋ฒ„ํŠผ ๋ˆŒ๋ €์œผ๋‹ˆ๊นŒ ๋??? ๐Ÿ™…โ€โ™€๏ธ
์—ฐ๊ฒฐ์„ ํ•ด์คฌ์œผ๋‹ˆ, ์ด์ œ Firebase ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๊ณ , ๋ฏธ๋“ค์›จ์–ด๋ผ๋Š” ์„ฑ๊ฐ€์‹  ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์—†์•จ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๊ธฐ ์œ„ํ•œ SDK๋ฅผ ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ, ๋‹ค์‹œ ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค๋กœ ๋Œ์•„์™€์„œ Authencate using Google์—์„œ add sdk to your app ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์„œ SDK ๋ถ€๋ถ„๋„ ์ถ”๊ฐ€ํ•ด์ฃผ์ž.

๊ตฌ์„ฑ ํŒŒ์ผ ์ถ”๊ฐ€

Android ํ”„๋กœ์ ํŠธ์— Firebase ์ถ”๊ฐ€๋ฅผ ์œ„ํ•œ ๊ณต์‹๋ฌธ์„œ์—์„œ Firebase ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„์„ ํ™•์ธํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

https://firebase.google.com/docs/android/setup?hl=ko

google-services.json ํŒŒ์ผ์ด ์กด์žฌํ•˜๋Š”์ง€ project - app ์—์„œ ํ™•์ธํ•ด firebase์—์„œ์˜ API ํ‚ค ๋“ฑ๋“ฑ์ด ์ž˜๋“ค์–ด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.


๋กœ๊ทธ์ธ & ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ

Firebase์˜ ๊ณต์‹ ๋ฌธ์„œ๋Œ€๋กœ ํšŒ์›๊ฐ€์ž… ๋ฐ ๋กœ๊ทธ์ธ ์‹œ ํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

Firebase Authentication๊ณผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ auth = FirebaseAuth.getInstance() ๋Š” ํ•„์ˆ˜ !


ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ


signupActivity์—์„œ ์‚ฌ์šฉํ•˜๋Š” editText ๋ฐ Button์„ ์ƒ์ˆ˜๋กœ ์„ ์–ธํ•ด์ฃผ๊ณ , ์ด๋ฉ”์ผ editText์—๋Š” ์ด๋ฉ”์ผ ํ˜•์‹์„ ์ž…๋ ฅํ–ˆ์„ ๊ฒฝ์šฐ์—๋งŒ ํšŒ์›๊ฐ€์ž…์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์ฒ˜๋ฆฌํ•ด์ค„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฉ”์ผ ํ˜•์‹์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

  // ์˜ฌ๋ฐ”๋ฅธ ์ •๋ณด ์ž…๋ ฅ ํ›„, ํ™•์ธ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ Firebase์˜ Auth์— ๋ฐ์ดํ„ฐ ์ €์žฅ
  auth.createUserWithEmailAndPassword(email, pw)
      .addOnCompleteListener { task ->
          // ํšŒ์›๊ฐ€์ž… ์„ฑ๊ณต ์‹œ
          if (task.isSuccessful) {
              sendVerifyEmail()
              toastMessage("ํšŒ์›๊ฐ€์ž… ์„ฑ๊ณต!")
              val user = auth.currentUser
              // ํšŒ์›๊ฐ€์ž… ์„ฑ๊ณต ํ›„ ๋กœ๊ทธ์ธ ํ™”๋ฉด์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
              val intent = Intent(this, SignInActivity::class.java)
              startActivity(intent)
              finish()
          }
          // ํšŒ์›๊ฐ€์ž… ์‹คํŒจ ์‹œ
          else {
              val error = task.exception?.message ?: "์•Œ ์ˆ˜ ์—†๋Š” ์˜ค๋ฅ˜"
              toastMessage("ํšŒ์›๊ฐ€์ž…์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ : $error")
          }
      }

์ฝ”๋“œ๋ฅผ ์ฐฌ์ฐฌํžˆ ๋œฏ์–ด์„œ ์‚ดํŽด๋ณด์ž.

createUserWithEmailAndPassword ์ด๊ฒŒ ์ •ํ™•ํžˆ ๋ญ˜๊นŒ?๐Ÿค”
์‹ ๊ทœ ์‚ฌ์šฉ์ž์˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ createUserWithEmailAndPassword๋กœ ์ „๋‹ฌํ•ด ์‹ ๊ทœ ๊ณ„์ •์„ ์ƒ์„ฑํ•ด์ค„ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. ํšŒ์›๊ฐ€์ž…ํ•  ๋–„ ๋„ฃ์–ด์„œ ์ƒˆ๋กœ์šด ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.

ํšŒ์›๊ฐ€์ž… ์„ฑ๊ณต์‹œ์™€ ํšŒ์›๊ฐ€์ž… ์‹คํŒจ ์‹œ์— ๋”ฐ๋ฅธ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•œ๋‹ค. ์ถ”๊ฐ€ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜ํ•ด์„œ ๊ผญ ์ถ”๊ฐ€ํ•ด์ฃผ๋„๋ก !


๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ

  // ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๊ฒฝ์šฐ
  binding.btnSignin.setOnClickListener {
      val email = binding.signinEtEmail.text.toString()
      val pw = binding.signinEtPw.text.toString()

      // ์ด๋ฉ”์ผ ๋ฐ ํŒจ์Šค์›Œ๋“œ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š์„ ๊ฒฝ์šฐ
      if (email.isNotEmpty() && pw.isNotEmpty() && emailCheck && pwCheck) {
          // Firebase์—์„œ ๋กœ๊ทธ์ธ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
          auth.signInWithEmailAndPassword(email, pw)
              .addOnCompleteListener { task ->
                  if (task.isSuccessful) {
                      // ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ
                      val user = auth.currentUser
                      if(user != null && user.isEmailVerified) {
                          val signInIntent = Intent(this, MainActivity::class.java)
                          toastMessage("๋กœ๊ทธ์ธ ์„ฑ๊ณต !")
                          startActivity(signInIntent)
                      }
                      // ์ด๋ฉ”์ผ ์ธ์ฆ ์•ˆํ–ˆ์„ ๊ฒฝ์šฐ
                      else {
                          toastMessage("์ด๋ฉ”์ผ ํ™•์ธ ํ›„ ๋กœ๊ทธ์ธ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.")
                      }
                  } else {
                      // ๋กœ๊ทธ์ธ ์‹คํŒจ ์‹œ
                      toastMessage("์•„์ด๋”” ๋˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.")
                  }
              }
      }
      else {
          toastMessage("๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.")
      }
  }

RealTime Database

RealTimeDB๋ฅผ ์ด์šฉํ•ด์„œ ํšŒ์›๊ฐ€์ž… ์‹œ์— ์ž…๋ ฅํ–ˆ๋˜ ์œ ์ € ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ด๋ฆ„, ์•„์ด๋””, ๋‹‰๋„ค์ž„ DB๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ƒ์„ฑํ•ด์ค€๋‹ค.

userReference์˜ key๊ฐ’์„ pushํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ FirebaseDB์— ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค. addOnCompleteListener์„ ์ด์šฉํ•ด ํšŒ์›๊ฐ€์ž… ์„ฑ๊ณต ์‹œ์™€ ์‹คํŒจ ์‹œ์— ๋”ฐ๋ฅธ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ๊ผญ ํ•ด์ค„ ๊ฒƒ!

ํ•ด๋‹น ์ฝ”๋“œ๋Š” Firebase RealTimeDB ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•ด ์ž‘์„ฑํ•ด์คฌ๋‹ค.

  private fun saveUserData(uid: String, user: UserData) {
          val dataBase = FirebaseDatabase.getInstance()
          val userReference = dataBase.getReference("users")
          userReference.child(uid).setValue(user)
          val userId = userReference.push().key

          userId?.let {
              userReference.child(uid).setValue(user)
                  .addOnCompleteListener { task ->
                      // ํšŒ์›๊ฐ€์ž… ์„ฑ๊ณต ์‹œ
                      if (task.isSuccessful) {
                          //toastMessage("RealTime userData ์ƒ์„ฑ ์„ฑ๊ณต!")
                      }
                      // ํšŒ์›๊ฐ€์ž… ์‹คํŒจ ์‹œ
                      else {
                          val error = task.exception?.message ?: "์•Œ ์ˆ˜ ์—†๋Š” ์˜ค๋ฅ˜"
                          toastMessage("RealTime userData ์ƒ์„ฑ ์‹คํŒจ! ์˜ค๋ฅ˜: $error")
                      }
                  }
          }
      }

ํšŒ์›๊ฐ€์ž… ์‹คํŒจ ์‹œ์˜ ์ •๋ณด๊ฐ€ ์•„๋‹Œ ํšŒ์›๊ฐ€์ž…์„ ์„ฑ๊ณตํ–ˆ์„ ๋•Œ์˜ RealTimeDB๊ฐ€ ์ถ”๊ฐ€ํ•ด์ฃผ๋„๋ก ์„ค์ •ํ•ด์ฃผ๋ฉด ๋ !

  // ํšŒ์›๊ฐ€์ž… ์„ฑ๊ณต ์‹œ
  if (task.isSuccessful) {
      sendVerifyEmail()
      toastMessage("ํšŒ์›๊ฐ€์ž… ์„ฑ๊ณต!")
      val user = auth.currentUser
      // RealTimeDB ์‚ฌ์šฉ์ž ์ •๋ณด์— ๊ฐ„๋‹จํ•˜๊ฒŒ ์ด๋ฆ„, ์•„์ด๋””, ์„ฑ๋ณ„, ๋‹‰๋„ค์ž„ DB ์ƒ์„ฑ
      val userData = UserData(name, email, nick)
      if (user != null) {
          saveUserData(user.uid, userData)
      }
      // ํšŒ์›๊ฐ€์ž… ์„ฑ๊ณต ํ›„ ๋กœ๊ทธ์ธ ํ™”๋ฉด์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
      val intent = Intent(this, SignInActivity::class.java)
      startActivity(intent)
      finish()
  }
profile
์†Œ์†Œํ•œ ์ฝ”๋”ฉ ์ผ๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€