Post

정보처리기사 2과목 소프트웨어 개발 핵심노트

정렬 알고리즘

정렬된 N개의 데이터 처리에 대한 시간복잡도

정렬평균최악최적
선택정렬$O(n^2)$$O(n^2)$$O(n^2)$
삽입정렬$O(n^2)$$O(n^2)$$O(n)$
버블정렬$O(n^2)$$O(n^2)$$O(n)$
병합정렬$O(Nlog_2N)$$O(Nlog_2N)$$O(Nlog_2N)$
힙정렬$O(Nlog_2N)$$O(Nlog_2N)$$O(Nlog_2N)$
퀵정렬$O(Nlog_2N)$$O(n^2)$$O(Nlog_2N)$
트리정렬$O(Nlog_2N)$$O(n)$$O(Nlog_2N)$

평균 기준

  • $O(n^2)$: 제곱형 복잡도 (선택정렬, 삽입정렬, 버블정렬)
  • $O(Nlog_2N)$: 선형 로그형 복잡도 (병합정렬, 힙정렬, 퀵정렬, 트리정렬)
  • $O(1)$: 상수형 복잡도 (해시함수)
  • $O(logN)$: 로그형 복잡도 (이진탐색)
  • $O(N)$: 선형 복잡도 (순차탐색)

선택 정렬 (오름차순)

PASS비교설명결과
초기자료69 10 30 2 16 69, 10, 30, 2, 16
PASS 169 10 30 2 16최소값 2 와 기준위치 69 를 교환2, 10, 30, 69, 16
PASS 22 10 30 69 16최소값과 기준위치가 동일하므로 교환 없음2, 10, 30, 69, 16
PASS 32 10 30 69 16최소값 16 과 기준위치 30 을 교환2, 10, 16, 69, 30
PASS 42 10 16 69 30최소값 30 과 기준위치 69 를 교환2, 10, 16, 30, 69

삽입 정렬 (오름차순)

PASS비교설명결과
초기자료8 3 4 9 7 8, 3, 4, 9, 7
PASS 18 | 3 4 9 78과 3을 비교하여 8 앞으로 삽입3, 8, 4, 9, 7
PASS 23 8 | 4 9 73, 8과 4를 비교하여 8 앞으로 삽입3, 4, 8, 9, 7
PASS 33 4 8 | 9 73, 4, 8과 9를 비교하여 8 뒤으로 삽입3, 4, 8, 9, 7
PASS 43 4 8 9 | 73, 4, 8, 9와 7를 비교하여 8 앞으로 삽입3, 4, 7, 8, 9

버블 정렬 (오름차순)

PASS비교설명결과
초기자료9 6 7 3 5 9, 6, 7, 3, 5
PASS 19 6 7 3 5
6 | 9 7 3 5
6 7 | 9 3 5
6 7 3 | 9 5
96을 비교
97을 비교
93을 비교
95를 비교
6, 9, 7, 3, 5
6, 7, 9, 3, 5
6, 7, 3, 9, 5
6, 7, 3, 5, 9
PASS 26 7 3 5 9
6 | 7 3 5 9
6 3 | 7 5 9
67을 비교
73을 비교
75를 비교
6, 7, 3, 5, 9
6, 3, 7, 5, 9
6, 3, 5, 7, 9
PASS 36 3 5 7 9
3 | 6 5 7 9
63을 비교
65를 비교
3, 6, 5, 7, 9
3, 5, 6, 7, 9
PASS 43 5 6 7 935를 비교3, 5, 6, 7, 9

퀵 정렬

  • 분할 정복(Divide and Conquer)에 기반한 알고리즘

    분할 정복

    그대로 해결할 수 없는 문제를 작은 문제로 분할하여 해결하는 방법

  • 피벗(pivot)을 사용하며, 최악의 경우 $O(n^2)$의 비교를 수행해야한다.

힙 정렬

  • 정렬할 입력 레코드들로 힙을 구성하고 가장 큰 키 값을 갖는 루트 노드를 제거하는 과정을 반복하여 정렬하는 기법
  • 완전 이진트리(complete binary tree)로 입력자료의 레코드를 구성한다.
  • 평균, 최악, 최적 수행시간이 모두 $O(Nlog_2N)$ 이다.

이진 탐색

찾는 값 14

초기자료 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

PASSlowhighmiddle
PASS 11158
PASS 291512
PASS 3131514

데이터 목록은 반드시 사전에 오름차순으로 정렬되어 있어야 한다.


소스코드 품질분석 도구

정적 분석 도구

  • pmd
    코드 결함 분석
  • checkstyle
    java 코드 표준 준수 검사
  • cppcheck
    C/C++ 오버플로우 검사
  • SonarQube
    중복코드, 복잡도, 코딩설계 등을 분석
  • ccm
    다양한 언어의 복잡도 분석

동적 분석 도구

  • Valance
  • Avalanche
    프로그램의 결함 및 취약점 분석
  • Valgrind
    프로그램 메모리 및 쓰레드 결함 분석

테스트 관련 용어

테스트 케이스 (Test Case)

  • 구현된 소프트웨어가 사용자의 요구사항을 정확하게 준수했는지 확인하기 위해 설계된 입력값, 실행 조건, 기대 결과 등으로 구성된 테스트 항목에 대한 명세서
  • 테스트 수행 도구
    • 자료 흐름도
    • 랜덤 테스트
    • 입력 도메인 분석
    • 기능 테스트

테스트의 목표 및 테스트 방법을 결정한 후 작성해야한다.

테스트 슈트 (Test Suites)

  • 테스트 대상 컴포넌트나 모듈, 시스템에 사용되는 테스트 케이스의 집합

테스트 시나리오 (Test Scenario)

  • 테스트 케이스를 적용하는 순서에 따라 여러 개의 테스트 케이스들을 묶은 집합

테스트 오라클 (Test Oracle)

  • 테스트의 결과가 참인지 거짓인지를 판단하기 위해서 사전에 정의된 참값을 입력하여 비교하는 기법 및 활동
  • 참(True) 오라클, 샘플링(Sampling) 오라클, 휴리스틱(추정, Heuristic) 오라클, 일관성(Consistent) 검사 오라클

테스트 레벨

  1. 단위 테스트 (Unit Test)

    개별 모듈을 테스트

    • 단위 테스트 종류
      • 명세 기반 테스트
        • 주어진 명세를 빠짐없이 테스트 케이스로 구현하고 있는지 확인하는 테스트
      • 구조 기반 테스트
        • 프로그램 내부 구조 및 복잡도를 검증하는 화이트박스 테스트 시행, 제어 흐름과 조건 결정 등이 목적
    • 단위 테스트 도구
      • CppUnit: C++ 프로그래밍 언어용 단위 테스트 도구
      • JUnit: Java 프로그래밍 언어용 단위 테스트 도구
      • HttpUnit: 웹 브라우저 없이 웹 사이트 테스트를 수행하는 데 사용되는 오픈소스 테스트 프레임워크
  2. 통합 테스트 (Integration Test)

    모듈을 통합하는 과정에서 모듈 간 호환성을 테스트

    • 하향식 통합 테스트 (Top Down Integration Test)
      • 깊이 우선 통합법, 넓이 우선 통합법 사용
      • 테스트 초기부터 사용자에게 시스템 구조를 보여줄 수 있다.
      • 상위 모듈에서는 테스트 케이스를 사용하기 어렵다.
      • 절차
        1. 주요 제어 모듈은 작성된 프로그램을 사용하고, 주요 제어 모듈의 종속 모듈들은 스텁(Stub) 으로 대체한다.
        2. 깊이우선 or 넓이우선 등의 통합방식에 따라, 하위 모듈인 스텁들이 한 번에 하나씩 실제모듈로 교체된다.
        3. 모듈이 통합될때마다 테스트 실시
        4. 새로운 오류가 발생하지 않음을 보증하기 위해 회귀 테스트 실시

        Test Stub

        - 테스트 대상 모듈이 호출하는 하위 모듈의 역할을 한다.

    • 상향식 통합 테스트 (Bottom Up Integration Test)
      • 하위 모듈에서 상위 모듈 방향으로 통합하면서 테스트 하는 방법
      • 가장 하위 단계의 모듈부터 통합 및 테스트가 수행되므로 스텁은 필요하지 않다.
      • 하나의 주요 제어 모듈과 관련된 종속 모듈의 그룹인 클러스터(Cluster)는 필요하다.
      • 절차
        1. 하위 모듈을 클러스터로 결합
        2. 상위 모듈에서 데이터의 입출력을 확인하기 위해 모듈인 드라이버 작성
        3. 통합된 클러스터 단위로 테스트
        4. 테스트가 완료되면 클러스터는 프로그램 구조의 상위로 이동하여 결합하고, 드라이버는 실제 모듈로 대체

        Test Driver

        - 시험 대상 모듈을 호출하는 간이 소프트웨어
        - 매개변수를 전달
        - 모듈을 수행한 후 결과를 보여줄 수 있다.

  3. 시스템 테스트 (System Test)

    완전한 시스템에 대해 수행, 기능적, 비기능적 요구사항을 만족하는지 테스트

    • 기능적 요구사항
      • 시스템이 실제로 어떻게 동작하는지에 관점을 둔 요구사항
    • 비기능적 요구사항
      • 시스템 구축에 대한 성능, 보안, 품질, 안정 등에 대한 성능, 보안, 품질, 안정성 등으로 실제 수행에 보조적인 요구사항

    ‘차량 대여 시스템이 제공하는 모든 화면이 3초 이내에 사용자에게 보여야 한다’ 는 성능에 해당 하므로 비기능적 요구사항에 해당한다.

  4. 인수 테스트 (Acceptance Test)

    계약상의 요구사항이 만족되었는지 확인하기 위한 테스트

    • 알파 테스트
      • 개발자의 장소에서 사용자가 개발자 앞에서 행하는 테스트
    • 베타 테스트
      • 선정된 최종 사용자가 여러 명의 사용자 앞에서 행하는 테스트 기법 (= 필드 테스팅)

테스트 기법

White Box Testing

화이트 박스 테스트란?

  • 개발자 관점의 단위 테스트 (내부 소스 코드를 테스트)
  • 원시 코드의 논리적인 모든 경로를 테스트
  • 설계된 절차에 초점을 둔 구조적 테스트며, 테스트 과정의 초기에 적용
  • 모듈 안의 작동을 직접 관찰한다.
  • 원시 코드(모듈)의 모든 문장을 한 번 이상 실행함으로써 수행된다.

화이트 박스 테스트의 종류

  • 기초 경로 검사 (Base Path Testing)
    • 대표적인 화이트박스 테스트 기법
  • 제어 구조 검사 (Control Structure Testing)
    • 조건 검사 (Condition Testing)
    • 루프 검사 (Loop Testing)
    • 데이터 흐름 검사 (Data Flow Testing)

구조적 커버리지 종류

  • 구문[문장] 커버리지 (SC, Statement Coverage)
    • 모든 문장이 적어도 한번 수행
  • 결정[분기] 커버리지 (DC, Decision Coverage)
    • 모든 결정의 조건식이 적어도 한 번은 참(T)과 거짓(F)의 결과가 되도록 수행
  • 조건 커버리지 (CC, Condition Coverage)
    • 전체 조건식의 결과와 관계없이 각 개별 조건식이 참/거짓 한번 모두 갖도록 수행
  • 조건/결정 커버리지 (C/DC, Condition Decision Coverage)
    • 전체 조건식 참/거짓 한번씩 하면서 개별 조건식 참/거짓 모두 한번씩 수행
  • 변경조건/결정 커버리지 (MC/DC, Modified Condition Decision Coverage)
    • 결정 내부의 하나의 조건이 다른 조건과 무관하게 독립적으로 결정에 영향을 주는 경우를 추가
    • 결정 포인트 내 모든 개별 조건식은 독립적으로 전체 조건식에 영향
  • 다중 조건 커버리지 (MCC, Multiple Condition Coverage)
    • 결정 포인트 내의 모든 개별 조건식의 모든 가능한 논리적 조합 100% 보장
  • 경로 커버리지 (APC, All Path Coverage)

Black Box Testing

블랙 박스 테스트란?

  • 사용자 관점의 테스트 (작동 원리를 모르는 상태에서 동작을 검사)
  • 사용자의 요구사항 명세를 보면서 테스트 하는 것이다
  • 주로 구현된 기능을 테스트한다.
  • 소프트웨어 인터페이스에서 실시되는 테스트
  • 테스트 과정 후반부에 적용

블랙 박스 테스트의 종류

  • 동치 분할 검사 (Equivalence Partitioning Testing)
    • 입력 자료에 초점을 맞춰 테스트 케이스를 만들고 검사하는 방법이다. 동등 분할 기법이라고도 한다.
  • 경계값 분석 (Boundary Value Analysis)
    • 동치 분할 기법을 보완하기 위한 기법
    • 입력 조건의 중간값보다 경계값에서 오류가 발생할 확률이 높다는 점을 이용하여 입력 조건의 경계값을 테스트 케이스로 선정하여 검사하는 기법
  • 원인-효과 그래프 검사 (Cause-Effect Graphing Testing)
    • 그래프를 활용하여 입력 데이터 간의 관계 & 출력에 비치는 영향을 분석하여 효용성이 높은 테스트 케이스를 선정하여 테스트
  • 오류 예측 검사 (Error Guessing)
    • 과거의 경험이나 확인자의 감각으로 테스트하는 기법
    • 데이터 확인 검사라고도 한다.
  • 비교 검사 (Comparison Testing)
    • 여러 버전의 프로그램에 동일한 테스트 자료를 제공하여 동일한 결과가 출력 되는지 테스트하는 기법
  • 결정 테이블 검사 (Decision Table Testing)
    • 요구사항의 논리와 발생조건을 테이블 형태로 나열하여, 조건과 행위를 모두 조합하여 테스트하는 기법
  • 페어와이즈 검사 (Pairwise Testing)
    • 테스트 데이터 간에 최소 1번씩 조합, 조합 범위에 비해 적은 양의 테스트 세트 구성
  • 분류 트리 검사 (Classification Tree Method Testing)
    • SW의 일부 또는 전체를 트리 구조로 분석 및 표현하여 테스트 케이스를 설계하여 테스트하는 기법

테스트의 기본원칙

  • 테스트는 결함이 존재함을 밝히는 활동이다.
  • 완벽한 테스팅은 불가능하다.
  • 테스팅은 개발 초기 단계에서부터 시작해야 한다.
  • 결함 집중
    • 파레토 법칙이 좌우한다. (오류의 80%는 전체 모듈의 20%에서 발견)
    • 애플리케이션 결함의 대부분은 소수의 특정한 모듈에 집중되어 존재한다.
    • 결함은 발생한 모듈에서 계속 추가로 발생할 가능성이 높다.
  • 살충제 패러독스
    • 동일한 테스트 케이스를 반복하면 더 이상 새로운 결함이 발견되지 않는 현상

테스트 자동화 도구

  • 정적 분석 도구 (Static Analysis Tools)
    • 프로그램을 실행하지 않고 분석하는 도구
    • 소스 코드의 코딩 표준, 코딩 스타일, 코드 복잡도, 남은 결함 등을 발견하기 위해 사용
  • 테스트 실행 도구 (Test Execution Tools)
    • 스크립트 언어를 사용하여 테스트를 실행하는 방법
    • 데이터 주도 접근 방식, 키워드 주도 접근 방식이 있다.
  • 성능 테스트 도구 (Performance Test Tools)
    • 애플리케이션의 처리량, 응답 시간, 경과 시간, 자원 사용률에 대해 가상의 사용자를 생성하고 테스트를 수행함으로써 성능 목표를 달성하였는지를 확인
  • 테스트 통제 도구 (Test Control Tools)
    • 테스트 계획 및 관리, 테스트 수행, 결함 관리 등을 수행하는 도구
    • 형상 관리 도구, 결함 추적, 결함 관리 도구
  • 테스트 하네스 도구 (Test Harness Tools)
    • 테스트가 실행될 환경을 시뮬레이션 하여 컴포넌트 및 모듈이 정상적으로 테스트되도록 한다.

    테스트 하네스

    애플리케이션의 컴포넌트 및 모듈을 테스트하는 환경의 일부분으로, 테스트를 지원하기 위해 생성된 코드와 데이터


하향식/상향식 설계

하향식 설계

  • 계층 구조상에서 시스템의 주요 컴포넌트들을 찾고 그것을 낮은 수준의 컴포넌트들로 분해하는 것으로 단계적 정제라 하며 메인 모듈의 설계에서 시작하여 단계적으로 구체화시키는 것
  • 하향식 설계에서는 통합 검사 시 인터페이스가 이미 정의되어 있어 통합이 간단하다.
  • 하향식 설계에서 레벨이 낮은 데이터 구조의 세부 사항은 설계초기 단계에서 필요하다.
  • 시스템 명세가 명확한 경우와 모든 것을 새로 개발하는 작업에는 하향식이 적합하다.

상향식 설계

  • 가장 기본적인 컴포넌트를 먼저 설계한 다음 이것을 사용하는 상위 수준의 컴포넌트를 설계하는 것
  • 상향식 설계는 최하위 수준에서 각각의 모듈들을 설계하고 이러한 모듈이 완성되면 이들을 결합하여 설계하는 방식으로 인터페이스가 이미 성립되어 있지 않으면 기능 추가가 어렵다.
  • 기존 컴포넌트들을 조합하여 시스템을 개발하는 경우 상향식이 적합하다.

아키텍쳐 설계과정

  1. 설계 목표 설정
  2. 시스템 타입 결정
  3. 아키텍쳐 패턴 적용
  4. 서브시스템 구체화
  5. 검토

아키텍쳐 패턴

아키텍쳐 설계 시 발생하는 문제들을 해결하기 위해 미리 만들어 놓은 해결방식


외계인 코드

  • 아주 오래되거나 참고문서 또는 개발자가 없어 유지보수 작업이 어려운 프로그램

해싱 함수 (Hashing Function)

  • 제곱법 (mid-square)
  • 숫자분석법 (digit analysis)
    키 값을 이루는 숫자의 분포를 분석하여 비교적 고른 자리를 필요한 만큼 선택
  • 제산법 (division)
    레코드키를 해시표로 나눈 나머지를 홈 주소로 사용
  • 중첩법[폴딩법]
    레코드 키를 여러 부분으로 나누고 나눈 부분의 각 숫자를 더하거나 XOR한 값을 홈 주소로 사용
  • 기수 변환법
    키 숫자의 진수를 다른 진수로 변환시켜 주소 크기를 초과한 높은 자릿수 절단, 다시 주소 범위에 맞게 조정
  • 무작위 방법

제어흐름 그래프

McCabe의 cyclomatic 수를 구하는 방법

flowchart TD
    A(("A"))
    B(("B"))
    C(("C"))
    D(("D"))

    A --> B --> C <--> D --> A
    A --> C

V(G) = Edge - Node + 2
Edge = 6 (화살표)
Node = 4 (동그라미)

V(G) = 6 - 4 + 2 = 4


EAI (Enterprise Application Integration)

  • 기업 내 각종 애플리케이션 및 플랫폼 간의 정보 전달 연계 통합 등 상호연동이 가능하게 해주는 솔루션

EAI 구축 유형

  • Point-to-Point
    가장 기본적인 애플리케이션 통합 방식 (1:1 연결)
  • Hub & Spoke
    단일 접점인 허브 시스템을 통해 데이터를 전송하는 중앙 집중형 방식
  • Message Bus
    애플리케이션 사이에 미들웨어를 두어 처리하는 방식
  • Hybrid
    Hub & Spoke 와 Message Bus 혼합 방식

FEP (Front-End Processor)

  • 입력되는 데이터를 컴퓨터의 프로세서가 처리하기 전에 미리 처리하여 프로세서가 처리하는 시간을 줄여주는 프로그램이나 하드웨어

반정규화

정규화된 엔티티, 속성, 관계를 시스템의 성능 향상과 개발 운영의 단순화를 위해 중복, 통합, 분리 등을 수행하는 데이터 모델링 기법

= 처리량 감소, 속도 향상을 위해 저장공간을 투자하는 것

  • 계 테이블 추가
    sum, avg 등의 계산 미리 수행
  • 복 테이블 추가
    서버 분리 또는 업무 구별
  • 력 테이블 추가
    레코드 중복 저장
  • 분 테이블 추가
    접근 시도가 많은 자료만 모아두기
  • 행 테이블 추가
    A에 접근하기 위해 다수의 테이블을 거칠 경우 간소화

테이블 반정규화해서 집중력이 떨어짐 ( 집중이부진 )


정형 기술 검토(FTR)의 지침

  • 제품 검토의 집중성
    오류 검출에 초점을 두고 해결책을 나중으로 미룬다.
  • 사전 준비성
    검토를 위한 자료를 사전에 배포하여 검토하도록 한다.
  • 의제의 제한성
    의견을 제한하되 충분히 받아들인다.
  • 안건 고수성
    안건을 세우면 고수한다.
  • 논쟁 반박의 제한성
    논쟁과 반박을 제한한다.
  • 문제 공개성
    문제 영역을 공개한다.
  • 참가 인원의 제한성
    참가자의 수를 제한한다.
  • 문서성
    발견된 오류는 문서화한다.

소프트웨어 국제 표준

  • ISO/IEC 12119
    패키지 소프트웨어의 평가
  • ISO/IEC 9216
    소프트웨어 품질 특성 및 척도에 대한 표준화
  • ISO/IEC 14598
    소프트웨어 제품 평가. ISO/IEC 9126 사용을 위한 절차와 기본 상황 및 소프트웨어 평가 프로세스에 대한 표준 규정
  • ISO/IEC 15504
    소프트웨어 품질 및 생산성 향상을 위한 프로세스를 평가 및 개선하는 국제 표준 SPICE
  • ISO/IEC 25000
    • 소프트웨어 품질평가 통합모델
    • SQuaRE(System and Software Quality Requirements and Evaluation)
    • ISO/IEC 9126, ISO/IEC 12119, ISO/IEC 145983개 표준을 통합한 모델

    ISO/IEC 2500n: 개요 및 품질 관리
    ISO/IEC 2501n: 품질모델
    ISO/IEC 2502n: 품질측정
    ISO/IEC 2503n: 품질요구
    ISO/IEC 2504n: 품질평가
    ISO/IEC 2505n: 확장분야


소프트웨어 품질 목표

  • 무결성 (Integrity)
    허용되지 않는 사용이나 자료의 변경제어하는 정도
  • 신뢰성 (Reliability)
    요구된 기능을 오류없이 수행하는 정도
  • 재사용성 (Reusability)
    이미 만들어진 프로그램을 다른 목적으로 사용할 수 있는지의 정도
  • 효율성 (Efficiency)
    요구된 기능을 수행하기 위한 시스템능력과 필요한 자원의 소요정도
  • 정확성 (Correctness)
    사용자의 요구기능을 충족시키는 정도
  • 이식성 (Portability)
    다양한 하드웨어 환경에서도 운용 가능하도록 쉽게 수정할 수 있는 정도
  • 상호운용성 (Interoperability)
    다른 소프트웨어와 정보를 교환할 수 있는 정도
  • 유용성 (Usability)
    쉽게 사용할 수 있는 정도
  • 유연성 (Flexibility)
    새로운 요구사항에 맞게 얼마만큼 쉽게 수정할 수 있는지의 정도

Risk Analysis

  • 프로젝트에 내재된 위험 요소를 인식하고 그 영향을 분석하여 이를 관리하는 활동
  • 프로젝트를 성공시키기 위하여 위험 요소를 사전에 예측, 대비하는 모든 기술과 활동을 포함하는 것

형상 관리 도구

공유폴더 방식

버전 관리 자료가 로컬 컴퓨터의 공유 폴더에 저장되어 관리되는 방식

  • 개발자들은 개발이 완료된 파일을 약속된 공유 폴더에 매일 복사한다.
  • 담당자는 공유 폴더의 파일을 자기 PC로 복사한 후 컴파일 하여 이상 유무를 확인한다.
  • 이상 유무 확인 과정에서 파일의 오류가 확인되면, 해당 파일을 등록한 개발자에게 수정을 의뢰한다.
  • 파일에 이상이 없다면 다음날 각 개발자들이 동작 여부를 다시 확인한다.
  • 파일을 잘못 복사하거나 다른 위치로 복사하는 것에 대비하기 위해 파일의 변경사항을 데이터베이스에 기록하여 관리한다.
  • 종류에는 SCCS, RCS, PVCS, QVCS 등이 있다.

    RCS (Revision Control System)

    동시에 소스를 수정하는 것을 방지하며 다른 방향으로 진행된 개발 결과를 합치거나 변경 내용을 추적한다.

클라이언트/서버 방식

버전 관리 자료가 중앙 시스템(서버)에 저장되어 관리되는 방식

  • 서버의 자료를 개발자별로 자신의 PC(클라이언트)로 복사하여 작업한 후 변경된 내용을 서버에 반영한다.
  • 모든 버전 관리는 서버에서 수행된다.
  • 하나의 파일을 서로 다른 개발자가 작업할 경우 경고 메시지를 출력한다.
  • 서버에 문제가 생기면, 서버가 복구되기 전까지 다른 개발자와의 협업 및 버전 관리 작업은 중단된다.
  • 종류에는 CVS, SVN(Subversion), CVSNT, Clear Case, CMVC, Perforce 등이 있다.

분산 저장소 방식

버전 관리 자료가 하나의 원격 저장소와 분산된 개발자 PC의 로컬 저장소에 함께 저장되어 관리되는 방식

  • 개발자별로 원격 저장소의 자료를 자신의 로컬 저장소로 복사하여 작업한 후 변경된 내용을 로컬 저장소에서 우선 반영(버전 관리)한 다음 이를 원격 저장소에 반영한다.
  • 로컬 저장소에서 버전 관리가 가능하므로 원격 저장소에 문제가 생겨도 로컬 저장소의 자료를 이용하여 작업할 수 있다.
  • 종류에는 Git, GNU arch, DCVS, Bazaar, Mercurial, TeamWare, Bitkeeper, Plastic SCM 등이 있다.

SVN (Subversion)

CVS를 개선한 것

  • 클라이언트/서버 구조로, 서버(저장소, Repository)에는 최신 버전의 파일들과 변경 내역이 관리된다.
  • 서버의 자료를 클라이언트로 복사해와 작업한 후 변경 내용을 서버에 반영(Commit)한다.
  • 모든 개발 작업은 trunk 디렉터리에서 수행되며, 추가 작업은 branches 디렉터리 안에 별도의 디렉터리를 만들어 작업을 완료한 후 trunk 디렉터리와 병합(merge)한다.

소프트웨어 버전 관리 용어

  • 저장소 (Repository)
    최신 버전의 파일들과 변경 내역에 대한 정보들이 저장되어 있는 곳
  • 가져오기 (Import)
    버전 관리가 되고 있지 않은 아무것도 없는 저장소에 처음으로 파일을 복사
  • 체크아웃 (Check-Out)
    프로그램을 수정하기 위해 저장소에서 파일을 받아 옴, 소스 파일과 함께 버전 관리를 위한 파일들을 받아 옴.
  • 체크인 (Check-In)
    체크아웃한 파일의 수정을 완료한 후 저장소의 파일을 새로운 버전으로 갱신
  • 커밋 (Commit)
    체크인을 수행할 때 이전에 갱신된 내용이 있는 경우에는 충돌을 알리고 Diff 도구를 이용해 수정한 후 갱신 완료
  • 동기화 (Update)
    저장소에 있는 최신 버전으로 자신의 작업공간을 동기화

인스펙션(Inspection) 과정

flowchart LR
  A["계획"]
  B["사전교육"]
  C["준비"]
  D["인스펙션 회의"]
  E["수정"]
  F["후속조치"]

  A --> B --> C --> D --> E --> A & F

위험 모니터링

  • 위험 요소 징후들에 대하여 계속적으로 인지하는 것

인터페이스 구현 검증도구

  • xUnit
    Java, C++ 등 다양한 언어를 지원하는 단위 테스트 프레임워크
  • STAF
    서비스 호출 및 컴포넌트 재사용다양한 환경을 지원하는 테스트 프레임워크
  • FitNesse
    웹 기반 테스트케이스 설계, 실행, 결과 확인 등을 지원하는 테스트 프레임워크
  • NTAF
    FitNesse의 장점인 협업과 STAF의 장점인 재사용 및 확장성을 통합한 NHN(Naver)의 테스트 자동화 프레임워크
  • Selenium
    다양한 브라우저 및 개발 언어를 지원하는 웹 애플리케이션 테스트 프레임워크
  • watir
    Ruby를 사용하는 애플리케이션 테스트 프레임워크

자료구조

자료구조의 분류

  • 선형 구조
    배열, 연결리스트, 스택, 큐, 데크
  • 비선형 구조
    트리, 그래프

배열 (Array)

  • 동일한 자료형의 데이터들이 같은 크기로 나열됨
  • 순서를 갖고 있는 집합
  • 기억장소의 추가가 어려움
  • 데이터 삭제 시 메모리 낭비 발생

연결리스트 (Linear List)

  • 노드의 포인터를 이용해 서로 연결시킨 자료 구조
  • 노드의 삽입, 삭제 작업이 용이함
  • 링크가 필요하기 때문에 순차 리스트에 비해 기억 공간의 이용 효율이 좋지 않음
  • 포인터를 찾아야해서 접근 속도가 느림

스택 (Stack)

  • 리스트의 한쪽 끝으로만 삽입, 삭제 작업이 이루어지는 자료 구조
  • 가장 나중에 삽입된 자료가 먼저 삭제되는 후입선출(LIFO)

    드럼통

큐 (Queue)

  • 한쪽에서는 삽입 작업이 이루어지고 한쪽에서는 삭제 작업이 이루어지도록 구성한 자료 구조
  • 가장 먼저 삽입된 자료가 먼저 삭제되는 선입선출(FIFO)
  • 운영체제의 작업 스케줄링에 사용함

    음식점에 줄서고 있는 손님들

데크 (Deque)

  • 삽입과 삭제가 리스트의 양쪽 끝에서 모두 발생 가능
  • 스택과 큐의 장점만 따서 구성됨

트리 (Tree)

flowchart TD
    A(("A"))
    B(("B"))
    C(("C"))
    D(("D"))
    E(("E"))
    F(("F"))
    G(("G"))
    H(("H"))
    Z("empty")
    style Z fill:stroke-width:1px,stroke-dasharray: 5 5

    A --- B & C
    B --- D
    B -.- Z
    C --- E & F
    E --- G & H

트리의 차수 (자식 노드의 개수)
A, C, E → 2개

단말 노드 (자식이 없는 노드)
D, G, H, F → 4개

트리 순회

  • 전위 순회 (PreOrder) ROOTLEFTRIGHT
    A → B → D → C → E → G → H → F
  • 중위 순회 (InOrder) LEFTROOTRIGHT
    D → B → A → G → E → H → C → F
  • 후위 순회 (PostOrder) LEFTRIGHTROOT
    D → B → G → H → E → F → C → A

디지털 저작권 관리 (DRM)

DRM 이란?

  • 디지털 콘텐츠의 지적재산권 보호, 관리 기능 및 안전한 유통과 배포를 보장하는 솔루션
  • 디지털 콘텐츠의 지적재산권을 보호하는 권한 통제 기술, 사용권한 제어 기술, 패키징 기술, 라이선스 관리를 포함한 유통체계
  • 디지털 콘텐츠와 디바이스의 사용을 제한하기 위해 하드웨어 제조업자, 저작권자, 출판업자 등이 사용할 수 있는 접근 제어 기술

구성 요소

  • 클리어링 하우스 (Clearing House)
    저작권에 대한 사용 권한, 라이센스 발급, 사용량에 따른 관리 등을 수행하는 곳
  • 콘텐츠 제공자 (Contents Provider)
    콘텐츠를 제공하는 저작권자
  • 패키저 (Packager)
    콘텐츠를 메타 데이터(데이터의 속성 정보를 설명하는 데이터)와 함께 배포 가능한 형태로 묶어 암호화하는 프로그램
  • 콘텐츠 분배자 (Contents Distributor)
    암호화된 콘텐츠를 유통하는 곳이나 사람 - ex) 멜론
  • 콘텐츠 소비자 (Customer)
    콘텐츠를 구매해서 사용하는 주체 - ex) 멜론 이용자
  • DRM 컨트롤러 (DRM Controller)
    배포된 콘텐츠의 이용 권한을 통제하는 프로그램 - ex) 멜론 플레이어
  • 보안 컨테이너 (Security Container)
    콘텐츠 원본을 안전하게 유통하기 위한 전자적 보안 장치

기술 요소

  • 암호화, 키관리, 암호화 파일 생성, 식별 기술, 저작권 표현, 정책 관리, 크랙 방지, 인증

    방화벽 ❌ (문제로 많이 나옴)


알고리즘 설계 기법

  • Divide and Conquer (분할 정복 알고리즘)
    문제를 작은 문제로 분할하여 문제를 해결하는 알고리즘
  • Greedy (탐욕 알고리즘)
    현재 시점에서 가장 최적의 방법을 선택하는 알고리즘
  • Backtracking
    해를 찾는 도중 해가 아니어서 막히면, 되돌아가서 다시 해를 찾아가는 기법
    (최적화 문제와 결정 문제를 푸는 방법)

물리데이터 저장소의 파티션 설계

파티션 유형

  • 범위 분할 (Range Partitioning)
    지정한 열의 값을 기준으로 분할
  • 해시 분할 (Hash Partitioning)
    해시 함수를 적용한 결과 값에 따라 분할
  • 조합 분할 (Composite Partitioning)
    범위 분할 후 해시 함수를 적용하여 분할

검증 검사 기법

  • 알파 테스트 인수 테스트
    개발자의 장소에서 사용자가 개발자 앞에서 행하는 테스트
  • 베타 테스트 인수 테스트
    선정된 최종 사용자가 여러 명의 사용자 앞에서 행하는 테스트 기법 (= 필드 테스팅)
  • 동치 분할 검사
    입력 자료에 초점을 맞춰 케이스를 만들고 테스트
  • 형상 검사
    구성요소, 목록, 유지보수를 위한 모든 사항이 표현되어있는가를 확인

Prefix • Postfix

A * B - C / (D + E) 각각 연산법으로 변환

  • 후위표기법 (Prefix)
    1. A * B - C / (D + E)
    2. A * B - C / +DE
    3. *AB - C / +DE
    4. *AB - /C+DE
    5. -*AB/C+DE
  • 전위표기법 (Postfix)
    1. A * B - C / (D + E)
    2. A * B - C / DE+
    3. AB* - C / DE+
    4. AB* - CDE+/
    5. AB*CDE+/-