기록

AndroidStudio/kotlin/callback 패턴의 적용 본문

Moblie/Android

AndroidStudio/kotlin/callback 패턴의 적용

youngyin 2022. 6. 21. 06:00

개요

다른 블로그의 포스팅 중 콜백과 관련된 포스팅은 자바스크립트를 이용한 예제와 프로미스를 활용하는 개선 방법 등을 담고 있는 포스팅이 많다. 안드로이드에서는 어떻게 콜백을 이용할 수 있을까 궁금해져서, 프로젝트에 적용해보고 글로 정리해 두려고 한다.

프로젝트가 어느 정도 틀이 잡히면 기능별 모듈화를 시도한다. 프로젝트 중 데이터를 송수신하는 코드들을 모아 network 모듈로 구성하려는 시도가 있었다. 클래스간 서로 참조하지 않도록 결합도를 낮추어야 했고, 여기에 callback을 이용했다.

해당 프로젝트의 정보 : db(firebase), front(android)

순서

1) RequestListener.kt 만들기

2) GetRequest.kt 만들기

3) Activity에서 호출

예제

1) RequestListener.kt 만들기

listener는 interface로도 만들 수 있지만, 위 예제에서는 onRequestSuccess(data: Object) 만 호출을 강제하고 싶어서 추상클래스로 선언했다.

2) GetRequest.kt 만들기

사용자의 정보를 가져오는 request를 클래스로 만들었다. 리스너를 설정하는 함수를 외부에서 접근할 수 있도록 만든다.

3) Activity에서 호출

데이터를 사용할 화면에서, 리스너를 설정해주면 데이터를 송/수신 한 뒤에 설정해 준 동작이 실행된다.

4) 결과

데이터가 요청한 뒤에 Log가 찍히는 것을 확인 할 수 있다. 

결론

callback

예제를 보고 정의를 다시 읽어보면, 다른 코드의 인수로서 넘겨주는 실행가능한 코드(인터페이스 or 추상 클래스)의 의미가  더 와닿는다. 이런 구조는 리사이클러뷰의 클릭 이벤트 전달, frgament에서 activity의 함수를 사용할 때 등에서 많이 사용된다. 

중첩 callback

특히, callback 안에 callback을 중첩해서 사용하는 경우, callback지옥이라 불릴 만큼 복잡하고 어려운 구조가 만들어 질 수 있으므로 주의해야 한다. 억지로 콜백을 중첩해 보자면, 아래와 같이도 사용할 수는 있다. jetpack에서 제공하는 liveData 를 활용하면 데이터의 변화를 감지할 수 있고, thread, 코루틴 둘다 join() 함수를 통해 실행 순서를 제어할 수 있다(2022/06 기준) 는 것을 생각하면, 비동기 처리 방법에는 callback 이외에도 아양한 방법이 있다는 생각이 들었다.

Comments