[설계] 수직적 분할과 수평적 분할

2022. 12. 13. 17:16CS

아키텍처를 설계하는 행위가 아니더라도, 어플리케이션을 설계하거나 모듈 설계 등 설계라는 행위에서 기본적으로 고려해야 될 것이 분할이라는 생각이 많이 듭니다. 특히 지속가능성(관리, 보수 등)을 고려했을 때 논리적 설계를 MECE하게 정의를 잘 하면 잘 할수록 그로인한 이익이 매우 커지기 때문입니다. 

 

카카오 기술 블로그SK C&C에서 DDD를 적용하는 과정을 보면서 분할이라는 개념을 정말 '잘!' 이해하여야 한다고 생각했고, 최근 하나의 어플리케이션 프로세스를 멀티모듈로 나누는 과정에서 분할의 어려움을 느꼈기에 기본적인 분할의 개념을 한번 정리해보고자 합니다.

 


 

수직적 분할과 횡적(수평적) 분할

일반적으로 분할을 한다고하면 수평적(Horizontal Slicing), 수직적 분할(Vertical Slicing)을 기본 개념으로 나누는 것 같습니다. 그리고 우리말로 변역을 하는 과정에서 수평적 분할은 횡적 분할이라고도 합니다. 개인적으로 이 개념들을 아주 쉽게 설명하는 책은 '그림으로 보는 IT 인프라'라는 책입니다.

 

 

수직적 분할

수직적 분할이란 설계 대상의 서로 다른 역할 관점에서 분할하는 방식을 말한다고 합니다. 아래 그림은 '조대협의 서버사이드 대용량 아키텍처와 성능 튜닝'이라는 책에서 발췌를 하였습니다. 아래 그림을 보면 '고객 신상 정보 조회', '신용도 조회', '포인트 조회', '재고 처리'라는 서로 다른 역할에 따라서 서비스를 분할하였습니다. 이렇게 분할을 하게되면 전체 구조에서 특정 역할이 추가되거나 삭제가 되어도 다른 역할에는 영향을 주지 않기 때문에 느슨한 결합이 가능합니다. 어플리케이션을 개발한다고 했을 때, 객체지향적으로 설계를 하게되면 자연스럽게 나누어지는 부분이기도 합니다.

 

조대협의 서버사이드 대용량 아키텍처와 성능 튜닝 77 페이지 발췌

 

수평적 분할

수평적 분할은 서로 비슷한 역할 관점에서 분할하는 방식을 말한다고 합니다. 위 도식을 기준으로 보겠습니다. 비즈니스 컴포넌트, 모델 컴포넌트, DAO는 수직적 분할 관점에서 나눈 서비스들에서 공통적으로 가지고 있는 컴포넌트들 입니다. 이런 부분들도 공통적인 청사진이 있다면 수직적 분할을 하더라도, 공통적인 청사진을 사용하면서 각각의 다른 역할들에서 필요한 부분들만 개발을 하면 생산성이 더 높아질 수 있습니다.

 

 


정리

세부적으로 따지면 아키텍처, 어플리케이션, 모듈 등 다양한 관점에서 작성을 해야되기 때문에 간략하게 정리만 하였습니다. 위 내용을 요약하면 아래와 같습니다.

  • 수직적 분할 : 서로 다른 역할 관점에서 분할을 한다.
  • 수평적 분할 : 서로 비슷한 역활 관점에서 분할을 한다.

그리고 이러한 두가지 관점을 적절히 섞어서 설계와 개발을 해야지만 더 좋은 구조를 만들 수 있다고 합니다.

 

'그림으로 보는 IT 인프라'라는 책을 보면 이미 이러한 관점은 75년 전 '존 폰 노이만'이라는 미국의 과학자가 고안한 컴퓨터의 기본원리 부터 있던 기술적 개념이며 우리가 공기처럼 사용하는 범용 기계 OS부터 상용 프레임워크 등에까지 광범위하게 사용된다고 합니다.

 

다음 글에서는 설계와 어플리케이션 개발 관점에서 분할과 관련된 개념들을 좀 더 잘 정리해보겠습니다.

 

 

'CS' 카테고리의 다른 글

객체 지향 프로그래밍(Object Oriented Programming)  (0) 2022.11.29