설계 중심의 시스템 구현

필자의 대학원 지도 교수님인 Prof. Scott Shenker 는 컴퓨터 네트워킹 연구에 있어서 뛰어난 업적을 많이 남긴 (그리고 지금도 남기고 있는) 영향력 있는 분이다. 최근 네트워킹 인더스트리에서 유행하는 Software Defined Networking (SDN) 역시 필자가 대학원생이던 2008년 경 그 교수님께서 제안하신 개념이다. 필자는 운이 좋게 그 분 밑에서 수학하며 많은 것을 듣고 배울 수 있었는데, 그 중에서도 ‘큰 그림’ 에 해당하는 시스템 설계에 눈을 뜬 계기가 되었다.

Prof. Scott Shenker 는 전산학이 아닌 물리학 전공자이신데 (그분의 형님은 스탠포드 교수이며 물리학 끈 이론의 대가이다) 그 때문에 교수님께서 구현 자체에 대한 이야기를 하시는 일은 거의 없었다. 대신 그 분과의 미팅에는 많은 블록 다이어그램이 등장하고, 각 블록들의 인터페이스와 블록간의 논리적인 연결 관계들에 대해서 설명을 하셨다. 사실 그렇게 설계 작업을 하고 나면 각 블록들의 구현은 굳이 언급하지 않아도 될만큼 명확했다. 심지어 학부생들에게도 맡길 수 있는 수준이었다.

필자는 대학에서 컴퓨터 공학을 전공하고 넥슨이라는 회사에서 서버 프로그래머로서 긴 시간을 일하면서도, 언제나 알고리즘으로 표현되는 구성 요소의 구현과 동작에 대해서 더 신경을 썼지, 큰 그림을 먼저 그리고 구성 요소간 논리적 연결이나 논리적으로 최소화된 인터페이스에 대해서는 크게 신경을 쓴 적이 없다는 것을 깨달았다. 굳이 프로세스 레벨의 큰 시스템까지 갈 필요도 없이 어떻게 함수를 쪼갤지, 함수의 리턴값이나 인자는 어떻게 정할지는 다분히 그때그때 기분이나 ‘함수가 길어져서’ 와 같은 현실적인 이유에서였지, ‘함수의 목적이나 역할’ 과 같은 논리적인 관점이 아니었다.

잘 돌아가는 블록들을 먼저 갖추고 이를 조합해 시스템을 만드는 것이 bottom-up 의 방식이라면, 큰 그림을 그리고 필요한 블록들의 연결 관계를 정하는 것은 top-down 의 방식이다. 규모가 크지 않은 시스템이라면 이 둘이 별반 차이가 없을지 모르겠으나, 시스템이 일정 규모 이상을 넘어가서 많은 인력이 협업해야되는 경우 설계도 중심의 top-down 방식이 아니고서는 시스템을 개발/운용하는 것이 불가능해진다. 이는 마치 설계도 없이는 건축물을 지을 수 없는 것과 마찬가지다.

여태까지 막연하게 설명을 했는데, 시스템은 특정 목적을 위한 논리적/물리적 구성 요소의 집합체로 이해할 수 있다. 그리고 시스템 설계는 크게 1) 인터페이스 설계2) 아키텍처 설계로 나눠서 생각할 수 있다. 인터페이스 설계는 외부에서 바라봤을 때의 시스템 모습을 결정하는 것이고, 아키텍처 설계는 어떤 기능이 어디에 배치될지와 같은 내부 구조를 결정하는 것이다.

당연한 말이겠지만 이런 설계의 결과에 따라 시스템의 속성은 완전히 달라진다. 인터페이스 설계에 의해 시스템의 사용 편이성이나 외부에 제공하는 서비스의 종류가 결정되며, 아키텍처 설계에 따라 시스템이 할 수 있는 것과 할 수 없는 것이 결정되게 된다.

안타깝게도 시스템 설계에는 자원의 한계나 요구 조건의 상충 같은 문제 때문에, 모든 것이 가능한 시스템을 설계하는 것은 불가능하다. 예를 들어 Eric Brewer 의 CAP 이론에서 알 수 있듯이 일관성(C) 과 가용성(A) 을 보장하면서 네트워크 파티셔닝(P)을 견딜 수 있는 시스템을 만드는 것은 불가능하다. 따라서 시스템 설계에 있어서는 만드는 시스템이 어떤 가정하에서 동작하며, 그 가정이 갖춰질 때 어떤 동작이 보장되며, 어떤 동작이 보장되지 않는지에 대한 트레이드오프를 이해하고 그에 따라 인터페이스와 아키텍처를 설계하는 것이 무엇보다 중요하다.

정리해보면,

시스템의 설계에서는 1) 시스템이 동작하기 위한 전제 조건과 2) 트레이드 오프 요소들을 이해하는 것이 무엇보다 중요하며, 주어진 문제에서 반드시 보장해야되는 것과 보장하지 않아도 되는 것에 따라서 트레이드 오프를 선택하는 과정이 필요하다. 이에 따라 시스템 외부에 노출할 인터페이스를 정하는 작업과, 구성 요소들을 쪼개고 구성 요소간의 연결 관계를 결정하는 아키텍처 작업이 이루어진다.

이런 설계 중심의 시스템 구현에는 다음과 같은 잇점이 있다.

  • 시스템의 직관적인 이해가 용이해진다.
  • 시스템의 유지 보수가 용이해진다. 특히 추후 발생하는 요구 조건이 주어진 시스템 내에서 충돌 없이 구현 가능한지를 쉽게 판단할 수 있다.
  • 인력간의 협업이 편리해진다. 특히 시스템 수명 동안 인력 교체가 발생하더라도 새로 투입된 인력들이 기존 시스템을 이해하고 그 틀 안에서 작업할 수 있는 가이드라인이 된다.
  • 각 구성 요소의 구현에 있어서 스펙이 좀 더 명확히 부각된다.

만일 지금 작업하고 있는 방식이 설계 과정 보다 구현 과정에 치중하고 있다면, 오늘부터는 화이트보드에 시스템 설계도를 그려보고 그에 따라 작업을 해볼 것을 권한다.

다음 컬럼에서는 시스템 설계에 있어서 자주 활용되는 end-to-end 원리에 대한 설명과 TCP/IP 의 시스템 설계 원리에 대해서 살펴보도록 하겠다.

아이펀팩토리 문대경 대표