Replies: 4 comments 8 replies
-
말씀하신대로 Text 파일은 현재 일종의 DB이기 때문에 Infrastructre이 맞을 것으로 생각됩니다. |
Beta Was this translation helpful? Give feedback.
-
Onion 아키텍쳐에서는 그러면 패키지 구조가 [Infrastructure].[Application services].[Domain services].[Domain model] |
Beta Was this translation helpful? Give feedback.
-
추가 설명 자료: https://dev.to/barrymcauley/onion-architecture-3fgl |
Beta Was this translation helpful? Give feedback.
-
Application domain은 Repository의 interface에만 접근할 수 있다면, Repository의 구현체는 반드시 interface에 구현된 메소드만 사용해야겠네요? |
Beta Was this translation helpful? Give feedback.
-
코드베이스가 커지고 있으므로 저희 프로젝트의 아키텍처를 확실하게 정하고 넘어갈 필요가 있을 것 같습니다.
DB 접근, UI 등의 infrastructure를 애플리케이션의 중심 모델과 분리해서 unit-testable한 코드를 작성할 수 있는 The Onion Architecture 를 따르는 것을 제안합니다.
The Onion Architecture는 마치 양파처럼 여러 겹의 레이어로 구성되어 있고, 각 레이어는 더 안쪽의 레이어만을 참조하기 때문에 클래스간의 의존성 관리가 쉽다는 장점이 있습니다.
레이어는 안쪽부터 차례로 다음과 같습니다.
FAQ
Q. Infrastructure가 가장 바깥쪽에 있다면, 영화 추천에 사용할 영화 정보들을 어디서 구해야 할까요?
A. Dependency injection을 사용합니다. 영화 추천 메소드에서 repository 인터페이스를 따르는 오브젝트를 인자로 받도록 정의합니다. 그리고 infrastructure 쪽에서 (UI 쪽에서) 해당 메소드를 호출할 때 repository의 실제 구현체를 함께 넘겨줍니다. 굳이 이렇게 간접적으로 메소드를 구현하는 이유는, 유닛 테스트를 용이하게 하기 위함입니다. 만약 영화 추천 메소드가 직접 데이터베이스에 접근했다면 영화 추천 메소드를 테스트할 때 매번 데이터베이스에 연결하므로 유닛 테스트 시간이 오래 걸렸을 것이며, 데이터베이스 오류가 날 경우 유닛 테스트가 불가능할 것입니다.
Q. 이 프로젝트에서 UI에 해당하는 부분은 무엇인가요?
A. 유저의 입력을 command line argument로 입력받는 부분입니다. 해당 부분에서 application services에 정의된 실제 비즈니스 로직을 호출하게 될 것입니다.
고민되는 점
고민되는 부분이 있는데, MovieStorage 등이 domain model에 들어가야 하느냐 infrastructure에 들어가야 하느냐입니다. 각각에 대한 이유를 들어 보자면
infrastructure
domain model
저희 과제에서 구현해야 하는 비즈니스 로직을 "텍스트 파일에서 영화 정보를 메모리에 로드하고, 로드한 정보를 바탕으로 영화를 추천한다"로 폭넓게 본다면 domain model에 들어가는 것이 타당하지만, "영화 정보는 바깥 세상(infrastucture)에서 아무튼 주어지고 주어진 정보를 바탕으로 영화를 추천한다"로 보면 infrastructure 로 보는 것이 맞습니다.
전통적인 방식에 따라 후자로 보되, integration test를 작성하는 것을 제안합니다.
Beta Was this translation helpful? Give feedback.
All reactions