안드로이드 앱 개발기 #27 - 클린 아키텍처에서 domain 모듈
개발하고자 하는 대상의 영역을 도메인(domain)이라 하구요. domain 모듈은 도메인 관련 데이터 클래스와 이를 읽거나 기록하기 위해 필요한 클래스, 인터페이스 등을 정의하는 곳입니다. 여기에서 데이터 클래스는 순전히 도메인의 관점에서 정의해야 하며, 어떤 라이브러리를 사용하여 서버 또는 데이터베이스와 통신할지를 domain 모듈에서는 고려하지 않습니다. 통신 방법은 data 모듈의 몫입니다.
데이터 클래스
- 도메인에서 사용할 또는 필요할 데이터를 정의하는 클래스
- DTO 패턴을 따름
- Data Transfer Object의 약자
- 주의할 점: 비즈니스 로직이 들어가지 않음
데이터 클래스 이름 정할 때 주의점
- domain 뿐만 아니라 data 모듈에서도 데이터 클래스 정의 -> 양쪽 모듈에서 유사 클래스들 정의 -> 이름 구별할 수 있어야
- 해결 방법
- domain 모듈: 데이터 클래스 이름의 뒤에 DTO 단어 붙임
- data 모듈: 데이터 클래스 이름 뒤에 Entity 단어 붙임 (안 붙이기도 함)
데이터 클래스 예
온라인 서점 앱을 개발한다고 가정해 봅시다. 책 정보는 당연히 필요하지요? 그러면 회원 정보를 의미하는 데이터 클래스를 정의할 수 있습니다.
data class BookDTO(
val title: String,
val subtitle: String,
val isbn13: String,
val price: String,
val image: String,
val url: String
)
Repository 인터페이스
데이터 읽기, 저장은 Repository 패턴을 활용하여 구현을 하는데요. domain 모듈에서는 인터페이스만 정의합니다. 앞에 말씀드린대로 구현은 data 모듈에서 합니다. 어떤 데이터를 읽을지, 어떤 데이터를 기록할지를 수행할 메소드를 선언해 주시면 됩니다.
Repository 인터페이스의 예
아래 코드는 검색어를 활용하여 서적 리스트를 구하는 메소드가 선언된 Repository 인터페이스의 예입니다.
interface ITBookStoreRepository {
fun requestBookSearch(query: String): Single<List<Book>>
}
UseCase 클래스
- presentation 모듈의 뷰모델은 Repository 객체 대신 UseCase 객체를 통해 데이터 접근
- 한 가지 데이터에 접근하기 위해 하나의 UseCase 클래스를 정의해야 함
- 장점: 뷰모델이 접근 가능한 데이터의 범위가 명확해짐
- 단점: 클래스 개수가 많아짐
UseCase 클래스의 예
아래 코드는 서적 리스트를 구하기 위한 UseCase 클래스를 정의하는 예입니다.
class RequestBookSearchUseCase(val repository: ITBookStoreRepository) {
fun run(query: String): Single<List<Book>> {
return run(query, 1)
}
fun run(query: String, page: Int): Single<List<Book>> {
return repository.requestBookSearch(query, page)
}
}
지난 안드로이드 앱 개발기
- #26 - 클린 아키텍처 구현을 위한 모듈 구성
- #25 - 스팀 관련 샘플 코드 만들면서 잘못한 점
- #24 - 시작 화면 구성 요소 식별하기
- #23 - 프로젝트 초기 화면 구성부터 대략적으로...
- #22 - Kotlin 코드로 JavaScript 코드를 실행할 수 있을까?
- #21 - 실습 도중 발생한 오류: A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution
- #20 - 클립보드에 텍스트 복사하는 함수 만들어 보기 (Kotlin)
- #19 - 데이터 바인딩 적용했으나 UI 자동 업데이트 되지 않는 문제
- #18 - 에뮬레이터에서 토스트 안 보이는 문제 (1)
- #17 - 유닛 테스트를 실행할 수 없는 문제 해결
- #16 - 잘 되던 유닛 테스트를 실행할 수 없는 문제
- #15 - 앱 재시작 코드
- #14 - Fragment 사용시 간혹 발생할 수 있는 Fragment not attached to Activity 문제
- #13 - Retrofit2 활용 서버로부터 받을 데이터 유형 JsonElement (JSONObject 사용 불가)
- #12 - Glide 활용하여 이미지 다운로드 받는 코드
- #11 - 처리할 수 없는 예외/크래쉬 발생시 앱 재시작하기
- #10 - 안드로이드 스튜디오 업그레이드 후 단축키가 안되면? (맥북)
- #9 - LiveData 객체에 동일 데이터 설정하면 observer 실행되는지 확인 목적의 샘플 프로젝트
- #8 - 안드로이드 스튜디오에서 빌드시 발생하는 Build Tools revision 31.0.0 오류
- #7 - 'UGC(사용자 생성 콘텐츠) 정책 미준수'로 심사 거절
- #6 - 뷰에 역마진 적용 불가시 translationX, translationY 속성 사용하기
- #5 - 프로젝트 생성 후 빌드시 발생 오류: The minCompileSdk (31) specified in a dependency's AAR metadata
- #4 - 프로젝트 생성 후 빌드시 발생 오류: The minCompileSdk (31) specified in a dependency's AAR metadata
- #3 - 무한 롤링 배너 만드는 법을 찾았으나, 높이를 wrap_content로 지정이 안 먹히는 문제점이...
- #2 - setContentView 메소드의 파라메터를 변경하지 않아서 발생한 화면 오류
- #1 - 페이스북 로그인 연동시 발생했던 문제들
[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.
Upvoted! Thank you for supporting witness @jswit.