더북(TheBook)
class ToDoListHub(val lists: Map<User, List<ToDoList>>): ZettaiHub {
    override fun getList(user: User, listName: ListName): ToDoList? =
        lists[user]
        ?.firstOrNull { it.listName == listName }
}

그 후 맵 대신 허브를 Zettai 클래스 생성자에게 전달한다.

data class Zettai(val hub: ZettaiHub): HttpHandler{
    // 메서드의 다른 부분
    fun fetchListContent(listId: Pair<User, ListName>): ToDoList =
        hub.getList(listId.first, listId.second)
        ?: error("List unknown")
}

주의할 점이 있다. 인수 테스트의 Actions 인터페이스에도 정확히 똑같은 시그니처를 가진 메서드가 있다. 이는 우연이 아니다. 테스트를 도메인에 가깝게 유지하면 액터의 액션이 허브의 메서드와 매우 비슷해진다.

이제 도메인과 어댑터가 분리된 깔끔한 디자인을 갖게 되었다. 이 사실을 활용하여 우리 도구 상자에 또 다른 도구를 추가할 수 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.