<실행 영상>
Github 링크 (소스 코드)
https://github.com/jooyeokkim/Covid19-Vaccination-Center-Android-App
프로젝트 소개
- 프로젝트 이름 : 코로나19 예방 접종 센터 조회 Android앱
- 프로젝트 내용 : 공공데이터포털에 있는 코로나19 예방 접종 센터의 이름과 주소 정보를 JSON으로 가져와서 ListView로 출력하고, 해당 요소(예방 접종 센터)를 누르면 위치가 마커로 표시된 구글맵 화면으로 이동하는 안드로이드 서비스
- 기술 스택 : Android, Java, REST API
- 사용 API : REST API, Naver Geocoding API, Google Map API
- 진행 인원 및 작업 기간 : 1인, 2021.12.02 ~ 2021.12.03
- 사용 프로그램 : Android Studio
- 버전 관리 툴 : Git
동작 및 구현 내용
1) ListView와 Title 문자열 배치
- 안드로이드 스튜디오에서는 레이아웃을 담당하는 xml파일을 Design모드와 Text모드로 다룰 수 있다.
- Design모드는 배치하고자 하는 여러 UI 요소들을 선택해서 드래그 앤 드롭 방식으로 원하는 위치에 배치할 수 있는 사용자 친화적인 모드이다.
- 컴포넌트의 ID를 부여하는 것도 Design모드에서 가능하므로 Text모드로 직접 코딩하지 않아도 괜찮다.
2) Open API 서버 연결 및 ListView에 JSON 파싱 데이터 추가
- 요청 URI는 URL 객체로 저장했고, openStream() 메소드로 스트림을 연다.
- 프로젝트가 인터넷에 접근할 수 있도록 매니페스트 파일에 android.permission.INTERNET이라는 uses-permission을 설정해주었다.
- JSON 상태의 데이터를 받기 위해 BufferedReader 객체와 InputStreamReader 객체를 이용했고, 한줄씩 데이터를 읽어들여 SpringBuffer에 저장해서 String 변수에 모았다.
- JSON을 다루는 라이브러리로 jackson-core, jackson-annotations, jackson-databind, org.json을 선택했으며, 이 String을 JSONObject로 변환해서 파싱을 진행했다.
- 파싱한 결과들은 ArrayList에 저장해서 ArrayAdapter에 적용시킬 수 있도록 했다. 특히, ArrayAdapter의 notifyDataSetChanged() 메소드가 핵심인데, Adapter에 저장된 List의 변화를 감지해서 화면에 출력된 ListView에 동적으로 추가해주는 역할을 한다.
- 이 공공데이터포털 데이터는 주소를 텍스트 형식으로만 제공했기 때문에, 해당 주소에 대한 좌표값을 얻기 위해서 Naver API의 Geocoding API를 이용해서 변환 받았다.
- JSON을 요청하고 파싱하는 과정은 Thread를 통해 진행했는데, 그 이유는 데이터를 가져오는 동안 프로그램이 멈춰있지 않게 하기 위함이다.
3) ListView Click 이벤트 처리
- ListView의 요소(예방접종센터)를 클릭했을 때, 위치가 마커로 표시된 구글맵 화면으로 이동하도록 했다.
- 화면 전환을 할 때 데이터를 넘기기 위해 Intent를 사용했고, 좌표와 주소를 Intent의 파라미터로 넣었다.
- Intent 파라미터들은 구글맵 Activity로 전달되어, 구글맵의 카메라를 전달 받은 좌표값으로 이동시켜서 마커를 찍을수 있다. 그리고, 마커의 위에 주소 텍스트를 표시해서 사용자는 마커에 대한 정보를 확인할 수 있다.
- 사용자의 클릭 이벤트를 감지할 수 있도록 ListView의 setOnItemClickListener 리스너를 추가했으며, 이 리스너는 ListView의 몇 번째 데이터를 클릭했는지에 대한 정보를 얻을 수 있기 때문에 JSON 데이터를 파싱했을 때 저장해둔 좌표와 주소값을 인덱스를 통해 쉽게 찾을 수 있었다.
4) ListView Scroll
- Scroll은 화면상에 있는 ListView 크기를 넘어 데이터가 축적되었을 때, 가려진 데이터들을 모두 확인할 수 있도록 하는 용도이다.
- ListView는 기본적으로 아래 방향으로 쌓이기 때문에 스크롤 방향을 vertical로 설정했고, 이 vertical 설정 역시 Design모드에서 지정할 수 있었다.
- 안드로이드 스튜디오의 Run으로 시뮬레이션을 돌려봤을 때, 가끔 ListView가 출력이 느리게 되는 경우가 있었다. 이 경우에는 ListView를 스크롤하면 데이터들이 잘 표시 된다. 그래서 ListView의 위에 빨간 문구로 리스트가 잘 뜨지 않는 경우 스크롤을 하라는 문구를 표시했다.
프로젝트를 마치며...
처음으로 이렇게 안드로이드 앱을 만드는 경험을 해보았는데, 버전에 의한 에러가 말썽인건 웹이나 앱이나 마찬가지인 것 같다. 프로젝트를 생성하자마자 빨간 밑줄이 떴는데 대부분 버전 때문에 발생한 에러들이었고, 버전을 맞추느라 시작부터 빡셌던 것같다.
그래도 Android Studio에서는 드래그앤드롭 방식으로 화면에 UI를 구성할 수 있는 Design모드를 지원해서 xml를 직접적으로 코딩할 필요가 없어서 편리했다.
이 프로젝트에서 사용한 api는 REST API, Naver Geocoding API, Google Map API이다. 다행히, API를 다뤄보고 블로그에 정리해본 경험이 있어서그런지 모두 어렵지 않게 사용할 수 있었다.
다만, 애를 먹었던 부분이 2가지가 있었다. 프로젝트에서 공공데이터포털 Open API로부터 데이터를 가져오기 위해서는 프로젝트가 인터넷에 접근할 수 있도록 하는 설정(andriod.permission.INTERNET)을 매니페스트 파일에 추가를 해줬어야 했는데, 이 사실도 모른채 혼자 고생하고 있다가 다행히 구글 검색을 통해 도움을 얻었다. 그리고 Open API를 통해 데이터를 가져올 때는 Thread를 이용해야 한다는 사실을 깨달았다. 데이터를 가져오는 동안 프로그램이 멈춰있지 않게 하기 위해 Thread를 이용하여 따로 처리해줘야 했던 것이다.
댓글