구체적이지 않은 요구사항으로 개발하기- 확장성을 고려한 모델 설계 #95
Replies: 2 comments 2 replies
-
구체적인 기획이 아직 정해져있지 않기 때문에, 고수준인 도메인 영역의 변화가 예상되고 저는 지금까지 저수준이라면, 고수준을 의존하는 것이 당연하다고 생각했기에 하지만 초기 개발 특성상 모델이 바뀌는 일들이 빈번해 보노의 글처럼 프로젝트의 특성 및 환경을 먼저 파악하는 시간을 가지고, 좋은 글 감사합니다! 👍 |
Beta Was this translation helpful? Give feedback.
-
클린 아키텍처를 아직 많이 공부하지 못한 입장이라 이런저런 용어는 잘 모르지만 어떻게 하면 변화에 더 유연한 개발을 할 수 있을까 고민해보던 차에 이 글을 보게 되었네요 또 이런 의견이 다양할 수 있는 부분을 자신의 생각을 잘 풀어서 남들에게 공유해 주시는 것도 항상 감사하다고 생각하고 있습니다. |
Beta Was this translation helpful? Give feedback.
-
안녕하세요! 3기
보노
입니다.10월 중에는 테크 포럼에 글을 써야지 계획했는데, 눈 떠 보니 11월 중순이 되었습니다.
많이 늦었지만 글자랑 대회가 끝나기 전에 한 몫 보태려 합니다.
서론
쇼케이스까지 정말 얼마 남지 않았습니다!
예상과 달리 저희 팀은 기획 변동과 디자인, 개발 설계 교체 등 많은 변화를 겪었습니다.
덕분에 일정은 빠듯해졌고, 이제 남은 2주 동안 구체적인 기획 요구사항, 디자인, 개발을 병행하며 진행해야 하는 상황입니다.
기획이 확정되지 않은 부분을 기다릴 시간이 없기 때문에,
기존 코드를 크게 수정하지 않고 추가만으로 대응할 수 있도록 확장성을 고민하며 작업 중입니다.
'추상적인 흐름은 있지만 구체적인 기획이 결정되지 않은' 현재의 상황은
'확장에는 열려있고, 변경에는 닫혀있도록 만들라'는 개방폐쇄의 원칙을 좇게 만듭니다.
(
protocol
을 학습할 때 접하는자격증
이라는 표현을 이해하기에도 적합한 것 같습니다)'최대한 구체적 결정을 늦추라-'는 엉클 밥(클린 아키텍처 저자)의 조언을 새기는 상황이기도 합니다.
다양한 학습 키워드와 매칭 시켜 볼 상황인 것 같아
'구체적 요구사항이 추후 결정 되어도 문제 없도록' 만들기 위해 고민한 내용을 기록하고자 합니다.
어려운 주제를 다루거나 답을 제시하는 글은 아니지만 경험을 공유하는 자체가 누군가에게 도움이 된다면 좋겠습니다!
개발해야 하는 데 아직 결정되지 않은 게 많다
설명을 위해 저희 팀의 서비스를 간략히 설명 하자면 아래와 같습니다.
이 서비스에서 다루어지는 핵심 모델은
실제 앱 화면에서는 '새'가 해당 책임을 상징합니다.
해당 모델이 필요한 화면 흐름을 기술하면 아래와 같습니다.
화면 흐름
[상황]
사용자가 지출판단을 위해
을 입력하면
[핵심 모델]
서로 다른 기준을 가진 새들이 (
판단기준들
)현지인 입장
에서 해당 카테고리에 해당 금액이 적절한 지한국인 입장
에서 해당 카테고리에 원화로 변환한 금액이 적절한 지직전 소비 기록
을 토대로 적절한 지등
독립된 기준
을 가지고 사용자가 입력한 금액이 적절한지 아닌지를 판단하여 보여 줍니다.이 기능(모델)에 해당하는
hi-fi
화면을 가져와 보았습니다.관련 화면
[새 정보]
현재 필요하지만 없는 구체적 요구사항
그리고 위의 새들을 만들기 위해 필요하지만 ,
현재 결정되지 않은(팀원이 열심히 만드는 중), 구체적 요구사항에는 아래와 같은 것들이 있습니다.
(ex_ 어떤 기준에서는 평균 값에서 3% 내에 있으면 긍정 판단, 어떤 기준에서는 평균 값에서 15% 떨어져 있으면 긍정 판단 등)
생각정리
이러한 상황에서 아래와 같은 생각을 했습니다.
(지금부터
금액평가
를 수행하는 모델을Bird 또는 새 모델
이라 부르겠습니다)결론
등등의 생각을 거쳐 내린 결론은
입니다.
(추상적 정보와 구체적 정보를 분리함으로서)
기대하는 효과는
입니다.
모든 것은 추후 결정될 구체적 요구사항이 무엇이건 간에 영향 받지 않는 선에서 최대한 많은 개발진도를 나가기 위함 입니다.
코드 예시
추상적 정보(일관된 정보) 찾기
추상적 정보는 무엇일까요?
디자인 또한 구체적인 요구사항 없이 제작 되었기에
hi-fi
화면을 보면 '일관된 정보'가 무엇인 쉽게 찾을 수 있습니다.각 새들이 다루는 구체적 정보나 멘트는 다르지만,
우리 서비스에서는 위의 다섯 개를 갖추어야만 '새/판단기준' 모델이라고 불릴 수 있습니다.
그러니 '새'가 되기 위한 조건을 프로토콜로 작성하였습니다
추상적 정보
구체적 정보 (AbroadBird)
이렇게 공통의 추상적 정보를 protocol로 작성한 뒤
구체적 타입 작성 시 해당 프로토콜을 채택하여 각 속성에 배치될 내용을 기술하였습니다.
[위의 새를 상징하는 AbroadBird 타입]
이 중 팀의 진도 상으로 구체적 기준이 마련되지 않은 정보는
새의 이름
으로 노출되는 정보인name
제외하고 전부 다 입니다.(
hi-fi
화면에는 새의 멘트나 설명이 있지만 임시 값으로 구체적인 결정이 없음)하지만 최대한 개발 진도를 많이 빼기 위해 구체적 새가 보여줄 정보에 어떤 값이 필요할 지는 유추할 수 있었습니다.
이를 고려한다면 이 정도까지는 앞서 작성해 줄 수 있게 됩니다.
유저가 요청한 질문을 담은
userQuestion
와 국가 품목 정보를 담은country
는 모든 새들에게 필요한 정보는 아닙니다.특별히
AbroadBird
가Bird
로서 적절한 값을 반환하기 위해 필요한 정보입니다.외부에 노출될 필요는 없지만 필요한 정보이기에 private으로 넣어주었습니다.
여기서! 구체적인 타입을 만들기 위해 속성을 추가하는 등 기능의 확장이 일어나고 있지만, Bird가 되기 위한 조건은 변화하지 않습니다 !
아래 코드는 대략적인 감을 위한 것으로
챗지피티에게 빈 칸을 채워줘 -
라고 요구한 코드를 조금 정제하였습니다.(물론, 아예 Mock 타입을 만들어 구체적 요구사항이 결정될 때 까지 사용해 줄 수도 있을 것 같습니다!)
앞서,
(추상적 정보와 구체적 정보를 분리함으로서)
기대하는 효과는
라 말했었는데요.
1 번은
위의
새
가 되기 위한 필수 현조건을 protocol로 정의해 두었기에기준이 추가된다면 단순히 이를 채택하여 구체화하는 방식으로
기준정보(새)
추가가 기존의 코드를 변화하지 않은 방식임을 보장받게 되었습니다.또한, 2번인 View가 필요로 하는 정보는
Bird
타입으로 충족될 수 있습니다.즉, View는
AbroadBird
라는 구체적 타입을 알 필요 없이, Domain에 요청한 정보가 늘Bird
타입으로 날아오면 충분합니다.보다 자세히 설명하자면,
우리 프로젝트는 사전에 Model을
UseCase
와Entity
로 역할 분류 하였습니다.각 역할에 맞게 타입을 매칭 시키면 아래와 같습니다.
View -
JudgmentView
UseCase -
JudgmentUseCase
Entity -
Bird
/AboradBird
View -> UseCase
관계에서 View가 UseCase에게 건네는 요청은 아래와 같이 작성될 수 있습니다.
View
는Bird
의 구체적 구현 타입에 의존하지 않게 됩니다 !어떤 과정을 거쳐서 정보가 정제 되었을 지는 몰라도 View가 필요한 정보는
Bird
타입 만으로도 충분히 전달되기 때문입니다.이러한 고려는 '일단 나온 데 까지'의 개발 작업을 가능하게 합니다.
화면 작업 중 구체적인 기획이 나온다면 해당 내용을 해당 계층(Model/Domain)에서 작성하면 됩니다.
View
는Domain(Model)
의 구체적 결정 사항에 영향을 받지 않으니 구체적 결정이 야기하는 View 계층의 수정은 최소화 될 수 있습니다.더 나아가 이러한 작업은 각 기능 간, 계층 간 의존성을 분리시켜 유연한 테스트를 가능하게 할 것입니다!
(원하는 상황을 설정하고(
input
) 그를 토대로output
을 점검하기 용이해집니다) (타겟을 분리하는 등의 계층 간 물리적 분리를 진행하지는 않았습니다)마치며
추상화된 프로토콜과 구체적 타입의 분리를 통해 변화에 대한 유연성을 높이고, 개발의 공수를 줄일 수 있었습니다.
다른 구현 방법도 비교해보고 싶었지만 시간과 경험이 부족하여 그만 글을 마무리 합니다. 피드백이나 조언은 언제든 환영합니다!
감사합니다!
Beta Was this translation helpful? Give feedback.
All reactions