Search

아키텍쳐 패턴은 뭘까?

 들어가며

프로젝트를 진행할 때마다 아키텍쳐 패턴에 대한 이야기를 자주 하게 됩니다. 어떤 패턴을 사용하면 좋을지, 우리 프로젝트에 적합한 패턴은 무엇일지, 이런 다양한 이야기들이 나오는데 결론은 MVVM 을 사용해보자는 의견으로 수렴되는 경우가 많았습니다.
“왜일까?”
프로젝트를 진행하는 팀원들의 대부분이 취준을 목표로 둔지라 채용 페이지에 나오는 우대사항 부분에 민감할 수 밖에 없습니다. 우대 사항에 들어가는 MVVM이라는 단어때문에 MVVM으로 프로젝트를 진행하려는 팀원들을 많이 봤습니다. iOS 개발을 한 지 1년이 되었던 저도 비슷한 생각을 했었습니다. 일단 MVVM이 뭔지 모르지만 MVVM으로 진행해보자 라는 생각이었죠. 하지만 MVVM에 대한 기본적인 개념이 없었고, MVVM를 위해서 프로젝트를 만들어가는 주객전도의 상황이 발생하여 그 때부터 프로젝트를 시작할 때마다 나오는 아키텍쳐 패턴에 대한 논의에 회의적이게 되었습니다.
“아키텍쳐 패턴이 뭔가요?”
MVC, MVVM, MVVM-C, VIPER, RIBS… 각 아키텍쳐 패턴이 가진 특징도 알고 어떤 장점, 단점이 있는지도 공부해본 적이 있습니다. 하지만 저는 핵심인 아키텍쳐 패턴이 뭔지는 모르는 사람이었습니다. 누군가가 아키텍쳐 패턴이 뭐냐고 한다면, 답을 어떻게 해야할지 모르겠더라구요. 아키텍쳐 패턴이 뭔지도 모르면서, 왜 필요한지도 모르면서 일단 아키텍쳐 패턴을 적용해보자! 라는 마음으로 프로젝트를 진행했던 거 같습니다.
“MVVM이 우리 프로젝트에 적합한 것일까? 이렇게 프로젝트의 아키텍쳐 패턴을 선택하는 것이 맞을까?”
아키텍쳐 패턴이 무엇인지 알고 난다면 MVVM이 내가 진행하는 프로젝트에 적합한 패턴인지 알고 선택을 하게 될 겁니다. 어떤 아키텍쳐 패턴을 선택하는게 맞을지에 대한 논의를 진행할 때 대세를 따르지 않고 프로젝트를 위한 아키텍쳐 패턴을 선택하게 될 겁니다.
MVVM를 위한 프로젝트가 아닌, 프로젝트를 위한 MVVM를 도입해보는거죠.

 아키텍쳐(Architecture)

아키텍쳐 패턴에 대해서 알아가기 전에 저는 아키텍쳐가 뭔지 알아가는 시간을 가지고 싶었습니다. 아키텍쳐는 일반적으로 건축이라는 단어로 해석됩니다. 즉, 빌딩과 다른 물리적인 구조물들을 계획하고, 설계하고, 건설하는 과정과 그 결과물을 의미하게 됩니다.
그렇다면, 우리가 자주 쓰는 아키텍쳐는 뭘까요? 건축에서 말하는 구조물들을 계획하고, 설계하고, 건설한다는 의미를 컴퓨터에 맞춰서 나타낸 것이라고 생각이 듭니다.
아키텍쳐를 검색하면 여러가지가 나오는데, 그중 시스템 아키텍쳐와 소프트웨어 아키텍쳐에 대해서 가볍게 알아보고자 합니다.
시스템 아키텍쳐(System Architecture)?
위키 백과에서는 시스템-아키텍쳐에 대한 다양한 정의를 종합해서 이러한 기본 요구 사항이 있다고 적어뒀습니다.
시스템 구성 및 동작 원리를 나타내고 있다.
시스템 구성 요소(부품)에 대해 설계 및 구현을 지원하는 수준으로 자세히 기술된다. (IEEE 1471 또는 TOGAF 등)
구성 요소 간의 관계 및 시스템 외부 환경과의 관계가 묘사된다.
요구 사양 및 시스템의 전체 수명주기를 고려한다.
시스템 전체(하드웨어와 소프트웨어를 포괄한 것)에 대한 논리적인 기능 체계와 그것을 실현하기 위한 구성 방식. 시스템의 전체적인 최적화를 목표로 하고 있다.
시스템 아키텍쳐는 시스템 구성 요소들의 정보 전달을 나타내는 것이고, 요소 간의 관계를 나타내는 것이며, 그 관계에 적용해야 할 규칙을 나타내는 것입니다.
시스템 아키텍쳐는 이 3가지의 요소를 고려해서 설계 및 구현을 수행하는 사람에게 효율적인 기술을 전달하는 지식 전달 수단 또는 규범입니다.
시스템 구성 요소들의 정보 전달
요소 간의 관계
그 관계에 적용해야 할 규칙
즉, 시스템이 어떤 식으로 동작하는지 원리를 나타내는 거죠.
소프트웨어 아키텍쳐(Software Architecture)?
소프트웨어의 골격이 되는 기본 구조이자, 소프트웨어를 구성하는 요소들 간의 관계를 표현하는 시스템의 구조 또는 구조체 입니다.
소프트웨어 아키텍쳐는 소프트웨어 개발 시 적용되는 원칙과 지침이라고 볼 수 있습니다.
소프트웨어 아키텍쳐 설계는
이해 관계자들의 의사소통 도구로 활용될 수 있고
기본적으로 좋은 품질을 유지하면서
사용자의 비기능적 요구사항(품질, 제약사항)으로 나타난 제약을 반영하고
기능적 요구사항(필수 기능)을 구현하는 방법을 찾는
해결 과정입니다.
위에 있는 내용들을 봤을 때, 평소 우리가 얘기하는 아키텍쳐는 소프트웨어 아키텍쳐라는 걸 알 수 있습니다.
소프트웨어 아키텍쳐 설계의 기본 원리에는 모듈화(Modularity), 추상화(Abstraction), 단계적 분해(Stepwise Refinement), 정보 은닉(Information Hiding)이 있는데, 우리가 생각하는 아키텍쳐 패턴들은 기본 원리를 따른다고 볼 수 있겠네요.

 아키텍쳐 패턴(Architecture Pattern)

그렇다면, 아키텍쳐 패턴은 뭘까요? 소프트웨어 아키텍쳐에 대한 정의를 통해서 스스로 정의를 내려보자면, 소프트웨어 아키텍쳐 설계에 관한 기본 템플릿 이라는 생각이 드네요.
위키 사전에 아키텍쳐 패턴에 대해서 검색해보면 이렇게 정의를 내립니다.
An architectural pattern is a general, reusable solution to a commonly occurring problem in software architecture within a given context.  아키텍쳐 패턴은 주어진 상황에서의 소프트웨어 아키텍쳐에서 일반적으로 발생하는 문제점들에 대한 일반화되고 재사용 가능한 솔루션입니다.
정의를 보면 일반적으로 발생하는 문제점이라는 말이 나옵니다.
즉, 아키텍쳐를 설계하는데 발생하는 문제들을 해결하기 위해서 만들어 놓은 전형적인 해결 방식인거죠.
그러니 위에서 말한 MVVM를 위한 프로젝트는 말이 안되는 말이었습니다. 방구인 셈이죠. MVVM이라는 아키텍쳐가 어떠한 문제를 해결하기 위해서 나타나야 하는데, MVVM를 사용하기 위해서 프로젝트를 한다는 건 말이 안되는 상황이었습니다. 밴드를 상처를 아물게 하기 위해서 붙여야 하는데, 어디에 상처가 있는줄도 모르고 밴드를 붙이고 싶어서 그냥 냅다 붙인 겁니다.
그렇다면, 아키텍쳐 패턴은 어떻게 선택하는 게 맞을까요?
새로운 애플리케이션에 사용할 아키텍처 패턴을 정하거나 기존 아키텍처를 평가하려면 먼저 전략적 목표부터 결정해야 한다고 합니다. 그래야 아키텍처를 먼저 선택하고 애플리케이션을 그 구조에 끼워 맞추는 대신, 목표를 지원할 아키텍처를 설계할 수 있기 때문입니다.
우리가 건물을 짓는다고 했을 때, 어떤 건물을 지을지가 명확해진다면 어떤 구조로 집을 지을지가 명확해집니다. 아파트를 짓자는 목표가 생겼는데, 오피스텔 구조도를 가져오는 건 목표에 맞지 않습니다. 우리는 아파트를 짓기 위해서 아파트 구조도를 가져올 것이고, 선택한 구조도를 가지고 자신만의 구조도를 만들어가겠죠.
프로젝트도 마찬가지 입니다. 프로젝트의 설계 목표가 명확해진다면 그에 맞춰서 아키텍쳐 패턴을 선택하면 됩니다.
하지만, 처음부터 알맞은 아키텍쳐 패턴을 선택할 순 없잖아요!
위에서 말한 건물과는 다르게 우리의 프로젝트는 몇 번이고 재설계할 수 있습니다. 그게 소프트웨어의 장점이기도 합니다. 함께 만들어가며 알맞은 아키텍쳐 패턴을 찾으면 된다고 생각이 듭니다.
“왜 아키텍쳐 패턴을 적용해야 하나요?”
왜 아키텍쳐 패턴을 적용해야 할까?
소프트웨어 시스템의 구조를 구성하기 위한 기본적인 윤곽을 제시
서브시스템들과 그 역할이 정의
서브시스템 사이의 관계와 여러 규칙, 지침을 포함
시행착오를 줄여 개발 시간을 단축
검증된 구조로 개발하기 때문에 안정적인 개발이 가능
이해관계자들이 공통된 아키텍쳐를 공유하기 때문에 의사소통이 간편
시스템 구조를 이해하는 것이 쉬워서 개발에 참여하지 않은 사람도 손쉽게 유지 보수를 진행 가능
시스템의 특성을 개발 전에 예측하는 것이 가능
아키텍쳐 패턴을 건축에 빗대어 볼게요. 아키텍쳐 패턴은 아파트를 지을 때, “층고의 높이는 이만큼이 적절하고 복도의 넓이는 이만큼이 좋고, 골조는 이런 재질이 적절하더라” 하는 가이드라인이라고 볼 수 있어요. 해당 가이드라인을 참고해서 우리는 손쉽게 아파트를 설계하겠죠.
하나의 가이드라인이 있기 때문에 안정적으로 아파트를 지을 수 있고, 공통된 가이드라인을 공유하기 때문에 의사소통이 간편해질거예요. 그리고 가이드라인을 안다면 아파트의 구조를 파악하기 쉽기 때문에 누군가가 중간에 투입된다고 해도 빠른 시간 내에 구조를 파악할 겁니다. 그리고 아파트가 다 지어지기 전에 어떤식으로 아파트가 지어질 지 모두가 예측할 수 있습니다.
우리는 아키텍쳐 패턴을 참고해서 손쉽게 프로젝트를 설계할 수 있습니다.

 마치며

이제는 아키텍쳐가 무엇이며, 왜 아키텍쳐 패턴이 필요한지 알게 되었습니다. 단순히 그 패턴을 쓰고 싶어가 아니라 어떤 목표에 따라서 패턴을 사용하고 싶어하는 개발자가 될 수 있을 거 같습니다.
각 아키텍쳐 패턴에 대해 공부할 때 참고가 될 거 같네요.

 참고자료