소프트웨어 아키텍쳐
소프트웨어 아키텍쳐란
프로그램의 기본 구조, 관계를 나타냄
아키텍쳐 설계의 기본 원리
1) 모듈화
나누는 것, 그루핑이라고 생각하면 된다.
ex)
엑셀에서 화면의 메뉴중 홈 탭을 어떻게 구성할 것인가
명령어가 100개이면 어떻게 그룹을 나누어 배치를 할 것인가
너무 그룹을 많이 나누면 모듈간 통합 비용이 발생
2) 추상화
간략화 시킨것
- 과정 추상화: 수행 과정을 추상화 시킴
- 데이터 추상화: 데이터의 세부적인 내용을 추상화 시킴(자료형 등)
- 제어 추상화: 이벤트를 발생시키는 방법을 추상화
ex) 코끼리 그려보라고 하면 대충 그려넣는 것
(불필요한 부분 생략)
3) 단계적 분해
하향식 설계 방법
상위의 중요한 개념에서 구체화시켜나감
처음에는 기능부터 시작하여 알고리즘, 자료구조까지 상세히 표현
4) 정보 은닉
정보를 감추는 것.
다른사람들이 접근하여 변경하지 못하도록 함
소프트웨어 아키텍쳐의 품질 속성
* 시스템 측면
->성능, 보안, 가용성(장애없이 시스템이 흘러가는지 여부), 기능성(사용자의 요구기능을 잘 수행하는가), 사용성(헷갈리지않고 사용가능한가)
* 비즈니스 측면
-> 시장 적시성, 비용, 예상 시스템 수명
* 아키텍쳐 측면
개념적, 무결성, 정확성, 구축 가능성
아케텍쳐의 설계과정
1) 설계 목표 설정
시스템의 개발방향을 명확히 하기 위함
우선순위 결정
2) 시스템 타입 결정
아키텍쳐의 패턴을 선택
3) 아키텍쳐 패턴 적용
시스템의 표준이 될 패턴을 적용
4) 서브시스템 구체화
상호작용내용을 구체화
5) 검토
아키텍쳐 패턴
아키텍쳐 패턴
-> 문제에 대한 전형적인 해결방식
1) 아키텍쳐 패턴의 장점
개발 시간 단축
고품질 소프트웨어를 생산 가능
안정적인 개발
의사소통이 간편해짐
시스템 구조의 대한 이해가 쉬움(유지보수가 쉬움)
2) 패턴 종류
레이어 패턴 | 시스템을 여러 계층으로 나누어 패턴을 구성 ex) OSI 참조모델 |
클라이언트 - 서버 패턴 | 클라이언트가 데이터를 요청하고 받는 패턴 ex) 네이버와 내가 데이터를 요청하고 받는 것 |
파이프-필터 패턴 | 파이프를 통해서 데이터를 주고 받음 |
모델 - 뷰 - 컨트롤러 패턴 | 모델: 데이터 보관 뷰: 보이는 화면 컨트롤러: 사용자에게 받은 입력을 처리하는 부분 |
기타 패턴 | 마스터-슬레이브패턴, 브로커 패턴, 피어-투-피어 패턴, 이벤트-버스 패턴, 블랙보드 패턴, 인터프리터 패턴 등 |
객체지향
객체란
-> 데이터와그 데이터가 수행하는 동작을 포함한 개념
객체 지향
-> 실 세계의 개체를 속성과 메서드가 포함된 형태로 표현
ex) 게임 캐릭터들의 체력(속성) 과 공격(메서드)
객체 지향의 구성 요소
-> 객체, 클래스(공통개념을 모은 틀이며 실제 생성시 인스턴스라고 함), 메시지(객체들간의 상호작용)
객체 지향의 기법
1) 캡슐화: 정보 은닉
2) 상속: 부모의 특징을 물려받음
3) 추상화: 단순화
4) 다형성: 고유한 방법으로 응답하는 것
모듈
모듈화
-> 소프트웨어를 기능별로 분할하는 것
-> 각 모듈은 독립성이 높아야 하고 이 독립성은 결합도(모듈사이의 관련성)와 응집도(모듈 내부의 관련성)에 의해 측정된다.
결합도
한 모듈과 다른 모듈의 관련성을 의미
독립적이기 위해서는 결합도가 낮아야 함
(암기법: 내공이 쌓이면 외제차를 탈수 있는 스텟이 된다... 등...?)
결합도 강함 | 내용 결합도 다른 모듈의 내용을 참조하는가 |
공통 결합도 공통 자료영역을 사용하고 있는가 |
|
외부 결합도 외부 데이터를 모듈간에 같이 사용하고 있는가 |
|
제어 결합도 다른 모듈의 제어요소가 전달될 때 사용 (작업 순서 등) |
|
스템프 결합도 자료 구조가 같이 사용됨 |
|
결합도 약함 | 데이터 결합도 모듈간의 자료 요소로만 결합됨 |
응집도
모듈 내 구성 요소들이 서로 관련되어있는 정도
독립적이기 위해서는 응집도가 높아야 함
응집도 강함 | 기능적 응집도 모듈 내부의 기능 요소들이 단일 문제와 연관됨 |
순차적 응집도 출력 데이터가 다음 활동의 입력데이터로 사용되는 경우 |
|
통신적 응집도 동일한 입력 출력을 사용하지만 다른 기능을 수행 |
|
절차적 응집도 구성요소들이 순차적으로 수행 (순차적 응집도랑 헷갈림 주의) |
|
시간적 응집도 특정 시간에 처리되는 기능을 모음 |
|
논리적 응집도 유사한 성격을 갖는것들을 모음 |
|
응집도 약함 | 우연적 응집도 기타 |
공통 모듈
공통 모듈의 개념
-> 전체 프로그램 기능 중 공통적으로 사용 가능한 모듈
(ex: 자주 사용하는 계산식, 사용자 인증 시스템 등)
공통 모듈의 개념
* 공통 모듈 명세 작성 원칙
정확성: 해당 기능이 필요한 이유를 정확하게
명확성: 해당 기능을 이해할 때 중의적으로 해석되지 않게
완전성: 필요한 모든 것을 기술
일관성: 공통된 기능끼리 상호 충돌이 없게
추적성: 출처, 관련 시스템간 관계 파악
(일관성, 추적성 잘 기억할 것)
코드
주요 기능
-> 자료를 쉽게 추출하기 위한 기호
(식별 기능, 분류 기능, 배열 기능)
ex: 도서관에 있는 책 고유 식별 번호 등
* 중요하니 기억하자
코드의 종류
순차코드 | 발생 순서에 따라 부여 |
블록코드 | 공통된 블럭으로 구분 ex) 100~ 으로 시작하는 사원번호는 인사부 소속이다. 등 |
10진 코드 | 0~9 까지 10진 분할 1000 전자공학 1100 전자 도서 분할등이 여기에 속함 |
그룹 분류 코드 | 대, 중, 소 분류 1 - 01 -001 (본사-인사부-인사 대리) |
연상코드 | 제품을 예측할수 있는 코드 TV-23 (tv 23인치) |
표의 숫자 코드 | 길이, 넓이, 부피, 지름 등을 코드에 적용시킴 3-4-5 (가로-세로-높이) |
합성 코드 | 두개이상의 코드를 조합 KE-811 (대한항공 811기) |
디자인 패턴
생성패턴
객체의 생성과 관련된 패턴
추상팩토리 | 구체적인 클래스에 의존하지 않고 인터페이스로 사용 (객체를 생성하는 메서드를 부모에서 구현 한 것을 자식들이 자기 객체를 주도록 만듬) ex) Computer - [PC, Server] |
빌더 | 필요한 값을 조합해서 생성 |
팩토리 메소드 | 객체생성을 하는데 서브클래스에서 처리하도록함 (부모에서 생성 메서드를 선언해놓고 그 안에서 매개변수에 따라 다양한 자식 오브젝트들을 반환) ex) Computer - [PC, Server] |
프로토타입 | 원본 객체를 복제하는 방식으로 생성 |
싱글톤 | 하나의 객체만 생성될 수 있도록 하고 어디서든 참조가능하도록 함 |
[참고자료]
https://readystory.tistory.com/117?category=822867
https://readystory.tistory.com/119
구조패턴
객체를 조합하여 더 큰 구조로 만들 수 있게 도와줌
여러 인터페이스를 합성하여 하나의 통일된 인터페이스를 제공해줌
어댑터 | 호환성이 없는 클래스를 다른 클래스가 이용할 수 있도록 함 |
브리지 | 추상과 구현을 별도의 클래스에서 구현 ex) Color -Red, Green Shape-Triangle, Pentagon 이렇게 구성이 될 때 Shpae에 Color 를 결합해서 사용하는 것 |
컴포지트(복합체) | 여러 객체를 복합 개체와 단일 개체를 구분없이 다루고자 할 때 (다양한 객체를 묶어서 특정 동작을 실행시킬 때 사용) ex) Shape-[Circle, Triangle] 으로 구성 후 Drawing 이라는 컴포지트를 제작 |
데코레이터 | 객체 결합을 하여 능동적으로 기능 확장 (다른 객체를 덧붙임) ex) Car-BasicCar-CarDecorator-[SportsCar,LuxuryCar] 이렇게 구성하여 SportCar 기능과 LuxuryCar 기능을 결합해서 사용 |
퍼씨드 | 서브시스템을 더 쉽게 사용가능하도록 고수준의 인터페이스를 제공 ex) MySQL, Oracle DB 를 통해 PDF, HTML 양식으로 레포트를 써야 할 때 |
플라이웨이트 | 인스턴스가 필요할 때 매번 생성하는 게 아닌 가능한 공유해서 사용 ex) Shape-Line,Oval 관계일때, 팩토리에 Map 을 만들어서 처음 만든 인스턴스는 저장, 이후에는 여기서 꺼내서 줌 |
프록시 | 접근이 어렵거나 하면 안되는 객체에 연결하려 할 때 객체의 대리자 역할을 수행 ex)명령어를 실행하는 CommandExcecutor 를 클라이언트가 직접 실행하면 위험하니 Proxy를 생성 |
*어댑터, 플라이웨이트 중요
행위패턴
객체들끼리 상호작용 하는 방법
하나의 객체가 수행할 수 없는 것을 여러 객체가 나누어서 작업할 수 있게 해주는 패턴
책임 연쇄 | 처리하지 못한 기능을 다음 객체로 넘김 |
커맨드 | 요청데이터를 객체형태로 캡슐화하여 다음에 또 쓸수 있도록 저장해놓는 패턴 |
인터프리터 | 언어의 문법적인 표현을 정의 |
반복자 | 접근이 잦은 것들은 동일한 인터페이스를 사용 순차적인 접근이 가능 |
중재자 |
복잡한 과정들을 캡슐화하여 객체로 정의하는 패턴 객체사이의 의존성을 줄임 |
메멘토 | 이전 상태로 되돌릴 수 있는 기능 |
옵저버 | 객체상태가 변화되었을 때 변화된 상태를 전달 |
상태 | 동일한 동작을 다르게 처리할 때 사용 |
전략 | 동일한 알고리즘을 개별적으로 캡슐화하여 상호 교환할 수 있도록함 |
템플릿 메소드 | 상위 클래스에서 골격을 정의하고 하위 클래스에서 구체화 |
방문자 | 처리 기능을 분리하여 별도의 클래스에서 구성 |
'정처기' 카테고리의 다른 글
[정처기] 소프트웨어 설계-인터페이스 설계 필기 (0) | 2021.07.15 |
---|