1. 데이터 입출력 구현
1) 자료 구조
- 선형 구조: 배열, 선형 리스트(연속/연결 리스트), 스택, 큐, 데크
- 비선형 구조: 트리, 그래프
2) 선형 구조
선형 리스트
연속 리스트
- 연속되는 기억장소(≒배열)
- 기억장소 이용 효율 가장 좋음 (밀도 1)
- 데이터 중간 삽입 시 빈 공간 필요, 삽입/삭제 시 자료 이동 필요
연결 리스트
- 자료를 임의의 기억공간에 기억, 노드로 연결 → 삽입/삭제 용이
- 기억 공간이 연속적으로 놓여있지 않아도 저장 가능
- 순차 리스트 대비 기억 공간 효율 ↓
- 접근 속도 느림: 포인터 찾아야 함
- 중간 노드 끊어지면 다음 노드 찾기 어려움
스택
- 한쪽 끝으로만 삽입, 삭제 (LIFO)
- 스택이 가득 찬 상태에서 데이터 삽입 → 오버플로(Overflow)
- 빈 스택에서 데이터 삭제 → 언더플로(Underflow)
응용 분야
- 함수 호출 순서 제어
- 인터럽트 처리
- 수식 계산
- 컴파일러의 언어 번역
- 복귀 주소 저장
큐
- 한쪽에서 삽입, 다른 쪽에서 삭제 (FIFO)
- 시작과 끝을 표시하는 두 개의 포인터 사용
3) 비선형 구조
그래프
방향/무방향 그래프의 최대 간선 수
정점이 n개일 때,
- 무방향 그래프: 최대 간선 수 = n(n-1)/2
- 방향 그래프: 최대 간선 수 = n(n-1)
트리
정의
정점(노드)과 선분(브랜치)을 이용하여, 사이클을 이루지 않도록 구성한 특수한 그래프
(순환 구조가 없는 계층적 자료 구조)
관련 용어
- 노드: 자료 항목 + 가지(branch)
- 근 노드(Root Node): 최상위 노드
- 디그리(차수): 각 노드에서 뻗어나온 가지의 수
- 단말 노드(Terminal Node): 잎 노드(Leaf Node), 자식이 하나도 없는 노드, 디그리가 0
- 자식 노드 / 부모 노드 / 형제 노드
- 트리의 디그리: 트리 내에서 가장 높은 디그리(차수) 값
- 레벨(Level): 최상위 루트 노드를 레벨 1 또는 0으로 봤을 때, 내려갈 때마다 1씩 증가
운행법(Tree Traversal)
- Preorder 운행: Root → Left → Right
- Inorder 운행: Left → Root → Right
- Postorder 운행: Left → Right → Root
- Preorder 예시
- A13 → AB2E3 → ABDHIE3 → ABDHIECFG
- Inorder 예시
- 1A3 → 2BEA3 → HDIBEA3 → HDIBEAFCG
- Postorder 예시
- 13A → 2EB3A → HIDEB3A → HIDEBFGCA
4) 수식의 표기법
표기법
- 전위 표기법(Prefix): 예)
+AB
- 중위 표기법(InFix): 예)
A+B
- 후위 표기법(PostFix): 예)
AB+
Infix → PreFix, PostFix 변환 예시
X = A / B * (C + D) + E
- PreFix:
X + * / A B + C D E
- PostFix:
X A B / C D + * E + =
(일반적으로AB/CD+*E+
형태로 쓰기도 함)
PostFix → Infix 변환 예시
A B C - / D E F + * +
→ A / (B - C) + D * (E + F)
PreFix → Infix 변환 예시
+ / A - B C * D + E F
→ A / (B - C) + D * (E + F)
5) 정렬
삽입 정렬 (Insertion Sort)
- key 요소를 기준으로, 이미 정렬된 구간 사이의 올바른 자리를 찾아가며 삽입
- 일반적으로 두 번째 요소부터
key
로 잡고 시작
예시) 8 5 6 2 4
- (처음 key=5) → 5 8 | 6 2 4
- (다음 key=6) → 5 6 8 | 2 4
- (다음 key=2) → 2 5 6 8 | 4
- (다음 key=4) → 2 4 5 6 8
선택 정렬 (Selection Sort)
- 현재 위치에 적절한 원소를 선택해서 맨 앞으로 가져오는 방식
- 각 단계마다 가장 작은 값 찾아 맨 앞 값과 교체
예시) 8 5 6 2 4
- 최소값
2
찾아 맨 앞과 교체 → 2 5 6 8 4 - 남은 구간에서 최소값
4
찾아 두 번째 위치와 교체 → 2 4 6 8 5 - 남은 구간에서 최소값
5
찾아 세 번째 위치와 교체 → 2 4 5 8 6 - 남은 구간에서 최소값
6
찾아 네 번째 위치와 교체 → 2 4 5 6 8
버블 정렬 (Bubble Sort)
- 인접한 요소들끼리 비교하여 크면 뒤로 보내는 방식
- 한 단계 끝날 때마다 가장 큰 값이 뒤로 정렬됨
예시) 8 5 6 2 4
- 첫 번째 패스: (8,5) → (5,8), (8,6) → (6,8), (8,2) → (2,8), (8,4) → (4,8)
결과:5 6 2 4 8
- 두 번째 패스: (5,6) 통과, (6,2) → (2,6), (6,4) → (4,6)
결과:5 2 4 6 8
- 세 번째 패스: (5,2) → (2,5), (5,4) 통과, (4,6) 통과
결과:2 5 4 6 8
- 네 번째 패스: (5,4) → (4,5), ...
결과:2 4 5 6 8
퀵 정렬 (Quick Sort)
- 피벗을 기준으로 작은 값은 왼쪽, 큰 값은 오른쪽으로 분할(파티션)
- 분할과 정복 전략
- 평균 시간 복잡도: O(n log n), 최악의 경우: O(n^2)
힙 정렬 (Heap Sort)
- 완전 이진 트리(Complete Binary Tree)를 기반으로 한 힙(Heap)을 이용하는 정렬
- 전이진 트리를 힙으로 구성한 뒤 정렬 수행
- 시간 복잡도: O(n log n)
cf) 완전 이진 트리
- 마지막 레벨 제외 모든 레벨이 노드로 꽉 차있고, 마지막 레벨은 왼쪽부터 순차적으로 채워진 형태
합병 정렬 (Merge Sort)
- 이미 정렬된 여러 개의 부분 리스트를 합병(병합)하며 전체를 정렬
- 시간 복잡도: O(n log n)
6) 이진 검색 (Binary Search)
- 순서화된 자료구조(정렬된 상태)에서, 반으로 나누며 탐색 범위를 줄여가는 방식
- 비교할 때마다 검색 범위가 절반씩 감소
- 중간 레코드 위치 =
(first + last) / 2
7) 해싱 함수 (Hash Function)
1) 제산법(Division)
- 홈 주소: 해시테이블의 크기보다 큰 수 중 가장 작은 소수(Prime, Q)로 나눈 나머지
h(K) = K mod Q
2) 제곱법(Mid-Square)
- 홈 주소:
K^2
의 중간 부분 값
3) 폴딩법(Folding)
- 홈 주소: K를 여러 부분으로 나눈 후 각 부분의 합이나 XOR(배타적 논리합)
4) 기수 변환법(Radix)
- 키 숫자를 다른 진수로 변환 후 주소 범위에 맞게 조정
5) 대수적 코딩법
- 홈 주소: 키 값 각 자리의 비트수를 다항식의 계수로 간주, 이를 해시표 크기로 정의한 다항식으로 나눈 나머지
6) 숫자 분석법
- 키 값 숫자의 분포를 분석하여, 비교적 고른 자리를 택해서 홈 주소 지정
7) 무작위법(Randomizing)
- 난수를 이용한 방식
8) DB
DBMS (Database Management System)
- 데이터베이스를 관리하고, 사용자 요구(요청)에 따라 필요한 정보를 생성해주는 소프트웨어
필수 기능
- 정의 기능: 데이터 타입, 구조, 제약 조건 등을 명시 가능
- 조작 기능: CRUD 연산에 대한 인터페이스 제공
- 제어 기능: CUD(Create, Update, Delete) 연산의 정확성, 데이터 무결성 유지
장점
- 데이터 논리적/물리적 독립성 보장
- 중복 최소화로 기억 공간 절약
- 저장된 데이터 공동 이용, 데이터 표준화, 통합 관리, 최신성, 실시간 처리 가능
- 데이터의 일관성/무결성, 보안 유지
단점
- DB 전문가 부족
- 전산화 비용 증가
- 오버헤드(과부하) 발생 가능
- 백업, 리커버리 어려움
- 시스템 구조 복잡
스키마 (Schema)
- DB 구조, 제약 조건 등에 관한 명세를 기술한 메타데이터 집합
- 속성, 개체, 관계, 제약조건 등 포함
스키마 분류
- 외부 스키마
- 사용자나 개발자가 필요로 하는 부분적 DB 구조
- 개념 스키마
- DB 전체적인 논리적 구조
- 모든 응용프로그램이나 사용자가 필요로 하는 전체 DB
- 하나만 존재
- 내부 스키마
- 물리적 저장장치 관점에서 본 DB 구조
- 실제로 DB에 저장될 레코드 형식, 물리적 순서 등
절차형 SQL의 테스트와 디버깅
- 디버깅을 통해 기능의 적합성 검증, 실행 결과 확인
- 목적: 테스트 통해 오류 발견, 디버깅으로 오류 소스 코드 추적 및 수정
2. 통합 구현
1) 단위 모듈(Unit Module)
- SW 구현에 필요한 여러 동작 중, 단 하나의 동작을 수행하는 기능을 모듈화한 것
- 단위 기능: 단위 모듈로 구현되는 하나의 기능
- 사용자나 다른 모듈로부터 값을 전달받아 시작되는 작은 프로그램을 의미하기도 함
- 두 개의 단위모듈을 합쳐서 두 개 기능 구현 가능
- 구성요소: 처리문, 명령문, 데이터 구조 등
- 독립적으로 컴파일, 다른 모듈에 호출/삽입 가능
- 단위 기능 명세서 작성 후, 입출력 기능과 알고리즘 구현
2) IPC (Inter-Process Communication)
- 모듈 간 통신 방식을 구현하기 위해 사용되는 대표적인 프로그래밍 인터페이스 집합
- 복수 프로세스를 수행하며 이뤄지는 프로세스 간 통신도 구현 가능
대표 메소드
- Shared Memory
- 다수 프로세스가 공유 메모리를 통해 통신
- Socket
- 네트워크 소켓을 통한 통신
- Semaphores
- 공유 자원 접근 제어를 통해 통신
- Pipes & Named Pipes
- 파이프라는 메모리를 공유 (선입선출), 프로세스 간 동시 접근 불가
- Message Queueing
- 메시지를 큐에 담아 송수신
3) 단위 모듈 테스트 (Unit Test)
- 단위 기능을 구현하는 모듈이 정해진 기능을 정확히 수행하는지 확인
- 화이트박스 / 블랙박스 테스트 기법 사용
- 모듈 단독 실행 환경과 데이터가 필요
- 기능 단위로 디버깅 용이 / 시스템 전체 수준 오류는 못 잡음
4) 테스트 케이스(Test Case)
- 입력값, 실행조건, 기대결과 등 항목을 정리한 명세서
구성요소 (ISO/IEC/IEEE 29119-3 표준)
- 식별자
- 테스트 항목(대상)
- 입력 명세(입력값, 조건)
- 출력 명세
- 환경 설정(HW, SW)
- 특수 절차 요구사항
- 의존성 기술
5) 통합 개발 환경(IDE)
- 코딩, 디버그, 컴파일, 배포 등을 제공하는 소프트웨어 개발환경
- 대표 예: Eclipse, IntelliJ, Visual Studio, etc.
6) 빌드 도구
- 소스 코드를 제품 소프트웨어로 만드는 과정(전처리, 컴파일, 링크 등)
- Ant: 아파치, 자바 공식 빌드 도구
- Maven: 아파치, Ant 대안
- Gradle: Ant, Maven 보완
3. 소프트웨어 패키징
1) 소프트웨어 패키징
- 모듈별로 생성한 실행 파일을 묶어 배포용 설치 파일로 만드는 작업
- 사용자 중심으로 진행
- 소스코드는 모듈화하여 패키징
고려사항
- 사용자 시스템 환경 정의 (OS, CPU, 메모리 등)
- UI는 시각적인 자료와 함께 제공
- 하드웨어와 함께 관리되도록 Managed Service 형태로 제공
- 내부 콘텐츠 암호화 및 보안
- 다른 콘텐츠 및 단말기간 DRM 연동 고려
- 사용자 편의성을 위한 복잡성, 비효율성 문제 고려
- 소프트웨어 종류에 적합한 암호화 알고리즘 적용
2) 릴리즈 노트 (Release Note)
- 개발 과정의 릴리즈 정보를 최종 사용자와 공유하는 문서
- 테스트 진행 방법, 결과, 소프트웨어 사양 등을 확인 가능
- 전체 기능, 서비스 내용, 개선 사항 공유
- 버전 관리 및 릴리즈 정보 관리 용이
- 초기 배포 및 추가 배포 시 제공
초기 버전 작성 시 고려사항
- 현재 시제로 작성
- 신규 소스, 빌드, 변경/개선된 이력 작성
- 머릿말, 개요, 목적, 문제 요약, 재현 항목, 수정/개선 내용, 사용자 영향도, SW 지원 영향도, 노트, 면책 조항, 연락처 등
3) 디지털 저작권 관리(DRM)
- 원본 콘텐츠가 아날로그라면 디지털 변환 후 패키저로 DRM 패키징
- 콘텐츠 크기가 작은 경우(음원, 문서 등)는 실시간 패키징, 큰 경우 패키징 후 배포
- 패키징 시 저작권자의 전자서명 포함, 라이선스 정보가 클리어링 하우스에 등록
- 콘텐츠 사용 시, 클리어링 하우스에 등록된 라이선스로 사용자 인증 및 권한 여부 확인
- 종량제 방식일 경우, 사용량 측정 후 요금 부과
DRM 구성 요소
- 클리어링 하우스
- 저작권 사용 권한, 라이선스, 암호화 키, 사용량 기반 결제 관리
- 콘텐츠 제공자
- 저작권자
- 패키저
- 콘텐츠와 메타데이터를 배포 가능한 형태로 묶어 암호화하는 프로그램
- 콘텐츠 분배자
- 암호화된 콘텐츠를 유통 (서버 등)
- 콘텐츠 소비자
- 최종 사용자
- DRM 컨트롤러
- 배포된 콘텐츠 이용권한 통제 프로그램
- 보안 컨테이너
- 콘텐츠 원본을 안전하게 유통하기 위한 전자적 보안 장치
DRM 기술 요소
- 암호화 (+전자 서명)
- 키 관리
- 암호화 파일 생성(Packager)
- 식별 기술
- 저작권 표현
- 정책 관리
- 크랙 방지
- 인증
4) 소프트웨어 매뉴얼
설치 매뉴얼
- 사용자 관점에서 작성
- 설치 방법 전 과정을 순서대로 기술
- 오류 메시지, 예외 상황은 별도 분류하여 설명
- 목차/개요, 서문, 기본 사항 포함
기본 사항
- 소프트웨어 개요: 주요 기능 및 UI를 그림과 함께 설명
- 설치 관련 파일: 설치 시 필요한 exe, ini, log 등 파일 설명
- 설치 아이콘(바로 가기 등)
- 프로그램 삭제(제거) 방법
- 관련 추가 정보
사용자 매뉴얼
- 사용 과정에서 필요한 내용에 대한 문서
- 오류 패치, 기능 업그레이드 등을 위해 매뉴얼 버전 관리 필요
- 개별 동작 가능한 컴포넌트 단위로 작성
- 컴포넌트 명세서, 구현 설계서 등을 토대로 작성
- 목차/개요, 서문, 기본 사항 등 포함
5) 형상 관리 (Configuration Management)
- Git, CVS, Subversion 등
- SW 변경사항 추적, 통제
- 무절제한 변경 방지
- 버그/수정사항 추적
- 진행 상태 및 배포본 관리 효율
- 여러 개발자 동시 개발 가능
기능
- 형상 식별
- 형상관리 대상에 이름/관리번호 부여, 계층 구조로 구분
- 버전 제어
- 다른 버전의 형상 항목 관리
- 형상 통제(변경 관리)
- 변경 요구 검토, 승인 등
- 형상 감사
- 형상 기록(상태 보고)
소프트웨어 버전 등록 관련 주요 기능
- 저장소(Repository): 최신 버전 파일, 변경 정보 저장
- 가져오기(Import): 빈 저장소에 파일 복사
- 체크아웃(Checkout): 저장소에서 파일 받아옴
- 체크인(Checkin): 수정된 소스를 저장소에 반영
- 커밋(Commit): 충돌 해결 후, 최종 변경 사항 반영
- 동기화(Synchronize)
방식별 분류
공유 폴더 방식
- 로컬 컴퓨터의 공유 폴더에 버전 관리 자료 저장
- SCSS, RCS, PVCS, QVCS 등
클라이언트/서버 방식
- 중앙 서버에 저장
- CVS, SVN(Subversion), CVSNT, Clear Case, CMVC, Perforce 등
분산 저장소 방식
- 원격 저장소 + 분산된 개발자 PC의 로컬 저장소에 함께 저장
- Git, GNU arch, DCVS, Bazaar, Mecurial, TeamWare, BitKepper, Plastic SCM 등
대표적 형상관리 기술
Subversion(SVN)
- CVS 개선, 아파치에서 개발
- 클라이언트/서버 구조
- 서버에는 최신 파일, 클라이언트에서 받아서 수정 → 다시 서버에 반영
- trunk 디렉토리에서 주 개발, branches 디렉토리에서 분기 개발
- 커밋 시 리비전 번호가 1씩 증가
- 오픈 소스, 무료
- CVS 단점(파일/디렉토리명 변경, 이동 등)을 보완
Git
- 리누스 토발즈 개발, 분산 버전 관리 시스템
- 로컬 저장소 + 원격 저장소
- 버전 관리가 로컬에서 이루어져, 네트워크 문제 시에도 작업 가능
- 브랜치(Branch)로 기존 코드 영향 없이 다양한 테스트 가능
- 스냅샷(Snapshot): 파일 변화 시, 이전 스냅샷 포인터 유지 → 버전 흐름 파악 용이
6) 빌드 자동화 도구
- 소스 코드 컴파일, 모듈 묶어 실행 파일로 만드는 빌드, 테스트, 배포 과정 자동화
- 지속적 통합(CI) 환경에서 사용
대표 도구
- Ant, Make, Maven, Gradle, Jenkins 등
Jenkins
- 자바 기반 오픈소스
- 서블릿 컨테이너에서 실행되는 서버 기반 도구
- 형상관리 도구 연동, 웹 UI 제공
- 분산 빌드/테스트 가능
Gradle
- Groovy 기반 오픈소스
- Groovy로 만든 DSL 사용
- 실행 명령을 태스크(Task)로 묶어 실행
- 빌드 캐시 기능: 태스크 재사용 및 공유
4. 애플리케이션 테스트
1) 애플리케이션 테스트
- 잠재 결함을 찾아내는 일련의 행위
- 요구사항 만족 여부 확인, 기능 수행 검증
2) 테스트 관련 용어
- 결함 집중(Defect Clustering): 대부분 결함이 일부 모듈에 집중
- 파레토 법칙(80:20 법칙): 80% 오류는 20% 모듈에서 발견 → 특정 모듈 집중 테스트
- 살충제 패러독스: 동일 테스트 반복 시 오류 발견 어려움, 테스트 케이스 지속 개선 필요
- 오류 부재의 궤변: 오류가 없어도, 요구사항 불만족이면 품질이 낮다
3) 실행 여부에 따른 분류
- 정적 테스트
- 프로그램 실행 없이 명세서, 소스 코드 등을 대상으로
- 예) 워크스루, 인스펙션, 코드 검사
- 동적 테스트
- 프로그램을 실행하여 테스트
- 예) 블랙박스, 화이트박스 테스트
4) 테스트 기반에 따른 분류
- 명세 기반 테스트(Specification Based)
- 요구사항 명세를 기반
- 예) 동등 분할, 경계 값 분석
- 구조 기반 테스트(Structure Based)
- SW 내부 논리 흐름 기반
- 예) 구문/결정/조건 기반
- 경험 기반 테스트(Experience Based)
- 과거 경험이나 직관
- 예) 에러 추정, 체크리스트, 탐색적 테스팅
5) 시각에 따른 분류
- 검증 테스트
- 개발자 시각, 명세서와 일치 여부
- 확인 테스트
- 사용자 시각, 요구사항 만족 여부
6) 목적에 따른 분류
- 회복 테스트: 시스템에 결함 주어 실패 유도 → 올바르게 복구되는지
- 안전 테스트: 보안, 보호 도구가 침입 차단하는지
- 강도 테스트(Stress Test): 시스템 과부하 시 동작
- 성능 테스트: 처리 속도, 자원 사용률, 반응 시간
- 구조 테스트: SW 내부 논리, 소스코드 복잡도
- 회귀 테스트: 변경/수정 후 새로운 결함 발생 여부
- 병행 테스트: 변경된 SW와 기존 SW에 동일 입력 → 결과 비교
7) 화이트박스 테스트
- 소스 코드 내부 논리 기반, 프로그램 제어 구조 중심
- 모든 문장을 한 번 이상 실행
- 분기점(조건/반복) 검사로 논리적 경로 제어
종류
- 기초 경로 검사: 대표적, 논리적 복잡도 측정해 경로 기초 정의
- 제어 구조 검사: 조건 검사, 루프 검사, 데이터 흐름 검사
검증 기준
- 문장(구문) 커버리지: 모든 문장을 최소 1회 이상 실행
- 분기(결정) 커버리지: 조건문 true/false 각각 한 번 이상 실행
- 조건 커버리지: 조건문 내 개별 조건식 true/false
- 분기/조건 커버리지
8) 블랙박스 테스트
- 각 기능이 명세서 대로 완전한지 확인 (기능 테스트)
- 내부 구조 X, 인터페이스만 확인
- 요구/명세 기반, 테스트 과정 후반부
종류
- 동등 분할 검사: 입력 자료를 타당/부적합으로 분할
- 경계값 분석: 경계 영역에서 오류 발생 확률 높음
- 원인-효과 그래프 검사: 입출력 상황 분석, 효율적 테스트 케이스 선정
- 오류 예측 검사: 과거 경험/감각으로 검사 (보충적)
- 비교 검사: 여러 버전 프로그램에 동일 자료 입력, 출력 비교
9) 개발 단계에 따른 애플리케이션 테스트
단위 테스트 (Unit Test)
- 모듈, 컴포넌트 검증
- 사용자 요구사항 기반 기능성 테스트
- (주로) 구조 기반 테스트
- 알고리즘 오류, 반복문, 잘못된 수식 확인
통합 테스트 (Integration Test)
- 단위 테스트 완료된 모듈을 결합해 시스템 완성
- 비점진적 통합(빅뱅) vs. 점진적 통합(하향식, 상향식, 혼합식)
하향식 통합 테스트
- 상위 → 하위 모듈
- 초기부터 전체 구조 파악 용이
- 스텁(Stub) 필요
상향식 통합 테스트
- 하위 → 상위 모듈
- 테스트 드라이버(Driver) 필요
테스트 드라이버와 스텁
- 드라이버: 상위 모듈이 없는 상태에서 하위 모듈 테스트 시, 호출/매개변수 전달 역할
- 스텁: 하위 모듈이 없는 상태에서 상위 모듈 테스트 시, 하위 모듈 흉내
시스템 테스트
- 실제 사용 환경과 유사하게, 개발된 SW가 완벽히 수행되는지 테스트
- 기능적/비기능적 요구 모두 확인
인수 테스트
- 사용자 요구사항 충족 여부
- 사용자(또는 요청자)가 직접 테스트
- 알파 테스트: 개발자 앞, 통제된 환경
- 베타 테스트: 특정 사용자가 실제 환경에서
10) 회귀 테스팅 (Regression Testing)
- 테스트된 프로그램에 대한 재테스트
- 통합 중 변경된 모듈, 컴포넌트 영향 검사
- 수정 부분이 새 오류를 발생시키지 않도록 보증
11) 애플리케이션 테스트 프로세스
- 테스트 계획: 목표, 대상, 범위 결정
- 테스트 분석 및 디자인
- 테스트 케이스 및 시나리오 작성
- 테스트 수행
- 테스트 결과 평가 및 리포팅
- 결함 추적 관리
12) 테스트 케이스 (Test Case)
- 요구사항 준수 여부 확인 위해 설계된 테스트 항목 명세서
- 입력값, 실행 조건, 기대 결과 포함
- (명세 기반 테스트의 산출물)
- 시스템 설계 단계에서 작성 권장
테스트 시나리오 (Test Scenario)
- 테스트 케이스들을 적절한 수행 순서로 묶은 집합
테스트 오라클 (Test Oracle)
- 테스트 결과가 정상인지 판단하기 위해 참(예상) 값과 비교하는 기법
종류
- 참 오라클: 모든 테스트 케이스에 기대값 제공
- 샘플링 오라클: 일부 케이스만
- 추정 오라클: 일부만 실제 결과, 나머지는 추정
- 일관성 검사 오라클: 변경 전후 결과 동일성 확인
13) 테스트 자동화 도구
- 수작업 테스트를 자동화 스크립트로 대체
유형
- 정적 분석 도구
- 프로그램 실행 없이 코드 표준, 스타일, 복잡도 등 점검
- 예) pmd, cppcheck, SonarQube, checkstyle, ccm, cobertura
- 테스트 케이스 생성 도구
- 자료 흐름도, 기능 테스트, 입력 도메인 분석, 랜덤 테스트 등
- 테스트 실행 도구
- 자동화된 스크립트 방식
- 데이터 주도, 키워드 주도 접근
- 성능 테스트 도구
- 테스트 통제 도구
- 테스트 계획, 관리, 수행, 결함 관리
- 테스트 하네스 도구
- 테스트 환경(드라이버, 스텁 등) 제공
- 컴포넌트/모듈 테스트 지원
테스트 하네스 구성요소
- 테스트 드라이버
- 테스트 스텁
- 테스트 슈트(테스트 케이스들의 집합)
- 테스트 케이스
- 테스트 스크립트
- 목 오브젝트(Mock Object)
14) 결함 (Defect)
- 오류, 작동 실패 등 이상 동작
- 기대값/결과 간의 차이, 업무 내용 불일치도 결함에 포함
15) 애플리케이션 성능 분석
- 요구 기능을 최소 자원으로 빠르게 처리하는 정도
성능 측정 지표
- 처리량(Throughput)
- 응답 시간(Response Time): 요청~응답
- 경과 시간(Turnaround Time): 작업 의뢰~처리 완료
- 자원 사용률(Resource Utilization)
빅 오 표기법 (Big-O Notation)
- 알고리즘의 실행 시간(최악 시나리오) 표기
- 예)
- O(1): 입력값과 무관, 한 단계
- O(log n): 이진 검색 등
- O(n): 입력값에 비례
- O(n log n): 힙정렬, 합병 정렬 등
- O(n^2): 삽입, 선택, 버블, 퀵(최악) 등
- O(2^n): 피보나치 등
순환 복잡도 (Cyclomatic Complexity)
- 프로그램의 논리적 복잡도 측정
- 맥케이브 순환도(맥케이브 복잡도) 사용
- 제어 흐름도에서 경로 수 정의 → 테스트 상한선
- E: 간선(화살표) 수
- N: 노드 수
- V(G) = E - N + 2
16) 소스 코드 최적화
- 클린 코드: 단순 명료하고, 읽기 쉬우며, 유지보수성이 높은 코드
- 나쁜 코드(Bad Code): 복잡, 스파게티 코드, 외계인 코드 등
클린 코드 작성 원칙
- 가독성
- 단순성: 한 번에 한 가지 처리
- 의존성 최소화: 변경 시 영향 최소화
- 중복성 최소화
- 추상화: 상위 수준에서 핵심 특성만 표현
17) 소스 코드 품질 분석 도구
- 정적 분석 도구
- 프로그램 실행 없이 코드 표준, 스타일, 결함 확인
- 자료 흐름/논리 흐름 분석 → 비정상 패턴 감지
- pmd, cppcheck, SonarQube, checkstyle, ccm, cobertura
- 동적 분석 도구
- 실제 실행하며 메모리 누수, 스레드 결함 등 분석
- Avalanche, Valgrind 등
4. 인터페이스
1) EAI (Enterprise Application Integration)
- 기업 내 애플리케이션/플랫폼 간 정보 연동 솔루션
- 비즈니스 간 통합, 연계성 증대 → 효율성/확장성 ↑
구축 유형
- Point-to-point
- 1:1 연결, 변경/재사용 어려움
- Hub & Spoke
- 중앙 집중형(허브), 확장/유지보수 용이, 허브 장애 시 전체 영향
- Message Bus(ESB)
- 애플리케이션 사이에 미들웨어 버스, 확장성 높고 대용량 처리 가능
- Hybrid
- Hub&Spoke + Message Bus 혼합
ESB (Enterprise Service Bus)
- 서비스 중심 통합 지향
- 애플리케이션과 Loose Coupling으로 범용성 확보
- 관리, 보안 유지 쉬움
2) JSON (JavaScript Object Notation)
- 속성-값 쌍, AJAX에서 XML 대체로 많이 사용
3) XML (eXtensible Markup Language)
- 다목적 마크업 언어
- HTML의 비호환성 문제 해결
- 구조화된 데이터 표현
4) AJAX (Asynchronous JavaScript and XML)
- 클라이언트-서버 간 비동기 통신 기술
- XML(또는 JSON) 기반 데이터 교환
- 웹 페이지 새로고침 없이 서버와 통신
5) 인터페이스 보안 기능 적용
- 일반적으로 네트워크, 애플리케이션, DB 영역에 보안 적용
네트워크 영역
- 스니핑(도청) 방지 위해 네트워크 트래픽 암호화
- IPSec, SSL, S-HTTP 등
- IPSec: IP 단에서 암호화, 양방향 암호화 가능
애플리케이션 영역
- 소스 코드 보안 취약점 보완
데이터베이스 영역
- DB, 스키마, 엔티티 접근 권한, 프로시저/트리거 등 관리
6) 데이터 무결성 검사 도구
- 시스템 파일 변경 시 알려줌
- 인터페이스 보안 취약점 분석에 사용
- 해시를 이용해 파일 변조 감지
- Tripwire, AIDE, Samhain, Claymore, Slipwire, Fcheck 등
7) 인터페이스 구현 검증 도구
- xUnit
- 단위 테스트 프레임워크(JUnit, CppUnit, NUnit, HttpUnit 등)
- STAF(Software Testing Automation Framework)
- 서비스 호출, 컴포넌트 재사용 등 다양한 환경 지원
- 크로스 플랫폼, 분산 테스트 지원
- FitNesse
- 웹 기반 테스트 케이스 설계/실행/결과 확인
- NTAF
- 네이버의 테스트 자동화 프레임워크
- FitNesse 협업 기능 + STAF 재사용성/확장성
- Selenium
- 브라우저 자동화 테스트 프레임워크
- watir: Ruby 기반
8) APM (Application Performance Management/Monitoring)
- 애플리케이션 성능 관리/모니터링
- 접속자, 자원 현황, 트랜잭션, 장애 진단 등
- 리소스 방식: Nagios, Zabbix, Cacti
- 엔드투엔드 방식: VisualVM, 제니퍼, 스카우터 등
'📜 Certs > 정보처리기사' 카테고리의 다른 글
[정보처리기사] 정보 시스템 구축 관리 - 5과목 정리 (4) | 2025.01.30 |
---|---|
[정보처리기사] 프로그래밍 언어 활용 - 4과목 정리 (2) | 2025.01.28 |
[정보처리기사] 데이터베이스 구축 - 3과목 정리 (3) | 2025.01.28 |
[정보처리기사] 소프트웨어 설계 - 1과목 정리 (3) | 2025.01.22 |