본문 바로가기
개발/Adroid

[android] firebase 를 이용한 채팅앱

by KEI NETWORK 2019. 10. 29.
728x90

안녕하세요. 오늘은 안드로이드 채팅앱을 만들어보려합니다.

말이 채팅앱이지 firebase 를 이용해서 만들면 정말 간단하게 구현할 수 있습니다.

구글 firebase는 정말 강력한 플랫폼인것 같습니다. 여러곳에서 사용되고 있는 FCM푸시 서비스도 그렇고

여러가지 강력한 서비스들을 무료로 사용할 수 있습니다. 이번에는 firebase 실시간 데이터베이스를 이용하여

앱을 만들어 보겠습니다.

 

우선은 firebase 프로젝트를 생성해야 합니다. 기존에 FCM 등에서 만들어둔 프로젝트에 추가하셔도 되구요.

이부분은 설명하지 않겠습니다. 

 

1.추가된 프로젝트의 google-service.json 파일을 다운로드 받고 파일은 프로젝트/app 경로에 넣어주시면 됩니다. 다음은 라이브러리들을 추가해줍니다.

 

2.app 경로의 build.gradle 파일을 수정해줍시다.

 

1

2

3

4

5

6

7

8

9

...

dependencies {

    implementation 'com.google.firebase:firebase-core:16+'

    implementation 'com.google.firebase:firebase-database:16+'

    ...

 

}

 

 

Colored by Color Scripter

cs

 

 

//맨밑 하단부에 구글서비스 플러그인도 추가해줍니다.

 

1

apply plugin: 'com.google.gms.google-services'

cs

 

 

프로젝트 경로의 build.gradle 파일 역시 수정해 줍니다.

1

2

3

4

5

6

7

 

dependencies {

    ...

    classpath 'com.google.gms:google-services:4.0.1'

    ...

 

}

Colored by Color Scripter

cs

 

 

3. AndroidManifest.xml 에서 인터넷 권한을 추가해줍니다.

 

1

<uses-permission android:name="android.permission.INTERNET" />

cs

 

 

4. 구글 콘솔의 ruleset 을 설정해 줍니다.

 

firebase console -> 프로젝트 진입 -> Database메뉴 -> 실시간데이터베이스 -> 규칙탭 으로 이동합니다.

그리고 아래와 같이 설정합니다.

 

1

2

3

4

5

6

7

8

{

 

  /* Visit https://firebase.google.com/docs/database/security to learn more about security rules. */

  "rules": {

    ".read"true,

    ".write"true

  }

}

Colored by Color Scripter

cs

 

 

5. 소스코드 작성

 

설정은 끝났고 이제 소스코드를 작성하면 됩니다.

최대한 단순하게 구현해보았습니다. 1:1 대화 상황을 가정하여 

화면에는 텍스트뷰와 버튼밖에 없습니다.

우선 메세지를 담아서 사용할 DTO 객체를 하나 만들어 줍니다.

 

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

public class ChatMessageDTO {

 

    private String userName;

    private String message;

 

    public ChatMessageDTO() { }

 

    public ChatMessageDTO(String userName, String message) {

        this.userName = userName;

        this.message = message;

    }

 

    public String getUserName() {

        return userName;

    }

 

    public void setUserName(String userName) {

        this.userName = userName;

    }

 

    public String getMessage() {

        return message;

    }

 

    public void setMessage(String message) {

        this.message = message;

    }

}

Colored by Color Scripter

cs

 

 

 

그리고 화면단의 구현입니다.

정말이지 간단하게 구현이 가능합니다. (예전에 복잡한 소켓통신을 이용해서 구현했던게 생각나네요...)

 

 firebaseDatabase = FirebaseDatabase.getInstance();

 databaseReference = firebaseDatabase.getReference();

 

구글 데이터베이스객체를 참조하고 

보낼때는 이렇게...

 

ChatMessageDTO chatData = new ChatMessageDTO("사용자A", msgText.getText().toString());  // 유저 이름과 메세지로 chatData 만들기

databaseReference.child("message").push().setValue(chatData);  // 기본 database 하위 message라는 child에 chatData를 list로 만들기

 

받을때는 

 

ChildEventListener 를 구현해서 콜백받습니다.

https://firebase.google.com/docs/reference/android/com/google/firebase/database/ChildEventListener

 

실시간 데이터베이스 이므로 firebase 상의 데이터를 감지하여 변경사항이 있다면 자동으로 콜백이 들어옵니다.

정말 신기하지 않습니까?~ 

 

예제 소스는 이쪽으로

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

public class MainActivity extends AppCompatActivity {

 

    private TextView personTextA = null;

    private TextView personTextB = null;

    private EditText msgText = null;

    private Button sendBtn = null;

    private FirebaseDatabase firebaseDatabase = null;

    private DatabaseReference databaseReference = null;

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

 

        firebaseDatabase = FirebaseDatabase.getInstance();

        databaseReference = firebaseDatabase.getReference();

        personTextA = findViewById(R.id.chat_texta); //나

        personTextB = findViewById(R.id.chat_textb); //상대

 

        msgText = findViewById(R.id.chatMsgText);

        sendBtn = findViewById(R.id.msgSendBtn);

        sendBtn.setOnClickListener(new View.OnClickListener(){

 

            @Override

            public void onClick(View view) {

                ChatMessageDTO chatData = new ChatMessageDTO("사용자A", msgText.getText().toString());  // 유저 이름과 메세지로 chatData 만들기

                databaseReference.child("message").push().setValue(chatData);  // 기본 database 하위 message라는 child에 chatData를 list로 만들

 

                Log.i("CHAT-TAG", msgText.getText().toString());

 

                personTextA.setText(msgText.getText().toString());

                msgText.setText("");

            }

        });

 

        databaseReference.child("message").addChildEventListener(new ChildEventListener() {

            // message는 child의 이벤트를 수신합니다.

            @Override

            public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                ChatMessageDTO chatData = dataSnapshot.getValue(ChatMessageDTO.class);  // chatData를 가져오고

                personTextB.setText(chatData.getMessage()); //상대메세지

 

                Log.i("CHAT-TAG",chatData.getMessage());

 

            }

 

            @Override

            public void onChildChanged(DataSnapshot dataSnapshot, String s) {

 

            }

 

            @Override

            public void onChildRemoved(DataSnapshot dataSnapshot) {

 

            }

 

            @Override

            public void onChildMoved(DataSnapshot dataSnapshot, String s) {

 

            }

 

            @Override

            public void onCancelled(DatabaseError databaseError) {

 

            }

        });

    }

}

Colored by Color Scripter

cs

 

 

 

 

참조

 https://corikachu.github.io/articles/android/firebase/android-firebase-realtime-chatting-app



출처: https://www.blueswt.com/77 [꿈꾸는열정기록보관소]

728x90

댓글