4주 과정으로 돌아가기
3주차

AI 기능 추가로 서비스에 날개 달기

GitHub 설정부터 Firebase App Hosting 배포, AI 연동까지

8월 26일(화) 20:00 - 22:00

이번 주 핵심 포인트

완전한 개발-배포-AI 통합 워크플로우 완성
GitHub으로 코드를 관리하고, Firebase App Hosting으로 배포하며, AI 기능을 통합하여 실제 서비스와 같은 완전한 웹 애플리케이션을 구축합니다.

학습 목표

  • GitHub 설정하고 코드 버전 관리하기
    Git과 GitHub의 기본 개념을 이해하고, 프로젝트를 Repository에 올려 버전 관리하며 협업 기반을 구축합니다.
  • Firebase App Hosting으로 웹 애플리케이션 배포하기
    GitHub와 연동된 Firebase App Hosting을 활용하여 자동 배포 파이프라인을 구축하고 실제 인터넷에 서비스를 공개합니다.
  • Firebase AI Logic으로 AI 앱 만들기
    Firebase의 Vertex AI와 Gemini API를 활용하여 서버리스 AI 기능을 구현하고, 사용자와 상호작용하는 지능적인 기능을 추가합니다.
  • Authentication으로 사용자 로그인 구현하기
    Firebase Authentication을 활용하여 Google, 이메일 로그인 기능을 구현하고 사용자별 개인화된 서비스를 제공합니다.

실습 프로젝트

🤖
'AI 감정 일기장' 또는 'AI가 응원해주는 TODO 앱'
2주차에서 만든 기본 웹 애플리케이션에 AI 기능을 추가하여 사용자와 상호작용하는 지능적인 서비스로 발전시킵니다.

세부 일정 (2시간)

20:00 - 20:25
GitHub 설정 및 Repository 생성
Git 기본 개념 이해, GitHub 계정 설정, Repository 생성 및 코드 업로드
20:25 - 20:50
Firebase App Hosting 배포
Firebase App Hosting 설정, GitHub 연동, 자동 배포 파이프라인 구축
20:50 - 21:25
Firebase AI Logic 구현
Vertex AI 설정, Gemini API 연동, AI 기능을 활용한 사용자 인터랙션 구현
21:25 - 22:00
Authentication 로그인 기능 추가
Firebase Authentication 설정, Google/이메일 로그인 구현, 사용자별 데이터 관리

🐙 GitHub 마스터하기 - 터미널부터 GitHub까지!

GitHub이란? 전 세계 개발자들이 코드를 저장하고 공유하는 플랫폼입니다. 마치 "개발자들의 구글 드라이브"라고 생각하시면 됩니다! 완전 무료로 사용할 수 있어요.
사전 준비: 터미널 사용법을 먼저 배우셔야 합니다! 터미널 열기와 cd 명령어 정도는 알아두세요. (이전 주차 터미널 가이드 참조)
터미널이란? 컴퓨터와 텍스트로 대화하는 창입니다. 마우스 클릭 대신 키보드로 명령어를 입력해서 컴퓨터를 조작합니다. 처음엔 어색하지만 개발자들이 가장 많이 사용하는 도구예요!
1

터미널(명령 프롬프트) 열기

컴퓨터와 대화하는 창을 열어보세요

🍎 Mac 사용자

방법 1: 스포트라이트 검색
1. Command + Space 키를 동시에 누르기
2. "터미널" 또는 "Terminal" 입력
3. Enter 키 누르면 검은색 창이 열림

방법 2: 런치패드에서
1. F4 키를 누르거나 독에서 런치패드 클릭
2. "기타" 폴더 안에서 "터미널" 찾기
3. 터미널 아이콘 클릭
성공하면 검은색 창에 $ 또는 % 표시가 나타납니다!

🪟 Windows 사용자

방법 1: 실행 창에서
1. Windows키 + R 동시에 누르기
2. "cmd" 입력하고 Enter
3. 검은색 명령 프롬프트 창이 열림

방법 2: 시작 메뉴에서
1. Windows 키 누르고 "cmd" 검색
2. "명령 프롬프트" 클릭
3. 또는 "PowerShell" 사용도 가능
성공하면 C:\Users\사용자명> 같은 표시가 나타납니다!
처음 보는 화면이 무서우셨나요? 괜찮습니다! 검은 화면에 하얀 글씨는 해커 영화에서나 보던 것 같지만, 실제로는 매우 유용하고 정확한 도구입니다. 천천히 따라해보세요!
2

터미널 화면 이해하기

터미널에서 보이는 것들이 무엇인지 알아보기

🔍 화면 구성 요소

Mac에서 보이는 것
MacBook-Pro:~ username$
MacBook-Pro: 컴퓨터 이름
~: 현재 위치 (홈 폴더)
username: 사용자 이름
$: 명령어 입력 대기 상태
Windows에서 보이는 것
C:\Users\username>
C:: C드라이브를 의미
\Users\username: 현재 위치
>: 명령어 입력 대기 상태
꿀팁: 커서가 깜빡이는 곳이 명령어를 입력할 수 있는 자리입니다. 마치 워드프로세서에서 글을 쓸 때와 같아요!
3

기본 명령어 마스터하기

꼭 알아야 할 필수 명령어들을 실습해보세요

🎯 현재 위치 확인하기

Mac / Linux
$ pwd
# Print Working Directory
# 현재 내가 어느 폴더에 있는지 보여줌
Windows
> cd
# 매개변수 없이 cd만 입력
# 현재 위치를 보여줌

📁 폴더 내용 보기

Mac / Linux
$ ls
Desktop Documents Downloads
# List: 현재 폴더의 파일과 폴더 목록
Windows
> dir
바탕 화면 문서 다운로드
# Directory: 현재 폴더의 파일과 폴더 목록

🚀 폴더 이동하기 (가장 중요!)

공통 사용법
$ cd Desktop
# 바탕화면으로 이동

$ cd ..
# 상위 폴더로 이동 (뒤로가기)

$ cd ~/Documents
# 홈 폴더의 Documents로 바로 이동

$ cd "폴더 이름"
# 띄어쓰기가 있는 폴더는 따옴표로 감싸기

💡 실습해보기 (5분만 투자하세요!)

  1. pwd (또는 Windows: cd) 입력해서 현재 위치 확인
  2. ls (또는 Windows: dir) 입력해서 폴더 목록 보기
  3. cd Desktop 입력해서 바탕화면으로 이동
  4. 다시 pwd 입력해서 위치가 바뀌었는지 확인
  5. cd .. 입력해서 원래 위치로 돌아오기
축하합니다! 이제 터미널의 기본기를 익혔습니다. cd, pwd/ls/dir 명령어만 알아도 80%는 끝났어요!
4

터미널 사용 꿀팁

알아두면 편리한 터미널 사용법들

⌨️ 자동완성 (Tab키)
폴더명을 다 입력하지 마세요!
cd Des 입력 후 Tab키를 누르면Desktop으로 자동완성됩니다.
⬆️ 히스토리 (위/아래 화살표)
이전에 입력했던 명령어를 다시 사용하고 싶다면위 화살표 키를 눌러보세요. 입력 기록이 나타납니다.
🏠 홈으로 빠른 이동
cd ~ 또는 cd만 입력하면 어디서든 홈 폴더(사용자 폴더)로 바로 이동합니다.
🧹 화면 정리 (clear)
터미널 화면이 너무 지저분해졌다면clear (Mac) 또는 cls (Windows) 입력으로 깨끗하게 정리하세요.
실수해도 괜찮아요! 터미널에서 잘못 입력해도 컴퓨터가 고장나지 않습니다. 오타가 나면 "command not found" 같은 메시지만 나올 뿐이에요. 부담 없이 연습해보세요!

🙋‍♀️ 자주 묻는 질문

GitHub는 무료인가요?
네! 개인 사용자는 완전 무료입니다. 무제한 public repository를 만들 수 있고, private repository도 무료로 사용 가능합니다.
사용자명을 실명으로 해야 하나요?
꼭 실명일 필요는 없어요! 다만 나중에 포트폴리오로 활용할 수 있으니 전문적인 느낌의 이름을 추천합니다. (예: kimcoder, projectlee 등)
터미널이 너무 어려워요...
처음엔 누구나 어려워해요! 일단 cd와 ls(dir) 명령어만 알아도 충분합니다. 많이 사용할수록 익숙해지니 걱정 마세요. GUI 도구(GitHub Desktop)도 있어요!
실수로 잘못 올리면 어떻게 하죠?
GitHub에서 파일을 직접 수정하거나 삭제할 수 있어요! 웹사이트에서 파일을 클릭하고 연필 아이콘(편집) 또는 휴지통 아이콘(삭제)을 사용하면 됩니다.
축하합니다! 🎉 GitHub 계정을 만들고 기본 사용법을 익혔습니다. 이제 여러분도 전 세계 개발자들과 같은 플랫폼을 사용하고 있어요! 다음 단계에서는 실제 프로젝트를 업로드해보겠습니다.

🚀 Firebase App Hosting으로 배포하기

Firebase App Hosting이란? GitHub Repository와 연동되어 자동으로 빌드하고 배포해주는 Firebase의 최신 호스팅 서비스입니다. 코드를 push하면 자동으로 웹사이트가 업데이트됩니다.

✨ App Hosting의 주요 기능

자동 배포
Git push 시 자동으로 빌드 및 배포가 실행됩니다.
글로벌 CDN
전 세계 어디서나 빠른 속도로 웹사이트에 접근할 수 있습니다.
프리뷰 배포
Pull Request마다 프리뷰 URL을 생성하여 테스트할 수 있습니다.
서버리스
서버 관리 없이 확장 가능한 웹 애플리케이션을 호스팅합니다.
1

Firebase 프로젝트에서 App Hosting 활성화

Firebase Console에서 App Hosting 서비스를 활성화하고 설정합니다.
# Firebase Console에서:
1. 프로젝트 선택
2. 좌측 메뉴에서 'Hosting' > 'App Hosting' 선택
3. 'Get Started' 클릭
4. GitHub 계정 연결 허용
2

GitHub Repository 연결

GitHub Repository를 Firebase App Hosting에 연결하여 자동 배포를 설정합니다.
# App Hosting 설정:
1. 'Connect to GitHub' 선택
2. Repository 선택 (예: username/my-todo-app)
3. 배포할 브랜치 선택 (보통 main 또는 master)
4. 빌드 설정 구성
3

빌드 구성 설정

Next.js 프로젝트의 빌드 명령어와 출력 디렉토리를 설정합니다.
# 빌드 설정 예시:
Build command: npm run build
Output directory: .next
Node.js version: 18

# package.json의 scripts 확인:
{
  "scripts": {
    "build": "next build",
    "start": "next start"
  }
}
4

환경 변수 설정

API Key와 같은 민감한 정보를 안전하게 관리합니다.
# Firebase App Hosting 환경 변수:
NEXT_PUBLIC_FIREBASE_API_KEY=your_api_key
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=your_domain
NEXT_PUBLIC_FIREBASE_PROJECT_ID=your_project_id

# .env.local 파일은 GitHub에 업로드하지 않도록 주의!
5

첫 배포 실행

설정이 완료되면 자동으로 배포가 시작되며, 이후 Git push할 때마다 자동 배포됩니다.
# 자동 배포 프로세스:
1. GitHub에 코드 push
2. Firebase App Hosting이 자동으로 감지
3. 빌드 프로세스 실행
4. 성공 시 자동으로 배포 완료
5. 고유한 URL로 웹사이트 접근 가능
배포 완료! 성공적으로 배포되면 'your-project-name.web.app' 형태의 URL을 받게 됩니다. 이 URL을 통해 전 세계 어디서나 여러분의 웹사이트에 접근할 수 있습니다!

🧠 Firebase AI Logic으로 AI 앱 만들기

Firebase AI Logic이란? Google의 Vertex AI와 Gemini 모델을 Firebase에서 쉽게 사용할 수 있게 해주는 서비스입니다. 서버 없이도 강력한 AI 기능을 웹앱에 통합할 수 있습니다.

🎯 구현 가능한 AI 기능 예시

감정 일기장
사용자의 일기를 분석하여 감정 상태를 파악하고 맞춤형 피드백 제공
💡 "오늘은 힘든 하루였어요" → AI: "힘든 하루를 보내셨군요. 내일은 더 좋은 일들이 기다리고 있을 거예요! 💪"
AI 응원 TODO
할일 목록에 동기부여 메시지를 자동 생성하여 실행력 향상
💡 "운동하기" → AI: "건강한 몸은 건강한 마음의 시작! 오늘도 화이팅! 🏃‍♂️"
스마트 추천 시스템
사용자의 취향과 행동 패턴을 분석하여 개인화된 콘텐츠 추천
💡 사용자 관심사 분석 후 맞춤형 학습 자료나 활동 제안
자동 분류 및 태깅
사용자 입력을 자동으로 카테고리별로 분류하고 태그 생성
💡 "헬스장 등록하기" → 자동 태그: #건강 #운동 #목표설정
1

Firebase Extensions에서 Vertex AI 확장 설치

Firebase Console에서 Vertex AI 확장을 설치하여 AI 기능을 활성화합니다.
# Firebase Console에서:
1. Extensions 메뉴 이동
2. 'Vertex AI in Firebase' 검색
3. 'Install' 클릭
4. 프로젝트 설정 및 결제 계정 연결 (무료 할당량 있음)
5. 설치 완료 후 구성
2

Cloud Functions에서 AI 로직 구현

서버리스 함수를 만들어 AI API를 호출하고 응답을 처리합니다.
// functions/index.js
const { onCall, HttpsError } = require('firebase-functions/v2/https');
const { VertexAI } = require('@google-cloud/vertexai');

const vertexAI = new VertexAI({
  project: 'your-project-id',
  location: 'us-central1'
});

exports.generateAIResponse = onCall(async (request) => {
  try {
    const { prompt } = request.data;
    
    const generativeModel = vertexAI.getGenerativeModel({
      model: 'gemini-1.5-flash'
    });
    
    const result = await generativeModel.generateContent(prompt);
    const response = result.response;
    
    return {
      success: true,
      text: response.candidates[0].content.parts[0].text
    };
  } catch (error) {
    throw new HttpsError('internal', 'AI 응답 생성 실패');
  }
});
3

클라이언트에서 AI 함수 호출

React 컴포넌트에서 Firebase Cloud Functions를 호출하여 AI 응답을 받습니다.
// components/AIChat.js
import { getFunctions, httpsCallable } from 'firebase/functions';
import { useState } from 'react';

const AIChat = () => {
  const [message, setMessage] = useState('');
  const [aiResponse, setAiResponse] = useState('');
  const [loading, setLoading] = useState(false);
  
  const generateResponse = httpsCallable(
    getFunctions(), 
    'generateAIResponse'
  );
  
  const handleSubmit = async (e) => {
    e.preventDefault();
    setLoading(true);
    
    try {
      const result = await generateResponse({ 
        prompt: message 
      });
      setAiResponse(result.data.text);
    } catch (error) {
      console.error('AI 응답 실패:', error);
    } finally {
      setLoading(false);
    }
  };
  
  return (
    <div>
      <form onSubmit={handleSubmit}>
        <input 
          value={message}
          onChange={(e) => setMessage(e.target.value)}
          placeholder="AI에게 메시지를 보내보세요"
        />
        <button type="submit" disabled={loading}>
          {loading ? '생각중...' : '전송'}
        </button>
      </form>
      
      {aiResponse && (
        <div className="ai-response">
          <h4>AI 응답:</h4>
          <p>{aiResponse}</p>
        </div>
      )}
    </div>
  );
};
4

감정 분석 및 개인화 기능 추가

사용자의 입력을 분석하여 개인화된 응답을 제공하는 고급 기능을 구현합니다.
// 감정 일기장 예시
const analyzeEmotion = async (diary) => {
  const prompt = `다음 일기의 감정을 분석하고 위로의 말을 해주세요:
  
  "${diary}"
  
  감정 분석: (긍정적/부정적/중립적)
  위로의 말: (따뜻하고 공감적인 메시지)`;
  
  const result = await generateResponse({ prompt });
  return result.data.text;
};

// TODO 응원 기능 예시  
const generateEncouragement = async (todoItem) => {
  const prompt = `다음 할일에 대해 동기부여가 되는 응원 메시지를 작성해주세요:
  
  할일: "${todoItem}"
  
  짧고 에너지 넘치는 응원 메시지를 작성해주세요.`;
  
  const result = await generateResponse({ prompt });
  return result.data.text;
};
비용 최적화 팁: Firebase의 Vertex AI는 무료 할당량이 있습니다! 월 요청 수를 모니터링하고, 캐싱을 활용하여 비용을 최적화하세요. 개발 단계에서는 대부분 무료로 사용 가능합니다.

🔐 Authentication으로 로그인 하기

Firebase Authentication이란? 사용자 인증과 계정 관리를 자동으로 처리해주는 Firebase 서비스입니다. 복잡한 보안 설정 없이도 안전한 로그인 시스템을 구축할 수 있습니다.

🔑 지원되는 로그인 방식

Google 로그인
가장 널리 사용되는 OAuth 로그인 방식으로 빠르고 안전합니다.
✓ 간편한 구현 ✓ 높은 사용자 수용성 ✓ Google 계정 정보 활용 가능
이메일/비밀번호
전통적인 로그인 방식으로 사용자가 직접 계정을 생성합니다.
✓ 완전한 사용자 제어 ✓ 이메일 인증 가능 ✓ 비밀번호 재설정 지원
익명 로그인
회원가입 없이 임시 계정으로 서비스를 체험할 수 있습니다.
✓ 진입 장벽 낮음 ✓ 나중에 정식 계정 전환 가능 ✓ 임시 데이터 저장
1

Firebase Authentication 설정

Firebase Console에서 Authentication 서비스를 활성화하고 로그인 방법을 설정합니다.
# Firebase Console에서:
1. Authentication 메뉴 이동
2. 'Get started' 클릭
3. Sign-in method 탭에서 원하는 로그인 방법 활성화:
   - Google (OAuth 2.0)
   - Email/Password
   - 기타 소셜 로그인 (Facebook, Twitter 등)
2

Google 로그인 설정

가장 많이 사용되는 Google OAuth 로그인을 설정합니다.
# Firebase Console에서 Google 설정:
1. Google 로그인 방법 활성화
2. 프로젝트 지원 이메일 설정
3. OAuth 동의 화면 구성 (선택사항)

# 웹 앱에서 사용할 설정 정보 확인:
- Web client ID
- Web client secret (자동 관리됨)
3

React에서 Authentication 구현

Firebase Auth SDK를 사용하여 로그인/로그아웃 기능을 구현합니다.
// lib/firebase.js - Firebase 초기화
import { initializeApp } from 'firebase/app';
import { getAuth, GoogleAuthProvider } from 'firebase/auth';

const firebaseConfig = {
  // Firebase 설정
};

const app = initializeApp(firebaseConfig);
export const auth = getAuth(app);
export const googleProvider = new GoogleAuthProvider();

// components/Login.js
import { signInWithPopup, signOut } from 'firebase/auth';
import { auth, googleProvider } from '../lib/firebase';
import { useAuthState } from 'react-firebase-hooks/auth';

const Login = () => {
  const [user, loading, error] = useAuthState(auth);
  
  const signInWithGoogle = async () => {
    try {
      await signInWithPopup(auth, googleProvider);
    } catch (error) {
      console.error('로그인 실패:', error);
    }
  };
  
  const logOut = () => {
    signOut(auth);
  };
  
  if (loading) return <div>로딩 중...</div>;
  
  return (
    <div>
      {user ? (
        <div>
          <p>안녕하세요, {user.displayName}님!</p>
          <img src={user.photoURL} alt="프로필" />
          <button onClick={logOut}>로그아웃</button>
        </div>
      ) : (
        <button onClick={signInWithGoogle}>
          Google로 로그인
        </button>
      )}
    </div>
  );
};
4

사용자별 데이터 관리

로그인한 사용자별로 데이터를 분리하여 저장하고 관리합니다.
// 사용자별 Firestore 데이터 구조
// /users/{userId}/todos/{todoId}

import { doc, collection, addDoc, query, where, getDocs } from 'firebase/firestore';
import { db } from '../lib/firebase';

// 사용자별 TODO 저장
const addUserTodo = async (userId, todoData) => {
  const userTodosRef = collection(db, 'users', userId, 'todos');
  await addDoc(userTodosRef, {
    ...todoData,
    createdAt: new Date(),
    userId: userId
  });
};

// 사용자 TODO 목록 가져오기
const getUserTodos = async (userId) => {
  const userTodosRef = collection(db, 'users', userId, 'todos');
  const snapshot = await getDocs(userTodosRef);
  return snapshot.docs.map(doc => ({
    id: doc.id,
    ...doc.data()
  }));
};

// 컴포넌트에서 사용
const TodoList = () => {
  const [user] = useAuthState(auth);
  const [todos, setTodos] = useState([]);
  
  useEffect(() => {
    if (user) {
      getUserTodos(user.uid).then(setTodos);
    }
  }, [user]);
  
  const handleAddTodo = async (todoText) => {
    if (user) {
      await addUserTodo(user.uid, { text: todoText, completed: false });
      // TODO 목록 새로고침
      const updatedTodos = await getUserTodos(user.uid);
      setTodos(updatedTodos);
    }
  };
  
  if (!user) {
    return <Login />;
  }
  
  return (
    <div>
      <h2>{user.displayName}님의 TODO 리스트</h2>
      {/* TODO 목록 렌더링 */}
    </div>
  );
};
5

보안 규칙 설정

Firestore 보안 규칙을 설정하여 사용자가 자신의 데이터만 접근할 수 있도록 합니다.
// firestore.rules
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // 사용자는 자신의 데이터만 읽고 쓸 수 있음
    match /users/{userId}/{document=**} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
    
    // 공개 데이터 (필요시)
    match /public/{document=**} {
      allow read: if true;
      allow write: if request.auth != null;
    }
  }
}
보안 팁:
  • API 키는 환경 변수로 관리하고 GitHub에 업로드하지 마세요
  • Firestore 보안 규칙을 반드시 설정하여 데이터를 보호하세요
  • 사용자 입력은 항상 검증하고 sanitize하세요
  • 정기적으로 Firebase 콘솔에서 사용자 활동을 모니터링하세요
개인화 서비스 완성! Authentication을 통해 각 사용자별로 개인화된 데이터를 관리하고, AI 기능과 결합하여 사용자에게 맞춤형 경험을 제공할 수 있게 됩니다. 이제 여러분만의 완전한 웹 서비스가 완성되었습니다! 🎉

📋 실습 과제

AI와 API를 이용해 웹 기능 확장하기

2주차에 만든 자신의 웹사이트에 외부 API(AI, 공공데이터 등)를 자유롭게 연동하여 새로운 기능을 추가하고, 서비스의 가치를 높여보세요.

  • GitHub Repository에 프로젝트 업로드 및 관리
  • Firebase App Hosting을 통한 실제 배포
  • AI 기능 연동 (감정 분석, 추천 시스템 등)
  • 사용자 인증 시스템 구현
  • 개인화된 사용자 경험 제공