프로젝트 회고2023.04 - 2023.062인 팀 프로젝트

WeatherApp: 첫 Android 프로젝트를 다시 읽기

OpenWeatherMap API와 Android 위치 정보를 연결해 현재 날씨, 시간대별 예보, 5일 예보, 대기 오염 정보를 제공한 첫 번째 모바일 프로젝트입니다.

프로젝트 소개

GPS 기반 실시간 날씨, 예보, 대기질 정보를 한 화면에 정리한 Android 앱 원본 저장소의 README, Gradle 의존성, Java 소스 구조, Git 로그를 기준으로 첫 번째 포트폴리오 글을 구성했습니다. 완성 화면을 보여주는 데서 끝내지 않고, 어떤 기능을 어떤 순서로 붙여 갔는지 읽히도록 정리했습니다.

역할
Android 클라이언트 개발, API 연동, UI 구현
형태
2인 팀 프로젝트
상태
완료

Prototype

프로토타입

Android 프로젝트의 배경 이미지, 반투명 패널, 하단 탭 구조를 가져와 서울 좌표 기준 실제 OpenWeatherMap 데이터로 표시합니다.

--:--:--

위도37.566500

경도126.978000

--.-℃

현재 날씨는 확인중

미세먼지 농도: 확인중

날씨 정보를 불러오는 중입니다.

--

--.-℃

--

--.-℃

--

--.-℃

--

--.-℃

--

--.-℃

서울 날씨

구현한 기능

  • GPS 기반 현재 위치 날씨 조회
  • 현재 기온, 체감온도, 습도, 기압, 풍속, 일출과 일몰 정보 표시
  • 향후 24시간 시간대별 예보와 5일 일기예보 제공
  • 미세먼지 등급과 CO, O3, PM10, PM2.5 수치 표시
  • 비, 눈, 야간 상태에 따라 화면 효과와 배경을 전환
  • API 키를 AndroidManifest 메타데이터로 분리

사용 기술

기술 스택은 README와 `app/build.gradle`의 의존성을 기준으로 정리했습니다. Android Java 앱 위에 Retrofit2, Gson, OpenWeatherMap API, Glide, WeatherView를 조합했습니다.

Android

첫 모바일 프로젝트로 실제 Android Activity, 권한, 리소스 구조를 경험하기 위해 사용했습니다.

Java

당시 Android 수업/프로젝트 환경에 맞춰 기본 언어로 사용했습니다.

Retrofit2

OpenWeatherMap의 여러 REST API를 인터페이스 단위로 분리해 호출하기 위해 선택했습니다.

Gson

날씨, 예보, 대기질 응답 JSON을 Java 모델로 매핑하기 위해 사용했습니다.

OpenWeatherMap API

현재 날씨, 예보, 대기질 데이터를 한 서비스에서 받아올 수 있어 선택했습니다.

Glide

날씨 아이콘과 이미지 리소스를 화면에 안정적으로 표시하기 위해 사용했습니다.

WeatherView

비, 눈 같은 날씨 효과를 Android 화면에서 시각적으로 표현하기 위해 사용했습니다.

Material Components

탭과 버튼 등 기본 UI 요소를 Android 스타일에 맞춰 구성하기 위해 사용했습니다.

구조와 개선

초반에는 `MainActivity` 중심으로 기능이 모였지만, 후반 커밋으로 갈수록 API 호출과 화면 초기화 책임이 분리됩니다. 첫 프로젝트답게 투박한 흔적도 있지만, 그만큼 구조화의 필요성을 배운 기록이 남아 있습니다.

  • MainActivity: 위치 권한, GPS 좌표, 탭 기반 화면, 날씨 효과를 제어
  • LoadAllData: OpenWeatherMap API 호출과 응답 매핑을 담당하는 싱글톤 데이터 로더
  • requestApi: 현재 날씨, 예보, 대기질, 지오코딩 API 인터페이스와 응답 모델 분리
  • view: 메인 화면과 스크롤 예보 영역 초기화 로직 분리
  • drawable/anim 리소스: 배경 전환, 날씨 아이콘, 별똥별 애니메이션 등 시각 효과 관리

배운 점

  • 외부 API 응답을 화면 상태로 바꾸는 데이터 매핑 흐름을 처음부터 끝까지 경험했습니다.
  • 위치 권한, 에뮬레이터 좌표 문제, API 실패 상태처럼 모바일 환경의 예외 처리가 중요하다는 점을 배웠습니다.
  • 하나의 Activity에 몰리던 코드를 API와 View 초기화 클래스로 나누며 구조화의 필요성을 체감했습니다.
  • 시각 효과는 기능을 보조해야 하며, 날씨 앱에서는 정보 가독성이 가장 먼저라는 기준을 얻었습니다.