WeatherApp첫 Android 프로젝트를 다시 읽기
OpenWeatherMap API를 연결한 첫 Android 날씨 앱. 현재 날씨, 시간대별 예보, 5일 예보, 대기질 정보를 한 화면에 정리했습니다.
프로젝트 소개
GPS 기반 실시간 날씨, 예보, 대기질 정보를 한 화면에 정리한 Android 앱 현재 날씨, 시간대별 예보, 5일 예보, 대기질 정보를 한 화면에서 확인할 수 있도록 구성한 첫 모바일 프로젝트입니다. 위치 권한, 외부 API 응답, 날씨별 시각 효과를 직접 연결하며 Android 앱의 기본 흐름을 익혔습니다.
- 역할
- Android 클라이언트 개발, API 연동, UI 구현
- 형태
- 2인 팀 프로젝트
- 상태
- 완료
Prototype
프로토타입
Android 프로젝트의 배경 이미지, 반투명 패널, 하단 탭 구조를 가져와 서울 좌표 기준 실제 OpenWeatherMap 데이터로 표시합니다.
--:--:--
위도37.566500
경도126.978000
--.-℃
현재 날씨는 확인중
미세먼지 농도: 확인중
날씨 정보를 불러오는 중입니다.
서울 날씨
구현한 기능
- GPS 기반 현재 위치 날씨 조회
- 현재 기온, 체감온도, 습도, 기압, 풍속, 일출과 일몰 정보 표시
- 향후 24시간 시간대별 예보와 5일 일기예보 제공
- 미세먼지 등급과 CO, O3, PM10, PM2.5 수치 표시
- 비, 눈, 야간 상태에 따라 화면 효과와 배경을 전환
- API 키를 AndroidManifest 메타데이터로 분리
사용 기술
Android Java 앱 위에 Retrofit2, Gson, OpenWeatherMap API, Glide, WeatherView를 조합했습니다.
모바일 앱
언어
Java
당시 Android 수업/프로젝트 환경에 맞춰 기본 언어로 사용했습니다.
프레임워크/라이브러리
Android
첫 모바일 프로젝트로 실제 Android Activity, 권한, 리소스 구조를 경험하기 위해 사용했습니다.
Retrofit2
OpenWeatherMap의 여러 REST API를 인터페이스 단위로 분리해 호출하기 위해 선택했습니다.
Gson
날씨, 예보, 대기질 응답 JSON을 Java 모델로 매핑하기 위해 사용했습니다.
Glide
날씨 아이콘과 이미지 리소스를 화면에 안정적으로 표시하기 위해 사용했습니다.
WeatherView
비, 눈 같은 날씨 효과를 Android 화면에서 시각적으로 표현하기 위해 사용했습니다.
Material Components
탭과 버튼 등 기본 UI 요소를 Android 스타일에 맞춰 구성하기 위해 사용했습니다.
외부 API
데이터 연동
OpenWeatherMap API
현재 날씨, 예보, 대기질 데이터를 한 서비스에서 받아올 수 있어 선택했습니다.
구조와 개선
초반에는 `MainActivity` 중심으로 기능이 모였지만, 후반 커밋으로 갈수록 API 호출과 화면 초기화 책임이 분리됩니다. 첫 프로젝트답게 투박한 흔적도 있지만, 그만큼 구조화의 필요성을 배운 기록이 남아 있습니다.
- MainActivity: 위치 권한, GPS 좌표, 탭 기반 화면, 날씨 효과를 제어
- LoadAllData: OpenWeatherMap API 호출과 응답 매핑을 담당하는 싱글톤 데이터 로더
- requestApi: 현재 날씨, 예보, 대기질, 지오코딩 API 인터페이스와 응답 모델 분리
- view: 메인 화면과 스크롤 예보 영역 초기화 로직 분리
- drawable/anim 리소스: 배경 전환, 날씨 아이콘, 별똥별 애니메이션 등 시각 효과 관리
성과와 회고
- 초기에는 MainActivity에 위치 권한, API 호출, 화면 갱신이 몰려 있었고 수정할 때마다 영향 범위가 커졌습니다. 후반에는 LoadAllData와 view 초기화 클래스로 책임을 나눠 현재 날씨, 예보, 대기질 호출 흐름을 분리했습니다.
- OpenWeatherMap의 현재 날씨, 예보, 대기질, 지오코딩 API를 각각 호출하면서 응답 모델을 분리했습니다. 화면에서는 기온, 미세먼지, 예보 아이콘처럼 필요한 값만 매핑해 API 응답 구조가 UI에 직접 새지 않게 했습니다.
- 매시 정각 갱신과 호출 빈도 제한을 넣어 외부 API 사용량을 의식했습니다. 첫 프로젝트였지만 API를 화면에 붙이는 것보다 언제 다시 호출할지 정하는 일이 더 중요하다는 걸 배웠습니다.
- 날씨 효과와 배경 전환은 정보보다 앞서면 안 됐습니다. 비/눈/야간 효과를 넣되 현재 날씨와 시간대별 예보가 먼저 읽히도록 화면 우선순위를 조정했습니다.
