4. 아키텍처 특성 정의
아키텍트는 개발팀과 함께 도메인 또는 비즈니스 요구사항을 정의할 수 있지만, 주로 소프트웨어로 처리할 일 중 도메인 기능과 직접적인 관련이 없는 모든 것들, 즉 아키텍처 특성(architectural characteristic)
을 정의, 발견, 분석하는 일을 수행한다.
아키텍처 특성은 다음 세 가지 기준을 충족한다.
- 비도메인(nondomain) 설계 고려 사항을 명시한다.
- 어플리케이션 설계 시 어플리케이션으로 처리할 일은 구체적인 요구사항으로 정리한다.
- 아키텍처 특성은 이 요구사항을 구현하는 방법, 어떤 선택을 하게 된 이유와 관련된 운영/설계 기준을 명시한다.
- e.g. 일반적으로 어느 정도의 어플리케이션의 성능은 중요한 아키텍처 특성이지만, 요구사항 정의서에는 적혀있지 않는 경우가 허다하다.
- e.g.2 어느 요구사항 정의서에도 ‘기술 부채를 방지한다'는 문구는 따로 없지만, 기술 부채 방지는 아키텍트와 개발자의 당연한 설계 고려사항이다.
- 설계의 구조적 측면에 영향을 미친다.
- 프로젝트 담당 아키텍트가 아키텍처 특성을 기술하는 주된 이유는, ‘이 아키텍처 특성은 어떤 특별한 구조적 요소를 고려해야 하는가?’하는 설계 고려 사항 때문이다.
- e.g. 보안은 사실상 모든 프로젝트의 주요 관심사이고 어느 시스템이건 설계, 코딩 단계부터 기본 보안 지침을 만들어 준수해야 하지만,
- 아키텍트가 뭔가 특별한 것을 설계해야 한다면 보안은 아키텍처 특성 수준으로 격상된다. 결제 시스템을 만든다고 할 때, 서드파티 결제 프로세서를 사용할 때와 어플리케이션 내 내부 처리를 할 때 보안에 대한 아키텍처 처리를 다르게 해줘야 하는 것처럼 말이다.
- 어플리케이션 성공에 절대적으로 중요하다.
- 어플리케이션이 무수히 많은 아키텍처 특성을 전부 다 지원하면 참 좋겠으나, 그러면 안 된다.
- 지원하는 아키텍처 특성을 한 가지만 늘려도 그만큼 설계 복잡도는 가중되기 때문이다.
- 가급적 아키텍처 특성을 적게 선정하는 일도 아키텍트의 중요한 책무이다.
4.1 아키텍처 특성 (일부) 목록
아키텍처 특성은 모듈성 같은 저수준 코드의 특성부터 확장성, 탄력성 같은 복잡한 운영 문제까지 소프트웨어 시스템의 넓은 범위에 고루 존재한다.
4.1.1 운영 아키텍처 특성
- 가용성(availability) : 시스템이 얼마나 오랫동안 사용 가능해야 하나?
- 연속성(continuity) : 재해 복구 능력
- 성능(performance) : 스트레스 테스트, 피크 분석, 기능의 사용 빈도 분석, 필요 용량, 응답 시간
- 복구성(recoverability) : 비즈니스 연속성 요구사항(e.g. 장애 발생 시 얼마나 신속하게 시스템을 재가동시켜야 하나?)
- 신뢰성(reliability)/안전(safety) : 시스템에 페일 세이프(fail-safe, 고장 났을 때 안전한 방향으로 흘러가도록 하는 설계 방식)가 필요한가?
- 견고성(robustness) : 프로그램 실행 중 인터넷 접속 끊김, 정전, 하드웨어 실패 등 에러 및 경계 조건을 감당하는 능력
- 확장성(scalability) : 유저 수, 요청 수가 늘어나도 시스템이 그에 맞는 성능을 발휘하는 능력
4.1.2 구조 아키텍처 특성
- 설정성(configurability) : 최종 유저가 (쓰기 편한 인터페이스를 통해) 소프트웨어 설정을 쉽게 바꿀 수 있는가?
- 신장성(extensibility) : 새로운 기능을 삽입하는 일의 중요성
- 설치성(installability) : 필요한 모든 플랫폼에 시스템을 얼마나 손쉽게 설치할 수 있나?
- 활용성(leverageability)/재사용(reuse) : 공통 컴포넌트를 여러 제품에서 활용할 수 있나?
- 지역성(locality) : 데이터를 입력/조회하는 화면에서 다국어가 지원되는가? 등
- 유지보수성(maintainability) : 시스템을 얼마나 쉽게 변경/개선 할 수 있나?
- 이식성(portability) : 하나 이상의 플랫폼에서 시스템을 실행할 수 있나?
- 지원성(supportability) : 어플리케이션은 어느 정도의 기술 지원을 필요로 하나? 시스템에서 발생한 에러를 디버깅하려면 로깅 및 기타 기능이 어느 수준으로 뒷받침 되어야 하나?
- 업그레이드성(upgradeability) : 이 어플리케이션/솔루션의 구 버전을 새 버전으로 쉽고 빠르게 업그레이드를 할 수 있는가?
4.1.3 아키텍처 공통 특성
- 접근성(accessability) : 색맹, 청각 장애인 등 모든 유저가 접근하는데 불편함이 없나?
- 보관성(archivability) : 데이터를 따로 아카이빙 해야 하나, 아니면 일정 시간 경과 후 삭제해야 하나?
- 인증(authentication) : 유저가 본인이 맞다는 것을 증명하기 위해 필요한 보안 요구사항
- 인가(authorization) : (유스 케이스, 서브 시스템, 웹 페이지, 비즈니스 규칙, 필드 레벨 등) 유저가 어플리케이션에서 정해진 기능만 사용할 수 있도록 강제하는 보안 요구사항
- 합법성(legal) : 시스템 운영상 법적 제약조건이 있는가? (데이터 보호, 사베인스 옥슬리법, GDPR 등) 회사는 어떤 권리를 유보 해야 하나?
- 프라이버시(privacy) : 회사 내부 임직원의 트랜잭션을 외부에 드러내지 않는 기능(e.g. 암호화 트랜잭션은 DBA나 네트워크 아키텍트도 해독이 불가)
- 보안(security) : 데이터를 암호화 한 후 DB에 보관해야 하나? 내부 시스템 간 네트워크 통신도 암호화 해야 하나? 원격 유저 액세스는 어떤 종류의 인증이 필요한가?
- 사용성(usability)/성취성(achievability) : 유저가 어플리케이션/솔루션을 이용하여 원하는 목적을 달성하기 위해 필요한 교육, 훈련 수준
다음은 국제 표준 기구(International Organization for Standardization, ISO)가 발표한 기능별 목록이다.
- 성능 효율(performance efficiency)
- 알려진 조건에서 리소스 양에 비례하는 성능 측정값, 시간 측정, 리소스 사용, 능력 등이 포함된다.
- 호환성(compatibility)
- 제품, 시스템, 컴포넌트가 다른 제품, 시스템, 컴포넌트와 정보를 교환하고(하거나) 동일한 HW/SW 환경을 공유하면서 필요한 기능을 수행할 수 있는 정도.
- 공존(환경과 리소스를 다른 제품과 공유하면서 효율적으로 필요한 기능을 수행할 수 있음)
- 상호운용성(둘 이상의 시스템에 정보를 교환, 활용 가능한 정도)이 포함된다.
- 사용성(usability)
- 유저가 시스템을 원하는 목적에 맞게 효과적으로, 효율적으로, 만족스럽게 사용할 수 있는 정도
- 적합성 인지도(유저가 자신의 사용 목적에 소프트웨어가 부합하는지 인식할 수 있음)
- 학습성(유저가 얼마나 쉽게 소프트웨어 사용법을 익히는가)
- 유저 에러 방지(유저가 실수하는 것을 방지)
- 접근성(사람들이 소프트웨어의 가장 다양한 능력과 기능을 접할 수 있게 함)이 포함된다.
- 신뢰성(reliability)
- 주어진 기간 동안 특정 조건에서 시스템이 기능하는 정도
- 성숙도(정상 동작 시 소프트웨어가 원하는 신뢰성을 보장하는가)
- 가용성(소프트웨어가 가동 중이고 엑세스 가능한가)
- 내고장성(HW/SW가 고장나도 SW가 의도한 대로 작동되나)
- 복구성(소프트웨어가 고장나도 영향 받은 데이터를 되살리고 원하는 시스템 상태로 돌아갈 수 있는가)이 포함된다.
- 보안(security)
- 사람들, 다른 제품, 시스템이 자신의 인증 레벨에 맞게 데이터를 액세스 할 수 있게끔 소프트웨어가 정보를 보호하는 정도.
- 기밀성(데이터는 인증된 사람만 액세스 할 수 있음)
- 무결성(데이터를 함부로 변조하지 못하게 소프트웨어가 허가되지 않은 액세스를 차단함)
- 부인 방지(어떤 액션이나 이벤트가 발생하였음을 증명함)
- 책임 소재(유저가 수행한 액션을 추적)
- 진위(유저 신원을 증명)가 포함된다.
- 유지보수성(maintainability)
- 개발자가 얼마나 효율적으로 소프트웨어를 고쳐 개선/발전시키고 계속 변화하는 환경이나 요구사항에 맞게 적용할 수 있는가
- 모듈성(소프트웨어를 독립된 컴포넌트로 구성할 수 있는 정도)
- 재사용성(개발자가 어떤 자산을 여러 시스템에서, 다른 자산을 구축하는데 다시 사용할 수 있는 정도)
- 분석성(개발자가 얼마나 쉽게 소프트웨어 메트릭을 취합할 수 있나)
- 수정성(개발자가 기존 제품 품질을 떨어뜨리지 않고도 어렵지 않게 소프트웨어를 수정할 수 있나)
- 시험성(개발자나 다른 사람들이 얼마나 쉽게 소프트웨어를 테스트 할 수 있나)이 포함된다.
- 이식성(portability)
- 개발자가 HW/SW 또는 다른 운용 환경에 있는 시스템, 제품, 컴포넌트를 다른 곳에 옮길 수 있는 정도.
- 적응성(개발자가 소프트웨어를 다른 HW, SW, 기타 운용 환경에 맞게 적용시킬 수 있나)
- 설치성(소프트웨어를 주어진 환경에 설치/삭제 할 수 있나)
- 교체성(개발자가 얼마나 쉽게 다른 소프트웨어로 기능을 교체할 수 있는가)이 포함된다.
4.2 트레이드 오프 및 나쁜 것 중에서 제일 나은 아키텍처
시스템을 설계하며 모든 아키텍처 특성을 빠짐없이 최상으로 반영하기란 불가능에 가깝다. 최고의 아키텍처를 고집하지 말고 나쁜 것 중에서 제일 나은 아키텍처를 선택하라. 아키텍처 특성을 너무 욕심내면 모든 비즈니스 문제를 해결하려고 시도하는 일반적인 솔루션이 되어 버린다. 그러나 그런 아키텍처는 설계하기가 대단히 까다롭기 때문에 실현 가능성이 낮다.
아키텍트는 가능한 한 아키텍처 설계를 꾸준히 조금씩 반복해 보는 것이 좋다. 반복의 가치는 애자일 소프트웨어 개발에서도 가장 중요한 교훈 중 하나로, 아키텍처 뿐만 아니라 모든 레벨의 소프트웨어 개발에도 적용된다.
5. 아키텍처 특성 식별
5.1 도메인 관심사에서 아키텍처 특성 도출
아키텍트는 도메인 관심사를 올바르게 해석하여 정확한 아키텍처 특성을 식별해야 한다. 예를 들어, 확장성, 내고장성, 보안, 성능 중 어느 것이 가장 중요한 관심사일까? 네 가지 모두 시스템에 필요한 특성이지만, 아키텍트는 도메인의 핵심 목표와 현재 상황을 고려해서 도메인 관심사를 ‘~성'으로 해석한 후, 그에 따라 정확하고 합리적인 아키텍처 결정을 내려야 한다.
도메인 이해관계자와 협력해서 주요 아키텍처 특성을 정의하느 한 가지 팁은,최종 목록을 가능한 한 짧게 하라는 것이다. 아키텍처에서 가장 흔한 안티패턴 중 하나가, 모든 아키텍처 특성을 지원하는 제네릭 아키텍처(generic architecture)를 설계하려는 것이다. 아키텍처 특성의 개수에 연연하지 말고 가급적 설계를 단순화하는게 좋다.
대부분의 아키텍처 특성은 핵심 도메인 이해관계자들의 의견을 듣고 도메인 관점에서 무엇이 중요한지 의견을 교환하면서 정리된다. 여기서 문제는 아키텍트와 도메인 이해관계자들이 서로 다른 언어로 말을 한다는 것이다. 예를 들어, 아키텍트는 확장성, 상호운용성, 내고장성, 학습성, 가용성을 운운하는데, 도메인 이해관계자는 인수 병합, 고객 만족, 출시 시점, 경쟁 우위를 논하는 식이다. 서로 말이 안 통하기 때문에 각자 상대방을 이해하기가 어렵다.
예를 들어, 도메인 이해관계자가 ‘당일 펀드 종가는 무슨 일이 있어도 제시간에 마감돼야 한다’는 요구사항을 제시했다고 가정해보자. 만약 이 말을 들은 아키텍처가 오로지 성능이 중요한 것이라 착각하고 성능에만 집중한다면 다음과 같은 이유로 실패할 것이다.
- 필요한 시점에서 시스템을 사용할 수 없다면 얼마나 빠른 지는 중요하지 않다.
- 도메인이 더 커지고 펀드가 많이 유입되면 제시간에 종가 계산을 마칠 수 있도록 시스템 규모를 확장할 수 있어야 한다.
- 시스템은 가용성과 더불어 펀드 종가 계산 도중 시스템이 멎는 불상사가 생기지 않도록 안정성도 보장되어야 한다.
- 펀드 종가 계산이 약 85% 완료된 상태에서 시스템이 다운되면? 즉시 시스템을 복구해서 가장 마지막에 펀드 종가가 계산된 시점부터 다시 실행해야 한다.
- 시스템은 빠른 것도 중요하지만 펀드 종가는 정확하게 계산되어야 한다.
5.2 요구사항에서 아키텍처 특성 도출
예상 유저수와 그에 따른 확장 문제는 보통 도메인 관심사에서 빠지지 않는 단골 손님이다. 아키텍트가 알고 있는 도메인 지식에서 도출되는 특성들도 있는데, 이것이 아키텍트가 도메인 지식을 갖고 있으면 이로운 이유이다.
예를 들어, 어느 아키텍트가 대학교 학사 관리 시스템에서 수강 등록을 처리하는 어플리케이션을 설계한다고 가정하자. 계산 편의상, 총 학생 수는 1,000명이고 학생 일인 당 10시간의 수강 신청을 한다고 보면, 등록 기간 중 학생들의 시스템 이용 시간이 고루 분산되리라는 전제 하에 시스템 규모를 일정하게 설계해야 하는가? 아니면, 보통 대학생들의 성향과 습관에 대한 지식을 바탕으로 마감 10분 전부터 1,000명의 학생 모두가 수강 신청을 하려고 달려들어도 문제없는 시스템을 설계해야 하는가? 학생들의 성향을 안다면 답은 너무 쉽다.
참고자료
<소프트웨어 아키텍처 101>, 마크 리처즈, 닐 포드 저, 한빛미디어
'Computer Sci. > SW Architecture' 카테고리의 다른 글
[소프트웨어 아키텍처 101] Ch06. 아키텍처 특성 측정 및 거버넌스 (1) | 2022.05.02 |
---|---|
[소프트웨어 아키텍처 101] Ch03. 모듈성 (0) | 2022.03.08 |
[소프트웨어 아키텍처 101] Ch02. 아키텍처 사고 (0) | 2022.02.02 |
[소프트웨어 아키텍처 101] Ch01. 서론 (0) | 2022.01.21 |