본문 바로가기

Dev/안드로이드

[안드로이드 짤막공부] 23.07.21

1. 강의 중에서, 내가 선택한 유저가 나를 좋아요 했는지 알아보기 위한 로직을 작성하는 부분이 있었다. firebase를 이용하기 위해 ValueEventListener 내의 onDataChange()를 오버라이드 하는 내용이었는데 처음에 강사 분은 이렇게 작성하셨다.

val postListener = object : ValueEventListener {
    override fun onDataChange(dataSnapshot: DataSnapshot) {
        
        for (dataModel in dataSnapshot.children) {

            val likeUserKey = dataModel.key.toString()
            if(likeUserKey.equals(uid)) {
                Toast.makeText(this@MyLikeListActivity, "매칭이 되었습니다.", Toast.LENGTH_LONG).show()
            } else {
                Toast.makeText(this@MyLikeListActivity, "매칭이 되지 않았습니다.", Toast.LENGTH_LONG).show()
            }
            
        }

    }

이렇게 작성하자 좋아요 기록이 없는 상대에 대해 Toast 메시지가 뜨지 않는 버그가 있었고, 강사 분은 다음과 같이 디버깅했다.

val postListener = object : ValueEventListener {
    override fun onDataChange(dataSnapshot: DataSnapshot) {

        if(dataSnapshot.children.count() == 0) {

            Toast.makeText(this@MyLikeListActivity, "매칭이 되지 않았습니다.", Toast.LENGTH_LONG).show()

        } else {

            for (dataModel in dataSnapshot.children) {

                val likeUserKey = dataModel.key.toString()
                if(likeUserKey.equals(uid)) {
                    Toast.makeText(this@MyLikeListActivity, "매칭이 되었습니다.", Toast.LENGTH_LONG).show()
                } else {
                    Toast.makeText(this@MyLikeListActivity, "매칭이 되지 않았습니다.", Toast.LENGTH_LONG).show()
                }

            }

        }

    }

나도 이 이전에 미리 혼자 디버깅을 해보았는데, 나와는 접근 방식이 좀 다른 것 같았다.

저런 식으로 처리하게 되면, for 루프를 도는 내내 uid와 likeUserKey의 비교가 일어나고 올바르지 않은 Toast 메시지가 계속 작성될 것 같다.

 

val postListener = object : ValueEventListener {
    override fun onDataChange(dataSnapshot: DataSnapshot) {
        var check = false
        for (dataModel in dataSnapshot.children){
            val likeUserKey = dataModel.key.toString()

            if(likeUserKey.equals(myUid)){
                Toast.makeText(this@MyLikeListActivity, "매칭이 되었습니다.", Toast.LENGTH_SHORT).show()
                check = true
                break
            }
        }
        if(!check){
            Toast.makeText(this@MyLikeListActivity, "매칭이 되지 않았습니다.", Toast.LENGTH_SHORT).show()
        }
    }

나는 위와 같이 작성했다. 플래그를 이용하는 고전적인 해결 방법인데, 아무래도 이렇게 해야 for 루프 내내 myUid와 일치하는 값을 찾기 전까지 매칭이 되지 않았다는 Toast 메시지가 뜨는 등의 버그가 없을 거 같다.

 

 

2. 생각보다 FCM을 이용한 메시지가 도달하는 시간이 많이 느리다. 특히 기기 실행 후 처음 받는 메시지에 대한 지연시간이 꽤나 길다. 어떤 임의의 핸드셰이킹 과정이 있거나 디바이스가 푸쉬를 받을 수 있는 상태인지 확인하는 텀이 긴 것 같다.

파이어베이스가 편의성을 정말 많이 제공해주는 도구이긴 하지만, 결국에는 서버가 완전히 입맛대로 동작하게 하려면 직접 짜는 방법 밖에 없나 보다.

나중에 혼자 프로젝트를 할 때 여유가 되면 django나 php로 간단한 서버를 직접 짜서 돌려볼까싶다. 아니면 지금부터 스프링을 좀 병행해야 하나..