본문 바로가기

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

[정보처리기사] Chapter 01. 소프트웨어 개발: 데이터 입출력 구현

1. 자료 구조 (중요도: A)

 자료 구조란 프로그램에서 사용하기 위한 자료를 기억장치 공간 내에 저장하는 방법과 저장된 그룹 내에 존재하는 자료 간의 관계, 처리 방법 등을 연구 분석하는 것을 말한다.   자료구조는 다음과 같은 특징을 가진다.

 

◍  자료의 표현과 그것과 관련된 연산이다.

◍  일련의 자료들을 조직하고 구조화 하는 것이다.

◍  어떠한 자료 구조에서도 필요한 모든 연산들을 처리할 수 있다.

◍  자료 구조에 따라 프로그램 실행시간이 달라진다.

 

1.1. 자료 구조의 분류

 

 

1.2. 선형 구조(Linear Structure)

1) 배열(Array)

 배열은 동일한 자료의 데이터들이 같은 크기로 나열되어 순서를 갖고 있는 집합이다. 정적인 자료 구조로 기억장소의 추가가 어려우며, 데이터 삭제 시 데이터가 저장되어 있던 기억장소는 빈 공간으로 남아있어 메모리의 낭비가 발생한다. 

 다만, 데이터마다 동일한 이름의 변수를 사용하여 처리가 간편하고 반복적인 데이터 처리 작업에 적합한 구조를 가지고 있다. 사용한 첨자의 개수에 따라  n차원 배열이라 부른다. 일반적으로 2개의 항을 초과해 사용하지는 않는다.

 

◍  a는 변수 이름

◍  '[숫자]' 는 첨자에 해당

◍  하나의 사각형은 하나의 기억장소

 

 

2) 선형 리스트(Linear List)

 일정한 순서에 의해 나열된 자료 구조이다. 배열을 이용하는 연속 리스트와 포인터(현재의 위치에서 다음 노드의 위치를 알려주는 요소 )를 이용하는 연결 리스트로 구분한다.

 

① 연속 리스트(Contiguous List)

 배열과 같이 연속되는 기억장소에 저장되는 자료 구조이다. 기억장소를 연속적으로 배정받기 때문에 기억장소 이용 효율은 밀도가 1(기억장소를 빈공간없이 꽉 차게 사용한다. )로서 가장 좋다. 연속리스트는 중간에 데이터를 삽입하기 위해서는 연속된 빈 공간이 있어야 하며, 삽입, 삭제 시 자료의 이동이 필요하다.

 

연결 리스트(Linked List)

자료들을 반드시 연속적으로 배열시키지는 않고 임의의 기억공간에 기억시키되, 자료 항목의 순서에 따라 노드(료를 저장하는 데이터 부분과 다음 노드를 가리키는 포인터인 링크 부분으로 구성 )의 포인터 부분을 이용해 서로 연결시킨 자료 구조이다. 

 노드의 삽입 삭제 작업이 용이하며 기억 공간이 연속적으로 놓여 있지 않아도 저장이 가능한 장점을 가지고 있다. 다만 연결을 위한 링크 부분이 필요해 기억 공간의 이용 효율이 좋지 않고, 연결을 위한 포인터를 찾는 시간이 필요해 접근 속도가 느리다. 

 만약 변조 등을 이유로 중간 노드 연결이 끊어지면 그 다음 노드를 찾기가 힘들기 때문에 데이터 확인이 어려울 수 있다.

 

3) 스택(Stack)

 리스트의 한쪽 끝으로만 자료의 삽입, 삭제 작업이 이루어지는 자료 구조이다. 스택은 가장 나중에 삽입된 자료가 가장 먼저 삭제 되는 후입선출(LIFO; Last In First Out) 방식으로 자료를 처리한다. 

 

스택의 모든 기억 공간이 꽉 채워져 있는 상태에서 데이터 삽입 시. 오버플로(Overflow)가 발생하며, 더 이상 삭제할 데이터가 없는 상태에서 데이터 삭제 시. 언더플로(Underflow) 가 발생한다. 

 스택 영역에서 발생한 오버플로는 스택 영역 외에 다른 메모리를 임시로 할당하는 것이며, 스택이 영역을 침입하였다하여 ‘Overflow’라고 한다. 

 

4) 큐(Queue)

   

 리스트의 한쪽에서는 삽입 작업이 이루어지고, 다른 한쪽에서는 삭제 작업이 이루어지도록 구성한 자료 구조이다. 큐는 스택과 반대로 가장 먼저 삽입된 자료가 가장 먼저 삭제 되는 선입선출(FIFO; First In First Out) 방식으로 자료를 처리한다. 시작과 끝을 표시하는 2개의 포인터가 있으며, 주로 운영체제의 작업 스케줄링에 사용한다.

 

◍ 프론트(F, Front) 포인터: 가장 먼저 삽입된 자료의 기억 공간을 가리키는 포인터로 삭제 작업을 할 때 사용한다.

◍ 리어(R, Rear) 포인터: 가장 마지막에 삽입된 자료가 위치한 기억 공간을 가리키는 포인터로, 삽입 작업을 사용할 때 사용한다.

 

1.3. 비선형 구조(Non- Linear Structure)

1) 트리(Tree)

 정점(Node, 노드)과 선분(Branch, 가지)을 이용하여 사이클을 이루지 않도록 구성한 그래프의 특수한 형태이다. 노드는 하나의 기억 공간을 말하고, 링크는 노드와 노드를 연결하는 선을 말한다. 트리는 족보, 조직도 등을 표현하기에 적합한 구조이다.

 

 

◍ 노드(Node): 하나의 기억 공간, 트리의 기본 요소    ex) R, R1, R2....

◍ 근 노드(Root Node): 트리의 맨 위에 있는 노드    ex) R

◍ 디그리(Degree, 차수): 각 노드에서 뻗어 나온 가지의 수    ex) R = 4, R1=4

◍ 단말 노드(Terminal Node) = 잎 노드(Leaf Node): 자식이 하나도 없는 노드    ex) R3

◍ 자식 노드(Son Node): 어떤 노드에 연결된 다음 레벨의 노드들    ex) R12의 자식노드: R121, R122, R123, R124 

◍ 부모 노드(Parent Node): 어떤 노드에 연결된 이전 레벨의 노드들    ex) R13의 부모 노드 : R1

◍ 형제 노드(Brother Node, Sibling): 동일한 부모를 갖는 노드들    ex) R12의 형제 노드 : R11, R13, R14   

◍ 트리의 디그리: 노드들의 디그리 중에서 가장 많은 수    ex) 위 예시는 디그리가 4이다. 

 


2. 데이터저장소 / 데이터베이스 / DBMS (중요도: A)

2.1. 데이터저장소

 데이터저장소란 프트웨어 개발 과정에서 다루어야 할 데이터들을 논리적인 구조로 조직화하거나, 물리적인 공간에 구축한 것을 의미한다.  데이터저장소의 구축 과정과 DB 구축 과정은 동일하며, 논리 데이터저장소와 물리 데이터저장소로 구분된다. 

 

논리 데이터저장소: 데이터 및 데이터 간의 연관성, 제약조건을 식별하여 논리적인 구조로 조직화 한 것이다. 

물리 데이터저장소: 논리 데이터저장소에 저장된 데이터와 구조들을 하드웨어적인 저장장치에 저장한 것을 말한다. 

 

2.2. 데이터베이스

 데이터베이스는 여러 사람에 의해 공동으로 사용될 데이터를 중복을 배제해 통합하고, 쉽게 접근해 처리할 수 있도록 저장장치에 저장해서 항상 사용할 수 있도록 운영하는 운영 데이터이다. 특정 조직의 업무를 수행하는 데 필요한 상호 관련된 데이터들의 모임으로 다음과 같이 정의 할 수 있다. 

 

◍  통합된 데이터(Integrated Data): 자료의 중복을 최소화한 데이터의 모임이다.

저장된 데이터(Stored Data): 컴퓨터가 접근할 수 있는 저장 매체에 저장된 자료이다.

운영 데이터(Operational Data): 조직의 고유한 업무를 수행하는 데 존재 가치가 확실하고 없어서는 안 될 반드시 필요한 자료이다.

공용 데이터(Shared Data): 여러 응용 시스템들이 공동으로 소유하고 유지하는 자료이다.

 

2.3. DBMS(DataBase Management System)

 데이터베이스 관리 시스템이란, 데이터베이스 사이에서 사용자의 요구에 따라 정보를 생성하고 데이터베이스를 관리해주는 소프트웨어다. 기존의 파일 시스템이 갖는 데이터의 종속성과 중복성의 문제를 해결하기 위해 제한된 시스템이며,  DBMS의 필수 기능은 정의, 조작, 제어이다. 

 

정의 기능: 모든 응용 프로그램들이 요구하는 데이터 구조를 지원하기 위해 데이터베이스에 저장될 데이터의 형(Type)과 구조에 대한 정의, 이용방식, 제약조건을 명시하는 기능이다. (응용 P ↔ DB)

 

조작 기능: 데이터 검색, 갱신, 삽입, 삭제 등을 체계적으로 처리하기 위해 사용자와 데이터베이스 사이의 인터페이스 수단을 제공하는 기능이다. (사용자 ↔ DB)

 

제어 기능: 데이터의 무결성을 유지하고, 보안 유지, 권한 검사, 처리 결과가 항상 정확성을 유지하도록 제어해야 한다. 정당한 사용자가 허가된 데이터만 접근할 수 있도록 보안을 유지하고 권한을 검사할 수 있어야 한다. 여러 사용자가 데이터베이스를 동시에 접근하여 데이터를 처리할 때 처리 결과가 항상 정확성을 유지할 수 있도록 병행제어(Concurrency Control: 동시에 여러 개의 트랜잭션을 병행 수행할 때, 트랜잭션들이 DB의 일관성을 파괴하지 않도록 트랜잭션 간의 상호작용을 제어하는 것. )를 사용한다.

 

2.4. DBMS의 장 단점

장점

단점 

◍  데이터의 논리적, 물리적 독립성 보장

◍  데이터의 중복 피할 수 있음, 기억 공간 절약

◍  저장된 자료를 공동으로 이용할 수 있음

◍  데이터의 무결성 유지

◍  데이터의 일관성 유지

◍  보안 유지

◍  데이터 표준화 가능

◍  데이터 통합 관리 가능

◍  항상 최신의 데이터 유지

◍  데이터 실시간 처리 가능 

◍  DB의 전문가 부족

◍  전산화 비용 증가 

◍  대용량 디스크로의 집중적인 접근으로 과부하 발생

◍  파일의 Backup과 Recovery가 어려움

◍  시스템 복잡 



 


3.데이터 입·출력 (중요도: B)

 데이터 입·출력은 소프트웨어의 기능 구현을 위해 DB에 데이터를 입력하고, DB의 데이터를 출력하는 작업을 의미한다. 단순 입력과 출력뿐만 아니라 데이터를 조작하는 모든 행위를 의미하여, 이와 같은 작업을 위해 SQL(Structured Query Language)을 사용한다. 

 데이터 입·출력은 소프트웨어에 구현하기 위해 개발 코드 내에 SQL 코드를 삽입하거나, 객체와 데이터를 연결하는 것을 데이터 접속(Data Mapping)이라고 한다. 또한, SQL을 통한 데이터베이스의 조작을 수행할 때 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 트랜잭션(Transaction)이라고 한다.

 

3.1. SQL(Structured Query Language)

 국제 표준 데이터베이스 언어이다. 관계대수와 관계해석을 기초로 하며, 질의어 (데이터베이스 파일과 범용 프로그래밍 언어를 정확히 알지 못하는 단말 사용자들이 단말기를 통해 대화식으로 쉽게 DB를 이용할 수 있도록 하는 비절차어)지만 질의 기능만 있는 것이 아니라 데이터 구조의 정의, 데이터 조작, 데이터 제어 기능을 모두 갖추고 있다. 다시말해 SQL은 데이터 정의어(DDL), 데이터 조작어(DML), 데이터 제어어(DCL)로 구분되어 있다는 것이다.

 

3.2. 데이터 접속(Data Mapping)

 소프트웨어의 기능 구현을 위해 프로그래밍 코드와 DB의 데이터를 연결하는 것을 말하며, 관련 기술로 SQL Mapping과 ORM이 있다. 

 

SQL Mapping: 프로그래밍 코드 내에 SQL을 직접 입력해  DBMS의 데이터에 접속하는 기술 (JDBC, ODBC, MyBatis 등)

ORM(Object-Relational Mapping): 객체지향 프로그래밍의 객체와 관계형 DB의 데이터를 연결하는 기술 (JPA, Hibernate, Django 등)

 

3.3. 트랜잭션(Transaction)

 DB 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위, 한꺼번에 모두 수행되어야 할 일련의 연산을 의미한다. 트랜잭션을 제어하기 위해 사용하는 명령어를 TCL(Transaction Control Language)이라고 하며, TCL은 COMMIT, ROLLBACK, SAVEPOINT 등이 있다.

 

◍ COMMIT: 트랜잭션 처리가 정상적으로 종료되어 트랜잭션이 수행한 변경 내용을 데이터베이스에 반영하는 명령어이다.

◍ ROLLBACK: 하나의 트랜잭션 처리가 비정상으로 종료되어 데이터베이스의 일관성이 깨졌을 때, 트랜잭션이 행한 모든 변경 작업을 취소하고 이전 상태로 되돌리는 연산이다.

◍ SAVEPOINT(=CHECKPOINT): 트랜잭션 내에 ROLLBACK 할 위치인 저장점을 지정하는 명령어이다. 

 

 


4. 절차형 SQL (중요도: B)

 절차형 SQL은 C, JAVA 등의 프로그래밍 언어와 같이, 연속적인 실행이나 분기, 반복 등의 제어가 가능한 SQL을 의미한다. 

 일반적으로 프로그래밍 언어에 비해 효율은 떨어지지만 단일 SQL 문장으로 처리하기 어려운 연속적인 작업을 처리하는데 적합하다. 절차형 SQL을 활용하면 다양한 기능을 수행하는 저장 모듈을 생성할 수 있다. 또한 DBMS 엔진에서 직접 실행되어 입·출력 패킷이 적은 장점이 있다. 

 

절차형 SQL의 종류는 프로시저, 트리거, 사용자 함수가 있다.

프로시저(Procedure): 특정 기능을 수행하는 일종의 트랜잭션 언어이다. 호출을 통해 실행되어 미리 저장해 놓은 SQL 작업을 수행한다.

트리거(Trigger): DB 시스템에서 데이터의 입력, 갱신, 삭제 등의 이벤트가 발생할 때마다 관련 작업이 자동으로 수행된다.

사용자 정의 함수: 프로시저와 유사하게 SQL을 사용해 일련의 작업을 연속적으로 처리, 종료 시 예약어 Return 사용해 처리 결과를 단일값으로 반환한다. 

 

4.1. 절차형 SQL의 테스트와 디버깅

 절차형 SQL은 디버깅(오류 잡는 작업 )을 통해 기능의 적합성 여부를 검증하고 실행을 통해 결과를 확인하는 테스트 과정을 수행한다. 절차형 SQL은 테스트 전에 생성을 통해 구문 오류(Syntax Error: 구문 오류란 잘못된 문법으로 작성된 SQL문을 실행하면 출력되는 오류이다. )나 참조 오류의 존재 여부를 확인한다.

 많은 코드로 구성된 절차형 SQL의 특성상 오류 및 경고 메시지가 상세히 출력되지 않으므로 SHOW 명령어를 통해 내용을 확인하고 문제를 수정하는 것이 일반적이다.  정상적으로 생성된 절차형 SQL은 디버깅을 통해 로직을 검증하고, 결과를 통해 최종적인 결과물을 확인한다. 

 절차형 SQL의 디버깅은 출력문을 이용하여 화면에 출력하는데, 실제로 데이터 베이스에 변화를 줄 수 있는 삽입 및 변경 관련 SQL문을 주석으로 처리하여 진행한다.

 

4.2. 쿼리 성능 최적화

 쿼리 성능 최적화는 데이터 입출력 애플리케이션의 성능 향상을 위해 SQL 코드를 최적화 하는 것이다. 쿼리 성능 최적화 전, ARM을 사용해 최적화 할 쿼리를 선정해야 하며, 최적화 할 쿼리에 대해 옵티마이저가 수립한 실행 계획을 검토하고, SQL 코드와 인덱스를 재구성한다.