마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

RecyclerView 실시간 갱신 관련 질문입니다.

0 추천

선배님들 안녕하세요 
이번에는 리사이클러뷰의 실시간 갱신을 어떻게 구현하는지에 대한 질문입니다.

우선 제가 원하는 부분은 
사용자가 특정한 정보를 담고 있는 리사이클러뷰로 구현된 화면을 계속 켜놓고 있을 때에
뒷딴에서 데이터베이스에 새로운 정보가 등록되면 서버가 이를 감지해서 사용자가 보고 있는 리사이클러뷰
에 화면을 갱신 시키고 싶은 부분인데요

데이터베이스 <- 서버가 데이터 새로 등록된걸 json 형태로 앱에 전달(?) -> 앱의 리사이클러 뷰의 화면이 신규로 추가된 데이터 갱신

마치 채팅같은?(채팅은 아니지만...) 같이 비슷한 개념으로 구현을 해보고 싶어요
찾아보니 Firebase를 이용하면 push 개념을 구현할 수 있다고 검색이 되는데요

Firebase를 꼭 써야 하는건지 궁금하구요 ? ( <- 사실 이걸 쓴다기 보다 저는 제가 만든 서버와 직접 통신하게 하고 싶습니다.)
제가 만든 (자바나 코틀린 서버) 서버에서 json 형태로 앱의 리사이클러뷰를 자동으로 
갱신을 시킬수 있는건지 궁금합니다.

안드로이드 앱 기본적인 구현들은 유툽이나 구글에 넘쳐 나는데 위와 같은 경우는 잘 검색이 안되네요 ㅠ


 

우라말라깽이 (250 포인트) 님이 2020년 12월 20일 질문

2개의 답변

0 추천
기본적으로 Web은 요청에 따른 답변을 하는 구조로 되어 있습니다.
채팅이나, Always Connected(또는 On)으로 연결된 Home Trading System은 클라이언트와 서버가 항상 연결되어 있죠.

클라이언트와 서버가 항상 연결되어 있는 경우엔, 여러가지 문제가 있습니다.

- 동시 접속유저가 몇천명 이내로 제한이 됩니다.
보통 웹서버 한대가 몇만에서 몇십만 유저를 커버합니다.
사실 유저가 매 초 요청을 하진 않기 때문입니다.
근데 접속을 해 놓으면 Ping을 하기 위해서라도 통신이 많아지고,
커넥션을 유지하는 네트워크상의 코스트도 높습니다.

- 접속된 상태에서 데이터를 주고 받기 위해서는 별도의 프로토콜이 추가로 필요할 수 있습니다.
 별도의 프로토콜을 구현하면 성능이 오히려 떨어지는 경우도 많습니다.

- 유저의 패킷 요금이 추가로 발생하는 문제도 있습니다. 무제한 요금제를 사용하지 않는다면 부담스럽겠죠.

그래서 보통 앱에서는 사람이 풀다운 리프레쉬 동작을 해서 데이터를 추가로 받아오게 합니다.
푸쉬로 해결할 수도 있고요. 푸쉬가 구현하기 더 쉬울 것 같네요.

사람들이 이미 앱들을 사용하면서 사용패턴에 익숙해져 있습니다.
굳이 그런 기능을 넣어야 하느냐는 앱마다 다르겠지만,
일반적인 리스트를 보여주는 화면에서 그럴 필요가지는 없다고 봅니다.
굳이 필요하다면, 1분 뒤에 한번씩 서버에 갔다온다던지 할 수 있죠.

그러나 유저가 우연히 어떤 버튼을 터치하는 순간,
백그라운드에서 타이머나, 소켓이 연결되어서 리프레쉬가 된다면,
유저가 엉뚱한 놈을 누르게 될 수도 있고,
안드로이드 내의 process 순서가 꼬일 수도 있습니다.

그런 예외적인 상황이 발생하기 때문에 앱은 수동적이면서도
유저가 이미 다른 앱에서 학습하여 예상할 수 있는 동작방식으로 구동되는게 바람직해 보입니다.
Will Kim (43,170 포인트) 님이 2020년 12월 20일 답변
0 추천
님의 경우는 캐쉬에 대한 아키텍쳐가 필수적입니다. 예를 들면 로컬에 데이터베이스를 두고 여기에 데이터가 존재할 경우 바로 View로 데이터를 리턴하고 님의 요구사항에 따라 네트워크 호출을 할 것인지 결정하여(에를 들면, 데이터가 5분 이전 거면 무조건 네트워크 호출을 한다던가 하는 규칙에 따라), 네트워크 호출을 한 다음 이걸 로걸 데잍터베이스에 저장하고, 로컬 데이터베이스를 읽어 뷰쪽으로 보냅니다. 꼭 님의 앱뿐만 아니라 좋은 User experience를 제공하려면 이런 아키텍쳐는 요즘의 거의 필수적이라고 할 수 있습니다. 이렇게 구현하는 거는 프로젝트마다 다를 수 있고 당연히 복잡하긴 합니다.

그리고, RecyclerView를 핸들링하시는 부분은 안드로이드에 DiffUtil이라는 클래스가 있습니다. 이걸 반드시 사용하셔야 할 것 같네요. ListAdapter라는 클래스를 보시면 이미 DiffUtil을 통합해서 구현되어 있으니 이걸 사용하셔도 되구요. DiffUtil을 사용하면, 변경된 아이템에 대해서만 갱신을 해주도록 구현되어 있습니다.

그리고 자동갱신이란 기능은 안드로이드에서는 아직 없구요, 데이터바인 등을 쓰거나 하시면 RecyclerView를 갱신하는 부분의 코드는 줄 일 수 있긴 하겠지만, 변경된 부분에 대해서는 님이 RecyclerView를 갱신하도록 해주어야 합니다.

그리고 서버의 데이터를 실시간으로 받으려면 파이어베이스 같이 실시간으로 데이터를 푸쉬해줄 수 있는 인프라가 구축되어 있어야 합니다.  아니면 서버에서 GraphQL같은  푸쉬기능이 내장되어 있는 기술을 사용하셔야 겠죠. 그렇지 않으면 소켙을 직접 구현하실 수 있으면 그렇게 하셔도 되겠네요.
spark (227,510 포인트) 님이 2020년 12월 21일 답변
...