본문 바로가기
🌐 유니티 (Unity)

Day 63 - Firebase 쿠폰 관리

by shin0707 2024. 12. 31.
728x90
반응형
728x90

 

  • 주제

>>  Firebase 프로젝트 생성

>>  Firebase Realtime Database 설정

>>  유니티 프로젝트에 Firebase 추가

>>  쿠폰 검증 및 보상 지급 구현

>>  관리자용 쿠폰 추가 기능

>>  보안 규칙 설정


  • 공부내용

1. Firebase 프로젝트 생성

 

  • Firebase 콘솔로 이동: Firebase Console에 접속.
  • 새 프로젝트 만들기:
    • "프로젝트 추가" 버튼 클릭.
    • 프로젝트 이름 입력 (예: CouponManager).
    • Google Analytics는 선택사항이니 필요 없으면 비활성화.
    • "프로젝트 만들기" 클릭.

 

2. Firebase Realtime Database 설정

쿠폰 데이터를 저장하고 관리하기 위해 Realtime Database를 사용한다.

 

 

  • Realtime Database 활성화:
    • Firebase 콘솔에서 Build > Realtime Database로 이동.
    • "데이터베이스 만들기" 버튼 클릭.
    • 위치 설정(예: asia-east1 등, 가까운 위치 선택).
    • "시작 모드"에서 테스트 모드 선택 (초기 설정을 위해 사용).테스트 모드에서는 인증 없이 데이터베이스에 접근 가능하지만, 이후 보안 규칙을 설정해야 한다.
  • 데이터베이스 구조 설계:
    • Firebase 데이터는 JSON 트리 구조로 저장된다.
    • 쿠폰 데이터를 다음과 같이 저장할 예정이다:
json

{
  "coupons": {
    "TEST123": {
      "reward": "100 Gold",
      "isUsed": false
    },
    "COUPON456": {
      "reward": "50 Diamonds",
      "isUsed": false
    }
  }
}

 

 

 


 

3. 유니티 프로젝트에 Firebase 추가

 

  • Firebase SDK 다운로드:
    • Firebase Unity SDK를 다운로드.
    • 프로젝트에 SDK를 추가(다운로드한 .unitypackage 파일을 유니티 프로젝트에 임포트).
  • Firebase 초기화:
    • Firebase를 사용하려면 유니티에서 Firebase 초기화가 필요하다.
using Firebase;
using Firebase.Database;
using Firebase.Extensions;
using UnityEngine;

public class FirebaseInit : MonoBehaviour
{
    private void Start()
    {
        FirebaseApp.CheckAndFixDependenciesAsync().ContinueWithOnMainThread(task =>
        {
            if (task.Result == DependencyStatus.Available)
            {
                Debug.Log("Firebase initialized successfully.");
            }
            else
            {
                Debug.LogError("Firebase initialization failed.");
            }
        });
    }
}

 

이 스크립트를 빈 GameObject에 추가하여 Firebase를 초기화한다.


 

4. 쿠폰 검증 및 보상 지급 구현

사용자가 입력한 쿠폰 번호를 Firebase에서 확인한다.

using Firebase.Database;
using Firebase.Extensions;
using UnityEngine;
using UnityEngine.UI;

public class CouponManager : MonoBehaviour
{
    public InputField couponInputField;
    public Text resultText;

    private DatabaseReference dbReference;

    private void Start()
    {
        dbReference = FirebaseDatabase.DefaultInstance.RootReference;
    }

    public void OnSubmitCoupon()
    {
        string couponCode = couponInputField.text;

        // Firebase에서 쿠폰 데이터 확인
        dbReference.Child("coupons").Child(couponCode).GetValueAsync().ContinueWithOnMainThread(task =>
        {
            if (task.IsFaulted)
            {
                resultText.text = "오류가 발생했습니다.";
            }
            else if (task.IsCompleted)
            {
                DataSnapshot snapshot = task.Result;
                if (snapshot.Exists)
                {
                    bool isUsed = snapshot.Child("isUsed").Value as bool? ?? false;
                    if (isUsed)
                    {
                        resultText.text = "이미 사용된 쿠폰입니다.";
                    }
                    else
                    {
                        string reward = snapshot.Child("reward").Value.ToString();
                        resultText.text = $"쿠폰 적용 성공! 보상: {reward}";

                        // 쿠폰 사용 상태 업데이트
                        dbReference.Child("coupons").Child(couponCode).Child("isUsed").SetValueAsync(true);
                    }
                }
                else
                {
                    resultText.text = "유효하지 않은 쿠폰입니다.";
                }
            }
        });
    }
}

 

5. 관리자용 쿠폰 추가 기능

관리자가 Firebase에 쿠폰을 직접 추가할 수 있도록 Firebase 콘솔을 사용하거나,

Unity에서 직접 추가하는 방법을 구현할 수 있다.

 

5-1. Firebase 콘솔에서 직접 추가

 

  • 데이터베이스 > 데이터로 이동.
  • JSON 트리에서 새로운 쿠폰을 추가:
json 

{
  "coupons": {
    "NEWCOUPON789": {
      "reward": "200 Coins",
      "isUsed": false
    }
  }
}

 

 

 

5-2. Unity에서 동적으로 쿠폰 추가

public void AddCoupon(string couponCode, string reward)
{
    dbReference.Child("coupons").Child(couponCode).SetRawJsonValueAsync(JsonUtility.ToJson(new
    {
        reward = reward,
        isUsed = false
    })).ContinueWithOnMainThread(task =>
    {
        if (task.IsCompleted)
        {
            Debug.Log($"쿠폰 {couponCode}가 성공적으로 추가되었습니다.");
        }
        else
        {
            Debug.LogError("쿠폰 추가 실패.");
        }
    });
}

 

6. 보안 규칙 설정

테스트가 끝난 후, 보안을 강화하기 위해 Realtime Database의 보안 규칙을 설정한다.

 

예제 규칙:

json

{
  "rules": {
    "coupons": {
      ".read": true,
      ".write": false,
      "$couponCode": {
        ".validate": "newData.child('isUsed').isBoolean() && newData.child('reward').isString()"
      }
    }
  }
}

 

  • .read: 읽기 권한 (모든 사용자가 쿠폰 데이터 읽기 가능).
  • .write: 쓰기 권한 (관리자만 추가 가능).
반응형
728x90
반응형

loading