작년 기출 풀이만 남겨두고 있는데 많이 나오면서 내가 자주 틀리는 개념들을 정리해봤다. 정리본은 이거만 보고 시험보러 가야겠다...
1과목: 소프트웨어 설계
💡 미들웨어
미들웨어
→ 클라이언트와 서버 간 통신 담당
→ 분산 컴퓨팅 환경에서 서로 다른 기종 간의 하드웨어나 프로토콜, 통신환경 등을 연결하여 응용 프로그램과 운영 환경 간에 원만한 통신이 이루어질 수 있게 서비스를 제공하는 소프트웨어
→ 애플리케이션과 사용자 사이 뿐만 아니라 클라이언트와 서버, 운영체제와 응용 프로그램과 같이 두 시스템 사이에서 다양한 서비스를 제공하는 소프트웨어
- 분산 시스템에서 다양한 부분을 관리하고 통신하며 데이터를 교환하게 해주는 소프트웨어
- 위치 투명성을 제공
- 분산 시스템의 여러 컴포넌트가 요구하는 재사용 가능한 서비스의 구현을 제공
종류: DB, RPC, MOM, TP-Monitor, ORB, WAS
RPC
→ 응용 프로그램의 프로시저를 사용하여 원격 프로시저를 마치 로컬 프로시저처럼 호출하는 방식의 미들웨어
MOM (Message-Oriented Middleware), 메시지 지향 미들웨어
메시지 기반의 비동기형 메시지를 전달하는 방식의 미들웨어
→ 온라인 업무보다는 이기종 분산 데이터 시스템의 데이터 동기를 위해 많이 사용됨
- 독립적인 애플리케이션을 하나의 통합된 시스템으로 묶기 위한 역할을 함
- 송신측과 수신측의 연결 시 메시지 큐를 활용하는 방법
- 상이한 애플리케이션 간 통신을 비동기 방식으로 지원
미들웨어 솔루션 유형
- WAS (Web Application Server)
- ORB (Object Request Broker)
- RPC (Remote Procedure Call)
∗ Web Server → HTTP 프로토콜을 기반으로 클라이언트의 요청을 처리하는 서버 소프트웨어
💡 GoF(Gangs of Four) 디자인 패턴
디자인 패턴 사용 장점
- 소프트웨어 구조 파악 용이
- 객체지향 설계 생산성 향상
- 재사용성 증가
디자인 패턴
- 생성 패턴
- 추상 팩토리 → 인터페이스를 통해 서로 연관/의존하는 객체들의 그룹으로 생성하여 추상적으로 표현하는 패턴
- 빌더 → 작게 분리된 인스턴스를 건축 하듯이 조합하여 객체를 생성하는 패턴
- 팩토리 메소드 → 객체 생성을 서브 클래스에서 처리하도록 분리하여 캡슐화한 패턴
- 프로토타입 → 원본 객체를 복제하는 방법으로 객체를 생성하는 패턴
- 싱글톤 → 하나의 객체를 생성하면 생성된 객체를 어디서든 참조할 수 있지만, 여러 프로세스가 동시에 참조할 수는 없는 패턴
- 구조 패턴
- 어댑터 → 호환성이 없는 클래스들의 인터페이스를 다른 클래스가 이용할 수 있도록 변환해주는 패턴
- 브리지 → 구현부에서 추상층을 분리하여, 서로가 독립적으로 확장할 수 있도록 구성한 패턴
- 컴포지트 → 여러 객체를 가진 복합 객체와 단일 객체를 구분 없이 다루고자 할 때 사용하는 패턴
- 데코레이터 → 객체 간의 결합을 통해 능동적으로 기능들을 확장할 수 있는 패턴
- 퍼싸드 → 복잡한 서브 클래스들을 피해 더 상위에 인터페이스를 구성함으로써 서브 클래스들의 기능을 간편하게 사용할 수 있도록 하는 패턴
- 플라이웨이트 → 인스턴스가 필요할 때마다 매번 생성하는 것 X 가능한 한 공유해서 사용함으로써 메모리를 절약하는 패턴
- 프록시 → 접근이 어려운 객체와 여기에 연결하려는 객체 사이에서 인터페이스 역할을 수행하는 패턴
- 행위 패턴
- 책임 연쇄 → 요청을 처리할 수 있는 객체가 둘 이상 존재하여 한 객체가 처리하지 못하면 다음 객체로 넘어가는 형태의 패턴
- 커맨드 → 요청을 객체의 형태로 캡슐화하여 재이용하거나 취소할 수 있도록 요청에 필요한 정보를 저장하거나 로그에 남기는 패턴
- 인터프리터 → 언어에 문법 표현을 정의하는 패턴
- 반복자 → 자료 구조와 같이 접근이 잦은 객체에 대해 동일한 인터페이스를 사용하도록 하는 패턴
- 중재자(Mediator) → 수많은 객체들 간의 복잡한 상호작용을 캡슐화하여 객체로 정의하는 패턴
- 메멘토 → 특정 시점에서의 객체 내부 상태를 객체화함으로써 이후 요청에 따라 객체를 해당 시점의 상태로 돌릴 수 있는 기능을 제공하는 패턴
- 옵서버 → 한 객체의 상태가 변화하면 객체에 상속되어 있는 다른 객체들에게 변화된 상태를 전달하는 패턴
- 상태 → 객체의 상태에 따라 동일한 동작을 다르게 처리해야 할 때 사용하는 패턴
- 전략 → 동일한 계얼의 알고리즘들을 개별적으로 캡슐화하여 상호 교환할 수 있게 정의하는 패턴
- 템플릿 메소드 → 상위 클래스에서 골격을 정의하고, 하위 클래스에서 세부 처리를 구체화하는 구조의 패턴
- 방문자 → 각 클래스들의 데이터 구조에서 처리 기능을 분리하여 별도의 클래스로 구성하는 패턴
생성 패턴 - 팩토리 메소드 (Factory Method)
- 객체 생성을 위한 인터페이스 정의
- 실제 생성될 클래스는 서브클래스가 결정
- Virtual-Constructor 패턴이라고도 함
행위 패턴 - 전략 (Strategy) 패턴
→ 동일한 계열의 알고리즘들을 개별적으로 캡슐화하여 상호 교환할 수 있게 정의하는 행위 패턴
생성 패턴 - 프로토타입 (Prototype) 패턴
→ 인스턴스를 복제하여 사용하는 패턴
💡 UML (Unified Modeling Language)
UML
→ 객체 지향 시스템을 개발할 때 산출물을 명세화, 시각화, 문서화하는데 사용 (객체지향 모델링 언어)
기본 구성 요소
- Things (사물)
- Relationship(관계)
- Diagram(다이어그램)
UML 확장 모델 - << >>
→ 스테레오 타입 객체를 표현할 때 사용하는 기호
→ UML의 기본 요소를 확장하여 사용할 때 적용
UML 모델링 관계
- 연관(Association) 관계: 2개 이상의 사물이 서로 관련
- 집합(Aggregation) 관계: 하나의 사물이 다른 사물에 포함
- 포함(Composition) 관계: 집합 관계의 특수한 형태 → 포함하는 사물의 변화가 포함되는 사물에게 영향을 미치는 관계
- 일반화(Generalization) 관계: 하나의 사물이 다른 사물에 비해 더 일반적인지 구체적인지를 표현하는 관계
- 의존(Dependency) 관계: 서로 연관은 있으나 필요에 의해 서로에게 영향을 주는 짧은 시간 동안만 연관을 유지하는 관계
- 한 사물의 명세가 바뀌면 다른 사물에 영향을 주며, 일반적으로 한 클래스가 다른 클래스를 오퍼레이션의 매개 변수로 사용하는 경우에 나타나는 관계
- 실체화(Realization) 관계: 사물이 할 수 있거나 해야하는 기능으로 서로를 그룹화 할 수 있는 관계
- 한 객체가 다른 객체에게 오퍼레이션을 수행하도록 지정하는 의미적 관계
UML Structural Diagram
- 구조적(Structural) 다이어그램
- 클래스 다이어그램: 클래스와 클래스가 가지는 속성, 클래스 사이의 관계 표현
- 객체 다이어그램: 클래스에 속한 사물들, 즉 인스턴스를 특정 시점의 객체와 객체 사이의 관계로 표현
- 컴포넌트 다이어그램: 실제 구현 모듈인 컴포넌트 간의 관계나 컴포넌트 간의 인터페이스 표현
- 배치 다이어그램: 결과물, 프로세스, 컴포넌트 등 물리적 요소들의 위치 표현
- 복합체 구조 다이어그램: 클래스나 컴포넌트가 복합 구조를 갖는 경우 그 내부 구조를 표현
- 패키지 다이어그램: 유스케이스나 클래스 등의 모델 요소들을 그룹화한 패키지들의 관계 표현
- 행위(Behavioral) 다이어그램
- 유스케이스 다이어그램: 사용자의 요구를 분석하는 것, 기능 모델링 작업에 사용
- 시퀀스 다이어그램: 상호 작용하는 시스템이나 객체들이 주고받는 메시지 표현
- 커뮤니케이션 다이어그램: 메시지뿐만 아니라 객체들 간의 연관까지 표현
- 상태 다이어그램: 하나의 객체가 자신이 속한 클래스의 상태 변화 혹은 다른 객체와의 상호 작용에 따라 상태가 어떻게 변화하는지를 표현
- 활동 다이어그램: 시스템이 어떤 기능을 수행하는지 객체의 처리 로직이나 조건에 따른 처리의 흐름을 순서에 따라 표현
- 상호작용 다이어그램: 제어 흐름
- 타이밍 다이어그램: 객체 상태 변화와 시간 제약을 명시적으로 표현
UML 행위 다이어그램 - 시퀀스 다이어그램
시간의 흐름에 따라 상호작용하는 개체들을 표현하는 것, 주로 시스템의 동적인 측면을 모델링하기 위해 사용
- 객체 간의 동적 상호작용을 시간 개념을 중심으로 모델링하는 것
- 일반적으로 다이어그램의 수직 방향이 시간의 흐름을 나타냄
- 회귀 메시지, 제어블록 등으로 구성
주요 구성 요소 → 액터(Actor), 객체(Object), 생명선(Lifeline), 실행(Activation), 메시지(Message), 객체 소멸, 프레임
∗ 확장은 관계의 한 형태로 시퀀스 다이어그램의 구성요소가 아니다!
UML 행위 다이어그램 - 유스케이스 다이어그램
연관 Association, 집합 Aggregation, 포함 Composition, 일반화 Generalization, 의존 Dependency, 실체화 Realization, 확장 Extend
→ 시스템과 상호 작용하는 모든 외부 요소를 액터라고 함
UML 구조적 다이어그램 - 클래스 다이어그램의 구성 요소
- 클래스
- 각각의 객체들이 갖는 속성과 오퍼레이션(동작)을 표현한 것
- 속성 - 클래스의 상태나 정보를 표현 / 오퍼레이션 - 클래스가 수행할 수 있는 동작으로 함수라고도 함
- 제약조건 → 중괄호를 이용
- 관계
- 클래스와 클래스 사이의 연관성 표현
- 연관 관계, 집합 관계, 포함 관계, 일반화 관계, 의존 관계
요구사항 분석 과정에서 사용되는 다이어그램
→ 자료 흐름도(Data Flow Diagram), UML(Unified Modeling Language), E-R(개체-관계) 모델
💡 럼바우 분석 기법
객체지향 분석
→ 사용자의 요구사항을 분석하여 요구된 문제와 관련된 모든 클래스, 이와 관련된 속성과 연산, 그들 간의 관계 등을 정의하여 모델링하는 작업
→ 객체와 속성, 클래스와 멤버, 전체와 부분 등으로 나누어서 분석해 내는 기법
객체지향 분석의 방법론
- 럼바우 방법 → 객체 모델, 동적 모델, 기능 모델로 나누어 분석 활동 수행
- 부치 방법 → 미시적 개발 프로세스와 거시적 개발 프로세스를 모두 사용하는 분석
- Jacobson 방법 → Use Case를 강조하여 사용하는 분석 방법
- Coad와 Yourdon 방법 → E-R 다이어그램을 사용하여 객체의 행위 모델링
- Wirfs-Brock 방법 → 분석과 설계 간의 구분 X
럼바우의 객체지향 분석 절차
객체 모형 → 동적 모형 → 기능 모형
∗ 객동기로 외우기!!!
- 객체 모형: 시스템의 정적인 구조 표현
- 정보 모델링 → Object Modeling, 객체를 찾아내어 속성과 연산 식별 및 객체들 간의 관계를 규정
- 동적 모형: 시스템의 제어 흐름 표현
- Dynamic Modeling, 상태 다이어그램 (객체의 상태 변화와 이벤트 표현)
- 기능 모형: 시스템의 기능적 특성 표현
- Functional Modeling, 자료 흐름도(DFD)를 이용
자료 흐름도
→ 자료 저장소의 입력 화살표는 데이터의 입력 및 수정을 의미하는 것
입력 화살표가 있다고 하여 반드시 출력 화살표가 있어야 하는 것은 아니다
자료 흐름도 구성 표기법
Process (프로세스) → 원이나 둥근 사각형으로 표시, 자료를 변환시키는 시스템의 한 부분을 나타냄
Data Flow (자료 흐름) → 화살표 위에 자료의 이름 기입, 자료의 이동인 연관관계를 나타냄
Data Store (자료 저장소) → 평행선(=) 안에 자료 저장소 이름 기입, 시스템에서의 자료 저장소를 나타냄
Terminator (단말) → 사각형 안에 이름 기입, 시스템과 교신하는 외부 개체
💡 결합도 (약 → 강)
- 자료 결합도(Data Coupling) - 모듈 간의 인터페이스가 자료 요소로만 구성될 때의 결합도 → 자료로 얽힐 수록… 강하다…!
- 스탬프(검인) 결합도 (Stamp Coupling) - 모듈 간의 인터페이스로 배열이나 레코드 등의 자료 구조가 전달될 때의 결합도 → 도장 쾅! 도장은 무거운 거다…!
- 제어 결합도 (Control Coupling) - 한 모듈에서 다른 모듈로 논리적인 흐름을 제어하는 데 사용하는 제어 요소
- 외부 결합도 (External Coupling) - 어떤 모듈에서 외부로 선언한 데이터(변수)를 다른 모듈에서 참도할 때의 결합도
- 공통(공유) 결합도 (Common Coupling) - 공유되는 데이터 영역을 여러 모듈이 사용할 때의 결합도 → 조금 공유해본다~
- 내용 결합도 (Content Coupling) - 한 모듈이 다른 모듈의 내부 기능 및 그 내부 자료를 직접 참조하거나 수정할 때의 결합도 → 아 내용만 살짝 겹치는 거다~
💡 응집도 (강 → 약)
명령어나 호출문 등 모듈의 내부 요소들의 서로 관련되어 있는 정도, 즉 모듈이 독립적인 기능으로 정의되어 있는 정도
- 기능적 응집도
- 순차적 응집도
- 교환적 응집도
- 절차적 응집도
- 시간적 응집도
- 논리적 응집도
- 우연적 응집도
2과목: 소프트웨어 개발
💡 테스트 기법
목적에 따른 테스트
- 회복 테스트: 시스템에 여러 가지 결함을 주어 실패하도록 한 후 올바르게 복구되는지를 확인하는 테스트
- 안전 테스트: 시스템에 설치된 시스템 보호 도구가 불법적인 침입으로부터 시스템을 보호할 수 있는지를 확인
- 강도 테스트: 시스템에 과도한 정보량이나 빈도 등을 부과하여 과부하 시에도 소프트웨어가 정상적으로 실행되는지를 확인하는 테스트
- 성능 테스트: 소프트웨어의 실시간 성능이나 전체적인 효율성을 진단하는 테스트, 소프트웨어의 응답 시간, 처리량 등을 테스트
- 구조 테스트: 소프트웨어 내부의 논리적인 경로, 소스 코드의 복잡도 등을 평가하는 테스트
- 회귀 테스트: 소프트웨어의 변경 또는 수정된 코드에 새로운 결함이 없음을 확인하는 테스트
- 병행 테스트: 변경된 소프트웨어와 기존 소프트웨어에 동일한 데이터를 입력하여 결과를 비교하는 테스트
상향식 통합 테스트
→ 상향식 통합 테스트: 프로그램의 하위 모듈에서 상위 모듈 방향으로 통합하면서 테스트하는 기법
- 시스템을 구성하는 모듈의 인터페이스와 결합을 테스트하는 것
- 하향식 통합 테스트의 경우 넓이 우선 방식으로 테스트를 할 모듈을 선택할 수 있다
- 모듈 간의 인터페이스와 시스템의 동작이 정상적으로 잘 되고 있는지를 빨리 파악하고자 함 → 하향식 통합 테스트
하향식 통합 테스트
→ 깊이 우선 방식 또는 너비 우선 방식
→ 상위 컴포넌트를 테스트하고 점증적으로 하위 컴포넌트를 테스트
→ 하위 컴포넌트 개발이 완료되지 않은 경우 스텁(Stub)을 사용하기도 함
검증(Validation) 검사 기법
- 알파 검사: 개발자 장소에서 사용자가 개발자 앞에서 검사
- 베타 검사: 선정된 사용자가 직접 장소에서 검사
- 디버깅 검사: 오류 발견과 수정
- 형상 검사: 형상 관리 항목 검사
인수 테스트
개발한 소프트웨어가 사용자의 요구사항을 충족하는지에 중점을 두고 테스트하는 방법
→ 사용자 인수 테스트, 운영상의 인수 테스트, 계약 인수 테스트, 규정 인수 테스트, 알파/베타 테스트
- 알파 테스트: 개발자의 장소에서 사용자가 개발자 앞에서 행하는 테스트 기법, 통제된 환경에서 행해짐
- 베타 테스트: 선정된 최종 사용자가 여러 명의 사용자 앞에서 행하는 테스트 기법, 실업무를 가지고 사용자가 직접 테스트하는 것으로, 개발자에 의해 제어되지 않는 상태에서 테스트가 행해짐
테스트 하네스(Test Harness)의 구성 요소
- 테스트 드라이버 → 테스트 대상의 하위 모듈을 호출하고, 파라미터를 전달하고, 모듈 테스트 수행 후의 결과를 도출하는 도구
- 테스트 스텁 → 제어 모듈이 호출하는 타 모듈의 기능을 단순히 수행하는 도구로, 일시적으로 필요한 조건만을 가지고 있는 테스트용 모듈
- 테스트 슈트 → 테스트 케이스의 집합
- 테스트 케이스 → 테스트 항목의 명세서
- 테스트 스크립트 → 실행 절차에 대한 명세서
- 목 오브젝트 → 사용자 행위를 조건부로 입력해두면, 그 상황에 맞는 예정된 행위를 수행하는 객체
테스트 스텁 (Stub)
제어 모듈이 호출하는 타 모듈의 기능을 단순히 수행하는 도구로, 일시적으로 필요한 조건만을 가지고 있는 테스트용 모듈
→ 하향식 통합시험을 위해 일시적으로 필요한 조건만을 가지고 임시로 제공되는 시험용 모듈
테스트 드라이버 (Driver)
필요 데이터를 인자를 통해 넘겨주고, 테스트 완료 후 그 결과 값을 받는 역할을 하는 가상의 모듈
→ 단위 테스트에서 테스트의 대상이 되는 하위 모듈을 호출하고, 파라미터를 전달하는 가상의 모듈로 상향식 테스트에 필요
드라이버 vs. 스텁
구분 | 드라이버 | 스텁 |
---|
필요 시기 | 상위 모듈 없이 하위 모듈이 있는 경우 하위 모듈 구동 | 상위 모듈은 있지만 하위 모듈이 없는 경우 하위 모듈 대체 |
테스트 방식 | 상향식 테스트 | 하향식 테스트 |
공통점 | 소프트웨어 개발과 테스트를 병행할 경우 이용 | 동일 |
차이점 | - 이미 존재하는 하위 모듈과 존재하지 않는 상위 모듈 간의 인터페이스 역할 - 소프트웨어 개발이 완료되는 드라이버는 본래의 모듈로 교체됨 | - 일시적으로 필요한 조건만을 가지고 임시로 제공되는 가짜 모듈의 역할을 함 - 시험용 모듈이기 때문에 일반적으로 드라이버보다 작성하기 쉬움 |
→ 테스트 대상 모듈이 호출하는 하위 모듈의 역할을 수행하는 것은 스텁
소프트웨어 테스트
- 테스트케이스에는 일반적으로 시험 조건, 테스트 데이터, 예상 결과가 포함되어야 함
- 화이트박스 테스트
- 기본 경로(기초 경로, Base Path = Basis Path)는 수행 가능한 모든 경로를 의미함
- 모듈의 논리적인 구조를 체계적으로 점검 가능
- 블랙박스 테스트
화이트박스 테스트
모듈의 원시 코드를 오픈시킨 상태에서 원시 코드의 논리적인 모든 경로를 테스트하여 테스트 케이스를 설계하는 방법
→ 기초 경로 검사 = 수행 가능한 모든 경로를 의미함
→ 제어 구조 검사 ⇒ 조건 검사, 루프 검사, 데이터 흐름 검사
- 논리 흐름도를 이용
- 동적 테스트에 해당 (테스트 데이터를 이용해 실제 프로그램을 실행함으로써 오류를 찾음)
- 테스트 데이터를 선택하기 위하여 검증 기준을 정함
블랙박스 테스트
소프트웨어가 수행할 특정 기능을 알기 위해 각 기능이 완전히 작동되는 것을 입증하는 테스트, 기능테스트라고도 한다
→ 동치 분할 검사, 경계값 분석, 원인-효과 그래프 검사, 오류 예측 검사, 비교 검사 등
- 프로그램의 구조를 고려하지 않기 때문에 테스트 케이스는 프로그램 또는 모듈의 요구나 명세를 기초로 결정
빅뱅 통합 테스트 - 깊이 우선 탐색(DFS)
→ 정점에서 자식 노드 방향으로 운행하면서 형제 노드와 자식 노드가 있을 때 자식 노드를 우선 탐색하는 기법
→ 자식 노드의 탐색이 모두 끝나면 다시 형제 노드부터 탐색을 시작하는 방식으로 모든 노드를 한 번씩 방문
테스트 케이스 생성 도구
→ 자료 흐름도, 기능 테스트, 입력 도메인 분석, 랜덤 테스트
워크 스루, Workthrough
- 사용사례를 확장하여 명세하거나 설계 다이어그램, 원시코드, 테스트 케이스 등에 적용
- 복잡한 알고리즘 또는 반복, 실시간 동작, 병행 처리와 같은 기능이나 동작을 이해하려고 할 때 유용
- 단순한 테스트 케이스를 이용하여 프로덕트를 수작업으로 수행해보는 것
코드 인스펙션
계획 → 사전 교육 → 준비 → 인스펙션 회의 → 수정 → 후속 조치
→ 워크스루를 발전시킨 형태, 소프트웨어 개발 단계에서 산출된 결과물의 품질을 평가하고 이를 개선하기 위한 방법 등을 제시
→ 정적 테스트 시에만 활용하는 기법
테스트 오라클
- 참(True) 오라클 - 모든 테스트 케이스의 입력 값에 대해 기대하는 결과를 제공하는 오라클, 발생된 모든 오류를 검출할 수 있음
- 샘플링 오라클 - 특정한 몇몇 테스트 케이스의 입력 값들에 대해서만 기대하는 결과를 제공하는 오라클
- 추정 (Heuristic) 오라클 - 샘플링 오라클을 개선, 나머지 값은 추정으로 처리
- 일관성 검사 (Consistent) 오라클 - 애플리케이션의 변경이 있을 때, 전후 결과 값이 동일한지 확인
소프트웨어 테스트 - Pareto의 법칙
오류의 80%는 전체 모듈의 20% 내에서 발견된다는 법칙 (80:20법칙으로도 알려져있다)
→ 테스트 효율성의 중요한 원리!
경계 값 분석
입력 범위의 경계값에서 버그가 자주 발생한다는 점을 이용한 테스트 기법
→ 각 범위의 경계가 되는 값과 그 근처의 값을 테스트 케이스로 선택
![image.png]()
문제에서 중요한 경계값
→ 59와 60 사이 (C와 B등급의 경계)
→ 79와 80사이 (B와 A등급의 경계)
90은 A등급 범위(80-100) 내의 중간값이기 때문에 경계값이 아니어서 버그 발견 가능성이 상대적으로 낮다!
좋은 테스트 케이스
- 59, 60 (C/B 경계)
- 79, 80 (B/A 경계)
- 0 (최소값)
- 100 (최대값)
💡 정렬 알고리즘
알고리즘 설계 기법
- Divide and Conquer (분할 정복)
- Greedy (탐욕)
- Backtracking (백트래킹)
정렬
- 기수 정렬 → Queue를 이용하여 자릿수 별로 정렬하는 방식, 레코드의 키 값을 분석하여 같은 수 또는 같은 문자끼리 그 순서에 맞는 버킷에 분배 하였다가 버킷의 순서대로 레코드를 꺼내어 정렬
- 버블 정렬 → 주어진 파일에서 인접한 두 개의 레코드 키 값을 비교하여 그 크기에 따라 레코드 위치를 서로 교환하는 정렬 방식
- 퀵 정렬 → 레코드의 많은 자료 이동을 없애고 하나의 파일을 부분적으로 나누어가면서 정렬하는 방법, 키를 기준으로 작은 값은 왼쪽에, 큰 값은 오른쪽 서브 파일로 분해시키는 방식으로 정렬
- 쉘 정렬 → 삽입 정렬을 확장한 개념, 입력 파일을 어떤 매개변수(h)의 값으로 서브 파일을 구성하고, 각 서브파일을 삽입 정렬 방식으로 순서 배열하는 과정을 반복하는 정렬 방식
퀵 정렬
→ 분할 정복에 기반한 알고리즘으로 피봇을 사용하는 정렬
버블 정렬
주어진 파일에서 인접한 두 개의 레코드 키 값을 비교하여 그 크기에 따라 레코드 위치를 서로 교환하는 정렬 방식
초기 상태: 9, 6, 7, 3, 5
![image.png]()
선택 정렬
→ n개의 레코드 중에서 최소값을 찾아 첫 번째 레코드 위치에 놓고, 나머지 n-1개 중에서 다시 최소값을 찾아 두 번째 레코드 위치에 놓는 방식을 반복하여 정렬 (자리 교환)
- 주어진 리스트에서 최솟값을 찾음
- 맨 앞의 값과 교체
- 맨 앞을 제외한 나머지 리스트에서 반복
힙 정렬 (Heap Sort)
전이진 트리를 이용한 정렬 방식
평균과 최악 모두 시간 복잡도는 O(nlog2n)
검색 - 이분 검색(이진 검색)
→ 검색할 자료를 반씩 나누어서 나머지 반만 검색하는 방식을 반복하여 자료를 찾는 검색 방법
→ 탐색 효율이 좋고 탐색 시간이 적게 소요
→ 검색할 데이터가 정렬되어 있어야 함
→ 비교횟수를 거듭할 때마다 검색 대상이 되는 데이터의 수가 절반으로 줄어든다
![image.png]()
검색 - 해싱
해싱 함수의 종류 → 제산법, 제곱법, 폴딩법, 기수 변환법, 대수적 코딩법, 계수 분석법(숫자 분석법), 무작위법
해싱 함수 - 폴딩법
→ 레코드 키를 여러 부분으로 나누고, 나눈 부분의 각 숫자를 더하거나 XOR 한 값을 홈 주소로 사용
→ 키의 각 부분을 더하여 주소 계산
선형 검색
→ 정렬이 되어 있지 않은 파일에서 순차적으로 검색하는 방식
찾고자 하는 키 값을 첫 번째 레코드 키 값부터 차례로 비교하여 검색하는 방식
연결 리스트 (Linked List)
→ 노드들이 포인터로 연결되어 포인터를 찾아가는 시간이 필요하므로 선형 리스트에 비해 검색 속도가 느림
- 노드의 삽입이나 삭제가 쉬움
- 연결을 해주는 포인터를 위한 추가 공간이 필요
- 연결 리스트 중에서 중간 노드 연결이 끊어지면 그 다음 노드를 찾기 어려움
빅오 표기법(Big-O Notation)
- O(1) → 스택의 삽입, 삭제
- O(log2n) → 이진트리, 이진 검색
- O(n) → for문
- O(nlog2n) → 힙 정렬, 2-Way 합병 정렬
- O(n^2) → 삽입 정렬, 선택 정렬, 쉘 정렬, 버블 정렬, 퀵 정렬
- O(2^n) → 피보나치 수열
O(1)
→ 빅오 표기법의 시간 복잡도를 표기하는 방법의 하나, 입력 데이터 수에 관계 없이 문제 해결에 하나의 단계만을 거친다는 것을 의미함
정렬 알고리즘 중 합병 정렬 → O(NlogN)
제어 흐름도 → 순환 복잡도 계산
![image.png]()
💡 자료구조 개념
자료 구조의 분류
- 선형 구조 → 배열, 선형 리스트, 스택, 큐, 데크
- 비선형 구조 → 트리, 그래프
큐/스택
큐 → 한쪽에서는 삽입이, 다른 한쪽에서는 인출이 이루어지는 선형 자료구조 / FIFO 처리 수행
스택 → 서브루틴 호출, 인터럽트 처리, 수식 계산 및 수식 표기법에 응용 / LIFO 처리 수행
스택 자료 구조
→ 재귀 호출, 후위 표기법, 깊이 우선 방식과 같이 왔던 길을 되돌아가는 경우에 사용됨
→ LIFO 후입 선출 방식으로 자료를 처리
→ 인터럽스 처리, 서브루틴 호출 작업 등에 응용
- 언더플로 → 더 이상 삭제할 데이터가 없는 상황에서 데이터 삭제될 때 발생
- 오버 플로 → 모든 기억 공간이 꽉 채워져 있는 상태에서 데이터가 삽입될 때 발생
→ 응용 분야
- 함수 호출의 순서 제어
- 인터럽트의 처리
- 수식 계산 및 수식 표기법
- 컴파일러를 이용한 언어 번역
- 부 프로그램 호출 시 복귀주소 저장
- 서브루틴 호출 및 복귀 주소 저장
→ 순서가 A, B, C, D로 정해진 입력 자료를 스택에 입력했다가 출력할 때 가능하지 않은 출력 순서의 결과 → D A B C
큐 자료 구조
→ FIFO 방식으로 처리, 순서 리스트의 뒤(Rear)에서 노드가 삽입되며, 앞(Front)에서 노드가 제거됨
→ 응용 분야
데크 자료 구조
→ 선형 리스트의 양쪽 끝에서 삽입과 삭제가 모두 가능한 자료 구조
트리의 차수 / 단말 노드
- 트리의 차수: 가장 차수가 많은 노드의 차수
- 단말 노드: 자식이 하나도 없는 노드를 의미
트리 구조의 검색 효율
→ 이진 탐색트리의 평균 시간 복잡도는 O(logN)
→ 이를 보완하고자 개발된 균형트리가 AVL, 2-3, 레드-블랙 트리
트리 운행법
- Preorder 운행 (전위 순회) - Root → Left → Right
- Inorder 운행(중위 순회) - Left → Root → Right
- Postorder 운행(후위 순회) - Left → Right → Root
3과목: 데이터베이스 구축
💡 데이터베이스 설계
스키마
- 외부 스키마 = 서브 스키마 = 사용자 뷰
- 사용자나 응용 프로그래머가 각 개인의 입장에서 필요로 하는 데이터베이스의 논리적 구조를 정의한 것 (전체 데이터베이스의 한 논리적인 부분으로 볼 수 있으므로 서브 스키마라고도 함)
- 개념 스키마 = 전체적인 뷰
- 데이터베이스의 전체적인 논리적 구조로서, 모든 응용 프로그램이나 사용자들이 필요로하는 데이터를 종합한 조직 전체의 데이터베이스로 하나만 존재함 (단순히 ‘스키마’라고 하면 개념 스키마를 의미하며 DBA에 의해서 구성됨)
- 내부 스키마
- 데이터베이스의 물리적 구조로 데이터의 실제 저장 방법을 기술 (시스템 프로그래머나 시스템 설계자가 보는 관점)
관계형 데이터베이스 관련 용어
카디널리티 → 테이블에 속한 튜플의 수
차수 → 속성의 수
데이터베이스 설계
- 논리적 설계 (데이터 모델링)
- 현실 세계에서 발생하는 자료를 컴퓨터가 이해하고 처리할 수 있는 물리적 저장장치에 저장할 수 있도록 변환하기 위해 특정 DBMS가 지원하는 논리적 자료 구조로 변환시키는 과정
- 개념 스키마를 평가 및 정제하고 DBMS에 따라 서로 다른 논리적 스키마를 설계하는 단계
- 물리적 설계 (데이터 구조화)
- 논리적 설계 단계에서 논리적 구조로 표현된 데이터를 디스크 등의 물리적 저장장치에 저장할 수 있는 물리적 구조의 데이터로 변환하는 과정
- 저장 레코드의 형식, 순서, 접근 경로와 같은 정보를 사용하여 데이터가 컴퓨터에 저장되는 방법을 묘사
데이터베이스 설계 - 논리적 설계
→ 트랜잭션의 인터페이스 설계, 데이터 타입 및 타입들 간의 관계 표현
→ 트랜잭션 모델링 수행
→ 목표 DBMS에 맞는 스키마 설계
데이터베이스 설계 - 물리적 설계
→ 레코드 집중의 분석 및 설계, 접근 경로 설계, 저장 레코드의 양식 설계
→ 논리적 설계 단계에서 논리적 구조로 표현된 데이터를 디스크 등의 물리적 저장장치에 저장할 수 있는 물리적 구조의 데이터로 변환하는 과정
→ 트랜잭션 처리량, 응답시간, 디스크 용량 등을 고려해야 함
→ 저장 레코드의 양식 설계시 데이터 타입, 데이터 값의 분포, 접근 빈도 등을 고려
트랜잭션의 상태
- 활동(Active) - 트랜잭션이 실행 중인 상태
- 실패(Failed) - 트랜잭션 실행 중 오류가 발생하여 중단
- 철회(Aborted) - 트랜잭션이 비정상적으로 종료되어 롤백 연산을 수행한 상태
- 부분 완료(Partially Commited) - 트랜잭션의 마지막 연산까지 완료했지만, Commit 연산이 실행되기 직전의 상태
- 완료(Commited) - 트랜잭션이 성공적으로 종료되어 Commit 연산까지 수행한 상태
연산 (Operation)
→ 데이터 구조에 따라 개념 세계나 컴퓨터 세계에서 실제로 표현된 값들을 처리하는 작업
💡 E-R 다이어그램
E-R 다이어그램 표기법
사각형 - 개체 타입
마름모 - 관계 타입
타원 - 속성
이중 타원 - 다중값 속성
밑줄 타원 - 기본 키 속성
복수 타원 - 복합 속성
선, 링크 - 개체 타입과 속성 연결
💡 로킹 (Locking)
병행 제어 기법
- 로킹
- 주요 데이터의 액세스를 상호 배타적으로 하는 것
- 타임 스탬프 순서
- 동시성 제어를 위한 직렬화 기법으로, 트랜잭션 간의 처리 순서를 미리 정함
- 최적 병행수행(검증 기법, 확인 기법, 낙관적 기법)
- 다중 버전 기법
데이터베이스 병행 제어의 목적
- 공유 최대화
- 시스템 활용도 최대화
- 사용자에 대한 응답시간 최소화
- 데이터베이스 일관성 유지
로킹
여러 사용자가 동시에 데이터베이스에 접근할 때, 데이터의 일관성을 유지하기 위해 데이터의 접근을 제어하는 기법
→ 한 사용자가 데이터를 수정할 때 다른 사용자가 같은 데이터를 수정하지 못하도록 ‘잠금’을 거는 것, 병행제어의 단위
- 데이터베이스, 파일, 레코드, 필드 등은 로킹 단위가 될 수 있음
- 로킹 단위가 작으면 로크 수가 많아 관리하기 복잡해 오버헤드가 증가하지만 병행성 수준이 높아지고, 데이터베이스의 공유도가 증가
- 로킹 단위는 병행 제어에서 한꺼번에 로킹할 수 있는 객체의 크기
- 로킹 단위가 크면 병행성 수준이 낮아짐
- 로킹 단위가 크면 로크 수가 작아 관리하기 쉽지만 병행성 수준이 낮아지고 데이터베이스 공유도가 저하됨
- 로킹 단위가 크면 병행 제어 기법이 단순해지고, 로킹 단위가 작아지면 병행 제어 기법이 복잡해짐
- 로킹 단위가 작으면 로크의 수가 많아지고, 로킹 단위가 크면 로크의 수가 적어짐
- 파일, 레코드, 필드는 물론 데이터베이스까지 로킹 단위가 될 수 있음
💡 관계형 데이터베이스 용어
- 튜플 (Tuple)
- 릴레이션을 구성하는 각각의 행
- 속성의 모임
- 파일 구조에서 레코드와 같은 의미
- 카디널리티 또는 기수, 대응수
- 속성 (Attribute)
- 데이터베이스를 구성하는 가장 작은 논리적 단위
- 파일 구조상의 데이터 항목 또는 데이터 필드
- 개체의 특성 기술
- 속성의 수를 디그리(Degree) 또는 차수라고 함
- 도메인 (Domain)
- 하나의 애트리뷰트가 취할 수 있는 같은 타입의 원자 값들의 집합
- 실제 애트리뷰트 값이 나타날 때 그 값의 합법 여부를 시스템이 검사하는데에도 이용
💡 관계 대수와 관계 해석
- 관계 대수
- 관계형 데이터베이스에서 원하는 정보와 그 정보를 검색하기 위해서 어떻게 유도하는가를 기술하는 절차적인 언어
- 관계 해석으로 표현 가능
- 관계 해석
- 관계 데이터의 연산을 표현하는 방법
- 수학의 프레디킷 해석에 기반을 두고 있음
- 원하는 정보가 무엇이라는 것만 정의하는 비절차적인 특징을 가짐
💡 정규형
- 1NF → 릴레이션에 속한 모든 도메인이 원자값으로만 되어 있음
- 2NF → 기본키가 아닌 모든 속성이 기본키에 대하여 완전 함수적 종속을 만족
- 3NF → 기본키가 아닌 모든 속성이 기본키에 대해 이행적 종속을 만족하지 않는 정규형
- BCNF → 결정자가 모두 후보키인 정규형
- 4NF
- 5NF
4과목: 프로그래밍 언어 활용
💡 결합도
결합도
→ 모듈들이 변수를 공유하여 사용하게 하거나 제어 정보를 교류하게 하면 결합도가 높아짐
- 오류가 발생했을 때 전파되어 다른 오류의 원인이 되는 파문효과를 최소화해야 함
- 인터페이스가 정확히 설정되어 있지 않을 경우 불필요한 인터페이스가 나타나 모듈 사이의 의존도는 높아지고 결합도가 증가
- 다른 모듈과 데이터 교류가 필요한 경우 전역변수보다는 매개변수를 사용하는 것이 결합도를 낮추는데 도움이 됨
- 데이터 결합도: 매개변수로 데이터 전달 시의 결합
- 내용 결합도: 다른 모듈의 내용 직접 참조
- 공통 결합도: 전역 데이터를 참조하는 결합
결합도 (낮 → 높)
- 자료 결합도 (모듈 간의 인터페이스가 자료 요소로만 구성될 때)
- 스탬프 결합도
- 제어 결합도
- 외부 결합도
- 공통 결합도
- 내용 결합도
응집도 / 결합도
- 응집도 - 명령어나 호출문 등 모듈의 내부 요소들의 서로 관련되어 있는 정도
- 결합도 - 모듈과 모듈 사이의 상호 의존하는 정도 또는 두 모듈 사이의 연관 관계
우연적 응집도
→ 모듈 내 구성 요소들 간에 의미있는 연관관계가 없음
→ 서로 다른 기능을 수행하는 요소들이 모여있음
💡 OSI 7계층
OSI 7 계층
물리 계층 - 데이터 링크 계층 - 네트워크 계층 - 전송 계층 - 세션 계층 - 프레젠테이션 계층 - 애플리케이션 계층
OSI-7Layer - 데이터 링크 계층
- 링크의 설정과 유지 및 종료를 담당
- 노드 간의 오류 제어와 흐름 제어 기능을 수행
- 물리적 연결을 이용해 신뢰성 있는 정보를 전송하려고 동기화, 오류 제어, 흐름제어 등의 전송에러를 제어하는 계층
- 데이터 단위 → 프레임
데이터링크 계층의 프로토콜
→ HDLC, PPP, LLC, MAC, LAPD, LAPB
OSI-7Layer - 네트워크 계층
- 패킷을 발신지로부터 최종 목적지까지 전달하는 책임
- 패킷에 발신지와 목적지의 논리 주소 추가
- 라우터 또는 교환기는 패킷 전달을 위해 경로를 지정하거나 교환 기능을 제공
- 데이터 단위 → 패킷
OSI-7Layer - 전송 계층
- 단말기 사이의 오류 수정과 흐름 제어 담당
- 신뢰성 있는 데이터 전송
- 오류 검출, 복구, 흐름 제어 담당
- 종단간(End-to-End) 통신 서비스 제공
OSI 7계층 - 세션 계층
→ 두 응용 프로세스 간의 통신에 대한 제어 구조를 제공
→ 연결의 생성, 관리, 종료를 위해 토큰 사용
💡 TCP/IP 프로토콜
TCP 프로토콜
→ 전송 계층에 해당
→ 헤더의 기본 크기는 20바이트이며, 최대 60바이트까지 확장 가능
→ 신뢰성이 있는 연결 지향형 전달 서비스, 스크림 전송 기능 제공, 순서 제어/오류 제어/흐름 제어 기능 제공
- 흐름 제어 기능을 수행
- 전이중 방식의 양방향 가상회선 제공
- 전송 데이터와 응답 데이터를 함께 전송할 수 있음
TCP 헤더
→ 윈도우의 최대 크기는 65,535(2^16-1) byte
- 순서 번호는 전달하는 바이트마다 번호가 부여
- 수신 번호 확인은 상대편 호스트에서 받으려는 바이트의 번호 정의
- 체크섬은 데이터를 포함한 세그먼트의 오류를 검사
TCP 흐름제어 기법
- Stop and Wait: 하나의 프레임 전송 후 응답 대기
- 손실된 프레임 1개만 전송하고 수신자의 응답을 기다림
UDP 특성
- 비연결형 서비스로 흐름제어 없음
- 신뢰성보다 속도 중시
- 헤더가 단순하여 오버헤드가 적음
CSMA/CA
→ 무선 랜에서 데이터 전송 시 , 매체가 비어있음을 확인한 뒤 충돌을 회피하기 위해 임의 시간을 기다린 후 데이터를 전송하는 방법
→ 네트워크에 데이터의 전송이 없는 경우라도 동시 전송에 의한 충돌에 대비하여 확인 신호를 전송
IP 주소
A 클래스 0~127
B 클래스 128~191
C 클래스 192~223
D 클래스 224~239
E 클래스 실험적 주소이며 공용되지 않음
IP 주소체계
→ 패킷 크기는 제한 X
∗ IPv4 → 패킷 크기가 64byte로 고정되어 있는 것
- 128비트의 주소 공간 제공
- 인증 및 보안 기능을 포함
- IPv6 확장 헤더를 통해 네트워크 기능 확장이 용이
- IPv6의 패킷 헤더는 40옥텟(octet)의 고정된 길이를 가짐
- IPv6는 주소 자동설정 기능을 통해 손쉽게 이용자의 단말을 네트워크에 접속시킬 수 있음
- IPv4는 호스트 주소를 자동으로 설정하며 유니캐스트를 지원
- IPv4는 클래스별로 네트워크와 호스트 주소의 길이가 다름
IPv6
→ 16비트씩 8부분, 총 128비트로 구성되어 있으며 각 부분을 16진수로 표현
→ 128비트의 주소체계를 사용
→ 멀티미디어의 실시간 처리 가능, IPv4보다 보안성 강화, 자동으로 네트워크 환경 구성 가능
- 2^128개의 주소를 표현할 수 있음
- 등급별, 서비스별로 패킷을 구분할 수 있어 품질 보장 용이함
- 확장기능을 통해 보안기능 제공
IPv6 주소 체계
- Unicast, Anycast, Muticast
IPv6 vs. IPv4
→ IPv4에 비해 자료 전송 속도가 빠르다!
- IPv4는 각 부분을 옥텟으로 구성, 총 32비트로 구성
- IPv6는 각 부분을 콜론으로 구분
- IPv4는 네트워크 부분의 길이에 따라 A클래스에서 E클래스까지 총 5단계로 구성되어 있음
ICMP (Internet Control Message Protocol)
→ TCP/IP 계층 구조에서 IP 동작 과정에서의 전송 오류가 발생하는 경우에 대비해 오류 정보를 전송하는 목적으로 사용하는 프로토콜
IP 프로토콜
→ 헤더 체크섬만 제공함!
- 패킷을 분할, 병합하는 기능을 수행하기도 함
- 비연결형 서비스 제공
- Best Effort 원칙에 따른 전송 기능 제공
- Header Length: IP 프로토콜의 헤더 길이를 32비트 워드 단위로 표시
- Packet Length: IP 헤더를 포함한 패킷 전체의 길이를 나타내며 최대 크기는 2^16-1
- Time To Live: 송신 호스트가 패킷을 전송하기 전 네트워크에서 생존할 수 있는 시간을 지정한 것
- Version Number: IP 프로토콜의 버전 번호
RIP 라우팅 프로토콜
- 경로 선택 메트릭은 홉 카운트
- 최단 경로 탐색에 Bellman-Ford 알고리즘 사용
- 각 라우터는 이웃 라우터들로부터 수신한 정보를 이용하여 라우팅 표를 갱신
- IGP(내부 게이트웨이 프로토콜)에 해당
broadcast IP 주소 구하기
200.1.1.0/24
네트워크를 FLSM 방식을 이용하여 10개의 Subnet으로 나누고, ip subnet-zero를 적용
이 때 서브네팅된 네트워크 중 10번째 네트워크의 broadcast IP 주소는?
1. 10개의 서브넷을 만들기 위해서는 4비트가 필요함
- 2^3 = 8 (부족)
- 2^4 = 16 (충분)
2. `/24` 네트워크를 4비트 더 사용하므로 서브넷 마스크는 `/28`이 된다
- 각 서브넷은 2^4 = 16개의 IP주소를 가짐
3. 각 서브넷의 시작 주소는 16씩 증가
- 0번째: 200.1.1.0
- 1번째: 200.1.1.16
- 2번째: 200.1.1.32
...
- 9번째(10번째 네트워크): 200.1.1.144
4. 브로드캐스트 주소는 다음 서브넷의 시작 주소 -1
- 10번째 네트워크의 시작: 200.1.1.144
- 다음 서브넷의 시작: 200.1.1.160
-> 브로드캐스트 주소: 200.1.1.159
서브넷 주소가 0번부터 시작하는 것은 ip subnet-zero 적용
💡 운영체제
운영체제
- 다중 사용자와 다중 응용 프로그램 환경 하에서 자원의 현재 상태를 파악하고 자원 분배를 위한 스케줄링 담당
- CPU, 메모리 공간, 기억 장치, 입출력 장치 등의 자원 관리
- 입출력장치와 사용자 프로그램 제어
∗ 매크로 프로세서, 어셈블리, 컴파일러 → 시스템 소프트웨어의 종류
운영체제의 제어 프로그램 종류
→ 감시 프로그램, 작업 관리 프로그램, 데이터 관리 프로그램
은행원 알고리즘
→ 교착상태의 해결 방법 중 회피 기법에 해당함
HRN 방식 스케줄링 처리 순서
응답률 = (대기시간 + 서비스 시간) / 서비스 시간
💡 C/Java 기본 문법과 연산자 우선 순위
C언어 함수
atoi()
→ 문자열을 정수형으로 변환
atof()
→ 문자열을 실수형으로 변환
itoa()
→ 정수형을 문자열로 변환
ceil()
→ 실수를 정수형으로 올림처리
strlen(s)
- s의 길이 구함
strcpy(s1, s2)
- s2를 s1으로 복사 (copy)
strcmp(s1, s2)
- s1과 s2에 저장된 문자열이 동일한지 비교 (compare)
strrev(s)
- s를 거꾸로 변환 (reverse)
C언어 - malloc()
→ 입력한 Byte 만큼 메모리를 할당하는 함수
포인터 변수 = malloc(크기);
C언어의 대표적인 표준 라이브러리
- stdio.h
- math.h
- string.h
- stdlib.h
- 자료형 변환, 난수 발생, 메모리 할당에 사용되는 기능들 제공
- time.h
Java 연산
public class Operator {
public static void main(String[] args) {
int x = 5, y = 0, z = 0;
y = x++;
z = --x;
System.out.print(x + ", " + y + ", " + z);
}
}
출력 결과 ⇒ 5, 5, 5
JAVA의 예외(exception)
→ 문법 오류가 날 경우 코드가 실행조차 되지 않으므로 예외 처리 불가
![image.png]()
연산자 우선 순위
→ 단항, 산술, 시프트, 관계, 비트, 논리, 조건, 대입, 순서 연산자 순
→ 관계 연산자 중에서 <, <=, >=, >
는 ==, !=
보다 우선순위가 높다
![image.png]()
5과목: 정보시스템 구축 관리
💡 암호화 알고리즘
암호화 알고리즘
- 개인키 암호화 알고리즘 → AES
- 해시 알고리즘 → MD4, MD5, SHA-1
대칭 알고리즘 / 비대칭 알고리즘
→ 대칭 알고리즘은 비밀키를 공유해야 하기 때문에 키 관리의 어려움이 있지만 알고리즘이 단순하여 암호화 및 복호화 속도가 빠름
공개키 암호화 기법
- 키의 개수: 2n
- 복호화 키는 비공개
- 송신자는 수신자의 공개키로 문서 암호화
- RSA
대칭키 암호화 기법
암호화 키와 복호화 키가 동일한 암호화 알고리즘
→ DES, SEED, AES ,ARIA, LSFSR, RC4 등
스트림 암호화 방식
- 비트/바이트/단어들을 순차적으로 암호화
- RC4는 스트림 암호화 방식에 해당
- 대칭키 암호화 방식
해쉬 암호화 방식
- 블록 단위로 해쉬 알고리즘을 적용하는 방식
- 임의의 길이의 입력 데이터를 받아 고정된 길이의 해쉬 값으로 변환
- 대표적인 해쉬 알고리즘으로 HAVAL, SHA-1 등
- 해쉬 함수는 일방향 함수
블록 암호화 방식
RSA
→ 비대칭 암호화 방식으로 소수를 활용한 암호화 알고리즘
→ 1978년 MIT에서 제안된 공개키 암호화 알고리즘
→ 큰 숫자를 소인수분해하기 어렵다는 것에 기반
AES
→ DES의 보안 문제 해결을 위해 NIST에서 개발한 개인키 암호화 알고리즘
→ 암호화 키와 복호화 키가 동
알고리즘 종류
∗ SEED → 한국인터넷진흥원에서 개발한 블록 암호화 알고리즘
∗ ARIA → 국자정보원과 산학협회가 개발한 블록 암호화 알고리즘
∗ DES → 미국 NBS에서 발표한 개인키 암호화 알고리즘
∗ AES → 미국 표준 기술 연구소(NIST)에서 발표한 개인키 암호화 알고리즘
∗ RSA → MIT의 라이베스트, 샤미르, 애들먼에 의해 제안된 공개키 암호화 알고리즘, 소인수 분해 문제를 이용한 공개키 암호화 기법에 널리 사용
알고리즘 구분
- AES → 개인키 암호화 알고리즘
- MD4, MD5, SHA-1 → 해시 알고리즘
STA (Spanning Tree Algorithm)
→ 루프(폐회로)를 형성하지 않으면서 연결을 설정하는 알고리즘
💡 비용 산정 기법 - COCOMO 모델
소프트웨어 비용 추정 모형
→ COCOMO, Putnam, Function-Point
기능 점수(Functional Point) 모형에서 비용 산정에 이용되는 요소
→ 자료 입력(입력 양식), 정보 출력(출력 보고서), 명령어(사용자 질의수), 데이터 파일, 필요한 외부 루틴과의 인터페이스
Putnam 모형
→ Rayleigh-Norden 곡선을 이용한 프로젝트 비용 산정 기법
COCOMO 소프트웨어 개발 유형
- 조직형 (Organic) → 기관 내부에서 개발된 중/소 규모의 소프트웨어, 5만 라인 이하의 소프트웨어를 개발하는 유형
- 반분리형 (Semi-Detached) → 조직형과 내장형의 중간형, 30만 라인 이하의 소프트웨어를 개발하는 유형
- 내장형 (Embedded) → 최대형 규모의 트랜잭션 처리 시스템이나 운영체제 등의 30만 라인 이상의 소프트웨어를 개발하는 유형
💡 비용 산정 기법 - LOC 기법
LOC 기법
S/W 각 기능의 원시 코드 라인수와 비관치, 낙관치, 기대치를 측정하여 예측치를 구하고 이를 이용하여 비용을 산정하는 기법
라인수 / (프로그래머 수 * 평균 생산성)
💡 접근 통제
접근통제 기술
- 임의 접근통제 (DAC), 강제 접근통제(MAC), 역할기반 접근통제(RBAC)
- MAC(Mandatory Access Control) → 강제 접근 통제, 주체와 객체의 등급을 비교하여 접근 권한을 부여하는 방식
- DAC(Discretionary Access Control) → 데이터에 접근하는 사용자의 신원에 따라 접근 권한을 부여하는 방식
- RBAC(Role Based Access Control) → 사용자의 역할에 따라 접근 권한을 부여하는 방식 / 접근 통제 방법 중 조직 내에서 직무, 직책 등 개인의 역할에 따라 결정하여 부여하는 접근 정책
벨 라파듈라 모델
→ 군대의 보안 레벨처럼 정보의 기밀성에 따라 상하 관계가 구분된 정보를 보호하기 위해 사용
클락-윌슨 무결성 모델
→ 무결성 중심의 상업용 모델, 사용자가 직접 개체에 접근할 수 없고 프로그램에 의해 접근 가능한 보안 모델
PDCA 모델
→ 프로세스 및 제품의 제어 및 지속적인 개선을 위해 ‘계획, 행동, 평가, 개선’의 4 단계를 반복하는 모델
만리장성 모델
→ 서로 이해 충돌 관계에 있는 객체 간의 정보 접근을 통제하는 모델
💡 보안
정보보안의 4요소
→ 기밀성, 무결성, 가용성
정보 보안 요소의 무결성
→ 시스템 내의 정보는 오직 인가된 사용자만 수정할 수 있다
WPA (Wi-Fi Protected Access)
→ Wi-Fi에서 제정한 무선 랜(WLAN) 인증 및 암호화 관련 표준
Secure 코딩에서 입력 데이터 검증 및 표현의 보안 약점
- SQL 삽입 → 사용자의 입력 값 등 외부 입력 값이 SQL 쿼리에 삽입되어 공격
- 크로스사이트 스크립트 → 검증되지 않은 외부 입력 값에 의해 브라우저에서 악의적인 코드가 실행
- 운영체제 명령어 삽입 → 운영체제 명령어 파라미터 입력 값이 적절한 사전검증을 거치지 않고 사용되어 공격자가 운영체제 명령어를 조작
- 자원 삽입 → 데이터 입/출력 경로를 조작하여 서버 자원을 수정 및 삭제
- 위험한 형식 파일 업로드 → 악의적인 명령어가 포함된 스크립트 파일을 업로드함으로써 시스템에 손상을 줌
응용 프로그램의 보안 설정
→ 실행 프로세스 권한 설정, 운영체제의 접근 제한, 운영체제의 정보 수집 제한
∗ 서버 관리실 출입 통제는 ㅋㅋ 물리적 보안에 포함되는 보안 조치
SSH(Secure Shell)
- 기본 네트워크 포트: 22번
- 전송되는 데이터는 암호화 됨
- 키를 통한 인증은 클라이언트의 공개키를 서버에 등록해야 함
- 서로 연결되어 있는 컴퓨터 간 원격 명령 실행이나 셀 서비스 등을 수행
IPSec
→ 암호화와 복호화가 모두 가능한 양방향 암호 방식
- ESP는 발신지 인증, 데이터 무결성, 기밀 성 모두를 보장
- 운영 모드는 Tunnel 모드와 Transport 모드로 분류
- AH는 발신지 호스트를 인증하고, IP 패킷의 무결성을 보장함
세션 하이재킹
- 비동기화 상태 탐지
- ACK STORM 탐지
- 패킷의 유실 및 재전송 증가 탐지
- 예상치 못한 접속의 리셋 탐지
침입 탐지 시스템
∗ 이상 탐지 기법 → 평균적인 시스템의 상테를 기준으로 비정상적인 행위나 자원의 사용이 감지되면 이를 알려주는 시스템
∗ 오용 탐지 기법 → Signature Base나 Knowledge Base라고도 불리며 이미 발견되고 정립된 공격 패턴을 입력해두었다가 탐지 및 차단
∗ HIDS(Host-Based Intrusion Detection) → 운영체제에 설정된 사용자 계정에 따라 어떤 사용자가 어떤 접근을 시도하고 어떤 작업을 했는지에 대한 기록을 남기고 추적
∗ NIDS(Network-Based Intrusion Detection System) → 대표적: Snort
∗ 외부 인터넷에 서비스를 제공하는 서버가 위치하는 네트워크인 DMZ에는 IDS가 설치될 수 없음
악의적인 사용자가 지인 또는 특정 유명인으로 가장하여 활동하는 공격 기법
→ Evil Twin Attack, Phishing
웜(Worm)
→ 악성코드의 유형 중 다른 컴퓨터의 취약점을 이용하여 스스로 전파(복제)하거나 메일로 전파되며 스스로를 증식하는 것
∗ 로그 웨어(Rogue Ware) - 사용자를 속여 악성 코드를 설치하도록 유도하는 소프트웨어
∗ 애드웨어(Adware) - 소프트웨어 자체에 광고를 포함하여 이를 보는 대가로 무료로 사용하는 소프트웨어
∗ 반사 공격(Reflection Attack) - 송신자가 생성한 메시지를 가로채 접근 권한을 얻는 형태의 공격 기법
Ping of Death
→ 시스템 공격 기법 중 하나로 허용 범위 이상의 ICMP 패킷을 전송하여 대상 시스템의 네트워크를 마비
∗ 세션 하이재킹(Session Hijacking) - 서버에 접속하고 있는 클라이언트들의 세션 정보를 가로채는 공격 기법
∗ 피기백 공격(Piggyback Attack) - 시스템의 올바른 인증 절차나 보안 프로그램에 편승하는 공격 방법
∗ 크로스사이트 스크립팅(XSS: Cross Site Scripting) - 웹페이지에 악의적인 스크립트를 삽입하여 방문자들의 정보를 탈취하거나, 비정상적인 기능 수행을 유발하는 보안 약점
XSS (Cross Site Scripting)
→ 웹페이지에 악의적인 스크립트를 포함시켜 사용자 측에서 실행되게 유도함으로써, 정보 유출 등의 공격을 유발할 수 있는 취약점
∗ 피싱 - 낚시, 허위 웹사이트 내세워 사용자의 개인 신용 정보를 빼내는 수법을 의미
∗ 파밍 - 합법적으로 소유하고 있던 사용자의 도메인을 탈취하거나 DNS 이름을 속여 사용자들이 진짜 사이트로 오인하도록 유도하여 개인 정보를 훔치는 신종 인터넷 사기 수법
∗ 랜섬웨어 - 인터넷 사용자의 컴퓨터에 잠입해 내부 문서나 파일 등을 암호화해 사용자가 열지 못하게 하는 프로그램, 돈 요구하기도 함
스위치 재밍(Switch Jamming)
- 위조된 매체 접근 제어(MAC) 주소를 지속적으로 네트워크로 흘려보내, 스위치 MAC 주소 테이블의 저장 기능을 혼란시켜 더미 허브(Dummy Hub)처럼 작동하게 하는 공격
LAN Tapping
- LAN 회선 중간에서 전기 신호를 도청하는 행위
Ransomware
사용자의 컴퓨터에 침입해 내부 분서 파일 등을 암호화해 사용자가 열지 못하게 하는 공격
→ 암호 해독용 프로그램의 전달을 조건으로 사용자에게 돈을 요구하기도 한다
Smurf
→ 네트워크 라우터의 브로드캐스트 주소를 활용한 DoS 공격
→ IP 또는 ICMP의 특성을 악용하여 특정 사이트에 집중적으로 데이터를 보내 네트워크 또는 시스템의 상태를 불능으로 만드는 공격
공격 대상이 네트워크의 임의의 시스템에 패킷을 보내게 만드는 공격
∗ TearDrop → Offset 값을 변경시켜 수신 측에서 패킷을 재조립할 때 오류로 인한 과부하를 발생시킴
∗ Qshing → QR코드 + 피싱(Fishing)
블루투스 공격 종
- 블루 버그 → 블루투스 장비 사이의 취약한 연결 관리를 악용한 공격, 휴대폰을 원격 조정하거나 통화를 감청할 수 있음
- 블루스나프 → 블루투스의 취약점을 활용하여 장비의 파일에 접근하는 공격으로, 인증없이 간편하게 정보를 교환할 수 있는 OPP(Object Push Profile)를 사용하여 정보를 열람
- 블루재킹 → 블루투스를 이용해 스팸처럼 명함을 익명으로 퍼뜨리는 공격
- 블루프린팅 → 블루투스 공격 장치의 검색 활동을 의미함
네트워크 장비
- 리피터: 전송되는 신호가 전송 선로의 특성 및 외부 충격 등의 요인으로 인해 원래의 형태와 다르게 왜곡되거나 약해질 경우 원래의 신호 형태로 재생하여 다시 전송하는 역할을 수행
- 브라우터: 브리지와 라우터의 기능을 모두 갖추고 있는 네트워크 장비
- 네트워크 인터페이스 카드: 케이블을 통해 정보 전송
- 허브: 한 사무실이나 가까운 거리의 컴퓨터들을 연결하는 장치
- 스위치: 브리지와 같이 LAN과 LAN을 연결하여 훨씬 더 큰 LAN을 만드는 장치
- 라우터: 브리지와 같이 LAN과 LAN의 연결 기능에 데이터 전송의 최정 경로를 선택할 수 있는 기능 추가
- 게이트웨이: 전 계층의 프로토콜 구조가 다른 네트워크의 연결을 수행