좋은 아키텍처가 지원하는 것들
- 유스케이스
- 운영
- 개발
- 배포
유스케이스
시스템 아키텍처는 반드시 시스템의 요구사항을 지원해야 한다. 명확한 이름을 짓는 것, 유스케이스 단위로 분리하는 것이 유스케이스를 지원하는 좋은 방법이 될 수 있다.
운영
운영시에 어떠한 환경이 필요한지에 대해 고민하다 보면 시스템마다 다른 아키텍처를 가져가게 된다. 어떤 시스템은 실시간 처리를 해야할 수도 있고, 어떤 시스템은 대용량의 데이터를 다루어야 할 수도 있다. 그리고 또 어떤 시스템은 트래픽이 많지 않아 단순한 요청만 처리하는 시스템일 수 있다. 각각의 특징마다 어떤 시스템은 마이크로 서비스로, 어떤 시스템은 모노리틱 구조로 구현하면 된다.
만약 모노리틱 구조로 시스템 아키텍처를 구현하더라도 소스 코드 단계에서 컴포넌트로 잘 분리하였다면 이후 별도의 프로세스 또는 서비스로 전환하는데 도움이 될 것이다.
개발
콘웨이의 법칙
시스템을 설계하는 조직이라면 어디든지 그 조직의 의사소통 구조와 동일한 구조의 설계를 만들어 낼 것이다.
각 개발팀이 독립적으로 개발하는 것을 지원하기 위해 가장 편한 아키텍처를 확보해야 한다. 개발 기간 동안 각 팀이 서로를 방해하지 않도록 격리되어야 하고, 이는 뒤의 배포까지 이어져야 한다.
배포
아키텍처의 배포 관점에서 목표는 즉각적인 배포다. 좋은 아키텍처는 시스템이 빌드된 후 즉각 배포할 수 있도록 지원해야 한다. 이렇게 하기 위해서는 시스템을 컴포넌트 단위로 적절하게 분리하고 적절한 CI/CD 환경을 구성해야 한다.
계층 결합 분리
아키텍트는 단일 책임 원칙과 공통 폐쇄 원칙을 적용하여, 그 의도의 맥락에 따라서 다른 이유로 변경되는 것들을 분리하고, 동일한 이유로 변경되는 것들은 묶는다.
서로 다른 이유로 변경되는 것 중 분명한 것들은 사용자 인터페이스가 변경되는 이유와 비즈니스 로직은 아무런 관련이 없다. 따라서 UI 와 비즈니스 로직은 분리해서 생각해야 한다. 데이터베이스와 쿼리, 스키마도 세부사항이며, 서로 다른 이유로 변경될 것이다. 아키텍트는 이들을 다른 것들과 분리해서 독립적으로 변경할 수 있도록 해야 한다.
수평적인 계층은 UI, 애플리케이션 특화 비즈니스 로직, 애플리케이션과 독립된 비즈니스 로직, 데이터베이스가 될 수 있다.
유스케이스 결합 분리
위의 계층 결합 분리는 유스케이스를 따지지 않고 수평적으로 분리하는 것을 의미한다. 유스케이스 결합 분리는 수직적인 분리라고 이야기하는 것이 편하다. 각각의 유스케이스별로 분할하여 각각의 유스케이스들이 서로 겹치지 않게 만든다. 하나의 유스케이스에는 여러 계층(UI, 비즈니스 로직, 데이터베이스)이 포함될 수 있다.
결합 분리 모드
유스케이스별로 수직적인 분리를 진행하게 된다면 높은 처리량을 보장해야 하는 유스케이스와 낮은 처리량으로도 충분한 유스케이스가 이미 분리되어 있을 가능성이 높다. 계층 결합이 분리되어 있다면 UI와 데이터베이스가 비즈니스 로직과 분리되어 있을 것이고, UI와 데이터베이스는 서로 다른 서버에서 실행될 수도 있다.
계층과 유스케이스의 결합을 분리하는 방법은 아래 세 가지가 있다.
- 소스 수준 분리
- 소스 코드 모듈 사이의 의존성을 제어하여 하나의 모듈이 변하더라도 다른 모듈을 변경하거나 재컴파일하지 않도록 만듬
- 컴포넌트가 같은 주소 공간에서 실행되고, 서로 함수 호출을 통해 통신
- 배포 수준 분리 모드
- 배포 가능한 단위(jar 파일, DDL)들 사이의 의존성을 제어하여 한 모듈의 소스코드가 변하더라도 다른 모듈을 재빌드하거나 재배포하지 않도록 만듬
- 많은 컴포넌트가 같은 주소 공간에 상주하여 함수 호출을 통해 통신
- 다른 프로세스에 존재하는 컴포넌트와는 프로세스 간 통신, 소켓 또는 공유 메모리를 통해 통신
- 서비스 수준 분리 모드
- 의존하는 수준을 데이터 구조 단위까지 낮춰 네트워크 패킷을 통해 통신
- 마이크로 서비스
중복
개발자라면 중복을 피하려고 최대한 노력을 하는게 맞다. 하지만 진짜 중복인지 확인해야 한다. 거짓된 또는 우발적인 중복은 지금은 중복처럼 보이나 몇 년 후에 보면 각자 다른 방식으로 진화하여 다른 형태가 되는 경우다.
두 유스케이스의 화면 구조가 비슷하다고 해도 이는 우발적인 중복일 가능성이 높다. 시간이 지나면서 두 화면은 서로 다른 방향으로 분기하고, 다른 모습을 가지게 될 것이다.
또한 수평으로 계층 분리를 진행할 때 데이터베이스 레코드를 뷰 모델로 사용하고 싶은 충동을 최대한 피해야 한다. 뷰 모델을 별도로 만드는 일은 어렵지 않을 뿐 아니라 계층 간 결합을 분리하여 유지하는데 큰 도움이 된다.