# Firebase 서비스 계정 키 설정 가이드

## 1. Firebase Console에서 서비스 계정 키 생성

### 단계별 설명:

1. **Firebase Console 접속**
   ```
   https://console.firebase.google.com/
   ```

2. **프로젝트 선택**
   - 생성한 "BabyNote" 프로젝트 클릭

3. **프로젝트 설정으로 이동**
   ```
   좌측 메뉴에서 ⚙️ (설정) 아이콘 클릭
   → "프로젝트 설정" 클릭
   ```

4. **서비스 계정 탭 이동**
   ```
   상단 탭에서 "서비스 계정" 클릭
   ```

5. **새 비공개 키 생성**
   ```
   페이지 하단에 "새 비공개 키 생성" 버튼 클릭
   → 확인 대화상자에서 "키 생성" 클릭
   → JSON 파일 자동 다운로드됨
   ```

6. **다운로드된 JSON 파일 열기**
   - 파일 이름: `babynote-xxxxx-xxxxxxxx.json`
   - 텍스트 에디터로 열기

---

## 2. JSON 파일 내용 확인

다운로드한 JSON 파일은 다음과 같은 형식입니다:

```json
{
  "type": "service_account",
  "project_id": "babynote-xxxxx",
  "private_key_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBA...\n-----END PRIVATE KEY-----\n",
  "client_email": "firebase-adminsdk-xxxxx@babynote-xxxxx.iam.gserviceaccount.com",
  "client_id": "xxxxxxxxxxxxxxxxxxxx",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-xxxxx%40babynote-xxxxx.iam.gserviceaccount.com"
}
```

---

## 3. 환경변수 설정 (2가지 방법)

### **방법 1: JSON 문자열로 직접 설정 (추천)**

1. **JSON 파일 내용을 한 줄로 압축**
   - 줄바꿈 제거
   - 공백 제거 (선택사항)

2. **.env 파일에 추가**
   ```env
   FIREBASE_SERVICE_ACCOUNT={"type":"service_account","project_id":"babynote-xxxxx","private_key_id":"xxxxxxxx","private_key":"-----BEGIN PRIVATE KEY-----\nMIIEvQIBA...\n-----END PRIVATE KEY-----\n","client_email":"firebase-adminsdk-xxxxx@babynote-xxxxx.iam.gserviceaccount.com","client_id":"xxxxxxxxxxxxxxxxxxxx","auth_uri":"https://accounts.google.com/o/oauth2/auth","token_uri":"https://oauth2.googleapis.com/token","auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs","client_x509_cert_url":"https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-xxxxx%40babynote-xxxxx.iam.gserviceaccount.com"}
   ```

   **⚠️ 주의사항:**
   - 전체를 한 줄로 작성
   - 앞뒤에 따옴표 없음
   - `\n` 문자는 그대로 유지 (줄바꿈이 아님)

### **방법 2: 파일 경로 설정**

1. **JSON 파일을 백엔드 프로젝트에 복사**
   ```
   C:\Users\GIGA\Desktop\works\kscompany\app-master-back\firebase-service-account.json
   ```

2. **.env 파일에 경로 추가**
   ```env
   GOOGLE_APPLICATION_CREDENTIALS=./firebase-service-account.json
   ```

3. **services/fcm.js 수정**
   ```javascript
   function initializeFirebase() {
     if (firebaseInitialized) return;

     try {
       // 방법 1: 환경변수에서 JSON 로드
       if (process.env.FIREBASE_SERVICE_ACCOUNT) {
         const serviceAccount = JSON.parse(process.env.FIREBASE_SERVICE_ACCOUNT);
         admin.initializeApp({
           credential: admin.credential.cert(serviceAccount),
         });
       }
       // 방법 2: 파일 경로에서 로드
       else if (process.env.GOOGLE_APPLICATION_CREDENTIALS) {
         admin.initializeApp({
           credential: admin.credential.applicationDefault(),
         });
       }

       firebaseInitialized = true;
       console.log('✅ Firebase Admin SDK initialized');
     } catch (error) {
       console.error('❌ Failed to initialize Firebase Admin SDK:', error);
     }
   }
   ```

---

## 4. .env 파일 예시

```env
# Database
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=your_password
DB_PORT=3306
DB_NAME=app_master_db

# Firebase (방법 1 또는 방법 2 중 선택)
# 방법 1: JSON 문자열
FIREBASE_SERVICE_ACCOUNT={"type":"service_account","project_id":"babynote-xxxxx",...}

# 방법 2: 파일 경로
# GOOGLE_APPLICATION_CREDENTIALS=./firebase-service-account.json
```

---

## 5. 설정 확인

### 서버 재시작
```bash
cd C:\Users\GIGA\Desktop\works\kscompany\app-master-back
npm start
```

### 로그 확인
```
✅ Firebase Admin SDK initialized
```

위 메시지가 보이면 성공!

---

## 6. 보안 주의사항

⚠️ **절대로 하지 말 것:**
- Git에 서비스 계정 키 커밋 금지
- 공개 저장소에 업로드 금지
- 타인과 공유 금지

✅ **.gitignore에 추가 (이미 되어있음):**
```
.env
firebase-service-account.json
```

---

## 7. 문제 해결

### 오류: "Failed to initialize Firebase Admin SDK"
**원인:**
- JSON 형식 오류
- 환경변수 설정 오류

**해결:**
1. JSON 유효성 검사: https://jsonlint.com/
2. 환경변수 확인: `console.log(process.env.FIREBASE_SERVICE_ACCOUNT)`
3. 서버 재시작

### 오류: "Credential implementation provided to initializeApp() via the 'credential' property"
**원인:**
- Firebase가 이미 초기화됨

**해결:**
- 서버 재시작

---

## 8. 테스트

### 1. 앱에서 로그인
```
1. Flutter 앱 실행
2. 로그인
3. 로그에서 FCM 토큰 확인
```

### 2. 데이터베이스 확인
```sql
SELECT * FROM fcm_tokens WHERE user_id = 'YOUR_USER_ID';
```

### 3. 테스트 알림 전송
```bash
# 좋아요 알림 테스트
curl -X POST http://localhost:3000/api/babynote/diary/:diaryId/like \
  -H "Content-Type: application/json" \
  -d '{"userId": "YOUR_USER_ID"}'
```

---

## 완료! 🎉

이제 푸시 알림이 작동합니다!
