clean-architecture

23. 프레젠터와 험블 객체

프레젠터는 험블 객체 패턴을 따른 형태로, 아키텍처 경계를 식별하고 보호하는 데 도움이 된다.

험블 객체 패턴


험블 객체 패턴은 디자인 패턴으로, 테스트하기 어려운 행위와 테스트하기 쉬운 행위를 단위 테스트 작성자가 분리하기 쉽게 하는 방법으로 고안되었다.

테스트하기 어려운 행위를 모두 험블 객체로 옮긴다.

프레젠터와 뷰


뷰는 험블 객체이고 테스트하기 어렵다. 이 객체에 포함된 코드는 가능한 한 간단하게 유지한다. 뷰는 데이터를 GUI로 이동시키지만, 데이터를 직접 처리하지는 않는다.

애플리케이션에서 어떤 필드에 날짜를 표시하려고 한다면, 애플리케이션은 프레젠터에 Date객체를 전달한다. 그러면 프레젠터는 해당 데이터를 적절한 포맷의 문자열로 만들고, 이 문자열을 뷰 모델이라고 부르는 간단한 데이터 구조에 담는다. 그러면 뷰는 뷰 모델에서 이 데이터를 찾는다.

테스트와 아키텍처


테스트 용이성은 좋은 아키텍처가 지녀야 할 속성으로 오랫동안 알려져왔다. 험블 객체 패턴이 좋은 예인데, 행위를 테스트하기 쉬운 부분과 테스트하기 어려운 부분으로 분리하면 아키텍처 경계가 정의되기 때문이다.

데이터베이스 게이트웨이


유스케이스 인터랙터와 데이터베이스 사이에는 데이터베이스 게이트웨이가 위치한다. 게이트웨이는 다형적 인터페이스로, 애플리케이션이 데이터베이스에 수행하는 생성, 조회, 갱신, 삭제 작업과 관련된 모든 메서드를 포함한다.

유스케이스 계층은 SQL을 허용하지 않는다. 유스케이스 계층은 필요한 메서드를 제공하는 게이트웨이 인터페이스를 호출한다.

데이터 매퍼


객체는 데이터 구조가 아니다. 데이터는 모두 private으로 선언되므로 객체의 사용자는 데이터를 볼 수 없다.

객체는 단순히 오퍼레이션의 집합이다.

데이터 구조는 함축된 행위를 가지지 않는 public 데이터 변수의 집합이다.

ORM 시스템 같은 경우 어디에 위치해야 할 까? → 데이터베이스 계층이다.

서비스 리스너


서비스는 어떨까?

애플리케이션이 다른 서비스와 반드시 통신해야 한다면, 또는 애플리케이션에서 일련의 서비스를 제공해야 한다면, 우리는 여기에서 서비스 경계를 생성하는 험블 객체 패턴을 발견할 수 있을까?

애플리케이션은 데이터를 간단한 데이터 구조 형태로 로드한 후, 이 데이터 구조를 경계를 가로질러서 특정 모듈로 전달한다.

해당 모듈은 데이터를 적절한 포맷으로 만들어서 외부 서비스로 전송한다.

결론


각 아키텍처 경계마다 경계 가까이 숨어있는 험블 객체 패턴을 발견할 수 있을 것이다.

경계를 넘나드는 통신은 거의 모두 간단한 데이터 구조를 수반할 때가 많고, 대게 그 경계는 테스트하기 어려운 무언가와 테스트하기 쉬운 무언가로 분리될 것이다.

이러한 아키텍처 경계에서 험블 객체 패턴을 사용하면 전체 시스템의 테스트 용이성을 크게 높일 수 있다.