#9: 안드로이드 어플은 MySQL과 직접 통신할 수 없기 때문에 서버 사이드 스크립트 언어를 사용해 데이터를 가져와야 하는데 저는 개발 경험이 있는 PHP를 사용했습니다. 먼저 어플이 로그인 이라던지, 매치 등록 등 각 기능별로 필요한 PHP 페이지에 접속하여 데이터를 요청하게 되는데 이때 웹페이지에 접속하기 위해 HttpURLConnection 클래스를 사용하였으며, 데이터를 전달하는 방식은 POST방식을 사용하였습니다. 데이터를 받은 PHP는 DB로 쿼리를 전송해 데이터를 가져옵니다. 가져온 데이터는 json_encode() 함수를 통해 JSON 포맷으로 웹 페이지 상에 출력해주고, 어플은 이 값을 읽어와 JSONObject를 생성하여 각 액티비티가 갖고 있는 뷰에 맞게 데이터를 출력해줍니다.
#10: 안드로이드 어플에서 외부 DB와 통신하기 위한 또 하나의 제약사항이 바로 UI를 갖고 있는 main threa에서는 네트워크 작업이 불가능하다는 것 이었습니다.
그래서 별도의 쓰레드를 만들어서 네트워크 통신을 해야만 했었는데, 처음에는 위의 그림처럼 직접 별도의 쓰레드를 만들고 UI쓰레드에서 start 시킨 뒤, join 메서드를 사용해 웹페이지의 내용을 다 읽어올 때 까지 기다리는 방식으로 구현했습니다.
그런데 이 방식을 사용하게 되면 쓰레드가 네트워크로부터 데이터를 가져오는 동안 UI Thread가 block되는 문제점이 있었습니다.
#11: 처음에 구현했던 직접 Thread를 만들고 작업을 수행하는 HttpTask클래스입니다. 내부 클래스로 Runnable 인터페이스를 구현한 클래스를 가지고 있고, 객체 생성 후 getContents() 메소드를 호출하면 내부 쓰레드를 실행 시키고 값을 가져올 때 까지 대기하도록 했는데, 이 과정에서 UI Blocking이 발생하였스비다. thread의 작업이 모두 끝나면 읽어온 내용(_contents)를 리턴하게 됩니다.
#12: UI Blocking 문제를 해결하기 위해 방법을 찾던 중 안드로이드 API 에서 제공하는 AsyncTask 클래스를 알게 되었습니다. AsyncTask 의 callback 메소드들을 구현하면 쉽게 thread 작업을 처리 할 수 있었습니다. 특히 쓰레드 작업이 끝난 후 수행할 코드를 onPostExecute() 메서드에 작성 해 놓으면 쓰레드가 종료될 때 까지 기다리지 않고 종료된 순간 이벤트를 받아 처리하기 때문에 UI update 등 동기화 처리를 쉽게 할 수 있었습니다.
이런 식으로 네트워크 작업이 필요하면 각 액티비티마다 개별적으로 AsyncTask 클래스를 상속받아 구현함으로써 작업을 처리하였습니다. 그러다보니 모든 액티비티에 중복되는 코드가 점점 늘어나게 되었습니다.
#13: 그래서 어떻게 하면 중복을 조금이라도 줄일 수 있을까 생각하게 되었습니다. AsyncTask를 매번 구현하다보니 어떤 부분이 중복되는지 알 수 있었습니다. 각 액티비티마다 요구하는 데이터가 다르기 때문에 요청하는 페이지의 URL과 parameter는 액티비티별로 달랐습니다. 또한 각각의 UI를 갖고 있다보니 결과를 UI에 출력해주는 부분도 결국은 각 액티비티마다 작성해야 했습니다. 그리고 모든 액티비티에서 공통된 부분이 바로 웹페이지에 접속해서 결과를 읽어오는 부분이었습니다. 즉 AsyncTask의 doInBackground() 메소드가 중복되고 있었습니다. 그래서 doInBackgroud만 미리 구현해 놓고 각 액티비티 에서는 필요한 부분만 구현하여 사용할 수 있도록 클래스를 디자인 하였습니다.
#14: AsyncTask 클래스를 상속받아 HttpAsyncTask라는 추상 클래스를 만들었습니다. 기본적으로 모든 네트워크 통신에서 공통이 되는 doInBackground() 메소드를 구현해 놓았으며, onPostExecute() 메소드를 abstract로 선언하여 다른 액티비티에서 이 클래스를 상속받아 사용할 때 구현해야 하도록 했습니다.
생성자에서는 웹페이지의 URL과 필요한 Parameter를 받아서 인스턴스 변수에 저장하도록 했고, 추가로 컨텍스트와 메시지를 받는 생성자를 추가하여
네트워크 작업시 필요에 따라 다이얼로그를 출력해주는 기능을 추가하였습니다.
그리고 구현한 클래스를 다른 안드로이드 프로젝트에서 라이브러리로 사용할 수 있도록 jar파일로 만들어 두었습니다.