본문 바로가기
이것저것

[타닥] Realtime Database를 이용한 CRUD(Firebase)

by shinhyogeun 2020. 10. 5.

인증을 완료했다면 이제는 database를 이용해서 데이터를 서버측과 주고받아야한다. 

당연 가장 중요한 CRUD를 중심으로 그 사용법을 익혀보자. 하나만 잘 하면 나머지는 어렵지 않으니 잘 살펴보자

사전에 2개를 이야기하자면 일단은 realtime Database의 규칙을 정의해야한다. 위에 보이는 코드는 users/$uid안에 있는 노드는 로그인을 한다면($uid === auth.uid) 읽고 쓰는게 가능하다는 것이다. 또한  기본 셋팅은 지금 위의 왼쪽에 보이는 화면과 같다. Google login을 구현했지만 그 버튼은 코드로 삽입했기에 위에 보이지 않는 점은 양해바랍니다..ㅠ,.ㅠ

 

1. Create

위의 왼쪽의 Create버튼을 누르면 바로 저장되는 식이다. 일단은 코드를 보자

              ref는 위에서 다음과 같이 정의되어 있다. 이는 realtime Database를 참조하는 변수이다. 

key값은 ref안에 users안에 자동으로 임의ID를 생성한다. 그렇지 못하면 함수 종료!

그 다음은 우리가 넣을 데이터의 구조이다. 이는 NSDictionary로 우리가 자주 사용하는 데이터 구조이다. 익숙할 것이다.

또한 그 다음으로는 childUpdate라는 다른 Dictionary를 만들고! ([위치:무엇을] 식으로) 이를 ref.updateChildValues의 인자로 넣어 실행하면 database가 업데이트 된다.

이건 posts2가 잘 업데이트 된게 보인다.

2. Read

postRef라는 상수는 databaseQuery로 이는 ref라는 참조에서 users안으로 그리고 그 다음에 자신의 uid로 그다음에 posts로 Drill down해서 들어간다. 그 후 거기에 있는 것들을 index값을 기준으로 정렬한 것!!을 참조한다. 그 후 observeSingleEvent(of:){(snapshot, key)}라는 함수가 실행된다. 이 함수는 postRef에 장착(?)될때(리스너가 생성될때!) 딱 한번 실행된다. 즉 read버튼이 눌리면 read함수가 실행되고 그때마다 postRef에 장착되므로 그때 postRef의 snapshot과 key가 클로져의 인자로 넘어간다. 그 후에는 thread와 UI개념때문에 group.enter()를 실행해야한다. 뒤에 group.leave(), group.notify(queue: .main)모두 나중에 따로 다루는 시간을 갖을 것이다. 단지 main thread에서 이 작업을 하지 않고 다른 thread에서 실행 후 main thread에 있는 UI를 업데이트 해준다고 보면 쉽다. 그 사이에 있는 for 문으로 각각의 posts들의 노드들을 형을 변환하여 Child Key와 모든 내용들을 출력하고 있다. 결과는 다음과 같다.

모든 결과가 아니고 결과중에 일부만 보여드립니다!(너무 많아)

3. Update

Update의 코드는 위의 Read와 매우 비슷하다고 볼 수 있다. 심지어 코드에 조금 익숙한 사람들은 이 코드가 무엇을 어떻게 업데이트 하는지까지 다 알 수 있을 것이다. 이 코드는 일단 index의 갯수(=count)를 구하고 그 다음에 각 노드의 index값을 전체수-count로 값을 update시키고 있다. 그 때 사용하는 함수는 setValue라는 함수 이고 postRef안에 childSnapShot.key의 노드 안에 index의 값을 업데이트 하는 것이다.

 

4. Delete 

이것도 Read의 코드와 매우 비슷하다. 다음의 코드를 보자.

이게 설명이 필요할까요???ㅋㅋㅋㅋㅋㅋㅋ 절대 필요없습니다. 2.Read와 3.update를 참고해주세요!