Clean Architecture 실습 및 정리 [1]

ee·2024년 11월 12일

Clean Architecture

목록 보기
4/6

강의 영상
https://youtu.be/Mr8YKDh3li4?si=mj663P7ZrFL5wkGO

위 영상을 보고 clean architecture app을 실습하였다.
이제 이 전체 코드를 보면서 하나하나 정리해 보겠다.

전체 코드
https://github.com/iamgonnabe/Dictionary_cleanArchi_practice/tree/main/app/src/main/java/com/example/dictionary

전체 파일은 core, feature_dictionary, ui, 그리고 나머지로 나눠져 있다.

core

코어 폴더는 앱 전체에 쓰이는 resource를 저장한다.

Resource 클래스는 제네릭 타입으로 data와 message를 파라미터로 받는다. 그리고 하위에 Loading, Success, Error 클래스가 있다. 이 코드는 api를 받아 올 때 예외처리를 쉽게 할 수 있게 한다. 강의자는 이 코드를 모든 앱에 사용한다고 한다.

feauture_dictionary

feature_dictionary 폴더에는 data, di(dependency injection), domain, presentation 폴더로 나눠져 있다. 이는 밑에서 자세히 다루겠다.

ui

ui폴더 하위에는 theme 폴더가 있고 color, theme, typo 등을 정의한다.

나머지

그 외에는 Application 파일과 MainActivity가 있다.

data

다시 feature_dictionary 폴더로 돌아와서 data 폴더를 보겠다.
data 폴더는 local, remote, util로 나뉜다.

remote

먼저 remote 폴더에는 DictionaryApi 인터페이스가 있다.

이 인터페이스에선 get HTTP 요청을 하는 비동기 함수가 있다.

dto

dto 폴더에는 get HTTP 요청을 통해 받아온 json 값을 저장할 data class가 있다.

local

이 앱은 roomDB를 사용하기 때문에 local 폴더에 Room Database와 Entity를 보관한다.

entity

dto에서 사용할 프로퍼티만 선언하여 entity를 작성한다.

나머지

room db에 저장할 data class 작성
room database와 dao 인터페이스 작성.
그리고 Meaning data class를 room db에 저장 혹은 불러오기 위해 json 파일과 서로 변환하는 Converters 파일도 작성한다.

repository

repository 폴더에는 WordInfoRepository 인터페이스를 구현하는 WordInfoRepositoryImpl 클래스가 있다.

이 클래스는 DictionaryApi와 WordInfoDao를 파라미터로 받는다. 이는 나중에 설명하겠지만 의존성 주입을 한다.

getWordInfo함수는 word를 인자로 받아 flow 빌더를 사용해서 WordInfo를 stream한다.
먼저 Resource.Loading()을 emit하여 요청을 초기화한다.
그 다음 데이터베이스에서 이 word에 정보가 있다면 다이렉트로 가져온다. 따라서 Loading 상태여도 데이터베이스에 있기 때문에 api 요청을 기다리지 않아도 바로 ui에 display할 수 있다.
그리고 Resource.Loading에 이 데이터를 방출하여 viewmodel에게 바로 display할 수 있게 알려준다.

try에서 api를 호출하고 데이터베이스에 wordInfos가 있을 수도 있기 때문에 먼저 삭제하고 그 다음에 삽입한다.
catch에서는 Resource.Error()를 방출한다.

그리고 데이터베이스에서 삽입한 wordInfos를 가져오고 Resource.Success(newWordInfos)를 방출한다.

util

util 폴더에는 JsonParser 인터페이스와 이를 구현하는 GsonParser가 있다.
즉 이 폴더에는 데이터에 관한 utility 파일을 보관한다.

data layer 총정리

Data layer에는 domain의 repository interface를 구현하는 repository implementaion과 data source가 있다. data source는 api나 db에서 데이터를 얻어온다고 전에 글에 작성했었다.
이와 같이 data layer에는 local, remote, repository, util로 나뉠 수 있다. local에는 roomDB 관련 코드를 작성했다. 만약 roomdb말고 다른 db를 사용하면 다른 이름의 폴더로 자유롭게 지정하면 될 것같다.
remote 폴더에는 api관련 폴더라고 생각하면 될 것같다. HTTP 요청을 하여 외부에서 데이터를 받아오고 이를 dto로 받아온다.
repository 폴더에는 repository implementation을 구현한다. 이 때 주의해야 할 점은 dependency injection을 위해 api나 db를 파라미터로 받아와야 한다.
util 폴더에는 데이터 관련 Jsonparser, GsonParser 등을 구현한다.

profile
정진이

0개의 댓글