작성
·
278
0
강의 항상 잘 듣고 있습니다.
질문이 하나 생겨서 여쭤봅니다.
20강 30~33분 정도에서 domain 폴더에 data_source 폴더를 만드시는 이유를 다시 설명해주실 수 있을까요?
아래는 제가 생각하는 부분입니다.
data/ 의 data/data_source/ 는 data/repository/ 에서 사용하는 부분임.
domain/ 은 사실상 data/data_source/ 를 직접 접근하지 않고 domain/repository 를 활용하는 domain/use_case 를 통해 접근함.
이렇게 생각이 들다보니, "domain 에서 data_source 의 인터페이스를 정의하는 것이 맞는건가?" 생각이 듭니다.
감사합니다.
답변 3
1
@Seung Min Liang @송진욱 두 분의 의견을 종합해 봤을 때, DataSource 인터페이스를 Data 레이어에 두는 것이 바람직해 보입니다.
Domain 은 순수 비즈니스 로직에 집중해야 하는데, 데이터 소스를 끌고 들어온 것은 잘못 된 것이 맞습니다.
해당 내용에 대해서 자막을 추가하여 영상 업데이트를 하도록 하겠습니다.
좋은 의견에 감사드립니다.
1
저도 질문자님과 의견이 비슷한데, RecipeDataSource interface를 local과, remote에서 공통으로 사용하는데 실제로 항상 공통 interface를 갖지는 않는다고 생각합니다.
domain에서 repository 구현체를 주입받을때, repository가 local을 사용할지, remote를 사용할지 아니면 둘다 사용할지 등을 신경쓰지 않듯이 data source가 어떻게 처리되는지에 대해서도 domain에서는 신경쓰지 않아야 한다고 생각합니다.
RepositoryImpl에서 data source를 사용한다면, data 단에서 test를 해야한다고 생각합니다.
test때문에 repository의 구현체에 대한 interface까지 domain에 두는건 주객이 전도된것같습니다.
1
구현체는 data 레이어, 추상화된 인터페이스는 domain 레이어에 두고 있습니다.
domain 레이어가 앱의 핵심 비즈니스 로직을 담당하고 있는데요. domain 레이어에 data_source 의 인터페이스를 두게되면 각 레이어간의 의존관계가 다음과 같아집니다.
presentation --> domain <-- data
의존성의 방향이 외부에서 내부로 향하게 되는 의존성 역전 원칙(DIP)가 적용되고, 핵심은 domain 이게 됩니다.
이 상태에서는 presentation 의 테스트에 domain 레이어만 필요하게 되고
data 레이어의 테스트에도 domain 만 필요하게 됩니다.
만약 data_source 인터페이스가 data 레이어에 있다면 의존 관계는 다음과 같아집니다.
presentation --> domain <--> data
domain 레이어에 있는 Repository 인터페이스가 data 레이어에 있는 data_source 인터페이스를 참조해야 하기 때문입니다.
이 경우에는 추후에 멀티 모듈 방식으로 프로젝트가 확장되게 될 때 각 레이어를 나누기 어려워 지기 때문에 확장성에 제한이 생길 수 있습니다.
domain 에 정의된 local_storage 부분은.
data/data_source 와 data/repository 간의 인터페이스라고 생각하고 있습니다.
네. 보통은 역할별로 레이어를 모으게 되는데, 테스트 할 때 의존성 문제가 생길 수 있습니다.
Domain 에 있는 Repository를 테스트하기 위해서 DataSource 의 인터페이스를 Mocking 해야 하는데 이 때 Data 레이어 의존성이 생기게 되는 것은 불필요합니다.
따라서 핵심 로직에 필요한 모든 인터페이스를 Domain 레이어에 두게 되면
각 레이어의 테스트 코드 작성시 다른 레이어 의존성이 필요없게 됩니다.
도메인 레이어에서 기술적 용어인 "DataSource" 가 언급된 것이 헤깔릴 수 있는 포인트인 것 같습니다.
생각해 보니 도메인 레이어에서 비즈니스 용어로 인터페이스를 정의하는 것이 바람직해 보입니다.
domain/data_source/local_storage.dart 디렉토리가 기술적인 관점이기 때문에
domain/storage/local_storage.dart 형태로 비즈니스 관점의 디렉토리명이 더 나아보이네요.
좋은 질문 감사합니다.
질문해주신 부분에 대한 내용은 이해했습니다.
저의 의문점은
Local Storage 는 data 레이어 안에서만 접근을 합니다. 그런데 왜 data 레이어 내부적으로 처리되는 부분을 domain 레이어에 인터페이스를 두고 연관성을 만드는지가 의문입니다.
(추상화된 부분을 domain 에 넣는 것은 두 레이어간의 연관성을 정의하기 위함인 것으로 생각하는데, domain/data_source 는 하나의 레이어(data)에 내부적으로만 사용되므로 domain 레이어에 정의할 필요가 있는가?)
https://github.com/junsuk5/flutter_recipe_app_course/blob/24-Filter/lib/domain/data_source/local_storage.dart
data_source 에 정의된 인터페이스를 직접적으로 domain 영역에서 사용하는 부분은 없는것 같습니다.
생각하게 만드는 강의이다 보니 알려주셔도 다시 질문하게 되네요.
제가 정확히 이해를 못하는 부분에 대해서 알려주시면 감사하겠습니다.