- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 알고리즘
- 자바
- Java
- 탐탁노트북파우치
- 비트마스킹
- 삼성역량테스트
- 삼성청년sw아카데미
- 싸피
- kotiln
- 삼성파우치
- 등산로조성
- 코딩테스트
- 탐탁삼성파우치
- ssafy서울
- lateinit
- Higher-Order
- #충무로맛집#골목식당#스테이크#
- nullalble
- bitmasking
- 투포인터
- 아키텍처패턴
- MVVM
- 백준
- DataBinding
- Kotlin
- Android
- tomtoc
- 코틀린
- 안드로이드#코틀린#디자인패턴#싱글턴패턴#개발#앱개발
- 안드로이드
공상하는 개발자
[아키텍처패턴] 1탄 : Model 분리하기 본문
모든 코드를 뷰에 다 때려 박던 김 모 씨는 코드 관리의
필요성을 느끼고 아키텍처 패턴을 공부하기 시작하는데
아키텍처 패턴을 사용하는 이유
1. 코드 각각의 역할을 나눠 코드관리를 직관적으로 하는 게 유지보수와 협업에 좋다.
2. 모듈은 한 가지 기능만 하도록 세분화 되어야 한다.
3. 리소스의 낭비가 없어야한다.
Model이란 무엇인가
어떠한 동작을 수행해주는 코드입니다. 사용자에게 어떻게 보일지 신경을 쓰지 않아도 됩니다. (이러한 부분은 View 부분에서 할 일입니다.) 예를 들어 데이터, DB, 알고리즘 등이 Model에 속합니다.
Model을 분리하는 이유
Model과 View 간의 결합도를 낮추면, 새로운 기능을 추가하거나 수정할 때 관련된 부분만 변경하면 되기 때문에 코드 유지보수에 유리합니다. 그리고 테스트 코드를 작성하기 편리해져서 더 안전한 코드 작업이 가능합니다.
Repository pattern을 적용해보자
필요성
데이터 저장소(remote 혹은 local)에 접근할 때 직접 접근을 하게 되면, 부작용을 초래할 수 있습니다.
(부작용)
- 중복된 코드 사용
- 프로그래밍 에러 발생 확률 상승
- 캐싱과 같은 데이터-관계 정책 중심화 어려움
-> 모델과 프레젠터 사이의 일종의 중간 다리 역할을 해서 둘 사이의 의존성을 줄입니다.
사용
1. 리모트 데이터를 받는 인터페이스 작성
interface NaverRemoteDataSource {
fun getMovieData(title: String, onResponse: (NaverApi) -> Unit, onFailure: (Throwable) -> Unit)
}
2. 인터페이스를 상속해 실제 구현하는 코드 작성
class NaverRemoteDataSourceImpl : NaverRemoteDataSource {
override fun getMovieData(
title: String,
success: (NaverApi) -> Unit,
fail: (Throwable) -> Unit
) {
NaverSevicelmpl.service.getMovie(title).enqueue(
object : retrofit2.Callback<NaverApi> {
override fun onFailure(call: Call<NaverApi>, t: Throwable) {
fail(t)
}
override fun onResponse(call: Call<NaverApi>, response: Response<NaverApi>) {
success(response.body()!!)
}
}
)
}
}
3. 레포지토리 클래스에서 함수 호출(remote와 local 구분)
- local 부분은 구현 안함.
class NaverRepository {
var NaverRemoteDataSourece: NaverRemoteDataSource = NaverRemoteDataSourceImpl()
fun getMovieData(title: String, success: (NaverApi) -> Unit, fail: (Throwable) -> Unit) {
NaverRemoteDataSourece.getMovieData(title, success, fail)
}
}
결론
View는 보여주고 입력받는 역할인데, 제가 이전까지 구현하던 방법에서는 데이터를 가져오는 역할까지 하고 있어서 덩치가 컸습니다.
그래서 이런 식으로 retrofit2 라이브러리를 통해 불러오는 로직을 뷰에서 분리시킬 수 있습니다. 뷰의 역할이 한층 줄어든 것입니다.

다음은 MVP 패턴을 적용해보는 과정을 포스팅하겠습니다.
참고 자료
https://imcreator.tistory.com/105
[Repository Pattern] Android MVP에서 사용되는 데이터 분리 패턴
Repository Pattern (by Edward Hieatt and Rob Mee)Repository (레파지토리) 패턴은 아키텍처라기보다는 디자인 패턴중에 하나인데 데이터가 있는 어떤 저장소이든 간에 데이터를 사용하는 로직에서 분리시키는..
imcreator.tistory.com
Repository Pattern - in MSDN
리파지터리 패턴은 그 복합성 때문에 완벽히 이해하고 적용할 수 있기까지 매우 어려운 패턴이라 생각됩니다. 여러번에 걸쳐 이 주제를 포스팅 하는 이유가 바로 그 때문입니다. 여러 문서를 학습하거나 구현에 적..
vandbt.tistory.com
'개발 > 안드로이드' 카테고리의 다른 글
[Kotlin] Null 안정성 파헤치기 (0) | 2020.01.25 |
---|---|
[아키텍쳐 패턴] 2탄 : MVP 패턴 적용하기 (0) | 2020.01.19 |
[안드로이드/kotlin] 싱글톤 패턴 사용해보기 (0) | 2019.11.15 |
[안드로이드/android] PullRefreshLayout 을 이용한 당기면 피드 업데이트 구현 (0) | 2019.07.30 |
[안드로이드/android] 이미지 파일 이름 지정하기 (0) | 2019.07.30 |