[flutter] Firebase Database를 사용한 로그인 및 회원가입 구현하기

Firebase는 모바일 앱 개발에 널리 사용되는 클라우드 기반 플랫폼으로, 많은 기능을 제공합니다. 그 중 Firebase의 Realtime Database를 사용하여 Flutter 앱에서 로그인 및 회원가입 기능을 구현하는 방법에 대해 알아보겠습니다.

1. Firebase 프로젝트 설정하기

Firebase 콘솔에 접속하여 새로운 프로젝트를 생성하고, 앱을 등록합니다. 앱 등록 과정에서 앱의 패키지 이름을 입력해야 합니다. 이 패키지 이름은 Flutter 앱의 android/app/build.gradle 파일에서 applicationId에 설정된 값과 일치해야 합니다.

Firebase 콘솔에서 프로젝트 설정 페이지로 이동하고, 앱을 추가하여 구성 파일(google-services.json 또는 GoogleService-Info.plist)을 다운로드합니다.

다운로드한 구성 파일을 Flutter 프로젝트의 android/app 폴더 또는 ios/Runner 폴더에 복사합니다.

2. Firebase 및 Flutter 패키지 설정하기

Firebase의 Realtime Database를 사용하기 위해 firebase_database 패키지를 Flutter 프로젝트에 추가해야 합니다. pubspec.yaml 파일에 아래와 같이 추가합니다:

dependencies:
  flutter:
    sdk: flutter
  firebase_database: ^7.1.0

패키지를 추가한 후에는 Flutter 프로젝트를 업데이트합니다:

$ flutter pub get

3. 로그인 및 회원가입 페이지 UI 구현하기

Flutter 앱에서 로그인 및 회원가입 페이지를 구현합니다. 예를 들어, LoginPageSignupPage라는 두 개의 페이지를 가지는 앱을 구현한다고 가정합니다.

LoginPage에서는 사용자가 이메일과 비밀번호를 입력하여 로그인할 수 있도록 합니다. SignupPage에서는 사용자가 이메일, 비밀번호, 및 추가 필드(예: 이름, 닉네임 등)를 입력하여 회원가입할 수 있도록 합니다.

UI는 Flutter의 위젯을 사용하여 구성할 수 있습니다. 예를 들어, TextField 위젯을 사용하여 이메일과 비밀번호를 입력받을 수 있습니다.

4. Firebase 인증(Authentication) 구현하기

로그인 및 회원가입 페이지에서 사용자가 입력한 이메일과 비밀번호를 사용하여 Firebase 인증을 구현해야 합니다.

Firebase의 FirebaseAuth 클래스를 사용하여 이메일과 비밀번호로 인증 정보를 만들고, createUserWithEmailAndPassword 메소드를 사용하여 회원가입을 처리합니다.

import 'package:firebase_auth/firebase_auth.dart';

final FirebaseAuth _auth = FirebaseAuth.instance;

Future<UserCredential> signUpWithEmailAndPassword(String email, String password) async {
  UserCredential userCredential = await _auth.createUserWithEmailAndPassword(
    email: email,
    password: password,
  );
  return userCredential;
}

Future<UserCredential> signInWithEmailAndPassword(String email, String password) async {
  UserCredential userCredential = await _auth.signInWithEmailAndPassword(
    email: email,
    password: password,
  );
  return userCredential;
}

5. Firebase Database 연동하기

Firebase Realtime Database를 사용하여 사용자 정보를 저장 및 가져오는 기능을 구현합니다.

사용자가 회원가입 또는 로그인을 성공하면, 해당 사용자의 데이터를 Firebase Database에 저장합니다. 예를 들어, 사용자의 이름과 닉네임을 저장하는 users 컬렉션을 생성하고 사용자의 정보를 저장할 수 있습니다.

import 'package:firebase_database/firebase_database.dart';

final DatabaseReference _userRef = FirebaseDatabase.instance.reference().child('users');

Future<void> saveUserInfo(String userId, String email, String name, String nickname) async {
  await _userRef.child(userId).set({
    'email': email,
    'name': name,
    'nickname': nickname,
  });
}

또한, 사용자 데이터를 가져오는 기능도 구현할 수 있습니다. 예를 들어, 특정 사용자의 정보를 가져오는 getUserInfo 메소드를 다음과 같이 작성할 수 있습니다.

import 'package:firebase_database/firebase_database.dart';

Future<Map<String, dynamic>> getUserInfo(String userId) async {
  DataSnapshot snapshot = await _userRef.child(userId).once();
  return snapshot.value;
}

6. 로그인 및 회원가입 기능 연동하기

마지막으로, 로그인 및 회원가입 UI와 Firebase 인증 및 Firebase Database 연동 기능을 연결해야 합니다.

예를 들어, LoginPage에서 사용자가 이메일과 비밀번호를 입력한 후 로그인 버튼을 누르면 다음과 같이 로그인 기능을 호출할 수 있습니다.

import 'package:flutter/material.dart';

class LoginPage extends StatelessWidget {
  final TextEditingController emailController = TextEditingController();
  final TextEditingController passwordController = TextEditingController();

  void login() async {
    String email = emailController.text;
    String password = passwordController.text;
    // Firebase 로그인 인증 기능 호출
    // FirebaseAuth.instance 로그인 메소드 사용
    // signInWithEmailAndPassword(email, password) 호출
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Login"),
      ),
      body: Center(
        child: Column(
          children: [
            TextField(
              controller: emailController,
              keyboardType: TextInputType.emailAddress,
              decoration: InputDecoration(labelText: "Email"),
            ),
            TextField(
              controller: passwordController,
              obscureText: true,
              decoration: InputDecoration(labelText: "Password"),
            ),
            RaisedButton(
              child: Text("Log in"),
              onPressed: login,
            ),
          ],
        ),
      ),
    );
  }
}

회원가입 기능도 유사한 방식으로 구현할 수 있습니다. 사용자가 회원가입 페이지에서 입력한 정보를 Firebase 인증 및 Firebase Database에 저장합니다.

이제 Flutter 앱에서 Firebase Database를 사용한 로그인 및 회원가입 기능을 구현할 수 있습니다. Firebase의 Realtime Database를 사용하여 사용자 데이터를 저장하고 가져오는 방법에 대해 알아봤습니다.

더 자세한 내용은 Firebase 문서를 참조해주세요.