Anglar 애플리케이션과 Firebase를 함께 사용하여 Cloud Firestore 사용

다음은 Anglar 응용 프로그램과 Firebase가 연합하여 데이터베이스에서 CRUD 처리를 하는 절차를 요약한다.
데이터베이스에는 Cloud Firestore 가 사용됩니다.

작업 환경


이번에는 다음 버전을 사용합니다.
  • node: v14.15.3
  • Angular: 13.3.0
  • Firebase: ^9.4.0
  • AngularFire: ^7.2.1
  • AnglarFire의 README에 사용 가능한 버전이 적혀 있습니다.버전에 편차가 있으면 동작하지 않으니 주의해야 한다.

    Firebase 측면 설정


  • 프로젝트 작성

  • (웹 페이지)에서 응용 프로그램 등록
    Firebase Hosting 설정 확인

  • Firebase CLI 로컬 설치
    이미 설치되어 있기 때문에 이 버전을 사용하세요.
    % firebase --version
    10.4.0
    

  • Firebase CLI에서 Google에 로그인
    로그인하면 메일 주소가 표시됩니다.
    % firebase login 
    Already logged in as [email protected]
    
  • 어플리케이션 설정


  • Fireabse 처리를 위한 Anglar 라이브러리 설치
    ng add @angular/fire
    
    ng add 명령을 사용하면 자동으로 설정할 수 있어 편리하다.

  • angular.json을 열고 스크립트 아래에 추가 설정
    "allowedCommonJsDependencies": [
    	"firebase",
    	"@firebase/database"
    ]
    

  • 설치 유형 정의 파일
    npm i @types/angularfire --save-dev
    

  • 환경 변수 설정
    Firebase 프로젝트에서 제 사전 설정에 이르기까지 FirebaseConfig의 값은 app/environments/environment입니다.ts가fireabse 속성으로 설정되었는지 확인하십시오.ng add 명령을 실행할 때 기록되어야 합니다.
    export const environment = {
    	production: false,
    	apiKey: ...
      authDomain: ...
      databaseUrRL: ... 
    

  • 모듈 사용
    app/app.modules.ts에서 AngualrFire 모듈을 설정합니다.
    import { AngularFireModule } from '@angular/fire/compat';
    import { environment } from '../environments/environment';
    
    imports: [
    	(略)
      AngularFireModule.initializeApp(environment.firebase),
    ],
    
    ng add 명령에 다음 코드를 추가합니다.이번에는 AngularFireModule를 사용해야 하기 때문에 이것을 먼저 삭제합니다.
    provideFirebaseApp(() => initializeApp(environment.firebase)),
    provideAuth(() => getAuth()),
    provideFirestore(() => getFirestore()),
    
  • 데이터베이스 초기 설정


    Realtime Database 또는 Cloud Firestore를 사용하여 데이터베이스를 생성합니다.이번에는 Firestore의 테스트 모드로 시작합니다.

    미리 규칙을 읽고 쓸 수 있도록

    Anglar에서 Firebase 데이터를 조작해 보세요.


    예시로 집합을 표시하고 등록하는 데 사용되는 문서 applicants 코드를 보여 줍니다.
    테스트에 데이터를 추가합니다.


    목록 보기 구현


    applicant.service.ts라는 서비스를 제작했기 때문에 그 중에서 일람 데이터를 얻어 되돌려줍니다.snapshotChanges()observable로 사용하여 map를 얻고 조작원이 미리 모양을 정리한다.id는 잠시 후 자세한 화면 설치에서 사용됩니다.
    import {
      AngularFirestore,
      AngularFirestoreCollection,
    } from '@angular/fire/compat/firestore';
    import { Observable } from 'rxjs';
    import { Applicant } from './class/applicant';
    
    export class ApplicantService {
    	private applicantsCollection: AngularFirestoreCollection<Applicant>;
      applicants$: Observable<Applicant[]>;
    
      constructor(private afs: AngularFirestore) {
        this.applicantsCollection = afs.collection<Applicant>('applicants');
        this.applicants$ = this.applicantsCollection.snapshotChanges().pipe(
          map((actions) =>
            actions.map((a) => {
              const data = a.payload.doc.data() as Applicant;
              const id = a.payload.doc.id;
              return { id, ...data };
            })
          )
        );
      }
    
    구성 요소 옆에Firestore에서 가져온 모음집을 표시하려면 구성 요소 옆의ts 파일에DI(의존성 주입)를 넣습니다.
    export class ListComponent implements OnInit {
      applicants$: Observable<Applicant[]>;
    
      constructor(private applicantService: ApplicantService) {
        this.applicants$ = this.applicantService.applicants$;
      }
    
    사용 파일| async은 다음과 같다.
    <ul *ngFor="let applicant of applicants$ | async">
      <li>{{ applicant.name }}</li>
    </ul>
    
    브라우저를 열면 목록에 1랑 및 2랑을 표시할 수 있습니다.

    등록 처리의 실현


    어셈블리 측면의 >에서 양식을 설정합니다.단추를 눌렀을 때 방법의 실행과 텍스트 영역이 비어 있습니다.
    <div class="mb-3">
      <label class="form-label">名前</label>
      <input type="text" [(ngModel)]="applicant.name" class="form-control" />
    </div>
    
    <button
      (click)="addApplicant(applicant); applicant.name = ''"
      type="button"
      class="btn btn-outline-info"
    >
      送信
    </button>
    

    어셈블리 측면의 ts 파일을 편집합니다.서비스에 설치된 로그인 방법을 호출 일람 페이지로 변경합니다.
    import { Router } from '@angular/router';
    import { Applicant } from '../applicant';
    import { ApplicantService } from '../applicant.service';
    
    constructor(
        private applicantService: ApplicantService,
        private router: Router
      ) {}
    
      ngOnInit(): void {}
    
      addApplicant(applicant: Applicant): void {
        this.applicantService
          .addApplicant(applicant)
          .then(() => this.router.navigateByUrl('/list'));
      }
    
    서비스 측에서 Firestore에 대한 등록 처리를 실시한다.
    import {
      AngularFirestore,
      AngularFirestoreCollection,
    } from '@angular/fire/compat/firestore';
    import { Applicant } from './class/applicant';
    
    export class ApplicantService {
    	private applicantsCollection: AngularFirestoreCollection<Applicant>;
    	(略)
    
    	addApplicant(applicant: Applicant) {
        return this.applicantsCollection.add(applicant);
      }
    
    이로써 폼에서 입력한 값은Firestore에 등록할 수 있습니다.

    고급 디스플레이의 실현


    일람된 항목에 링크를 붙여넣습니다.
    <ul *ngFor="let applicant of applicants$ | async">
      <li>
        <a routerLink="/detail/{{ applicant.id }}">
          {{ applicant.name }}
        </a>
      </li>
    </ul>
    
    링크의 URL은 http://localhost:4200/detail/mq0h4o49rNexxxxxxx과 같은 형식입니다.
    어셈블리를 생성하고 라우트를 다음과 같이 설정합니다.
    const routes: Routes = [
      { path: '', component: FormComponent },
      { path: 'list', component: ListComponent },
      { path: 'detail/:id', component: DetailComponent },  👈 追記
    ];
    
    구성 요소 측면의ts 파일에 자세한 데이터를 접근하여 구성원 변수에 대입합니다.
    import { Observable } from 'rxjs';
    import {
      AngularFirestore,
      AngularFirestoreDocument,
    } from '@angular/fire/compat/firestore';
    import { ActivatedRoute } from '@angular/router';
    import { Router } from '@angular/router';
    import { Applicant } from '../class/applicant';
    
    export class DetailComponent implements OnInit {
      private id: string;
      private applicantDoc: AngularFirestoreDocument<Applicant>;
      applicant$: Observable<Applicant>;
    
      constructor(
        private route: ActivatedRoute,
        private afs: AngularFirestore,
        private router: Router
      ) {}
    
      ngOnInit(): void {
        this.id = `${this.route.snapshot.paramMap.get('id')}`;
        this.applicantDoc = this.afs.doc<Applicant>(`applicants/${this.id}`);
        this.applicant$ = this.applicantDoc.valueChanges();
      }
    
    형식에 데이터베이스 값을 설정합니다.
    <ng-container *ngIf="applicant$ | async as applicant">
      <div class="mb-3">
        <label class="form-label">名前</label>
        <input type="text" [(ngModel)]="applicant.name" class="form-control" />
      </div>
    
    값을 표시할 수 있습니다.

    업데이트 처리의 실현


    상세하게 보이는 구성 요소의 ts 측면에 업데이트를 추가하는 방법입니다.
    updateApplicant(applicant: Applicant): void {
      this.applicantDoc.update(applicant);
    }
    
    >측면 설정 버튼.
    <button routerLink="/list" class="btn btn-outline-secondary">戻る</button>
    <button
      (click)="updateApplicant(applicant)"
      type="button"
      class="btn btn-outline-info"
    >
      更新
    </button>
    

    업데이트를 눌러 Firestore 화면을 확인합니다.

    업데이트가 완료되었습니다.

    삭제 처리의 실현


    ts 측면에서 삭제 방법을 설정합니다.
    deleteApplicant(): void {
      if (window.confirm('削除しますか?')) {
        this.applicantDoc.delete().then(() => this.router.navigateByUrl('/list'));
      }
    }
    
    삭제 버튼을 설정합니다.
    <button (click)="deleteApplicant()" class="btn btn-outline-warning ms-auto">
      削除
    </button>
    
    삭제를 눌러 대화 상자를 표시합니다.

    삭제할 수 있습니다.

    총결산


    다음은 Anglar 응용 프로그램과 Firebase가 연합하여 데이터베이스에서 CRUD 처리를 하는 절차를 총괄하였다.
    기본적인 처리지만 웹 응용 개발은 필수입니다. 참고할 수 있다면 좋겠습니다.

    참고 자료


    AnglarFire 공식 웹사이트>Collections in AngualFirestore

    좋은 웹페이지 즐겨찾기