- 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 | 31 |
- 투포인터
- 안드로이드
- bitmasking
- 알고리즘
- 백준
- 삼성역량테스트
- 안드로이드#코틀린#디자인패턴#싱글턴패턴#개발#앱개발
- lateinit
- tomtoc
- 등산로조성
- 비트마스킹
- 자바
- 코딩테스트
- ssafy서울
- Java
- 탐탁노트북파우치
- 삼성청년sw아카데미
- 아키텍처패턴
- Android
- 싸피
- Higher-Order
- MVVM
- Kotlin
- #충무로맛집#골목식당#스테이크#
- 코틀린
- DataBinding
- 삼성파우치
- 탐탁삼성파우치
- kotiln
- nullalble
공상하는 개발자
[아키텍처패턴] 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
'개발 > 안드로이드' 카테고리의 다른 글
[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 |