◆2과목 소프트웨어 개발
∎1장 데이터 입·출력 구현
∙자료 구조
: 효율적인 프로그램을 작성할 때 가장 우선적인 고려사항은 저장 공간의 효율성과 실행시간의 신속성이다.
자료 구조는 프로그램에서 사용하기 위한 자료를 기억장치의 공간 내에 저장하는 방법과 저장된 그룹 내에
존재하는 자료 간의 관계, 처리 방법 등을 연구 분석하는 것을 말한다
- 자료의 표현과 그것고 관련된 연산이다
- 일련의 자료들을 조직하고 구조화하는 것이다
- 어떠한 자료 구조에서도 필요한 모든 연산들을 처리할 수 있다
- 자료 구조에 따라 프로그램 실행시간이 달라진다
1. 자료 구조의 분류
- 파일구조 : 순차파일, 색인파일, 직접파일
2. 배열(Array)
: 동일한 자료형의 데이터들이 같은 크기로 나열되어 순서를 갖고 있는 집합이다
- 정적인 자료 구조로 기억장소의 추가가 어렵고, 데이터 삭제 시 데이터가 저장되어 있던 기억장소는 빈 공간으로
남아있어 메모리의 낭비가 발생한다
- 첨자를 이용하여 데이터에 접근한다
- 반복적인 데이터 처리 작업에 적합한 구조이다
- 데이터마다 동일한 이름의 변수를 사용하여 처리가 간편하다
- 사용한 첨자의 개수에 따라 n차원 배열이라고 부른다
3. 선형 리스트(Linear List)
: 일정한 순서에 의해 나열된 자료 구조이다
- 배열을 이용하는 연속 리스트(Contiguous List)와 포인터를 이용하는 연결 리스트(Linked List)로 구분된다
ㄱ. 연속 리스트(Contiguous List)
- 배열과 같이 연속되는 기억장소에 저장되는 자료 구조이다
- 기억장소를 연속적으로 배정받기 때문에 기억장소 이용 효율은 밀도가 1로서 가장 좋다
- 중간에 데이터를 삽입하기 위해서는 연속된 빈 공간이 있어야 하며, 삽입·삭제 시 자료의 이동이 필요하다
ㄴ. 연결 리스트(Linked List)
- 자료들을 반드시 연속적으로 배열시키지는 않고 임의의 기억공간에 기억시키되, 자료 항목의 순서에 따라
노드의 포인터 부분을 이용하여 서로 연결시킨 자료 구조이다
- 노드의 삽입·삭제 작업이 용이하다
- 기억 공간이 연속적으로 놓여 있지 않아도 저장할 수 있다
- 연결을 위한 링크(포인터) 부분이 필요하기 때문에 순차 리스트에 비해 기억 공간의 이용 효율이 좋지 않다
- 연결을 위한 포인터를 찾는 시간이 필요하기 때문에 접근 속도가 느리다
- 중간 노드 연결이 끊어지면 그 다음 노드를 찾기 힘들다
4. 스택(Stack)
: 리스트의 한쪽 끝으로만 자료의 삽입, 삭제 작업이 이루어지는 자료 구조이다
- 가장 나중에 삽입된 자료가 가장 먼저 삭제되는 후입선출(LIFO, Last In First Out) 방식으로 자료를 처리한다
- 스택의 용도 : 재귀 호출, 후위(Postfix) 표기법, 서브루틴 호출, 인터럽트 처리, 깊이 우선 탐색 등과 같이 왔던
길을 되돌아 가는 경우에 사용됨
- 스택의 모든 기억 공간이 꽉 채워져 있는 상태에서 데이터가 삽입되면 오버플로(Overflow)가 발생하며, 더 이상
삭제할 데이터가 없는 상태에서 데이터를 삭제하면 언더플로(Underflow)가 발생한다
- TOP : 스택으로 할당된 기억 공간에 가장 마지막으로 삽입된 자료가 기억된 위치를 가리키는 요소이다
- Bottom : 스택의 가장 밑바닥이다
- 자료의 삽입(Push)
- 자료의 삭제(Pop Up)
5. 큐(Queue)
: 리스트의 한쪽에서는 삽입 작업이 이루어지고 다른 한쪽에서는 삭제 작업이 이루어지도록 구성한 자료 구조이다
- 가장 먼저 삽입된 자료가 가장 먼저 삭제되는 선입선출(FIFO; First In First Out) 방식으로 처리한다
- 시작과 끝을 표시하는 두 개의 포인터가 있다
- 운영체제의 작업 스케줄링에 사용한다
- 프런트(F, Front) 포인터 : 가장 먼저 삽입된 자료의 기억 공간을 가리키는 포인터로, 삭제 작업을 할 때 사용한다
- 리어(R, Rear) 포인터 : 가장 마지막에 삽입된 자료가 위치한 기억 공간을 가리키는 포인터로, 삽입 작업을 할 때
사용한다
6. 그래프(Graph)
: 그래프 G는 정점 V(Vertex)와 간선 E(Edge)의 두 집합으로 이루어진다
- 간선의 방향성 유무에 따라 방향 그래프와 무방향 그래프로 구분된다
- 통신망(Network), 교통망, 이항관계, 연립방정식, 유기화학 구조식, 무향선분 해법 등에 응용된다
- 트리(Tree)는 사이클이 없는 그래프(Graph)이다.
∙트리(Tree)
: 정점(Node, 노드)과 선분(Branch, 가지)을 이용하여 사이클을 이루지 않도록 구성한 그래프(Graph)의 특수한 형태
- 하나의 기억 공간을 노드(Node)라고 하며, 노드와 노드를 연결하는 선을 링크(Link)라고 한다
- 가족의 계보(족보), 조직도 등을 표현하기에 적합하다
- 노드(Node) : 트리의 기본 요소로서 자료 항목과 다른 항목에 대한 가지(Branch)를 합친 것
- 근 노드(Root Node) : 트리의 맨 위에 있는 노드
- 디그리(Degree, 차수) : 각 노드에서 뻗어 나온 가지의 수
- 단말 노드(Terminal Node, =잎노드(Leaf Node)) : 자식이 하나도 없는 노드, 즉 디그리가 0인 노드
- 자식 노드(Son Node) : 어떤 노드에 연결된 다음 레벨의 노드들
- 부모 노드(Parent Node) : 어떤 노드에 연결된 이전 레벨의 노드들
- 형제 노드(Brother Node, Sibling) : 동일한 부모를 갖는 노드들
- 트리의 디그리 : 노드들의 디그리 중에서 가장 많은 수
1. 트리의 운행법
: 트리를 구성하는 각 노드들을 찾아가는 방법을 운행법(Traversal)이라 한다
- 이진 트리를 운행하는 방법은 산술식의 표기법과 연관성을 갖는다
2, 수식의 표기법
: 산술식을 계산하기 위해 기억공간에 기억시키는 방법으로 이진 트리를 많이 사용한다
- 이진 트리로 만들어진 수식을 인오더, 프리오더, 포스트오더로 운행하면 각각 중위(Infix), 전위(Prefix),
후위(Postfix) 표기법이 된다
- Infix 표기를 Postfix나 Prefix로 바꾸기
- Postfix나 Prefix 표기를 Infix로 바꾸기
∙정렬(Sort)
1. 삽입 정렬(Insertion Sort)
: 가장 간단한 정렬 방식으로 이미 순서화된 파일에 새로운 하나의 레코드를 순서에 맞게 삽입시켜 정렬한다
- 두 번째 키와 첫 번째 키를 비교해 순서대로 나열(1회전)하고, 이어서 세 번째 키를 첫 번째, 두 번째 키와 비교해
순서대로 나열(2회전)하고, 계속해서 n번째 키를 앞의 n-1개의 키와 비교하여 알맞은 순서에 삽입하여 정렬하는
방식이다
- 평균과 최악 모두 수행 시간 복잡도는 O(n^2)이다
2. 쉘 정렬(Shell Sort)
: 삽입 정렬(Insertion Sort)을 확장한 개념이다
- 입력 파일을 어떤 매개변수(h)의 값으로 서브파일을 구성하고, 각 서브파일을 Insertion 정렬 방식으로 순서
배열하는 과정을 반복하는 정렬 방식(보통 h = s root n), 즉 임의의 레코드 키와 h값만큼 떨어진 곳의 레코드 키를
비교하여 순서화되어 있지 않으면 서로 교환하는 것을 반복하는 정렬 방식이다
- 입력 파일이 부분적으로 정렬되어 있는 경우에 유리한 방식이다
- 평균 수행 시간 복잡도는 O(n^1.5)이고, 최악의 수행 시간 복잡도는 O(n^2)이다
3. 선택 정렬(Selection Sort)
: n개의 레코드 중에서 최소값을 찾아 첫 번째 레코드 위치에 놓고, 나머지 (n-1)개 중에서 다시 최소값을 찾아
두 번째 레코드 위치에 놓는 방식을 반복하여 정렬하는 방식이다
- 큐(Queue)를 이용하여 정렬한다
- 평균과 최악 모두 수행 시간 복잡도는 O(n^2)이다
4. 버블 정렬(Bubble Sort)
: 주어진 파일에서 인접한 두 개의 레코드 키 값을 비교하여 그 크기에 따라 레코드 위치를 서로 교환하는 정렬
방식이다
- 계속 정렬 여부를 플래그 비트(f)로 결정한다
- 평균과 최악 모두 수행 시간 복잡도는 O(n^2)이다
5. 퀵 정렬(Quick Sort)
: 레코드의 많은 자료 이동을 없애고 하나의 파일을 부분적으로 나누어 가면서 정렬하는 방법으로 키를 기준으로
작은 값은 왼쪽에, 큰 값은 오른쪽 서브파일로 분해시키는 방식으로 정렬한다
- 위치에 관계없이 임의의 키를 분할 원소로 사용할 수 있다
- 정렬 방식 중에서 가장 빠른 방식이다
- 프로그램에서 되부름을 이용하기 때문에 스택(Stack)이 필요하다
- 분할(Divide)과 정복(Conquer)을 통해 자료를 정렬한다
ㄱ. 분할(Divide) : 기준값인 피봇(Pivot)을 중심으로 정렬할 자료들을 2개의 부분집합으로 나눈다
ㄴ. 정복(Conquer) : 부분집합의 원소들 중 피봇(Pivot)보다 작은 원소들은 왼쪽, 피봇(Pivot)보다 큰 원소들은
오른쪽 부분집합으로 정렬한다
ㄷ. 부분집합의 크기가 더 이상 나누어질 수 없을 때까지 분할과 정복을 반복 수행한다
- 평균 수행 시간 복잡도는 O(nlog2n)이고, 최악의 수행 시간 복잡도는 O(n^2)이다
6. 힙 정렬(Heap Sort)
: 완전 이진 트리(Complete Binary Tree)를 이용하여 정렬한 입력 레코드들로 힙을 구성하고 가장 큰 키 값을 갖는
루트 노드를 제거하는 과정을 반복하여 정렬하는 기법이다.
- 구성된 완전 이진 트리를 Heap Tree로 변환하여 정렬한다
- 평균과 최악 모두 시간 복잡도는 O(nlog2n)이다
7. 2-Way 합병 정렬(Merge Sort)
: 이미 정렬되어 있는 두 개의 파일을 한 개의 파일로 합병하는 정렬 방식이다
- 두 개의 키들을 한 쌍으로 하여 각 쌍에 대하여 순서를 정한다
- 순서대로 정렬된 각 쌍의 키들을 합병하여 하나의 정렬된 서브리스트로 만든다
- 위 과정에서 정렬된 서브리스트들을 하나의 정렬된 파일이 될 때까지 반복한다
- 평균과 최악 모두 시간 복잡도는 O(nlog2n)이다
8. 기수 정렬(Radix Sort, =Bucket Sort)
: Queue를 이용하여 자릿수(Digit)별로 정렬하는 방식이다
- 레코드의 키 값을 분석하여 같은 수 또는 같은 문자끼리 그 순서에 맞는 버킷에 분배 하였다가 버킷의 순서대로
레코드를 꺼내어 정렬한다
- 평균과 최악 모두 시간 복잡도는 O(dn)이다
+ 깊이 우선 탐색(Depth First Search), 넓이 우선 탐색(Breath First Search)
+ 이진 탐색(Binary Search)
: 검색할 자료를 반씩 나눠서 나머지 반만 검색하는 방식을 반복하여 자료를 찾는 검색 방법
- 탐색 효율이 좋고 탐색 시간이 적게 소요된다
- 검색할 데이터가 정렬되어 있어야 한다
- 비교횟수를 거듭할 때마다 검색 대상이 되는 데이터의 수가 절반으로 줄어든다
+ 알고리즘 설계 기법
- 분할 정복 / 분할 통치(Divide and Conquer) : 큰 문제를 보다 작은 문제로 분할하여 해결하는 전략
- 동적 계획법(Dynamic Programming) : 아래 단계의 간단한 문제부터 해결하면서 점차 상위로 나아가는 상향식
접근 방식
- 탐욕 알고리즘(Greedy Algorithm) : 완벽한 해결책 보다는 차선책을 목표로 하며, 상황에 맞는 해결책을
즉석에서 모색하는 방식
- 백트래킹(Backtracking) : 깊이우선탐색(Depth First Search) 알고리즘을 이용한 기법으로 문제 해결을 위한
모든 가능성을 트리로 구축하는 방식
∙데이터베이스 개요
1. 데이터저장소
: 소프트웨어 개발 과정에서 다루어야 할 데이터들을 논리적인 구조로 조직화하거나, 물리적인 공간에 구축한 것을
의미한다
- 논리 데이터저장소와 물리 데이터저장소로 구분된다
- 논리 데이터저장소는 데이터 및 데이터 간의 연관성, 제약조건을 식별하여 논리적인 구조로 조직화한 것을
의미한다
- 물리 데이터저장소는 논리 데이터저장소에 저장된 데이터와 구조들을 소프트웨어가 운용될 환경의 물리적 특성을
고려하여 하드웨어적인 저장장치에 저장한 것을 의미한다
- 논리 데이터저장소를 거쳐 물리 데이터저장소를 구축하는 과정은 데이터베이스를 구축하는 과정과 동일하다
2. 데이터베이스
: 특정 조직의 업무를 수행하는데 필요한 상호 관련된 데이터들의 모임으로 다음과 같이 정의할 수 있다
- 통합된 데이터(Integrated Data) : 자료의 중복을 배제한 데이터의 모임이다
- 저장된 데이터(Stored Data) : 컴퓨터가 접근할 수 있는 저장 매체에 저장된 자료이다
- 운영 데이터(Operational Data) : 조직의 고유한 업무를 수행하는데 존재 가치가 확실하고 없어서는 안 될 반드시
필요한 자료이다
- 공용 데이터(Shared Data) : 여러 응용 시스템들이 공동으로 소유하고 유지하는 자료이다
3. DBMS(DataBase Management System; 데이터베이스 관리 시스템)
: 사용자와 인터페이스 사이에서 사용자의 요구에 따라 정보를 생성해주고, 데이터베이스를 관리해주는 소프트웨
- 기존의 파일 시스템이 갖는 데이터의 종속성과 중복성의 문제를 해결하기 위해 제안된 시스템으로, 모든 응용
프로그램들이 데이터베이스를 공용할 수 있도록 관리해준다
- 데이터베이스의 구성, 접근 방법, 유지관리에 대한 모든 책임을 진다
- 필수 기능에는 정의(Definition), 조작(Manipulation), 제어(Control) 기능이 있다
- 정의 : 모든 응용 프로그램들이 요구하는 데이터 구조를 지원하기 위해 데이터베이스에 저장될 데이터의
형(Type)과 구조에 대한 정의, 이용 방식, 제약 조건 등을 명시하는 기능이다
- 조작 : 데이터 검색, 갱신, 삽입, 삭제 등을 체계적으로 처리하기 위해 사용자와 인터페이스 사이의 인터페이스
수단을 제공하는 기능이다
- 제어
ㄱ. 데이터베이스를 접근하는 갱신, 삽입, 삭제 작업이 정확하게 수행되어 데이터의 무결성이 유지되도록
제어해야 한다
ㄴ. 정당한 사용자가 허가된 데이터만 접근할 수 있도록 보안(Security)을 유지하고 권한(Authority)을 검사할 수
있어야 한다
ㄷ. 여러 사용자가 데이터베이스를 동시에 접근하여 데이터를 처리할 때 처리결과가 항상 정확성을 유지하도록
병행 제어(Concurrency Control)를 할 수 있어야 한다
+ 데이터베이스 병행제어의 목적
- 여러 사용자들의 데이터베이스 공동 사용을 최대화
- 사용자의 응답 시간 최소화
- 데이터베이스 시스템의 활용도 최대화
- 데이터베이스의 일관성 유지
4. DBMS의 장·단점
+ 데이터의 독립성
: 종속성에 대비되는 말로 DBMS의 궁극적 목표이기도 합니다
- 논리적 독립성 : 응용 프로그램과 데이터베이스를 독립시킴으로써, 데이터의 논리적 구조를 변경시키더라도
응용 프로그램은 변경되지 않습니다
- 물리적 독립성 : 응용 프로그램과 보조기억장치 같은 물리적 장치를 독립시킴으로써, 데이터베이스 시스템의 성능
향상을 위해 새로운 디스크를 도입하더라도 응용 프로그램에는 영향을 주지 않고 데이터의 물리적 구조만을
변경합니다
5. 스키마(Schema)
: 데이터베이스의 구조와 제약 조건에 관한 전반적인 명세(Specification)를 기술(Description)한 메타데이터
(Meta-Data)의 집합이다
- 데이터베이스를 구성하는 데이터 개체(Entity), 속성(Attribute), 관계(Relationship) 및 데이터 조작 시 데이터
값들이 갖는 제약 조건 등에 관해 전반적으로 정의한다
- 사용자의 관점에 따라 외부 스키마, 개념 스키마, 내부 스키마로 나누어진다
∙절차형 SQL
: C, JAVA 등의 프로그래밍 언어와 같이 연속적인 실행이나 분기, 반복 등의 제어가 가능한 SQL을 의미한다
- 일반적인 프로그래밍 언어에 비해 효율은 떨어지지만 단일 SQL 문장으로 처리하기 어려운 연속적인 작업들을
처리하는데 적합하다
- 다양한 기능을 수행하는 저장 모듈을 생성할 수 있다
- DBMS 엔진에서 직접 실행되기 때문에 입·출력 패킷이 적은 편이다
- BEGIN ~ END 형식으로 작성되는 블록(Block) 구조로 되어 있기 때문에 기능별 모듈화가 가능하다
- 절차형 SQL의 종류
ㄱ. 프로시저(Procedure) : 특정 기능을 수행하는 일종의 트랜잭션 언어로, 호출을 통해 실행되어 미리 저장해 놓은
SQL 작업을 수행한다
ㄴ. 트리거(Trigger) : 데이터베이스 시스템에서 데이터의 입력, 갱신, 삭제 등의 이벤트(Event)가 발생할 때마다
관련 작업이 자동으로 수행된다
ㄷ. 사용자 정의 함수 : 프로시저와 유사하게 SQL을 사용하여 일련의 작업을 연속적으로 처리하며, 종료 시 예약어
Return을 사용하여 처리 결과를 단일값으로 반환한다
1. 절차형 SQL의 테스트와 디버깅
: 디버깅을 통해 기능의 적합성 여부를 검증하고, 실행을 통해 결과를 확인하는 테스트 과정을 수행한다
(테스트를 통해 오류를 발견한 후 디버깅을 통해 오류가 발생한 소스 코드를 추적하며 수정한다)
- 테스트 전에 생성을 통해 구문 오류(Syntax Error)나 참조 오류의 존재 여부를 확인한다
- 많은 코드로 구성된 절차형 SQL의 특성상 오류 및 경고 메시지가 상세히 출력되지 않으므로 SHOW 명령어를
통해 내용을 확인하고 문제를 수정한다
- 정상적으로 생성된 절차형 SQL은 디버깅을 통해 로직을 검증하고, 결과를 통해 최종적으로 확인한다
- 절차형 SQL의 디버깅은 실제로 데이터베이스에 변화를 줄 수 있는 삽입 및 변경관련 SQL문을 주석으로
처리하고, 출력문을 이용하여 화면에 출력하여 확인한다
2. 쿼리 성능 최적화
: 데이터 입·출력 애플리케이션의 성능 향상을 위해 SQL 코드를 최적화하는 것이다
- 쿼리 성능을 최적화하기 전에 성능 측정 도구인 APM을 사용하여 최적화 할 쿼리를 선정해야 한다
- 최적화 할 쿼리에 대해 옵티마이저가 수립한 실행 계획을 검토하고 SQL 코드와 인덱스를 재구성한다
∎2장 통합 구현
∙단위 모듈 테스트
: 프로그램의 단위 기능을 구현하는 모듈이 정해진 기능을 정확히 수행하는지 검증하는 것이다
- 단위 테스트(Unit Test)라고도 하며, 화이트박스 테스트와 블랙박스 테스트 기법을 사용한다
- 단위 모듈 테스트를 수행하기 위해서는 모듈을 단독적으로 실행할 수 있는 환경과 테스트에 필요한 데이터가 모두
준비되어야 한다
- 모듈의 통합 이후에는 오랜 시간 추적해야 발견할 수 있는 에러들도 단위 모듈 테스트를 수행하면 쉽게 발견하고
수정할 수 있다
- 단위 모듈 테스트의 기준은 단위 모듈에 대한 코드이므로 시스템 수준의 오류는 잡아낼 수 없다
1. 테스트 케이스(Test Case)
: 구현된 소프트웨어가 사용자의 요구사항을 정확하게 준수했는지를 확인하기 위해 설게된 입력 값, 실행 조건,
기대 결과 등으로 구성된 테스트 항목에 대한 명세서로, 명세 기반 테스트의 설계 산출물에 해당된다
- 단위 모듈을 테스트 하기 전에 테스트에 필요한 입력 데이터, 테스트 조건, 예상 결과 등을 모아 테스트 케이스를
만든다
- 테스트 케이스를 이용하지 않고 수행하는 직관적인 테스트는 특정 요소에 대한 검증이 누락되거나 불필요한
검증의 반복으로 인해 인력과 시간을 낭비할 수 있다
- ISO/IEC/IEEE 29119-3 표준에 따른 테스트 케이스의 구성 요소
2. 테스트 프로세스
: 테스트를 위해 수행하는 모든 작업들이 테스트의 목적과 조건을 달성할 수 있도록 도와주는 과정이다
- 테스트 프로세스 5단계
ㄱ. 계획 및 제어 단계 : 테스트 목표를 달성하기 위한 계획을 수립하고, 계획대로 진행되도록 제어하는 단계
ㄴ. 분석 및 설계 단계 : 테스트 목표를 구체화하여 테스트 시나리오와 테스트 케이스를 작성하는 단계
ㄷ. 구현 및 실현 단계 : 효율적인 테스트 수행을 위해 테스트 케이스를 조합해 테스트 프로시저에 명세하는 단계,
모듈의 환경에 적합한 단위 테스트 도구를 이용하여 테스트를 수행하는 단계
ㄹ. 평가 단계 : 테스트가 계획과 목표에 맞게 수행도었는지 평가하고 기록하는 단계
ㅁ. 완료 단계 : 이후의 테스트를 위한 참고 자료 및 테스트 수행에 대한 증거 자료로 활용하기 위해 수행 과정과
산출물을 기록 및 저장하는 단계
∎3장 제품 소프트웨어 패키징
∙소프트웨어 패키징
: 모듈별로 생성한 실행 파일들을 묶어 배포용 설치 파일을 만드는 것을 말한다
- 개발자가 아니라 사용자를 중심으로 진행한다
- 소스 코드는 향후 관리를 고려하여 모듈화하여 패키징한다
- 사용자가 소프트웨어를 사용하게 될 환경을 이해하여, 다양한 환경에서 소프트웨어를 손쉽게 사용할 수 있도록
일반적인 배포 형태로 패키징한다
- 신규 및 변경 개발소스를 식별하고, 이를 모듈화하여 상용제품으로 패키징한다
- 고객의 편의성을 위해 매뉴얼 및 버전관리를 지속적으로 한다
1. 패키징 시 고려사항
- 사용자의 시스템 환경, 즉 운영체제(OS), CPU, 메모리 등에 필요한 최소 환경을 정의한다
- UI(User Interface)는 사용자가 눈으로 직접 확인할 수 있도록 시각적인 자료와 함께 제공하고 매뉴얼과 일치시켜
패키징한다
- 소프트웨어는 단순히 패키징하여 배포하는 것으로 끝나는 것이 아니라 하드웨어와 함께 관리될 수 있도록
Managed Service 형태로 제공하는 것이 좋다
- 사용자에게 배포되는 소프트웨어이므로 내부 콘텐츠에 대한 암호화 및 보안을 고려한다
- 다른 여러 콘텐츠 및 단말기 간 DRM(디지털 저작권 관리) 연동을 고려한다
- 사용자의 편의성을 위한 복잡성 및 비효율성 문제를 고려한다
- 제품 소프트웨어 종류에 적합한 암호화 알고리즘을 적용한다
2. 패키징 작업 순서
: 패키징 주기는 소프트웨어 개발 기법에 따라 달라지는데, 짧은 개발 주기를 반복하는 애자일 기법인 경우에는
보통 2~4주 내에서 지정하며, 각 주기가 끝날 때마다 패키징을 수행한다
- 프로젝트 개발 과정에서 주기별로 패키징한 결과물을 테스트 서버에 배포한다
- 마지막 개발 과정을 거쳐 최종 패키징한 결과물은 고객이 사용할 수 있도록 온라인 또는 오프라인으로 배포한다
ㄱ. 온라인 배포 : 별도로 마련한 운영 서버에 설치 및 사용 매뉴얼과 함께 배포 파일을 등록하여 고객이 직접
다운받아 사용할 수 있도록 한다
ㄴ. 오프라인 배포 : CD-ROM이나 DVD, USB 등에 설치 및 사용 매뉴얼과 함께 배포 파일을 담는다
∙디지털 저작권 관리(DRM)
: 저작권자가 배포한 디지털 콘텐츠가 저작권자가 의도한 용도로만 사용되도록 디지털 콘텐츠의 생성, 유통,
이용까지의 전 과정에 걸쳐 사용되는 디지털 콘텐츠 관리 및 보호 기술이다
- 원본 콘텐츠가 아날로그인 경우에는 디지털로 변환한 후 패키저(Packager)에 의해 DRM 패키징을 수행한다
- 콘텐츠의 크기에 따라 음원이나 문서와 같이 크기가 작은 경우에는 사용자가 콘텐츠를 요청하는 시점에서
실시간으로 패키징을 수행하고, 크기가 큰 경우에는 미리 패키징을 수행한 후 배포한다
- 패키징을 수행하면 콘텐츠에는 암호화된 저작권자의 전자서명이 포함되고 저작권자가 설정한 라이선스 정보가
클리어링 하우스(Clearing House)에 등록된다
- 사용자가 콘텐츠를 사용하기 위해서는 클리어링 하우스에 등록된 라이선스 정보를 통해 사용자 인증과 콘텐츠
사용 권한 소유 여부를 확인받아야 한다
- 종량제 방식을 적용한 소프트웨어의 경우 클리어링 하우스를 통해 서비스의 실제 사용량을 측정하여 이용한 만큼의
요금을 부과한다
1. 디지털 저작권 관리의 흐름 및 구성 요소
- 클리어링 하우스(Clearing House) : 저작권에 대한 사용 권한, 라이선스 발급, 암호화된 키 관리, 사용량에
따른 결제 관리 등을 수행하는 곳
- 콘텐츠 제공자(Contents Provide) : 콘텐츠를 제공하는 저작권자
- 패키저(Packager) : 콘텐츠를 메타 데이터와 함께 배포 가능한 형태로 묵어 암호화하는 프로그램
- 콘텐츠 분배자(Contents Distributor) : 암호화된 콘텐츠를 유통하는 곳이나 사람
- 콘텐츠 소비자(Customer) : 콘텐츠를 구매해서 사용하는 주체
- DRM 컨트롤러(DRM Controller) : 배포된 콘텐츠의 이용 권한을 통제하는 프로그램
- 보안 컨테이너(Security Container) : 콘텐츠 원본을 안전하게 유통하기 위한 전자적 보안 장치
2. 디지털 저작권 관리의 기술 요소
∙소프트웨어 설치 매뉴얼 작성
: 개발 초기에서부터 적용된 기준이나 사용자가 소프트웨어를 설치하는 과정에 필요한 내용을 기록한 설명서와
안내서이다
- 설치 매뉴얼은 사용자 기준으로 작성한다
- 설치 시작부터 완료할 때까지의 전 과정을 빠짐없이 순서대로 설명한다
- 설치 과정에서 표시될 수 있는 오류 메시지 및 예외 상황에 관한 내용을 별도로 분류하여 설명한다
- 소프트웨어 설치 매뉴얼에는 목차 및 개요, 서문, 기본 사항 등이 기본적으로 포함되어야 한다
- 목차에는 전체 설치 과정을 순서대로 요약한 후 관련 내용의 시작 페이지를 함께 기술한다
- 개요에는 설치 매뉴얼의 주요 특징, 구성과 설치 방법, 순서 등의 내용을 기술한다
1. 서문
: 문서 이력, 설치 매뉴얼의 주석, 설치 도구의 구성, 설치 환경 체크 항목을 기술한다
- 설치 매뉴얼의 주석 : 주의 사항과 참고 사항을 기술한다
ㄱ. 주의 사항 : 소프트웨어를 설치할 때 사용자가 반드시 알고 있어야 하는 중요한 내용을 기술한다
ㄴ. 참고 사항 : 설치에 영향을 미칠 수 있는 사용자의 환경이나 상황에 대한 내용을 기술한다
- 설치 도구의 구성
ㄱ. exe, dll, ini, chm 등의 설치 관련 파일에 대해 설명한다
ㄴ. 폴더 및 설치 프로그램 실행 파일에 대해 설명한다
ㄷ. 설치 과정 및 결과가 기록되는 log 폴더에 대해 설명한다
- 설치 환경 체크 항목
2. 기본 사항
3. 설치 매뉴얼 작성 방법
: 사용자가 설치 과정을 이해하기 쉽도록 설치 화면을 누락 없이 캡처하고 순서대로 상세히 설명한다
ㄱ. 설치 화면 및 UI
- 설치 실행 : exe 등의 설치(Install) 파일을 실행할 수 있도록 관련 실행 화면에 대한 이미지를 첨부하여 설명
- 메인 화면 및 안내창 : 설치 시 나타나는 메인 화면과 각 과정에서의 안내창에 대한 이미지를 첨부하여 설명
ㄴ. 설치 이상 메시지 설명
- 설치 방법이나 설치 환경이 잘못된 경우 표시될 수 있는 메시지에 대해 설명한다
- 설치 과정별로 참고할 사항이나 주의할 사항에 대한 메모를 추가한다
ㄷ. 설치 완료 및 결과
- 설치 완료 화면을 수록하여 설치가 정상적으로 마무리되었음을 사용자에게 최종적으로 알려준다
ㄹ. FAQ
- 설치 과정에서 사용자가 직면할 수 있는 문제 상황에 대비할 수 있도록, 설치 시 발생할 수 있는 다양한
상황을 FAQ로 정리하여 수록한다
ㅁ. 설치 시 점검 사항
- 설치 전 사용자의 설치 환경에 따라 점검해야 할 사항들이 무엇인지 설명한다
- 설치에 필요한 사용자 계정 및 설치 권한에 대해 확인할 수 있도록 설명한다
- 설치 과정에서 오류가 발생할 경우 점검할 수 있는 사항들에 대해 설명한다
ㅂ. Network 환경 및 보안
- 네트워크 오류로 인해 설치 시 문제가 발생하지 않도록 사전에 필요한 네트워크 연결 상태를 점검하도록
안내한다
- 보안이나 방화벽으로 인해 설치 시 문제가 발생하지 않도록 관련된 내용을 안내한다
ㅅ. 고객 지원 방법(Customer Support)
- 설치와 관련하여 기술적인 지원이나 소프트웨어에 대한 서비스를 원할 경우 국가, 웹사이트, 전화번호,
이메일 등 문의할 수 있는 연락처를 안내한다
ㅇ. 준수 정보 & 제한 보증(Compliance Information & Limited Warranty)
- Serial 보존, 불법 등록 사용 금지 등에 대한 준수 사항을 안내한다
- 저작권자 소유권 정보, SW 허가권 정보, 통신 규격, 개발 언어, 연동 프로그램, 문서 효력, 지적 소유권 정보
등과 관련된 내용을 안내한다
4. 설치 매뉴얼 작성 순서
∙소프트웨어 사용자 매뉴얼 작성
: 사용자가 소프트웨어를 사용하는 과정에서 필요한 내용을 문서로 기록한 설명서와 안내서이다
- 사용자 매뉴얼은 사용자가 소프트웨어 사용에 필요한 절차, 환경 등의 제반 사항이 모두 포함되도록 작성한다
- 소프트웨어 배포 후 발생될 수 있는 오류에 대한 패치나 기능에 대한 업그레이드를 위해 매뉴얼의 버전을 관리한다
- 개별적으로 동작이 가능한 컴포넌트 단위로 매뉴얼을 작성한다
- 컴포넌트 명세서와 컴포넌트 구현 설계서를 토대로 작성한다
- 목차 및 개요, 서문, 기본 사항 등이 기본적으로 포함되어야 한다
- 목차에는 매뉴얼 전체 내용을 순서대로 요약한 후 관련 내용의 시작 페이지를 함께 기술한다
- 개요에는 소프트웨어의 주요 특징, 매뉴얼의 구성과 실행 방법, 사용법, 항목별 점검 기준, 항목별 설정 방법 등에
대한 내용을 기술한다
1. 사용자 매뉴얼 작성 순서
∙소프트웨어 버전 등록
1. 소프트웨어 패키징의 형상 관리
: 형상 관리(SCM; Software Configuration Management)는 소프트웨어의 개발 과정에서 소프트웨어의 변경
사항을 관리하기 위해 개발된 일련의 활동이다
- 소프트웨어 변경의 원인을 알아내고 제어하며, 적절히 변경되고 있는지 확인하여 해당 담당자에게 통보한다
- 소프트웨어 개발의 전 단계에 적용되는 활동이며, 유지보수 단계에서도 수행된다
- 소프트웨어 개발의 전체 비용을 줄이고, 개발 과정의 여러 방해 요인이 최소화되도록 보증하는 것을 목적으로
한다
- 관리 항목 : 소스 코드, 프로젝트 계획, 분석서, 설계서, 지침서, 프로그램, 테스트 케이스 등
- 형상 관리를 통해 가시성과 추적성을 보장함으로써 소프트웨어의 생산성과 품질을 높일 수 있다
- 대표적인 형상 관리 도구에는 Git, CVS, Subversion 등이 있다
2. 형상 관리의 중요성
- 지속적인 소프트웨어의 변경 사항을 체계적으로 추적하고 통제할 수 있다
- 제품 소프트웨어에 대한 무절제한 변경을 방지할 수 있다
- 제품 소프트웨어에서 발견된 버그나 수정 사항을 추적할 수 있다
- 소프트웨어는 형태가 없어 가시성이 결핍되므로 진행 정도를 확인하기 위한 기준으로 사용될 수 있다
- 소프트웨어의 배포본을 효율적으로 관리할 수 있다
- 소프트웨어를 여러 명의 개발자가 동시에 개발할 수 있다
3. 형상 관리 기능
: 형상 관리는 품질 보증을 위한 중요한 요소로서 다음과 같은 기능을 수행한다
- 형상 식별 : 형상 관리 대상에 이름과 관리 번호를 부여하고, 계층(Tree) 구조로 구분하여 수정 및 추적이
용이하도록 하는 작업
- 버전 제어 : 소프트웨어 업그레이드나 유지 보수 과정에서 생성된 다른 버전의 형상 항목을 관리하고, 이를 위해
특정 절차와 도구(Tool)를 결합시키는 작업
- 형상 통제(변경 관리) : 식별된 형상 항목에 대한 변경 요구를 검토하여 현재의 기준선(Base Line)이 잘 반영될 수
있도록 조정하는 작업으로 변경 통제는 형상 통제 위원회(CCB)의 승인을 통해 이루어진다
- 형상 검사 : 기준선의 무결성을 평가하기 위해 확인, 검증, 검열 과정을 통해 공식적으로 승인하는 작업
- 형상 기록(상태 보고) : 형상의 식별, 통제, 감사 작업의 결과를 기록·관리하고 보고서를 작성하는 작업
4. 소프트웨어의 버전 등록 관련 주요 기능
: 소프트웨어 개발 과정에서 코드와 라이브러리, 관련 문서 등의 버전을 관리하기 위해 자료를 등록하고 갱신하는
과정에서 사용되는 주요 용어와 의미는 다음과 같다
5. 소프트웨어 버전 등록 과정
∙소프트웨어 버전 관리 도구
1. 공유 폴더 방식
: 버전 관리 자료가 로컬 컴퓨터의 공유 폴더에 저장되어 관리되는 방식
- 개발자들은 개발이 완료된 파일을 약속된 공유 폴더에 매일 복사한다
- 담당자는 공유 폴더의 파일을 자기 PC로 복사한 후 컴파일 하여 이상 유무를 확인한다
- 이상 유무 확인 과정에서 파일의 오류가 확인되면, 해당 파일을 등록한 개발자에게 수정을 의뢰한다
- 파일에 이상이 없다면 다음날 각 개발자들이 동작 여부를 다시 확인한다
- 파일을 잘못 복사하거나 다른 위치로 복사하는 것에 대비하기 위해 파일의 변경사항을 데이터베이스에 기록하여
관리한다
- 종류 : SCCS, RCS, PVCS, QVCS 등
2. 클라이언트/서버 방식
: 버전 관리 자료가 중앙 시스템(서버)에 저장되어 관리되는 방식
- 서버의 자료를 개발자별로 자신의 PC(클라이언트)로 복사하여 작업한 후 변경된 내용을 서버에 반영한다
- 모든 버전 관리는 서버에서 수행된다
- 하나의 파일을 서로 다른 개발자가 작업할 경우 경고 메시지를 출력한다
- 서버에 문제가 생기면, 서버가 복구되기 전까지 다른 개발자와의 협업 및 버전 관리 작업은 중단된다
- 종류 : CVS, SVN(Subversion), CVSNT, Clear Case, CMVC, Perforce 등
3. 분산 저장소 방식
: 버전 관리 자료가 하나의 원격 저장소와 분산된 개발자 PC의 로컬 저장소에 함께 저장되어 관리되는 방식
- 개발자별로 원격 저장소의 자료를 자신의 로컬 저장소로 복사하여 작업한 후 변경된 내용을 로컬 저장소에서 우선
반영(버전 관리)한 다음 이를 원격 저장소에 반영한다
- 로컬 저장소에서 버전 관리가 가능하므로 원격 저장소에 문제가 생겨도 로컬 저장소의 자료를 이용하여 작업할 수
있다
- 종류 : Git, GNU arch, DCVS, Bazaar, Mercurial, TeamWare, Bitkeeper, Plastic SCM 등
4. Subversion(서브버전, SVN)
: CVS를 개선한 것으로, 아파치 소프트웨어 재단에서 2000년에 발표하였다
- 클라이언트/서버 구조로, 서버(저장소, Repository)에는 최신 버전의 파일들과 변경 내역이 관리된다
- 서버의 자료를 클라이언트로 복사해와 작업한 후 변경 내용을 서버에 반영(Commit)한다
- 모든 개발 작업은 trunk 디렉터리에서 수행되며, 추가 작업은 branches 디렉터리 안에 별도의 디렉터리를
만들어 작업을 완료한 후 trunk 디렉터리와 병합(merga)한다
- 커밋(Commit)할 때마다 리비전(Revision)이 1씩 증가한다
- 클라이언트는 대부분의 운영체제에서 사용되지만, 서버는 주로 유닉스를 사용한다
- 소스가 오픈되어 있어 무료로 사용할 수 있다
- CVS의 단점이었던 파일이나 디렉터리의 이름 변경, 이동 등이 가능하다
- Subversion의 주요 명령어
5. Git(깃)
: 리누스 토발즈(Linus Torvalds)가 2005년 리눅스 커널 개발에 사용할 관리 도구로 개발한 이후 주니오 하마노
(Junio Hamano)에 의해 유지 보수되고 있다
- 분산 버전 관리 시스템으로 2개의 저장소, 즉 지역(로컬) 저장소와 원격 저장소가 존재한다
- 지역 저장소는 개발자들이 실제 개발을 진행하는 장소로, 버전 관리가 수행된다
- 원격 저장소는 여러 사람들이 협업을 위해 버전을 공동 관리하는 곳으로, 자신의 버전 관리 내역을 반영하거나
다른 개발자의 변경 내용을 가져올 때 사용한다
- 버전 관리가 지역 저장소에서 진행되므로 버전 관리가 신속하게 처리되고, 원격 저장소나 네트워크에 문제가
있어도 작업이 가능하다
- 브랜치를 이용하면 기본 버전 관리 틀에 영향을 주지 않으면서 다양한 형태의 기능 테스팅이 가능하다
- 파일의 변화를 스냅샷(Snapshot)으로 저장하는데, 스냅샷은 이전 스냅샷의 포인터를 가지므로 버전의 흐름을 파악
할 수 있다
- Git의 주요 명령어
∙빌드 자동화 도구
: 빌드란 소스 코드 파일들을 컴파일 한 후 여러 개의 모듈을 묶어 실행 파일로 만드는 과정이며, 이러한 빌드를
포함하여 테스트 및 배포를 자동화하는 도구를 빌드 자동화 도구라고 한다
- 애자일 환경에서는 하나의 작업이 마무리될 때마다 모듈 단위로 나눠서 개발된 코드들이 지속적으로 통합되는데,
이러한 지속적인 통합(Continuous Integration) 개발 환경에서 빌드 자동화 도구는 유용하게 활용된다
- 빌드 자동화 도구에는 Ant, Make, Maven, Gradle, Jenkins 등이 있으며, 이중 Jenkins와 Gradle이 대표적이다
1. Jenkins
: JAVA 기반의 오픈 소스 형태로, 가장 많이 사용되는 빌드 자동화 도구이다
- 서블릿 컨테이너에서 실행되는 서버 기반 도구이다
- SVN, Git 등 대부분의 형상 관리 도구와 연동이 가능하다
- 친숙한 Web GUI 제공으로 사용이 쉽다
- 여러 대의 컴퓨터를 이용한 분산 빌드나 테스트가 가능하다
2. Gradle
: Groovy를 기반으로 한 오픈 소스 형태의 자동화 도구로, 안드로이드 앱 개발 환경에서 사용된다
- 안드로이드 뿐만 아니라 플러그인을 설정하면, JAVA, C/C++, Python 등의 언어도 빌드가 가능하다
- Groovy를 사용해서 만든 DSL(Domain Specific Language)을 스크립트 언어로 사용한다
- Gradle은 실행할 처리 명령들을 모아 태스크(Task)로 만든 후 태스크 단위로 실행한다
- 이전에 사용했던 태스크를 재사용하거나 다른 시스템의 태스크를 공유할 수 있는 빌드 캐시 기능을 지원하므로
빌드의 속도를 향상시킬 수 있다
∎4장 애플리케이션 테스트 관리
∙애플리케이션 테스트
: 애플리케이션에 잠재되어 있는 결함을 찾아내는 일련의 행위 또는 절차이다
- 개발된 소프트웨어가 고객의 요구사항을 만족시키는지 확인(Validation)하고 소프트웨어가 기능을 정확히
수행하는지 검증(Verification)한다
- 애플리케이션 테스트를 실행하기 전에 개발한 소프트웨어의 유형을 분류하고 특성을 정리해서 중점적으로 테스트할
사항을 정리해야 한다
+ 소프트웨어의 분류
- 상용 소프트웨어 : 보통의 사용자들이 공통적으로 필요로 하는 기능을 제공하는 소프트웨어로, 산업의 특성에
따라 산업 범용 소프트웨어와 산업 특화 소프트웨어로 구분됩니다
- 서비스 제공 소프트웨어 : 소프트웨어를 개발하여 판매하려는 것이 아니라 특정 사용자가 필요로 하는 기능만을
구현해서 제공하는 소프트웨어입니다
1. 애플리케이션 테스트의 필요성
- 프로그램 실행 전에 오류를 발견하여 예방할 수 있다
- 프로그램이 사용자의 요구사항이나 기대 수준 등을 만족시키는지 반복적으로 테스트하므로 제품의 신뢰도를
향상시킨다
- 개발 초기부터 애플리케이션 테스트를 게획하고 시작하면 단순한 오류 발견뿐만 아니라 새로운 오류의 유입도
예방할 수 있다
- 효과적으로 수행하면 최소한의 시간과 노력으로 많은 결함을 찾을 수 있다
2. 애플리케이션 테스트의 기본 원리
- 소프트웨어의 잠재적인 결함을 줄일 수 있지만 소프트웨어에 결함이 없다고 증명할 수는 없다.
즉 완벽한 소프트웨어 테스팅은 불가능하다
- 결함은 대부분 개발자의 특성이나 애플리케이션의 기능적 특징 때문에 특정 모듈에 집중되어 있으므로
애플리케이션의 20%에 해당하는 코드에서 전체 80%의 결함이 발견된다고 하여 파레토 법칙을 적용하기도 한다
- 동일한 테스트 케이스로 동일한 테스트를 반복하면 더 이상 결함이 발견되지 않는
‘살충제 패러독스(Pesticide Paradox)’ 현상이 발생한다 이를 방지하기 위해서 테스트 케이스를 지속적으로
보완 및 개선해야 한다
- 소프트웨어 특징, 테스트 환경, 테스터 역량 등 정황(Context)에 따라 테스트 결과가 달라질 수 있으므로,
정황에 따라 테스트를 다르게 수행해야 한다
- 결함을 모두 제거해도 사용자의 요구사항을 만족시키지 못하면 해당 소프트웨어는 품질이 높다고 말할 수 없고
이것을 오류-부재의 궤변(Absence of Errors Fallacy)이라고 한다
- 테스트와 위험은 반비례한다 즉 테스트를 많이 하면 할수록 미래에 발생할 위험을 줄일 수 있다
- 작은 부분에서 시작하여 점점 확대하며 진행해야 한다
- 개발자와 관계없는 별도의 팀에서 수행해야 한다
∙애플리케이션 테스트의 분류
1. 프로그램 실행 여부에 따른 테스트
2. 테스트 기반(Test Bases)에 따른 테스트
3. 시각에 따른 테스트
4. 목적에 따른 테스트
∙테스트 기법에 따른 애플리케이션 테스트
1. 화이트박스 테스트(White Box Test)
: 모듈의 원시 코드를 오픈시킨 상태에서 원시 코드의 논리적인 모든 경로를 테스트하여 테스트 케이스를 설계하는
방법이다
- 설계된 절차에 초점을 둔 구조적 테스트로 프로시저 설계의 제어 구조를 사용하여 테스트 케이스를 설계하며,
테스트 과정의 초기에 적용된다
- 모듈 안의 작동을 직접 관찰한다
- 원시 코드(모듈)의 모든 문장을 한 번 이상 실행함으로써 수행된다
- 프로그램의 제어 구조에 따라 선택, 반복 등의 분기점 부분들을 수행함으로써 논리적 경로를 제어한다
2. 화이트박스 테스트의 종류
3. 화이트박스 테스트의 검증 기준
: 테스트 케이스들이 테스트에 얼마나 적정한지를 판단하는 기준이다
+ 검증 기준(Coverage)의 종류
- 기능 기반 커버리지 : 실제 테스트가 수행된 기능의 수 / 전체 기능의 수
- 라인 커버리지(Line Coverage) : 테스트 시나리오가 수행한 소스 코드의 라인 수 / 전체 소스 코드의 라인 수
- 코드 커버리지(Code Coverage) : 소스 코드의 구문, 분기, 조건 등의 구조 코드 자체가 얼마나 테스트되었는지를
측정하는 방법으로 화이트박스 테스트에서 사용되는 검증 기준은 모두 코드 커버리지에 해당한다
4. 블랙박스 테스트(Black Box Test)
: 소프트웨어가 수행할 특정 기능을 알기 위해서 각 기능이 완전히 작동되는 것을 입증하는 테스트로,
기능 테스트라고도 한다
- 사용자의 요구사항 명세를 보면서 테스트하는 것으로, 주로 구현된 기능을 테스트한다
- 소프트웨어 인터페이스에서 실시되는 테스트이다
- 내부 구조나 작동 원리를 모르는 상태에서 테스트하므로 프로그램의 구조를 고려하지 않는다
- 부정확하거나 누락된 기능, 인터페이스 오류, 자료 구조나 외부 데이터베이스 접근에 따른 오류,
행위나 성능 오류, 초기화와 종료 오류 등을 발견하기 위해 사용되며, 테스트 과정의 후반부에 적용된다
5. 블랙박스 테스트의 종류
∙개발 단계에 따른 애플리케이션 테스트
: 소프트웨어의 개발 단계에 따라 단위 테스트, 통합 테스트, 시스템 테스트, 인수 테스트로 분류된다.
이렇게 분류된 것을 테스트 레벨이라고 한다
- 소프트웨어의 개발 단계에서부터 테스트를 수행하므로 단순히 소프트웨어에 포함된 코드 상의 오류뿐만 아니라
요구 분석의 오류, 설계 인터페이스 오류 등도 발견할 수 있다
- 애플리케이션 테스트와 소프트웨어 개발 단계를 연결하여 표현한 것을 V-모델이라 한다
ㄱ. Perry에 의해 제안되었으며 세부적인 테스트 과정으로 구성되어 신뢰도 높은 시스템을 개발하는데 효과적이다
ㄴ. 개발 작업과 검증 작업 사이의 관계를 명확히 들어내 놓은 폭포수 모델의 변형이라고 볼 수 있다
ㄷ. 폭포수 모델이 산출물 중심이라면 V-모델은 작업과 결과의 검증에 초점을 둔다
1. 단위 테스트(Unit Test)
: 코딩 직후 소프트웨어 설계의 최소 단위인 모듈이나 컴포넌트에 초점을 맞춰 테스트하는 것이다
- 인터페이스, 외부적 I/O, 자료 구조, 독립적 기초 경로, 오류 처리 경로, 경계 조건 등을 검사한다
- 사용자의 요구사항을 기반으로 한 기능성 테스트를 최우선으로 수행한다
- 구조 기반 테스트와 명세 기반 테스트로 나뉘지만 주로 구조 기반 테스트를 시행한다
- 단위 테스트로 발견 가능한 오류 : 알고리즘 오류에 따른 원치 않는 결과, 탈출구가 없는 반복문의 사용,
틀린 계산 수식에 의한 잘못된 결과
2. 통합 테스트(Integration Test)
: 단위 테스트가 완료된 모듈들을 결합하여 하나의 시스템으로 완성시키는 과정에서의 테스트를 의미한다
- 모듈 간 또는 통합된 컴포넌트 간의 상호 작용 오류를 검사한다
3. 시스템 테스트(System Test)
: 개발된 소프트웨어가 해당 컴퓨터 시스템에서 완벽하게 수행되는가를 점검하는 테스트이다
- 환경적인 장애 리스크를 최소화하기 위해서는 실제 사용 환경과 유사하게 만든 테스트 환경에서 테스트를
수행해야 한다
- 기능적 요구사항과 비기능적 요구사항으로 구분하여 각각을 만족하는지 테스트한다
4. 인수 테스트(Acceptance Test)
: 개발한 소프트웨어가 사용자의 요구사항을 충족하는지에 중점을 두고 테스트하는 방법이다
- 개발한 소프트웨어를 사용자가 직접 테스트한다
- 문제가 없으면 사용자는 소프트웨어를 인수하게 되고, 프로젝트는 종료된다
- 다음과 같이 6가지 종류로 구분해서 테스트한다
∙통합 테스트
1. 통합 테스트(Integration Test)
: 단위 테스트가 끝난 모듈을 통합하는 과정에서 발생하는 오류 및 결함을 찾는 테스트 기법이다
2. 하향식 통합 테스트(Top Down Integration Test)
: 프로그램의 상위 모듈에서 하위 모듈 방향으로 통합하면서 테스트하는 기법이다
- 주요 제어 모듈을 기준으로 하여 아래 단계로 이동하면서 통합하는데, 이때 깊이 우선 통합법이나 넓이 우선
통합법을 사용한다
- 하위 컴포넌트 개발이 완료되지 않은 경우 스텁(Stub)을 사용하기도 한다
- 테스트 초기부터 사용자에게 시스템 구조를 보여줄 수 있다
- 상위 모듈에서는 테스트 케이스를 사용하기 어렵다
- 하향식 통합 방법은 다음과 같은 절차로 수행된다
ㄱ. 주요 제어 모듈은 작성된 프로그램을 사용하고, 주요 제어 모듈의 종속 모듈들은 스텁(Stub)으로 대체한다
ㄴ. 깊이 우선 또는 넓이 우선 등의 통합 방식에 따라 하위 모듈인 스텁들이 한 번에 하나씩 실제 모듈로 교체된다
ㄷ. 모듈이 통합될 때마다 테스트를 실시한다
ㄹ. 새로운 오류가 발생하지 않음을 보증하기 위해 회귀 테스트를 실시한다
3. 상향식 통합 테스트(Bottom Up Integration Test)
: 프로그램의 하위 모듈에서 상위 모듈 방향으로 통합하면서 테스트하는 기법이다
- 가장 하위 단계의 모듈부터 통합 및 테스트가 수행되므로 스텁(Stub)은 필요하지 않지만, 하나의 주요 제어
모듈과 관련된 종속 모듈의 그룹인 클러스터(Cluster)가 필요하다
- 상향식 통합 방법은 다음과 같은 절차로 수행된다
ㄱ. 하위 모듈들을 클러스터(Cluster)로 결합한다
ㄴ. 상위 모듈에서 데이터의 입·출력을 확인하기 위해 더미 모듈인 드라이버(Driver)를 작성한다
ㄷ. 통합된 클러스터 단위로 테스트한다
ㄹ. 테스트가 완료되면 클러스터는 프로그램 구조의 상위로 이동하여 결합하고 드라이버는 실제 모듈로 대체된다
+ 테스트 드라이버와 테스트 스텁의 차이점
4. 혼합식 통합 테스트
: 하위 수준에서는 상향식 통합, 상위 수준에서는 하향식 통합을 사용하여 최적의 테스트를 지원하는 방식으로,
샌드위치(Sandwich)식 통합 테스트 방법이라고도 한다
5. 회귀 테스팅(Regresssion Testing)
: 이미 테스트된 프로그램의 테스팅을 반복하는 것으로, 통합 테스트로 인해 변경된 모듈이나 컴포넌트에 새로운
오류가 있는지 확인하는 테스트이다
- 수정한 모듈이나 컴포넌트가 다른 부분에 영향을 미치는지, 오류가 생기지 않았는지 테스트하여 새로운 오류가
발생하지 않음을 보증하기 위해 반복 테스트한다
- 모든 테스트 케이스를 이용해 테스팅하는 것이 가장 좋지만 시간과 비용이 많이 필요하므로 기존 테스트 케이스
중 변경된 부분을 테스트할 수 있는 테스트 케이스만을 선정하여 수행한다
- 회귀 테스트의 테스트 케이스 선정 방법
ㄱ. 모든 애플리케이션의 기능을 수행할 수 있는 대표적인 테스트 케이스를 선정한다
ㄴ. 애플리케이션 기능 변경에 의한 파급 효과를 분석하여 파급 효과가 높은 부분이 포함된 테스트 케이스를
선정한다
ㄷ. 실제 수정이 발생한 모듈 또는 컴포넌트에서 시행하는 테스트 케이스를 선정한다
∙테스트 케이스 / 테스트 시나리오 / 테스트 오라클
1. 테스트 케이스(Test Case)
: 구현된 소프트웨어가 사용자의 요구사항을 정확하게 준수했는지를 확인하기 위해 설계된 입력 값, 실행 조건,
기대 결과 등으로 구성된 테스트 항목에 대한 명세서로, 명세 기반 테스트의 설계 산출물에 해당된다
- 테스트 케이스를 미리 설계하면 테스트 오류를 방지할 수 있고 테스트 수행에 필요한 인력, 시간 등의 낭비를
줄일 수 있다
- 가장 이상적인 테스트 케이스를 설계하려면 시스템 설계 시 작성해야 한다
2. 테스트 케이스 작성 순서
3. 테스트 시나리오(Test Scenario)
: 테스트 케이스를 적용하는 순서에 따라 여러 개의 테스트 케이스들을 묶은 집합으로, 테스트 케이스들을 적용하는
구체적인 절차를 명세한 문서이다
- 테스트 시나리오에는 테스트 순서에 대한 구체적인 절차, 사전 조건, 입력 데이터 등이 설정되어 있다
- 테스트 시나리오를 통해 테스트 순서를 미리 정함으로써 테스트 항목을 빠짐없이 수행할 수 있다
4. 테스트 시나리오 작성 시 유의 사항
- 시스템별, 모듈별, 항목별 등과 같이 여러 개의 시나리오로 분리하여 작성해야 한다
- 사용자의 요구사항과 설계 문서 등을 토대로 작성해야 한다
- 각각의 테스트 항목은 식별자 번호, 순서 번호, 테스트 데이터, 테스트 케이스, 예상 결과, 확인 등을 포함해서
작성해야 한다
- 유스케이스(Use Case) 간 업무 흐름이 정상적인지를 테스트할 수 있도록 작성해야 한다
- 개발된 모듈 또는 프로그램 간의 연계가 정상적으로 동작하는지 테스트할 수 있도록 작성해야 한다
5. 테스트 오라클(Test Oracle)
: 테스트 결과가 올바른지 판단하기 위해 사전에 정의된 참 값을 대입하여 비교하는 기법 및 활동을 말한다
- 결과를 판단하기 위해 테스트 케이스에 대한 예상 결과를 계산하거나 확인한다
- 테스트 오라클의 특징
ㄱ. 제한된 검증 : 테스트 오라클을 모든 테스트 케이스에 적용할 수 없다
ㄴ. 수학적 기법 : 테스트 오라클의 값을 수학적 기법을 이용하여 구할 수 있다
ㄷ. 자동화 기능 : 테스트 대상 프로그램의 실행, 결과 비교, 커버리지 측정 등을 자동화 할 수 있다
- 오라클의 종류 : 참(True) 오라클, 샘플링(Sampling) 오라클, 추정(Heuristic) 오라클, 일관성(Consistent) 오라클
6. 테스트 오라클의 종류
∙테스트 자동화 도구
: 사람이 반복적으로 수행하던 테스트 절차를 스크립트 형태로 구현하는 자동화 도구를 적용함으로써 쉽고
효율적으로 테스트를 수행할 수 있도록 한 것이다
- 테스트 자동화 도구를 사용함으로써 휴먼 에러(Human Error)를 줄이고 테스트의 정확성을 유지하면서 테스트의
품질을 향상시킬 수 있다
1. 테스트 자동화 도구의 장점 / 단점
2. 테스트 자동화 수행 시 고려사항
- 테스트 절차를 고려하여 재사용 및 측정이 불가능한 테스트 프로그램은 제외한다
- 모든 테스트 과정을 자동화 할 수 있는 도구는 없으므로 용도에 맞는 적절한 도구를 선택해서 사용한다
- 자동화 도구의 환경 설정 및 습득 기간을 고려해서 프로젝트 일정을 계획해야 한다
- 테스트 엔지니어의 투입 시기가 늦어지면 프로젝트의 이해 부족으로 인해 불완전한 테스트를 초래할 수 있으므로
반드시 프로젝트 초기에 테스트 엔지니어의 투입 시기를 계획해야 한다
3. 테스트 자동화 도구의 유형
+ 테스트 하네스(Test Harness)의 구성 요소
- 테스트 드라이버(Test Driver) : 테스트 대상의 하위 모듈을 호출하고, 파라미터를 전달하고, 모듈 테스트 수행
후의 결과를 도출하는 도구 (상향식 테스트에 사용)
- 테스트 스텁(Test Stub) : 제어 모듈이 호출하는 타 모듈의 기능을 단순히 수행하는 도구로, 일시적으로 필요한
조건만을 가지고 있는 테스트용 모듈 (하향식 테스트에 사용)
- 테스트 슈트(Test Suites) : 테스트 대상 컴포넌트나 모듈, 시스템에 사용되는 테스트 케이스의 집합
- 테스트 케이스(Test Case) : 사용자의 요구사항을 정확하게 준수했는지 확인하기 위한 입력 값, 실행 조건,
기대 결과 등으로 만들어진 테스트 항목의 명세서
- 테스트 스크립트(Test Script) : 자동화된 테스트 실행 절차에 대한 명세서
- 목 오브젝트(Mock Object) : 사전에 사용자의 행위를 조건부로 입력해 두면, 그 상황에 맞는 예정된 행위를
수행하는 객체
∙결함 관리
1. 결함(Falut)의 정의
: 오류 발생, 작동 실패 등과 같이 소프트웨어가 개발자가 설계한 것과 다르게 동작하거나 다른 결과가 발생되는
것을 의미한다
- 사용자가 예상한 결과와 실행 결과 간의 차이나 업무 내용과의 불일치 등으로 인해 변경이 필요한 부분도 모두
결함에 해당된다
2. 결함 관리 프로세스
: 애플리케이션 테스트에서 발견된 결함을 처리하는 것으로, 처리 순서는 다음과 같다
3. 결함 상태 추적
: 테스트에서 발견된 결함은 지속적으로 상태 변화를 추적하고 관리해야 한다
- 발견된 결함에 대해 결함 관리 측정 지표의 속성 값들을 분석하여 향후 결함이 발견될 모듈 또는 컴포넌트를
추정할 수 있다
- 결함 관리 측정 지표
4. 결함 추적 순서
: 결함 추적은 결함이 발견된 때부터 결함이 해결될 때까지 전 과정을 추적하는 것으로 순서는 다음과 같다
5. 결함 분류
: 테스트에서 발견되는 결함을 유형별로 분류하면 다음과 같다
+ 테스트 단계별 유입 결함
- 기획 시 유입되는 결함 : 사용자 요구사항의 표준 미준수로 인한 테스트 불가능, 요구사항 불명확/불완전/불일치
결함 등
- 설계 시 유입되는 결함 : 설게 표준 미준수로 인한 테스트 불가능, 기능 설계 불명확/불완전/불일치 결함 등
- 코딩 시 유입되는 결함 : 코딩 표준 미준수로 인한 기능의 불일치/불완전, 데이터 결함, 인터페이스 결함 등
- 테스트 부족으로 유입되는 결함 : 테스트 수행 시 테스트 완료 기준의 미준ㅅ누, 테스트팀과 개발팀의 의사소통
부족, 개발자의 코딩 실수로 인한 결함 등
6. 결함 심각도
: 애플리케이션에 발생한 결함이 전체 시스템에 미치는 치명도를 나타내는 척도이다
- 결함 심각도를 우선순위에 따라 분류하면 다음과 같다
7. 결함 우선순위
: 발견된 결함 처리에 대한 신속성을 나타내는 척도로, 결함의 중요도와 심각도에 따라 설정되고 수정 여부가
결정된다
- 일반적으로 결함의 심각도가 높으면 우선순위도 높지만 애플리케이션의 특성에 따라 우선순위가 결정될 수도 있기
때문에 심각도가 높다고 반드시 우선순위가 높은 것은 아니다
- 결함 우선순위는 결정적(Critical), 높음(High), 보통(Medium), 낮음(Low) 또는 즉시 해결, 주의 요망, 대기,
개선 권고 등으로 분류된다
8. 결함 관리 도구
: 소프트웨어에 발생한 결함을 체계적으로 관리할 수 있도록 도와주는 도구로, 다음과 같은 것들이 있다
∙복잡도
: 시스템이나 시스템 구성 요소 또는 소프트웨어의 복ㅈ바한 정도를 나타내는 말로, 시스템 또는 소프트웨어를
어느 정도의 수준까지 테스트해야 하는지 또는 개발하는데 어느 정도의 자원이 소요되는지 예측하는데 사용된다
- 시스템의 복잡도가 높으면 장애가 발생할 수 있으므로 정밀한 테스트를 통해 미리 오류를 제거할 필요가 있다
- 주요 복잡도 측정 방법 : LOC(Line Of Code), 순환 복잡도(Cyclomatic Complexity) 등
1. 시간 복잡도
: 알고리즘의 실행시간, 즉 알고리즘을 수행하기 위해 프로세스가 수행하는 연산 횟수를 수치화한 것을 의미한다
- 시간 복잡도가 낮을수록 알고리즘의 실행시간이 짧고, 높을수록 실행시간이 길어진다
- 알고리즘의 실행시간이 하드웨어적 성능이나 프로그래밍 언어의 종류에 따라 달라지기 때문에 시간이 아닌
명령어의 실행 횟수를 표기하는데, 이러한 표기법을 점근 표기법이라고 한다
- 점근 표기법의 종류
2. 빅오 표기법(Big-O Notation)
: 알고리즘의 실행 시간이 최악일 때를 표기하는 방법으로, 신뢰성이 떨어지는 오메가 표기법이나 평가하기 까다로운
세타 표기법에 비해 성능을 예측하기 용이하여 주로 사용된다
- 일반적인 알고리즘에 대한 최악의 시간 복잡도를 빅오 표기법으로 표현하면 다음과 같다
3. 순환 복잡도(Cyclomatic Complexity)
: 한 프로그램의 논리적인 복잡도를 측정하기 위한 소프트웨어의 척도로, 맥케이브 순환도(McCabe’s Cyclomatic)
또는 맥케이브 복잡도 메트릭(McCabe’s Complexity Metrics)라고도 하며, 제어 흐름도 이론에 기초를 둔다
- 순환 복잡도를 이용하여 계산된 값은 프로그램의 독립적인 경로의 수를 정의하고, 모든 경로가 한 번 이상
수행되었음을 보장하기 위해 행해지는 테스트 횟수의 상한선을 제공한다
- 제어 흐름도 G에서 순환 복잡도 V(G)는 다음과 같은 방법으로 계산할 수 있다
ㄱ. 순환 복잡도는 제어 흐름도의 영역 수와 일치하므로 영역 수를 계산한다
ㄴ. V(G) = E – N + 2 (E는 화살표 수, N은 노드의 수)
+ 트리 구조에 따른 최악의 경우에서 시간 복잡도
- 이진 탐색트리 : O(n)
- AVL 트리 : O(log n)
- 2-3 트리 : O(log 3n)
- 레드 블랙 트리 : O(log n)
∙애플리케이션 성능 개선
1. 소스 코드 최적화
: 나쁜 코드(Bad Code)를 배제하고, 클린 코드(Clean Code)로 작성하는 것이다
- 클린 코드 : 누구나 쉽게 이해하고 수정 및 추가할 수 있는 단순, 명료한 코드, 즉 잘 작성된 코드를 의미한다
- 나쁜 코드 : 프로그램의 로직(Logic)이 복잡하고 이해하기 어려운 코드로, 스파게티 코드와 외계인 코드가 있다
ㄱ. 스파게티 코드 : 코드의 로직이 서로 복잡하게 얽혀 있는 코드
ㄴ. 외계인 코드(Alien Code) : 아주 오래되거나 참고문서 또는 개발자가 없어 유지보수 작업이 어려운 코드
- 나쁜 코드로 작성된 애플리케이션의 코드를 클린 코드로 수정하면 애플리케이션의 성능이 개선된다
- 클린 코드 작성 원칙
2. 소스 코드 최적화 유형
- 클래스 분할 배치 : 하나의 클래스는 하나의 역할만 수행하도록 응집도를 높이고, 크기를 작게 작성한다
- 느슨한 결합(Loosely Coupled) : 인터페이스 클래스를 이용하여 추상화된 자료 구조와 메소드를 구현함으로써
클래스 간의 의존성을 최소화한다0
- 코딩 형식 준수 : 코드 작성 시 다음의 형식을 준수한다
ㄱ. 줄 바꿈 사용
ㄴ. 개념적 유사성이 높은 종속 함수 사용
ㄷ. 호출하는 함수는 선배치, 호출되는 함수는 후배치
ㄹ. 지역 변수는 각 함수의 맨 처음에 선언
- 좋은 이름 사용 : 변수나 함수 등의 이름은 기억하기 좋은 이름, 발음이 쉬운 용어, 접두어 사용 등 기본적인
이름 명명 규칙(Naming Rule)을 정의하고 규칙에 맞는 이름을 사용한다
- 적절한 주석문 사용 : 소스 코드 작성 시 앞으로 해야 할 일을 기록하거나 중요한 코드를 강조할 때 주석문을
사용한다
3. 소스 코드 품질 분석 도구
: 소스 코드의 코딩 스타일, 코드에 설정된 코딩 표준, 코드의 복잡도, 코드에 존재하는 메모리 누수 현상,
스레드 결함 등을 발견하기 위해 사용하는 분석 도구로, 크게 정적 분석 도구와 동적 분석 도구로 나뉜다
- 정적 분석 도구
ㄱ. 작성한 소스 코드를 실행하지 않고 코딩 표준이나 코딩 스타일, 결함 등을 확인하는 코드 분석 도구이다
ㄴ. 비교적 애플리케이션 개발 초기의 결함을 찾는데 사용되고, 개발 완료 시점에서는 개발된 소스 코드의 품질을
검증하는 차원에서 사용된다
ㄷ. 자료 흐름이나 논리 흐름을 분석하여 비정상적인 패턴을 찾을 수 있다
ㄹ. 동적 분석 도구로는 발견하기 어려운 결함을 찾아내고, 소스 코드에서 코딩의 복잡도, 모델 의존성,
불일치성 등을 분석할 수 있다
ㅁ. 종류 : pmd, cppcheck, SonarQube, checkstyle, ccm, cobertura 등
- 동적 분석 도구
ㄱ. 작성한 소스 코드를 실행하여 코드에 존재하는 메모리 누수, 스레드 결함 등을 분석하는 도구이다
ㄴ. 종류 : Avalanche, Valgrind 등
4. 소스 코드 품질 분석 도구의 종류
∎5장 인터페이스 구현
∙모듈 연계를 위한 인터페이스 기능 식별
1. 모듈 연계의 개요
: 내부 모듈과 외부 모듈 또는 내부 모듈 간 데이터의 교환을 위해 관계를 설정하는 것으로, 대표적인 모듈 연계
방법에는 EAI와 ESB 방식이 있다
- EAI(Enterprise Application Integration)
ㄱ. 기업 내 각종 애플리케이션 및 플랫폼 간의 정보 전달, 연계, 통합 등 상호연동이 가능하게 해주는 솔루션이다
ㄴ. 비즈니스 간 통합 및 연계성을 증대시켜 효율성 및 각 시스템 간의 확장성(Determinacy)을 높여 준다
ㄷ. 구축 유형은 다음과 같다
- ESB(Enterprise Service Bus)
ㄱ. 애플리케이션 간 연계, 데이터 변환, 웹 서비스 지원 등 표준 기반의 인터페이스를 제공하는 솔루션이다
ㄴ. 애플리케이션 통합 측면에서 EAI와 유사하지만 애플리케이션 보다는 서비스 중심의 통합을 지향한다
ㄷ. 특정 서비스에 국한되지 않고 범용적으로 사용하기 위하여 애플리케이션과의 결합도(Coupling)를
약하게(Loosely) 유지한다
ㄹ. 관리 및 보안 유지가 쉽고, 높은 수준의 품질 지원이 가능하다
2. 모듈 간 연계 기능 식별
- 모듈 간 공통 기능 및 데이터 인터페이스를 기반으로 모듈과 연계된 기능을 시나리오 형태로 구체화하여 식별한다
- 식별된 연계 기능은 인터페이스 기능을 식별하는데 사용된다
3. 모듈 간 인터페이스 기능 식별
- 식별된 모듈 간 관련 기능을 검토하여 인터페이스 동작에 필요한 기능을 식별한다
- 인터페이스 동작은 대부분 외부 모듈의 결과 또는 요청에 의해 수행되므로 외부 및 인터페이스 모듈 간 동작하는
기능을 통해 인터페이스 기능을 식별한다
- 내부 모듈의 동작은 외부 모듈에서 호출된 인터페이스에 의해 수행되고 결과를 나타내는 것이므로 해당 업무에
대한 시나리오를 통해 내부 모듈과 관련된 인터페이스 기능을 식별한다
- 식별된 인터페이스 기능 중에서 실제적으로 필요한 인터페이스 기능을 최종적으로 선별한다
- 식별된 인터페이스 기능은 인터페이스 기능 구현을 정의하는데 사용된다
∙인터페이스 구현
: 송·수신 시스템 간의 데이터 교환 및 처리를 실현해 주는 작업을 의미한다
- 정의된 인터페이스 기능 구현을 기반으로 구현 방법 및 범위 등을 고려하여 인터페이스 구현 방법을 분석한다
- 분석된 인터페이스 구현 정의를 기반으로 인터페이스를 구현한다
- 인터페이스를 구현하는 대표적인 방법에는 데이터 통신을 이용한 방법과 인터페이스 엔티티를 이용한 방법이 있다
1. 데이터 통신을 이용한 인터페이스 구현
: 애플리케이션 영역에서 인터페이스 형식에 맞춘 데이터 포맷을 인터페이스 대상으로 전송하고 이를 수신 측에서
파싱(Parsing)하여 해석하는 방식이다
- 주로 JSON이나 XML 형식의 데이터 포맷을 사용하여 인터페이스를 구현한다
- JSON을 이용한 인터페이스 구현 순서
ㄱ. 인터페이스 객체 생성 및 전송을 위해 인터페이스 객체를 생성할 데이터를 각 시스템 및 환경에 맞게 선택한다
ㄴ. 선택한 데이터를 JSON을 이용하여 인터페이스 객체를 생성한다
ㄷ. 송신 측에서 JSON으로 생성한 인터페이스 객체를 AJAX 기술 등을 이용하여 수신 측으로 보낸다
ㄹ. 수신 측에서 인터페이스 객체를 수신해 파싱한 후 처리한다
ㅁ. 수신 측에서 송신 측에 처리 결과를 보낸다
2. 인터페이스 엔티티를 이용한 인터페이스 구현
: 인터페이스가 필요한 시스템 사이에 별도의 인터페이스 엔티티를 두어 상호 연계하는 방식이다
- 일반적으로 인터페이스 테이블을 엔티티로 활용한다
- 인터페이스 테이블은 한 개 또는 송신 및 수신 인터페이스 테이블을 각각 두어 활용한다
- 송신 및 수신 인터페이스 테이블의 구조는 대부분 같지만 상황에 따라 서로 다르게 설계할 수도 있다
- 인터페이스 테이블을 이용한 인터페이스 구현 순서
ㄱ. 인터페이스 이벤트가 발생하면 인터페이스 테이블에 인터페이스 데이터를 기록한다(Write)
ㄴ. 송신 측 인터페이스 테이블에서 정해진 주기에 따라 인터페이스 데이터를 전송한다
ㄷ. 수신 측 인터페이스 테이블에 인터페이스 데이터가 입력되면 정해진 주기에 따라 인터페이스 데이터를 읽는다
(Read)
ㄹ. 수신 측 인터페이스 테이블에서 인터페이스 데이터를 읽은 후 사전에 정의된 데이터 트랜잭션을 수행한다
∙인터페이스 보안
- 인터페이스는 시스템 모듈 간 통신 및 정보 교환을 위한 통로로 사용되므로 충분한 보안 기능을 갖추지 않으면
시스템 모듈 전체의 악영향을 주는 보안 취약점이 될 수 있다
- 인터페이스의 보안성 향상을 위해서는 인터페이스의 보안 취약점을 분석한 후 적절한 보안 기능을 적용한다
1. 인터페이스 보안 취약점 분석
- 인터페이스 기능이 수행되는 각 구간들의 구현 현황을 확인하고 각 구간에 어떤 보안 취약점이 있는지를 분석한다
- 인터페이스 기능이 수행되는 각 구간의 구현 현황은 송·수신 영역의 구현 기술 및 특징 등을 구체적으로 확인한다
- 확인된 인터페이스 기능을 기반으로 송신 데이터 선택, 송신 객체 생성, 인터페이스 송·수신, 데이터 처리 결과
전송 등 영역별로 발생할 수 있는 보안 취약점을 시나리오 형태로 작성한다
2. 인터페이스 보안 기능 적용
- 분석한 인터페이스 기능과 보안 취약점을 기반으로 인터페이스 보안 기능을 적용한다
- 인터페이스 보안 기능은 일반적으로 네트워크, 애플리케이션, 데이터베이스 영역에 적용한다
+ IPSec(IP Security)
: 네트워크 계층에서 IP 패킷 단위의 데이터 변조 방지 및 은닉 기능을 제공하는 프로토콜
- 암호화 수행 시 양방향 암호화를 지원한다
- 운영 모드는 Tunnel 모드와 Transport 모드로 분류된다
- 세부 프로토콜
ㄱ. IKE(Internet Key Exchange) : 보안 관련 설정들을 생성, 협상 및 관리하는 프로토콜(UDP 500번 포트 사용)
ㄴ. ESP(Encapsulating Security Payload) : 메시지 인증코드, 암호화를 이용해 인증(무결성), 발신지 인증,
기밀성을 제공하는 프로토콜
ㄷ. AH(Authentication Header) : 기밀성을 제외한 메시지 인증코드를 이용한 인증(무결성), 발신지 인증을
제공하는 프로토콜
+ 스니핑(Sniffing) / 소프트웨어 개발 보안
- 스니핑(Sniffing)
: 네트워크의 중간에서 남의 패킷 정보를 도청하는 해킹 유형의 하나로 수동적 공격에 해당합니다
- 네트워크 내의 패킷들은 대부분 암호화되어 있지 않아 스니핑 같은 해킹 기법에 이용당하기 쉽습니다
- 소프트웨어 개발 보안
: 애플리케이션 소스 코드에 존재할 수 있는 보안 취약점의 발견, 제거, 보안을 고려한 기능 설계 및 구현 등
소프트웨어 개발 과정에서 지켜야 할 일련의 보안 활동으로, 시큐어 코딩(Secure Coding)이라고도 불립니다
3. 데이터 무결성 검사 도구
: 시스템 파일의 변경 유무를 확인하고, 파일이 변경되었을 경우 이를 관리자에게 알려주는 도구로, 인터페이스
보안 취약점을 분석하는데 사용된다
- 크래커나 허가받지 않은 내부 사용자들이 시스템에 침입하면 백도어를 만들어 놓거나 시스템 파일을 변경하여
자신의 흔적을 감추는데, 무결성 검사 도구를 이용하여 이를 감지할 수 있다
- 해시(Hash) 함수를 이용하여 현재 파일 및 디렉토리의 상태를 DB에 저장한 후 감시하다가 현재 상태와 DB의
상태가 달라지면 관리자에게 변경 사실을 알려준다
- 대표적인 데이터 무결성 검사 도구에는 Tripwire, AIDE, Samhain, Claymore, Slipwire, Fcheck 등이 있다
ㄱ. nmap : 서버에 열린 포트 정보를 스캐닝해서 보안 취약점을 찾는데 사용하는 도구
ㄴ. tripwire : 크래커가 침입하여 백도어를 만들어 놓거나 설정파일을 변경했을 때 분석하는 도구
∙인터페이스 구현 검증
: 인터페이스가 정상적으로 문제없이 작동하는지 확인하는 것이다
- 인터페이스 구현 검증 도구와 감시 도구를 이용하여 인터페이스의 동작 상태를 확인한다
1. 인터페이스 구현 검증 도구
- 인터페이스 구현을 검증하기 위해서는 인터페이스 단위 기능과 시나리오 등을 기반으로 하는 통합 테스트가
필요하다
- 통합 테스트는 다음과 같은 테스트 자동화 도구를 이용하면 효율적으로 수행할 수 있다
2. 인터페이스 구현 감시 도구
- 인터페이스 동작 상태는 APM을 사용하여 감시(Monitoring)할 수 있다
- 애플리케이션 성능 관리 도구를 통해 데이터베이스와 웹 애플리케이션의 트랜잭션, 변수값, 호출 함수,
로그 및 시스템 부하 등 종합적인 정보를 조회하고 분석할 수 있다
- 대표적인 애플리케이션 성능 관리 도구에는 스카우터(Scouter), 제니퍼(Jennifer) 등이 있다
+ APM(Application Performance Management / Monitoring)
: 애플리케이션의 성능 관리를 위해 접속자, 지원 현황, 트랜잭션 수행 내역, 장애 진단 등 다양한 모니터링 기능을
제공하는 도구를 의미합니다
- 리소스 방식 : Nagios, Zabbix, Cacti 등
- 엔드투엔드 방식 : VisualVM, 제니퍼, 스카우터 등
3. 인터페이스 구현 검증 도구 및 감시 도구 선택
- 인터페이스 기능 구현 정의를 통해 구현된 인터페이스 명세서의 세부 기능을 참조하여 인터페이스의 정상적인
동작 여부를 확인하기 위한 검증 도구와 감시 도구의 요건을 분석한다
- 분석이 끝나면 시장 및 솔루션 조사를 통해서 적절한 인터페이스 구현을 검증하고 감시하는데 필요한 인터페이스
구현 검증 도구와 감시 도구를 선택한다
4. 인터페이스 구현 검증 확인
- 인터페이스 구현 검증 도구를 이용하여 외부 시스템과 연계 모듈의 동작 상태를 확인한다
- 최초 입력값과 입력값에 의해 선택되는 데이터, 생성되는 객체의 데이터 등 전반적인 인터페이스 동작
프로세스상에서 예상되는 결과값과 실제 검증값이 동일한지를 비교한다
- 추가적으로 각 단계별 오류 처리도 적절하게 구현되어 있는지 확인한다
5. 인터페이스 구현 감시 확인
- 인터페이스 구현 감시 도구를 이용하여 외부 시스템과 연결 모듈이 서비스를 제공하는 동안 정상적으로
동작하는지 확인한다
- 인터페이스 동작 여부, 에러 발생 여부 등 감시 도구에서 제공해 주는 리포트를 활용한다
● 기타
∙소프트웨어 모듈화의 장점
- 오류의 파급 효과를 최소화한다
- 모듈의 재사용 가능으로 개발과 유지보수가 용이하다
- 프로그램의 효율적인 관리가 가능하다
∙정보시스템 개발 단계에서 프로그래밍 언어 선택 시 고려사항
- 개발 정보시스템의 특성
- 사용자의 요구사항
- 컴파일러의 가용성
∙공학적으로 잘된 소프트웨어(Well Engineered Software)
- 유지보수가 용이해야 한다
- 신뢰성이 높아야 한다
- 충분한 테스팅을 거쳐야 한다
- 사용자 수준에 맞게 직관적이고 사용하기 쉽게 인터페이스를 설게, 개발해야 한다
∙해싱 함수(Hashing Function)
- 제산법 : 레코드 키(K)를 해시표(Hash Table)의 크기보다 큰 수 중에서 가장 작은 소수(Prime, Q)로 나눈
나머지를 홈 주소로 삼는 방식, 즉 h(K) = K mod Q임
- 제곱법 : 레코드 키 값(K)을 제곱한 후 그 중간 부분의 값을 홈 주소로 삼는 방식
- 폴딩(Folding)법 : 레코드 키 값(K)을 여러 부분으로 나눈 후 각 부분의 값을 더하거나 XOR(베타적 논리합)한 값을
홈 주소로 삼는 방식
- 기수(Radix) 변환법 : 키 숫자의 진수를 다른 진수로 변환시켜 주소 크기를 초과한 높은 자릿수는 절단하고,
이를 다시 주소 범위에 맞게 조정하는 방법
- 대수적 코딩법 : 키 값을 이루고 있는 각 자리의 비트 수를 한 다항식의 계수로 간주하고, 이 다항식을 해시표의
크기에 의해 정의된 다항식으로 나누어 얻은 나머지 다항식의 계수를 홈 주소로 삼는 방식
- 계수 분석법(숫자 분석법) : 키 값을 이루는 숫자의 분포를 분석하여 비교적 고른 자리를 필요한 만큼 택해서 홈
주소로 삼는 방식
- 무작위법 : 난수(Random Number)를 발생시켜 나온 값을 홈 주소로 삼는 방식
'📃 Certification > 정보처리기사' 카테고리의 다른 글
[정보처리기사 필기] 합격수기 (0) | 2022.04.25 |
---|---|
[정보처리기사 필기] 5과목 정보시스템 구축 관리 (0) | 2022.04.17 |
[정보처리기사 필기] 4과목 프로그래밍 언어 활용 (0) | 2022.04.10 |
[정보처리기사 필기] 3과목 데이터베이스 구축 (0) | 2022.04.08 |
[정보처리기사 필기] 1과목 소프트웨어 설계 (0) | 2022.04.04 |