도메인 모듈에서 정의하는 데이터 클래스들이 DTO 패턴을 따르는 것이 맞는지를 오늘 동료에게 물어 보았습니다. 그 분의 답은 이러하였습니다.
아키텍처는 사실 정답이 없어요. 구현하는 사람 나름의 해석인거죠. 다만 클린아키텍처를 가장 잘 설명하는 아래 그림으로 설명을 하는데 이걸 어떻게 해석하냐의 따라 구조가 달라지는거겠죠.
그렇습니다. 아키텍처가 동일해도 이를 해석해서 구현하는 방식은 개발자마다 다를 수 있습니다. 반드시 이렇게 해야만 한다라는 강제적인 답이 있는 것은 아니지요. 어떻게 분석하고 생각하느냐에 따라 코드 결과는 달라질 수 있는 것입니다.
그렇다면 도메인 모듈에서 정의하는 데이터 클래스들이 DTO 패턴을 따르는 것이 맞을까요? 인터넷에서 자료를 좀 더 찾아보았구요. 다음과 같이 결론을 내렸습니다.
내가 내린 결론은?
DTO 패턴은 도메인 모듈보다는 데이터 모듈에 적용하는 것이 맞는 것으로 판단합니다. DTO의 뜻이 Data Transfer Object(자료 전송 객체)이죠. 앱이 읽을 자료는 API 또는 데이터베이스로부터 받아올 수 있습니다. API 또는 데이터베이스가 앱에 내보내는 데이터가 바로 Data Transfer Object인 것입니다. 저도 자료를 찾아보며 고민해보니 그게 맞다고 판단합니다.
동료가 도메인 데이터 클래스가 DTO 패턴을 따른다고 판단한 이유는 그게 presenter(제 프로젝트에서는 dorian-steem-ui 모듈이 이에 해당)로 전달되기 때문인 듯 합니다. 어떻게 보느냐에 따라 그게 맞을 수도 있겠지만, 사람들이 일반적으로 더 따르는 방향이 더 좋지 않을까 합니다.
그렇다면 리팩토링은?
도메인이 아닌 데이터 모듈의 데이터 클래스들이 DTO 패턴을 따라야 한다고 판단했으므로 이에 따라 이 클래스들의 이름을 변경할 것입니다. 도메인의 데이터 클래스들의 이름 또한 바꿔야겠지요? 아래와 같이 적용할 예정입니다.
클래스 이름 | As-is | To-be |
---|---|---|
데이터 모듈의 데이터 클래스들 | Entity로 끝남 | DTO로 끝남 |
도메인 모듈의 데이터 클래스들 | DTO로 끝남 | 끝나는 접미사 없음 |
마치며...
다음 포스트에서는 위에 말씀드린 리팩토링을 하고, 결과 코드를 보여드릴 예정입니다.
지난 스팀 앱 개발기
- #30 - 진도를 더 나가기 전에 리팩토링 고려 중
- #29 - 뷰모델, Repository 패턴 그리고 Use Case 패턴의 관계
- #28 - Use Case 패턴 적용
- #27 - Repository 패턴 적용
- #26 - condenser_api.get_accounts API로 받은 계정 자료를 SteemitWalletDTO 타입으로 변환하기
- #25 - SteemClient, SteemService 잘 작동하는지 유닛 테스트
- #24 - API 실행을 담당할 SteemService 인터페이스 정의
- #23 - condenser_api.get_accounts API 연동에 필요한 데이터 클래스 정의
- #22 - API 연동에 필요한 라이브러리 추가
- #21 - 사용자 지갑 정보를 담을 SteemitWallet 클래스 정의
- #20 - 클린 아키텍처를 위한 모듈 구성 (2)
- #19 - 클린 아키텍처를 위한 모듈 구성 (1)
- #18 - VEST로부터 STEEM POWER를 계산하는 방법
- #17 - VEST를 STEEM POWER로 변환하기 위해 필요한 get_dynamic_global_properties API
- #16 - 지갑 내용을 읽기 위해 필요한 API
- #15 - 지갑 서브화면(WalletFragment) 레이아웃 구성해 보기
- #14 - 지갑 서브화면(WalletFragment)에서 계정 인식하기
- #13 - 프로파일 서브화면(ProfileFragment)에서 계정 인식하기
- #12 - 태그 서브화면에서 태그 인식하기
- #11 - 검색 레이아웃을 메인 화면에 적용
- #10 - 태그 및 계정 검색 레이아웃 만들기
- #9 - BaseActivity 클래스 정의 그리고 MainActivity 클래스에 적용
- #8 - BaseFragment 클래스 정의 그리고 기존 프래그먼트들에 적용
- #7 - ProfileFragment 그리고 WalletFragment에 데이터 바인딩 적용
- #6 - 태그별 검색 내용을 보여줄 TagsFragment에 데이터 바인딩 적용
- #5 - GitHub에 소스 올리기
- #4 - 하단 내비게이션의 탭 관련 클래스 이름 수정
- #3 - 하단 내비게이션 바의 아이콘, 텍스트 수정
- #2 - 프로젝트 생성
- #1 - 시작하며...
[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Upvoted! Thank you for supporting witness @jswit.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
스팀앱 만드시는 건가요? 화이팅입니다~!
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
감사합니다. 예전에 앱 하나 만들다가 소스 분실하면서 꽤 오랫동안 의지를 잃었었죠. 이제는 그때그때 GitHub에도 백업하니 같은 실수를 반복하지 않을 거예요.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit