본문 바로가기

SearchDeveloper/클린 아키텍처

[6] 17~19 경계

23.09.19

[17] 경계: 선 긋기

소프트웨어 아키텍쳐는 선, 즉 경계를 긋는 기술이다. 아키텍트의 목표는 시스템을 만들고 유지하는데 드는 인적 자원을 최소화하는 것인데, 너무 경계를 일찍 그어버리면 오히려 더 들 수 있다.

일찍 경계를 긋는다는 것: 시스템의 업무 요구 사항, 즉 유즈 케이스와 관련 없은 프레임워크, DB, 웹 서버 등 세부사항을 미리 결정하는 것

나쁜 사례

자사 제품을 웹 버전으로 변환하는 프로젝트 착수. 서버 팜(여러개 서버)을 예상하고 GUI, 미들웨어, DB 가 각각 다른 서버에 있을 것이라 생각하고 개발함.

티어 간 통신이 필요하기 때문에 필드 하나만 추가하려고 해도 통신하기 위해 양방향 4개의 메시지와 8개의 핸들러를 수정해야했음. (변경이 어려움)

그런데 정작 배포하는 시스템은 모두 단일 서버였음.

→ 아키텍처를 너무 이르게 결정해서 개발 비용을 엄청나게 가중시킨 사례

좋은 사례

위키 페이지 만드는 프로젝트를 시작함.

1 단계) 맨 먼저 세부사항인 DB 를 결정하는 것이 아닌 비즈니스 로직인 위키 텍스트를 HTML 로 변환하는 모듈 먼저 구현함

2단계) 실제 데이터가 필요하면 인메모리가 저장하고 개발

3단계) 출력은 DB 까진 필요없다고 판단해서 파일에 쓰도록 구현

→ DB 선택을 끝까지 미룸으로써 결국 DB 를 쓰지 않고도 운영할 수 있는 더 나은 방법을 선택하게 됨

어떻게 선을 그어야 할까?

업무 규칙은 스키마, 쿼리 같은 DB 관련 세부사항에 대해 알아선 안된다. 조회, 저장 같은 함수가 있다는 것만 알아야 한다.

그래서 DB 관련 로직은 인터페이스 뒤에 숨겨놓는다.

업무 규칙은 출력인 GUI 에 대해 몰라야 한다. 출력 종류는 언제든지 바뀔 수 있기 때문이다.

그리고, 고수준은 저수준에 대해 모를 수 있도록 의존성 화살표는 저수준 세부사항에서 고수준 추상화를 향하도록 배치한다.

플러그인 아키텍처

각각의 컴포넌트를 플러그인이라고 하면, 업무규칙에 Mysql 플러그인이든 MongoDB 플러그인이든 GUI 든 쉽게 뺏다 꼽을 수 있는 아키텍처를 플러그인 아키텍처라고 한다.

장점: 플러그인를 손쉽게 생성하고 확장이 가능하고 유지보수가 쉽고 업무 규칙이 독립적으로 분리되어 있다. 결국, 세부사항에 대해 어떤 기술로든 대체를 쉽게 할 수 있다. 그리고 장애에 대해 전파될 수 없는 방화벽을 생성할 수 있다.

[18] 경계 해부학

시스템 아키텍처는 컴포넌트와 그 컴포넌트를 분리하는 경계로 정의한다. 그 중 경계의 다양한 형태에 대해 알아보겠다.

단일체

물리적으로 엄격하게 구분되지 않는 소스 수준 분리 모드

함수 호출로 통신하기 때문에 통신이 빠르고 싸다.

컴포넌트는 소스 코드로 전달된다.

경계 횡단의 가장 단순한 방식: 저수준에서 고수준의 함수 호출

고수준이 저수준을 호출해야한다면 의존성 역전시키기

배포형 컴포넌트

DLL, jar 파일 처럼 라이브러리 단위로 경계가 물리적으로 드러나는 배포 수준 결함 분리 모드

모두 동일한 주소 공간에 있고 함수 호출로 통신하기 때문에 배포 파일 개수만 빼면 단일체와 동일하다.

서비스

가장 강력한 물리적인 경계를 보인다.

물리적 위치에 구애 받지 않아 동일한 프로세서에서도, 네트워크를 통해서도 통신이 이뤄질 수 있다.

[19] 정책과 수준

소프트웨어 시스템은 정책을 기술한 것이다. 프로그램은 입력을 출력으로 변환하는 정책을 상세하게 기술한 설명서이며, 동일한 이유로 동일한 시점에 변경되는 정책은 동일한 수준와 컴포넌트에 위치해야 한다.

수준이란

  • 입력과 출력까지의 거리
  • 입력과 출력 모두로부터 멀리 위치할수록 정책의 수준은 높아진다.
  • 입력과 출력을 다룬 정책은 최하위 수준이다.

예시) 암호화 프로그램

입력받은 문자열을 번역을 통해 암호화된 문자열을 출력한다.

잘못된 구현사례

고수준인 encrypt() 가 저수준인 읽기, 쓰기 모듈에 의존하고 있다.

이렇게 되면 단점: 가장 빈번하고 긴급하게 변경되는 입력, 출력 모듈에 변화가 생기면 졸지에 암호화 모듈에 영향을 줄 수 있다.

더 나은 클래스 다이어그램

고수준에서는 reader, writer 인터페이스를 호출하여 저수준 구현체에 의존하지 않게 함으로써 빈번한 변경에 고수준 encrypt 는 영향 없게 만들 수 있다.

 

레퍼런스

클린 아키텍처 17~19 장

'SearchDeveloper > 클린 아키텍처' 카테고리의 다른 글

[8] 24~26 경계  (0) 2024.01.13
[7] 20~23 업무규칙 & 아키텍처  (1) 2024.01.13
[5] 15~16 아키텍처와 독립성  (1) 2024.01.13
[4] 12~14 컴포넌트  (0) 2023.11.05
[3] 8~11장 SOLID  (0) 2023.11.05