본문 바로가기

안드로이드 개발/View

오픈소스 라이브러리의 양면성

반응형

요즘 안드로이드 뷰 관련 오픈소스들이 다양하게 많아 졌다. 그 중 Android-PullToRefresh가 가장 흔히 사용되는 뷰중 하나일것이다. 오픈소스를 사용하는 목적을 생각해보면 서비스의 해당기능을 쉽게 쓸수 있다는 것과 어느정도 검증이 끝나서 약간의 안정성이 있다. 하지만 여기에 함정이 있다. 오픈소스는 완벽한 안정성을 제공하지 않고, 점점 안정화되고 있는 과정이며, 내부에 어떤일들을 하고 있는지 인지 하고 있지 못한 상태에서 사용하다가 문제가 생길경우 문제를 찾기가 대단히 어려울 가능성이 있다. 즉, 사용하기 편하고 안정성이 있다고 해도 그만큼 양면성의 문제점이 있다. 


얼마전 Android-PullToRefresh 뷰를 사용하다가 문제점을 발견했다. Android-PullToRefresh로 리스트뷰 새로고침 기능을 만드는데, 사용자가 직접 행위 하지 않고 코드를 통해 Refresh View를 보여주게 하는 setRefreashing() 메소드를 제공하고 있다. 


일반적 구조는 사용자가 직접 뷰를 내려 Refreash하거나 setRefreashing() 메소드를 호출하게 되면 onRefreash() Listener가 호출되게 되며 여기서 데이터를 새로 불러오는 작업후 onRefreashComplet() 메소드 호출을 통해 새로고침 View를 Hide할 수 있다. 


내부 구조를 보면 ListView의 adapter의 상태에 따라 onRefreash() Listener의 호출을 체크 하는 부분이 있다. 이 부분을 보면 adapter가 null이거나 empty일 결우 return하게 된다. 즉, onRefreash() Listener가 호출 되지 않는다는 것이다. 


PullToRefreshListView.java 

@Override
protected void onRefreshing(final boolean doScroll) {
	/**
	 * If we're not showing the Refreshing view, or the list is empty, the
	 * the header/footer views won't show so we use the normal method.
	 */
	ListAdapter adapter = mRefreshableView.getAdapter();
	if (!mListViewExtrasEnabled || !getShowViewWhileRefreshing() || null == adapter || adapter.isEmpty()) {
		super.onRefreshing(doScroll);
		return;
	}

	super.onRefreshing(false);

       //....이하 생략
}


즉, setRefreashing()하기전 ListView의 adapter의 데이터는 있어야 onRefreash() Listener가 호출 된다. adapter에 데이터가 없다면 onRefreash() Listener가 호출 되지 않아 문제가 생긴다. 예를 들어 Activity onCreate에서 데이터를 네크워크를 통해가져 올때 Refreashing 중으로 View를 보이게 하고 싶을때 문제가 발생 된다. 데이터를 불러오기 전(adapter가 비어있는 상황)에 setRefreashing()를 호출 할 것이기 때문이다. 


Android-PullToRefresh Sample에도 이런 설명은 없다. Sample을 보면 항상 adapter에 dummy데이터를 넣고 시작 하기 때문이 이런 문제점을 발견하기 힘들다. 그렇다면 오픈소스를 사용할때 이런 문제점을 발견 할 수 없을까? 


오픈소스를 Copy&Paste로 눈에 보이는 결과물에 대해서 유혹당하지 말자. 

Sample코드로 테스트해보되 내부 Library를 하나씩 따라가보면서 구조를 분석 하자. 

시간이 된다면 직접 오픈소스를 개발해보는 경험을 해보자.



오슨소스는 완벽한 라이브러리가 아닌 만들어가는 과정이기에 언제 어떤 문제가 발생 될지 모른다. Copy&Paste에만 급급 한다면 언젠가는 편했던 시간들에 대한 보상을 해야 하는 날이 올 것이다. 이 글을 보는 모든 개발자들도 이런 오픈소스의 양면성에 대해 주의했으면 좋겠다. 



반응형