시험공부겸 마인드맵형식(Xmind로 제작)의 요약본을 올린다 (사진클릭시 원본보기 가능)
크게 아키텍쳐가 무엇인지, 설계원리에 대하여, 모듈화의 품질척도(결합도, 응집도), 소프트웨어 아키텍처 스타일의 대표적인 예 7가지가 있다.
테마가 초록색으로 억지로, 일일이 끼워맞춰놓은 건 초록색을 많이 보면 성격이 좋아진댔다. 그래서 내 페이보릿 컬러가 초록색이기도 하다.
# 아키텍처
화질이 맘에 안 든다.
1. 아키텍처
아키텍처란?
시스템의 구조를 일컫으며, 아키텍처는 컴포넌트, 모듈, 서브시스템 등으로 나누어진다
특히 컴포넌트, 모듈에 대한 의미는 다음과 같다
- 컴포넌트
컴포넌트는 독립적으로 존재하는 시스템의 일부분이다.내 느낌상 어떠한 틀이다. '명백한 역할' 이라고 하지만 이 역할을 규정 짓기에 따라 달린, 두루뭉실한 틀.
명백한 역할을 가지고 있고, 컴포넌트는 같은 기능을 가진 다른 컴포넌트로 대체가 가능하다. - 모듈
프로그래밍 언어 문법 구조에서 정의된 컴포넌트다. 결국엔 컴포넌트의 일종이다어떠한 묶음이라고 생각하면 된다예를 들어 JAVA의 경우에는 메소드/클래스/패키지 등이 있고 C언어로 치면 함수가 존재한다
이러한 아키텍처는 인터페이스와 인터렉션도 포함하고 있으며 결론적으로 품질목표를 만족하는 기능적 요구사항을 위한 개발작업이라고 다시 설명할 수 있다.
2. 비기능적 요구
아키텍처를 배우기 전에 기능적/비기능적 요구에서 배웠으며, 자아세한 내용은 생략하고 이것이 언급되는 이유는 비기능적 요구는 아키텍처에 큰 영향을 주는 요소이기 때문이다.
비기능적 요구에는 기술적제약, 비지니스제약, 품질제약 등이 존재한다.
- 기술적제약
사용해야할 특정 기술을 명시하여 선택을 제한시킨다 - 비지니스제약
경영측면에서의 고객 등을 위한 제한이다 - 품질제약
성능/확장성/변경용이성/사용성/이식성/가용성 등의 요구, *Stakeholder마다 서로 관심이 다를 수 있는 사항들이다
* stakeholder: 이해 관계자
이러한 비기능적 요구는 타협의 여지가 존재하며 "품질의 제약"이 기능적/비지니스 제약보다는 재조정이 수월하다.
다른 말로는 기능적/비지니스 제약은 변경이 어렵다는 얘기가 된다.
3. 패키지 다이어그램
다이어그램을 통해 패키지를 나타내면 SW아키텍처에 효과적이다
UML의 패키지는 서브시스템이고, 패키지 다이어그램은 의미적으로 관련된 클래스를 그룹으롬 묶는 조직화라고 설명할 수 있다. 네임스페이스가 제공되고 중첩도 가능하다.
의존관계 등의 관계표현도 수월하다.
#설계원리
설계원리는 단계적 분할, 추상화. 정보은닉, 모듈화로 나누어서 얘기할 수 있다.
1. 단계적 분할
단계적 분할이라하면 우선 하향적으로 진행되는 분할이다.
진행됨에 따라 더욱 구체적인 내용을 담고 있을 것이며, 이는 소프트웨어 개발의 모든 단계에서 사용이 가능하다
이러한 분할을 통해 얻는 이익으로 현 단계에서 생각할 필요 없는 세부사항을 무시함으로써 중요한 것만 집중할 수 있다는 것이다.
Miler의 법칙이 나오는 이유도 이러한 장점을 의미하기 위해 소개되는 내용이다. 한 번에 집중할 수 있는 정보의 양은 5~9개로 한정되어 있으며, 그러므로 분할시킨 내용에 집중하는 것이 옳다는 것을 뒷받침하는 것이기 때문이다.
2. 추상화
불필요한 것은 신경쓰지말고 필수적 사항만 집중하려는 것이다.
기능 추상화, 자료 추상화, 제어추상화로 나뉜다
(1) 기능 추상화
수행중인 처리작업을 모듈로 간략화시킨다. 즉 수행중인 처리작업을 함수 등으로 묶어내어, 묶어낸 기준에 집중할 수 있게 된다. 이렇게 간략화 시키는 것은 절차중심 프로그래밍에 분할 기준이 되었다
간단한 예로 log함수, sqrt함수가 있다.
(2) 자료 추상화
연산을 통한 데이터 접근만을 허용하기 위해 데이터 내부 구조를 감춘다. 내부 구조는 감추었어도 연산을 통해 접근이 가능하다는 것이고 이것은 객체 지향 패러다임 탄생의 계기가 되어주었다. 객체지향 언어의 특징(정보은닉, 추상화, 상속성, 다형성)이 드러나니까 말이다.
예를 들자면 stack의 원소들이 push-pop연산을 통해서만 접근되는 것과 같다.
(3) 제어 추상화
알고리즘에서 사용하는 제어구조를 간략화하는 것이다
그 예로 순서 구조, if문, for문, semaphore 등이 있다.
3. 정보은닉
시스템의 다른 부분에 존재하는, 알릴 필요가 없는 불필요한 정보를 감춘다
이렇게 은닉하면 한 모듈의 변경이 타 모듈에 영향을 가하는 것을 방지하게 된다
직관적인 이해로는 예를 드는 게 빠르다. JAVA의 접근제어자 중 하나인 private 혹은 JAVA의 메소드 구현 세부사항을 감추는 인터페이스 등이 있다.
4. 모듈화
모듈화는 시스템을 구성요소들로 분해시킨다. 이를 통해 복잡도를 관리할 수 있다
모듈화를 진행하면 앞서 말한 것과 같이 시스템의 복잡도가 감소된다. 그리고 한 모듈을 수정한들 전체 시스템을 재컴파일할 일도 방지될 수 있을 것이다. 그리고 오류가 발생하더라도 모듈단위로 존재하게 될테니 디버깅이 수월하다
이러한 모듈화, 즉 시스템의 나누는 기준으로 '응집도', '결합도'가 존재한다
응집도가 낮을수록, 결합도는 높을수록 분해가 필요하게 된다. (좋지 못한 상태란 것.)
다음 내용은 모듈화의 기준인 응집도와 결합도 내용으로 이어가게 된다.