
본격적으로 정보처리기사가 되기 위한 공부를 해보려고 한다. 필기의 경우 기출이 중요하긴 하지만 그래도 기출 풀어보기 전에 작년에 밤새워가며 죽어라 했던 전공 과목들 기억들 되살릴겸 중요 개념부터 다잡고 가보자.
1과목은 소프트웨어 '설계'다. 어느정도 다 익숙한 내용들이긴 하다.

목차는 위와 같다. 1과목 소프트웨어 설계에서는 다음 4가지가 크게 중요 포인트다.
소프트웨어 개발 생명주기(SDLC, Software Development Life Cycle)
: SW 제품이 기획 단계에서부터 배포, 유지 보수에 이르기까 거치는 전체 과정으로, 품질, 효율성, 비용 절감을 목표로 한다.
요구사항 수집 및 분석
프로젝트의 목적과 목표를 정의하고, 사용자와 이해관계자의 요구사항을 분석한다. 고객이 원하고 필요로 하는 기능을 명확히 파악하는 단계라고 생각하면 된다.
설계 (Design)
요구사항을 바탕으로 시스템의 구조를 설계한다. 여기에는 데이터베이스 구조, 소프트웨어 아키텍처, UI 설계 등이 포함되며, 시스템의 큰 그림과 세부 설계를 포함한다.
구현 (Coding)
설계된 내용을 바탕으로 실제 코드를 작성하여 소프트웨어를 개발한다. 개발된 소프트웨어의 기능이 올바르게 작동하는지 검증할 수 있도록 코딩 표준을 준수하며 진행한다.
테스트 (Testing)
개발이 완료된 소프트웨어를 검증하고, 오류나 결함을 찾아 수정한다. 단위 테스트, 통합 테스트, 시스템 테스트, 사용자 수용 테스트 등 다양한 테스트 과정을 거친다.
유지보수 (Maintenance)
배포 이후 발생하는 문제를 해결하고, 기능을 개선하거나 추가한다. 사용자 피드백을 반영하여 개선할 뿐 아니라, 소프트웨어가 최신 기술에 맞게 지속적으로 발전할 수 있도록 리팩토링한다.




고객의 요구사항 변화에 유연하게 대응하는 모델
위에서 언급한 구조적 개발론에 해당하는 모델들과, 애자일 방법론을 비교한 표이다.

추가로 설계 패러다임도 비교해보자. 구조적 개발과 객체지향을 비교한 표이다.

객체지향은 '재사용성'과 '유지보수'가 중요하다. 뒤에서 더욱 자세히 정리하겠다.
Agile에는 세부 모델들도 몇 가지 존재한다. 이것도 정리해보자.

XP는 5가지 핵심 가치를 기반으로 한다. 주요 포인트니 잘 외워두도록 하자.
'용단커피존'
- 용기(courage)
- 단순성(simplicity)
- 의사소통(communication)
- 피드백
- 존중(Respect)
요구사항 분석이란, 개발 대상에 대한 사용자의 요구사항을 이해하고 문서화(명세화)하는 활동을 의미한다.
SW 개발의 실질적인 첫 단계이며, 사용자 요구의 타당성을 조사하고, 비용과 일정에 대한 제약을 설정한다. 그에 따른 목표와 해결 방식을 결정하는 것까지 포함된다.
또한, 요구사항 개발 프로세스는 다음과 같은 4단계를 따른다.
도출(Elicitation) -> 분석(Analysis) -> 명세(specification) -> 확인(validation)
주요 비기능 요구사항에는 다음과 같은 5가지가 있다.
요구사항 분석 단계에서, '구조적 개발 방법론'에서 사용하는 3가지 핵심 도구들을 알아보자.

데이터가 어디서 들어와서 어떻게 변하고 어디로 나가는지 보여준다. 시간 흐름은 알 수 없으며, 데이터의 흐름에만 집중한다. 구성 요소도 외워두자.



DFD에 등장하는 데이터들의 의미를 약속된 기호로 정의한다. 시험에 기호 의미를 묻는 문제가 자주 출제되니 이미지를 기억해두자.

UML은 시스템 개발자와 고객, 혹은 개발자 상호간의 의사소통을 원활하게 표준화하기 위한 대표적인 객체지향 모델링 언어이다.
다이어그램 구조도는 아래와 같다.

시스템의 정적인 모습을 그린다. 건물의 설계도처럼 '무엇이 있는가'에 집중한다.


클래스들간의 연관관계는 위와 같이 나타낸다.

이건 순서대로 Association(연관), Inheritance(상속), Realization/Implementation(실체화), Dependecny(의존), 집합(Aggregation), 합성(Composition)을 나타내는 화살표들이다. 이 화살표들은 객체 다이어그램에서도 똑같이 사용된다.
연관(Association) ───── "사용한다"
집합(Aggregation) ◇──── "가지고 있다" (부분이 독립 존재 가능)
합성(Composition) ◆──── "구성된다" (부분이 독립 존재 불가)
일반화(Inheritance) ────▷ "상속이다" (is-a)
의존(Dependency) ----→ "잠깐 사용한다"
실체화(Realization) ----▷ "인터페이스 구현"
Object Diagram(객체 다이어그램)

'특정 시점'의 객체 간의 관계를 표현하는 다이어그램이다.
Component Diagram

물리적인 모듈(Component) 간의 구조와 의존성을 표현한다.
Deployment(배치) Diagram

시스템의 물리적인 구조를 보여주며, 어떤 SW가 어떤 하드웨어에서 동작하고 있는지를 보여준다.
Composite Structure(복합체 구조) 다이어그램

클래스나 컴포넌트가 복합 구조를 갖는 경우 그 내부 구조를 표현한다.
Package Diagram

유스케이스나 클래스 드의 모델 요소들을 그룹화한 패키지들의 관계를 표현한다.
구조적 다이어그램을 정리하면 다음과 같다.

시스템의 '동적인 모습'을 그린다. 영화 시나리오처럼 "어떻게 움직이는가"에 집중한다.
Use Case Diagram

사용자와 시스템 간의 상호작용을 '기능 위주'로 표현한다. 주로 사람이 주액터에 해당하고, 주액터의 목적 달성을 위한 외부 시스템인 조직이나 기관이 부액터에 해당한다.
Sequence Diagarm(순차 다이어그램)

객체 간 주고받는 메시지를 '시간 순서'에 따라 표현한다. '시간 순서'를 표현한다는 점에서 매우 중요하며, 가장 출제 비율이 높은 다이어그램이다.
중요한 만큼, 5가지 구성 요소를 살펴 보자.

Actor: 시스템으로부터 서비스를 받는 외부 존재, 사람 모양의 아이콘(stick figure)로 나타낸다.
Object(객체): 메시지를 주고 받는 실체로 '이름:클래스명' 형식으로 표기하며, 사각형(박스)로 나타낸다.
Lifeline(생명선): 객체가 메모리에 존재하는 기간을 의미하며, 객체 아래로 내려오는 점선으로 표기한다. 위에서 아래로 내려오며, 객체가 소멸하면 끝에 'x'표시를 한다.
Message(메시지): 객체 간에 주고 받는 데이터나 지시 사항으로, 실선, 점선, 화살표 등으로 표현한다. 메시지의 종류는 아래와 같다.

Active Box(실행 상자): 객체가 메시지를 받아 실제로 동작 중인 시간을 의미하며, 생명선 위에 그려지는 긴 직사각형으로 표기한다. 이 박스가 길다는 것은 해당 객체가 그만큼 오랫동안 일을 하고 있다는 것을 의미한다.
Communication Diagram

객체 간의 메시지 전달 뿐만 아니라 '연관 관계' 자체에 집중한다.
State Diagram(상태 다이어그램)

하나의 객체가 가질 수 있는 '상태의 변화'를 표현한다. 다른 객체와의 상호 작용에 따른 상태 변화도 표시하며, 모든 가능한 상태와 전이를 표현할 수 있다.
Activity Diagram(활동 다이어그램)

시스템이 어떤 기능을 수행하는지를 개체의 처리 로직이나 조건에 따른 처리의 흐름으로 순서대로 표현한다.
행위 다이어그램을 정리하자면 아래와 같다.

*Stereotype
: UML의 기본 도형(사각형, 화살표)만으로는 표현하기 부족한 추가적인 의미를 덧붙일 때 사용한다.
'Guilemet(길러멧)'이라고 불리는 겹화살표(≪ ≫) 사이에 적는다.
*Rumbaugh(럼바우) 분석 기법(객·동·기)★
: 모든 SW 객체를 객체 -> 동적 -> 기능 모델링 순서로 분석하는 기법이다.
1. 1단계: 객체 모델링; 시스템의 정적 구조를 파악하며 객체 다이어그램을 사용한다.(객객)
2. 2단계: 동적(Dynamic) 모델링; 객체들 간의 제어 흐름, 상태 변화를 파악하며 상태 다이어그램을 사용한다.(동상)
3. 3단계: 기능 모델링; 어떤 데이터가 입력되어 어떤 결과가 나오는지 분석하며, 자료 흐름도(DFD)를 사용한다. (기자)

사용자 인터페이스(UI, User Interface)는 사용자와 디지털 기기/시스템 간의 상호장욕을 매개하는 시각적, 기능적 요소(버튼, 화면, 아이콘, 레이아웃)을 의미한다.
UI는 사용자와 시스템이 어떻게 소통하느냐에 따라 크게 3가지로 나눌 수 있다.
VUI(Voice User Interface, 음성)
OUI(Organic User Interface, 모든 사물이 인터페이스가 됨)
'직유학유'
1. 직관성(Intuitiveness): 굳이 설명하지 않아도 직관적으로 사용법을 알 수 있어야 한다.
2. 유효성(Efficiency): 사용자가 원하는 목적을 정확하고 완벽하게 달성해야 한다(오류 없이)
3. 학습성(Learnability): 처음 쓰는 사람도 배우기 쉬워야 하며, 한 번 배우면 잊어버리지 않아야 한다.
4. 유연성(Flexibility): 사용자의 실수나 요구사항을 최대한 수용하고 오류를 방지해야 한다.


소프트웨어 품질을 6가지로 나눈 국제 표준
'기신사효유이'
SW 아키텍처의 기본 설계 과정은 '설계 목표 설정 -> 시스템 타입 결정 -> 아키텍처 패턴 적용 -> 서브시스템 구체화 -> 검토'의 순서를 따른다.


SW Architecture는 상위&하위 설계로 나눈다.
각 상위 & 하위에 어떤게 속하는지 꼭 기억해두자.
시스템의 전체적인 구조를 결정한다.
상위 구조에서 정한 큰 흐름의 내부를 구체적으로 설계한다.
'하위 설계 - 모듈 설계 - 컴포넌트'를 묶어서 외워두자.

하향식 설계 및 상향식 설계를 할 때 테스트 환경의 보조 도구로 Stub과 Driver를 사용한다.


하향식 소프트웨어 개발을 위한 문서화 도구이다.
아키텍처 패턴 중 하나로, 데이터를 단계별로 처리하는데, 각 단계가 필터 역할을 하고 데이터 전달 통로가 파이프라고 생각하면 된다. 데이터 변환으로 인한 오버헤드가 발생한다.
역시 기사라 그런지 내용이 많긴 한것 같다. 전공 공부하면서 다 한번씩 봤던 내용이라 쓱 보면 되겠지,, 했는데 확실히 시간 투자를 많이 할 필요가 있을 것 같다. 꼭 자격증 때문만은 아니더라도 앞으로 내가 더 공부할 여러 지식들의 기반이 되는 지식이니까 기초를 쌓자라는 느낌으로 더 열심히 공부해봐야겠다.