쓸모 있는 모듈러 디자인
모듈러 디자인의 주인공은 “모듈”이지만, “모듈”이 주인공으로 존재하게 만드는 건 “인터페이스”입니다. 정작 모듈러 디자인을 한다고 하면, 모듈에만 집중하게 되는 데 결국 실패하는 건 “인터페이스”를 관리하지 않기 때문입니다.
이번 글에서는 주인공은 아니지만, 모듈러 디자인에서 없어선 안되는 존재인 “인터페이스”에 대해서 알아보겠습니다.
인터페이스 (Interface)라는 말 자체가 서로 얼굴을 맞대고 있는 것을 의미합니다. 모듈과 모듈, 부품과 부품, 서브시스템과 서브시스템, 시스템과 외부 환경 간에 접하고 있는 연결이 인터페이스입니다.
모듈이 인터페이스로 연결이 되어 있기 때문에, 서로 “관계”를 갖게 됩니다. 하나의 모듈이 에너지의 소스가 된다면, 연결된 다른 모듈은 에너지를 전달받는 싱크가 되어야 합니다. 두 개의 모듈이 체결이 되어 있다면, 그 두 개의 모듈은 서로 위치, 동작이 서로 영향을 받는 관계에 있다고 볼 수 있습니다.
모듈들이 인터페이스로 관계가 규정되기 때문에 서로 의존성을 갖게 됩니다. 하나의 모듈에 미치는 영향이 다른 모듈에 영향을 미치게 됩니다. 그 관계가 깊어질수록 의존성은 커집니다. 서로 인터페이스가 없는 모듈들은 서로 의존하지 않는다고 말할 수 있습니다. 가까울수록 의존성은 커집니다.
서로 인터페이스를 갖는 모듈은 서로 의존하게 되고, 그것이 하나의 모듈을 새롭게 설계하거나 수정하는 데 있어서 제약이 됩니다. 이미 연결, 관계, 그리고 그것으로 인한 의존성이 있기 때문에 변화에 대한 제약이 발생합니다. 제약을 이겨내고 변화하기 위해서는 서로 인터페이스는 모듈을 모두 바꿔줘야 합니다.
인터페이스가 서로 다른 모듈 간의 제약이 되기 때문에 하나의 모듈의 변화는 또 하나의 모듈의 변화를 발생시킵니다. 그리고, 그와 연결된 또 하나의 모듈을 변화시킵니다. 즉, 인터페이스는 파생의 경로가 됩니다. 모듈을 바꾸고 싶지 않아도 인터페이스가 존재하는 한 어쩔 수 없이 변화에 영향을 받을 수밖에 없습니다.
변화하지 않기 위해서 모듈 간의 인터페이스를 제거할 순 없습니다. 모듈들이 모여서 온전한 시스템을 이루기 위해서는 인터페이스가 있어야 합니다. 인터페이스가 있어야만 모듈이 각자 자신의 역할을 하고 이것들이 서로 시너지를 내면서 시스템의 목적을 달성하게 됩니다. 즉, 인터페이스는 시스템의 완결성을 만들어내는 데 필요한 조건이 됩니다.
인터페이스를 통해서 모듈 개개별의 역할이 하나의 시스템의 목적 달성에 기여하지만, 모듈들이 개별적으로 독립적인 라이프 사이클을 갖기 위해서는 인터페이스가 표준화가 되어야 합니다. 인터페이스가 변치 않아야만 모듈들이 독립성을 유지할 수 있습니다. 그래서, 인터페이스는 개별 모듈들이 독립적으로 생성, 변화, 활동하기 위한 조건이 됩니다.
모듈이 독립성을 갖고, 시스템이 완결성을 갖기 위해선 인터페이스가 표준화가 되어야 합니다. 인터페이스가 표준화된다는 것은 인터페이스를 준수하면서 모듈을 설계하고 개발해야 함을 의미합니다. 즉, 인터페이스가 제공하는 제약 조건을 지키면서 모듈을 설계하는 것, 그것 자체가 설계 규칙이 됩니다.
모듈은 시간이 지남에 따라서 변할 수 있습니다. 고객 사양이 바뀌고 기술 진보에 따라서 모듈은 바뀔 수 있습니다. 그렇지만, 인터페이스는 바뀌지 않습니다. 제품 아키텍처가 정의된 시점부터 인터페이스는 아키텍처의 운명과 함께 합니다. 물론, 인터페이스가 바뀌는 경우도 있습니다. 그렇지만, 보통 모듈보다는 수명이 길고, 인터페이스의 변화는 최소화해야 합니다. 하위 호환, 상위 호환 문제가 발생하기 때문입니다.
인터페이스는 모듈화 (분할)의 결과이자, 조합의 전제 조건입니다. 인터페이스를 명확히 하고 표준화한다는 건 모듈화를 제대로 했다는 증거이며, 인터페이스를 제대로 관리한다는 건 모듈러 디자인을 제대로 활용하고 있음을 의미합니다.
Image by Dmitriy from Pixabay