신입 개발자 수준에서 SW 아키텍처 까지 관심을 가지고 적용하는 경우는 많지 않은 것 같다.
나 역시도 SW 아키텍쳐를 MVC, Monolithic, 계층형 정도의 키워드로만 어렴풋이 알고 있었다.
원티드에서 프리온보딩 백엔드 과정으로 SW 아키텍처라는 주제를 진행한다고 하여 참가하게 되었다.
1. 도메인
먼저 도메인이란 무엇인가 에 대한 나의 정의는 다음과 같다.
하나의 바운더리로 묶이는 어떠한 영역
도메인에 대한 설명을 들을수록 모호한 것을 느꼈다. 하지만 결국은 단어를 직역한 것과 같이 '영역'이 핵심인 것 같다.
비즈니스를 기준으로 도메인으로 나누자면 금융, 의료, 여행, 부동산 등 여러 영역으로 나눌 수 있을 것이다.
MVC 패턴에서 기능별로 도메인을 나눈것이 Model, View, Controller 라고 표현할 수 있다.
즉, 도메인이라 함은 하나의 바운더리로 묶이는 영역이다.
도메인은 프로그래밍에서 문제를 맞닥들이고 해결해나가야하며 가장 신경써줘야할 곳이라고 표현하기도 한다.
도메인을 세분화해보면
반 버논은 도메인을 다음과 같이 구분했다.
- 메인 도메인 : 비즈니스 전체를 아우르는 도메인
- 서브 도메인 : 메인 도메인에서 영역별로 나눠진 도메인
- 핵심 도메인 : 서브 도메인 중 가장 중요한 비즈니스가 될 도메인
- 지원 서브 도메인 : 서브 도메인 중 필수적이지만 핵심 도메인은 아닌 도메인. 즉, 비즈니스적으로 연관은 되어있는 도메인
- 범용 서브 도메인 : 필수적이지 않고 비즈니스와 직접적 연관은 없지만 전체적으로 사용될 수 있는 도메인
2. SW 아키텍처
SW 아키텍처의 예시는 다음과 같다.
- ModelViewController
- MVVM
- MVT
- Monolithic
- Layered Architecture
- Clean Architecture
- Hexagonal Architecture
- Decentralized Architecture
- Service Oritented Architecture
- Event-based Architecture
- Micro Service Architecture
Monolithic Architecture

모놀리틱은 SW 전체 기능이 하나의 프로그램에 모두 들어있는 것이다.
필자가 진행한 프로젝트도 바로 모놀리틱 아키텍처이다.
전통적이며 개발에 입문하며 가장 먼저 접하게 된다.
장점으로는
- 하나의 프로그램에 모두 들어있으므로 다양한 기능의 유지보수를 한 번에 할 수 있다.
- 외부와의 구조를 설계할 필요가 없으므로 개발이 쉽다.
반대로 단점으로는
- 느린 개발속도
- Scalability 가 작다.
- 세부 기능이 조금만 바뀌어도 전체를 새롭게 배포해야 한다.
- 세부 기능 일부에 에러가 발생해도 전체가 멈출 수 있다.
Decentralized Architecture

영역별로 프로그램을 나누고 서로 연결하여 사용하는 방식이다.
장점으로는
- 일부 기능이 고장나면 해당 기능만 멈춘다.
- Scalability 가 좋다.
- 독립적으로 배포가 가능하다.
단점으로는
- 개발이 어렵다. 구조를 설계해야하고 각 기능별로 개발환경을 가질 수 있다.
- 인프라 비용이 늘어날 수 있다.
- 조직에 대한 오버헤드가 늘어날 수 있다.
- 복잡하다.
아키텍처 별 비교

아키텍처의 중요성
아키텍처의 선택은 시스템의 골격 역할, 품질 속성에 영향을 미치며 시스템을 제안한다. -적정 소프트웨어 아키텍처-
아키텍처는 여러가지 측면에서 중요하다.
- 유지보수
- 코드 가시성
- 테스트의 편리성
- 시스템의 높은 안정성
- 확장성
- 의사소통
아키텍처의 선택으로 인해 수많은 요소들이 영향을 받게 된다. 따라서 경험많은 개발자들이 정확한 분석을 통해 아키텍처를 선택, 설계하는 것이 좋다.
좋은 아키텍처를 만드려면?
일반적으로 좋은 아키텍처는 '경계가 뚜렷한 아키텍처'로 표현할 수 있다. 하지만 각 상황에서 최적의 아키텍처를 선택하거나 설계하는 것이 정답이다.
이를 위해서 다음을 참고하면 좋다.
- 구조를 잘 잡는다.
- 도메인에 매우 많은 시간을 쏟는다.
- 팀원들간의 컨텍스트를 맞추어 공통의 룰을 만든다.
- 문서화를 잘한다.

위 그림과 같이 아키텍처를 잘 설계하는 것이 시간이 흐르면서 위력을 발휘하게 된다.
따라서 좋은 아키텍처를 만들기 위해 끊임없이 노력해야 한다.