들어가며
이번 포스팅의 목적은 12/30일부터 시작한 겨울방학 UMC 앱 런칭 프로젝트를 위한
안드로이드 개발 템플릿을 학습하고, 협업 개발에 참여할 수 있는 역량을 지니기 위한 학습 정리 포스팅이다.
# 사담
학기 중에 안드로이드 개발 스터디를 후반부부터 내용이 많아지고, 어려워져서 제대로 학습해놓지 못했다.
그래서, 책임감있는 개발자로 도약하기 위해, 1/3일부터 안드 개발 공부를 시작했다.
(여름방학 때보다 초심이 많이 잃은 느낌이긴하다... 여름방학 때는 팀 프로젝트에서 민폐가 되지 않도록 종강하자마자
프로젝트 이전까지 백엔드 공부를 했는데,,, 이번에는.. 좀 느리게 시작한 감이다..
다시 초심 잡고, 열심히하자.)
참고로, 이번 1월 초반부는 안드 개발 감을 익히는 단계로 이전에 못했던 API 연동과 같은 것을 수행해보면서 함께 앱 뷰 구현까지 해볼 예정이다.
안드로이드 MVP 개발 템플릿 사용 목적
UMC 학기 중 스터디를 할 때 실습 코드는 개발 템플릿을 사용하지 않고, 하나의 액티비티에서
네트워크 통신도 하고, 화면도 갱신하고, 쓰레드도 돌렸다.
정리해서, 하나의 액티비티에 여러 기능들을 구현하였다.
그리고, 한 기능에서 문제가 생겼을 때 모든 코드(기능)들이 복잡하게 얽혀있기 때문에 문제가 발생한 것을 해결하기가
어렵다.
따라서, 이제부터 개발 템플릿을 사용하여 네트워크와 화면을 갱신하는 부분을 나누어 개발을 진행한다.
이렇게 함으로써, 여러 기능들을 하나의 액티비티에 구현된 것을 여러 액티비티로 구현하게 되고,
특정 기능에 문제가 생기면 문제가 발생한 액티비티만을 보면서 디버깅을 할 수 있다.
(개발을 구조적으로 체계적인 개발환경을 제공한다.)
MVP 아키텍처 기반 개발 템플릿
#) 템플릿 구성
개발 템플릿은 크게
config, src, util 폴더로 구성되어져 있다.
개발 템플릿 구성
config : 근간이 되는 코드들
src : config의 코드들을 기반으로 구현되는 코드들 (Activity, Fragment)을 담아두는 폴더
util : 도구처럼 사용되는 코드들을 담아두는 폴더
src 내부 구성
src 폴더 내부는 또 폴더로 구성되어있다.
이 폴더들은 도메인별로 폴더를 나눴다.
도메인은 한 화면을 나타낸다.
정리해서, src폴더에는 한 화면 별로 폴더를 나눠서 구성한다.
(src 내부의 하나의 폴더가 앱의 한 화면)
#) Config 폴더 구성 이해
앱이 동적으로 작동하기 위한 준비과정에 속하는 코드들을 작성하는 폴더이다.
하나씩 살펴보면서 Confing 폴더에 대해서 이해를 해보자.
- Application 클래스
Application 클래스는 매니페스트에서 <application> 태드 안에 지정되며, 앱이 실행될 때 처음으로 실행되는 부분이다.
Application 클래스는 config 폴더안에 구성된다.
애플리케이션 클래스는 맨 처음에 실행되기에 각종 전역변수와 앱이 실행될 동안 한번만
유지되면 되는 객체들을 생성하는 코드이다. (앱 전역변수 초기화 담당 클래스)
정리해서, 애플리케이션 클래스는 싱글톤 객체라고 불리며, 실행동안 한 번만 만들어서 유지되는 객체 역할을 담당한다
전역변수를 추가하거나, 앱이 최초로 실행될 때 무엇인가를 해야한다면 여기에 코드를 추가해주면 된다. - Application 클래스 구성
SharedPreferences
레트로핏 객체
API 요청을 보내는 객체를 Application 클래스에 구성해두고,
전역 변수로써, 모든 액티비티에서 해당 레트로핏을 사용하여 요청을 보낸다.
(레트로핏 객체에서 요청을 보낼 때, Log를 찍어서 요청정보를 확인한다.
이는, API 요청 실패 시 실패 원인을 찾을 수 있다.
요청 값 에러인지,
응답 값 에러 인지 등등) - BaseActivity & BaseFragment 클래스
개발을 하다보면, 계속 작성해야되는 코드들인 "토스트 메세지" 띄우기와 같은 중복 작업을 요구하는 것들을
베이스 액티비티에 구현해두고, 상속받아 액티비티, 프래그멘트에서 쓰기 편하게 (개발할 때 편하게 하려고)구현해둔 클래스이다.
실 사용 예제는, 이론편 학습이 끝난 뒤 정리할 것이다. - BaseResponse 클래스
앱에서 API 요청을 하고 응답을 받을 때, isSuccess에 대한 메세지를 계속작성해준다.
즉, 중복작성이 발생한다.
그래서, isSuccess에 대한 정보를 저장해둬서
API 요청을 한 후 응답을 받을 때, BaseResponse 객체에 저장된 isSucceess 정보를 이용해 쉽게 응답 객체를 만들게 해준다.
정리해서, 앱에서 API 요청을 보낸 뒤 그에 따른 응답 데이터를 src의 모델의 응답 객체에 저장한다.
응답 데이터는 요청한 사항에 따라서 다른 응답 값이 제공되지만, isSuccess 정보는 API 요청 성공 혹은 실패이기에, 모든 응답 객체에서 중복으로 사용된다. 중복된 정보인 API 요청 성공 유무에 대한 정보를 기록해둔 클래스로 응답 객체를 만들기 쉽게하기 위해 구성된 클래스이다. [모델의 응답 클래스에선, BaseResponse를 상속받아서, 중복되는 API 요청 성공 유무 값을 저장한다.]
(직접 사용해보면서, 해당 클래스가 어떤 역할을 담당하는지 이해하자
백엔드 개발에서의 역할과 동일하다고 생각하면 됨.) - XaccessTokenInterceptor 클래스
서버에 요청을 보낼 때 사용자 인증을 위한 JWT 토큰 값을 요청 헤더에 담아서 보내야한다.
따라서, 이러한 헤더에 JWT 토큰을 매번 요청 헤더에 넣어두는게 중복되기에
XaccessTokenInterceptor 클래스에서 SharedPreferences에 있는 JWT 토큰을 가져와 http 통신이 나갈 때
http 요청 헤더에 자동으로 JWT 토큰값을 넣어준다.
(앱에서 http 통신이 이루어질 때, 자동으로 http 요청 헤더에 JWT 토큰을 넣어준다.)
# 여기서, SharedPreferences는 앱에서 전역적으로 사용하는 요청 객체인 듯하다.
앱의 실행 시에만 유효한 데이터 베이스 같은 역할?
#) src 폴더 구성 이해
한 화면에 존재하는 여러 동작을 하나의 액티비티가 아닌, 여러 개의 액티비티로 나눠서 관리한다.
- models
데이터 형식을 지정해둔다.
API 요청 객체 시 필요한 정보를 기록해둔다. - Fragment
프래그먼트나 액티비티에서는 특정 이벤트가 발생했을 때,
API 요청을 보내는 코드를 작성한다.
(Service 클래스에서 구현한 API 요청 메소드 이용)
API 요청 시 로딩 다이얼로그를 띄움.
로딩 다이얼 로그를 제거하는 메소드 구현 - FragmentView
분리한 액티비티와 프래그맨트를 이어주는 클래스로
상속받아서 활용되어진다.
(Service 클래스에서 액티비티 & 프래그맨트에 다시 접근하기 위한 View 클래스
파일이다.) - RetrofitInterface
API 요청 객체를 생성하는 인터페이스 - Service
네트워크를 담당하는 API 요청에 대한 코드를 작성한다.
API 요청 유무에 따라 로딩 다이얼 로그 제거
src 폴더는 한 화면에서 구현되는 여러 로직을 분리시켜서
클래스 파일들을 관리한다.
앱 화면에 보이는 뷰 클래스
앱 기능에서 네트워크 요청을 하는 클래스
앱 기능에서 네트워크 요청을 하고 응답을 받는 클래스
즉, 네트워크 부분과 앱 View를 분리시켜서 클래스 파일들을 체계적으로 관리한다.
#) MVP 개발 템플릿 활용
- LogCat으로 네트워크 통신 내용 읽기
로그캣 필터부분에 okhttp.OkHttpClient로 검색하면 http 통신 내용을 보여준다.
즉, Application 클래스의 레트로핏 객체에 API 요청을 수행할 때마다 Log를 찍어두게 해두고
로그캣에서 API 요청 내역을 확인할 때 okhttp.OkHttpClient로 검색하여 통신 내용을 확인한다.
(프론트 단에서 API 요청을 하고, 정상적으로 요청 & 응답이 되었는지 디버깅 전략이다.)
'🌤 프로젝트 > UMC 3기: 당신의 발자취' 카테고리의 다른 글
[팀 프로젝트] UMC 3기 앱 개발 프로젝트: 안드로이드 개발자 후기 (2) | 2023.02.17 |
---|---|
[팀 프로젝트] 갤러리 API 연결을 완료하고.. (트러블 슈팅) (0) | 2023.01.29 |
[팀 프로젝트] 서버 API 연결 (0) | 2023.01.27 |
[팀 프로젝트] Github 프로젝트 관리자로 활동하면서.. - 1차 병합완료 (0) | 2023.01.19 |
[팀 프로젝트] 갤러리 뷰 Fragment 구현 완료 - 개발 회고록 (0) | 2023.01.15 |