Computer Science/정보처리기사
[필기] 제1과목 소프트웨어 설계 (3) 애플리케이션 설계
조코링
2022. 7. 3. 22:31
소프트웨어 아키텍처
- 소프트웨어의 기본 구조, 구성 요소들간의 관계
- 소프트웨어 개발의 원칙, 지침 및 개발자들 간 소통의 도구로 사용됨
기본 원리
- 모듈화
- 관련된 기능들끼리 분류, 그룹화
- 모듈의 크기가 작을수록 모듈 개수↑, 단일 모듈 개발 비용↓, 모듈 통합 비용↑
- 모듈의 크기가 클수록 모듈 개수↓, 단일 모듈 개발 비용↑, 모듈 통합 비용↓
- 추상화
- 불필요한 부분은 생략하고 핵심만 남기는 것, 간략화
- 과정 추상화: 자세한 수행 과정은 정의하지 않고, 전반적인 흐름만 파악할 수 있도록 설계
- 데이터 추상화: 데이터의 세부적인 사항은 정의하지 않고, 구조를 대표적으로 표현할 수 있도록 설계
- 제어 추상화: 이벤트(행위) 발생 방법을 자세히 정의하지 않고, 대표할 수 있는 표현으로 설계
- 단계적 분해
- 추상적인 내용에서 점점 구체화 시키는 방식, 하향식 설계 방법
- 기능 > 알고리즘, 자료구조, ...
- 정보 은닉
- 외부에서 변경할 수 없도록 설계하는 방식, 캡슐화
- 필요한 정보만 인터페이스를 통해 주고받을 수 있도록 함
- 모듈 간 영향력이 줄어듦
설계 과정
- 설계 목표 설정: 시스템의 개발 방향, 우선순위, 비즈니스 목표 설정
- 시스템 타입 결정: 아키텍처 패턴 선택
- 아키텍처 패턴 적용: 시스템의 표준 아키텍처 설계
- 서브 시스템 구체화: 상호작용을 위한 인터페이스 정의
- 검토: 설계 목표에 부합하게 설계되었는지 확인
품질 평가 요소
- 시스템 측면: 성능, 보안, 가용성(장애 발생 여부), 기능성, 사용성
- 비즈니스 측면: 시장적시성, 비용, 예상 시스템 수명
- 아키텍처 측면: 개념적 무결성(시스템과 구성 요소 간 일관성 유지 여부), 정확성(사용자 요구사항 충족 여부), 구축 가능성, 변경 가능성, 적응 가능성, 대체성
소프트웨어 아키텍처 패턴
- 소프트웨어 개발에 있어 전형적인 해결 방식, 기본적인 윤곽
- 장점: 개발 시간 단축, 고품질의 소프트웨어 개발 가능, 안정적, 의사소통 원활, 시스템 구조 이해 원활
종류
- 레이어 패턴
- 시스템을 레이어(계층)로 구분, 계층 간 상호작용을 통해 시스템이 작동함
- 고전적 방법
- 예: 네트워크 통신의 OSI 7계층 참조 모델
- 클라이언트-서버 패턴
- 클라이언트(client)가 서버(server)에 요청(request)을 보내면 서버가 이에 대한 응답(response)을 하는 방식
- 서버는 항상 대기 상태를 유지
- 예: 사용자(client)가 네이버(server)에 검색어를 입력하면(request) 검색 결과를 제공받음(response)
- 파이프-필터 패턴
- 각 단계를 필터 컴포넌트로 캡슐화하여 파이프를 통해 전송하는 방식
- 모델-뷰-컨트롤러 패턴(MVC 패턴)
- 컨트롤러(Controller)가 사용자로부터 입력을 받아 모델을 호출하면, 모델(Model)이 데이터에 접근하여 작업을 수행하고, 이 결과를 컨트롤러를 통해 뷰(View)가 받아 화면에 나타내어 사용자에게 보여주는 방식
- 기타
- 마스터-슬레이브 패턴: 마스터로부터 슬레이브가 명령받아 작업을 수행하는 방식
- 브로커 패턴: 사용자의 요청에 따라 알맞게 연결해주는 방식
- 피어-투-피어 패턴: 모든 노드가 클라이언트면서 서버인 방식
- 이벤트-버스 패턴: 특정한 이벤트가 발생되면 처리하는 방식
- 블랙보드 패턴: 모든 컴포넌트들은 블랙보드에 접근하여 검색할 수 있음(해결책이 명확하지 않은 경우 --- 음성인식, 차량식별 등)
- 인터프리터 패턴: 프로그램 코드의 각 라인을 수행하는 방법을 지정하는 방식, 특정 언어로 작성된 프로그램 코드를 해석하기 위한 컴포넌트 개발에 사용
디자인 패턴
소프트웨어 개발 중 세부적인 구현 방안을 설계할 때 참고할 수 있는 문제 해결 방식
생성 패턴
- 객체 생성과 관련된 패턴으로, 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 주지 않도록 유연성을 더해줌
- 추상팩토리: 클래스에 의존하지 않고 인터페이스를 통해 의존하는 객체들의 그룹을 추상적으로 표현
- 빌더: 조합하여 객체를 생성
- 팩토리 메소드: 상위 클래스에서는 인터페이스만 정의하고, 서브 클래스에서 객체 생성을 처리하도록 캡슐화
- 프로토타입: 원본 객체를 복제하는 방식으로 객체를 생성
- 싱글톤: 어디서든 참조할 수 있는 하나의 객체를 생성, 단 여러 프로세스가 동시에 참조할 수는 없음
구조 패턴
- 클래스, 객체 등을 조합하여 더 큰 구조를 만드는 패턴, 복잡한 시스템을 개발하는데 도움을 줌
- 어댑터: 호환성이 없는 클래스를 다른 클래스가 이용할 수 있도록 함, 인터페이스가 일치하지 않았을 때 사용
- 브리지: 기능과 구현을 나누어 별도의 클래스에서 구현
- 컴포지트: 복합 객체와 단일 객체를 구분없이 사용
- 데코레이터: 객체 간 결합을 통해 부가적인 기능들을 확장
- 파사드: 복잡한 서브 클래스의 기능을 간편하게 사용하기 위해 상위 클래스에 인터페이스 구성
- 플라이웨이트: 인스턴스를 매번 생성하지 않고 공유해서 사용, 메모리 절약 가능
- 프록시: 접근이 어려운 객체에 접근하기 위한 인터페이스 역할을 수행
행위 패턴
- 상호 작용, 책임 분배 등 하나의 객체로 수행할 수 없는 작업을 여러 객체에 분배하여 결합도를 최소화
- 책임 연쇄: 하나의 객체가 작업을 처리하지 못하면 다음 객체가 처리하도록 전달
- 커맨드: 요청을 객체 형태로 캡슐화하여 재사용할 수 있도록 함
- 인터프리터: 언어의 문법적인 표현을 정의, SQL이나 통신 프로토콜 개발에 사용
- 반복자: 접근이 잦은 객체에 대해 동일한 인터페이스를 사용, 순차적 접근 가능
- 중재자: 복잡한 상호작용 과정을 객체 형태로 캡슐화, 객체 사이 의존성 감소
- 메멘토: 이전 상태로 되돌리기
- 옵서버: 한 객체가 변화한 경우, 해당 객체를 상속받는 객체들에 변화된 상태를 전달
- 상태: 객체의 상태에 따라 동일한 동작을 다르게 처리
- 전략: 동일한 계열의 알고리즘을 개별적으로 캡슐화하여 상호 교환을 가능하게 함
- 템플릿 메소드: 상위 클래스에서는 골격을 정의하고, 하위 클래스에서는 세부 처리를 구체화
- 방문자: 각 클래스의 처리 기능을 분리하여 별도의 클래스로 구성
객체 지향
- 객체(Object): 데이터와 그 데이터에 관련된 모든 동작을 모두 포함한 개념
- 객체 지향(Object Oriented): 실 세계의 개체(Entity)를 속성(Attribute)와 메소드(Method)가 결합된 형태의 객체(Object)로 표현하는 개념
구성요소
- 객체(Object): 데이터(속성) + 연산(메소드)
- 클래스(Class): 유사한 객체들을 모아 공통된 특성을 표현한 것, 클래스로부터 생성된 새로운 객체는 인스턴스(Instance)라고 부름
- 메시지(Message): 객체들 간 상호작용이 일어나기 위해 필요, 메시지를 통해 객체의 동작이 수행됨
게임(메0플)로 비유를 든다면, 클래스는 직업군, 객체는 사용자의 캐릭터(속성은 체력, 마력 등 / 메소드는 스킬 등)라고 볼 수 있음
객체 지향 기법
- 캡슐화(Encapsulation): 보안을 위해 외부의 접근을 막는 것, 정보 은닉
- 상속(Inheritance): 부모로부터 속성이나 메소드 등을 물려받는 것
- 추상화(Abstraction): 단순화시켜서 나타내는 것
- 다형성(Polymorphism): 고유한 방법으로 응답하는 것, 오버라이딩
모듈화
모듈: 소프트웨어를 각 기능별로 분할한 것, 소프트웨어 구조를 이루는 기본 단위
결합도와 응집도에 의해 독립성을 측정, 독립성이 높을 수록 잘 설계된 것
결합도(Coupling)
- 한 모듈과 다른 모듈 간의 상호의존도, 낮을수록 독립적
- 데이터 결합도(Data coupling): 한 모듈이 다른 모듈로 자료 요소를 전달 --- 결합도가 가장 약함
- 스탬프 결합도(Stamp coupling): 한 모듈이 다른 모듈로 자료 구조를 전달
- 제어 결합도(Control coupling): 한 모듈이 다른 모듈로 제어 요소를 전달
- 외부 결합도(External coupling): 외부로 선언한 데이터를 모듈이 참조, 해당 데이터를 변경할 경우 제한적으로 영향을 끼침
- 공통 결합도(Common coupling): 여러 모듈이 공통의 자료 영역을 사용, 공통 자료를 변경할 경우 사용하는 모든 모듈에 영향을 끼침
- 내용 결합도(Content coupling): 한 모듈이 다른 모듈의 내용을 참조, 내용이 변경되면 영향을 끼침 --- 결합도가 가장 강함
응집도(Cohesion)
- 한 모듈 내에 있는 구성 요소들의 관련성, 높을수록 독립적
- 기능적 응집도(Functional cohesion): 모든 구성 요소들이 단일 문제에 관련됨 --- 응집도가 가장 강함
- 순차적 응집도(Sequential cohesion): 모듈 내 한 구성 요소의 출력값이 다음 구성 요소의 입력값으로 전달됨
- 통신적/교환적 응집도(Communicational cohesion): 모듈 내 구성 요소들이 동일한 입력값과 출력값을 이용하지만 서로 다른 기능을 수행함
- 절차적 응집도(Procedural cohesion): 모듈 내 구성 요소들이 순차적으로 수행됨
- 시간적 응집도(Temporal cohesion): 특정 시간에 처리되는 구성 요소들로 모듈이 구성됨
- 논리적 응집도(Logical cohesion): 유사한 성격을 가지거나 특정 형태를 가지는 구성 요소들로 모듈이 구성됨
- 우연적 응집도(Coincidental cohesion): 모듈 내 구성 요소들 사이 관련성이 없음
공통 모듈
- 전체 프로그램의 기능 중 공통적으로 사용할 수 있는 모듈
- 공통 모듈 명세 작성 원칙
- 정확성: 해당 모듈이 필요한 이유를 정확하게 작성
- 명확성: 중의적으로 해석되지 않도록 작성
- 완전성: 해당 모듈을 구현하기 위해 필요한 모든 것을 작성
- 일관성: 모듈의 기능들이 상호 충돌되지 않도록 작성
- 추적성: 해당 모듈과 관련된 요구사항의 출처, 시스템과의 관계를 파악할 수 있도록 작성
코드
개념
- 컴퓨터를 사용해 자료를 처리하는 과정에서 자료를 쉽게 추출하기 위한 기호
- 주요 기능: 식별(성격에 따라 구분), 분류(기준), 배열(의미 부여)
종류
- 순차 코드: 발생 순서에 따라서, 차례대로 발급하는 코드
- 블록 코드: 공통성이 있는 데이터들끼리 블록으로 구분하는 코드
- 10진 코드: 0부터 9까지 10개의 숫자를 이용하여 분할한 코드(도서분류코드)
- 그룹 분류 코드: 대분류-중분류-소분류로 구성된 코드
- 연상 코드: 연상할 수 있는 코드(TV-23 = 23인치 TV 등)
- 표의(유효) 숫자 코드: 길이, 넓이, 부피, 지름 등 물리적인 수치를 사용한 코드
- 합성 코드: 두 개 이상의 코드를 조합하여 나타낸 코드
※ 강의 링크: https://inf.run/FkNC