Post on 12-Jul-2015
Day����������� ������������������ 9.����������� ������������������ ����������� ������������������
안드로이드����������� ������������������ MVC����������� ������������������ 패턴����������� ������������������ 적용하기
이번����������� ������������������ Section에서는����������� ������������������ HomeView가����������� ������������������ 갖고있는����������� ������������������ 기능들을����������� ������������������ 분리함으로써����������� ������������������
MVC����������� ������������������ Pattern을����������� ������������������ 적용해����������� ������������������ 보겠습니다.
MVC����������� ������������������ Pattern
모델-뷰-컨트롤러(Model–View–Controller,����������� ������������������ MVC)는����������� ������������������ 소프트웨어����������� ������������������ 공학에서����������� ������������������ 사용되는����������� ������������������ 아키텍처����������� ������������������ 패턴이다.����������� ������������������ ����������� ������������������
이����������� ������������������ 패턴을����������� ������������������ 성공적으로����������� ������������������ 사용하면,����������� ������������������ 사용자����������� ������������������ 인터페이스로부터����������� ������������������ 비즈니스����������� ������������������ 로직을����������� ������������������ 분리하여����������� ������������������ 애플리케이션의����������� ������������������ 시각적����������� ������������������ 요
소나����������� ������������������ 그����������� ������������������ 이면에서����������� ������������������ 실행되는����������� ������������������ 비즈니스����������� ������������������ 로직을����������� ������������������ 서로����������� ������������������ 영향����������� ������������������ 없이����������� ������������������ 쉽게����������� ������������������ 고칠����������� ������������������ 수����������� ������������������ 있는����������� ������������������ 애플리케이션을����������� ������������������ 만들����������� ������������������ 수����������� ������������������ 있다.����������� ������������������ MVC
에서����������� ������������������ 모델은����������� ������������������ 애플리케이션의����������� ������������������ 정보(데이터)를����������� ������������������ 나타내며,����������� ������������������ 뷰는����������� ������������������ 텍스트,����������� ������������������ 체크박스����������� ������������������ 항목����������� ������������������ 등과����������� ������������������ 같은����������� ������������������ 사용자����������� ������������������ 인터페이스����������� ������������������
요소를����������� ������������������ 나타내고,����������� ������������������ 컨트롤러는����������� ������������������ 데이터와����������� ������������������ 비즈니스����������� ������������������ 로직����������� ������������������ 사이의����������� ������������������ 상호동작을����������� ������������������ 관리한다.
http://ko.wikipedia.org/wiki/모델-뷰-컨트롤러
MVC����������� ������������������ Pattern
• 사용자����������� ������������������ 인터페이스로부터����������� ������������������ 비즈니스����������� ������������������ 로직을����������� ������������������ 분리����������� ������������������
• 서로����������� ������������������ 영향����������� ������������������ 없이����������� ������������������ 쉽게����������� ������������������ 고칠����������� ������������������ 수����������� ������������������ 있는����������� ������������������ 애플리케이션����������� ������������������
• 모델은����������� ������������������ 애플리케이션의����������� ������������������ 정보(데이터)����������� ������������������
• 뷰는����������� ������������������ 사용자����������� ������������������ 인터페이스����������� ������������������ 요소����������� ������������������
• 컨트롤러는����������� ������������������ 데이터와����������� ������������������ 비즈니스����������� ������������������ 로직����������� ������������������ 사이의����������� ������������������ 상호동작을����������� ������������������ 관리
NEXTGRAM에����������� ������������������ 적용을����������� ������������������ 해보면서����������� ������������������ ����������� ������������������ 좀����������� ������������������ 더����������� ������������������ 자세히����������� ������������������ 알아봅시다.
NEXTGRAM에는����������� ������������������ 다양한����������� ������������������ View가����������� ������������������ 있지만����������� ������������������ 그����������� ������������������ 중에서도����������� ������������������
HomeView.java를����������� ������������������ 수정해보겠습니다.
HomeView.java가����������� ������������������ 하는일을����������� ������������������ 살펴보니
…⋯
HomeView.java가����������� ������������������ 하는일을����������� ������������������ 살펴보니
HomeView.java가����������� ������������������ 하는일을����������� ������������������ 살펴보니
onCreate에서����������� ������������������
SharedPreferences를����������� ������������������ 사용����������� ������������������ ����������� ������������������
mainListView����������� ������������������ 인플레이트
Proxy����������� ������������������ 인스턴스화
Dao����������� ������������������ 인스턴스화
SyncDataService����������� ������������������ 실행
listViewSimple1����������� ������������������ 실행
onResume에서����������� ������������������
refreshData()����������� ������������������ 실행
HomeView.java가����������� ������������������ 하는일을����������� ������������������ 살펴보니
SharedPreferences를����������� ������������������ 사용����������� ������������������ ����������� ������������������
mainListView����������� ������������������ 인플레이트
Proxy����������� ������������������ 인스턴스화
Dao����������� ������������������ 인스턴스화
SyncDataService����������� ������������������ 실행
listViewSimple1����������� ������������������ 실행
refreshData()����������� ������������������ 실행
HomeView.java가����������� ������������������ 하는일을����������� ������������������ 살펴보니
SharedPreferences를����������� ������������������ 사용����������� ������������������ ����������� ������������������ mainListView����������� ������������������ 인플레이트
Proxy����������� ������������������ 인스턴스화
Dao����������� ������������������ 인스턴스화
SyncDataService����������� ������������������ 실행
listViewSimple1����������� ������������������ 실행refreshData()����������� ������������������ 실행
Controller가����������� ������������������ 할일 View가����������� ������������������ 할일
SharedPreferences를����������� ������������������ 사용����������� ������������������ ����������� ������������������ mainListView����������� ������������������ 인플레이트
Proxy����������� ������������������ 인스턴스화
Dao����������� ������������������ 인스턴스화
SyncDataService����������� ������������������ 실행
listViewSimple1����������� ������������������ 실행refreshData()����������� ������������������ 실행
Controller가����������� ������������������ 할일 View가����������� ������������������ 할일
View가����������� ������������������ 할일은����������� ������������������ HomeView.java에����������� ������������������ 그대로����������� ������������������ 두고����������� ������������������ HomeController.java를����������� ������������������ 생성해����������� ������������������ 만들어����������� ������������������ 봅시다.
HomeController.java����������� ������������������ 작성하기 SharedPreferences를����������� ������������������ 사용����������� ������������������ ����������� ������������������
Proxy����������� ������������������ 인스턴스화
Dao����������� ������������������ 인스턴스화
SyncDataService����������� ������������������ 실행
refreshData()
HomeController����������� ������������������ 작성하기
HomeController.java를����������� ������������������ 생성한����������� ������������������ 후����������� ������������������ Context를����������� ������������������ 담아����������� ������������������ 둘����������� ������������������ 수����������� ������������������ 있게����������� ������������������
생성자를����������� ������������������ 작성합니다.
HomeController.java
HomeController.java����������� ������������������ 작성하기 SharedPreferences를����������� ������������������ 사용����������� ������������������ ����������� ������������������
Proxy����������� ������������������ 인스턴스화
Dao����������� ������������������ 인스턴스화
SyncDataService����������� ������������������ 실행
refreshData()
HomeController.java에����������� ������������������ initSharedPreferences()����������� ������������������ 메서드를����������� ������������������ 생성합니다.
HomeController.java
HomeController����������� ������������������ 작성하기
HomeController����������� ������������������ 작성하기
HomeView.java
다음����������� ������������������ HomView.java에서����������� ������������������ SharedPreferences와����������� ������������������ ����������� ������������������
관련있던����������� ������������������ 부분을����������� ������������������ 모두����������� ������������������ 복사한후
HomeController����������� ������������������ 작성하기
HomeController.java
HomeController의����������� ������������������ initSharedPreferences()����������� ������������������ 안에����������� ������������������ 붙여넣습니다.
HomeController����������� ������������������ 작성하기
HomeController.java
Application����������� ������������������ Context의����������� ������������������ 함수들은����������� ������������������ context가����������� ������������������ 호출하도록����������� ������������������ 추가����������� ������������������ 작성합니다.
HomeController����������� ������������������ 작성하기
HomeView.java에����������� ������������������ HomeController의����������� ������������������ 인스턴스를����������� ������������������ 생성한����������� ������������������ 후����������� ������������������
initSharedPreferences()메서드를����������� ������������������ 실행하도록����������� ������������������ 합니다.
HomeView.java
HomeController.java����������� ������������������ 작성하기
SharedPreferences를����������� ������������������ 사용����������� ������������������ ����������� ������������������
Proxy����������� ������������������ 인스턴스화
Dao����������� ������������������ 인스턴스화
SyncDataService����������� ������������������ 실행
refreshData()
HomeController����������� ������������������ 작성하기
HomeView.java의����������� ������������������ refreshData()����������� ������������������ 함수를����������� ������������������ 복사한����������� ������������������ 후����������� ������������������
외부에서����������� ������������������ 사용할����������� ������������������ 수����������� ������������������ 있게����������� ������������������ private를����������� ������������������ public으로����������� ������������������ 변경합니다.
HomeView.java
HomeController����������� ������������������ 작성하기
HomeController.java
HomeController.java에����������� ������������������ 붙여넣습니다.����������� ������������������
Proxy와����������� ������������������ Dao가����������� ������������������ 없으니!
HomeController.java����������� ������������������ 작성하기
SharedPreferences를����������� ������������������ 사용����������� ������������������ ����������� ������������������
Proxy����������� ������������������ 인스턴스화
Dao����������� ������������������ 인스턴스화
SyncDataService����������� ������������������ 실행
refreshData()
HomeController����������� ������������������ 작성하기
HomeController.java
Proxy와����������� ������������������ ProviderDao����������� ������������������ 객체를����������� ������������������ 선언하고����������� ������������������ 생성합니다.
HomeController����������� ������������������ 작성하기
HomeView.java
����������� ������������������ onResume과����������� ������������������ onOptionItemSelected에서����������� ������������������ refreshData()를����������� ������������������ ����������� ������������������
homeController로부터����������� ������������������ 호출하도록����������� ������������������ 합니다.
HomeController.java����������� ������������������ 작성하기
SharedPreferences를����������� ������������������ 사용����������� ������������������ ����������� ������������������
Proxy����������� ������������������ 인스턴스화
Dao����������� ������������������ 인스턴스화
SyncDataService����������� ������������������ 실행
refreshData()
HomeController����������� ������������������ 작성하기
HomeView.java
HomeView.java로����������� ������������������ 부터����������� ������������������ Service를����������� ������������������ 실행하기����������� ������������������ 위한����������� ������������������ 코드를����������� ������������������ ����������� ������������������
복사한����������� ������������������ 후에
HomeController����������� ������������������ 작성하기
HomeController.java
HomeController.java에����������� ������������������ startSyncDataService()����������� ������������������ 메서드를����������� ������������������ 작성한����������� ������������������ 후
HomeController����������� ������������������ 작성하기
HomeController.java
붙여넣기를����������� ������������������ 합니다.����������� ������������������
이때����������� ������������������ startService()는����������� ������������������ Context의����������� ������������������ 함수이니����������� ������������������ context가����������� ������������������ 호출하도록����������� ������������������ 합니다.
HomeController����������� ������������������ 작성하기
HomeView.java
마지막으로����������� ������������������ HomeView.java의����������� ������������������ onCreate에서����������� ������������������ ����������� ������������������
homeController.startSyncDataService()를����������� ������������������ 실행하도록����������� ������������������ 합니다.
이전보다는����������� ������������������ 깔끔해����������� ������������������ 졌지만����������� ������������������ 한줄기가����������� ������������������ 한줄기가����������� ������������������ 남아있네요.
더����������� ������������������ 고민해보기
listViewSimple1에게����������� ������������������ ArrayList<ArticleDTO>는����������� ������������������ ����������� ������������������
어떻게����������� ������������������ 전달해����������� ������������������ 줄지����������� ������������������ 고민하도록����������� ������������������ 합시다.
HomeView.java����������� ������������������ -����������� ������������������ onCreate
listViewSimple1����������� ������������������ 실행
더����������� ������������������ 고민해보기
After
Before
마무리
MVC를����������� ������������������ 적용해보자구조를����������� ������������������ 더����������� ������������������ 매끄럽게����������� ������������������ 만들기����������� ������������������
section����������� ������������������ 4
����������� ������������������ HomeView.java의����������� ������������������ 기능
SharedPreferences를����������� ������������������ 사용����������� ������������������ ����������� ������������������
mainListView����������� ������������������ 인플레이트
Proxy����������� ������������������ 인스턴스화
Dao����������� ������������������ 인스턴스화
SyncDataService����������� ������������������ 실행
listViewSimple1����������� ������������������ 실행
refreshData()����������� ������������������ 실행
����������� ������������������ HomeView.java
Controller와����������� ������������������ View의����������� ������������������ 기능을����������� ������������������ 모두����������� ������������������ 하는����������� ������������������ ����������� ������������������
HomeView를
우리는����������� ������������������ Controller와����������� ������������������ View의����������� ������������������ 기능을����������� ������������������ 가지고����������� ������������������ 있던����������� ������������������ HomeView.java를����������� ������������������
하는일을����������� ������������������ 나누어����������� ������������������ 본����������� ������������������ 후����������� ������������������ HomeController와����������� ������������������ HomeView로����������� ������������������ 분리하였습니다.
SharedPreferences를����������� ������������������ 사용����������� ������������������ ����������� ������������������ mainListView����������� ������������������ 인플레이트
Proxy����������� ������������������ 인스턴스화
Dao����������� ������������������ 인스턴스화
SyncDataService����������� ������������������ 실행
listViewSimple1����������� ������������������ 실행refreshData()����������� ������������������ 실행
HomeController.java ����������� ������������������ HomeView.java
����������� ������������������ HomeView.java
HomeController.java
• 사용자����������� ������������������ 인터페이스로부터����������� ������������������ 비즈니스����������� ������������������ 로직을����������� ������������������ 분리����������� ������������������
• 서로����������� ������������������ 영향����������� ������������������ 없이����������� ������������������ 쉽게����������� ������������������ 고칠����������� ������������������ 수����������� ������������������ 있는����������� ������������������ 애플리케이션
이를����������� ������������������ 통해����������� ������������������ MVC����������� ������������������ Pattern의����������� ������������������ 효과인
를����������� ������������������ 달성하기����������� ������������������ 위해����������� ������������������ 한걸음����������� ������������������ 더����������� ������������������ 나아갔습니다.
MVC����������� ������������������ Pattern����������� ������������������ 외에도����������� ������������������ Android에는����������� ������������������
MVP����������� ������������������ Pattern이����������� ������������������ 적합하다는����������� ������������������ 의견도����������� ������������������ 있으니����������� ������������������ ����������� ������������������
함께����������� ������������������ 학습해����������� ������������������ 보기를����������� ������������������ 권장합니다.
section����������� ������������������ 5
DTO를����������� ������������������ 활용해보자객체를����������� ������������������ 통해����������� ������������������ 데이터를����������� ������������������ 전달하기
더
현재����������� ������������������ Article들을����������� ������������������ 받아오는����������� ������������������ 로직을����������� ������������������ 살펴본����������� ������������������ 후����������� ������������������ 그에����������� ������������������ 따른����������� ������������������ 문제점을����������� ������������������ 확인해����������� ������������������ 보겠습니다
현재����������� ������������������ Article들을����������� ������������������ 받아오는����������� ������������������ 로직
ProxyProviderDao
ProviderDao,����������� ������������������ Proxy,����������� ������������������ Server와
현재����������� ������������������ Article들을����������� ������������������ 받아오는����������� ������������������ 로직
ProxyProviderDao
JSONJSON
ProviderDao,����������� ������������������ Proxy,����������� ������������������ Server와����������� ������������������
그����������� ������������������ 사이에서����������� ������������������ 전달되는����������� ������������������ 데이터의����������� ������������������ 형태
현재����������� ������������������ Article들을����������� ������������������ 받아오는����������� ������������������ 로직
ProxyProviderDao
ProviderDao,����������� ������������������ Proxy,����������� ������������������ Server와����������� ������������������
그����������� ������������������ 사이에서����������� ������������������ 전달되는����������� ������������������ 데이터의����������� ������������������ 형태����������� ������������������
에����������� ������������������ 관한����������� ������������������ 이야기����������� ������������������ 입니다.
JSONJSON
현재����������� ������������������ Article들을����������� ������������������ 받아오는����������� ������������������ 로직
ProxyProviderDao
현재는����������� ������������������ 서버에서����������� ������������������ JSON으로����������� ������������������ 데이터를����������� ������������������ 전달해줍니다.
JSONJSON
현재����������� ������������������ Article들을����������� ������������������ 받아오는����������� ������������������ 로직
ProxyProviderDao
Proxy는����������� ������������������ getJSON()메서드를����������� ������������������ 통해����������� ������������������ ����������� ������������������
데이터를����������� ������������������ 서버에����������� ������������������ 요청하구요
JSONJSON
현재����������� ������������������ Article들을����������� ������������������ 받아오는����������� ������������������ 로직
ProxyProviderDao
ProviderDao는����������� ������������������ JSON����������� ������������������ 데이터를����������� ������������������ 받아����������� ������������������
insertJsonData()����������� ������������������ 함수를����������� ������������������ 통해����������� ������������������ DB에����������� ������������������ 저장합니다.
JSONJSON
현재����������� ������������������ Article들을����������� ������������������ 받아오는����������� ������������������ 로직
ProxyProviderDao
JSONJSON
만약����������� ������������������ 서버가����������� ������������������ XML
현재����������� ������������������ Article들을����������� ������������������ 받아오는����������� ������������������ 로직
ProxyProviderDao
XMLXML
Proxy에서는����������� ������������������ getXML()을����������� ������������������ 만들고����������� ������������������
ProviderDao는����������� ������������������ insertXMLData()����������� ������������������ 을����������� ������������������ 추가해야����������� ������������������ 합니다
현재����������� ������������������ Article들을����������� ������������������ 받아오는����������� ������������������ 로직
ProxyProviderDao
XMLArticleDTO
Proxy����������� ������������������ 가����������� ������������������ xml,����������� ������������������ json,����������� ������������������ 또다른����������� ������������������ 형태의����������� ������������������ 데이터라도����������� ������������������ ����������� ������������������
ArticleDTO를����������� ������������������ ProviderDao에게����������� ������������������ 전달하는����������� ������������������ 것이����������� ������������������ 낫지����������� ������������������ 않을까?
JSON
구조를����������� ������������������ 변경해보자!(두둥)
Proxy.java����������� ������������������ 수정하기
Proxy.java����������� ������������������ 수정하기
Proxy.java
Proxy.java에����������� ������������������ getArticleDTO()라는����������� ������������������ 메서드를����������� ������������������ 만들고����������� ������������������
ArrayList<ArticleDTO>를����������� ������������������ 반환하도록����������� ������������������ 합니다.
Proxy.java����������� ������������������ 수정하기
Proxy.java
jsonData로부터����������� ������������������ DTO를����������� ������������������ 만들기����������� ������������������ 위한����������� ������������������ 멤버변수들을����������� ������������������ 선언.
Proxy.java����������� ������������������ 수정하기
Proxy.java
jsonData와����������� ������������������ ArrayList에����������� ������������������ 담을����������� ������������������ ArticleDTO도����������� ������������������ 준비해줍니다.
Proxy.java����������� ������������������ 수정하기
Proxy.java
다음����������� ������������������ 슬라이드는����������� ������������������ 위의����������� ������������������ 부분을����������� ������������������ 작성할����������� ������������������ 것입니다.
Proxy.java����������� ������������������ 수정하기
Proxy.java
jsonData를����������� ������������������ JSONArray로����������� ������������������ 객체화����������� ������������������ 시킵니다.
Proxy.java����������� ������������������ 수정하기
Proxy.java
JSONArray객체에����������� ������������������ 접근하기����������� ������������������ 위한����������� ������������������ 반복문을����������� ������������������ 작성
Proxy.java����������� ������������������ 수정하기
Proxy.java
articleDTO를����������� ������������������ 만들어����������� ������������������ 줍니다.
Proxy.java����������� ������������������ 수정하기
Proxy.java
생성한����������� ������������������ articleDTO를����������� ������������������ articleList에����������� ������������������ 추가!
ProviderDao.java����������� ������������������ 수정하기
ProviderDao.java����������� ������������������ 수정하기
ProviderDao.java
ProviderDao.java에����������� ������������������ insertData()����������� ������������������ 메서드를����������� ������������������ 작성하고����������� ������������������ ����������� ������������������
필요한����������� ������������������ 변수들을����������� ������������������ 작성합니다.
많은����������� ������������������ 코드가����������� ������������������ insertJsonData와����������� ������������������ 겹치니����������� ������������������ 코드를����������� ������������������ 복사하시고����������� ������������������ ����������� ������������������
수정하시는����������� ������������������ 것을����������� ������������������ 권장합니다.
ProviderDao.java����������� ������������������ 수정하기
ProviderDao.java
articleList를����������� ������������������ 순회하는����������� ������������������ 반복문들����������� ������������������ 작성합니다.
ProviderDao.java����������� ������������������ 수정하기
ProviderDao.java
ArticleDTO에����������� ������������������ 있는����������� ������������������ 값을����������� ������������������ 추출해����������� ������������������ 변수에����������� ������������������ 넣습니다.
ProviderDao.java����������� ������������������ 수정하기
ProviderDao.java
마지막으로����������� ������������������ 받아온����������� ������������������ articleNumber도����������� ������������������ 저장하는����������� ������������������ 것을����������� ������������������ 잊지����������� ������������������ 않습니다.
다시한번����������� ������������������ 말씀드리지만����������� ������������������ 많은����������� ������������������ 코드가����������� ������������������ insertJsonData와����������� ������������������ 겹치니����������� ������������������ 코드를����������� ������������������ 복사하시고����������� ������������������ ����������� ������������������
수정하시는����������� ������������������ 것을����������� ������������������ 권장합니다.
ProviderDao.java����������� ������������������ 수정하기
ProviderDao.java
다음����������� ������������������ 슬라이드에����������� ������������������ 나오는����������� ������������������ 코드����������� ������������������ 위치
ProviderDao.java����������� ������������������ 수정하기
ProviderDao.java
DB에����������� ������������������ 넣기����������� ������������������ 위한����������� ������������������ 코드들도����������� ������������������ 추가합니다.
이부분의����������� ������������������ 코드는����������� ������������������ insertJsonData와����������� ������������������ 동일하니����������� ������������������ 꼭����������� ������������������ 복사하시길����������� ������������������ 권장합니다.
HomeController.java����������� ������������������ 수정하기
HomeController.java����������� ������������������ 수정하기
HomeController.java의����������� ������������������ refreshData안의����������� ������������������ 코드를����������� ������������������
수정해����������� ������������������ 줍시다.
HomeController.java
SyncDataService.java����������� ������������������ 수정하기
SyncDataService.java����������� ������������������ 수정하기
SyncDataService.java
SyncDataService.java의����������� ������������������ onStartCommand안의����������� ������������������ 코드를����������� ������������������
수정해����������� ������������������ 줍시다.
마무리
DTO를����������� ������������������ 활용해보자객체를����������� ������������������ 통해����������� ������������������ 데이터를����������� ������������������ 전달하기
더section����������� ������������������ 5
After
Before
ProxyProviderDao
JSONJSON
이렇게����������� ������������������ 구성되었던����������� ������������������ 기존의����������� ������������������ 로직을
ProxyProviderDao
ArticleDTO JSON
ProviderDao의
를����������� ������������������
변경하고.����������� ������������������
ProxyProviderDao
ArticleDTO JSON
Proxy의����������� ������������������ 기능들을����������� ������������������
ProxyProviderDao
ArticleDTO JSON
Proxy의����������� ������������������ 기능����������� ������������������
getJson����������� ������������������ :����������� ������������������ 서버에서����������� ������������������ jsonData를����������� ������������������ 가져온다.����������� ������������������
ProxyProviderDao
ArticleDTO JSON
Proxy의����������� ������������������ 기능����������� ������������������
getArticleDTO����������� ������������������ :����������� ������������������ ArrayList<articleDTO>����������� ������������������ 데이터를����������� ������������������ 가져온다
ProxyProviderDao
ArticleDTO JSON
이렇게����������� ������������������ 수정함으로써
우리는����������� ������������������ 서버의����������� ������������������ API가����������� ������������������ 변경되더라도����������� ������������������
유지보수하기����������� ������������������ 용이한����������� ������������������ 방향으로����������� ������������������ DTO객체를����������� ������������������ 활용했습니다.
ProxyProviderDao
XMLArticleDTO
JSON