본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Java(자바)

Java에서 Firebase 데이터 베이스 연동하기(안드로이드 없이, without Android)

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2020. 6. 25.

자바에서 파이어베이스를 연동하는 방법입니다.

파이어베이스에 가입하여 프로젝트를 생성해야 합니다.

이미 프로젝트가 있다면 상관없으나 만드는법을 전혀 모르시면 아래 사이트를 참조하여주세요.

lts0606.tistory.com/337

 

Javascript firebase fire-store 연동, 자바스크립트 파이어베이스 fire-store 연동

자바스크립트에서 파이어베이스를 연동하는 방법입니다. 파이어베이스에는 일반적으로 2가지 형태의 데이터베이스가 존재합니다. 1. fire-store 2. real-time 리얼타임 데이터베이스(realtime database)가

lts0606.tistory.com

 

여기서는 파이어베이스의 데이터베이스 중 1가지인 FireStore 저장소를 사용하는 방법에 대해서 작성하겠습니다.

메이븐 기준으로 라이브러리를 다운받습니다.

<dependency>
    <groupId>com.google.firebase</groupId>
    <artifactId>firebase-admin</artifactId>
    <version>6.8.1</version>
</dependency>

<dependency>
    <groupId>com.google.auto.value</groupId>
    <artifactId>auto-value</artifactId>
    <version>1.6.5</version>
    <scope>provided</scope>
</dependency>

 

버전에 유의하여야 하며 2개의 라이브러리는 의존적이라 반드시 둘 다 필요합니다.

gradle 환경에서의 작업이라면 아래내용을 추가합니다.

compile group: 'com.google.firebase', name: 'firebase-admin', version: '6.8.1'
providedCompile group: 'com.google.auto.value', name: 'auto-value', version: '1.6.5'

 

다음 작업은 서비스용 json파일을 받는 것 입니다.

파이어베이스 웹 콘솔로 접속하여 설정(Settings)을 눌러줍니다.

설정에서 4번째 탭인 "서비스 계정" 부분을 눌러주세요!

 

프로젝트 설정에서 4번째 탭인 "서비스 계정"을 클릭합니다.

그러면 개발에 원하는 언어를 선택 가능한 라디오 버튼이 나오며, 인증과 관련된 JSON파일을 받을 수 있습니다.

받는 방법은 "새 비공개 키 생성" 버튼을 누르면 사진처럼 파일을 받을 수 있습니다.

당연히! 자바를 선택한 뒤에 버튼을 눌러야 합니다.

또한 친절하게도 어떻게 객체를 생성하는 지에 대해서도 소스코드가 샘플로 잘 나와 있습니다.

 

여기까지 되었다면 이제 기본준비는 끝이 났습니다.

가장 먼저 파이어베이스 서버에 접속하는 메소드를 만들어 보겠습니다.

메소드는 위 사진의 예제를 그대로 따라하면 됩니다.

import java.io.FileInputStream;
import java.util.HashMap;
import java.util.Map;

import com.google.auth.oauth2.GoogleCredentials;
import com.google.cloud.firestore.Firestore;
import com.google.firebase.FirebaseApp;
import com.google.firebase.FirebaseOptions;
import com.google.firebase.cloud.FirestoreClient;

public class App {
    private FirebaseOptions option;
    private Firestore db; 
    private final static String PATH = "C:/키파일.json";
    private final static String COLLECTION_NAME = "컬렉션";

    public static void main( String[] args ) {
        App app = new App();
        try {
            app.init();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    private void init() throws Exception{
        FileInputStream refreshToken = new FileInputStream(PATH);
        option = new FirebaseOptions.Builder()
                .setCredentials(GoogleCredentials.fromStream(refreshToken))
                .setDatabaseUrl("https://데이터베이스주소.firebaseio.com")  //내 저장소 주소
                .build();
        FirebaseApp.initializeApp(option);
    }
}

 

샘플 코드와 동일한 모양의 소스코드입니다.

여기서 setDatabaseUrl메소드에 사용된 데이터베이스 주소는 파이어베이스 웹 콘솔에서 프로젝트 설정에서 가장 맨처음 나오는 화면의 내 앱을 클릭하면 볼 수 있습니다.

* 아래 사진처럼 앱을 선택하면 설정 내용을 볼 수 있습니다. 해당화면이 뭔지 모르면 연락주세요!

중간쯤에 databaseURL이라는 항목의 주소입니다.

 

다음으로 FireStore 객체를 만들어 줍니다. makeDatabaseConn이라는 이름의 메소드를 만들었습니다.

//..생략
public class App {
    //..생략
    private Firestore db; 
    private void makeDatabaseConn(){  //Firestore 인스턴스 생성
        db = FirestoreClient.getFirestore();
    }
}

 

파이어 베이스에서의 조회는 이벤트 리스너를 붙여서 동작합니다.

해당 이벤트 리스너는 매우 똑똑하게도 데이터베이스의 변동하는 행위에 대해서 바로바로 동작 합니다.

RXJS의 Observable 패턴과 같은 기능이..

간단하게 설명하면, 1번만 메소드를 호출하면 데이터가 등록, 수정, 삭제가 되는 경우 이벤트 리스너에 써 놓은 코드가 계속해서 동작한다는 것 입니다.

조회하는 메소드의 모습입니다.

//생략..

public class App {

    //생략..
    private void select(){
        db.collection(COLLECTION_NAME).addSnapshotListener( (target, exception)->{
            System.out.println(" - select start - ");
            target.forEach( item->{
                System.out.println("primary id : "+item.getId() + "  ||  value : " + item.getData());
            });
            System.out.println(" - select end - ");
        });
    }
    
}

 

다음으로 등록, 수정 및 삭제 하는 메소드 입니다.

private void insert(){
    Map<Object, Object> item = new HashMap<Object, Object>();
    item.put("name", "HELLO-WORLD5");
    item.put("numbers", 5674);
    item.put("booleans", false);
    db.collection(COLLECTION_NAME).add(item);
}

private void update(){
    Map<String, Object> update = new HashMap<String, Object>();
    update.put("name", "HELLO-WORLD9");
    update.put("numbers", 2341);
    update.put("booleans", false);    	
    db.collection(COLLECTION_NAME).document("문서 키 값").update(update);
}

private void delete(){
    db.collection(COLLECTION_NAME).document("문서 키 값").delete();
}

 

데이터를 위 내용처럼 Map형태로 넣을 수 있습니다.

Firestore 저장소의 기본 형태가 마치 몽고DB와 유사하므로 몽고DB를 다루어 본 분이라면 쉽게 사용 할 수 있습니다.

전체 코드의 모습 입니다.

import java.io.FileInputStream;
import java.util.HashMap;
import java.util.Map;

import com.google.auth.oauth2.GoogleCredentials;
import com.google.cloud.firestore.Firestore;
import com.google.firebase.FirebaseApp;
import com.google.firebase.FirebaseOptions;
import com.google.firebase.cloud.FirestoreClient;

public class App {
    private FirebaseOptions option;
    private Firestore db; 
    private final static String PATH = "C:/키파일.json";
    private final static String COLLECTION_NAME = "컬렉션";
    private Firestore db;    

    public static void main( String[] args ) {
        App app = new App();
        try {
            app.init();
            app.makeDatabaseConn();
            app.select();
            app.insert();
            app.update();
            app.delete();            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    private void init() throws Exception{
        FileInputStream refreshToken = new FileInputStream(PATH);
        option = new FirebaseOptions.Builder()
                .setCredentials(GoogleCredentials.fromStream(refreshToken))
                .setDatabaseUrl("https://데이터베이스주소.firebaseio.com")
                .build();
        FirebaseApp.initializeApp(option);
    }
    
    private void makeDatabaseConn(){  //Firestore 인스턴스 생성
        db = FirestoreClient.getFirestore();
    }    
    
    private void select(){ //조회
        db.collection(COLLECTION_NAME).addSnapshotListener( (target, exception)->{
            System.out.println(" - select start - ");
            target.forEach( item->{
                System.out.println("primary id : "+item.getId() + "  ||  value : " + item.getData());
            });
            System.out.println(" - select end - ");
        });
    }    
   
    private void insert(){  //등록
        Map<Object, Object> item = new HashMap<Object, Object>();
        item.put("name", "HELLO-WORLD5");
        item.put("numbers", 5674);
        item.put("booleans", false);
        db.collection(COLLECTION_NAME).add(item);
    }

    private void update(){  //수정
        Map<String, Object> update = new HashMap<String, Object>();
        update.put("name", "HELLO-WORLD9");
        update.put("numbers", 2341);
        update.put("booleans", false);    	
        db.collection(COLLECTION_NAME).document("문서 키 값").update(update);
    }

    private void delete(){  //삭제
        db.collection(COLLECTION_NAME).document("문서 키 값").delete();
    }    
}

 

실제로 소스코드를 동작시킨 모습입니다.

수정, 삭제할 도큐먼트의 키 값은 미리 적어놓고 실행하여 보았습니다.

출력행위가 4번이나 이루어 졌습니다.

 

위 코드에서 select 메소드가 1번만 실행되었는데 실제 출력은 4번이나 되었습니다.

첫번째 출력은 select 메소드를 호출하면서 실행 되었습니다.

두번째 출력은 컬렉션에 데이터가 등록(변화) 되었기 때문에 select 메소드를 통해 붙여놓은(addSnapshotListener) 행위가 다시 동작하였습니다.

세번째 출력은 컬렉션에 데이터가 수정(변화) 되었으므로, 마지막 출력은 컬렉션에 데이터가 삭제(변화) 되었으므로 동작하게 된 것 입니다.

select 메소드에 있는 addSnapshotListener메소드의 콜백행위가 이처럼 데이터의 변화에 따라서 스스로 동작하는 것을 반응형(Reactive) 프로그래밍이라고 합니다.

 

이상으로 자바에서 파이어베이스 연동 방법에 대해서 살펴보았습니다.

궁금하거나 어려운점 있으면 연락주세요! ^-^

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글