본문 바로가기

개발 코딩 정보 공유/안드로이드 자바 코틀린

firebase 를 이용한 안드로이드 채팅앱

 

 

 

 

 

안드로이드 채팅앱 (firebase 를 사용한)

 

 

 

 

 

 

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

말이 채팅앱이지 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+'
    ...
 
}
 
 
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'
    ...
 
}
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
  }
}
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;
    }
}
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) {
 
            }
        });
    }
}
cs

 

 

 

 

참조

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