<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>yejin23.log</title>
        <link>https://velog.io/</link>
        <description>HAPPY</description>
        <lastBuildDate>Wed, 18 Sep 2024 10:00:52 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>yejin23.log</title>
            <url>https://velog.velcdn.com/images/yejin_823/profile/ce63d1ae-5464-420e-944b-a9d2538bfcab/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. yejin23.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/yejin_823" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[BufferedWriter]]></title>
            <link>https://velog.io/@yejin_823/BufferedWriter</link>
            <guid>https://velog.io/@yejin_823/BufferedWriter</guid>
            <pubDate>Wed, 18 Sep 2024 10:00:52 GMT</pubDate>
            <description><![CDATA[<hr>
<h1 id="선언">선언</h1>
<pre><code>BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));   //할당된 버퍼에 값 넣어주기
String s = &quot;abcdefg&quot;;   //출력할 문자열
bw.write(s+&quot;\n&quot;);   //버퍼에 있는 값 전부 출력
bw.flush();   //남아있는 데이터를 모두 출력시킴
bw.close();   //스트림을 닫음</code></pre><blockquote>
<p>flush() / close() 를 반드시 호출해 주어 뒤처리를 해주어야 한다.</p>
</blockquote>
<h1 id="주의할-점">주의할 점</h1>
<ul>
<li>개행은 따로 처리하기</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[BufferedReader]]></title>
            <link>https://velog.io/@yejin_823/BufferedReader</link>
            <guid>https://velog.io/@yejin_823/BufferedReader</guid>
            <pubDate>Wed, 18 Sep 2024 09:59:59 GMT</pubDate>
            <description><![CDATA[<hr>
<h1 id="하는-역할">하는 역할</h1>
<h2 id="scanner과-유사한-역할">Scanner과 유사한 역할</h2>
<blockquote>
<p>입력된 데이터가 바로 전달되지 않고 버퍼를 거쳐 전달되므로 데이터 처리 효율성을 높여 많은 양의 데이터를 처리할 때 유리하다.</p>
</blockquote>
<blockquote>
<p><scan style=color:red> <strong>하지만</strong> <em>Enter만 경계로 인식하고 받은 데이터가 String으로 고정되기 때문에 입력받은 데이터를 가공하는 작업이 필요하다.</em></scan></p>
</blockquote>
<h1 id="선언">선언</h1>
<pre><code>BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //선언
String s = bf.readLine(); //String
int i = Integer.parseInt(bf.readLine()); //Int
</code></pre><blockquote>
<p>readLine(); 메서드 이용</p>
</blockquote>
<h2 id="주의할-점">주의할 점</h2>
<ul>
<li>리턴값을 String으로 고정되기에 형변환</li>
<li>예외처리
throw 이용 시
  (1) 클래스를 import해주어야 한다. 
  <strong>import java.io.IOException; **
  (2) main 클래스 옆에 throws IOException를 작성한다. 
  **public static void main(String[] args) throws IOException {}</strong></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[CH1 소프트웨어 개발 방법론]]></title>
            <link>https://velog.io/@yejin_823/CH1</link>
            <guid>https://velog.io/@yejin_823/CH1</guid>
            <pubDate>Thu, 11 Jul 2024 07:53:20 GMT</pubDate>
            <description><![CDATA[<h1 id="소프트웨어-개발-방법론">소프트웨어 개발 방법론</h1>
<hr>
<h2 id="소프트웨어-생명주기-모델sdlc">소프트웨어 생명주기 모델(SDLC)</h2>
<blockquote>
<ul>
<li>시스템의 요구분석부터 유지보수까지 전 공정을 체계화한 절차</li>
<li>시스템이 개발될 때부터 운용과 유지보수를 거쳐 생애를 마칠 때까지 어떠한 순서를 밟는지에 대한 작업 프로세스를 모델화한 것</li>
</ul>
</blockquote>
<h3 id="프로세스">프로세스</h3>
<ol>
<li><p>요구사항 분석</p>
<ul>
<li><p>다양한 이해관계자의 상충할 수도 있는 요구사항을 고려하여 새로운 제품이나 변경된 제품에 부합하는 요구와 조건을 결정하는 단계</p>
</li>
<li><p>개발할 소프트웨어의 기능과 제약 조건, 목표 등을 소프트웨어 사용자와 함께 명확히 정의하는 단계</p>
<p><code>기능 요구사항 , 비기능 요구사항</code></p>
</li>
</ul>
</li>
<li><p>설계</p>
<ul>
<li><p>시스템 명세 단계에서 정의한 기능을 실제 수행할 수 있도록 수행 방법을 논리적으로 결정하는 단계</p>
<p><code>시스템 구조 설계 , 프로그램 설계 , 사용자 인터페이스 설계</code></p>
</li>
</ul>
</li>
<li><p>구현</p>
<ul>
<li><p>설계단계에서 논리적으로 결정한 문제 해결 방법을 특정 프로그래밍 언어를 사용하여 실제 프로그램을 작성하는 단계</p>
</li>
<li><p>프로그래밍 언어 선택, 기법, 스타일, 순서 등을 결정하는 단계</p>
<p><code>인터페이스 개발 , 자료 구조 개발 , 오류 처리</code></p>
</li>
</ul>
</li>
<li><p>테스트</p>
<ul>
<li>시스템이 정해진 요구를 만족하는지, 예상과 실제결과가 어떤 차이를 보이는지 검사하고 평가하는 단계
<code>단위 테스트 , 통합 테스트 , 시스템 테스트 , 인수 테스트</code></li>
</ul>
</li>
<li><p>유지보수</p>
<ul>
<li>시스템이 인수되고 설치된 후 일어나는 모든 활동
<code>예방 , 완전 , 교정 , 적응 유지보수</code></li>
</ul>
</li>
</ol>
<h3 id="종류">&lt;종류&gt;</h3>
<h3 id="📍-폭포수-모델waterfall-model">📍 폭포수 모델(Waterfall Model)</h3>
<p>: 소프트웨어 개발 시 각 단계를 확실히 마무리 지은 후에 다음 단계로 넘어가는 모델
<code>타당성 검토 -&gt; 계획 -&gt; 요구사항 분석 -&gt; 설계 -&gt; 구현 -&gt; 테스트 -&gt; 유지보수</code></p>
<ul>
<li>가장 오래된 모델</li>
<li>선형 수차적 모형으로 고전적 생명주기 모형이라고도 함</li>
<li>모형의 적용 경험과 성공 사례가 많음</li>
<li>단계별 정의와 산출물이 명확</li>
<li>요구사항 변경이 어려움</li>
</ul>
<h3 id="📍-프로토타이핑-모델prototyping-model">📍 프로토타이핑 모델(Prototyping Model)</h3>
<p>: 고객이 요구한 주요 기능을 프로토타입으로 구현하여 고객의 피드백을 반영하여 소프트웨어를 만들어가는 모델</p>
<ul>
<li>프로토타입은 발주자나 개발자 모두에게 공동의 참조 모델을 제공</li>
<li>프로토타입은 구현 단계의 구현 골격</li>
</ul>
<h3 id="📍-나선형-모델spiral-model">📍 나선형 모델(Spiral Model)</h3>
<p>: 시스템 개발 시 위험을 최소화하기 위해 점진적으로 완벽한 시스템으로 개발해 나가는 모델
<code>계획 및 정의 -&gt; 위험 분석 -&gt; 개발 -&gt; 고객 평가</code></p>
<h3 id="📍-반복적-모델iteration-model">📍 반복적 모델(Iteration Model)</h3>
<p>: 구축대상을 나누어 병렬적으로 개발 후 통합하거나 반복적을 개발하여 점증 완성시키는 SDLC모델</p>
<ul>
<li>사용자의 요구사항 일부분 혹은 제품 일부분을 반복적으로 개발하여 최종시스템으로 완성하는 모델</li>
</ul>
<br>

<table>
<thead>
<tr>
<th><strong>구분</strong></th>
<th>폭포수 모델</th>
<th>프로토타이핑 모델</th>
<th>나선형 모델</th>
<th>반복적 모델</th>
</tr>
</thead>
<tbody><tr>
<td><strong>특징</strong></td>
<td>순차적 접근</td>
<td>프로토타입 개발</td>
<td>위험분석, 반복개발</td>
<td>증분방식으로 병행 개발</td>
</tr>
<tr>
<td><strong>장점</strong></td>
<td>- 이해가 용이<br>- 관리가 편리</td>
<td>- 요구분석 용이<br>- 타당성 검증 가능</td>
<td>위험성 감소와 변경에 유연한 대처</td>
<td>병행 개발로 인한 일정 단축 가능</td>
</tr>
<tr>
<td><strong>단점</strong></td>
<td>요구사항 변경이 어려움</td>
<td>프로토타입 폐기에 따른 비용 증가</td>
<td>단계 반복에 따른 관리 어려움</td>
<td>병행 개발에 따른 관리 비용 증가</td>
</tr>
</tbody></table>
<p><br></br></p>
<hr>
<h2 id="소프트웨어-개발-방법론-1">소프트웨어 개발 방법론</h2>
<blockquote>
<ul>
<li>소프트웨어 개발 전 과정에 지속적으로 적용할 수 있는 방법, 절차, 기법</li>
</ul>
</blockquote>
<ul>
<li>소프트웨어를 하나의 생명체로 간주하고 소프트웨어 개발의 시작부터 시스템을 사용하지 않는 과정까지의 전 과정을 형상화한 방법론</li>
</ul>
<h3 id="종류-1">&lt;종류&gt;</h3>
<h3 id="📍-구조적-방법론structured-development">📍 구조적 방법론(Structured Development)</h3>
<ul>
<li>전체 시스템을 기능에 따라 나누어 개발하고 이를 통합하는 분할과 정복 접근 방식의 방법론</li>
<li>프로세스 중심의 하향식 방법론</li>
<li>구조적 프로그래밍 표현을 위해 나씨-슈나이더만 차트 사용
  <span style="color:green">cf) 나씨-슈나이더만 차트<ul>
<li>논리의 기술에 중점을 둔 도형식 표현 방법</li>
<li>연속, 선택 및 다중 선택, 반복 등의 제어 논리 구조로 표현</li>
<li>조건이 복합되어 있는 곳의 처리를 시각적으로 명확히 식별하는데 적합        </span></li>
</ul>
</li>
</ul>
<h3 id="📍-정보공학-방법론informationengineering-development">📍 정보공학 방법론(InformationEngineering Development)</h3>
<ul>
<li>정보시스템 개발에 필요한 관리 절차와 작업 기법을 체계화한 방법론</li>
<li>개발주기를 이용해 대형 프로젝트를 수행하는 체계적인 방법론</li>
</ul>
<h3 id="📍-객체지향-방법론object-oriented-development">📍 객체지향 방법론(Object-Oriented Development)</h3>
<ul>
<li>&#39;객체&#39;라는 기본 단위로 시스템을 분석 및 설계하는 방법론</li>
<li>복잡한 현실 세계를 사람이 이해하는 방식으로 시스템에 적용하는 방법론</li>
<li>객체, 클래스, 메시지를 사용</li>
</ul>
<h4 id="span-style--backgrounddee2e6-객체지향-span"><span style = 'background:#dee2e6'> 객체지향 </span></h4>
<p>: 실세계의 개체를 속성과 메서드가 결합한 형태의 객체로 표현하는 기법</p>
<p>** 💭 구성요소 **</p>
<ul>
<li><p>클래스(Class)</p>
<ul>
<li>특정 객체 내에 있는 변수와 메서드를 정의하는 일종의 틀</li>
<li>객체 지향  플그래밍에서 데이터를 추상화하는 단위</li>
<li>하나 이상의 유사한 객체들을 묶어서 하나의 공통된 특성을 표현</li>
<li>속성은 변수의 형태로 행위는 매서드 형태로 선언</li>
</ul>
</li>
<li><p>객체(Object)</p>
<ul>
<li>물리적, 추상적으로 자신과 다른 것을 식별 가능한 대상<ul>
<li>클래스에서 정의한 것을 토대로 메모리에 할당됨</li>
</ul>
</li>
<li>객체마다 각각의 상태와 식별성을 가짐</li>
</ul>
</li>
<li><p>메서드(Method)</p>
<ul>
<li>클래스로부터 생성된 객체를 사용하는 방법</li>
<li>객체가 메시지를 받아 실행해야 할 객체의 구체적인 연산</li>
<li>전통적 시스템의 함수(Function) 또는 프로시저(Procedure)에 해당하는 연산 기능</li>
</ul>
</li>
<li><p>메시지(Message)</p>
<ul>
<li>객체 간 상호 작용을 하기 위한 수단</li>
<li>객체에게 어떤 행위를 하도록 지시하는 방법</li>
<li>객체 간의 상호 작용은 메시지를 통해 이루어짐</li>
<li>메시지는 객체에서 객체로 전달됨</li>
</ul>
</li>
<li><p>인스턴스(Instance)</p>
<ul>
<li>객체 지향 기법에서 클래스를 통해 만든 실제의 실형 객체</li>
<li>클래스에 속한 각각의 객체</li>
<li>실제로 메모리상에 할당</li>
</ul>
</li>
<li><p>속성(Property)</p>
<ul>
<li>한 클래스 내에 속한 객체들이 가지고 있는 데이터 값들을 단위별로 정의</li>
<li>성질, 분류, 식별, 수향, 현재 상태 등에 대한 표현 값</li>
</ul>
</li>
</ul>
<p>** 💭 기법 **</p>
<h3 id="📍-컴포넌트-기반-방법론cbd--component-based-development">📍 컴포넌트 기반 방법론(CBD : Component Based Development)</h3>
<ul>
<li>소프트웨어를 구성하는 컴포넌트를 조립해서 하나의 새로운 응용 프로그램을 작성하는 방법론
<span style="color:green">cf) 컴포넌트
  : 원하는 데이터베이스와 소프트웨어의 개발된 모듈 단위</span></li>
<li>개발 기간 단축으로 인한 생산성 향상</li>
<li>새로운 기능 추가 쉬움(확장성)</li>
<li>소프트웨어 재사용이 가능</li>
</ul>
<h3 id="📍-애자일-방법론agile-development">📍 애자일 방법론(Agile Development)</h3>
<ul>
<li>절차보다는 사람이 중심이 되어 변화에 유연하고 신속하게 적응하면서 효율적으로 시스템을 개발할 수 있는 신속 적응적 경량 개발 방법론</li>
<li>애자일은 개발 과정의 어려움을 극복하기 위해 적극적으로 모색한 방법론</li>
<li>개발 기간이 짧고 신속하며 폭포수 모형에 대비되는 방법론으로 개발과 함께 즉시 피드백을 받아서 유동적으로 개발할 수 있다.</li>
</ul>
<h4 id="span-style--backgrounddee2e6-등장-배경-span"><span style = 'background:#dee2e6'> 등장 배경 </span></h4>
<ol>
<li>소프트웨어 개발 환경의 변화<ul>
<li>소프트웨어 개발 트렌드가 모바일 환경으로 변화</li>
<li>시작 적시성과 잦은 배포의 중요성 부각</li>
</ul>
</li>
<li>기존 개발 방법론의 한계<ul>
<li>전통적 방법론은 문서 및 절차 위주로 변화에 신속한 대응이 어려움</li>
<li>빠르게 적용하고 효율적으로 개발할 수 있는 방법론의 필요성 증가</li>
</ul>
</li>
</ol>
<h4 id="span-style--backgrounddee2e6-유형-span"><span style = 'background:#dee2e6'> 유형 </span></h4>
<p><strong>1. XP</strong>
: 의사소통 개선과 즉각적 피드백으로 소프트웨어 품질을 높이기 위한 방법론</p>
<ul>
<li><p>1~3주의 반복 개발주기</p>
</li>
<li><p>5가지 가치</p>
<blockquote>
<ul>
<li>용기(Courage)
: 용기를 가지고 자신감 있게 개발</li>
<li>단순성(Simplicity)
: 필요한 것만 하고 그 이상의 것들은 하지 않음</li>
<li>의사소통(Communication)
: 개발자, 관리자, 고객 간의 원활한 소통</li>
<li>피드백(Feedback)
: 의사소통에 대한 빠른 피드백</li>
<li>존중(Respect)
: 팀원 간의 상호 존중</li>
</ul>
</blockquote>
</li>
<li><p>12가지 기본원리</p>
<blockquote>
<ul>
<li>짝 프로그래밍(Pair Programming)
: 개발자 둘이서 짝으로 코딩하는 원리</li>
<li>공동 코드 소유(Collective Ownership)
: 시스템에 있는 코드는 누구든지 언제라도 수정 가능하다는 원리</li>
<li>지속적인 통합(CI / Continuous Integration)
: 매일 여러 번씩 소프트웨어를 통합하고 빌드해야 한다는 원리</li>
<li>계획 세우기(Planning Process)
: 고객이 요구하는 비즈니스 가치를 정의하고 개발자가 필요한 것은 무엇이며 어떤 부분에서 지연될 수 있는지를 알려주어야 한다는 원리</li>
<li>작은 릴리즈(Small Release)
: 작은 시스템을 먼저 만들고 짧은 단위로 업데이트한다는 원리</li>
<li>메타포어(Metaphor)
: 공통적인 이름 체계와 시스템 서술서를 통해 고객과 개발자 간의 의사소통을 원활하게 한다는 원리</li>
<li>간단한 디자인(Simple Design)
: 현재의 요구사항에 적합한 가장 단순한 시스템을 설계한다는 원리</li>
<li>테스트 기반 개발(TDD / Test Driven Development)
: 작성해야 하는 프로그램에 대한 테스트를 먼저 수행하고 이 테스트를 통과할 수 있도록 실제 프로그램의 코드를 작성한다는 원리</li>
<li>리팩토링(Refactoring)
: 프로그램의 기능을 바꾸지 않으면서 중복제거, 단순화 등을 위해 시스템 재구성한다는 원리</li>
<li>40시간 작업(40-Hour Work)
: 개발자가 피곤으로 인해 실수하지 않도록 일주일에 40시간이상을 일하지 말아야 한다는 원리</li>
<li>고객 상주(On Site Customer)
: 개발자들의 질문에 즉각 대답해 줄 수 있는 고객을 프로젝트에 풀타임으로 상주시켜야 한다는 원리</li>
<li>코드 표준(Coding Standard)
: 효과적인 공동 작업을 위해서는 모든 코드에 대한 코딩 표준을 정의해야 한다는 원리</li>
</ul>
</blockquote>
</li>
</ul>
<p><strong>2. 스크럼(SCRUM)</strong>
: 매일 정해진 시간, 장소에서 짧은 시간의 개발을 하는 팀을 위한 프로젝트 관리 중심 방법론</p>
<ul>
<li>개념<blockquote>
<ul>
<li>백로그(Backlog) 
: 제품과 프로젝트에 대한 요구사항</li>
<li>스프린트(Sprint) 
: 2~4주의 짧은 개발 기간으로 반복적 수행으로 개발품질 향상</li>
<li>스크럼 미팅(Scrum Meeting / 데일리 미팅) 
: 매일 15분 정도 미팅으로 To-Do List 계획수립</li>
<li>스크럼 마스터(Scrum Master) 
: 프로젝트 리더, 스크럼 수행 시 문제를 인지 및 해결하는 사람</li>
<li>스프린트 회고(Sprint Retrospective) 
: 스프린트 주기를 되돌아보며 정해놓은 규칙 준수 여부, 개선점 등을 확인 및 기록</li>
</ul>
</blockquote>
<ul>
<li>해당 스프린트가 끝난 시점이나 일정 주기로 시행<blockquote>
<ul>
<li>번 다운 차트(Burn Down Chart)
: 남아있는 백로그 대비 시간을 그래픽적으로 표현한 차트</li>
</ul>
</blockquote>
<ul>
<li>백로그는 보통 수직축에 위치하며 시간은 수평축에 위치</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>3. 린(LEAN)</strong>
: 도요타의 린 시스템 품질기법을 소프트웨어 개발 프로세스에 적용해서 낭비 요소를 제거하여 품질을 향상시킨 방법론</p>
<ul>
<li>JIT(Just In Time), 칸반(Kanban)보드 사용</li>
<li>7가지 원칙
: 낭비제거, 품질 내재화, 지식 창출, 늦은 확정, 빠른 인도, 사람 존중, 전체 최적화</li>
</ul>
<h4 id="span-style--backgrounddee2e6-애자일-vs-전통적-span"><span style = 'background:#dee2e6'> 애자일 VS 전통적 </span></h4>
<table>
<thead>
<tr>
<th><strong>비교대상</strong></th>
<th><strong>애자일</strong></th>
<th><strong>전통적</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>계획수립</strong></td>
<td>유동적 범위 설정</td>
<td>확정적 범위 설정</td>
</tr>
<tr>
<td><strong>업무수행</strong></td>
<td>팀 중심 업무 수행</td>
<td>관리자 주도적 명령과 통제<br>개인 단위로 업무 수행</td>
</tr>
<tr>
<td><strong>개발/검증</strong></td>
<td>반복 주기 단위로 소프트웨어를 개발/검증</td>
<td>순차적으로 수행</td>
</tr>
<tr>
<td><strong>팀관리</strong></td>
<td>업무 몰입, 팀 평가</td>
<td>경쟁, 개별 평가</td>
</tr>
<tr>
<td><strong>문서화</strong></td>
<td>문서화보다는 코드를 강조</td>
<td>상세한 문서화를 강조</td>
</tr>
<tr>
<td><strong>성공요소</strong></td>
<td>고객 가치 전달</td>
<td>계획/일정 준수</td>
</tr>
<tr>
<td><strong>유형</strong></td>
<td>XP, 스크럼, 린</td>
<td>폭포구, 프로토타입, 나선형</td>
</tr>
</tbody></table>
<h3 id="📍-제품-계열-방법론product-line-development">📍 제품 계열 방법론(Product Line Development)</h3>
<ul>
<li>특정 제품에 적용하고 싶은 공통된 기능을 정의하여 개발하는 방법론</li>
<li>임베디드 소프트웨어를 작성하는 데 유용한 방법론</li>
</ul>
<table>
<thead>
<tr>
<th><strong>영역 공학</strong></th>
<th><strong>응용 공학</strong></th>
</tr>
</thead>
<tbody><tr>
<td>영역 분석, 영역 설계, 핵심 자산을 구현하는 영역</td>
<td>제품 요구분석, 제품 설계, 제품을 구현하는 영역</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[정처기 실기 준비]]></title>
            <link>https://velog.io/@yejin_823/%EC%A0%95%EC%B2%98%EA%B8%B0-%EC%8B%A4%EA%B8%B0-%EC%A4%80%EB%B9%84</link>
            <guid>https://velog.io/@yejin_823/%EC%A0%95%EC%B2%98%EA%B8%B0-%EC%8B%A4%EA%B8%B0-%EC%A4%80%EB%B9%84</guid>
            <pubDate>Mon, 15 Apr 2024 14:17:24 GMT</pubDate>
            <description><![CDATA[<h1 id="애플리케이션-테스트-케이스-설계">애플리케이션 테스트 케이스 설계</h1>
<h2 id="1-애플리케이션-테스트-케이스-작성">1. 애플리케이션 테스트 케이스 작성</h2>
<h3 id="1-소프트웨어-테스트의-이해">(1) 소프트웨어 테스트의 이해</h3>
<h4 id="소프트웨어-테스트란">소프트웨어 테스트란?</h4>
<blockquote>
<p>** 개발된 응용 애플리케이션이나 시스템이 사용자가 요구하는 기능과 성능, 사용성, 안정성 등을 만족하는지 확인하고 노출되지 않은 숨어있는 소프트웨어의 결함을 찾아내는 활동 **</p>
</blockquote>
<h4 id="필요성">필요성</h4>
<ol>
<li>오류 발견 관점
 : 프로그램에 잠재된 오류를 발견하고 이를 수정하여 올바른 프로그램을 개발하기 위해 필요</li>
<li>오류 예방 관점
 : 프로그램 실행 전에 동료 검토, 워크 스루, 인스펙션 등을 통해 오류를 사전에 발견하는 예방 차원의 필요</li>
<li>품질 향상 관점
 : 사용자의 요구사항 및 기대 수준을 만족하도록 반복적인 테스트를 거쳐 제품의 신뢰도를 향상하는 품질 보증을 위해 필요</li>
</ol>
<h4 id="소프트웨어-테스트-원리-span-stylecolorgreen결-완-초-집-살-정-오span">소프트웨어 테스트 원리 <span style="color:green">[결 완 초 집 살 정 오]</span></h4>
<ol>
<li>결합 존재 증명</li>
</ol>
<ul>
<li>결함이 존재함을 밝히는 활동</li>
<li>결함이 없다는 것을 증명할 수는 없음</li>
<li>결함을 줄이는 활동</li>
</ul>
<ol start="2">
<li>완벽 테스팅은 불가능</li>
</ol>
<ul>
<li>완벽하게 테스팅하려는 시도는 불필요한 시간과 자원낭비</li>
<li>무한 경로(한 프로그램 내의 내부 조건은 무수히 많을 수 있음), 무한 입력값(입력이 가질 수 있는 모든 값의 조합이 무수히 많음)으로 인한 테스트 어려움</li>
</ul>
<ol start="3">
<li>초기 집중</li>
</ol>
<ul>
<li>조기 테스트 설계 시 장점 : 테스팅 결과를 단시간에 알 수 있고, 테스팅 기간 단축, 재작업을 줄여 개발 기간 단축 및 결함 예방</li>
<li>SW개발 초기 체계적인 분석 및 설계가 수행되지 못하면 그 결과가 프로젝트 후반에 영향을 미치게 되어 비용이 커진다는 요르돈의 법칙 적용</li>
</ul>
<ol start="4">
<li>결함 집중</li>
</ol>
<ul>
<li>적은 수의 모듈에서 대다수의 결함이 발견됨</li>
<li>소프트웨어 테스트에서 오류의 80%는 전체 모듈의 20% 내에서 발견</li>
<li>파레토 법칙의 내용은 80:20 법칙 적용</li>
</ul>
<ol start="5">
<li><strong>살충제 페러독스</strong></li>
</ol>
<ul>
<li>동일한 테스트 케이스에 의한 반복적 테스트는 새로운 버그를 찾지 못함</li>
<li>테스트 케이스의 정기적 리뷰와 개선 및 다른 시각에서의 접근이 필요</li>
</ul>
<ol start="6">
<li>정황 의존성</li>
</ol>
<ul>
<li>소프트웨어의 성격에 맞게 테스트 실시</li>
<li>정황과 비즈니스 도메인에 따라 테스트를 다르게 수행</li>
</ul>
<ol start="7">
<li>오류-부재의 궤변</li>
</ol>
<ul>
<li>요구사항을 충족시켜주지 못한다면, 결함이 없다고 해도 품질이 높다고 볼 수 없음</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="데이터-마이닝">데이터 마이닝</h1>
<blockquote>
<ul>
<li>대규모로 저장된 데이터 안에서 체계적이고 자동적으로 통계적 규칙이나 패턴을 찾아내는 기술</li>
</ul>
</blockquote>
<ul>
<li>대규모 데이터에서 의미 있는 패턴을 파악하거나 예측하여 의사결정에 활용하는 기법</li>
<li>데이터의 숨겨진 정보를 찾아내어 이를 기반으로 서비스와 제품에 도입하는 과정</li>
<li>통계분석은 가설이나 가정에 따른 분석, 검증을 하지만 데이터 마이닝은 수리 알고리즘을 활용하여 대규모 데이터에서 의미 있는 정보를 찾아낸다.</li>
<li><strong>텍스트 마이닝, 웹 마이닝</strong> 과 함계 다양한 분야에서 활용</li>
</ul>
<h2 id="데이터-마이닝-절차">데이터 마이닝 절차</h2>
<ol>
<li>목적 설정<ul>
<li>데이터 마이닝을 통해 얻고자 하는 명확한 목적 설정</li>
<li>목적에 따라 사용할 모델과 필요 데이터 정의</li>
</ul>
</li>
<li>데이터 준비<ul>
<li>거래정보, 웹로그 데이터, 고객 정보, 데이터 사용량, 소셜 데이터 등 다양한 데이터 활용</li>
<li>사전에 운영 데이터 접근에 따른 부하 고려</li>
<li>필요시 작업 서버에 저장하여 운영에 지장이 없도록 데이터 준비</li>
<li>데이터 정제를 통해 데이터의 품질을 보장하고 필요시 데이터 추가등을 통해 충분한 양의 데이터 확보</li>
</ul>
</li>
<li>가공<ul>
<li>모델링 목적에 따라 목적 변수 정의</li>
<li>필요한 데이터를 데이터 마이닝 소프트웨어에 적용할 수 있는 형식으로 가공 처리</li>
</ul>
</li>
<li>마이닝 기법 적용<ul>
<li>1단계의 명확한 목적에 맞도록 데이터 마이닝 기법을 적용하여 정보 추출</li>
</ul>
</li>
<li>정보 검증<ul>
<li>데이터 마이닝으로 추출된 정보 검증</li>
<li>테스트 데이터와 과거 데이터를 활용하여 최적의 모델 산정</li>
<li>데이터 마이닝 결과의 업무 적용 보고서 작성 및 활용</li>
</ul>
</li>
</ol>
<h2 id="데이터-마이닝-주요-기법">데이터 마이닝 주요 기법</h2>
<h3 id="분류-규칙">분류 규칙</h3>
<p>: 과거 데이터로부터 특성을 찾아내어 분류모형을 만들어 이를 토대로 새로운 레코드의 결과 값을 예측하는 기법</p>
<ul>
<li>마케팅, 고객 신용평가 모형에 활용
<span style="color:green">ex) 우수 소객의 분류 모형 구축으로 마케팅 활용 </span><h3 id="연관-규칙">연관 규칙</h3>
: 데이터 안에 존재하는 항목들 간의 종속관계를 찾아내는 기법</li>
<li>제품이나 서비스의 교차판매, 매장 진열, 사기 적발 등 다양한 분야에서 활동
<span style="color:green">ex) 넥타이 구매고객의 절반이상이 셔츠를 구매한다는 정보 분석을 통해 상품진열 </span><h3 id="연속-규칙">연속 규칙</h3>
: 연관 규칙에 시간 관련 정보가 포함된 형태의 기법</li>
<li>개인별 트랜잭션 이력 데이터를 시계열적으로 분석하여 트랜잭션의 향후 발생 가능성 예측
<span style="color:green">ex) A 품목을 구매한 회원이 B 품목을 구매할 확률은 75% </span><h3 id="데이터-군집화">데이터 군집화</h3>
: 정보가 없는 상태에서 데이터를 분류하는 기법</li>
<li>대상 레코드들을 유사한 특성을 지닌 몇 개의 소그룹으로 분할하는 작업으로 작업의 특성이 분류규칙과 유사</li>
<li>분석대상에 결괏값이 없으며, 판촉활동이나 이벤트 대상을 선정하는 데 활용
<span style="color:green">ex) 고객의 지역/연령/성별에 따른 차벼롸 홍보전략 </span></li>
</ul>
<p><br></br></p>
<hr>
<h1 id="프로토콜">프로토콜</h1>
<blockquote>
<ul>
<li>서로 다른 시스템이나 기기들 간의 데이터 교환을 원활히 하기위한 표준화된 통신규약</li>
</ul>
</blockquote>
<ul>
<li>톰 마릴은 컴퓨터가 메시지를 전달하고, 메시지가 제대로 도착했는지 확인하며, 도착하지 않았을 경우 메시지를 재전송하는 일련의 방법을 &#39;기술적 은어&#39;를 뜻하는 <strong>프로토콜</strong>이라고 정의</li>
</ul>
<h2 id="일반적인-기능">일반적인 기능</h2>
<ul>
<li>데이터 처리 기능</li>
<li>제어기능</li>
<li>관리적 기능</li>
</ul>
<h2 id="기본-3요소">기본 3요소</h2>
<ol>
<li>구문 (Syntax)
: 시스템 간의 정보 전송을 위한 데이터 형식, 코딩, 신호 레벨 등의 규정</li>
<li>의미 (Semantic)
: 시스템 간의 정보 전송을 위한 제어 정보로 조정과 에러 처리를 위한 규정</li>
<li>타이밍 (Timing)
: 시스템 간의 정보 전송을 위한 속도 조절과 순서 관리 규정</li>
</ol>
<p><br></br></p>
<hr>
<h1 id="인터페이스-기능-구현-기술">인터페이스 기능 구현 기술</h1>
<h2 id="json">JSON</h2>
<blockquote>
<p><strong>&quot;속성-값 쌍</strong>&quot;또는 <strong>&quot;키-값 쌍&quot;</strong> 으로 이루어진 데이터 오브젝트를 전달하기 위해 인간이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포멧</p>
</blockquote>
<ul>
<li>AJAX에서 많이 사용되고 XML을 대체하는 주요 데이터 포맷</li>
<li>언어 독립형 데이터 포맷으로 다양한 데이터 프로그래밍 언어에서 사용됨</li>
<li>사람이 읽고 쓰기에 용이하며 기계가 분석하고 생성하기에 용이함</li>
</ul>
<h3 id="장점">장점</h3>
<ul>
<li>XML보다 가볍고 빠름</li>
<li>자료 종류에 큰 제한이 없음</li>
<li>Javascript코드 안에서 객체 접근이 쉬움</li>
</ul>
<h2 id="xml">XML</h2>
<blockquote>
<p>HTML의 단점을 보완한 인터넷 언어로, SGML의 복잡한 단접을 개선한 특수한 목적을 갖는 마크업 언어</p>
</blockquote>
<ul>
<li>송/수신 시스템 간 데이터 연계의 편의성을 위해서 전송되는 데이터 구조를 동일한 형태로 정의</li>
<li>인간과 기계가 모두 이해할 수 있는 텍스트 형태로 마크업 포맷을 정의하기 위한 메타언어</li>
<li>사용자가 직접 문서의 태그를 정의할 수 있으며 다른 사용자가 정의한 태그를 사용할 수 있음</li>
</ul>
<h2 id="ajax">AJAX</h2>
<blockquote>
<p>자바스크립트를 사용하여 웹 서버와 클라이언트 간 <strong>비동기적</strong> 으로 XML데이터를 교환하고 조작하기 위한 웹 기술</p>
</blockquote>
<ul>
<li>브라우저가 가지고 있는 XMLHttpRequest객체를 이용해서 전체 페이지를 새로 로드하지 않고 필요한 일부 페이지의 데이터만을 로드하는 기법</li>
<li>HTML만으로는 어려운 다양한 작업을 웹 페이지에서 구현해서 이용자가 웹 페이지와 자유롭게 상호 작용할 수 있도록 구현하는 기법</li>
</ul>
<h3 id="주요-기술">주요 기술</h3>
<ul>
<li>XMLHttpRequest
: 비동기 통신을 담당하는 자바스크립트 객체</li>
<li>JavaScript
: 객체 기반의 스크립트 프로그래밍 언어</li>
<li>XML
: HTML의 단점을 보완한 인터넷 언어</li>
<li>DOM
: XML문서를 트리 구조의 형태로 접근할 수 있게 해주는 API</li>
<li>XSLT
: XML문서를 다른 XML 문서로 변환하는데 사용하는 XML기반 언어</li>
<li>HTML
: WWW문서를 표현하는 표준화된 마크업 언어</li>
<li>CSS
: 마크업 언어가 실제 표시되는 방법을 기술하는 언어</li>
</ul>
<h2 id="rest">REST</h2>
<blockquote>
<p>웹과 같은 분산 하이퍼미디어 환경에서 자원의 존재/상태 정보를 표준화된 HTTP 메서드로 주고받는 웹 아키텍처</p>
</blockquote>
<ul>
<li>리소스(자원), 메서드(처리), 메시지 3가지 요소로 구성</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="프로세스-스케줄링">프로세스 스케줄링</h1>
<blockquote>
<p>CPU를 사용하려고 하는 프로세스들 사이의 우선순위를 관리하는 작업</p>
</blockquote>
<ul>
<li>처리율과 CPU이용률을 증가시키고 오버헤드, 응답시간, 반환시간, 대기시간을 최소화시키기 위한 기법</li>
<li>특정 프로세스가 적합하게 실행되도록 프로세스 스케줄링에 의해 프로세스 사이에서 CPU 교체가 일어남</li>
</ul>
<h2 id="주요-용어">주요 용어</h2>
<h3 id="서비스-시간">서비스 시간</h3>
<p>: 프로세스가 결과를 산출하기까지 소요되는 시간</p>
<h3 id="응답시간-response-time">응답시간 (Response Time)</h3>
<p>: 프로세스들이 입력되어 서비스를 요청하고, 반응하기 시작할 때까지 소요되는 시간</p>
<h3 id="반환시간-turnaround-time">반환시간 (Turnaround Time)</h3>
<p>: 프로세스들이 입력되어 수행하고 결과를 산출하기까지 소요되는 시간
<code>반환시간 = 대기시간 + 수행시간</code></p>
<h3 id="대기시간">대기시간</h3>
<p>: 프로세스가 프로세서에서 할당되기까지 큐에 대기하는 시간</p>
<ul>
<li>프로세스가 도착 즉시 프로세서에 할당되면 대기시간은 &#39;0&#39;이 됨<h3 id="평균-대기시간">평균 대기시간</h3>
: 프로세스가 대기 큐에서 대기하는 평균 시간</li>
<li>대기시간이 &#39;0&#39;인 프로세스도 평균 대기시간에 합산하여 결과 도출<h3 id="종료시간">종료시간</h3>
: 요구되는 Processing Time을 모두 수행하고 종료된 시간<h3 id="시간-할당량-time-quantum-or-time-slice">시간 할당량 (Time Quantum or Time Slice)</h3>
: 한 프로세스가 프로세서를 독점하는 것을 방지하기 위해 서비스되는 시간할당량<h3 id="응답량">응답량</h3>
<code>(대기시간 + 서비스 시간) / 서비스 기간</code></li>
<li>HRN(Highest Responce ratio Next) 스케줄링에서 사용</li>
<li>HRN 스케줄에서 응답률이 높으면 우선순위가 높다고 판단</li>
</ul>
<p><br></br></p>
<h2 id="선점형-스케줄링-preemptive-scheduling">선점형 스케줄링 (Preemptive Scheduling)</h2>
<p>: 하나의 프로세스가 CPU를 차지하고 있을 떄, 우선순위가 높은 다른 프로세스가 현재 프로세스를 중단시키고 CPU를 점유하는 스케줄링 방식</p>
<table>
<thead>
<tr>
<th><strong>장점</strong></th>
<th><strong>단점</strong></th>
</tr>
</thead>
<tbody><tr>
<td>- 비교적 빠른 응답 <br> - 대화식 시분할 시스템에 적합</td>
<td>- 높은 우선수위 프로세스들이 들어오는 경우 오버헤드 초래</td>
</tr>
</tbody></table>
<ul>
<li>실시간 응답 환경 , Deadline응답 환경에서 활용<h3 id="라운드-로빈-rr--round-robin">라운드 로빈 (RR / Round Robin)</h3>
</li>
</ul>
<ol>
<li>프로세스는 같은 크기의 CPU시간을 할당 (시간 할당량)</li>
<li>프로세스가 할당된 시간 내에 처리 완료를 못하면 준비 큐 리스트의 가장 뒤로</li>
<li>CPU는 대기 중인 다음 프로세스로 넘어간다.</li>
</ol>
<ul>
<li>균등한 CPU 점유시간</li>
<li><strong>시분할 시스템</strong>을 사용</li>
</ul>
<h3 id="srt-shortest-remaining-time-first">SRT (Shortest Remaining Time First)</h3>
<ol>
<li>가장 짧은 시간이 소요되는 프로세스를 먼저 수행</li>
<li>남은 처리시간이 더 짧다고 판단되는 프로세스가 준비 큐에 생기면 언제라도 프로세스가 선점</li>
</ol>
<ul>
<li>비선점 방식의 스케줄링 기법에 선점방식을 도입한 기법</li>
<li>짧은 수행 시간 프로세스를 우선 수행</li>
</ul>
<h3 id="다단계-큐-mlq--multi-level-queue">다단계 큐 (MLQ / Multi Level Queue)</h3>
<ol>
<li>작업들을 여러 종류 그룹으로 분할</li>
<li>여러 개의 큐를 이용하여 상위단계 작업에 의한 하위단계 작업이 선점</li>
</ol>
<ul>
<li>각 큐는 자신만의 독자적인 스케줄링을 가짐 (독립된 스케줄링 큐)</li>
</ul>
<h3 id="다단계-피드백-큐-mlfq--multi-level-feedback-queue">다단계 피드백 큐 (MLFQ / Multi Level Feedback Queue)</h3>
<ol>
<li>새로운 프로세스는 높은 우선순위, 프로세스의 실행시간이 길어질수록 점점 낮은 우선순위 큐로 이동</li>
<li>라운드 로빈 방식을 적용</li>
</ol>
<ul>
<li>FCFS(FIFO) + 라운드 로빈 기법</li>
<li>입출력 위주와 CPU위주인 프로세스의 특성에 따라 큐마다 서로 다른 CPU 시간 할당량을 부여</li>
<li>마지막 단계는 RR처리</li>
</ul>
<p><br></br></p>
<h2 id="비선점형-스케줄링-non-preemptive-scheduling">비선점형 스케줄링 (Non Preemptive Scheduling)</h2>
<p>: 한 프로세스가 CPU를 할당받으면 작업 종료 후 CPU 반환 시까지 다른 프로세스는 CPU 점유가 불가능한 스케줄링 방식</p>
<table>
<thead>
<tr>
<th><strong>장점</strong></th>
<th><strong>단점</strong></th>
</tr>
</thead>
<tbody><tr>
<td>- 응답시간 예상이 용이 <br> - 모든 프로세스에 대한 요구를 공정하게 처리</td>
<td>- 짧은 작업을 수행하는 프로세스가 긴 작업 종료 시까지 대기</td>
</tr>
<tr>
<td>- 처리시간 편차가 적은 특정 프로세스 환경에서 활용</td>
<td></td>
</tr>
</tbody></table>
<h3 id="우선순위-priority">우선순위 (Priority)</h3>
<ul>
<li>프로세스별로 우선순위가 주어지고 우선순위에 따라 CPU를 할당하는 스케줄링 기법</li>
<li>동일 순위는 FCFS(FIFO)</li>
<li>주요 / 긴급 프로세스에 대한 우선 처리</li>
<li>설정, 자원 상황 등에 따른 우선순위 선정</li>
</ul>
<h3 id="기한부-deadline">기한부 (Deadline)</h3>
<ul>
<li>작업들이 명시된 시간이나 기한 내에 완료되도록 계획하는 스케줄링 기법</li>
<li>요청에 명시된 시간 내 처리를 보장</li>
</ul>
<h3 id="fcfs-first-come-first-service--fifo">FCFS (First Come First Service) / FIFO</h3>
<ul>
<li>프로세스가 대기 큐에 도착한 순서에 따라 CPU를 할당하는 스케줄링 기법</li>
</ul>
<h3 id="sjf-shortest-job-first">SJF (Shortest Job First)</h3>
<ul>
<li>프로세스가 도착하는 시점에 따라 그 당시 가장 작은 서비스 시간을 갖는 프로세스가 종료 시까지 자원을 점유하는 스케줄링 기법</li>
<li>준비 큐 작업 중 가장 짧은 작업부터 수행, 평균 대기 시간 최고</li>
<li>CPU 요구 시간이 긴 작업과 짧은 작업 간의 불평등이 심하여 CPU 요구시간이 긴 프로세스는 기아 현상 발생</li>
</ul>
<h3 id="hrn-highest-response-ration-next">HRN (Highest Response Ration Next)</h3>
<ul>
<li>대기 중인 프로세스 중 현재 응답률이 가장 높은 것을 선택하는 스케줄링 기법</li>
<li>SJF의 약점인 기아 현상을 보완한 기법으로 긴 작업과 짧은 작업 간의 불평등 완화
<code>HRN의 우선순위 = (대기시간 + 서비스 시간 ) / 서비스 시간</code> 
<br></br></li>
</ul>
<hr>
<h1 id="ddl-데이터-정의어">DDL (데이터 정의어)</h1>
<blockquote>
<p>테이블과 같은 데이터 구조를 정의하는 데 사용되는 명령어들로 특정 구조를 생성, 변경, 삭제, 이름을 바꾸는 데이터 구조와 관련된 명령어들</p>
</blockquote>
<h2 id="대상">대상</h2>
<h3 id="도메인">도메인</h3>
<p>: 하나의 속성이 가질 수 있는 원자값들의 집합</p>
<ul>
<li>속성의 데이터 타입과 크기, 제약조건 등의 정보<h3 id="스키마">스키마</h3>
: 데이터베이스의 구조, 제약조건 등의 정보를 담고 있는 기본적인 구조</li>
<li>외부 스키마, 개념 스키마, 내부 스키마<h3 id="테이블">테이블</h3>
: 데이터 저장 공간<h3 id="뷰">뷰</h3>
: 하나 이상의 물리 테이블에서 유도되는 가상의 테이블<h3 id="인덱스">인덱스</h3>
: 검색을 빠르게 하기 위한 데이터 구조</li>
<li>테이블에 대한 조회 속도를 높여 주는 자료 구소</li>
<li>체이블의 특정 레코드 위치를 알려 주는 용도로 사용
<br></br></li>
</ul>
<hr>
<h1 id="where절-조건">WHERE절 조건</h1>
<h2 id="비교">비교</h2>
<ul>
<li>=
: 값이 같은 경우 조회</li>
<li>&lt;&gt;, !=
: 값이 다른 경우 조회</li>
<li>&lt;, &lt;=, &gt;, &gt;=
: 비교 연산에 해당하는 데이터 조회<h2 id="범위">범위</h2>
</li>
<li>BETWEEN
: <code>칼럼 BETWEEN 값1 AND 값2</code> 에서 값1보다 크거나 같고, 값2보다 작거나 같은 데이터 조회<h2 id="집합">집합</h2>
</li>
<li>IN
: <code>칼럼 IN (값1, 값2 ..)</code> 에서 칼럼이 IN 안에 포함된 경우의 데이터 조회</li>
<li>NOT IN
: <code>칼럼 NOT IN (값1, 값2 ..)</code> 에서 칼럼이 IN 안에 포함되어 있지 않은 경우의 데이터 조회<h2 id="패턴">패턴</h2>
</li>
<li>LIKE
: <code>칼럼 LIKE 패턴</code> 에서 칼럼이 패턴에 포함된 경우의 데이터 조회</li>
</ul>
<table>
<thead>
<tr>
<th><strong>패턴</strong></th>
<th><strong>설명</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>%</strong></td>
<td>0개 이상의 문자열과 일치</td>
</tr>
<tr>
<td><strong>[ ]</strong></td>
<td>1개의 문자와 일치</td>
</tr>
<tr>
<td><strong>[^]</strong></td>
<td>1개의 문자와 불일치</td>
</tr>
<tr>
<td><strong>_</strong></td>
<td>특정 위치의 1개의 문자와 일치</td>
</tr>
<tr>
<td>## NULL</td>
<td></td>
</tr>
<tr>
<td>- IS NULL</td>
<td></td>
</tr>
<tr>
<td>: <code>IS NULL</code> 에서 컬럼이 NULL인 데이터 조회</td>
<td></td>
</tr>
<tr>
<td>- IS NOT NULL</td>
<td></td>
</tr>
<tr>
<td>: <code>IS NOT NULL</code> 에서 컬럼이 NULL이 아닌 데이터 조회</td>
<td></td>
</tr>
<tr>
<td>## 복합조건</td>
<td></td>
</tr>
<tr>
<td>- AND</td>
<td></td>
</tr>
<tr>
<td>: 2조건 모두를 반족하는 데이터 조회</td>
<td></td>
</tr>
<tr>
<td>- OR</td>
<td></td>
</tr>
<tr>
<td>: 2 조건 중 하나를 만족하는 데이터 조회</td>
<td></td>
</tr>
<tr>
<td>- NOT</td>
<td></td>
</tr>
<tr>
<td>: 조건에 해당하지 않는 데이터 조회</td>
<td></td>
</tr>
<tr>
<td><br></br></td>
<td></td>
</tr>
</tbody></table>
<hr>
<h1 id="트랜잭션">트랜잭션</h1>
<blockquote>
<p>인가받지 않은 사용자로부터 데이터를 보장하기 위해 DBMS가 가져야 하는 특성이자 데이터베이스 시스템에서 하나의 논리적 기능을 정상적으로 수행하기 위한 작업의 기본 단위</p>
</blockquote>
<h2 id="특성">특성</h2>
<h3 id="원자성-atomicity">원자성 (Atomicity)</h3>
<p>: 트랜잭셩을 구성하는 연산 전체가 모두 정상적으로 실행되거나 모두 취소되어야 하는 성질</p>
<ul>
<li>트랜잭션의 연산 전체가 성공 또는 실패 (All or North-ing)되어야 하는 성질</li>
<li>Commit / ROllback</li>
<li>회복성 보장</li>
</ul>
<h3 id="일관성-consistency">일관성 (Consistency)</h3>
<p>: 시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 수행 완료 후의 상태가 같아야 하는 성질</p>
<ul>
<li>무결성 제약조건</li>
<li>동시성 제어</li>
</ul>
<h3 id="격리성고립성-isolation">격리성=고립성 (Isolation)</h3>
<p>: 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않아야 한다는 성질</p>
<ul>
<li>데이터베이스의 고립화 수준<ul>
<li>Read Uncommitted</li>
<li>Read Cpmmitted<ul>
<li>Repeatable Read</li>
<li>Serializable Read</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="영속성-durability">영속성 (Durability)</h3>
<p>: 성공이 완료된 트랜잭션의 결과는 영속적으로 데이터베이스에 저장되어야 하는 성질</p>
<ul>
<li>회복기법</li>
</ul>
<p><br></br></p>
<h2 id="트랜잭션의-상태-변화">트랜잭션의 상태 변화</h2>
<ol>
<li><p>활동 상태 (Active)
: 초기 상태, 트랜잭션이 실행 중일 때 가지는 상태</p>
</li>
<li><p>부분 완료 상태 (Partially Committed)
: 마지막 명령문이 실행된 후에 가지는 상태</p>
</li>
<li><p>완료 상태 (Committed)
: 트랜잭션이 성공적으로 완료된 후 가지는 상태</p>
</li>
<li><p>실패 상태 (Failed)
: 정상적인 실행이 더 이상 진행될 수 없을 때 가지는 상태</p>
</li>
<li><p>철회 상태 (Aborted)
: 트랜잭션이 취소되고 데이터베이스가 트랜잭션 시작 전 상태로 환원된 상태</p>
</li>
</ol>
<p><br></br></p>
<h2 id="tcl-트랜잭션-제어언어">TCL (트랜잭션 제어언어)</h2>
<h3 id="commit">COMMIT</h3>
<p>: 트랜잭션을 메모리에 영구적으로 저장하는 명령어</p>
<h3 id="rollback">ROLLBACK</h3>
<p>: 트랜잭션 내역을 저장 무효화시키는 명령어</p>
<h3 id="checkpoint">CHECKPOINT</h3>
<p>: ROLLBCK을 위한 시점을 지정하는 명령어</p>
<p><br></br></p>
<hr>
<h1 id="병행-제어">병행 제어</h1>
<blockquote>
<p>다수 사용자 환경에서 여러 트랜잭션을 수행할 때 데이터베이스 일관성 유지를 위해 상호 작용을 제어하는 기법</p>
</blockquote>
<h2 id="병행-제어-기법의-종류">병행 제어 기법의 종류</h2>
<h3 id="로킹">로킹</h3>
<p>: 하나의 트랜잭션을 실행하는 동안 특정 데이터 항목에 대해서 다른 트랜잭션이 동시에 접근하지 목하도록 상호배제기능을 제공</p>
<ul>
<li>데이터베이스, 파일, 레코드는 로킹 단위가 된다.</li>
<li>로킹 단위가 작아지면 데이터베이스 공유도와 로킹 오버헤드 증가<h3 id="낙관적-검증">낙관적 검증</h3>
: 트랜잭션이 어떠한 검증도 수행하지 않고 일단 트랜잭션을 수행하고 트랜잭션 종료 시 검증을 수행하여 데이터베이스에 반영하는 기법<h3 id="타임-스탬프-순서">타임 스탬프 순서</h3>
: 트랜잭션과 트랜잭션이 읽거나 갱신한 데이터에 대해 트래잭션이 실행을 시작하기 전에 타임스탬프를 부여하여 부여된 시간에 따라 트랜잭션 작업을 수행하는 기법<h3 id="다중버전-동시성-제어">다중버전 동시성 제어</h3>
: 트랜잭션의 타임스탬프와 접근하려는 데이터의 타임스탬프를 비교하여 직렬가능성이 보장되는 적절한 버전을 선택하여 접근하도록 하는 기법</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="회복-기법">회복 기법</h1>
<blockquote>
<p>트랜잭션을 수행하는 도중 장애로 인해 손상된 데이터베이스를 손상되기 이전의 정상적인 상태로 복구시키는 작업</p>
</blockquote>
<h2 id="회복-기법-종류">회복 기법 종류</h2>
<h3 id="redo">REDO</h3>
<p>: 데이터베이스가 비정상적으로 종료되었을 때 디스크에 저장된 로그를 분석하여 트랜잭셔의 시작와 Commit에 대한 기록이 있는 트랜잭션들의 작업을 재작업하는 기법</p>
<ul>
<li>데이터베이스 내용 자체가 손상된 경우 가장 최근의 복제본을 적제한 후 이후 일어난 변경만을 로그를 이용하여 재실행함으로써 데이터베이스를 복원하는 기법<h3 id="undo">UNDO</h3>
: 데이터베이스가 비정상적으로 종료되었을 때 디스크에 저장된 로그를 분석하여 트랜잭션의 시작은 있지만 Commit기록이 없는 트랜잭션들이 작업한 변경 내용들을 모두 취소하는 기법</li>
<li>데이터베이스 내용 자체는 손상되지 않았지만 변경 중이거나 변경된 내용에 대한 신뢰성을 잃어버린 경우 모든 변경 내용을 취소하여 복원하는 기법
<br></br></li>
</ul>
<hr>
<h1 id="dos공격">DoS공격</h1>
<blockquote>
<ul>
<li>시스템을 악의적으로 공격해서 해당 시스템의 자원을 부족하게 하여 원래 의도된 용도로 사용하지 못하게 하는 공격</li>
</ul>
</blockquote>
<ul>
<li>특정 서버에게 수많은 접속 시도를 만들어 다른 이용자가 정상적으로 서비스 이용을 하지 못하게 하거나 서버의 TCP 연결을 소진시키는 등의 공격</li>
<li>1대의 공격자 컴퓨터에서 타킷 시스템에 악성 패킷을 보내는 방식으로 공격</li>
</ul>
<h2 id="종류">종류</h2>
<h3 id="syn-플러딩-syn-flooding">SYN 플러딩 (SYN Flooding)</h3>
<ul>
<li>TCP 프로토콜의 구조적인 문제를 이용한 공격</li>
<li>서버의 동시 가용 사용자 수를 SYN패킷만 보내 점유하여 다른 사용자가 서버를 사용 불가능하게 하는 공격</li>
<li>공격자는 ACK를 발송하지 않고 계속 새로운 연결 요청을 하게 되어 서버는 자원할당을 해지하지 않고 자원만 소비하여 고갈됨<h3 id="udp-플러딩-udp-flooding">UDP 플러딩 (UDP Flooding)</h3>
</li>
<li>대량의 UDP패킷을 만들어 임의의 포트 번호로 전송하여 응답 메시지(ICMP)를 생성하게 하여 지속해서 자원을 고갈시키는 공격</li>
<li>ICMP 패킷은 변조되어 공격자에게 전달되지 않아 대기함<h3 id="스머프-smurf--스머핑-smurfing">스머프 (Smurf) / 스머핑 (Smurfing)</h3>
</li>
<li>출발지 주소를 공격 대상의 IP로 설정하여 네트워크 전체에게 ICMP Echo패킷을 직접 브로드캐스팅하여 마비시키는 공격</li>
<li>바운스 사이트라고 불리는 제3의 사이트를 이용해 공격<h3 id="죽음의-핑-pod--ping-of-death">죽음의 핑 (PoD / Ping Of Death)</h3>
</li>
<li>ICMP 패킷을 정상적인 크기보다 아주 크게 만들어 전송하면 다수의 IP 단편화가 발생해 처리하는 과정에서 많은 부하가 발생하거나 오버플로우가 발생하여 정상적인 서비스를 하지 못하도록 하는 공격기법<h3 id="랜드-어택-land-attack">랜드 어택 (Land Attack)</h3>
</li>
<li>출발지IP와 목적지IP를 같은 패킷 주소로 만들어 보냄으로써 수신자가 자기 자신에게 응답을 보내게 하여 시스템의 가용성을 침해하는 공격기법<h3 id="티어-드롭-tear-drop">티어 드롭 (Tear Drop)</h3>
</li>
<li>IP패킷의 재조합 과정에서 잘못된 Fragment Offset 정보로 인해 수신시스템이 문제를 발생하도록 만드는 DoS 공격</li>
<li>공격자는 IP Fragment Offset 값을 서로 중첩되도록 조작하여 전송하고 이를 수신한 시스템이 재조합하는 과정에서 오류가 발생, 시스템의 기능을 마비시키는 공격방식<h3 id="봉크-bonk">봉크 (Bonk)</h3>
</li>
<li>패킷을 분할하여 보낼 때 처음 패킷을 1번으로 보낸 후 다음 패킷을 보낼 때도 순서번호를 모두 1번으로 조작하여 전송하는 DoS 공격</li>
<li>똑같은 번호로 전송돼서 오류를 일으킴<h3 id="보잉크-boink">보잉크 (Boink)</h3>
</li>
<li>처음 패킷을 1번으로 보낸 후 다음 패킷을 nn번.. 등으로 중간에 패킷 시퀀스 번호를 비정상적인 상태로 보내서 부하를 일으키게 하는 공격기법</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="ddos공격">DDoS공격</h1>
<blockquote>
<ul>
<li>DoS의 또 다른 형태로 여러 대의 공격자를 분산 배치하여 동시에 동작하게 함으로써 특정 사이트를 공격하는 기법</li>
</ul>
</blockquote>
<ul>
<li>해커들이 취약한 인터넷 시스템에 대한 액세스가 이뤄지면 침입한 시스템에 소프트웨어를 설치하고 이를 실행시켜 원격에서 공격을 개시</li>
<li>DoS와 다르게 공격을 하도록 지시한다.</li>
<li>수많은 감염 호스트를 통해 공격을 감행한다.</li>
</ul>
<h2 id="공격-구성요소">공격 구성요소</h2>
<ul>
<li>핸들러 (Handler)
: 마스터 시스템의 역할을 수행하는 프로그램</li>
<li>에이전트 (Agent)
: 공격 대상에 직접 공격을 가하는 시스템</li>
<li>마스터 (Master)
: 공격자에게서 직접 명령을 받는 시스템 / 여러 대의 에이전트를 관리하는 역할</li>
<li>공격자 (Attacker)
: 공격을 주도하는 해커의 컴퓨터</li>
<li>데몬 프로그램 (Daemon)
: 에이전트 시스템의 역할을 수행하는 프로그램</li>
</ul>
<p><br></br></p>
<h2 id="공격-대응-방안">공격 대응 방안</h2>
<h3 id="차단-정책-업데이트">차단 정책 업데이트</h3>
<p>: 공격 규모를 확인하여 가용성이 침해될 수 있는 지점을 확인 및 데이터 기반 차단 정책 업데이트</p>
<h3 id="좀비-pc-ip확보">좀비 PC IP확보</h3>
<p>: 공격자는 대부분 Source IP를 위조하므로 IP 위변조 여부를 확인하는 절차 필요</p>
<h3 id="보안-솔루션-운영">보안 솔루션 운영</h3>
<p>: 방화벽, 침입 탐지 시스템 등의 보안 솔루션 운영</p>
<h3 id="홈페이지-보안-관리">홈페이지 보안 관리</h3>
<p>: 홈페이지에 대한 모의해킹 등을 후ㅐㅇ하여 보안 유지</p>
<h3 id="시스템-패티">시스템 패티</h3>
<p>: 시스템에 존재하는 취약점을 패치를 통해 해결</p>
<p><br></br></p>
<h2 id="종류-1">종류</h2>
<h3 id="대역폭-소진-공격-34계층">대역폭 소진 공격 (3~4계층)</h3>
<ul>
<li>UDP/ICMP Traffic Flooding</li>
<li>TCP Traffic Flooding</li>
<li>IP Flooding<h3 id="서비스-마비-공격-7계층">서비스 마비 공격 (7계층)</h3>
</li>
<li>HTTP Traffic</li>
<li>HTTP Header/Option Spoofing</li>
<li>Other L7 Service Flooding</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="세션-하이재킹">세션 하이재킹</h1>
<blockquote>
<p>케빈 미트닉이 사용했던 공격 방법 중 하나로 TCP의 세션 관리 취약점을 이용한 공격기법</p>
</blockquote>
<ul>
<li>TCP Sequence Number의 보안상 취약점으로 발생</li>
<li>Victim과 Server 사이의 패킷을 스니핑하여 Sequence Number를 획득하고 공격자는 데이터 전송 중인 Victim과 Server 사이를 비동ㄱ디화 상태로 강제적으로 만들고 스니핑하여 획득한 Client Sequence Number를 이용하여 공격하는 방식</li>
<li>비동기화 상태로 패킷이 유실되어 재전송 패킷이 증가한다.</li>
<li>세션 하이재킹을 통해 ACK Storm 증가, 네트워크 부하 증가 현상이 발생한다.</li>
</ul>
<h2 id="세션-하이재킹의-탐지-방법">세션 하이재킹의 탐지 방법</h2>
<ul>
<li>비동기화 상태 탐지</li>
<li>ACK 패킷 비율 모니터링</li>
<li>특정 세션에서 패킷 유실 및 재전송이 증가되는 것을 탐지</li>
<li>기대하지 않은 접속의 리셋 탐지</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="네트워크-공격">네트워크 공격</h1>
<h2 id="스니핑-sniffing">스니핑 (Sniffing)</h2>
<p>: 공격대상에게 직접 공격을 하지 않고 데이터만 몰래 들여다보는 수동적 공격 기법</p>
<h2 id="네트워크-스캐너-scanner-스니퍼sniffer">네트워크 스캐너 (Scanner), 스니퍼(Sniffer)</h2>
<p>: 네트워크 하드웨어 및 소프트웨어 구성의 취약점 파악을 위해 공격자가 취약점을 탐색하는 공격 도구</p>
<h2 id="패스워드-크래킹-password-cracking">패스워드 크래킹 (Password Cracking)</h2>
<p>: 사전 크래킹 공격, 무차별 크래킹 공격, 패스워드 하이브리드 공격, 레인보우 테이블 공격 활용</p>
<h2 id="ip스푸핑-ip-spoofing">IP스푸핑 (IP Spoofing)</h2>
<p>: 침입자가 인증된 컴퓨팅 시스템인 것처럼 속여서 타킷 시스템의 정보를 빼내기 위해서 본인의 패킷 헤더를 인증된 호스트의 IP 주소로 위조하여 타깃에 전송하는 공격기법</p>
<h2 id="arp스푸핑-arp-spoofing">ARP스푸핑 (ARP Spoofing)</h2>
<p>: 공격자가 특정 호스트의 MAC 주소를 자신의 MAC 주소로 위조한 ARP Reply를 만들어 희생자에게 지속적으로 전송하여 희생자의 ARP Cache Table에 <strong>특정 호스트의 MAC 정보를 공격자의 MAC 정보로 변경</strong>, 희생자로부터 특정 호스트로 나가는 패킷을 공격자가 스니핑하는 공격기법</p>
<h2 id="icmp-redirect-공격">ICMP Redirect 공격</h2>
<p>: 3계층에서 스니핑 시스템을 네트워크에 존재하는 또 다른 라우터라고 알림으로써 패킷의 흐름을 바꾸는 공격기법</p>
<ul>
<li>ICMP Redirect 메시지를 공격자가 원하는 형태로 만들어서 특정 목적지로 가는 패킷을 공격자가 스니핑하는 공격기법<h2 id="트로이-목마-trojan-horses">트로이 목마 (Trojan Horses)</h2>
: 악성 루틴이 숨어 있는 프로그램으로 겉보기에는 정상적인 프로그램으로 보이지만 실행하면 악성 코드를 실행하는 프로그램</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="보안-관련-용어">보안 관련 용어</h1>
<h2 id="스피어피싱-spear-phising">스피어피싱 (Spear Phising)</h2>
<p>: 사회공학의 한 기법으로 특정 대상을 선정한 후 그 대상에게 <strong>일반적인 이메일로 위장한 메일을 지속적으로 발송</strong>하여 발송 메일의 본문 링크나 첨부된 파일을 클릭하도록 유도하여 <strong>사용자의 개인정보를 탈취</strong>하는 공격</p>
<h2 id="스미싱-smishing">스미싱 (Smishing)</h2>
<p>: <strong>문자메시지를 이용</strong>하여 신뢰할 수 있는 사람 또는 기업이 보낸 것처럼 가장하여 <strong>개인 비밀정보를 요구하거나 휴대폰 소액 결제를 유도</strong>하는 피싱 공격 (사이버 사기)</p>
<h2 id="큐싱-qshing">큐싱 (Qshing)</h2>
<p>: <strong>스마트폰을 이용하여 금융 업무를 처리하는 사용자</strong>에게 인증 등이 필요한 것처럼 속여 <strong>QR코드를 통해 악성 앱을 내려받도록 유도</strong>, 금융 정보 등을 빼내는 피싱 공격 (사이버 사기)</p>
<ul>
<li>최근 제로페이 확산에 따라 피해 증가<h2 id="봇넷-botnet">봇넷 (Botnet)</h2>
: 악성 프로그램에 감염되어 악의적인 의도로 사용될 수 있는 <strong>다수의 컴퓨터들이 네트워크로 연결된 형태</strong><h2 id="art-공격-advanced-persistent-threat">ART 공격 (Advanced Persistent Threat)</h2>
: <strong>특정 타깃을 목표</strong>로 하여 다양한 수단을 통한 지속적이고 <strong>지능적인 맞춤형 공격기법</strong></li>
<li>특수목적의 조직이 하나의 표적에 대해 다양한 IT기술을 이용하여 지속적으로 정보를 수집하고 취약점을 분석하여 피해를 주는 공격기법<h2 id="공급망-공격-supply-chain-attack">공급망 공격 (Supply Chain Attack)</h2>
: <strong>소프트웨어 개발사의 네트워크에 침투</strong>하여 소스 코드의 수정 등을 통해 악의적인 코드를 삽입하거나 배포 서버에 접근하여 악의적인 파일로 변경하는 방식을 통해 <strong>사용자 PC에 소프트웨어를 설치 또는 업데이트 시에 자동적으로 감염</strong>되도록 하는 공격기법<h2 id="제로데이-공격-zero-day-attack">제로데이 공격 (Zero Day Attack)</h2>
: <strong>보안 취약점이 발견되어 널리 공표되기 전에 해당 취약점을 악용</strong>하여 이루어지는 보안 공격기법</li>
<li>공격의 신속성을 의미하는 것으로 일반적으로 컴퓨터에서 취약점이 발견되면 제작자나 개발자가 보완하는 패치를 배포하고 이를 다운받지만 이 공격을 대응책이 공표되기 전에 공격이 이루어져 <strong>대처 방법이 없음</strong><h2 id="웜-worm">웜 (Worm)</h2>
: <strong>스스로를 복제하여 네트워크 등의 연결을 통하여 전파</strong>하는 악성 소프트웨어 컴퓨터 프로그램</li>
<li>컴퓨터 바이러스와 비슷하지만 바이러스와 달리 독자적으로 실행되며 다른 실행 프로그램이 필요하지 않음<h2 id="악성-봇-malicious-bot">악성 봇 (Malicious Bot)</h2>
: 스스로 실행되지 못하고 해커의 명령에 의해 원격에서 제어 또는 실행이 가능한 프로그램 혹은 코드</li>
<li>주로 취약점이나 백도어 등을 이용하여 전파되며 스팸 메일 전송이나 DDoS에 악용</li>
<li>사용자들에게 잘 알려진 &#39;좀비 PC&#39;는 악성 봇에 의해 감염된 PC<h2 id="사이버-킬체인-cyer-kill-chain">사이버 킬체인 (Cyer Kill Chain)</h2>
: 공격형 방위시스템으로 지능적, 지속적 사이버 공격에 대해 7단ㄴ계 프로세스별 공격분석 및 대응을 체계화한 ART 공격 방어 분석 모델<h2 id="랜섬웨어-ransomware">랜섬웨어 (Ransomware)</h2>
: 악성 코드의 한 종류로 감염된 시스템의 파일들을 암호화하여 복호화할 수 없도록 하고 <strong>피해자로 하여금 암호화된 파일을 인질처럼 잡고 몸값을 요구 악성 소프트웨어</strong></li>
<li>현금이나 비트코인 등을 받고 복호화 해주는 범죄행위에 이용되고 있음<h2 id="이블-트윈-evil-twin-공격">이블 트윈 (Evil Twin) 공격</h2>
: 무선 Wifi피싱 기법으로 공격자는 합법적인 Wifi제공자처럼 행세하며 노트북이나 휴대 전화로 핫스팟에 연결한 무선 사용자들의 정보를 탈취하는 무선 네트워크 공격기법<h2 id="사회공학-social-engineering">사회공학 (Social Engineering)</h2>
: 사람들의 심리와 행동 양식을 교묘하게 이용해서 원하는 정보를 얻는 공격기법
<span style="color:green">ex) 도청</span><h2 id="트러스트존-trustzone">트러스트존 (Trustzone)</h2>
: 프로세서 안에 <strong>독립적인 보안 구역을 따로 두어 중요한 정보를 보호하는 ARM사에서 개발한 보안 기술</strong>로 프로세서 안에 독립적인 보안 구역을 따로 두어 중요한 정보를 보호하는 하드웨어 기반의 보안 기술<h2 id="타이포스쿼팅-typosquatting">타이포스쿼팅 (Typosquatting)</h2>
: 네티즌들이 사이트에 접속할 때 <strong>주소를 잘못 입력하거나 철자를 빠뜨리는 실수를 이용하기 위해 이와 유사한 유명 도메인을 미리 등록하는 일</strong> (=URL 하이재킹)</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="서버-접근-통제">서버 접근 통제</h1>
<blockquote>
<p>사람 또는 프로세스가 서버 내 파일에 읽기, 쓰기, 실행 등의 접근 여부를 허가하고나 거부하는 기능</p>
</blockquote>
<ul>
<li>비인가자로부터 객체의 기밀성, 무결성, 가용성을 보장한다.</li>
</ul>
<h2 id="유형">유형</h2>
<h3 id="임의적-접근-통제-dac--discretionary-access-control">임의적 접근 통제 (DAC / Discretionary Access Control)</h3>
<p>: 주체나 그룹의 신분에 근거하여 객체에 대한 접근을 제한하는 방법</p>
<ul>
<li>신분 기반 접근통제 정책</li>
<li>DAC에서 사용자는 자원과 관련된 ACL이 수정됨으로써 자원에 대한 권한을 부여<h3 id="강제적-접근-통제-mac--mandatory-access-control">강제적 접근 통제 (MAC / Mandatory Access Control)</h3>
: 객체에 포함된 정보의 허용등급과 접근 정보에 대하여 주체가 갖는 접근 허가 권한에 근거하여 객체에 대한 접근을 제한하는 방법</li>
<li>규칙 기반 접근통제 정책<h3 id="역할-기반-접근-통제-rbac--role-based-access-control">역할 기반 접근 통제 (RBAC / Role Based Access Control)</h3>
: 중앙 관리자가 사용자와 시스템의 상호관계를 통제하며 조직 내 맡은 역할에 기초하여 자원에 대한 접근을 제한하는 방법</li>
<li>RBAC에서 자원에 대한 접근은 사용자에게 할당된 역할에 기반</li>
<li>관리자는 사용자에게 특정한 권리와 권한이 정의된 역할을 할당</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="3a">3A</h1>
<blockquote>
<p>유무선 이동 및 인터넷 환경에서 가입자에 대한 안전하고 신뢰성 있는 인증, 권한 부여, 계정 관리를 체계적으로 제공하는 정보 보호 기술</p>
</blockquote>
<h2 id="인증-authentication">인증 (Authentication)</h2>
<ul>
<li>접근을 시도하는 가입자 또는 단말에 대한 식별 및 신분을 검증</li>
<li>주체의 신원을 검증하기 위한 활동</li>
<li>주체의 신원을 객체가 인증해 주는 행위<h2 id="권한-부여-authorization">권한 부여 (Authorization)</h2>
</li>
<li>검증된 가입자나 단말에게 어떤 수준의 권한과 서비시를 허용</li>
<li>인증된 주체에게 접근을 허용하는 활동</li>
<li>특정 업무를 수행할 권리를 부여하는 행위<h2 id="계정-관리-accounting">계정 관리 (Accounting)</h2>
</li>
<li>리소스 사용에 대한 정보를 수집하고 관리하는 서비스</li>
<li>주체의 접근을 추적하고 행동을 기록하는 활동</li>
<li>식별, 인증, 인가, 감사 개념을 기반으로 수립
<br></br></li>
</ul>
<hr>
<h1 id="인증-관련-기술">인증 관련 기술</h1>
<h2 id="sso-single-sign-on">SSO (Single Sign On)</h2>
<p>: 커버로스에서 사용되는 기술로 한 번의 인증 과정으로 여러 컴퓨터상의 자원을 이용할 수 있도록 해주는 인증 기술</p>
<h2 id="커버로스-kerberos">커버로스 (Kerberos)</h2>
<p>: 1980년대 중반 MIT의 Athena 프로젝트의 일환으로 개발되었으며 클라이언트/서버 모델에서 동작하고 대칭 키 암호기법에 바탕을 둔 티켓 기반의 프로토콜</p>
<p><br></br></p>
<hr>
<h1 id="암호-알고리즘">암호 알고리즘</h1>
<blockquote>
<p>데이터의 무결성 및 기밀성 확보를 위해 정보를 쉽게 해독할 수 없는 형태로 변환하는 기법</p>
</blockquote>
<h2 id="양방향-방식">양방향 방식</h2>
<table>
<thead>
<tr>
<th align="center"><strong>구분</strong></th>
<th><strong>대칭 키 암호 방식</strong></th>
<th><strong>비대칭 키 암호 방식</strong></th>
</tr>
</thead>
<tbody><tr>
<td align="center"><strong>키</strong></td>
<td>대칭 키(비밀 키)</td>
<td>비대칭 키(공개키, 사설키)</td>
</tr>
<tr>
<td align="center"><strong>키의 관계</strong></td>
<td>암호화 키 = 복호화 키</td>
<td>암호화 키 != 복호화 키</td>
</tr>
<tr>
<td align="center"><strong>키 개수</strong></td>
<td>n(n-1) / 2</td>
<td>2n</td>
</tr>
<tr>
<td align="center"><strong>암호 알고리즘</strong></td>
<td>공개</td>
<td>공개</td>
</tr>
<tr>
<td align="center"><strong>장점</strong></td>
<td>계산 속도가 빠름</td>
<td>암호화 키 사전 공유 불필요 <br> 관리해야 할 키 개수가 적음</td>
</tr>
<tr>
<td align="center"><strong>단점</strong></td>
<td>키 분배 및 관리의 어려움 <br> 기밀성만 보장</td>
<td>계산 속도 느림</td>
</tr>
<tr>
<td align="center"><strong>알고리즘</strong></td>
<td>DES,AES,SEED</td>
<td>디피-헬만, RSA</td>
</tr>
</tbody></table>
<h3 id="대칭-키-암호-방식">대칭 키 암호 방식</h3>
<p>: 암호화와 복호화에 같은 암호 키를 쓰는 알고리즘</p>
<ul>
<li>비밀키 전달을 위한 키 교환이 필요하고 암호화 및 복호화의 속도가 빠르다</li>
</ul>
<blockquote>
<p><strong>DES</strong> **
: 1975년 IBM에서 개발하고 NIST에서 발표한 대칭 키 기반의 블록 암호화 알고리즘</p>
</blockquote>
<ul>
<li>블록 크기 = 64 / 키 길이 = 56(페이스텔 구조) / 16라운드 암호화 알고리즘</li>
<li>DES를 3번 적용하여 보안을 더욱 강화한 3DES도 활용됨</li>
</ul>
<blockquote>
<p><strong>SEED</strong>
: 1999년 국내 KISA이 개발한 블록 암호화 알고리즘</p>
</blockquote>
<ul>
<li>128bit비밀키로부터 생성된 16개의 64bit 라운드 키를 사용하여 총 16회의 라운드를 거쳐 128bit의 평문 블록을 암호화 블록을 암호화하여 출력하는 방식</li>
<li>블록 크기 = 128 / 키 길이 = 128, 256</li>
</ul>
<blockquote>
<p><strong>AES</strong> **
: 2001년 NIST에서 발표한 블록 암호화 알고리즘</p>
</blockquote>
<ul>
<li>DES의 개인 키에 대한 전사적 공격이 가능해지고 3DES의 성능문제를 극복하기 위해 개발</li>
<li>블록 크기 = 128 / 키 길이 = 128,192,256</li>
<li>라운드 수 = 10, 12, 14 /  한 라운드는 4가지 계층으로 구성</li>
</ul>
<blockquote>
<p><strong>ARIA</strong>
: 2004년 국가정보원과 산학연구협회가 개발한 블록 암호화 알고리즘</p>
</blockquote>
<ul>
<li>학계, 연구기관, 정부의 영문 앞글자로 구성</li>
<li>블록 크기 = 128, 키 길이 = 128, 192, 256</li>
<li>경량 환경 및 하드웨어에서의 효율성 향상을 위해 개발되었으며 ARIA가 사용하는 대부분의 연산은 단순한 바이트 단위 연산으로 구성</li>
</ul>
<blockquote>
<p><strong>IDEA</strong>
: DES를 대체하기 위해 스위스 연방기술 기관에서 개발한 블록 암호화 알고리즘</p>
</blockquote>
<ul>
<li>128bit의 키를 사용하여 64bit의 평문을 8라운드에 거쳐 64bit의 암호문을 만듦</li>
</ul>
<blockquote>
<p><strong>LFSR</strong>
: 시프트 레지스터의 일종으로 레지스터에 입력되는 값이 이전 상태 값들의 선형 함수로 계산되는 구조로 되어 있는 스트림 암호화 알고리즘</p>
</blockquote>
<ul>
<li>사용되는 선형 함수는 주로 XOR이고 초기 비트 값은 seed라고 한다.</li>
</ul>
<blockquote>
<p><strong>Skipjack</strong>
: NSA에서 개발한 Cipper 칩에 내장된 블록 알고리즘</p>
</blockquote>
<ul>
<li>소프트웨어로 구현되는 것을 막고자 Fortezza Card에 칩 형태로 구현됨</li>
<li>전화기와 같이 음성을 암호화하는데 주로 사용되고 64비트의 입/출력, 80비트의 키, 32라운드를 가짐</li>
</ul>
<h4 id="블록-암호-방식">블록 암호 방식</h4>
<p>: 긴 평문을 암호화하기 위해 고정 길이의 블록을 암호화하는 블록 암호 알고리즘을 반복하는 방법
<span style="color:green"> ex) DES, AES, SEED </span></p>
<h4 id="스트림-암호-방식">스트림 암호 방식</h4>
<p>: 매우 긴 주기의 난수열을 발생시켜 평문과 더불어 암호문을 생성하는 방식
<span style="color:green"> ex) RC4 </span></p>
<p><br></br></p>
<h3 id="비대칭-키-암호-방식">비대칭 키 암호 방식</h3>
<p>: 사전에 개인 키를 나눠 가지지 않은 사용자들이 안전하게 통신하는 방식</p>
<ul>
<li>공개키와 개인 키가 존재하며, 공개키는 누구나 알 수 있지만 그에 대응하는 개인 키는 키의 소유자만이 알 수 있어야 한다. (공개키는 보안 타협 없이 공개적으로 배포가 가능하다.)</li>
<li>공개키로 암호화된 메시지는 반드시 개인 키로 복호화해야 함</li>
<li>자신만이 보관하는 비밀키를 이용하여 인증, 전자서명 등에 적용이 가능함</li>
</ul>
<blockquote>
<p><strong>디피-헬만</strong>
: 최초의 공개키 알고리즘으로 1976년에 고안한 알고리즘으로서 유한 필드 내에서 이산대수의 계산이 어려운 문제를 기본 원리로 하고 있음</p>
</blockquote>
<ul>
<li>Differ-Helman은 공개키 암호 방식의 개념을 이용하여 두 사용자 간에 공통의 암호화 키를 안전하게 공유할 방법을 제시하였으며 많은 키 분배 방식에 관한 연구의 기본이 됨 (최초의 비밀키 교환 프로토콜)</li>
</ul>
<blockquote>
<p><strong>RSA</strong>
: 1977년 3명의 수학 교수가 고안한 큰 인수의 곱을 소인수 분해하는 수학적 알고리즘 이용하는 공개키 암호화 알고리즘</p>
</blockquote>
<ul>
<li>비밀키의 복호화가 어려운 RSA안전성은 소인수 분해 문제의 어려움에 근거를 두고 있음</li>
</ul>
<blockquote>
<p><strong>ECC</strong>
: 1985년 RSA 암호 방식에 대한 대안으로 처음 제안</p>
</blockquote>
<ul>
<li>ECC는 유한체 위에서 정의된 타원곡선 군에서의 이산대수의 문제에 기초한 공개키 암호화 알고리즘</li>
<li>PKI기반의 RSA의 문제점인 속도와 안전성 해결하기 위해 타원 기반 구조체의 안정성과 효율성을 기반으로 생성되었고 RSA보다 키의 비트 수를 적게하면서 동일한 성능을 제공하는 것이 가장 큰 특징</li>
</ul>
<blockquote>
<p><strong>EIGAMAL</strong>
: 1984년에 제안한 공개키 알고리즘</p>
</blockquote>
<ul>
<li>이산대수의 계산이 어려운 문제를 기본 원리로 하고 있으며 RSA와 유사하게 전자서명과 데이터 암/복호화에 함께 사용가능</li>
</ul>
<h4 id="rsa">RSA</h4>
<p>: 현재 비대칭 키 암호방식 중에서 가장 널리 쓰이고 있는 방식</p>
<ul>
<li>소인수 분해의 어려움을 이용한 방식<h4 id="디피-헬만">디피-헬만</h4>
: 암호 키를 교환하는 방법으로써 두 사람이 암호화되지 않은 통신망을 통해 공통의 비밀키를 공유할 수 있도록 하는 방식<h4 id="ecc">ECC</h4>
<h4 id="eigamal">EIGamal</h4>
</li>
</ul>
<p><br></br></p>
<h3 id="해시-암호화-알고리즘">해시 암호화 알고리즘</h3>
<blockquote>
<p><strong>MD5</strong> **
: 1991년에 MD4를 개선한 암호화 알고리즘으로 프로그램이나 파일의 무결성 검사에 사용</p>
</blockquote>
<ul>
<li>각각의 512비트짜리 입력 메시지 블록에 대해 차례로 동작하여 128비트의 해시값을 생성하는 해시 알고리즘</li>
</ul>
<blockquote>
<p><strong>SHA-1</strong>
: 1993년 NSA에서 미 정부 표준으로 지정되었고 DSA에서 사용</p>
</blockquote>
<ul>
<li>160비트의 해시값을 생성하는 해시 알고리즘</li>
</ul>
<blockquote>
<p><strong>SHA-256/384/512</strong>
: SHA알고리즘의 한 종류로서 256비트의 해시값을 생성하는 해시함수</p>
</blockquote>
<ul>
<li>AES의 키 길이에 대응하도록 출력 길이를 늘인 해시 알고리즘</li>
</ul>
<blockquote>
<p><strong>HAS-160</strong>
: 국내 표준 서명 알고리즘 KCDSA를 위하여 개발된 해시함수</p>
</blockquote>
<ul>
<li>MD5와 SHA1의 장점을 취하여 개발된 해시 알고리즘</li>
</ul>
<blockquote>
<p><strong>HAVAL</strong>
: 메시지를 1024bits 블록으로 나누고 128, 160, 192, 224, 256 비트인 메시지 다이제스트를 출력하는 해시 알고리즘</p>
</blockquote>
<p><br></br></p>
<hr>
<h1 id="ipsec">IPSec</h1>
<blockquote>
<p>IP계층에서 무결성과 인증을 보장하는 인증 헤더와 기밀성을 보장하는 암호화를 이용한 IP보안 프로토콜</p>
</blockquote>
<h2 id="기능">기능</h2>
<h3 id="기밀성">기밀성</h3>
<p>: 대칭 암호화를 통해 전송 데이터에 대한 기밀성 제공</p>
<h3 id="비-연결형-무결성">비 연결형 무결성</h3>
<p>: 메시지가 위/변조되지 않았음을 보장하는 특성 제공</p>
<h3 id="인증">인증</h3>
<p>: 데이터 원천 인증 및 송신처 인증</p>
<h3 id="재전송-공격-방지">재전송 공격 방지</h3>
<p>: 송신 측에서 IP패킷별로 순서번호를 통해 재전송 공격 방지</p>
<h3 id="접근-제어">접근 제어</h3>
<p>: Security Policy를 통해 시스템 접근 제어
<br></p>
<h2 id="동작모드">동작모드</h2>
<h3 id="전송-모드">전송 모드</h3>
<p>: IP 패킷의 페이로드를 보호하는 모드</p>
<ul>
<li>즉 IP상위 프로토콜 데이터를 보호하는 모드<h3 id="터널-모드">터널 모드</h3>
: IP 패킷 전체를 보호하는 모드</li>
<li>IP패킷 전체를 IPSec으로 캡슐화하여 IP헤더를 식별할 수 없기 때문에 네트워크상 패킷 전송이 불가능</li>
<li>전송구간 주소 정보를 담은 New IP헤더 추가</li>
</ul>
<br>

<h2 id="프로토콜-1">프로토콜</h2>
<h3 id="인증ah-프로토콜">인증(AH) 프로토콜</h3>
<p>: MAC을 이용하여 인증과 송신처 인증을 제공해주는 프로토콜로 기밀성은 제공하지 않은 프로토콜</p>
<ul>
<li>무결성, 인증 제공<h3 id="암호화esp-프로토콜">암호화(ESP) 프로토콜</h3>
: MAC와 암호화를 이용하여 인증과 송신처 인증과 기밀성을 제공하는 프로토콜</li>
<li>기밀성, 무결성, 인증 제공<h3 id="키-관리ike-프로토콜">키 관리(IKE) 프로토콜</h3>
: 공개된 네트워크를 통하여 키를 어떻게 할 것인가를 정의, IKE교환을 위한 메시지를 전달하는 프로토콜</li>
<li>Key를 주고받는 알고리즘</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="입력-데이터-검증-및-표현">입력 데이터 검증 및 표현</h1>
<blockquote>
<p>입력 데이터로 인해 발생하는 문제들을 예방하기 위해 구현 단계에서 검증해야 하는 보안 점검 항목들</p>
</blockquote>
<ul>
<li>입력 데이터로 인해 발생하는 문제를 예방하기 위해서는 소프트웨어 개발의 구현 단계에서 유효성 검증 체계를 갖추고 점증되지 않은 데이터의 입력을 처리할 수 있도록 구현해야 함</li>
</ul>
<h2 id="입력-데이터-검증-및-표현-취약점">입력 데이터 검증 및 표현 취약점</h2>
<h3 id="xss-corss-site-scripting">XSS (Corss Site Scripting)</h3>
<p>: 검증되지 않은 외부 입력 데이터가 포함된 웹페이지가 전송되는 경우 사용자가 해당 웹페이지를 열람함으로써 웹페이지에 포함된 부적절한 스크립트가 실행되는 공격</p>
<h4 id="대책">대책</h4>
<ul>
<li>특수문자 등록을 방지하기 위해 특수 문자 필터링</li>
<li>HTML태그 사용 금지</li>
<li>자바스크립트로 시작하는 문자열은 모두 문자열 변환처리<h4 id="유형-1">유형</h4>
</li>
<li>Stored XSS
: 방문자들이 악성 스크립트가 포함된 페이지를 읽어 봄과 동시에 악성 스크립트가 브라우저에서 실행되면서 감염되는 기법</li>
<li>Reflected XSS
: 공격용 악성 URL을 생성한 후 이메일로 사용자에게 접속하면 사용자가 URL클릭 시 즉시 공격 스크립트가 피해자로 반사되어 접속 사이트에 민감정보를 공격자에게 전송하는 기법</li>
<li>DOM (Document Object Model) XSS
: 공격자는 DOM 기반 XSS 취약점이 있는 브라우저를 대상으로 조작된 URL을 이메일을 통해 발송하고 피해자가 클릭 시 공격 피해를 당하는 기법<br>

</li>
</ul>
<h3 id="사이트-간-요청위조csrf--cross-site-request-forgery">사이트 간 요청위조(CSRF / Cross-Site Request Forgery)</h3>
<p>: 사용자가 자신의 의지와는 무관하게 <strong>공격자가 의도한 행위를 특정 웹사이트에 요청하게 하는 공격</strong></p>
<h4 id="대책-1">대책</h4>
<ul>
<li>입력화면 폼을 작성 시 GET방식보다 POST방식 사용</li>
<li>입력 폼과 입력처리 프로그램에서 세션별 CSRF 토큰을 사용하여 점검</li>
<li>중요기능의 경우 재인증을 통해 안전하게 실제 요청 여부를 확인하도록 구현<br>

</li>
</ul>
<h3 id="sql-injection">SQL Injection</h3>
<p>: 응용 프로그램의 보안 취약점을 이용해서 악의적은 SQL 구문을 삽입, 실행시켜서 데이터베이스의 접근을 통해 정보를 탈취하거나 조작 등의 행위를 하는 공격기법</p>
<h4 id="대책-2">대책</h4>
<ul>
<li>바인딩 매개변수 방식 적용하여 사전에 변수 타입을 명시적으로 지정</li>
<li>사용자로부터 입력될 수 있는 모든 값을 체크하여 필터링</li>
<li>Servlet Filter 기능 적용 (Java에서만)<h4 id="유형-2">유형</h4>
</li>
<li>Form SQL Injection
: HTML Form 기반 인증을 담당하는 애플리케이션의 취약점이 있는 경우 사용자 인증을 위한 쿼리 문의 조건을 임의로 조작하여 인증을 우회하는 기법</li>
<li>Union SQL Injection
: 쿼리의 UNION 연산자를 이용하여 한 쿼리의 결과를 다른 쿼리의 결과에 결합하여 공격하는 기법</li>
<li>Stored Procedure SQL Injection
: 저장 프로시저를 이용하여 공격하는 기법</li>
<li>Mass SQL Injection
: 기존 SQL Injection의 확장된 개념으로 한 번의 공격으로 대량의 DB값이 변조되어 홈페이지에 치명적인 영향을 미치는 공격기법</li>
<li>Error-Based SQL Injection
: DB쿼리에 대한 에러값을 기반으로 한 단계씩 점진적으로 DB 정보를 획득할 수 있는 공격기법</li>
<li>Blind SQL Injection
: DB 쿼리에 대한 오류 메시지를 반환하지 않으면 공격을 할 수 없는 Error-Based SQL Injection과 달리 오류 메시지가 아닌 쿼리 결과의 참과 거짓을 통해 의도하지 않은 SQL문을 실행함으로써 데이터베이스를 비정상적으로 공격하는 기법
<br></br></li>
</ul>
<hr>
<h1 id="네트워크-보안-솔루션">네트워크 보안 솔루션</h1>
<ul>
<li>네트워크 보안 장비는 접근 통제, 침입차단 및 탐지, DDoS 탐지 등을 수행하는 일체형 장비들이 포함됨<h2 id="방화벽-firewall">방화벽 (Firewall)</h2>
: 기업 내부, 외부 간 트래픽을 모니터링 하여 시스템의 접근을 허용하거나 차단하는 시스템<h2 id="웹-방화벽-waf--web-application-firewall">웹 방화벽 (WAF / Web Application Firewall)</h2>
: 일반적인 네트워크 방화벽과는 달리 웹 애플리케이션 보안에 특화된 보안장비</li>
<li>SQL Injection, XSS 등과 같은 웹 공격을 탐지하고 차단하는 기능<h2 id="네트워크-접근-제어-nac--network-access-control">네트워크 접근 제어 (NAC / Network Access Control)</h2>
: 단말기가 내부 네트워크에 접속을 시도할 때 이를 제어하고 통제하는 기능을 제공하는 솔루션</li>
<li>바이러스나 웜 등의 보안 위협으로부터 네트워크 제어 및 통제 기능을 수행<h2 id="침입-탐지-시스템-ids--intrusion-detection-system">침입 탐지 시스템 (IDS / Intrusion Detection System)</h2>
: 네트워크에서 발생하는 이벤트를 모니터링하고 비인가 사용자에 의한 자원접근과 보안정책 위반 행위(침입)을 실시잔으로 탐지하는 시스템<h2 id="침입-방지-시스템-ips--intrusion-prevention-system">침입 방지 시스템 (IPS / Intrusion Prevention System)</h2>
: 네트워크에 대한 공격이나 침입을 실시간적으로 차단하고 유해트래픽에 대한 조치를 능동적으로 처리하는 시스템<h2 id="무선-침입-방지-시스템-wips--wireless-intrusion-prevention-system">무선 침입 방지 시스템 (WIPS / Wireless Intrusion Prevention System)</h2>
: 인가되지 않은 무선 단말기의 접속을 자동으로 탐지 및 차단하고 보안에 취약한 무선 공유기를 탐지하는 시스템<h2 id="통합-보안-시스템-utm--unified-threat-management">통합 보안 시스템 (UTM / Unified Threat Management)</h2>
: 방화벽, IDS, IPS, VPN, 안티 바이러스, 이메일 필터링 등 다양한 보안 장비의 기능을 하나의 장비로 통합하여 제공하는 시스템<h2 id="가상사설망-vpn--virtual-private-network">가상사설망 (VPN / Virtual Private Network)</h2>
: 인터넷과 같은 공중망에 인증, 암호화, 터널링 기술을 활용하여 마치 전용망을 사용하는 효과를 가지는 보안 솔루션<h2 id="siem-security-information-and-event-management">SIEM (Security Information and Event Management)</h2>
: 다양한 보안 장비와 서버, 네트워크 장비 등으로부터 보안 로그와 이벤트 정보를 수집한 후 정보 간의 연관성을 분석하여 위협 상황을 인지하고 침해사고에 신속하게 대응하는 보안 관제 솔루션</li>
<li>기업에서 생성되는 테라바이트급의 정형/비정형 데이터와 방화벽, 안티바이러스 시스템, 서버, 네트워크 장비 등으로부터 수집한 다양한 데이터 등을 빅데이터 기반의 로그 분석을 통하여 보안의 위협 징후를 빠르게 판단/대응할 수 있도록 해주는 보안 관제 솔루션<h2 id="esm-enterprise-security-management">ESM (Enterprise Security Management)</h2>
: 방화벽, IDS, UTM, 가상 사설망 등의 여러 보안 시스템으로부터 발생한 각종 이벤트 및 로그를 통합해서 관리, 분석, 대응하는 전사적 통합 보안 관리 시스템</li>
<li>서로 다른 기종의 보안 장비들을 통합 관리하는 기능과 네트워크 자원 현황의 보안 보니터링 기능이 있고 주로 이벤트 위주의 단시간 위협 분석 및 DBMS 기반의 보안 관리 솔루션
<br></br></li>
</ul>
<hr>
<h1 id="소프트웨어-개발-보안-테스트">소프트웨어 개발 보안 테스트</h1>
<blockquote>
<p>소프트웨어 보안 요구사항이 반영되어 있음을 보증하고 취약점을 발견하고 개선하여 안전한 소프트웨어를 개발하기 위한 활동</p>
</blockquote>
<h2 id="정적-분석">정적 분석</h2>
<p>: SW를 실행하지 않고 보안 약점 분석 </p>
<ul>
<li>SW 개발단계에서 주로 사용</li>
<li>취약점 초기 발견으로 수정비용 절감</li>
<li>컴포넌트 간 발생할 수 있는 통합된 취약점 발견에 제한적</li>
<li>설계 / 구조 관점의 취약점은 식별 불가</li>
</ul>
<h2 id="동적-분석">동적 분석</h2>
<p>: SW 실행환경에서 보안 약점 분석</p>
<ul>
<li>SW 시험단계에서 주로 사용</li>
<li>소스 코드 필요 없음</li>
<li>정확도와 커버리지 향상</li>
<li>구조 관점의 보안 약점식별 불가
<br></br></li>
</ul>
<hr>
<h1 id="블랙박스-테스트">블랙박스 테스트</h1>
<p>: 프로그램 외부 사용자의 요구사항 명세를 보면서 수행하는 테스트(기능 테스트)</p>
<h2 id="동등분할-테스트동치-분할-균등-분할-동치-클래스-분해--equivalence-partitioning-testing">동등분할 테스트(동치 분할, 균등 분할, 동치 클래스 분해 / Equivalence Partitioning Testing)</h2>
<p>: 입력 데이터의 영역을 유사한 도메인별로 유효값/무효값을 그룹핑하여 대푯값 테스트 케이스를 도출하여 테스트하는 기법</p>
<h2 id="경곗값-분석-테스트한계값--boundary-value-analysis-testing">경곗값 분석 테스트(한계값 / Boundary Value Analysis Testing)</h2>
<p>: 등가 분할 후 경곗값 부분에서 오류 발생 확률이 높기 때문에 경곗값을 포함하여 테스트 케이스를 설계하여 테스트하는 기법</p>
<ul>
<li>최솟값 바로 위, 최대치 바로 아래 등 입력값의 극한 한계를 테스트하는 기법<h2 id="결정-테이블-테스트decision-table-testing">결정 테이블 테스트(Decision Table Testing)</h2>
: 요구사항의 논리와 발생조건을 테이블 형태로 나열하여 조건과 행위를 모두 조합하여 테스트하는 기법<h2 id="상태-전이-테스트state-transition-testing">상태 전이 테스트(State Transition Testing)</h2>
: 테스트 대상/시스템이나 객체의 상태를 구분하고 이벤트에 의해 어느 한 상태에서 다른 상태로 전이되는 경우의 수를 수행하는 테스트 기법<h2 id="유스케이스-테스트use-case-testing">유스케이스 테스트(Use Case Testing)</h2>
: 시스템이 실제 사용되는 유스케이스로 모델링 되어 있을 때 프로세스 흐름을 기반으로 테스트 케이스를 명세화하여 수행하는 테스트 기법<h2 id="분류-트리-테스트classification-tree-method-testing">분류 트리 테스트(Classification Tree Method Testing)</h2>
: SW의 일부 또는 전체를 트리 구조로 분석 및 표현하여 테스트 케이스를 설계하여 테스트하는 기법<h2 id="페어와이즈-테스트pairwise-testing">페어와이즈 테스트(Pairwise Testing)</h2>
: 테스트 데이터값들 간에 최소한 한 번씩을 조합하는 방식이며 이는 커버해야 할 기능적 범위를 모든 조합에 비해 상대적으로 적은 양의 테스트 세트를 구성하기 위한 테스트 기법<h2 id="원인-결과-그래프-테스트cause-effect-graph-testing">원인-결과 그래프 테스트(Cause-Effect Graph Testing)</h2>
: 그래프를 활용하여 입력 데이터 간의 관계 및 출력에 미치는 영향을 분석하여 효용성이 높은 테스트 케이스를 산정하여 테스트하는 기법<h2 id="비교-테스트comparison-testing">비교 테스트(Comparison Testing)</h2>
: 여러 버전의 프로그램에 같은 입력값을 넣어서 동일한 결과 데이터가 나오는지 비교해 보는 테스트 기법<h2 id="오류-추전-테스트error-guessing-testing">오류 추전 테스트(Error Guessing Testing)</h2>
: 개발자가 범할 수 있는 실수를 추정하고 이에 따를 결함이 검출되도록 테스트 케이스를 설계하여 테스트하는 기법</li>
<li>특정 테스트 대상이 주어지면 테스터의 경험과 직관을 바탕으로 개발자가 범할 수 있는 실수들을 나열하고 해당 실수에 따른 결함을 노출하는 테스트로 다른 블랙박스 테스트 기법을 보완할 때 사용하는 기법</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="화이트박스-테스트">화이트박스 테스트</h1>
<p>: 각 응용 프로그램의 내부 구조와 동작을 검사하는 소프트웨어 테스트</p>
<ul>
<li>코드 분석과 프로그램 구조에 대한 지식을 바탕으로 문제가 발생할 가능성이 있는 모듈 내부를 테스트하는 방법</li>
<li>소스 코드의 모든 문장을 한 번 이상 수행함으로써 진행되로 산출물의 기능별로 적절한 프로그램의 제어 구조에 따라 선택, 반복 등의 부분들을 수행함으로써 논리적 경로를 점검</li>
<li>내부 소스 코드의 동작을 개발자가 추적할 수 있기 때문에 동작의 유효성뿐만 아니라 실행되는 과정을 확인할 수 있다.</li>
</ul>
<h2 id="구문-커버리지문장-커버리지statement-coverage">구문 커버리지(문장 커버리지/Statement Coverage)</h2>
<p>: 프로그램 내의 모든 명령문을 적어도 한 번 수행하는 커버리지</p>
<ul>
<li>조건문 결과와 관계없이 구문 실행 개수로 계산</li>
</ul>
<h2 id="결정-커버리지선택decision분기branch">결정 커버리지(선택(Decision),분기(Branch))</h2>
<p>: 결정 커버리지는 (각 분기의) 결정 포인트 내의 전체 조건식이 적어도 한 번은 참과 거짓의 결과를 수행하는 테스트 커버리지</p>
<ul>
<li>구문 커버리지를 포함<h2 id="조건-커버리지condition-coverage">조건 커버리지(Condition Coverage)</h2>
: 조건 커버리지는 (각 분기의) 결정 포인트 내의 각 개별 조건식이 적어도 한 번은 참과 거짓의 결과가 되도록 수행하는 테스트 커버리지</li>
<li>구문 커버리지를 포함<h2 id="조건결정-커버리지conditiondecision-coverage">조건/결정 커버리지(Condition/Decision Coverage)</h2>
: 전체 조건식뿐만 아니라 개별 조건식도 참 한번, 거짓 한 번 결과가 되도록 수행하는 테스트 커버리지<h2 id="변경-조건결정-커버리지modified-conditiondecision-coverage">변경 조건/결정 커버리지(Modified Condition/Decision Coverage)</h2>
: 개별 조건식이 다른 개별 조건식에 영향을 받지 않고 전체 조건식에 독립적으로 영향을 주도록 함으로써 조건/결정 커버리지를 향상시킨 커버리지<h2 id="다중-조건-커버리지multiple-condition-coverage">다중 조건 커버리지(Multiple Condition Coverage)</h2>
: 결정 조건 내 모든 개별 조건식의 모든 가능한 조합을 100% 보장하는 커버리지<h2 id="기본-경로-커버리지경로base-path-coverage">기본 경로 커버리지(경로/Base Path Coverage)</h2>
: 수행 가능한 모든 경로를 테스트하는 기법<h2 id="제어-흐름-테스트control-flow-testing">제어 흐름 테스트(Control Flow Testing)</h2>
: 프로그램 제어 구조를 그래프 형태로 나타내어 내부로직을 테스트하는 기법<h2 id="데이터-흐름-테스트data-flow-testing">데이터 흐름 테스트(Data Flow Testing)</h2>
: 제어 흐름 그래프에 데이터 사용현황을 추가한 그래프를 통해 테스트하는 기법<h2 id="루프-테스트loop-testing">루프 테스트(Loop Testing)</h2>
: 프로그램의 반복구조에 초점을 맞춰 실시하는 테스트 기법</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="소프트웨어-테스트-시각에-따른-분류">소프트웨어 테스트 시각에 따른 분류</h1>
<h2 id="검증">검증</h2>
<ul>
<li>소프트웨어 개발 과정을 테스트</li>
<li>올바른 제품을 생산하고 있는지 검증</li>
<li>이전 단계에서 설정된 개발 규격과 요구를 충족시키는지 판단</li>
<li>개발자 혹은 시험자의 시각으로 소프트웨어가 명세화된 기능을 올바로 수행하는지 알아보는 과정<h2 id="확인">확인</h2>
</li>
<li>소프트웨어 결과를 테스트</li>
<li>만들어진 제품이 제대로 동작하는지 확인</li>
<li>최종 사용자 요구 또는 소프트웨어 요구에 적합한지 판단</li>
<li>사용자 시각으로 올바를 소프트웨어가 개발되었는지 입증하는 과정</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="테스트-목적에-따른-분류">테스트 목적에 따른 분류</h1>
<h2 id="회복-테스트-recovery-testing">회복 테스트 (Recovery Testing)</h2>
<p>: 시스템에 고의로 실패를 유도하고 시스템의 정상적 복귀 여부를 테스트하는 기법</p>
<h2 id="안전-테스트-security-testing">안전 테스트 (Security Testing)</h2>
<p>: 불법적인 소프트웨어가 접근하여 시스쳄을 파괴하지 못하도록 소스 코드 내의 보안적인 결함을 미리 점검하는 테스트 기법</p>
<h2 id="성능-테스트-performance-testing">성능 테스트 (Performance Testing)</h2>
<p>: 사용자의 이벤트에 시스템이 응답하는 시간, 특정 시간 내에 처리하는 업무량, 사용자 요구에 시스템이 반응하는 속도 등을 측정하는 테스트 기법</p>
<ul>
<li>부하 테스트</li>
<li>강도 테스트</li>
<li>스파이크 테스트</li>
<li>내구성 테스트<h2 id="구조-테스트-structure-testing">구조 테스트 (Structure Testing)</h2>
: 시스템의 내부 논리 경로, 소스 코드의 복잡도를 평가하는 테스트 기법<h2 id="회귀-테스트-regressing-testing">회귀 테스트 (Regressing Testing)</h2>
: 오류를 제거하거나 수정한 시스템에서 오류 제거와 수정에 의해 새로이 유입된 오류가 없는지 확인하는 일종의 반복 테스트 기법</li>
</ul>
<h2 id="병행-테스트-parallel-testing">병행 테스트 (Parallel Testing)</h2>
<p>: 변경된 시스템과 기존 시스템에 동일한 데이터를 입력 후 결과를 비교하는 테스트 기법</p>
<p><br></br></p>
<hr>
<h1 id="테스트-케이스">테스트 케이스</h1>
<blockquote>
<p>특정 요구사항에 준수하는 지를 확인하기 위해 개발된 입력값, 실행 조건, 예상된 결과의 집합</p>
</blockquote>
<h2 id="절차">절차</h2>
<ol>
<li>테스트 계획검토 및 자료 확보</li>
<li>위험평가 및 우선순위 결정</li>
<li>테스트 요구사항 정의</li>
<li>테스트 구조 설계 및 테스트 방법 결정</li>
<li>테스트 케이스 정의 및 작성</li>
<li>테스트 메이스 타장성 확인 및 유지보수</li>
</ol>
<h2 id="필요-항목">필요 항목</h2>
<h3 id="공통-작성-항목-요소">공통 작성 항목 요소</h3>
<ul>
<li>테스트 단계명, 작성자, 승인자, 작성 일자, 문서 버전</li>
<li>대상 시스템</li>
<li>변경 여부</li>
<li>테스트 범위</li>
<li>테스트 조직<h3 id="개별-테스트-케이스-항목요소">개별 테스트 케이스 항목요소</h3>
</li>
<li>테스트 ID</li>
<li>테스트 목적</li>
<li>테스트할 기능</li>
<li>테스트 데이터(=입력 데이터)</li>
<li>예상 결과(=기대 결과)</li>
<li>테스트 환경</li>
<li>테스트 조건(=전체 조건)</li>
<li>성공/실패 기준</li>
<li>기타 요소
<br></br></li>
</ul>
<hr>
<h1 id="테스트-오라클">테스트 오라클</h1>
<blockquote>
<p>테스트의 결과가 참인지 거짓인지를 판단하기 위해서 사전에 정의된 참값을 입력하여 비교하는 기법</p>
</blockquote>
<h2 id="유형-3">유형</h2>
<h3 id="참-true-오라클">참 (True) 오라클</h3>
<p>: 모든 입력값에 대하여 기대하는 결과를 생성함으로써 발생된 오류를 모두 검출할 수 있는 오라클</p>
<h3 id="샘플링-sampling-오라클">샘플링 (Sampling) 오라클</h3>
<p>: 특정한 몇 개의 입력값에 대해서만 기대하는 결과를 제공해 주는 오라클</p>
<h3 id="휴리스틱-heuristic-오라클">휴리스틱 (Heuristic) 오라클</h3>
<p>: 샘플링 오라클을 개선한 오라클로 특정 입력값에 대해 올바를 결과를 제공하고 나머지 값들에 대해서는 추정으로 처리하는 오라클</p>
<h3 id="일관성-검사-consistent-오라클">일관성 검사 (Consistent) 오라클</h3>
<p>: 애플리케이션 변경이 있을 때, 수행 전과 후의 결괏값이 동일한지 확인하는 오라클
<br></br></p>
<hr>
<h1 id="테스트-레벨">테스트 레벨</h1>
<blockquote>
<p>함계 편성되고 관리되는 테스트 활동의 그룹</p>
</blockquote>
<h2 id="종류-2">종류</h2>
<h3 id="단위-테스트">단위 테스트</h3>
<p>: 사용자 요구사항에 대한 단위 모듈, 서브루틴 등을 테스트하는 단계</p>
<ul>
<li>자료 구조 테스트, 실행 경로 테스트, 오류 처리 테스트, 인터페이스 테스트<h3 id="통합-테스트">통합 테스트</h3>
: 단위 테스트를 통과한 모듈 사이의 인터페이스 / 통합된 컴포넌트 간의 상호 작용을 검증하는 테스트 단계</li>
<li>빅뱅 테스트, 샌드위치 테스트, 상향식 테스트, 하향식 테스트<h3 id="시스템-테스트">시스템 테스트</h3>
: 통합된 단위 시스템의 기능이 시스템에서 정상적으로 수행되는지를 검증하는 테스트 단계</li>
<li>기능/비기능 요구사항 테스트<h3 id="인수-테스트">인수 테스트</h3>
: 계약상의 요구사항이 만족되었는지 확인하기 위한 테스트 단계</li>
<li>최종 사용자와 업무의 이해관계자 등이 테스트를 수행함으로써 개발된 제품에 대해 운영 여부를 결정하는 테스트</li>
<li>계약 인수, 규정 인수, 사용자 인수, 운영상의 인수, 알파/베타 테스트<h4 id="알파테스트">알파테스트</h4>
: 선택된 사용자가 개발자 환경에서 통제된 상태로 개발자와 함께 수행하는 인수 테스트<h4 id="베타-테스트">베타 테스트</h4>
: 실제 환경에서 일정 수의 사용자에게 대상 소프트웨어를 사용하게 하고 피드백을 받는 인수 테스트
<br></br></li>
</ul>
<hr>
<h1 id="정규화">정규화</h1>
<blockquote>
<p>관계형 데이터 모델에서 데이터의 중복성을 제거하여 이상 현상을 방지하고 데이터의 일관성과 정확성을 유지하기 위해 무손실 분해하는 과정</p>
</blockquote>
<h2 id="이상현상">이상현상</h2>
<blockquote>
<p>데이터의 중복성으로 인해 릴레이션을 조작할 떄 발생하는 비합리적 현상</p>
</blockquote>
<h3 id="삽입-이상">삽입 이상</h3>
<p>: 정보 저장 시 해당 정보의 불필요한 세부정보를 입력해야 하는 경우</p>
<h3 id="삭제-이상">삭제 이상</h3>
<p>: 정보 삭제 시 원치 않는 다른 정보가 같이 삭제되는 경우</p>
<h3 id="갱신-이상">갱신 이상</h3>
<p>: 중복 데이터 중에서 특정 부분만 수정되어 중복된 값이 모순을 일으키는 경우</p>
<p><br></br></p>
<hr>
<h1 id="함수-종속fd">함수 종속(FD)</h1>
<blockquote>
<p>릴레이션에서 속성의 의미와 속성 간 상호관계로부터 발생하는 제약조건</p>
</blockquote>
<h2 id="부분-함수-종속-partial-functional-dependency">부분 함수 종속 (Partial Functional Dependency)</h2>
<p>: 릴레이션에서 기본 키가 복합 키일 경우 기본 키를 구성하는 속성 중 일부에게 종속된 경우</p>
<h2 id="완전-함수-종속-full-functioanl-dependency">완전 함수 종속 (Full Functioanl Dependency)</h2>
<p>: 릴레이션에서 &#39;결정자-&gt;종속자&#39;관계가 있을 때 종속자는 결정자의 전체 속성에 대해 종속하고 부분 집합 속성에 종속하지 않는 경우</p>
<h2 id="이행-함수-종속-transitive-functional-dependency">이행 함수 종속 (Transitive Functional Dependency)</h2>
<p>: 릴레이션에서 &#39;결정자-&gt;종속자&#39; , &#39;종속자-&gt;Z&#39; 종속관계가 있을 때 &#39;결정자-&gt;Z&#39;가 성립되는 경우</p>
<p><br></br></p>
<hr>
<h1 id="반정규화">반정규화</h1>
<blockquote>
<p>정규화된 엔터티, 속성, 관계에 대해 성능 향상과 개발 운영의 단순화를 위해 중복, 통합, 분리 등을 수행하는 데이터 모델링의 기법</p>
</blockquote>
<table>
<thead>
<tr>
<th><strong>장점</strong></th>
<th><strong>단점</strong></th>
</tr>
</thead>
<tbody><tr>
<td>반 정규화된 데이터 구조는 성능 향상과 관리의 효율성이 증가</td>
<td>데이터의 일관성 및 정합성 저하 <br> 유지를 위한 비용이 별도로 발생하여 성능에 나쁜 영향을 미칠 수 있음</td>
</tr>
<tr>
<td>## 반정규화 기법</td>
<td></td>
</tr>
<tr>
<td>- 테이블 병합</td>
<td></td>
</tr>
<tr>
<td>: 조인 횟수를 줄여 성능향상</td>
<td></td>
</tr>
<tr>
<td>- 테이블 분할</td>
<td></td>
</tr>
<tr>
<td>: 파티셔닝</td>
<td></td>
</tr>
<tr>
<td>- 중복 테이블 추가</td>
<td></td>
</tr>
<tr>
<td>: 집계함수를 사용</td>
<td></td>
</tr>
<tr>
<td>- 컬럼 중복화</td>
<td></td>
</tr>
<tr>
<td>: 조인 성능 향상을 위한 중복 허용</td>
<td></td>
</tr>
<tr>
<td>- 중복관계 추가</td>
<td></td>
</tr>
<tr>
<td>: 성능 저하를 예방하기 위해 추가적 관계를 맺는 방법</td>
<td></td>
</tr>
</tbody></table>
<p><br></br></p>
<hr>
<h1 id="공통-모듈-구현">공통 모듈 구현</h1>
<blockquote>
<p>소프트웨어 개발에 있어 기능을 분할하고 추상화하여 성능을 향상시키고 유지보수를 효과적으로 하기위한 공통 컴포넌트 구현 기법</p>
</blockquote>
<ul>
<li>인터페이스 모듈, 데이터베이스 접근 모듈 등 필요한 공통 모듈을 구현</li>
<li>오듈 간의 결합도는 줄이고 응집도는 높인 공통 모듈 구현을 권장</li>
</ul>
<h2 id="응집도">응집도</h2>
<blockquote>
<p>모듈의 <strong>독립성</strong>을 나타내는 정도로 모듈 내부 구성요소 간 연관정도</p>
</blockquote>
<ul>
<li>하나의 모듈은 하나의 기능을 수행할수록 응집도가 높다.</li>
</ul>
<h3 id="유형-우-논-시-절-통-순-기">유형 [우 논 시 절 통 순 기]</h3>
<p><strong>우연적 응집도(Coincidental Cohesion)</strong>
: 모듈 내부의 각 구성ㅇ요소가 연관이 없을 경우의 응집도</p>
<p><strong>논리적 응집도(Logical  Cohesion)</strong>
: 유사한 성격을 갖거나 특정 형태로 분류되는 처리 요소들이 한 모듈에서 처리되는 경우의 응집도</p>
<p><strong>시간적 응집도(Temporal Cohesion)</strong>
: 특정 시간에 처리되어야 하는 활동들을 한 모듈에서 처리할 경우의 응집도</p>
<p><strong>절차적 응집도(Procedural  Cohesion)</strong>
: 모듈이 다수의 관련 기능을 가질 때 모듈 안의 구성요소들이 그 기능을 순차적으로 수행할 경우의 응집도</p>
<p><strong>통신적 응집도(Communication  Cohesion)</strong>
: 동일한 입출력을 사용하여 다른 기능을 수행하는 활동들이 모여있을 경우의 응집도</p>
<p><strong>순차적 응집도(Sequential  Cohesion)</strong>
: 모듈 내에서 한 활동으로부터 나온 출력값을 다른 활동이 사용할 경우의 응집도</p>
<p><strong>기능적 응집도(Functional  Cohesion)</strong>
: 모듈 내부의 모든 기능이 단일한 목적을 위해 수행되는 경우의 응집도</p>
<br>

<h2 id="결합도">결합도</h2>
<blockquote>
<p>소프트웨어 구조에서 모듈 간의 관련성을 측정하는 척도</p>
</blockquote>
<ul>
<li>모듈 내부가 아닌 외부의 모듈과의 연관도 또는 모듈 간의 상호의존성</li>
</ul>
<h3 id="유형-내-공-외-제-스-자">유형 [내 공 외 제 스 자]</h3>
<p><strong>내용 결합도(Content  Coupling)</strong>
: 다른 모듈 내부에 있는 변수나 기능을 다른 모듈에서 사용하는 경우의 결합도</p>
<ul>
<li>하나의 모듈이 직접적으로 다른 모듈의 내용을 참조할 때 두 모듈은 내뇬적으로 결합되어 있는 경우의 결합도</li>
</ul>
<p><strong>공통 결합도(Common  Coupling)</strong>
: 파라미터가 아닌 모듈 밖에 선언되어 있는 전역 변수를 참조하고 전역 변수를 갱신하는 식으로 상호 작용하는 경우의 결합도</p>
<ul>
<li>공유되는 공통 데이터 영역을 여러 모듈이 사용할 때의 결합도</li>
</ul>
<p><strong>외부 결합도(External  Coupling)</strong>
: 두 개의 모듈이 외부에서 도입된 데이터 포맥, 통신 프로토콜 또는 디바이스 인터페이스를 공유할 경우의 결합도</p>
<ul>
<li>외부 모듈에서 선언한 데이터(변수)를 외부의 다른 모듈에서 참조할 때의 결합도</li>
</ul>
<p><strong>제어 결합도(Control  Coupling)</strong>
: 어떤 모듈이 다른 모듈의 내부 논리 조직을 제어하기 위한 목적으로 제어신호를 이용하여 통신하는 경우의 결합도</p>
<ul>
<li>하위 모듈에서 상위 모듈로 제어 신호가 이동하여 상위 모듈에게 처리 명령을 부여하는 권리 전도 현상이 발생하는 결합도</li>
</ul>
<p><strong>스탬프 결합도(Stamp Coupling)</strong>
: 모듈 간의 인터페이스로 배열이나 객체, 구조 등이 전달되는 경우의 결합도</p>
<ul>
<li>두 모듈이 동일한 자료 구조를 조회하는 경우의 결합도이며 자료 구조의 어떠한 변화는 모든 모듈에 영향을 미치게 됨</li>
</ul>
<p><strong>자료 결합도(Data  Coupling)</strong>
: 모듈 간의 인터페이스로 전달되는 파라미터를 통해서만 모듈간의 상호 작용이 일어나는 경우의 결합도</p>
<ul>
<li>한 모듈의 내용을 변경하더라도 다른 모듈에는 영향을 미치지 않는 상태로 가장 바람직한 결합도</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="공통-모듈-테스트">공통 모듈 테스트</h1>
<ul>
<li>IDE 도구를 활용하여 개별 공통 모듈에 대한 디버깅을 수행</li>
<li>화이트박스 기법을 활용</li>
<li>대표적인 단위 테스트 도구인 <strong>xUnit</strong>을 활용하여 테스트 코드를 구현</li>
</ul>
<h2 id="종류-3">종류</h2>
<table>
<thead>
<tr>
<th><strong>종류</strong></th>
<th><strong>설명</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>jUnit</strong></td>
<td>자바 프로그래밍 언어용 단위 테스트 도구 <br>JAVA 단위 테스트 프레임워크</td>
</tr>
<tr>
<td><strong>CppUnit</strong></td>
<td>자바의 jUnit을 C++로 구현한 단위 테스트 도구</td>
</tr>
<tr>
<td><strong>HttpUnit</strong></td>
<td>웹 브라우저 없이 웹사이트 테스트를 수행하는 단위 테스트 도구</td>
</tr>
<tr>
<td><br></br></td>
<td></td>
</tr>
</tbody></table>
<hr>
<h1 id="릴리즈-노트">릴리즈 노트</h1>
<blockquote>
<p>최종 사용자인 고객에게 개발 과정에서 정리된 제품의 릴리즈 정보를 제공하는 문서</p>
</blockquote>
<ul>
<li>릴리즈 정보는 상세 서비스 정보를 포함하여 제품의 수정, 변경, 개선하는 일련의 작업들에 대한 정보이며 릴리즈 노트를 통해 제공된다.</li>
</ul>
<h2 id="릴리즈-노트-작성-항목">릴리즈 노트 작성 항목</h2>
<h3 id="헤더">헤더</h3>
<p>: 문서이름, 제품 이름, 버전 번호, 릴리즈 날짜 등의 정보</p>
<h3 id="개요">개요</h3>
<p>: 제품 및 변경에 대한 간략한 전반적 개요</p>
<h3 id="목적">목적</h3>
<p>: 릴리스 버전의 새로운 기능목록과 릴리스 노트의 목적에 대한 개요, 버그수정 및 새로운 기능 기술</p>
<h3 id="이슈-요약">이슈 요약</h3>
<p>: 버그의 간단한 설명 또는 릴리즈 추가 항목 요약</p>
<h3 id="재현-항목">재현 항목</h3>
<p>: 버그 발견에 따른 재현 단계 기술</p>
<h3 id="수정개선-내용">수정/개선 내용</h3>
<p>: 수정/개선의 간단한 설명 기술</p>
<h3 id="사용자-영향도">사용자 영향도</h3>
<p>: 버전 변경에 따른 최종 사용자 기준의 기능 및 응용 프로그램상의 영향도 기술</p>
<h3 id="소프트웨어-지원-영향도">소프트웨어 지원 영향도</h3>
<p>: 버전 변경에 따른 소프트웨어의 지원 프로세스 및 영향도 기술</p>
<h3 id="노트">노트</h3>
<p>: 소프트웨어 및 하드웨어 설치 항목, 제품, 문서를 포함한 업그레이드 항목 메모</p>
<h3 id="면책-조항">면책 조항</h3>
<p>: 회사 및 표준 제품과 관련된 메시지, 프리웨어 및 불법 복제 방지, 붕복 등 참조에 대한 고지 사항</p>
<h3 id="연락-정보">연락 정보</h3>
<p>: 사용자 지원 및 문의에 관련한 연락처 정보</p>
<p><br></br></p>
<hr>
<h1 id="osi-7계층">OSI 7계층</h1>
<blockquote>
<p>네트워크 통신에서 생긴 여러 가지 충돌 문제를 완화하기 위해 국제 표준화 기구에서 제시한 네트워크 기본 모델</p>
</blockquote>
<h2 id="7-응용계층-application">7. 응용계층 (Application)</h2>
<p>: 사용자와 네트워크 간 응용서비스 연결, 데이터 생성</p>
<ul>
<li><strong>프로토콜</strong> 
: HTTP, FTP</li>
<li>데이터 전송 단위</li>
</ul>
<h2 id="6-표현계층-presentaion">6. 표현계층 (Presentaion)</h2>
<p>: 데이터 형식 설정과 부호교환, 암/복호화</p>
<ul>
<li><strong>프로토콜</strong> 
: JPEG, MPEG</li>
<li>데이터 전송 단위</li>
</ul>
<h2 id="5-세션계층-session">5. 세션계층 (Session)</h2>
<p>: 연결접속 및 동기제어</p>
<ul>
<li><strong>프로토콜</strong> 
: SSH, TLS</li>
<li>데이터 전송 단위</li>
</ul>
<h2 id="4-전송-계층-transport">4. 전송 계층 (Transport)</h2>
<p>: 신뢰성 있는 통신 보장 / 데이터 분할과 재조립, 흐름 제어, 오류 제어 혼잡제어 등을 담당</p>
<ul>
<li><strong>프로토콜</strong> 
: TCP, UDP</li>
<li>세그먼트 전송 단위</li>
</ul>
<h2 id="3-네트워크-계층-network">3. 네트워크 계층 (Network)</h2>
<p>: 단말기 간 데이터 전송을 위한 최적화된 경로 제공</p>
<ul>
<li><p><strong>프로토콜</strong> 
: IP, ICMP, 라우팅 프로토콜</p>
</li>
<li><p>패킷 전송 단위</p>
<h3 id="네트워크-프로토콜">네트워크 프로토콜</h3>
</li>
<li><p>IP (Internet Protocol)
  : 송수신 간의 패킷 단위로 데이터를 교환하는 네트워크에서 정보를 주고받는데 사용하는 통신 프로토콜</p>
</li>
<li><p>ARP (Address Resolution Protocol)
  : IP 네트워크상에서 IP주소를 MAC주소(물리주소)로 변환하는 프로토콜</p>
</li>
<li><p>RARP (Reverse Address Resolution Protocol)
  : IP호스트가 자신의 물리 네트워크 주소(MAC)는 알지만 IP주소를 모르는 경우 서버로부터 IP주소를 요청하기 위해 사용하는 프로토콜</p>
<ul>
<li>MAC주소에 해당하는 IP주소를 알려주는 역순 주소 결정 프로토콜</li>
</ul>
</li>
<li><p>ICMP (Internet Control Message Protocol)
  : IP의 동작 과정에서의 전송 오류가 발생하는 경우에 오류 정보를 전송하는 목적으로 사용하는 프로토콜</p>
<ul>
<li>메시지 형식은 8바이트의 헤더와 가변 길이의 데이터 영역으로 분리</li>
<li>수신지 도달 불가 메시지는 수신지 또는 서비스에 도달할 수 없는 호스트를 통지하는데 사용</li>
<li>ICMP 프로토콜을 사용해서 핑 유틸리티의 구현을 통해 오류가 발생했음을 알리는 기능을 수행</li>
</ul>
</li>
<li><p>IGMP (Internet Group Management Protocol)
  : 인터넷 그룹 관리 프로토콜은 호스트 컴퓨터와 인접 라우터가 멀치캐스트 그룹 멤버십을 구성하는데 사용하는 통신 프로토콜</p>
<ul>
<li>화상회의, IPTV에서 활용</li>
<li>기능 : 그룹 가입, 멤버십 감시/응답/탈퇴</li>
</ul>
</li>
<li><p>라우팅 프로토콜 (Routing Protocol)
  : 데이터 전송을 위해 목적지까지 갈 수 있는 여러 경로 중 최적의 경로를 설정해주는 라우터 간의 상호 통신 프로토콜</p>
<ul>
<li>OSPF(Open Shortest Path First)
: 규모가 크고 복잡한 네트워크에서 RIP의 단점을 개선하기 위해 자신을 기준으로 링크 상태 알고리즘을 적용하여 최단 경로를 찾는 라우팅 프로토콜</li>
</ul>
</li>
</ul>
<h2 id="2-데이터-링크-계층-datalink">2. 데이터 링크 계층 (DataLink)</h2>
<p>: 인접 시스템 간 데이터 전송, 전송오류 제어 / 동기화, 흐름제어 등의 전송 기능 제공 / 오류 검출, 재전송 등 기능 제공</p>
<ul>
<li><strong>프로토콜</strong> 
: 이더넷</li>
<li>프레임 전송단위</li>
</ul>
<h2 id="1-물리-계층-physical">1. 물리 계층 (Physical)</h2>
<p>: 0과 1의 비트 정보를 회선에 보내기 위한 전기적 신호 변환</p>
<ul>
<li><strong>프로토콜</strong> 
: RS-232C</li>
<li>비트 전송단위</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="ipv4">IPv4</h1>
<blockquote>
<p>인터넷에서 사용되는 패킷 교환 네트워크상에서 데이터를 교환하기 위한 32비트 주소체계를 갖는 네트워크 계층의 프로토콜</p>
</blockquote>
<h2 id="헤더-1">헤더</h2>
<blockquote>
<p>IP패킷의 앞부분에서 주소 등 각종 제어정보를 담고 있는 부분</p>
</blockquote>
<ul>
<li>옵션 미지정시 최소 20바이트 이상<h2 id="주소체계">주소체계</h2>
</li>
<li>10진수로 총 12자리이며 4부분으로 나뉜다</li>
<li>각 부분은 0~255까지 3자리의 수로 표현</li>
<li>Network를 나타내는 부분과 Host를 나타내는 부분으로 서브넷 마스크로 구분한다.
<br></br></li>
</ul>
<hr>
<h1 id="서브네팅">서브네팅</h1>
<blockquote>
<p>IP 주소 고갈문제를 해결하기 위해 원본 네트워크를 여러 개의 네트워크로 분리하는 과정</p>
</blockquote>
<ul>
<li>대표 <strong>네트워크 IP주소</strong>일 경우 호스트 ID는 2진수 기준으로 모두 0을 넣고 <strong>브로드캐스트 IP주소</strong>일 경우 호스트 ID는 2진수 기준으로 모두 1을 넣는다.</li>
</ul>
<h2 id="종류-4">종류</h2>
<h3 id="flsm-fixed-length-subnet-masking">FLSM (Fixed-Length Subnet Masking)</h3>
<p>: 한 대역을 동일한 크기로 나누는 방식</p>
<ul>
<li>서브넷의 길이를 고정적으로 사용<h3 id="vlsm-variable-length-subnet-masking">VLSM (Variable Length Subnet Masking)</h3>
: 한 대역을 다양한 크기로 나누는 방식</li>
<li>서브넷의 길이를 가변적으로 사용
<br></br></li>
</ul>
<hr>
<h1 id="ipv6">IPv6</h1>
<blockquote>
<p>인터넷 프로토콜 스택 중 네트워크 계층의 프로토콜로서 버전 6 인터넷 프로토콜로 제정된 차세대 인터넷 프로토콜</p>
</blockquote>
<ul>
<li>128 bit 주소체계를 갖는 차세대 인터넷 프로토콜<h2 id="특징">특징</h2>
</li>
<li>IP주소의 확장</li>
<li>이동성</li>
<li>인증 및 보안 기능</li>
<li>개선된 QoS 지원</li>
<li>Plug &amp; Play 지원</li>
<li>Ad-hoc 네트워크 지원</li>
<li>단순 헤더 적용</li>
<li>실시간 패킷 추적 가능
<br></br></li>
</ul>
<hr>
<h1 id="패킷-교환-방식">패킷 교환 방식</h1>
<blockquote>
<p>데이터를 패킷 단위로 보내는 방식</p>
</blockquote>
<h2 id="종류-5">종류</h2>
<h3 id="데이터그램-방식">데이터그램 방식</h3>
<p>: 연결 경로를 확립하지 않고 각가의 패킷을 순서에 무관하게 독립적으로 전송하는 방식</p>
<ul>
<li>각각의 패킷을 독립적으로 취급하는 방식으로 어떠한 결과와도 관계가 없는 단일 패킷 단위로 전송하고 수신</li>
<li>헤어를 붙여서 개별적으로 전달하는 비연결형 교환 방식<h3 id="가상-회선-방식">가상 회선 방식</h3>
: 패킷이 전송되기 전에 송/수신 스테이션 간의 논리적인 통신 경로를 미리 설정하는 방식</li>
<li>많은 이용자들이 상호 통신을 할 때 하나의 통신설비를 공유하여 여러 개의 논리적인 태널을 확정한 후 통신을 할 수 있는 방식</li>
<li>목적지 호스트와 미리 연결 후 통신하는 연결형 교환 방식</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="애드-훅-네트워크">애드 훅 네트워크</h1>
<blockquote>
<p>노드들에 의해 자율적으로 구성되는 기반 구조가 없는 네트워크</p>
</blockquote>
<ul>
<li>네트워크의 구성 및 유지를 위해 기지국 같은 기반 네트워크 장치를 필요로 하지 않는 네트워크</li>
<li>노드들은 무선 인터페이스를 사용하여 통신하고 멀티 홉 라우팅 기능에 의해 무선 인터페이스가 가지는 통신 거리상의 제약을 극복하며 노드들의 이동이 자유롭기 때문에 네트워크 토폴로지가 동적으로 변화되는 특징</li>
<li>애드 훅 네트워크는 완전 독립형이 될 수도 있고 인터넷 게이트웨이를 거쳐 인터넷과 같은 기반 네트워크와 연동될 수 있다.</li>
<li>긴급 구조, 긴급 회의, 군사 네트워크
<br></br></li>
</ul>
<hr>
<h1 id="db-관련-신기술-용어">DB 관련 신기술 용어</h1>
<h2 id="하둡-hadoop">하둡 (Hadoop)</h2>
<p>: 오픈 소스를 기반으로 한 분산 컴퓨팅 플랫폼</p>
<ul>
<li>일반 PC급 컴퓨터들로 가상화된 대형 스토리지를 형성하고 그 안에 보관된 거대한 데이터 세트를 병렬로 처리할 수 있도록 개발된 자바 소프트웨어 프레임워크 (구글, 야후)<h2 id="hdfs-hadoop-distributed-file-system">HDFS (Hadoop Distributed File System)</h2>
: 대용량 파일을 분산된 서버에 저장하고 그 저장된 데이터를 빠르게 처리할 수 있게 하는 하둡 파일 시스템<h2 id="맵-리듀스-map-reduce">맵 리듀스 (Map Reduce)</h2>
: 구글에서 대용량 데이터를 분산 병렬 컴퓨팅에서 처리하기 위한 목적으로 제작하여 2004년에 발표한 소프트웨어</li>
<li>여러 언어에서 적용이 가능하도록 작성</li>
<li>아파치 하둡으로 대표되는 소프트웨어 프레임워크<h2 id="스쿱-sqoop">스쿱 (Sqoop)</h2>
: 커넥터를 사용하여 RDBMS에서 HDFS로 데이터를 수집하는 기술<h2 id="nosql-not-only-sql">NoSQL (Not Only SQL)</h2>
: 전통적인 RDBMS와 다른 DBMS를 지칭하기 위한 용어로 데이터 저장에 고정된 테이블 스키마가 필요하지 않고 조인 연산을 사용할 수 없으며 수평적으로 확장이 가능한 DBMS<h2 id="다크-데이터-dark-data">다크 데이터 (Dark Data)</h2>
: 수집된 후 저장은 되어 있지만 분석에 활용되지는 않는 대량의 데이터<h2 id="데이터-마이닝-data-mining">데이터 마이닝 (Data Mining)</h2>
: 빅데이터 분석 기술 중 대량의 데이터를 분석하여 데이터 속에 있는 변수 사이의 상호관계를 규명하여 일정한 패턴을 찾아내는 기법<h2 id="데이터-웨어하우스-dw--data-warehouse">데이터 웨어하우스 (DW / Data Warehouse)</h2>
: 사용자의 의사 결정에 도움을 주기 위하여 기간 시스템의 데이터베이스에 축적된 데이터를 공통 형식으로 변환해서 관리하는 데이터베이스<h2 id="데이터-마트-dm--data-mart">데이터 마트 (DM / Data Mart)</h2>
: 데이터 웨어하우스 환경에서 정의된 접근계층으로 데이터 웨어하우스에서 데이터를 꺼내 사용자에게 제공하는 역할</li>
<li>데이터 웨어하우스의 부분이며 대개 특정한 조직 혹은 팀에서 사용하는 것을 목적으로 함<h2 id="메타-데이터-meta-data">메타 데이터 (Meta Data)</h2>
: 데이터에 대한 구조적인 데이터로서 일련의 데이터를 정의하고 설명해 주는 데이터이고 구축할 정보 자원을 기술하는 데이터<h2 id="디지털-아카이빙-digital-archiving">디지털 아카이빙 (Digital Archiving)</h2>
: 지속적으로 보존할 가치를 가진 디지털 객체를 장기간 관리하여 이후의 이용을 보장할 수 있도록 변환, 압축 저장하여 DB화하는 작업<h2 id="마이-데이터-mydata">마이 데이터 (MyData)</h2>
: 정보 주체가 기관으로부터 자기 정보를 직접 내려받아 이용하거나 제3자와 제공을 허용하는 방식으로 정보 주체 중심의 데이터 활용체계</li>
<li>개인이 정보 관리의 주체가 되어 능동적으로 본인의 정보를 관리하고 본인의 의지에 따라 신용 및 자산관리 등에 정보를 활용하는 일련의 과정<h2 id="스크래파이-scrapy">스크래파이 (Scrapy)</h2>
: 웹 사이트를 크롤링하여 구조화된 데이터를 수집하는 파이썬 기반의 애플리케이션 프레임워크
<br></br></li>
</ul>
<hr>
<h1 id="애플리케이션-성능-측정-지표">애플리케이션 성능 측정 지표</h1>
<h2 id="처리량">처리량</h2>
<ul>
<li>애플리케이션이 주어진 시간에 처리할 수 있는 트랜잭션의 수</li>
<li>웹 애플리케이션의 경우 시간당 페이지 수로 표현<h2 id="응답-시간">응답 시간</h2>
</li>
<li>사용자 입력이 끝난 후 애플리케이션의 응답 출력이 개시될 때까지의 시간</li>
<li>애플리케이션의 경우 메뉴 클릭 시 해당 메뉴가 나타나기까지 걸리는 시간<h2 id="경과-시간">경과 시간</h2>
</li>
<li>애플리케이션에 사용자가 요구를 입력한 시점부터 트랜잭션을 처리 후 그 결과의 출력이 완료할 때까지 걸리는 시간<h2 id="자원-사용률">자원 사용률</h2>
</li>
<li>애플리케이션이 트랜잭션을 처리하는 동안 사용하는 CPU사용량, 메모리 사용량, 네트워크 사용량</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="비즈니스-연속성-계획">비즈니스 연속성 계획</h1>
<blockquote>
<p>각종 재해, 장애, 재난으로부터 위기관리를 기본으로 비즈니스 연속성을 보장하는 체계</p>
</blockquote>
<h2 id="bia-business-impacy-analysis">BIA (Business Impacy Analysis)</h2>
<p>: 장애나 재해로 인해 운영상의 주요 손실을 볼 것을 가정항 시간 흐름에 따른 영향도 및 손실평가를 조사하는 BCP를 구축하기 위한 비느지스 영향 분석</p>
<h2 id="rto-recovery-time-objective">RTO (Recovery Time Objective)</h2>
<p>: 업무중단 시점부터 업무가 복귀되어 다시 가동될 때까지의 시간</p>
<ul>
<li>재해 시 복구 <strong>목표 시간</strong>의 선정</li>
</ul>
<h2 id="rpo-recovery-point-objective">RPO (Recovery Point Objective)</h2>
<p>: 업무중단 시점부터 데이터가 복구되어 다시 정상가동될 때 데이터의 손실 허용 시점</p>
<ul>
<li>재해 시 복구 <strong>목표 지점</strong>의 선정</li>
</ul>
<h2 id="drp-disaster-recovery-plan">DRP (Disaster Recovery Plan)</h2>
<p>: 재난으로 장기간에 걸쳐 시설의 운영이 불가능한 경우를 대비한 재난 복구 계획</p>
<h2 id="drs-disaster-recovery-system">DRS (Disaster Recovery System)</h2>
<p>: 재해복구계획의 원활한 수행을 지원하기 위하여 평상시에 확보하여 두는 인적, 물적 자원 및 이들에 대한 지속적인 관리체계가 통합된 재해복구센터</p>
<h3 id="mirror-site">Mirror Site</h3>
<ul>
<li>RTO는 즉시(0)<h3 id="hot-site">Hot Site</h3>
</li>
<li>RTO는 4시간 이내<h3 id="warm-site">Warm Site</h3>
</li>
<li>RTO는 수일 ~ 수주<h3 id="cold-site">Cold Site</h3>
</li>
<li>RTO는 수주 ~ 수개월</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="보안-공격-대응-관련-용어">보안 공격 대응 관련 용어</h1>
<h2 id="허니팟-honeypot">허니팟 (Honeypot)</h2>
<p>: 비정상적인 접근을 탐지하기 위해 의도적으로 설치해 둔 시스템으로 일부러 허술하게 만들어서 해커에게 노출하는 유인시스템</p>
<h2 id="owasp-top-10">OWASP Top 10</h2>
<p>: 웹 애플리케이션 취약점 중 공격 빈도가 높으며 보안상 큰 영향을 줄 수 있는 10가지 취약점에 대한 대응 방안을 제공하는 웹 보안 기술 가이드</p>
<h2 id="핑거프린팅-finger-printing">핑거프린팅 (Finger Printing)</h2>
<p>: 멀티미디어 콘텐츠에 저작권 정보와 구매한 사용자 정보를 삽입하여 콘텐츠 불법 배포자에 대한 위치 추적이 가능한 기술(저작권 정보구매가 정보)</p>
<h2 id="워터마킹-water-marking">워터마킹 (Water Marking)</h2>
<p>: 디지털 콘텐츠에 저작권자 정보를 삽입하여 불법 복제 시 워터마크를 추출, 원소류자를 증명할 수 있는 콘텐츠 보호 기술</p>
<h2 id="이상금융거래탐지시스템-fds--fraud-detecrion-system">이상금융거래탐지시스템 (FDS / Fraud Detecrion System)</h2>
<p>: 전자금융거래에 사용되는 단말기 정보, 접속 정보, 거래 정보 등을 종합적으로 분석하여 의심 거래를 탐지하고 이상 거래를 차단하는 시스템</p>
<h2 id="cc-common-criteria">CC (Common Criteria)</h2>
<p>: 정보기술의 보안 기능과 보증에 대한 평가 기준(등급), 정보보호 시스템의 보안 기능 요구사항과 보증 요구사항 평가르 위해 공통으로 제공되는 국제 평가 기준</p>
<h2 id="사이버-위협정보-분석-공유시스템-c-tas--cyber-threats-analysis-system">사이버 위협정보 분석 공유시스템 (C-TAS / Cyber Threats Analysis System)</h2>
<p>: 사이버 위협정보를 체계적 수립해서 KISA 주관으로 관계 기관과 자동화된 정보공유를 할 수 있는 침해 예방 대응 시스템</p>
<h2 id="장착형-인증-모듈-pam--pluggable-authentication-module">장착형 인증 모듈 (PAM / Pluggable Authentication Module)</h2>
<p>: 리눅스 시스템 내에서 사용되는 각종 애플리케이션 인증을 위해 제공되는 다양한 인증용 라이브러리</p>
<h2 id="cve-common-vunerabilities-and-exposure">CVE (Common Vunerabilities and Exposure)</h2>
<p>: 미국 비 영리회사인 MITRE 사에서 공개적으로 알려진 소프트웨어의 보안취약점을 표준화한 식별자 목록</p>
<ul>
<li>규칙 : CVE - 연도 - 순서<h2 id="cwe-common-weakness-enumeration">CWE (Common Weakness Enumeration)</h2>
: 미국 비영리 회사인 MITRE 사가 중심이 되어 소프트웨어에서 공통적으로 발생하는 약점을 체계적으로 분류한 목록으로 소스 코드 취약점을 정의한 데이터베이스</li>
<li>소프트웨어 약점은 SDLC 과정에서 발생할 수 있기 때문에 설계, 아키텍처, 코드 단계 등에 대한 취약점 목록을 포함<h2 id="isms-information-security-management-system">ISMS (Information Security Management System)</h2>
: 조직의 주요 정보자산을 보호하기 위하여 정보보호 관리 절차와 과정을 체계적으로 수립하여 지속적으로 관리하고 운영하기 위한 종합적인 체계<h2 id="pims-personal-information-management-system">PIMS (Personal Information Management System)</h2>
: 기업이 개인정보보호 활동을 체계적/지속적으로 수행하기 위해 필요한 보호조치 체계를 구축했는지 여부를 점검, 평가하여 기업에게 부여하는 인증제도<h2 id="pia-privacy-impact-assessment">PIA (Privacy Impact Assessment)</h2>
: 개인정보를 활용하는 새로운 정보 시스템의 도입이나 개인정보 취급이 수반되는 기존 정보 시스템의 중대한 변경 시, 동 시스템의 구축/운영/변경 등이 프라이버시에 미치는 영향에 대하여 사전에 조사 및 예측, 검토하여 개선 방안을 도출하는 체계적인 절차<h2 id="tkip-temporal-key-integrity-protocol">TKIP (Temporal Key Integrity Protocol)</h2>
: 임시 키 무결성 프로토콜 / IEEE 802.11i 암호화 방식으로 초기 wifi장비에서 널리 사용되었던 안전하지 않은 WEP암호화 표준을 대체하기 위한 암호 프로토콜<h2 id="isms-p">ISMS-P</h2>
: ISMS와 PIMS로 개별 운영되던 인증체계를 하나로 통합한 통합인증제도</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="소프트웨어-개발-방법론">소프트웨어 개발 방법론</h1>
<blockquote>
<p>소프트웨어 개발 전 과정에 지속적으로 적용할 수 있는 방법, 절차, 기법</p>
</blockquote>
<h2 id="구조적-방법론">구조적 방법론</h2>
<p>: 전체 시스템을 기능에 따라 나누어 개발하고 이를 통합하는 분할과 정복 접근 방식의 방법론</p>
<h2 id="정보공학-방법론">정보공학 방법론</h2>
<p>: 정보시스템 개발에 필요한 관리 절차와 작업 기법을 체계화한 방법론</p>
<ul>
<li>개발주기를 이용해 대형 프로젝트를 수행하는 체계적인 방법론<h2 id="객체지향-방법론">객체지향 방법론</h2>
: 복잡한 현실 세계를 사람이 이해하는 방식으로 시스템에 적용하는 방법론<h2 id="컴포넌트-기반-방법론">컴포넌트 기반 방법론</h2>
: 소프트웨어를 구성하는 컴포넌트를 조립해서 하나의 새로운 응용 프로그램을 작성하는 방법론<h2 id="제품-계열-방법론">제품 계열 방법론</h2>
: 특정 제품에 젖용하고 싶은 공통된 기능을 정의하여 개발하는 방법론<h2 id="애자일-방법론-">애자일 방법론 **</h2>
: 절차보다는 사람이 중심이 되어 변황 유연하고 신속하게 적응하면서 효율적으로 시스쳄을 개발할 수 있는 신속 적응적 경량 개발 방법론</li>
<li>개발 기간이 짧고 신속하며 폭포수 모형에 대비되는 방법론</li>
<li>소프트웨어 개발 환경의 변화, 기존 개발 방법론의 한계를 극복하기 위해 등장</li>
</ul>
<blockquote>
<p><strong>XP</strong>
:의사소통 개선과 즉각적 피드백으로 소프트웨어 품질을 높이기 위한 방법론</p>
</blockquote>
<ul>
<li>1~3주의 반복 개발주기</li>
<li>5가지 가치와 12개의 실천항목
  &lt;5가지 가치&gt;<ul>
<li>용기</li>
<li>단순성</li>
<li>의사소통</li>
<li>피드백</li>
<li>존중
&lt;12가지 기본원리&gt;</li>
<li>짝 프로그래밍 (Pair Programming)</li>
<li>공통 코드 소유 (Collective Ownership)</li>
<li>지속적인 통합(CI)</li>
<li>계획 세우기</li>
<li>작은 릴리즈</li>
<li>메타포어
: 공통적인 이름 체계와 시스템 서술서를 통해 고객과 개발자 간의 의사소통을 원활하게 한다는 원리</li>
<li>간단한 디자인</li>
<li>테스트 기반 개발 (TDD)</li>
<li>리팩토링 </li>
<li>40시간 작업</li>
<li>고객 상주</li>
<li>코드 표준</li>
</ul>
</li>
</ul>
<blockquote>
<p><strong>스크럼(SCRUM)</strong>
: 매일 정해진 시간, 장소에서 짧은 시간의 개발을 하는 팀을 위한 프로젝트 관리 중심 방법론</p>
</blockquote>
<ul>
<li><code>백로그</code>를 나눈 후에 <code>스크럼 팀</code>을 구성하고 <code>스크럼 회의</code>를 거쳐 <code>스프린트</code>를 수행하고 <code>스프린트 회고</code>를 수행한다.</li>
</ul>
<blockquote>
<p><strong>린(LEAN)</strong>
: 도요타의 린 시스템 품질기법을 소프트웨어 개발 프로세스에 적용해서 낭비 요소를 제거하여 품질을 향상시킨 방법론
    &lt;7가지 원칙&gt;
    - 낭비제거
    - 품질 내재화
    - 지식 창출
    - 늦은 확정
    - 빠른 인조
    - 사람 존중
    - 전체 최적화</p>
</blockquote>
<p><br></br></p>
<hr>
<h1 id="객체-지향-설계-원칙-solid">객체 지향 설계 원칙 (SOLID)</h1>
<h2 id="단일-책임의-원칙-srp">단일 책임의 원칙 (SRP)</h2>
<p>: 하나의 클래스는 하나의 목적을 위해서 생성되며 클래스가 제공하는 모든 서비스는 하나의 책임을 수행하는 데 집중되어 있어야 한다는 원칙</p>
<ul>
<li>나머지 4원칙의 기초 원칙<h2 id="개방-폐쇄-원칙-ocp">개방 폐쇄 원칙 (OCP)</h2>
: 소프트웨어의 구성요소는 확장에는 열려있고 변경에는 닫혀있어야 한다는 원칙<h2 id="리스코프-치환의-원칙-lsp">리스코프 치환의 원칙 (LSP)</h2>
: 서브타입은 어디서나 자신의 기반타입으로 교체할 수 있어야 한다는 원칙<h2 id="인터페이스-분리의-원칙-isp">인터페이스 분리의 원칙 (ISP)</h2>
: 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말하야 한다는 원칙</li>
<li>객체 설꼐 시 특정 기능에 대한 인터페이스는 그 기능과 상관없는 부분이 변해도 영향을 받지 않아야 한다는 원칙<h2 id="의존성-역전의-원칙-dip">의존성 역전의 원칙 (DIP)</h2>
: 실제 사용 관계는 바뀌지 않으며 추상을 매개로 메시지를 주고받음으로써 관계를 최대한 느슨하게 만드는 원칙</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="데이터-모델">데이터 모델</h1>
<blockquote>
<p>현실 세계의 정보를 인간과 컴퓨터가 이해할 수 있도록 추상화하여 표현한 모델</p>
</blockquote>
<h2 id="데이터-모델-구성요소">데이터 모델 구성요소</h2>
<h3 id="연산-operation">연산 (Operation)</h3>
<p>: 데이터베이스에 저장된 실제 데이터를 처리하는 작업에 대한 명세</p>
<ul>
<li>릴레이션을 조작하기 위한 관계 연산을 나타냄<h3 id="구조-structure">구조 (Structure)</h3>
: 데이터베이스에 논리적으로 표현될 대상으로서의 개체 타입과 개체 타입 간의 관계</li>
<li>데이터 구조 및 정적 성질을 표현하는 요소<h3 id="제약-조건-constraint">제약 조건 (Constraint)</h3>
: 데이터베이스에 저장될 수 있는 실제 데이터의 논리적인 제약 조건</li>
<li>데이터 무결성 유지를 위한 DB의 보편적 방법</li>
<li>릴레이션의 특정 칼럼에 설정하는 제약을 의미</li>
</ul>
<br>

<h2 id="데이터-모델-절차-개-논-물">데이터 모델 절차 [개 논 물]</h2>
<h3 id="개념적-설계">개념적 설계</h3>
<p>: 사용자의 요구에 대한 트랜잭션을 모델링 하는 단계</p>
<ul>
<li><strong>개념적 데이터 모델</strong>현실 세계에 대한 인식을 추상적, 개념적으로 표현하여 개념적 구조를 도출하는 데이터 모델</li>
</ul>
<h3 id="논리적-설계">논리적 설계</h3>
<p>: 트랜잭션의 인터페이스를 설계하는 단계 / 논리적 스키마를 설계하는 단계</p>
<ul>
<li><strong>논리적 데이터 모델</strong>은 업무의 모습을 모델링 표시법으로 형상화하여 사람이 이해하기 쉽게 표현한 데이터 모델</li>
<li>정규화 수행</li>
</ul>
<h3 id="물리적-설계">물리적 설계</h3>
<p>: 논리 데이터 모델을 특정 DBMS의 특성 및 성능을 고려하여 물리적인 스키마를 만드는 단계</p>
<ul>
<li><strong>물리적 데이터 모델</strong>은 논리 데이터 모델을 사용하고자 하는 각 DBMS의 특성을 고려하여 데이터베이스 저장구조로 변환하는 모델</li>
<li>성능 측면에서 반 정규화 수행</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="관계-대수">관계 대수</h1>
<blockquote>
<p>관계형 데이터베이스에서 원하는 정보와 그 정보를 어떻게 유도하는가를 기술하는 절차적 정형 언어</p>
</blockquote>
<h2 id="일반-집합-연산자">일반 집합 연산자</h2>
<ul>
<li><strong>합집합</strong> : U</li>
<li><strong>교집합</strong> : n</li>
<li><strong>차집합</strong> : -</li>
<li><strong>카티션 프로덕트</strong> : X</li>
</ul>
<h2 id="순수-관계-연산자">순수 관계 연산자</h2>
<ul>
<li><strong>셀렉트</strong> : σ</li>
<li><strong>프로젝트</strong> : π</li>
<li><strong>조인</strong> : ⋈</li>
<li><strong>디비전</strong> : ÷</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="관계-해석">관계 해석</h1>
<blockquote>
<p>튜플 관계 해석과 도메인 관계 해석을 하는 비절차적 언어</p>
</blockquote>
<p>목적 : 무엇을 얻을 것인지</p>
<p><br></br></p>
<hr>
<h1 id="e-r모델">E-R모델</h1>
<blockquote>
<p>현실 세계에 존재하는 데이터와 그들 간의 관계를 사람이 이해할 수 있는 형태로 명확하게 표현하기 위해서 가장 널리 사용하고 있는 모델</p>
</blockquote>
<ul>
<li>요구사항으로부터 얻어낸 정보들을 개체, 속성, 관계로 기술한 모델</li>
</ul>
<h2 id="기호">기호</h2>
<ul>
<li><strong>개체 집합</strong> : ☐</li>
<li><strong>관계 집합</strong> : ♢</li>
<li><strong>속성</strong> : ○</li>
<li><strong>다중 값 속성</strong> : ◎</li>
<li><strong>개체 집합-관계 집합 연결</strong> : -</li>
<li><strong>개체 집합-속성 연결</strong> : -</li>
<li><strong>관계 집합-속성 연결</strong> : - - - </li>
</ul>
<p><br></br></p>
<hr>
<h1 id="테스트-자동화-도구">테스트 자동화 도구</h1>
<blockquote>
<p>반복적인 테스트 작업을 스크립트 형태로 구현함으로써 테스트 시간 단축과 인력 투입 비용을 최소화하는 한편 쉽고 효율적인 테스트를 수행할 수 있는 방법</p>
</blockquote>
<h2 id="정적-분석-도구">정적 분석 도구</h2>
<p>: 만들어진 애플리케이션을 실행하지 않고 분석하는 도구</p>
<ul>
<li>대부분의 경우 소스 코드에 대한 코딩의 남은 결함을 발견하기 위하여 사용</li>
<li>테스트를 수행하는 사람이 작성된 소스 코드에 대한 이해를 바탕으로 도구를 이용해서 분석하는 것<h2 id="테스트-실행-도구">테스트 실행 도구</h2>
</li>
<li>테스트를 위해 작성된 스크립트를 실행하고 각 스크립트마다 특정 데이터와 테스트 수행 방법을 포함</li>
<li>데이터 주도 접급 방식 , 키워드 주도 접근 방식<h2 id="성능-테스트-도구">성능 테스트 도구</h2>
: 애플리케이션의 처리량, 응답 시간, 경과 시간, 자원 사용률에 대해 가상의 사용자를 생성하고 테스트를 수행함으로써 성능 목표를 달성하였는지를 확인하는 도구<h2 id="테스트-통제-도구">테스트 통제 도구</h2>
</li>
<li>테스트 계획 및 관리를 위한 도구, 수행에 필요한 데이터와 도구를 관리하는 형상 관리 도구, 결함에 대해 관리하거나 협업을 지원하기 위한 도구가 있다.</li>
<li>조직의 요구사항에 최적화된 형태의 정보를 생성, 관리하기 위하여 스프레드트 등 다른 도구들과 연계하여 사용할 수도 있다.</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="테스트-하네스">테스트 하네스</h1>
<blockquote>
<p>애플리케이션 컴포넌트 및 모듈을 테스트하는 환경의 일부분으로 테스트를 지원하기 위한 코드와 데이터를 말하며 단위 또는 모듈 테스트에 사용하기 위해 코드 개발자가 작성</p>
</blockquote>
<h2 id="구성요소">구성요소</h2>
<h3 id="테스트-드라이버">테스트 드라이버</h3>
<p>: 테스트 대상 하위 모듈을 호출하는 등 <strong>상향식 테스트</strong>에 필요</p>
<h3 id="테스트-스텁">테스트 스텁</h3>
<p>: 제어 모듈이 호출하는 타 모듈의 기능을 단순히 수행하는 도구로 <strong>하향식 테스트</strong>에 필요</p>
<h3 id="테스트-슈트">테스트 슈트</h3>
<p>: 테스트 대상 컴포넌트나 모듈, 시스템에 사용되는 테스트 케이스의 집합</p>
<h3 id="테스트-케이스-1">테스트 케이스</h3>
<p>: 입력값, 실행 조건, 기대 결과 등의 집합</p>
<h3 id="테스트-시나리오">테스트 시나리오</h3>
<p>: 애플리케이션의 테스트가 되어야 할 기능 및 특징, 테스트가 필요한 상황을 작성한 문서</p>
<ul>
<li>하나의 단일 테스트 시나리오가 여러 개의 테스트 케이스들을 포함할 수 있다.<h3 id="테스트-스크립트">테스트 스크립트</h3>
: 자동화된 테스트 실행 절차에 대한 명세<h3 id="목-오브젝트">목 오브젝트</h3>
: 사용자의 행위를 조건부로 사전에 입력해두면 그 상황에 예정된 행위를 수행하는 객체</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="리팩토링">리팩토링</h1>
<blockquote>
<p>유지보수 생산성 향상을 목적으로 기능을 변경하지 않고 복잡한 소스 코드를 수정,보완하여 가용성 및 가독성을 높이는 기법</p>
</blockquote>
<h2 id="목적-1">목적</h2>
<ul>
<li>유지보수성 향상</li>
<li>유연한 시스템</li>
<li>생산성 향상</li>
<li>품질향상</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="디자인-패턴-">디자인 패턴 ***</h1>
<blockquote>
<p>소프트웨어 공학의 소프트웨어 설계에서 공통으로 발생하는 문제에 대해 자주 쓰이는 설계 방법을 정리한 패턴</p>
</blockquote>
<ul>
<li>디자인 패턴을 참고하여 개발할 경우 개발의 효율성과 유지보수성, 운용성이 높아지며 프로그램의 최적화에 도움이 됨</li>
</ul>
<p><br></br></p>
<h2 id="생성-패턴-빌-프-팩-앱-싱">생성 패턴 [빌 프 팩 앱 싱]</h2>
<blockquote>
<p>객체 인스턴스 생성에 관여, 클래스 정의과 객체 생성 방식을 구조화,캡슐화를 수행</p>
</blockquote>
<h3 id="builder">Builder</h3>
<p>: 복잡한 인스턴스를 조립하여 만드는 구조로 복합 객체를 생성할 때 객체를 생성하는 방법과 구현하는 방법을 분리함으로써 동일한 생성 절차에서 <strong>서로 다른 표현 결과</strong>를 만들 수 있다.</p>
<ul>
<li>생성과 표기를 분리해서 복잡한 객체를 생성<h3 id="prototype">Prototype</h3>
: 일반적인 원형을 만들어 높고 복사하여 필요한 부분만 수정하여 사용하는 패턴으로 생성할 객체의 원형을 제공하는 인스턴스에서 생성할 객체들의 타입이 결정되도록 설정하여 <strong>객체를 생성할 때 갖추어야 할 기본 형태가 있을 때 사용된다.</strong></li>
<li>기존 객체를 복제함으로써 객체를 생성<h3 id="factory-method">Factory Method</h3>
: 상위 클래스에서 객체를 생성하는 인터페이스를 정의하고, 하위 클래스에서 인스턴스를 생성하도록 하는 방식으로 <strong>인터페이스와 실제 객체를 생성하는 클래스를 분리할 수 있는 특성</strong>을 갖는다.</li>
<li>생성할 객체의 클래스를 국한하지 않고 객체를 생성<h3 id="abstract-factory">Abstract Factory</h3>
: 구체적인 클래스에 의존하지 않고 서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스를 제공하는 패턴으로 생성된 클래스에서는 <strong>API(인터페이스)를 제공하고 구체적인 구현은 다른 클래스에서 이루어지는 특징</strong>을 갖는다.</li>
<li>동일한 주제의 다른 팩토리를 묶음<h3 id="singleton">Singleton</h3>
: 전역 변수를 사용하지 않고 <strong>객체를 하나만 생성</strong>하도록 하여 생성된 객체를 어디에서든지 참조할 수 있도록 한다.</li>
<li>한 클래스에 한 객체만 존재하도록 제한</li>
</ul>
<p><br></br></p>
<h2 id="구조-패턴-브-데-퍼-플-프-컴-어">구조 패턴 [브 데 퍼 플 프 컴 어]</h2>
<blockquote>
<p>더 큰 구조 형성 목적으로 클래스나 객체의 조합을 다루는 패턴</p>
</blockquote>
<h3 id="bridge">Bridge</h3>
<p>: 기능의 클래스 계층과 구현의 클래스 계층을 연결하고 구현부에서 추상 계층을 분리하여 <strong>추상화된 부분과 실제 구현 부분을 독립적으로 확장</strong>할 수 있는 패턴</p>
<ul>
<li>구현뿐만 아니라 추상화된 부분까지 변경해야 하는 경우 활용<h3 id="decorator">Decorator</h3>
: 기존에 구현되어 있는 클래스에 필요한 기능을 추가해 나가는 설계 패턴으로 <strong>기능 확장이 필요할 때 개체 간의 결합을 통해 기능을 동적으로 유연하게 확장</strong>할 수 있게 해주어 상속의 대안으로 사용하는 패턴</li>
<li>객체의 결합을 통해 기능을 동적으로 유연하게 확장<h3 id="facade">Facade</h3>
: 복잡한 시스템에 대하여 단순한 인터페이스를 제공함으로써 사용자와 시스템 간 또는 여타 시스템과의 <strong>결합도를 낮추어 시스템 구조에 대한 파악을 쉽게 하는 패턴</strong>으로 오류에 대해서 단위별로 확인할 수 있게 하며 사용자의 측면에서 <strong>단순한 인터페이스 제공</strong>을 통해 접근성은 높일 수 있는 패턴</li>
<li>통합된 인터페이스 제공<h3 id="flyweight">Flyweight</h3>
: 다수의 객체로 생성될 경우 <strong>모두가 갖는 본질적인 요소를 클래스화하여 공유함으로써 메모리를 절약하고 &#39;클래스의 경량화&#39;를 목적</strong>으로 하는 패턴</li>
<li>여러 개의 가상 인스턴스를 제공하여 메모리 절감<h3 id="proxy">Proxy</h3>
: 실제 객체에 대한 접근 이전에 필요한 행동을 취할 수 있게 만들며 미리 할당하지 않아도 상관없을 것들을 <strong>이용할 때 할당하게 하여 메모리 용량을 아끼고 정보은닉의 역할도 수행</strong>하는 패턴</li>
<li>특정 객체로의 접근을 제어하기 위한 용도로 사용<h3 id="composite">Composite</h3>
: 객체들의 관계를 <strong>트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴</strong>으로 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 하는 패턴</li>
<li>복합 객체와 단일 객체를 동일하게 취급<h3 id="adapter">Adapter</h3>
: 기존에 생성된 클래스를 재사용할 수 있도록 중간에서 맞춰주는 역할을 하는 인터페이스를 만드는 패턴으로 <strong>두 가지 형태로 사용</strong>되는 패턴</li>
<li>인터페이스가 호환되지 않는 클래스들을 함께 이용할 수 있도록 기존 인터페이스에 덧씌움</li>
</ul>
<p><br></br></p>
<h2 id="행위-패턴-미-인-이-템-옵-스테-비-커-스트-메-체">행위 패턴 [미 인 이 템 옵 스테 비 커 스트 메 체]</h2>
<blockquote>
<p>클래스나 객체들이 상호 작용하는 방법과 역할 분담을 다루는 패턴</p>
</blockquote>
<h3 id="mediator">Mediator</h3>
<p>: 객체 지향 설계애서 객체의 수가 너무 많아지면 서로 간 통신을 위해 복잡해져서 객체 지향에서 가장 중요한 느슨한 결합의 특성을 해칠 수 있기 떄문에 이를 해결하는 방법으로 중간에 이를 통제하고 지시하는 <strong>중재자를 두로 모든 것을 요구하여 통신의 빈도수를 줄여 객체 지향의 목표를 달성</strong>하게 해주는 패턴</p>
<ul>
<li>상호 작용의 유연한 변경을 지원<h3 id="interpreter">Interpreter</h3>
: 언어의 다양한 해석, 구체적으로 구문을 나누고 그 분리된 구문의 해석을 맡는 클래스를 각각 작성하여 <strong>여러 형태의 언어 구문을 해석할 수 있게 만드는 패턴</strong></li>
<li>문법 자체를 캡슐화하여 사용<h3 id="iterator">Iterator</h3>
: 컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체 안에 들어있는 <strong>모든 항목에 반복자를 사용하여 접근</strong>할 수 있는 패턴</li>
<li>내부구조를 노풀하지 않고 복잡 객체의 원소를 순차적으로 접근 가능하게 해주는 행위 패턴<h3 id="template-method">Template Method</h3>
: 어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화해 전체 일을 수행하는 구조는 바꾸지 않으면서 <strong>특정 단계에서 수행하는 내역을 바꾸는 패턴</strong></li>
<li>일반적으로 상위 클래스에는 추상 메서드를 통해 기능의 골격을 제공하고 하위 클래스의 메서드에는 세부 처리를 구체화하는 방식으로 사용하며 <strong>코드 양을 줄이고 유지보수를 용이하게 만드는 특징</strong>을 갖는 패턴</li>
<li>상위 작업의 구조를 바꾸지 않으면서 서브 클래스로 작업의 일부분을 수행<h3 id="observer">Observer</h3>
: 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에 연락이 가고 자동으로 내용이 갱신되는 방법으로 <strong>일대 다의 의존성을 가지며 상호 작용하는 객체 사이에서는 가능하면 느슨하게 결합</strong>하는 패턴</li>
<li>객체의 상태 변화에 따라 다른 객체의 상태도 연동 / 일대다 의존<h3 id="state">State</h3>
: 객체 상태를 캡슐화하여 클래스화함으로써 그것을 참조하게 하는 방식으로 상태에 따라 다르게 처리할 수 있도록 행위 내용을 변경하여 <strong>원시 코드의 수정을 최소화할 수 있고 유지보수의 편의성</strong>도 갖는 패턴</li>
<li>객체의 상태에 따라 행위 내용을 변경<h3 id="visitor">Visitor</h3>
: 각 클래스 데이터 구조로부터 처리 기능을 분리하여 별도의 클래스를 만들어 놓고 해당 클래스의 메서드가 각 클래스를 돌아다니며 특정 작업을 수행하도록 만드는 패턴으로 <strong>객체의 구조는 변경하지 않으면서 기능만 따로 추가하거나 확장할 때 사용</strong>하는 패턴</li>
<li>특정 구조를 이루는 복합 객체의 원소 특성에 따라 동작을 수행할 수 있도록 지원하는 행위<h3 id="command">Command</h3>
: 실행될 기능을 캡슐화함으로써 주어진 여러 기능을 실행할 수 있는 <strong>재사용성이 높은 클래스를 설계하는 패턴</strong>으로 하나의 추상 클래스에 메서드를 만들어 각 <strong>명령이 들어오면 그에 맞는 서브 클래스가 선택되어 실행</strong>되는 특징을 갖는 패턴</li>
<li>요구사항을 객체로 캡슐화<h3 id="strategy">Strategy</h3>
: 알고리즘 군을 정의하고 같은 알고리즘을 각각 하나의 클래스로 캡슐화한 다음 필요할 때 서로 교환해서 사용할 수 있게 하는 패턴으로 <strong>행위를 클래스로 캡슐화해 동적으로 행위를 자유롭게 바꿀 수 있게 해주는 패턴</strong></li>
<li>행위 객체를 클래스로 캡슐화해 동적으로 행위를 자유롭게 변환<h3 id="memento">Memento</h3>
: 클래스 설계 관점에서 객체의 정보를 저장할 필요가 있을 때 적용하는 디자인 패턴으로 <strong>Undo기능을 개발할 때 사용</strong>하는 디자인 패턴</li>
<li>객체를 이전 상태로 복구시켜야 하는 경우 Undo요청 가능<h3 id="chain-of-responsibility">Chain of Responsibility</h3>
: 정적으로 어떤 <strong>기능에 대한 처리의 연결이 하드코딩 되어 있을 때 기능 처리의 연결 변경이 불가능한데 이를 동적으로 연결되어 있는 경우에 따라 다르게 처리</strong>될 수 있도록 연결한 패턴</li>
<li>한 요청을 2개 이상의 객체에서 처리</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="웹-서비스">웹 서비스</h1>
<blockquote>
<p>네트워크에 분산된 정보를 서비스 형태로 개방하여 표준화된 방식으로 공유하는 기술로써 서비스 지향 아키텍처 개념을 실현하는 대표적인 기술</p>
</blockquote>
<h2 id="용어">용어</h2>
<h3 id="http">HTTP</h3>
<p>: WWW에서 HTML 문서를 송/수신하기 위한 규칙들을 정의해 놓은 표준 프로토콜</p>
<ul>
<li>인터넷에서 요청과 응답에 의해 처리하는 프로토콜로 GET, POST, PUT 방식 사용</li>
</ul>
<h3 id="하이퍼텍스트">하이퍼텍스트</h3>
<p>: 문장이나 단어 등이 링크를 통해 서로 연결된 네트워크터럼 구성된 문서</p>
<ul>
<li>이미지 등을 누르면 다른 사이트로 옮겨갈수 있도록 하이퍼링크가 걸려 있다.</li>
</ul>
<h3 id="html">HTML</h3>
<p>: 웹을 이루는 가장 기초적인 구성요소로 웹 콘텐츠의 의미와 구조를 정의할 때 사용하는 기술</p>
<ul>
<li>WWW문서를 표현하는 표준화된 마크업 언어</li>
</ul>
<br>

<h2 id="유형-4">유형</h2>
<h3 id="soap방식">SOAP방식</h3>
<p>: XML기반의 메시지를 네트워크 상태에서 교환하는 프로토콜</p>
<ul>
<li>보통의 경우 원격 프로시저 호출을 하는 메시지 패턴을 사용한다.</li>
<li>네트워크 노드에서 다른쪽 노드로 메시지를 요청하고 서버는 메시지를 즉시 응답</li>
</ul>
<h3 id="wsdl">WSDL</h3>
<p>: 웹 서비스에 대한 상세 정보가 기술된 XML형식으로 구현되어 있는 언어</p>
<ul>
<li>SOAP와 XML스키마와 결합하여 인터넷상에 웹 서비스를 제공하기 위해 사용되기도 한다.</li>
</ul>
<h3 id="uddi">UDDI</h3>
<p>: 웹 서비스에 대한 정보인 WSDL을 등록하고 검색하기 위한 저장소로 공개적으로 접근, 검색이 가능한 레지스트리이자 표준</p>
<ul>
<li>서비스 제공자는 서비스 소비자에게 이미 알려진 온라인 저장소에 그들이 제공하는 목록들을 저장하게 되고 소비자들은 그 저장소에 접근함으러써 원하는 목록을 찾을 수 있다.</li>
<li>알려진 송수신 시스템의 통합 구현에서는 서비스의 공개 및 검색과정이 필요 없으므로 UDDI를 구축하지 않는다.</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="ipc">IPC</h1>
<blockquote>
<p>운영체제에서 프로세스 간 서로 데이터를 주고받기 위한 통신 기술</p>
</blockquote>
<h2 id="주요-기법">주요 기법</h2>
<h3 id="메시지-큐">메시지 큐</h3>
<p>: 메시지 또는 패킷 단위로 동작하여 프로세스 간 통신</p>
<h3 id="공유메모리">공유메모리</h3>
<p>: 한 프로세스의 일부분을 다른 프로세스와 공유</p>
<h3 id="소켓">소켓</h3>
<p>: 클라이언트와 서버 프로세스 둘 사이에 통신을 가능하게 함</p>
<h3 id="세마포어">세마포어</h3>
<p>: 프로세스 사이의 동기를 맞투는 기능을 제공</p>
<p><br></br></p>
<hr>
<h1 id="요구사항의-분류">요구사항의 분류</h1>
<ul>
<li>요구사항 파악의 기본은 시스템의 요구사항에 대한 파악</li>
<li>요구사항은 기능적 요구사항과 비기능적 요구사항으로 분류<h2 id="기능적-요구사항">기능적 요구사항</h2>
: 시스템이 제공하는 기능, 서비스에 대한 요구사항</li>
<li>특정 입력에 대해 시스쳄이 어떻게 반응해야 하는지에 대한 기술</li>
<li>특정 상황에 대해 시스템이 어떻게 동작해야 하는지에 대한 기술</li>
<li><strong>특성</strong> 
: 기능성, 완전성, 일관성</li>
</ul>
<p><span style="color:green">ex) 온라인 홈페이지에서는 쇼핑카트에 주문하고자 하는 품목을 저장할 수 있는 장바구니 제공</span></p>
<h2 id="비기능적-요구사항">비기능적 요구사항</h2>
<p>: 시스템이 수행하는 기능 이외의 사항, 시스템 구축에 대한 제약사항에 관한 요구사항</p>
<ul>
<li>품질 속성에 관련하여 시스템이 갖춰야 할 사항에 관한 기술</li>
<li>시스템이 준수해야 할 제한 조건에 관한기술</li>
<li><strong>특성</strong> 
: 신뢰성, 사용성, 효율성, 유지보수성, 이식성, 보안성 및 품질 관련 요구사항, 제약사항</li>
</ul>
<p><span style="color:green">ex) 특정 함수의 호출시간은 3초를 넘지 않아야 한다.</span></p>
<p><br></br></p>
<hr>
<h1 id="ui">UI</h1>
<blockquote>
<ul>
<li>사용자와 시스템 사이에서 의사소통할 수 있도록 고안된 물리적, 가상의 매개체</li>
</ul>
</blockquote>
<ul>
<li>정보 기기나 소프트웨어의 화면 등에서 사람이 접하게 되는 화면</li>
<li><span style="color:darkblue"> UX는 UI를 포함한다.</span></li>
</ul>
<h2 id="ui-유형">UI 유형</h2>
<h3 id="cli-command-line-interface">CLI (Command Line Interface)</h3>
<p>: 명령어를 텍스트로 입력하여 조작하는 사용자 인터페이스</p>
<ul>
<li>정적인 텍스트 기반 인터페이스<h3 id="gui-graphical-user-interface">GUI (Graphical User Interface)</h3>
: 그래픽 환경을 기반으로 한 마우스나 전자펜을 이용하는 사용자 인터페이스</li>
<li>그래픽 반응 기반 인터페이스<h3 id="nui-natual-user-interface">NUI (Natual User Interface)</h3>
: 키보드나 마우스 없이 신체 부위를 이용하는 사용자 인터페이스 / 터치,음성 포함</li>
<li>직관적 사용자 반응기반 인터페이스<h3 id="oui-organic-user-interface">OUI (Organic User Interface)</h3>
: 현실에 존재하는 모든 사물이 입출력장치로 변화할 수 있는 사용자 인터페이스</li>
<li>유기적 상호 작용기반 인터페이스</li>
</ul>
<h2 id="ui-설계-원칙">UI 설계 원칙</h2>
<h3 id="직관성">직관성</h3>
<p>: 누구나 쉽게 이해하고 쉽게 사용할 수 있어야 함</p>
<ul>
<li>쉬운 검색, 쉬운 사용성, 일관성<h3 id="유효성">유효성</h3>
: 정확하고 안벽하게 사용자의 목표가 달성될 수 있도록 제작</li>
<li>쉬운 오류 처리 및 복구<h3 id="학습성">학습성</h3>
: 초보와 숙련자 모두가 쉽게 배우고 사용할 수 있게 제작</li>
<li>쉽게 학습, 쉬운 접근, 쉽게 기억<h3 id="유연성">유연성</h3>
: 사용자의 요구사항을 최대한 수용하고 실수를 방지할 수 있도록 제장</li>
<li>오류 예방, 실수포용, 오류 감지</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="uml">UML</h1>
<blockquote>
<p>객체 지향 소프트웨어 개발 과정에서 산출물을 명세화, 시각화, 문서화할 때 사용되는 모델링 기술과 방법론을 통합해서 만든 표준화된 범용 모델링 언어</p>
</blockquote>
<h2 id="클래스-다이어그램">클래스 다이어그램</h2>
<blockquote>
<p>객체 지향 모델링 시 클래스의 속성 및 연산과 클래스 간 정적인 관계를 표현한 다이어그램</p>
</blockquote>
<h3 id="구성요소-1">구성요소</h3>
<ul>
<li>클래스
: 공통의 속성, 연산, 관계, 의미를 공유하는 객체들의 집합</li>
<li>속성
: 클래스의 구조적 특성에 이름을 붙인 것으로 특성에 해당하는 인스턴스가 보유할 수 있는 값의 범위를 기술</li>
<li>연산,매서드
: 이름, 타입, 매개변수들과 연관된 행위를 호출하는데 요구되는 제약사항들을 명시하는 클래스의 행위적 특징 / 객체에 요청하여 행동에 영향을 줄 수 있는 서비스</li>
<li>접근 제어자
: 클래스에 접근할 수 있는 정도를 표현<ul>
<li>&#39;+&#39;, &#39;-&#39;, &#39;#&#39;, &#39;~&#39;<h3 id="관계">관계</h3>
<h4 id="연관관계">연관관계</h4>
: 클래스가 서롤 개념적으로 연결된 선 / 2개 이상의 사물이 서로 관련되어 있는 상태</li>
</ul>
</li>
<li>사물 사이를 실선으로 연결하여 표현하고 방향성을 화살표로</li>
<li>서로에게 영향을 주는 양방향 관계의 경우 화살표를 생략하고 실선으로만 연결<h4 id="의존-관게">의존 관게</h4>
: 하나의 클래스가 또 다른 클래스를 사용하는 관계 / 다른 클래스의 멤버 함수 사용</li>
<li>사물 사이에 서로 연관은 있으나 필요에 따라 서로에게 영향을 주는 시간동안만 유지</li>
<li>하나의 클래스에 있는 멤버 함수의 인자가 변함에 따라 다른 클래스에 영향을 미칠 때의 관계</li>
<li>영향을 주는 사물이 영향을 받는 사물쪽으로 점선 화살표를 연결<h4 id="일반화-관계-상속">일반화 관계 (=상속)</h4>
: 하나의 사물이 다른 사룸에 비해 더 일반적인지 구체적인지를 표현</li>
<li>일반적인 개념을 부모, 구체적인 개념을 자식</li>
<li>구체적인 사룸에서 일반적인 사물 쪽으로 속이 빈 화살표를 연결<h4 id="실체화-관계">실체화 관계</h4>
: 사물이 할 수 있거나 해야 하는 기능으로 서로를 그룹화할 수 있는 관계를 표현</li>
<li>추상 클래스나 인터페이스를 상속받아 자식클래스가 추상 매서드를 구현할 때 사용<h4 id="포함-관계-복합">포함 관계 (=복합)</h4>
: 포함되는 쪽에서 포함하는 쪽으로 속이 채워진 마름모를 연결하여 표현</li>
<li>영구적이고 집합 관계보다 더 강한 관계로 구성</li>
<li>집합 관계의 특수한 형태로 포함하는 사물의 변화가 포함되는 사물에게 영향을 미치는 관계를 표현<h4 id="집합-관계">집합 관계</h4>
: 하나의 사물이 다른 사물에 포함되어 있는 관계 표현</li>
<li>하나의 객체에 여러 개의 독립적인 객체들이 구성되는 관계</li>
<li>포함되는 쪽에서 포함하는 쪽으로 속이 빈 마름모를 연결</li>
</ul>
<br>
</br>

<h2 id="패키지-다이어그램">패키지 다이어그램</h2>
<blockquote>
<p>시스템의 서로 다른 캐피지들 사이의 의존관계를 표현하기 위한 다이어그램</p>
</blockquote>
<h3 id="구성요소-2">구성요소</h3>
<ul>
<li>패키지
: 요소들을 그룹으로 조직하기 위한 요소</li>
<li>의존관계
: 하나의 패키지가 다른 패키지를 사용하는 관계<ul>
<li>의존성의 성질을 나타내기 위해 스테레오 타입을 붙일 수 있음</li>
</ul>
</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="키">키</h1>
<blockquote>
<p>데이터베이스에서 조건을 만족하는 튜플을 찾거나 순서대로 정렬할 때 다른 튜플들과 구별할 수 있는 기준이 되는 속성</p>
</blockquote>
<h2 id="특성-1">특성</h2>
<h3 id="유일성">유일성</h3>
<p>: 식별자에 의해 엔터티 타입 내에 모든 엔터티들이 유일하게 구분</p>
<h3 id="최소성">최소성</h3>
<p>: 최소한의 속성으로 식별자 구성</p>
<h2 id="종류-6">종류</h2>
<h3 id="기본-키-primary-key">기본 키 (Primary Key)</h3>
<p>: 테이블의 각 튜플들을 고유하게 식별하는 컬럼</p>
<h3 id="대체-키-alternate-key">대체 키 (Alternate Key)</h3>
<p>: 후보 키 중에서 기본 키로 선택되지 않은 키</p>
<h3 id="후보-키-candidate-key">후보 키 (Candidate Key)</h3>
<p>: 기본 키와 대체 키를 합친 키</p>
<ul>
<li>테이블에서 각 튜플을 구별하는 데 기준이 되는 컬럼<h3 id="슈퍼-키-super-key">슈퍼 키 (Super Key)</h3>
: 릴레이션을 구성하는 모든 튜플에 대해 유일성은 만족하지만 최소성은 만족하지 못하는 키<h3 id="외래-키-foreign-key">외래 키 (Foreign Key)</h3>
: 한 릴레이션의 컬럼이 다른 릴레이션의 기본 키로 이용되는 키</li>
<li>테이블 간의 참조 데이터 무결성을 위한 제약조건</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="eai">EAI</h1>
<blockquote>
<p>기업에서 운영되는 서로 다른 플랫폼 및 애플리케이션 간의 정보를 전달, 연계, 통합이 가능하도록 해주는 솔루션</p>
</blockquote>
<ul>
<li>각 비즈니스 간 통합 및 연계성을 증대시켜 효율성을 높여 줄 수 있으며 각 시스테 간의 확장성을 높여 줄 수 있다.</li>
</ul>
<h2 id="구성요소-3">구성요소</h2>
<ul>
<li>EAI플랫폼</li>
<li>어댑터</li>
<li>브로커</li>
<li>메시지 큐</li>
<li>비즈니스 워크플로우</li>
</ul>
<h2 id="구축-유형">구축 유형</h2>
<h3 id="포인트-투-포인트">포인트 투 포인트</h3>
<p>: 가장 기초적인 애플리케이션 통합방법으로 1:1 단순 통합방법</p>
<ul>
<li>장점으로는 솔루션을 구매하지 않고 개발자 간의 커뮤니케이션을 통해서도 통합 가능<h3 id="허브-앤-스포크">허브 앤 스포크</h3>
: 단일한 접점의 허브 시스템을 통하여 데이터를 전송하는 중앙 집중식 방식</li>
<li>허브 장애 시 전체 장애 발생<h3 id="메시지-버스">메시지 버스</h3>
: 애플리케이션 사이 미들웨어를 두어 연계하는 미들웨어 통합 방식</li>
<li>뛰어난 확장성과 대용량 데이터 처리 가능<h3 id="하이브리드">하이브리드</h3>
: 그룹 내는 허브 앤 스포트 방식을 사용하고 그룹 간에는 메시지 버스 방식을 사용하는 통합 방식</li>
<li>그룹 내 환경에 맞는 작업 가능</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="데이터-분석-함수">데이터 분석 함수</h1>
<blockquote>
<p>총합, 평균 등의 데이터 분석을 위해서는 복수 행 기준의 데이터를 모아서 처리하는 것을 목적으로 하는 다중 행 함수</p>
</blockquote>
<h2 id="다중-행-연산자">다중 행 연산자</h2>
<blockquote>
<p>서브 쿼리의 결과가 여러 개의 튜플을 반환하는 다중 행 서브쿼리에서 사용되는 연산자</p>
</blockquote>
<table>
<thead>
<tr>
<th><strong>연산자</strong></th>
<th><strong>설명</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>IN</strong></td>
<td>리턴되는 값 중에서 조건에 해당하는 값이 있으면 참</td>
</tr>
<tr>
<td><strong>ANY</strong></td>
<td>서브쿼리에 의해 리턴되는 각각의 값과 조건을 비교하여 하나 이상을 만족하면 참</td>
</tr>
<tr>
<td><strong>ALL</strong></td>
<td>값을 서브쿼리에 의해 리턴되는 모든 값과 조건 값을 비교하여 모든 값을 만족해야만 참</td>
</tr>
<tr>
<td><strong>EXISTS</strong></td>
<td>메인 쿼리의 비교 조건이 서브쿼리의 결과 중에서 만족하는 값이 하나라도 존재하면 참</td>
</tr>
</tbody></table>
<p><br></br></p>
<hr>
<h1 id="집계-함수">집계 함수</h1>
<blockquote>
<p>여러 행 또는 테이블 전체 행으로부터 하나의 결괏값을 반환하는 함수
<br>
SELECT 컬럼1, 컬럼2,..., 집계함수
FROM 테이블명
[WHERE 조건]
GROUP BY 컬럼1, 컬럼2,..
[HAVING 조건식(집계함수 포함)]</p>
</blockquote>
<ul>
<li>집계함수를 계산할 때 NULL이 포함된 경우 없는 데이터로 판단하면 된다.</li>
</ul>
<table>
<thead>
<tr>
<th><strong>집계함수</strong></th>
<th><strong>설명</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>COUNT</strong></td>
<td>복수 행의 줄 수를 반환하는 함수</td>
</tr>
<tr>
<td><strong>SUM</strong></td>
<td>복수 행의 해당 컬럼 간의 합계를 계산하는 함수</td>
</tr>
<tr>
<td><strong>AVG</strong></td>
<td>복수 행의 해당 컬럼 간의 평균을 계산하는 함수</td>
</tr>
<tr>
<td><strong>MAX</strong></td>
<td>복수 행의 해당 컬럼 간의 최댓값을 계산하는 함수</td>
</tr>
<tr>
<td><strong>MIN</strong></td>
<td>복수 행의 해당 컬럼 간의 최솟값을 계산하는 함수</td>
</tr>
<tr>
<td><strong>STDDEV</strong></td>
<td>복수 행의 해당 컬럼 간의 표준편차을 계산하는 함수</td>
</tr>
<tr>
<td><strong>VARANGE</strong></td>
<td>복수 행의 해당 컬럼 간의 분산을 계산하는 함수</td>
</tr>
</tbody></table>
<p><br></br></p>
<hr>
<h1 id="형상관리">형상관리</h1>
<blockquote>
<p>소프트웨어 개발을 위한 전체 과정에서 발생하는 모든 항목의 변경 사항을 관리하기 위한 활동</p>
</blockquote>
<ul>
<li>SW 생명 주기 동안 형상 관리를 통해 산출물을 체계적으로 관리하여 SW의 가시성, 추적성, 무결성 등의 품질 보증을 보장할 수 있다.</li>
</ul>
<h2 id="목적-2">목적</h2>
<ul>
<li>프로젝트 생명주기 동안 제품의 무결성과 변경에 대한 추적성을 확보할 수 있다.</li>
<li>프로젝트 변경이 발생 되었을 때 처리하는 메커니즘을 제공한다.</li>
<li>대표적인 메커니즘 : 형상 관리대상 파악, 베이스라인 지정, 형상 관리, 접근 제어</li>
</ul>
<h2 id="절차-1">절차</h2>
<ol>
<li>형상 식별
: 형상 관리 대상을 정의 및 식별하는 활동</li>
</ol>
<ul>
<li>추적성 부여를 위해 ID와 관리번호를 부여</li>
<li>변경 관련 이슈 발생 시 ID와 관리번호를 이용하여 추적</li>
</ul>
<ol start="2">
<li>형상 통제
: 변경욕 관리, 변경제어, 형상 관리 등 통제 지원</li>
</ol>
<ul>
<li>형상 항목의 버전 관리를 위한 형상통제위원회 운영</li>
<li>베이스라인에 대한 관리 및 형상 통제 수행 가능</li>
</ul>
<ol start="3">
<li>형상 감사
: 소프트웨어 베이스라인의 무결성 평가</li>
</ol>
<ul>
<li>베이스라인 변경 시 요구사항과 일치 여부 검토</li>
</ul>
<ol start="4">
<li>형상 기록
: 소프트웨어 형상 및 변경관리에 대한 각족 수행결과를 기록</li>
</ol>
<ul>
<li>형상결과 보고서 작성</li>
</ul>
<h2 id="소프트웨어-형상-관리-도구-유형">소프트웨어 형상 관리 도구 유형</h2>
<h3 id="공유-폴더-방식-rcs-sccs">공유 폴더 방식 (RCS, SCCS)</h3>
<p>: 매일 개발이 완료된 파일은 약속된 위치의 공유 폴더에 복사하는 방식</p>
<ul>
<li>담당자 한 명이 매일 공유 폴더의 파일을 자기 PC로 복사하고 컴파일하여 에러 확인과 정상 동작 여부 확인</li>
<li>정상 동작일 경우 다음날 각 개발자들이 동작 여부 확인<h3 id="클라이언트서버-방식-cvs-syn">클라이언트/서버 방식 (CVS, SYN)</h3>
: 중앙에 버전 관리 시스템을 항시 동작시키는 방식</li>
<li>개발자들의 현재 작업 내용과 이전 작업내용 추적에 용이</li>
<li>서로 다른 개발자가 같은 파일을 작업했을 때 경고 메시지 출력<h3 id="분산-저장소-방식-git">분산 저장소 방식 (git)</h3>
: 호컬 저장소와 원격 저장소로 분리되어 분산 저장하는 방식</li>
<li>중앙의 저장소에서 로컬 파일을 복사한 순간 개발자 자신만의 로컬 저장소에 생성</li>
<li>개발 완료한 파일을 수정한 다음에 로컬 저장소에 우선적으로 커밋한 이후, 다시 원격 저장소에 반영하는 방식</li>
</ul>
<h2 id="소프트웨어-형상-관리-도구별-특징-">소프트웨어 형상 관리 도구별 특징 *</h2>
<h3 id="cvs-concurrent-versions-syster">CVS (Concurrent Versions Syster)</h3>
<p>: 서버와 클라이언트로 구성되어있고 다수의 인원이 동시에 범용적인 운영체제로 접근 가능한 형상 관리 도구</p>
<h3 id="svn-subversion">SVN (Subversion)</h3>
<p>: 하나의 서버에서 소스를 쉽고 유용하게 관리할 수 있게 도와주는 도구</p>
<ul>
<li>저장소를 만들어 그곳에 소스를 저장해 소스 중복이나 여러 문제를 해결하기 위한 도구<h3 id="rcs-revision-control-system">RCS (Revision Control System)</h3>
: CVS와 달리 소스 파일의 수정을 한 사람만으로 제한하여 다수의 사람이 파일의 수정을 동시에 할 수 없도록 파일 잠금 방식으로 형상을 관리하는 도구<h3 id="bitkeeper">Bitkeeper</h3>
: SVN과 비슷한 중앙 통제 방식으로 대규모 프로젝트에서 빠른 속도를 내도록 개발된 형상 관리 도구<h3 id="git">Git</h3>
: Git의 속도에 중점을 둥 분산형 버전 관리 시스템이며 대형 프로젝트에서 효과적이고 유용</li>
<li>Git의 커밋 동작은 로컷 저장소에서 이루어지고 푸시라는 동작으로 원격 저장소에 반영</li>
<li>로컬 저장소에서 작업이 이루어져 매우 빠른 응답을 받을 수 있음</li>
<li>Git의 작업 폴더는 전체 기록과 각 기록을 추적할 수 있는 정보를 포함하는 완전한 형태의 저장소<h3 id="clear-case">Clear Case</h3>
: 복수 서버, 복수 클라이언트 구조이며 서버가 부족할 때 필요한 서버를 하나씩 추가하여 확장성을 기할 수 있음</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="chmod-명령">chmod 명령</h1>
<blockquote>
<p>접근 권한 변경 명령어로 기존 파일 또는 디렉토리에 대한 접근 권할을 변경할 때 사용</p>
</blockquote>
<h2 id="명령어">명령어</h2>
<p><code>chmod [-R] permission 파일이름|디렉토리이름[]</code></p>
<ul>
<li>해당 파일의 소유주나 슈퍼 유저만이 실행할 수 있다.</li>
<li>옵션 -R
: 하위 디렉토리와 파일의 권한까지 변경</li>
<li>permission
: 기호나 8진수로 접근 권한을 지정</li>
</ul>
<h2 id="권한을-기호로-기술">권한을 기호로 기술</h2>
<ul>
<li>대상
: u(user), g(group), o(other), a(all)</li>
<li>연산자
: +(추가), - (제거), = (지정)</li>
<li>접근 권한
: r(읽기), w(쓰기), x(실행)</li>
</ul>
<h2 id="권한을-숫자로-기술">권한을 숫자로 기술</h2>
<ul>
<li><strong>r(읽기)</strong> : 4</li>
<li><strong>w(쓰기)</strong> : 2</li>
<li><strong>x(실행)</strong> : 1</li>
</ul>
<p><br></br></p>
<hr>
<h1 id="메모리-배치-기법">메모리 배치 기법</h1>
<h2 id="최초-적합-first-fit">최초 적합 (First Fit)</h2>
<p>: 프로세스가 적재될 수 있는 가용 공간 중에서 첫 번째 분할에 할당하는 방식</p>
<h2 id="최적-적합-best-fit">최적 적합 (Best Fit)</h2>
<p>: 가용 공간 중에서 가장 크기가 비슷한 공간을 선택하여 프로세스를 적재하는 방식</p>
<ul>
<li>공백 최소화 장점<h2 id="최악-적합-worst-fit">최악 적합 (Worst-Fit)</h2>
: 프로세스의 가용 공간 중에서 가장 큰 공간에 할당하는 방식</li>
</ul>
<p><br></br></p>
<hr>
<p>#</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQLD] SQL 기본💡]]></title>
            <link>https://velog.io/@yejin_823/SQLD3</link>
            <guid>https://velog.io/@yejin_823/SQLD3</guid>
            <pubDate>Mon, 04 Mar 2024 12:30:36 GMT</pubDate>
            <description><![CDATA[<br>

<h1 id="1-관계형-데이터베이스-개요">1. 관계형 데이터베이스 개요</h1>
<h2 id="1-1-데이터베이스">1-1) 데이터베이스</h2>
<blockquote>
<p>일상적인 정보들을 모아 놓은 것 자체를 의미한다.<br></br> 일반적으로 <strong>DB</strong>라고 말할 때는 특정 기업이나 조직 또는 개인이 필요한 데이터를 일정한 형태로 저장해 놓을 것을 의미한다.</p>
</blockquote>
<hr>
<h2 id="1-2-데이터베이스-관리-시스템-dbms">1-2) 데이터베이스 관리 시스템 (DBMS)</h2>
<blockquote>
<p>사용자들은 보다 효율적인 데이터 관리뿐만 아니라 예기치 못한 사건으로 인한 데이터의 손상을 피하고 필요할 때 데이터를 복구하기 위한 강력한 기능의 소프트웨어를 필요로 하는데 이러한 <strong>기본적인 요구사항을 만족시켜주는 시스템</strong>을 의미한다.</p>
</blockquote>
<hr>
<h2 id="1-3-관계형-데이터베이스-관리-시스템-rdbms">1-3) 관계형 데이터베이스 관리 시스템 (RDBMS)</h2>
<blockquote>
<p><strong>관계형 데이터베이스(RDB)</strong> 는 정규화 이론에 근거한 합리적인 데이터 모델링을 통해 데이터 이상 현상 및 불필요한 데이터 중복 현상을 피할 수 있다. 이러한 RDB를 관리하는 시스템 소프트웨어를 <strong>관계형 데이터베이스 관리 시스템 (RDBMS)</strong> 이라고 한다.</p>
</blockquote>
<h3 id="rdbms의-주요-기능">RDBMS의 주요 기능</h3>
<ul>
<li>동시성 관리 및 병행 제어를 통해 많은 사용자들이 동시에 데이터를 공유 및 조작할 수 있는 기능을 제공한다.</li>
<li>메타 데이터를 총괄 관리할 수 있기 때문에 데이터의 성격, 속성 또는 표현 방법등을 체계화할 수 있고 데이터 표준화를 통한 데이터 품질을 확보할 수 있는 장점이 있다.</li>
<li>인증된 사용자만이 참조할 수 있도록 보안 기능을 제공하고 테이블 생성 시에 사용할 수 있는 다양한 제약조건을 이용하여 사용자 실수로 인한 잘못된 데이터 입력 및 관계성이 있는 중요 데이터의 삭제를 방지하여 데이터 무결성을 보장한다.</li>
<li>시스템의 갑작스러운 장애로부터 사용자가 입력/수정/삭제하는 데이터가 데이터베이스에 제대로 반영될 수 있도록 보장해주는 기능과 시스템 ShutDown, 재해 등의 상황에서도 데이터를 회복/복구할 수 있는 기능을 제공한다.</li>
</ul>
<hr>
<h2 id="1-4-sql">1-4) SQL</h2>
<blockquote>
<p>관계형 데이터베이스에서 데이터 정의, 데이터 조작, 데이터 제어를 하기 위해 사용하는 언어이다.</p>
</blockquote>
<ul>
<li>사용자는 SQL문으로 하고자 하는 작업을 요청하고 DBMS는 데이터베이스에서 사용자가 요청한 데이터를 제공하거나 작업 성공 여부를 리턴해준다.</li>
</ul>
<hr>
<h2 id="1-5-sql문의-종류">1-5) SQL문의 종류</h2>
<h3 id="데이터-조작어-dml">데이터 조작어 (DML)</h3>
<p>: Data Manipulation Language</p>
<table>
<thead>
<tr>
<th align="center">명령어</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><strong>SELECT</strong></td>
<td>데이터베이스에 들어있는 데이터를 조회하거나 검색하기 위한 명령어</td>
</tr>
<tr>
<td align="center"><strong>INSERT</strong><br><strong>UPDATE</strong><br><strong>DELETE</strong></td>
<td>데이터베이스에 들어있는 데이터에 변형을 가하는데 사용하는 명령어</td>
</tr>
</tbody></table>
<h3 id="데이터-정의어-ddl">데이터 정의어 (DDL)</h3>
<p>: Data Definition Language</p>
<ul>
<li>데이터 구조를 생성/변경/삭제하거나 이름을 바꾸는데 사용하는 명령어들</li>
</ul>
<table>
<thead>
<tr>
<th align="center">명령어</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><strong>CREATE</strong><br><strong>ALTER</strong><br><strong>DROP</strong><br><strong>RENAME</strong></td>
<td>테이블/인덱스 등과 같은 데이터베이스 객체의 구조를 정의하는데 사용하는 명령어</td>
</tr>
</tbody></table>
<h3 id="데이터-제어어-dcl">데이터 제어어 (DCL)</h3>
<p>: Data Control Language</p>
<table>
<thead>
<tr>
<th align="center">명령어</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><strong>GRANT</strong><br><strong>REVOKE</strong></td>
<td>데이터베이스에 접근하고 객체들을 사용하도록 권한을 부여하고 회수하는 명령어</td>
</tr>
</tbody></table>
<h3 id="트랜잭션-제어어-tcl">트랜잭션 제어어 (TCL)</h3>
<p>: Transaction Control Language</p>
<table>
<thead>
<tr>
<th align="center">명령어</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><strong>COMMIT</strong><br><strong>ROLLBACK</strong></td>
<td>논리적인 작업 단위를 묶어서 DML에 의해 조작된 결과를 작업단위별로 적용 및 취소하는 명령어</td>
</tr>
</tbody></table>
<hr>
<h2 id="1-6-테이블">1-6) 테이블</h2>
<p>: 데이터를 저장하는 객체로서 RDB의 기본 단위를 의미한다.</p>
<ul>
<li>RDB에서는 모든 데이터를 칼럼과 행의 2차원 구조로 나타낸다.</li>
<li>칼럼과 행으로 이루어져 있고 칼럼 중에서 기본키를 지정한다.</li>
<li><strong>칼럼</strong> : 세로 방향</li>
<li><strong>행</strong> : 가로 방향</li>
<li><strong>필드</strong> : 칼럼과 행이 겹치는 하나의 공간</li>
</ul>
<h3 id="용어">용어</h3>
<table>
<thead>
<tr>
<th>종류</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>테이블</strong></td>
<td>칼럼과 행의 2차원 구조(면적)를 가진 데이터이 저장소</td>
</tr>
<tr>
<td><strong>칼럼</strong></td>
<td>테이블에서 세로 방향으로 이루어진 하나하나의 속성 (더 이상 나눌 수 없는 것)</td>
</tr>
<tr>
<td><strong>행</strong></td>
<td>테이블에서 가로 방향으로 이루어진 데이터</td>
</tr>
<tr>
<td><strong>정규화</strong></td>
<td>테이블을 분할하여 데이터의 정합성을 확보하고 불필요한 중복을 줄이는 프로세스</td>
</tr>
<tr>
<td><strong>기본키</strong></td>
<td>테이블에 존재하는 각 행을 한 가지 의미로 특정할 수 있는 1개 이상의 칼럼<br><span style="color:green">ex) 주문 테이블의 기본키는 주문번호 / 고객 테이블의 기본키는 고객번호</span></td>
</tr>
<tr>
<td><strong>외래키</strong></td>
<td>다른 테이블의 기본키로 사용되고 있는 관계를 연결하는 칼럼<br><span style="color:green">ex) 주문 테이블의 고객번호 칼럼은 주문 테이블이 가지고 있는 FK / 고객번호 칼럼은 고객 테이블의 기본키</span></td>
</tr>
</tbody></table>
<hr>
<h2 id="1-7-erd">1-7) ERD</h2>
<p>: 테이블 간 서로의 상관 관계를 그림으로 도식화한 것</p>
<ul>
<li>ERD의 구성요소는 엔터티, 관계, 속성 3가지이며 현실 세계에서 발생하는 데이터는 이 3가지 구성요소로 모두 표현이 가능하다.</li>
</ul>
<br>

<hr>
<br>

<h1 id="2-ddl">2. DDL</h1>
<h2 id="2-1-ddl의-정의">2-1) DDL의 정의</h2>
<blockquote>
<p>DB를 구성하고 있는 다양한 객체(사용자, 테이블, 인덱스, 뷰, 트리거, 프로시저, 사용자 정의 함수 등)를 정의/변경.제거하는데 사용한다.</p>
</blockquote>
<ul>
<li>물리적 DB객체의 구조를 정의하는데 사용된다.</li>
</ul>
<hr>
<h2 id="2-2-주요-데이터형타입-정리">2-2) 주요 데이터형(타입) 정리</h2>
<p>테이블 생성 시 테이블 내에 사용될 칼럼을 정의한다.
선언한 유형이 아닌 다른 종류의 데이터가 들어오려고 하면 DBMS는 에러를 발생시킨다.</p>
<h3 id="charl">CHAR(L)</h3>
<ul>
<li>고정길이 문자열</li>
<li>고정길이를 가지고 있으므로 저장되는 값의 길이가 L값보다 작을 경우 그 차이만큼 공백으로 채워진다.</li>
<li>만약 CHAR(5)인데 &#39;1234&#39;를 저장한다면 끝에 공백 하나가 자동으로 채워진다.</li>
</ul>
<h3 id="varcharl-or-varchar2l">VARCHAR(L) or VARCHAR2(L)</h3>
<ul>
<li>가변길이 문자열</li>
<li>L값만큼의 최대 길이를 가진다.</li>
<li>L값보다 작을 경우 입력하는 값만큼만 공간을 차지한다.</li>
<li>만약 VARCHAR(5)인데 &#39;1234&#39;를 저장한다면 그대로 &#39;1234&#39;가 저장된다.</li>
<li>VARCHAR2는 공백도 문자로 취급한다.</li>
<li>만약 VARCHAR2(5)인데 &#39;1234 &#39;를 저장한다면 그대로 &#39;1234 &#39;가 저장된다.</li>
</ul>
<h3 id="numberld">NUMBER(L,D)</h3>
<ul>
<li>정수 및 실수를 저장한다.</li>
<li>L값은 전체 자릿수, D값은 소수점 자릿수이다.</li>
<li>만약 NUMBER(12,2)이면 999999999999.99까지 저장할 수 있다.</li>
</ul>
<h3 id="date">DATE</h3>
<ul>
<li>날짜와 시각정보를 저장한다. (년월일시분초를 저장)</li>
</ul>
<hr>
<h2 id="2-3-create-table">2-3) CREATE TABLE</h2>
<p>: 신규 테이블을 생성하는 SQL문</p>
<h3 id="주의사항">주의사항</h3>
<ul>
<li>테이블명은 단수형을 사용할 것을 권고한다.</li>
<li>테이블명은 특정 사용자가 가지고 있는 테이블 내에서 다른 테이블과 중복되면 안된다.</li>
<li>한 테이블 내에서 동일한 칼럼명이 존재하면 안된다.</li>
<li>테이블 생성문 끝은 <span style="color:coral"> &#39;;&#39; </span>로 끝나야 한다.</li>
<li>칼럼의 데이터형은 반드시 지정해야 한다.</li>
<li>테이블명과 칼럼명은 반드시 문자로 시작해야 한다.</li>
<li>테이블명에 사용하는 문자는 A-Z , a-z , 0-9 , _ , $ , # 문자만 허용한다.</li>
</ul>
<hr>
<h2 id="2-4-제약조건">2-4) 제약조건</h2>
<p>: 데이터의 무결성을 유지하기 위한 DBMS의 보편적인 방법으로 테이블의 특정 칼럼(하나 혹은 그 이상)에 설정하는 제약을 말한다.</p>
<ul>
<li>테이블에 입력되는 데이터가 사용자가 원하는 조건을 만족하는 데이터만 입력되는 것을 보장한다.</li>
</ul>
<h3 id="기본키">기본키</h3>
<ul>
<li>테이블에 저장된 행들 중에서 특정 행을 고유하게 식별하기 위해서 사용한다.</li>
<li>하나의 테이블에 단 하나의 기본키만 정의할 수 있다.</li>
<li>기본키 생성 시 DBMS는 유일 인덱스를 자동으로 생성한다.</li>
<li>기본키 칼럼에는 NULL입력이 불가능하다.</li>
<li>기본키는 UNIQUE 제약조건과 NOT NULL 제약조건을 만족해야 한다. (UNIQUE+NOT NULL)</li>
</ul>
<h3 id="고유키">고유키</h3>
<ul>
<li>테이블에 저장된 행들 중에서 특정 행을 고유하게 식별하기 위해 생성한다.</li>
<li>고유키는 NULL입력이 가능하.</li>
<li>고유키는 UNIQUE 제약조건만 만족하면 NULL 입력이 가능하다. <br>(UNIQUE+NULL)</li>
</ul>
<h3 id="not-null">NOT NULL</h3>
<ul>
<li>해당 칼럼에는 NULL 입력을 금지하므오 어떤 값이라도 들어와야 한다.</li>
<li>이 칼럼은 필수 값 칼럼이 된다.</li>
</ul>
<h3 id="check">CHECK</h3>
<ul>
<li>입력할 수 있는 값의 종류 혹은 범위를 제한한다.</li>
</ul>
<h3 id="외래키">외래키</h3>
<ul>
<li>다른 테이블의 기본키를 외래키로 지정하는 경우 생성한다.</li>
<li>참조 무결성 제약조건이라고도 한다.</li>
</ul>
<h3 id="디폴트-값기본값">디폴트 값(=기본값)</h3>
<ul>
<li>해당 칼럼에 아무런 값도 입력하지 않았을 때 지정한 디폴트 값으로 데이터가 입력된다.</li>
<li>제약조건과는 별도로 데이터 입력 시에 칼럼의 값이 저장되어 있지 않을 경우 사전에 설정할 수 있다.</li>
</ul>
<hr>
<h2 id="2-5-alter-table">2-5) ALTER TABLE</h2>
<p>: 칼럼 및 제약조건을 추가/수정/제거하는데 이용하는 SQL문</p>
<h3 id="alter-table--add">ALTER TABLE ~ ADD</h3>
<p>: 칼럼을 추가할 수 있다.</p>
<blockquote>
<p><span style="color:green">ALTER TABLE<span style="color:gray"> 테이블명 </span> ADD<span style="color:gray"> 칼럼명 </span></span></p>
</blockquote>
<p>:외래키를 생성활 수 있다.</p>
<blockquote>
<p><span style="color:green">ALTER TABLE<span style="color:gray"> 테이블명 </span> ADD CONSTRAINT<span style="color:gray"> 외래키명 </span>FOREIGN KEY<span style="color:gray">(제약조건)</span>REFERENCES</span></p>
</blockquote>
<h3 id="alter-table--drop">ALTER TABLE ~ DROP</h3>
<p>: 칼럼을 제거할 수 있다.</p>
<blockquote>
<p><span style="color:green">ALTER TABLE<span style="color:gray"> 테이블명 </span> DROP<span style="color:gray"> 칼럼명 </span></span></p>
</blockquote>
<p>:외래키를 제거할 수 있다.</p>
<blockquote>
<p><span style="color:green">ALTER TABLE<span style="color:gray"> 테이블명 </span> DROP CONSTRAINT<span style="color:gray"> 외래키명 </span></span></p>
</blockquote>
<h3 id="alter-table--modify">ALTER TABLE ~ MODIFY</h3>
<p>: 칼럼의 데이터형 및 제약조건을 변경할 수 있다.</p>
<blockquote>
<p><span style="color:green">ALTER TABLE<span style="color:gray"> 테이블명 </span> MODIFY<span style="color:gray"> 칼럼명(제약조건) </span></span></p>
</blockquote>
<h3 id="alter-table--rename">ALTER TABLE ~ RENAME</h3>
<p>: 칼럼명을 변경할 수 있다.</p>
<blockquote>
<p><span style="color:green">ALTER TABLE<span style="color:gray"> 테이블명 </span> RENAME<span style="color:gray"> 원하는칼럼명 </span> TO <span style="color:gray"> 이전 칼럼명 </span></span></p>
</blockquote>
<h3 id="truncate">TRUNCATE</h3>
<p>: 테이블에 저장된 데이터를 제거할 수 있다.</p>
<ul>
<li>테이블 객체는 그대로 두고 내부의 데이터만 영구적을 제거한다.
<span style="color:coral">ROLLBACK문을 이용한 복구가 불가능</span></li>
</ul>
<blockquote>
<p><span style="color:green">TRUNCATE<span style="color:gray"> 테이블명 </span></span></p>
</blockquote>
<h3 id="drop-table">DROP TABLE</h3>
<p>: 테이블 객체를 제거할 수 있다.</p>
<blockquote>
<p><span style="color:green">DROP TABLE<span style="color:gray"> 테이블명 </span></span></p>
</blockquote>
<br>

<hr>
<br>

<h1 id="3-dml">3. DML</h1>
<h2 id="3-1-dml의-정의">3-1) DML의 정의</h2>
<blockquote>
<p>테이블의 데이터를 입력 / 수정 / 삭제 / 조회하는 역할을 한다.</p>
</blockquote>
<ul>
<li>4가지의 종류가 있으며 해당 SQL문을 실행 후 영구적으로 저장<span style="color:darkgray">(COMMIT)</span>하거나 SQL문의 수행을 취소<span style="color:darkgray">(ROLLBACK)</span>할 수 있다.</li>
</ul>
<hr>
<h2 id="3-2-insert문">3-2) INSERT문</h2>
<p>: 테이블에 데이터를 신규로 입력할 때 사용된다.</p>
<blockquote>
<p><span style="color:green">INSERT INTO <span style="color:gray">테이블명 (데이터를 넣고 싶은 칼럼명)</span> VALUES <span style="color:gray">(데이터값);</span></span></p>
</blockquote>
<hr>
<h2 id="3-3-update문">3-3) UPDATE문</h2>
<p>: 테이블 내 행의 칼럼값을 수정할 때 사용된다.</p>
<ul>
<li>한 번의 UPDATE문 실행으로 여러 개의 행에 대한 여러 개의 칼럼을 수정할 수 있다.</li>
</ul>
<blockquote>
<p><span style="color:green">UPDATE <span style="color:gray">테이블명</span> SET<span style="color:gray"> 수정값</span> WHERE <span style="color:gray"> 수정하고 싶은 칼럼명; </span></span></p>
</blockquote>
<h2 id="3-4-delete문">3-4) DELETE문</h2>
<p>: 테이블 내의 행을 삭제할 때 사용된다.</p>
<ul>
<li>한 번의 DELETE문 실행으로 여러 개의 행을 삭제할 수 있다.</li>
<li>조건에 부합하는 행을 삭제할 수 있으며 <strong>수행 후 커밋 혹은 롤백</strong>할 수 있다.</li>
</ul>
<blockquote>
<p><span style="color:green">DELETE FROM <span style="color:gray">테이블명</span> WHERE <span style="color:gray"> 원하는 행의 조건;</span></span></p>
</blockquote>
<h2 id="3-5-select문">3-5) SELECT문</h2>
<p>: 테이블에서 데이터를 조회하는데 사용된다.</p>
<blockquote>
<p><span style="color:green">SELECT <span style="color:gray">조회하고 싶은 칼럼들</span> FROM <span style="color:gray">테이블명</span> WHERE <span style="color:gray"> 조회 칼럼 조건;</span></span></p>
</blockquote>
<h3 id="select-">SELECT *</h3>
<p>: FRO절 내 테이블(들)이 가지고 있는 모든 칼럼을 출력한다.</p>
<blockquote>
<p><span style="color:green">SELECT * <span style="color:gray"> FROM 테이블명</span></span></p>
</blockquote>
<hr>
<h2 id="3-6-앨리어스alias">3-6) 앨리어스(Alias)</h2>
<ul>
<li>테이블 및 칼럼에 앨리어스를 지정할 수 있다.</li>
<li>테이블 및 칼럼 이외에도 뷰 혹은 인라인뷰에도 사용이 가능하다.</li>
<li>칼럼 뒤에는 <strong>AS</strong>를 이용하여 지정한다.</li>
<li>칼럼에 지정한 앨리어스대로 SQL문의 해더 값이 출력된다.</li>
<li>앨리어스의 사용은 SQL문의 개발 생산성을 향상시켜주고 유지보수에 도움을 준다.</li>
</ul>
<hr>
<h2 id="3-7-합성-연산자의-사용">3-7) 합성 연산자의 사용</h2>
<p>: SELECT절에서 여러 개의 칼럼을 출력하는 경우 합성 연산자 <strong>(&quot;||&quot;)</strong> 로 연결하면 결과 값이 하나의 칼럼으로 출력된다.</p>
<blockquote>
<p><span style="color:gray">SELECT 칼럼명1 <span style="color:green"> || </span> 칼럼명2 FROM 테이블명 </span></p>
</blockquote>
<hr>
<h2 id="3-8-dual-테이블을-이용한-연산-수행">3-8) DUAL 테이블을 이용한 연산 수행</h2>
<h3 id="dual-테이블">DUAL 테이블</h3>
<p>: 오라클 DB를 설치하면 기본적으로 DUAL 테이블이 존재한다.</p>
<ul>
<li>단 1건의 데이터가 저장되어 있다.</li>
<li>칼럼은 DUMMY 칼럼 단 1개만 저장되어 있다.</li>
<li>저장되어 있는 DUMMY 칼럼값은 &#39;X&#39; 이다.</li>
<li>DUAL 테이블을 이용해서 다양한 연산을 할 수 있다.</li>
</ul>
<blockquote>
<p><span style="color:gray">SELECT 원하는 연산 FROM <span style="color:green"> DUAL</span>;</span></p>
</blockquote>
<br>

<hr>
<br>

<h1 id="4-tcl">4. TCL</h1>
<h2 id="4-1-tcl의-정의">4-1) TCL의 정의</h2>
<blockquote>
<p>데이터의 입력 / 수정 / 삭제 후 커밋 혹은 롤백을 하는데 사용하는 SQL문이다.</p>
</blockquote>
<ul>
<li>DML문의 입력, 수정, 삭제를 실행하면 DB에 곧바로 적용되지 않고 커밋 명령을 실행해야만 DB에 최종 적용된다.</li>
<li>데이터를 변경한 후, 커밋 명령을 실행하지 않은 상태라면 롤백명령으로 데이터의 변경을 취소할 수 있다.</li>
</ul>
<hr>
<h2 id="4-2-트랜잭션의-특성">4-2) 트랜잭션의 특성</h2>
<h3 id="트랜잭션">트랜잭션</h3>
<p>: DB의 논리적 연산 단위로 1개의 트랜잭션에는 1개 이상의 SQL문이 포함된다.</p>
<ul>
<li>분할할 수 없는 최고의 단위</li>
</ul>
<table>
<thead>
<tr>
<th>특성</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>원자성(Atomicity)</strong></td>
<td>트랜잭션에서 정의된 연산들은 모두 성공적으로 끝나거나 모두 실패해야 한다. (ALL OR NOTHING)</td>
</tr>
<tr>
<td><strong>일관성(Consistency)</strong></td>
<td>트랜잭션이 실행되기 전, 데이터베이스의 내용이 잘못되어 있지 않다면 실행된 이후에도 데이터베이스의 내용에 잘못이 있으면 안된다.</td>
</tr>
<tr>
<td><strong>고립성(Isolation)</strong>)</td>
<td>트랜잭션이 실행되는 도중에 다른 트랜잭션의 영향을 받아 잘못된 결과를 만들어서는 안된다.</td>
</tr>
<tr>
<td><strong>지속성(Durability)</strong></td>
<td>트랜잭션이 성공적으로 수행되면 그 트랜잭션이 갱신한 데이터베이스의 내용은 영구적으로 저장된다.</td>
</tr>
</tbody></table>
<hr>
<h2 id="4-3-트랜잭션의-요점">4-3) 트랜잭션의 요점</h2>
<ul>
<li>테이블 내에서 데이터의 변경을 발생시키는 입력 / 수정 / 삭제 수행 시 그 변경되는 데이터의 무결성을 보장하는 것이 커밋과 롤백의 목적이다.</li>
<li>오라클 DBMS의 트랜잭션은 트랜잭셩의 대상이 되는 SQL문을 실행하면 자동으로 시작되고 커밋 또는 롤백을 실행한 시점에서 종료된다.</li>
</ul>
<hr>
<h2 id="4-4-commit과-rollback">4-4) COMMIT과 ROLLBACK</h2>
<h3 id="commit">COMMIT</h3>
<p>: 입력 / 수정 / 삭제한 자료에 대해서 문제가 전혀 없다고 판단되었을 경우 트랜잭션을 완료한다.</p>
<ul>
<li>&quot;변경된 데이터를 테이블에 영구적으로 반영하라&quot;</li>
</ul>
<blockquote>
<p><strong>COMMIT이후의 상태</strong></p>
</blockquote>
<ul>
<li>데이터의 입력 / 수정 / 삭제 내역이 DB에 완전히 반영된다.</li>
<li>변경 사용자 및 변경 사용자가 아닌 다른 모든 사용자는 SELECT문으로 입력 / 수정 / 삭제 결과를 볼 수 있다.</li>
<li>관련된 행에 대한 락이 풀리고 모든 사용자들이 행을 조작할 수 있게 된다.</li>
</ul>
<h3 id="rollback">ROLLBACK</h3>
<p>: 입력 / 수정 / 삭제한 자료에 대해서 문제가 있다고 판단되었을 경우 트랜잭션을 취소한다.</p>
<ul>
<li>관련된 행에 대한 락이 해제되어 다른 사용자들이 데이터 변경을 할 수 있게 된다.</li>
<li>&quot;변경 전으로 복구하라&quot;</li>
</ul>
<hr>
<h2 id="4-5-commit이나-rollback-이전의-데이터-상태">4-5) COMMIT이나 ROLLBACK 이전의 데이터 상태</h2>
<ul>
<li>최종 적용된 상태가 아니고 메모리에만 적용된 상태이므로 변경 이전 상태로 복구가 가능하다.</li>
<li>입력 / 수정 / 삭제를 실행한 사용자는 SELECT문으로 입력 / 수정 / 삭제 결과를 확인할 수 있다.</li>
<li>입력 / 수정 / 삭제를 실행한 사용자 외 다른 사용자는 SELECT문으로 입력 / 수정 / 삭제 결과를 확인할 수 없다.</li>
<li>변경된 행은 락이 설정되므로 다른 사용자가 변경할 수 없다.</li>
</ul>
<hr>
<h2 id="4-6-savepoint">4-6) SAVEPOINT</h2>
<p>: 롤백 시 트랜잭션에 포함된 모든 입력 / 수정 / 삭제를 취소하는 것이 아니라 현 시점에서 SAVEPOINT 지점까지의 데이터 변경만 취소할 수 있다.</p>
<ul>
<li>복잡한 대규모 트랜잭션에서 에러가 발생했을 때, SAVEPOINT까지의 트랜잭션만 취소하고 실패한 부분부터 다시 실행할 수 있다.</li>
<li>&quot;데이터 변경 사항의 취소를 지정한 지점까지만 취소하라&quot;</li>
</ul>
<hr>
<h2 id="4-7-트랜잭션-적용-처리가-일어나는-상황">4-7) 트랜잭션 적용 처리가 일어나는 상황</h2>
<ul>
<li>오라클 DBMS를 기준으로 DDL문장을 실행하면 그 실행 전과 실행 후 시점에 자동으로 커밋된다.</li>
<li>DML문을 실행 후 커밋을 하지 않고 DDL문을 실행하면 DDL문 실행 전에 DML문의 변경 사항이 자동으로 커밋된다.</li>
<li>DB에 대한 접속을 종료하면 자동으로 이전 DML의 변경사항이 커밋된다.</li>
<li>애플리케이션의 이상 동작으로 인해 DBMS에 대한 접속이 단절되었을 때는 데이터의 변경 사항이 자동으로 롤백된다.</li>
</ul>
<br>

<hr>
<br>

<h1 id="5-where절">5. WHERE절</h1>
<h2 id="5-1-where-조건절-개요">5-1) WHERE 조건절 개요</h2>
<p>: 필요한 데이터만을 조회, 추출하기 위해 추출되는 행을 제한한다.</p>
<ul>
<li>WHERE절 사용 시 일반적으로 조회 대상이 되는 칼럼은 좌측에 위치하며 입력값은 우측에 위치합니다.</li>
<li>대상 칼럼과 입력값 사이에는 &quot;LIKE&quot;, &quot;=&quot;, &quot;&lt;&quot;, &quot;&gt;&quot; 과 같은 연산자를 이용한다.</li>
</ul>
<hr>
<h2 id="5-2-연산자의-종류">5-2) 연산자의 종류</h2>
<h3 id="비교-연산자">비교 연산자</h3>
<p>: 숫자 값 혹은 문자 값의 크기를 비교하는데 사용한다.</p>
<table>
<thead>
<tr>
<th align="center">연산자</th>
<th>의미</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><strong>=</strong></td>
<td>~와 같다.</td>
</tr>
<tr>
<td align="center"><strong>&gt;</strong></td>
<td>~보다 크다.</td>
</tr>
<tr>
<td align="center"><strong>&gt;=</strong></td>
<td>~보다 크거나 같아.</td>
</tr>
<tr>
<td align="center"><strong>&lt;</strong></td>
<td>~보다 작다.</td>
</tr>
<tr>
<td align="center"><strong>&lt;=</strong></td>
<td>~보다 작거나 같다.</td>
</tr>
</tbody></table>
<h3 id="sql연산자">SQL연산자</h3>
<p>: SQL문에서 사용하도록 기본적으로 예약되어 있는 연산자이다.</p>
<table>
<thead>
<tr>
<th>연산자</th>
<th>의미</th>
</tr>
</thead>
<tbody><tr>
<td><strong>BETWEEN A AND B</strong></td>
<td>A와 B 사이에 있으면 된다.</td>
</tr>
<tr>
<td><strong>IN(리스트)</strong></td>
<td>리스트에 있는 값 중 하나라도 있으면 된다.</td>
</tr>
<tr>
<td><strong>LIKE &#39;비교문자열&#39;</strong></td>
<td>비교문자열의 형태와 일치하면 된다.(와일드카드 사용↓)</td>
</tr>
<tr>
<td><strong>IS NULL</strong></td>
<td>값이 NULL이면 된다.</td>
</tr>
<tr>
<td><strong>IS NOT NULL</strong></td>
<td>값이 NULL이 아니면 된다.(NULL에 대한 부정 비교 시 사용)</td>
</tr>
</tbody></table>
<blockquote>
<p><strong>와일드카드</strong></p>
</blockquote>
<ul>
<li><strong>%</strong> : 0개 이상의 어떤 문자를 의미한다.</li>
<li><strong>_</strong> : 1개의 단일 문자를 의미한다.</li>
</ul>
<h3 id="논리-연산자">논리 연산자</h3>
<p>: 비교 연산자 혹은 SQL 연산자로 이루어진 여러 개의 조건들을 논리적으로 조합하기 위해서 사용하는 연산자</p>
<table>
<thead>
<tr>
<th>연산자</th>
<th>의미</th>
</tr>
</thead>
<tbody><tr>
<td><strong>AND</strong></td>
<td>앞 조건과 뒤 조건이 <strong>모두 참</strong>이어야 한다.</td>
</tr>
<tr>
<td><strong>OR</strong></td>
<td>앞 조건과 뒤 조건 중 <strong>하나라도 참</strong>이어야 한다.</td>
</tr>
<tr>
<td><strong>NOT</strong></td>
<td>조건이 <strong>거짓</strong>이면 된다.</td>
</tr>
</tbody></table>
<h3 id="부정-연산자">부정 연산자</h3>
<p>: 비교 연산자의 부정표현을 <strong>&#39;부정 비교 연산자&#39;</strong> 로 할 수 있고, SQL연산자의 부정표현을 <strong>&#39;부정 SQL 연산자&#39;</strong> 로 할 수 있다.</p>
<p><strong>[부정 비교 연산자]</strong></p>
<table>
<thead>
<tr>
<th>연산자</th>
<th>의미</th>
</tr>
</thead>
<tbody><tr>
<td><strong>!=</strong></td>
<td>같지 않다.</td>
</tr>
<tr>
<td><strong>&lt;&gt;</strong></td>
<td>같지 않다.</td>
</tr>
<tr>
<td><strong>^=</strong></td>
<td>같지 않다.</td>
</tr>
<tr>
<td><strong>NOT 칼럼명 =</strong></td>
<td>~칼럼의 값이 ~와 같지 않다.</td>
</tr>
<tr>
<td><strong>NOT 칼럼명 &gt;</strong></td>
<td>~칼럼의 값이 ~보다 크지 않다.</td>
</tr>
<tr>
<td><strong>NOT 칼럼명 &lt;</strong></td>
<td>~칼럼의 값이 ~보다 작지 않다.</td>
</tr>
</tbody></table>
<p><strong>[부정 SQL 연산자]</strong></p>
<table>
<thead>
<tr>
<th>연산자</th>
<th>의미</th>
</tr>
</thead>
<tbody><tr>
<td><strong>NOT BETWEEN A AND B</strong></td>
<td>A와 B의 값 사이에 있지 않다.</td>
</tr>
<tr>
<td><strong>NOT IN(리스트)</strong></td>
<td>같지 않다.</td>
</tr>
<tr>
<td><strong>IS NOT NULL</strong></td>
<td>NULL값이 아니다.</td>
</tr>
</tbody></table>
<hr>
<h2 id="5-3-char-vs-varchar2">5-3) CHAR vs VARCHAR2</h2>
<h3 id="양쪽이-모두-char-타입인-경우">양쪽이 모두 CHAR 타입인 경우</h3>
<ul>
<li>길이가 서로 다르면 작은 쪽에 공백을 추가하여 길이를 같게 한다.</li>
<li>서로 다른 문자가 나올 때까지 비교한다.</li>
<li>달라진 첫 번째 값에 따라 크기를 결정한다.</li>
<li>공백의 수만 다르다면 같은 값으로 결정한다.</li>
<li><em>길이가 서로 달라도 공백만 다르다면 같다고 판단한다.*</em> </li>
<li><blockquote>
<p>공백은 결과집합에 영향을 주지 않는다.</p>
</blockquote>
</li>
</ul>
<h3 id="비교-연산자-중-한쪽이-varchar2-타입인-경우">비교 연산자 중 한쪽이 VARCHAR2 타입인 경우</h3>
<ul>
<li>서로 다른 문자가 나올 때까지 비교한다.</li>
<li>길이가 다르다면 짧은 것이 끝날 때까지만 비교한 후 길이가 긴 것이 크다고 판단한다.</li>
<li>길이가 같고 다른 것이 없다면 같다고 판단한다.</li>
<li>VARCHAR2는 공백도 문자로 판단한다.</li>
</ul>
<h3 id="상수-값과-비교">상수 값과 비교</h3>
<ul>
<li>상수 쪽을 칼럼의 데이터형과 동일하게 바꾸고 비교한다.</li>
<li>칼럼이 CHAR타입이면 CHAR타입인 경우를 적용한다.(공백은 문자로 판단하지 않는다.)</li>
<li>칼럼이 VARCHAR2타입이면 VARCHAR2 타입인 경우를 적용한다. (공백도 문자로 판단한다.)</li>
</ul>
<hr>
<h2 id="5-4-where절에-사용하는-rownum">5-4) WHERE절에 사용하는 ROWNUM</h2>
<h3 id="rownum">ROWNUM</h3>
<p>: 특정 테이블에서 데이터가 조회될 때 출력되는 행의 순번을 의미하는 Pseudo칼럼이다.</p>
<ul>
<li>WHERE절의 조건으로 이용하여 결과 행의 건수를 제한할 수 있다.</li>
</ul>
<blockquote>
<p><span style="color:gray">SELECT 원하는 칼럼들 FROM 테이블명 WHERE <span style="color:green"> ROWNUM </span><span style="color:gray"> 제한조건; </span></span></p>
</blockquote>
<br>

<hr>
<br>

<h1 id="6-함수">6. 함수</h1>
<h2 id="6-1-단일행-함수의-주요-특징">6-1) 단일행 함수의 주요 특징</h2>
<h3 id="단일행-함수">단일행 함수</h3>
<p>: 내장 함수 중 입력값에 대해서 단 하나의 출력값을 리턴하는 함수를 말한다.</p>
<ul>
<li>SELECT, WHERE, ORDER BY 절에 사용 가능하다.</li>
<li>각 행들에 대해 개별적으로 작용하여 데이터 값들을 조작하고 각각의 행에 대한 조작 결과를 리턴한다.</li>
<li>여러 인자를 입력해도 단 하나의 결과만 리턴한다.</li>
<li>함수의 인자로 상수, 변수, 표현식이 사용 가능하고 하나의 인수를 가지는 경우도 있지만 여러 개의 인수를 가질 수도 있다.</li>
<li>함수의 인자로 함수 호출 자체를 사용하는 함수의 중첩도 가능하다.(함수 안에서 함수를 호출하는 것이 가능하다.)</li>
</ul>
<hr>
<h2 id="6-2-단일행-함수의-종류">6-2) 단일행 함수의 종류</h2>
<h3 id="문자형-함수">문자형 함수</h3>
<p>: 문자를 입력하면 문자나 숫자 값을 반환한다.
<span style="color:green">LOWER, UPPER, SUBSTR, LENGTH, LTRIM, RTRIM, TRIM, ASCII</span></p>
<table>
<thead>
<tr>
<th>SQL</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>LOWER</strong></td>
<td>소문자로 변환한다.</td>
</tr>
<tr>
<td><strong>UPPER</strong></td>
<td>대문자로 변환한다.</td>
</tr>
<tr>
<td><strong>SUBSTR</strong></td>
<td>문자열의 원하는 문자의 처음과 끝을 지정하여 출력한다.</td>
</tr>
<tr>
<td><strong>LENGTH</strong></td>
<td>문자열의 길이를 구한다.</td>
</tr>
<tr>
<td><strong>CONCAT</strong></td>
<td>원하는 문자열들을 합친다.</td>
</tr>
<tr>
<td><strong>RTRIM</strong></td>
<td>오른쪽에 있는 공백을 제거한다.</td>
</tr>
<tr>
<td><strong>LTRIM</strong></td>
<td>왼쪽에 있는 공백을 제거한다.</td>
</tr>
<tr>
<td><strong>ASCII</strong></td>
<td>알파벳에 해당하는 아스키 코드값을 반환한다.</td>
</tr>
<tr>
<td><strong>CHR</strong></td>
<td>아스키 코드에 해당하는 문자값을 반환한다.</td>
</tr>
</tbody></table>
<h3 id="숫자형-함수">숫자형 함수</h3>
<p>: 숫자를 입력하면 숫자 값을 반환한다.
<span style="color:green">ABS, MOD, ROUND, TRUNC, SIGN, CHR, CEIL, FLOOR, EXP, LOG, LN, POWER, SIN, COS, TAN</span></p>
<table>
<thead>
<tr>
<th>SQL</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>ABS</strong></td>
<td>절대 값을 반환한다.</td>
</tr>
<tr>
<td><strong>SIGN</strong></td>
<td>입력값이 양수면 <strong>1</strong>, 음수면 <strong>-1</strong>, 0이면 <strong>0</strong>을 리턴한다.</td>
</tr>
<tr>
<td><strong>MOD</strong></td>
<td>나머지 값을 반환한다.</td>
</tr>
<tr>
<td><strong>CEIL</strong></td>
<td>무조건 올림한다.</td>
</tr>
<tr>
<td><strong>FLOOR</strong></td>
<td>무조건 내림한다.</td>
</tr>
<tr>
<td><strong>ROUND</strong></td>
<td>소수점 n번째 자리에서 반올림한다.<br><span style="color:green">ex)ROUND(숫자,원하는 소수점 자리)</span></td>
</tr>
</tbody></table>
<h3 id="날짜형-함수">날짜형 함수</h3>
<p>: DATE 타입의 값을 연산한다.
<span style="color:green">SYSDATE, EXTRACT, TO_NUMBER</span></p>
<table>
<thead>
<tr>
<th>SQL</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>SYSDATE</strong></td>
<td>현재 <strong>년월일시분초</strong>를 출력한다.</td>
</tr>
<tr>
<td><strong>SYSDATE -(1/24)</strong></td>
<td>현재에서 1시간 빼기</td>
</tr>
<tr>
<td><strong>SYSDATE -(1/24/60)</strong></td>
<td>현재에서 1분 빼기</td>
</tr>
<tr>
<td><strong>EXTRACT</strong></td>
<td><strong>년 ,월 ,일</strong> 택하여 출력한다. <br><span style="color:green">ex) EXTRACT(YEAR FROM SYSDATE),EXTRACT(MONTH FROM SYSDATE)</span></td>
</tr>
<tr>
<td><strong>TO_NUMBER</strong></td>
<td><strong>년, 월, 일, 시, 분, 초</strong> 택하여 출력한다.<br><span style="color:green">ex) TO_NUMBER(TO_CHAR(SYSDATE, &#39;YYYY&#39;)) </span></td>
</tr>
<tr>
<td><strong>TO_CHAR</strong></td>
<td><strong>년, 월, 일, 시, 분, 초</strong> 택하여 문자열로 출력한다. <br><span style="color:green">ex) TO_CHAR(SYSDATE, &#39;YYYY&#39;)</span></td>
</tr>
</tbody></table>
<h3 id="변환형-함수">변환형 함수</h3>
<p>: 문자, 숫자, 날짜형의 데이터형을 다른 데이터형으로 형변환한다.
<span style="color:green">TO_NUMBER, TO_CHAR, TO_DATE, CONVERT</span></p>
<h3 id="null-관련-함수">NULL 관련 함수</h3>
<p>: NULL을 처리하기 위한 함수이다.
<span style="color:green">NVL, NULLIF, COALESCE</span></p>
<table>
<thead>
<tr>
<th>SQL</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>NULLIF(&#39;문자열&#39;,&#39;문자열&#39;</strong></td>
<td>두 문자열이 다르면 첫 번째 문자열을 출력한다.</td>
</tr>
<tr>
<td><strong>NVL(NULLIF(&#39;문자열&#39;,&#39;문자열&#39;),&#39;같음&#39;)</strong></td>
<td>두 문자열이 같아 NULL을 출ㄹ력하고 NVL함수로 NULL이면 <br>&#39;같음&#39;으로 출력한다.</td>
</tr>
<tr>
<td><strong>COALESCE(NULL, NULL, &#39;문자열&#39;)</strong></td>
<td>NULL이 아닌 첫 번째 인자를 출력한다.</td>
</tr>
</tbody></table>
<hr>
<h2 id="6-4-데이터-형변환의-방식">6-4) 데이터 형변환의 방식</h2>
<blockquote>
<p>모든 데이터는 자신만의 데이터형(데이터 타입)을 가지고 있다.<br>데이터형을 변환하는 것을 ** 데이터 형변환 ** 이라고 한다.</p>
</blockquote>
<h3 id="명시적-형변환">명시적 형변환</h3>
<p>: 데이터 형변환 함수로 데이터형을 변환하도록 명시해 주는 경우이다.</p>
<table>
<thead>
<tr>
<th>SQL</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>TO_CHAR(SYSDATE, &#39;YYYY/MM/DD&#39;</strong></td>
<td>날짜형을 문자형으로 변환한다.</td>
</tr>
<tr>
<td><strong>TO_CHAR(10.25, &#39;$999.999.999&#39;)</strong></td>
<td>숫자형을 문자형으로 변환한다.</td>
</tr>
<tr>
<td><strong>TO_NUMBER(&#39;100&#39;)+TO_NUMBER(&#39;100&#39;)</strong></td>
<td>문자형을 숫자형으로 변환한다.</td>
</tr>
<tr>
<td><strong>TO_DATE(TO_CHAR(SYSDATE,&#39;YYYYMMDD&#39;),&#39;YYYYMMDD&#39;)</strong></td>
<td>날짜형을 문자형으로 변환 후 <br>문자형을 다시 날짜형으로 변환한다.</td>
</tr>
</tbody></table>
<h3 id="암시적-형변환">암시적 형변환</h3>
<p>: DBMS가 자동으로 데이터형을 변환하는 경우이다.</p>
<ul>
<li>SQL문 작성 시 문자형과 숫자형을 서로 비교할 때 명시적으로 형변환을 하지 않으면 DBMS 내부에서 자동으로 2개의 각기 다른 데이터형을 동일한 데이터형으로 변환한 후 연산을 처리하게 된다.</li>
<li>SQL문 작성자가 의도하지 않은 데이터 형변환이 자동으로 발생하는 것이다.
  -&gt; 암시적 형변환의 발생으로 인해 칼럼에 존재하는 인덱스를 정상적으로 스캔하지 못하여 SQL문의 성능이 현저하게 느려기지도 한다.<span style="color:green">(SQL문 작성 시 가급적 명시적 형변환을 하여 데이터형을 동일하게 설정하는 것이 좋다.)</span></li>
</ul>
<hr>
<h2 id="6-5-단일행-case-표현의-종류">6-5) 단일행 CASE 표현의 종류</h2>
<blockquote>
<p>CASE 표현
: 특정 값에 대해서 조건에 따라 각기 다른 값을 리턴하도록 하는 것</p>
</blockquote>
<table>
<thead>
<tr>
<th>종류</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>CASE WHEN 조건<br>THEN 값 혹은 SQL문<br>ELSE 값 혹은 SQL문<br>END</strong></td>
<td>조건이 맞으면 THEN절을 수행하고 그렇지 않으면<br> ELSE절을 수행한다.</td>
</tr>
<tr>
<td><strong>DECODE(조건1, 값1, 조건2, 값2, 디폴트 값)</strong></td>
<td>조건1이 TRUE면 값1을 가져오고 그렇지 않고 조건2가<br> TRUE이면 값2를 가져오고 그렇지 않으면 디폴트 값을 가져온다.</td>
</tr>
</tbody></table>
<br>

<hr>
<br>

<h1 id="7-group-by-having절">7. GROUP BY, HAVING절</h1>
<h2 id="7-1-집계-함수">7-1) 집계 함수</h2>
<p>: 각각의 그룹별로 단 하나의 행을 리턴해주는 함수를 말한다.</p>
<ul>
<li>GROUP BY절에 기재한 칼럼을 기준으로 그룹으로 모인 상태에서 각 그룹의 집계를 계산하는 데 사용된다.</li>
<li>여러 행들의 그룹이 모여서 그룹당 단 하나의 결과 행을 되돌려주는 함수이다.</li>
<li>SELECT절, HAVING절, GROUP BY절에 사용할 수 있다.</li>
</ul>
<hr>
<h2 id="7-2-all과-distinct">7-2) ALL과 DISTINCT</h2>
<h3 id="all">ALL</h3>
<blockquote>
<p>DEFAULT 옵션으로 생략이 가능하다.</p>
</blockquote>
<h3 id="distinct">DISTINCT</h3>
<blockquote>
<p>유일한 값을 출력한다.</p>
</blockquote>
<ul>
<li>중복이 제거된 값만 출력한다.</li>
</ul>
<hr>
<h2 id="7-3-집계-함수의-종류">7-3) 집계 함수의 종류</h2>
<table>
<thead>
<tr>
<th>항목</th>
<th>결과</th>
</tr>
</thead>
<tbody><tr>
<td><strong>COUNT(*)</strong></td>
<td>NULL값을 포함한 행의 수를 출력한다.</td>
</tr>
<tr>
<td><strong>COUNT(표현식)</strong></td>
<td>표현식의 값이 NULL이 아닌 행의 수를 출력한다.</td>
</tr>
<tr>
<td><strong>SUM(표현식)</strong></td>
<td>표현식이 NULL 값인 것을 제외한 합계를 출력한다.</td>
</tr>
<tr>
<td><strong>AVG(표현식)</strong></td>
<td>표현식이 NULL 값인 것을 제외한 평균을 출력한다.</td>
</tr>
<tr>
<td><strong>MAX(표현식)</strong></td>
<td>표현식이 NULL 값인 것을 제외한 최대값을 출력한다.</td>
</tr>
<tr>
<td><strong>MIN(표현식)</strong></td>
<td>표현식이 NULL 값인 것을 제외한 최소값을 출력한다.</td>
</tr>
<tr>
<td><strong>STDDEV(표현식)</strong></td>
<td>표현식이 NULL 값인 것을 제외한 표준편차를 출력한다.</td>
</tr>
<tr>
<td><strong>VARIAN(표현식)</strong></td>
<td>표현식이 NULL 값인 것을 제외한 분산을 출력한다.</td>
</tr>
</tbody></table>
<hr>
<h2 id="7-4-group-by절">7-4) GROUP BY절</h2>
<ul>
<li>일반적으로 FROM절 아래에 위치한다.</li>
<li>GROUP BY절에 기재한 칼럼을 기준으로 결과집합을 그룹화한다.</li>
<li>GROUP BY절을 통해 소그룹별 기준 칼럼을 정한 후, SELECT절에서는 집계 함수를 사용한다.</li>
<li>집계 함수의 결과는 NULL 값을 가진 행을 제외하고 수행한다.</li>
<li>GROUP BY절에서는 SELECT절과는 달리 ALIAS명을 사용할 수 없다.</li>
<li>GROUP BY절보다 WHERE절이 먼저 수행되므로 집계 함수는 WHERE절에 올 수 없다.</li>
<li>WHERE절은 전체 데이터를 GROUP으로 나누기 전에 행들을 필터 처리한다.
  -&gt; WHERE절에 의해 리턴되는 행들을 대상으로 GROUP BY를 한다. <span style="color:coral"><br>(집계 함수는 WHERE절에는 올 수가 없다.</span></li>
</ul>
<hr>
<h2 id="7-5-having절">7-5) HAVING절</h2>
<p>: WHERE절과 유사한 기능을 하지만 WHERE절이 테이블에서 추출할 행을 제한한다고 하면 HAVING절은 <strong>그룹핑한 결과집합에 대한 조건을 주어 추출할 집계 데이터를 제한하는 역할</strong>을 한다.</p>
<ul>
<li>WHERE절에서는 집계 함수를 쓸 수 없다.</li>
<li>집계된 결과집합을 기준으로 특정 조건을 주고 싶은 경우 HAVING절을 이용한다.</li>
<li>HAVING절은 WHERE절과 비슷하지만 그룹을 나타내는 결과집행의 행에 조건이 적용된다는 점에서 차이가 있다.</li>
<li>HAVING절에 들어가는 조건은 GROUP BY절의 기준 항목이나 소그룹의 집계 함수가 사용된다.</li>
<li>GROUP BY절에 의한 소그룹별로 만들어진 집계 데이터 중, HAVING절에서 제한 조건을 두어 조건을 만족하는 내용만 출력한다.</li>
<li>HAVING절은 일반적으로 GROUP BY절 뒤에 위치한다.</li>
<li>HAVING절이 GROUP BY절 앞에 나와도 결과는 동일하다.</li>
</ul>
<hr>
<h2 id="7-6-case-when문-사용">7-6) CASE WHEN문 사용</h2>
<blockquote>
<p>결과집합을 출력할 때 사용자가 원하는 조건에 따라 분기처리하여 결과집합을 출력할 수 있다.</p>
</blockquote>
<br>

<hr>
<br>

<h1 id="8-order-by절">8. ORDER BY절</h1>
<h2 id="8-1-order-by절의-개요">8-1) ORDER BY절의 개요</h2>
<p>: SELECT문에서 조회한 데이터 집합을 특정 칼럼 기준으로 정렬한 후 데이터를 출력하는 역할이다.</p>
<ul>
<li>SQL문장으로 조회된 데이터(Rows)를 다양한 목적에 맞게 특정 칼럼을 기준으로 정렬하여 출력하는데 사용한다.</li>
<li>칼럼명 대신에 SELECT절에서 사용한 앨리어스명이나 칼럼 순서를 나타내는 정수도 사용 가능하다.</li>
<li>칼럼 뒤에 정렬 방식을 기재할 수 있으며 오름차순(ASC), 내림차순(DESC)이 있다.(정렬방식을 지정하지 않으면 기본적으로 오름차순으로 적용)</li>
<li>숫자형 데이터형은 오름차순으로 정렬했을 경우에 가장 작은 값부터 출력, 날짜형 데이터형은 오름차순으로 정렬했을 경우 가장 빠른 값이 먼저 출력된다.</li>
<li>오라클 DBMS기준으로 NULL 값을 가장 큰 값으로 간주하여 <strong>오름차순으로 정렬했을 경우에는 가장 마지막</strong>에 <strong>내림차순으로 정렬했을 경우에는 가장 먼저</strong> 위치한다.</li>
</ul>
<hr>
<h2 id="8-2-null의-정렬">8-2) NULL의 정렬</h2>
<blockquote>
<p>오라클은 ORDER BY절에 기재한 칼럼의 값이 NULL이면 가장 큰 값이라고 인식한다.</p>
</blockquote>
<ul>
<li>ORDER BY 절에서 NULL값이 존재하는 칼럼을 기재하고 내림차순 정렬을 한다면 해당 행의 칼럼값이 NULL인 행이 결과집합의 맨 위로 올라오게 된다.</li>
</ul>
<hr>
<h2 id="8-3-select문의-실행-순서">8-3) SELECT문의 실행 순서</h2>
<ol>
<li>FROM절
: 조회 테이블을 참조한다.</li>
<li>WHERE절
: 조회 대상 행을 조회한다.</li>
<li>GROUP BY절
: 대상 행을 그룹화한다.</li>
<li>HAVING절
: 그룹화한 값에서 조건에 맞는 것을 출력한다.</li>
<li>SELECT절
: SELECT절에 기재한 칼럼이나 식을 계산한다.</li>
<li>ORDER BY절
: 출력되는 결과집합을 정렬한다.</li>
</ol>
<hr>
<h2 id="8-4-group-by절-사용-시-정렬작업">8-4) GROUP BY절 사용 시 정렬작업</h2>
<blockquote>
<p>ORDER BY절을 사용할 떄 SELECT문에 GROUP BY절을 사용한 경우 반드시 SELECT절에 기재한 칼럼 혹은 표현식을 ORDER BY절에 기재해야 한다.</p>
</blockquote>
<hr>
<h2 id="8-5-order-by절과-부분-범위-처리">8-5) ORDER BY절과 부분 범위 처리</h2>
<h3 id="부분-범위-처리">부분 범위 처리</h3>
<blockquote>
<p> 조회를 원하는 데이터 집합이 특정 칼럼의 정렬 기준에 따라 부분적으로 조회하고 조회 연산을 멈추게 하는 것을 말한다.</p>
</blockquote>
<p><code>OREDR BY절</code> + <code>ROWNUM</code> 조건을 결합</p>
<br>

<hr>
<br>

<h1 id="9-조인">9. 조인</h1>
<h2 id="9-1-조인이란">9-1) 조인이란?</h2>
<p>: 2개 이상의 테이블을 연결 또는 결합하여 데이터를 출력하는 것을 말한다.</p>
<ul>
<li>일반적으로 사용되는 SQL문의 상당수가 조인으로 이루어져 있다.</li>
<li>정규화된 데이터 모델은 여러 개의 테이블에 나누어 저장되므로 조인이 필연적으로 발생한다.</li>
<li>일반적인 경우 기본키와 외래키의 값 연관에 의해 조인이 이루어지며 기본키, 외래키 관계와는 별도로 일반 칼럼끼리 조인이 이루어질 수도 있다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQLD] 데이터 모델과 성능💡]]></title>
            <link>https://velog.io/@yejin_823/SQLD2</link>
            <guid>https://velog.io/@yejin_823/SQLD2</guid>
            <pubDate>Sun, 25 Feb 2024 07:19:54 GMT</pubDate>
            <description><![CDATA[<br>

<h1 id="1-성능-데이터-모델링의-개요">1. 성능 데이터 모델링의 개요</h1>
<h2 id="1-1-성능-데이터-모델링의-정의">1-1) 성능 데이터 모델링의 정의</h2>
<blockquote>
<p><strong>데이터베이스의 성능 향상을 목적</strong> 으로 데이터 모델 설계 시점부터 정규화, 반정규화, 테이블 통합, 테이블 분할, 조인 구조, PK, FK 등 여러가지 성능과 관련괸 사항들이 <strong>데이터 모델링 작업에 반영될 수 있도록 하는 것</strong> 을 의미한다. </p>
</blockquote>
<hr>
<h2 id="1-2-성능-데이터-모델링-수행-시점">1-2) 성능 데이터 모델링 수행 시점</h2>
<ul>
<li>IT 시스템 구축 시 <code>분석 / 설계 단계</code>
  -&gt; <strong>성능 저하에 따른 비용을 최소화</strong></li>
</ul>
<hr>
<h2 id="1-3-성능-데이터-모델링-고려사항">1-3) 성능 데이터 모델링 고려사항</h2>
<ol>
<li>데이터 모델링 시 정규화 작업을 수행한다.
 -&gt; 정규화된 모델은 주요 관심사별로 데이터를 분산시키는 효과 (성능 향상)</li>
<li>데이터베이스의 용량을 산정한다.</li>
<li>데이터베이스에 발생되는 트랜잭션의 유형을 파악한다.</li>
<li>데이터베이스 용량 및 트랜잭션의 유형에 따라 반정규화를 수행한다.</li>
<li>이력 데이터 모델의 조정, PK / FK 조정, 슈퍼 / 서브 타입 변환 조정 등을 수행한다.</li>
<li>성능 관점에서 데이터 모델을 검증한다.</li>
</ol>
<br>

<hr>
<br>

<h1 id="2-정규화와-성능">2. 정규화와 성능</h1>
<h2 id="2-1-정규화를-통한-성능-향상-전략">2-1) 정규화를 통한 성능 향상 전략</h2>
<blockquote>
<p>** 정규화를 수행한다는 것 ** 은 데이터를 결정하는 결정자에 의해 함수적 종속을 가지고 있는 일반 속성을 의존자로 하여 ** 입력/수정/삭제 이상현상을 제거 **하는 것</p>
</blockquote>
<h3 id="정규화-작업">정규화 작업</h3>
<ul>
<li>데이터의 중복 속성을 제거</li>
<li>테이블의 데이터 용량이 최소화</li>
</ul>
<p>** 정규화된 테이블에 대한 데이터 조회 시에는 성능의 향상 혹은 저하가 일어나고 입력, 수정, 삭제 시에는 성능이 향상됨 **</p>
<hr>
<h2 id="2-2-정규화-용어">2-2) 정규화 용어</h2>
<h3 id="정규화-normalization">정규화 (Normalization)</h3>
<blockquote>
<p>함수적 종속성 등과 같은 이론에 근거하여 관계형 데이터베이스 테이블의 삽입/삭제/갱신 이상 현상 발생을 최소화하기 위해 좀 더 작은 단위의 테이블로 설계하는 과정 <br>
-&gt; ** 정규화는 데이터 모델을 정규형에 맞도록 고치는 과정 **</p>
</blockquote>
<h3 id="정규형-nf--normal-form">정규형 (NF : Normal Form)</h3>
<blockquote>
<p>정규화 결과에 의해 도출된 데이터 모델이 갖춰야 할 특성을 만족한 형태 <br>
-&gt; ** 정규화한 결과 **</p>
</blockquote>
<h3 id="함수적-종속성-fd--functional-dependency">함수적 종속성 (FD : Functional Dependency)</h3>
<blockquote>
<p>테이블의 특정 칼럼 A의 값을 알면 다른 칼럼 B의 값을 알 수 있을 때, 칼럼 B는 칼럼 A에 함수적 종속성이 있다고 한다. <br>
<span style="color:green">ex) 주민번호를 알면 고객명을 알 수 있을 때 <br> <strong>&quot;고객명은 주민등록번호에 함수적 종속성이 있다.&quot;</strong></span></p>
</blockquote>
<h3 id="결정자-determinant">결정자 (Determinant)</h3>
<blockquote>
<p>위의 함수적 종속성 설명에서 칼럼 A를 결정자라고 한다. <br>
-&gt; 주민번호는 고객명을 결정하므로 ** 고객명의 결정자**이다.</p>
</blockquote>
<h3 id="다치종속-mvd--multivalued-dependency">다치종속 (MVD : MultiValued Dependency)</h3>
<blockquote>
<p>결정자 칼럼 A에 의해 칼럼 B의 값을 다수 개 알 수 있을 때, 칼럼 B는 칼럼 A에 다치종속되었다고 한다. <br>
<span style="color:green">ex) 학번을 통해 해당 학생이 수강신청한 다수 개의 수강과목을 알 수 있을 때 <br> <strong>&quot;수강과목은 학번에 다치종속된다.&quot;</strong></span></p>
</blockquote>
<hr>
<h2 id="2-3-정규화-효과-및-장점">2-3) 정규화 효과 및 장점</h2>
<ul>
<li>상호 종속성이 강한 데이터 요소들을 분리, 독립된 개념으로 정의하게 됨에 따라 높은 응집도 &amp; 낮은 결합도원칙에 충실해 ** 유연성이 극대화됨 **</li>
<li>개념이 좀 더 세분화됨에 따라 개념에 대한 ** 재활용 가능성이 높아짐 **</li>
<li>식별자가 아닌 속성이 한 번만 표현됨에 따라 ** 중복이 최소화됨**
  -&gt; 데이터 품질이 확보되고 저장공간이 절약되며 DML처리 시 성능 향상</li>
</ul>
<hr>
<h2 id="2-4-정규화-이론유형">2-4) 정규화 이론(유형)</h2>
<table>
<thead>
<tr>
<th align="center">정규화 유형</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><span style="color:green"><strong>1차 정규화</strong></span></td>
<td>- 한 속성에 여러 개의 속성값을 갖거나 같은 유형의 속성이 여러 개인 경우 해당 속성을 분리시킨다. <br> - 1차 정규화 작업으로 속성의 원자성을 확보하게 된다.</td>
</tr>
<tr>
<td align="center"><span style="color:green"><strong>2차 정규화</strong></span></td>
<td>- 주식별자에 완전 함수 종속되지 않은 속성을 분리한다. <br> - 2차 정규화 작업으로 부분 종속 속성이 된 속성을 분리한다.</td>
</tr>
<tr>
<td align="center"><span style="color:green"><strong>3차 정규화</strong></span></td>
<td>- 일반 속성끼리 함수 종속이 발생한 속성을 분리한다. <br> - 3차 정규화 작업으로 이행적 종속 속성을 분리한다.</td>
</tr>
<tr>
<td align="center">보이스-코드 <br> 정규화</td>
<td>- 결정자 안에 함수 종속을 가진 주식별자 속성을 분리한다.</td>
</tr>
<tr>
<td align="center">4차 정규화</td>
<td>- 다가 종속 속성을 별도의 엔터티로 분리한다.</td>
</tr>
<tr>
<td align="center">5차 정규화</td>
<td>- 결합 종속일 경우는 2개 이상의 엔터티로 분리한다.</td>
</tr>
</tbody></table>
<h3 id="제1정규형">제1정규형</h3>
<blockquote>
<p>** 한 속성에 여러 개의 속성값을 갖거나 같은 유형의 속성이 여러 개인 경우 해당 속성을 분리시켜야 함을 뜻한다. **</p>
</blockquote>
<h3 id="제2정규형">제2정규형</h3>
<blockquote>
<p>** 제1정규형을 만족하고 모든 PK가 아닌 칼럼은 PK 전체에 종속되어야 한다. PK에 종속적이지 않거나 PK 중 일부 칼럼(들)에만 종속적인 칼럼은 분리되어야 하는 것을 뜻한다. **</p>
</blockquote>
<ul>
<li>갱신이상 문제점을 방지</li>
<li>복합식별자의 일부 칼럼에만 함수 종속하는 속성을 없앤다.</li>
</ul>
<h3 id="제3정규형">제3정규형</h3>
<blockquote>
<p>** 제2정규형을 만족하고 일반 속성들 간에도 함수 종속 관계가 존재하지 않아야 하고, 일반 속성들 간 종속 관계가 존재하는 것들은 분리되어야 하는 것을 뜻한다. **
<br>
🚫위반
<span style="color:coral">1. 식별자를 제외한 일반 속성 간에 함수 종속이 발생하는 경우
</span></p>
</blockquote>
<hr>
<h2 id="2-5-정규화와-성능">2-5) 정규화와 성능</h2>
<ol>
<li>정규화를 수행한 후, 전에 없었던 조인이 발생하게 되더라도 효율적인 인덱스 사용을 통해 조인 연산을 수행하면 성능상의 단점은 거의 없다.</li>
<li>정규화를 수행한 후, 적은 용량의 테이블이 생성된다면 조인 연산 시 적은 용량의 테이블을 먼저 읽어 조인을 수행하면 되므로 성능상 유리하다.</li>
<li>정규화가 제대로 되지 않으면 비슷한 종류의 속성이 여러 개가 되어 과도하게 많은 인덱스가 만들어질 수 있다. 정규화를 한다면 하나의 인덱스만 만들어도 된다.</li>
</ol>
<hr>
<h2 id="2-8-함수적-종속성에-근거한-정규화-수행-필요">2-8) 함수적 종속성에 근거한 정규화 수행 필요</h2>
<h3 id="함수적-종속성">함수적 종속성</h3>
<blockquote>
<p>데이터들이 어떤 기준값(결정자)에 의해 종속되는 현상을 지칭하는 것</p>
</blockquote>
<ul>
<li>기준값 = 결정자</li>
<li>종속되는 값 = 종속자</li>
</ul>
<p><strong>종속자</strong>는 함수적으로 종속성을 가지게 되며, <strong>종속자</strong>는 결정자에 의해서 결정된다.</p>
<br>

<h3 id="정규화-작업-1">정규화 작업</h3>
<blockquote>
<p>** 함수적 종속성을 만족시키는 작업 **</p>
</blockquote>
<br>

<hr>
<br>

<h1 id="3-반정규화와-성능">3. 반정규화와 성능</h1>
<h2 id="3-1-반정규화의-정의">3-1) 반정규화의 정의</h2>
<blockquote>
<p>일반적으로 데이터를 고의적으로 중복 저장하여 <strong>조회 성능을 향상</strong>시키기 위한 기법
→ 데이터를 중복 저장함으로써 <strong>조인 연산이 회피</strong>되어 성능이 향상됨</p>
</blockquote>
<ul>
<li>시스템의 성능 향상 및 개발과 유지보수의 단순화를 위해 반정규화는 <strong>정규화된 데이터 모델을 분석하여 엔터티/속성/관계를 중복, 통합, 분리 등의 작업으로 수행하는 데이터 모델링 기법</strong> 을 의미</li>
<li>중복성의 원리를 활용하여 데이터 조회 시 성능을 향상시키는 역할을 한다.</li>
</ul>
<blockquote>
<p><em>넓은 의미</em> 로 조회 성능을 향상시키기 위해 정규화된 데이터 모델에서 중복, 통합, 분리 등을 수행하는 모든 과정을 의미</p>
</blockquote>
<p><span style="color:green">데이터 무결성이 깨질 수 있는 위험을 무릅쓰고 데이터를 중복하여 반정규화를 적용하는 상황 </span> <br>1. <strong>데이터를 조회할 때 디스크 I/O량이 많아서 성능이 저하되는 경우 **
2. *<em>테이블 간 경로가 너무 멀어 조인으로 인한 성능 저하가 예상되는 경우 *</em>
3. **컬럼을 계산하여 읽을 때 성능이 저하될 것이 예상되는 경우</strong></p>
<hr>
<h2 id="3-2-반정규화의-절차">3-2) 반정규화의 절차</h2>
<h3 id="1-반정규화-대상-조사">1. 반정규화 대상 조사</h3>
<ul>
<li>범위 처리 빈도수 조사</li>
<li>대량의 범위 처리 조사</li>
<li>통계성 프로세스 조사</li>
<li>테이블 조인 개수</li>
</ul>
<h3 id="2-다른-방법-유도-검토">2. 다른 방법 유도 검토</h3>
<ul>
<li>뷰 테이블</li>
<li>클러스터링 적용</li>
<li>인덱스의 조정</li>
<li>응용 애플리케이션 변경</li>
</ul>
<h3 id="3-반정규화-적용">3. 반정규화 적용</h3>
<ul>
<li>테이블 반정규화</li>
<li>속성의 반정규화</li>
<li>관계의 반정규화</li>
</ul>
<hr>
<h2 id="3-3-반정규화-기법">3-3) 반정규화 기법</h2>
<h3 id="테이블-반정규화">테이블 반정규화</h3>
<h4 id="테이블-병합">테이블 병합</h4>
<p>: 여러 개의 테이블을 하나의 테이블로 합치는 것</p>
<ul>
<li>테이블을 병합하면 데이터의 중복 저장이 발생하지만 조회 성능 향상을 위해서(조인 연산의 불필요 등) 테이블을 병합한다.</li>
</ul>
<table>
<thead>
<tr>
<th>기법</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>1:1 관계<br>테이블 병합</td>
<td>- 1:1 관계를 통합하여 성능을 향상시키는 방법이다. <br> - 2개의 테이블을 하나의 테이블로 병합하여 테이블 간 조인 연산을 제거한다.</td>
</tr>
<tr>
<td>1:M 관계<br>테이블 병합</td>
<td>- 1:M 관계를 통합하여 성능을 향상시키는 방법이다. <br> - 2개의 테이블을 하나의 테이블로 병합하여 테이블 간 조인 연산을 제거한다.</td>
</tr>
<tr>
<td>슈퍼/서브 타입 <br> 테이블 병합</td>
<td>- 슈퍼/서브 관계를 통합하여 성능을 향상시키는 방법이다. <br> - 슈퍼/서브 타입 관계를 하나의 테이블로 병합하여 조인 연산을 제거한다.</td>
</tr>
</tbody></table>
<h4 id="테이블-분할">테이블 분할</h4>
<p>: 특정 테이블을 여러 개의 테이블로 쪼개는 것</p>
<table>
<thead>
<tr>
<th>기법</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>수직 분할</td>
<td>- 칼럼 단위의 테이블을 디스크 I/O 분산 처리하기 위해 테이블을 1:1로 분리하여 성능을 향상시키는<br> 방법으로 트랜잭션이 처리되는 유형 파악이 선행되어야 한다. <br><span style="color:green"> ex) 게시글 테이블의 조회수 칼럼은 업데이트가 빈번하게 일어나므로 게시글의 조회수 저장용 테이블을<br>하나 더 만들어서 관리한다.</span></td>
</tr>
<tr>
<td>수평 분할</td>
<td>-로우 단위로 집중 발생되는 트랜잭션을 분석하여 디스크 I/O 및 데이터 접근효율을 높여 성능을 향상<br>하기 위해 로우 단위로 테이블을 쪼개는 방법이다. <br><span style="color:green"> ex) 요금납부 테이블을 각 년원별 요금납부 테이블로 분할한다.</span></td>
</tr>
</tbody></table>
<h4 id="테이블-추가">테이블 추가</h4>
<p>: 특정 테이블을 추가하여 데이터의 중복 저장이라는 비효율이 발생하는 것을 감안하더라도 조회 성능을 높이기 위한 방법</p>
<table>
<thead>
<tr>
<th>기법</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>중복 테이블 추가</strong></td>
<td>- 다른 업무이거나 서버가 다른 경우 동일한 테이블 구조를 중복하여 원격 조인을 <br>제거하여 성능을 향상시킨다.</td>
</tr>
<tr>
<td><strong>통계 테이블 추가</strong></td>
<td>- SUM, AVG 등을 미리 수행하여 계산해둠으로써 조회 시 성능을 향상시킨다.</td>
</tr>
<tr>
<td><strong>이력 테이블 추가</strong></td>
<td>- 이력 테이블 중에서 마스터 테이블에 존재하는 레코드를 중복하여 이력 테이블에 <br>저장하는 반정규화 기법이다.</td>
</tr>
<tr>
<td><strong>부분 테이블 추가</strong></td>
<td>- 특정 테이블에서 전테 칼럼 중 자주 이용(조회)하는 집중화된 칼럼들이 있을 때, <br>디스크 I/O 를 줄이기 위해 해당 칼럼들을 모아놓은 별도의 반정규화된 테이블을 생성한다.</td>
</tr>
<tr>
<td><br></br></td>
<td></td>
</tr>
</tbody></table>
<h3 id="칼럼-반정규화">칼럼 반정규화</h3>
<p>: 특정 칼럼을 추가하여 데이터 모델 내에서 중복으로 데이터가 저장되지만, 조회 성능을 향상시킬 수 있는 방법</p>
<table>
<thead>
<tr>
<th>기법</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>중복 칼럼 추가</strong></td>
<td>- 조인 연산으로 인한 성능 저하를 예방하기 위해 중복 칼럼을 추가하여 조인 연산을 하지 <br>않도록 한다. <br><span style="color:green">ex) 인사 테이블과 부서 테이블을 조인하여 부서 테이블에 있는 부서명 칼럼을 조회할 때, <br>부서명 칼럼을 인사 테이블에도 중복으로 관리하여 부서 테이블을 조인하지 않고 인사 정보를 조회한다.</span></td>
</tr>
<tr>
<td><strong>파생 칼럼 추가</strong></td>
<td>- 트랜잭션이 처리되는 시점에 계산에 의해 발생되는 값의 성능 저하를 예방하기 위해 미리 <br>값을 계산하여 칼럼에 보관한다. <br><span style="color:green">ex) 총매출금액</span></td>
</tr>
<tr>
<td><strong>이력 테이블 칼럼 추가</strong></td>
<td>- 대량의 이력 데이터를 처리할 때 불특정한 날 조회나 최근 값을 조회할 때 나타날 수 있는 <bt>성능 저하를 예방하기 위해 이력 테이블에 칼럼을 추가한다. <br><span style="color:green">ex) 최근값여부, 시작일자, 종료일자</span></td>
</tr>
<tr>
<td><strong>PK에 의한 칼럼 추가</strong></td>
<td>- 복합의미를 갖는 PK를 단일 속성으로 구성하였을 경우 단일 PK안에서 특정 값을 별도로 <br>조회하는 경우 성능 저하가 발생할 수 있다. <br> - 이때 이미 PK안에 데이터가 존재하지만 성능 향상을 위해 일반 속성으로 생성하는 방법이 <br>PK에 의한 칼럼 추가 반정규화이다. <br><span style="color:green">ex) 주문번호 값의 구성이 &quot;상품코드+주문일자(YYYYMMDD)+주문순번&quot;으로 되어 있을 <br>경우 주문번호 안에 존재하는 주문일자를 일반 속성으로 도출한 후 주문일자 칼럼을 인덱스<br>로 생성한다.</span></td>
</tr>
<tr>
<td><strong>응용 시스템의 오작동을 위한 칼럼 추가</strong></td>
<td>- 비즈니스적으로 의미가 없지만 사용자가 데이터 처리를 하다가 잘못 처리하여 원래의 <br>값으로 복구를 원하는 경우 이전 데이터를 임시적으로 중복하여 보관하는 기법이다. <br> - 칼럼으로 이것을 보관하는 방법은 오작동 처리를 위한 임시적인 기법이지만, 이것을 이력 <br>데이터 모델로 풀어내면 정상적인 데이터 모델의 기법이 될 수 있다.</td>
</tr>
<tr>
<td><br></br></td>
<td></td>
</tr>
</tbody></table>
<h3 id="관계-반정규화">관계 반정규화</h3>
<p>: 데이터 무결성을 깨뜨릴 위험을 갖지 않고서도 데이터 처리의 성능을 향상시킬 수 있는 반정규화 기법</p>
<table>
<thead>
<tr>
<th>기법</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>중복 관계 추가</strong></td>
<td>데이터를 처리하기 위한 여러 경로를 거쳐 조인이 가능하지만, 이때 발생할 수 있는 성능저하를 <br>예방하기 위해 추가적인 관계를 맺는 방법</td>
</tr>
</tbody></table>
<br>

<hr>
<br>

<h1 id="4-대량-데이터에-다른-성능">4. 대량 데이터에 다른 성능</h1>
<h2 id="4-1-대량-데이터-발생에-따른-테이블-분할-개요">4-1) 대량 데이터 발생에 따른 테이블 분할 개요</h2>
<p> 대량의 데이터가 존재하는 테이블에 많은 트랜잭션이 발생하여 성능이 저하되는 테이블 구조는 수평 / 수직 분할 설계를 통해 성능 저하를 예방할 수 있다.</p>
<h3 id="수평-분할">수평 분할</h3>
<p>: 행 단위로 분할하여 I/O를 감소시키는 방법</p>
<h3 id="수직-분할">수직 분할</h3>
<p>: 칼럼 단위로 분할하여 I/O를 감소시키는 방법</p>
<blockquote>
<p>** Input / Output (I/O) **</p>
</blockquote>
<ul>
<li>테이블 내에 모든 행은 블록 단위로 디스크에 저장된다.</li>
<li>오라클 DBMS 기준 1개의 블록은 8,192바이트(=8킬로바이트)이다. 하나의 블록마다 8,192바이트를 저장하고 그러한 블록이 모여서 테이블의 데이터를 이루게 된다.</li>
<li>칼럼이 많아지게 되면 하나의 행을 저장 시 물리적인 디스크에 여러 블록에 걸쳐 데이터가 저장될 가능성이 높아진다. 이러한 경우 하나의 행을 읽더라도 여러 개의 블록을 읽어야 한다.</li>
<li>특정 테이블에서 한 행의 용량이 8,193바이트라고 가정하면 하나의 행을 읽더라도 2개의 블록을 읽게 된다. 2개의 블록을 읽었으니 총 16,384바이트를 읽게 되고 그중 8,191바이트는 버려진다.</li>
<li>자연스럽게 SQL문의 블록 I/O 의 수가 많아지게 되어 성능 저하가 일어난다.</li>
</ul>
<p><br></br></p>
<h3 id="성능-저하-현상">성능 저하 현상</h3>
<p><code>많은 블록에 데이터가 저장되면 데이터 조회 시 절대적인 블록 I/O횟수가 많아지면 디스크 I/O (고비용의 작업으로 DBMS성능저하 유발)할 가능성도 높아진다.</code></p>
<p><strong>로우 체이닝 (Row Chaining)</strong>
: 로우 길이가 너무 길어서 데이터 블록 하나에 데이터가 모두 저장되지 않고 2개 이상의 블록에 걸쳐 하나의 로우가 저장되어 있는 형태</p>
<ul>
<li>하나의 행을 읽을 때 2개 이상의 데이터 블록을 읽게 될 수 있는 것</li>
<li>절대적으로 읽어야 할 데이터 블록의 수가 늘어나면서 성능이 저하된다.</li>
</ul>
<p><strong>로우 마이그레이션 (Row Migration)</strong>
: 데이터 블록에서 수정이 발생하면 수정된 데이터를 해당 데이터 블록에서 저장하지 못하고 다른 블록의 빈 공간을 찾아 저장하는 방식</p>
<ul>
<li>해당 현상이 일어나면서 하나의 행을 읽을 때 2개 이상의 데이터 블록을 읽게 된다.</li>
<li>로우 체이닝 현상과 마찬가지로 절대적으로 읽어야 할 데이터 블록의 수가 늘어나면서 성능이 저하된다.</li>
</ul>
<hr>
<h2 id="4-2-한-테이블에-많은-수의-칼럼을-가지는-경우의-성능-저하">4-2) 한 테이블에 많은 수의 칼럼을 가지는 경우의 성능 저하</h2>
<p>조회대상이 아닌 칼럼은 버려지게 되어 불필요한 블록 I/O의 수가 많아지면서 자연스럽게 디스크 I/O의 양도 증가된다. 디스크 I/O가 많아지면 DBMS의 전체 성능이 저하된다.</p>
<h3 id="테이블-수직-분할">테이블 수직 분할</h3>
<ul>
<li>1:1 관계로 수직 분할한다.</li>
<li>분리된 테이블을 칼럼의 수가 적어지므로 1개의 행을 읽기 위해서 절대저으로 읽어야 할 데이터 블록의 수가 줄어들어 로우 마이그레이션과 로우 체이닝 현상이 감소한다.</li>
<li>조회 시에도 디스크 I/O 가 줄어들어 성능이 좋아진다.</li>
</ul>
<hr>
<h2 id="4-3-한-테이블에-많은-수의-행을-가지는-경우의-성능-저하">4-3) 한 테이블에 많은 수의 행을 가지는 경우의 성능 저하</h2>
<p>대용량 테이블은 행의 수가 많아서 SQL문의 성능이 저하될 수 있다.</p>
<h3 id="범위-파티셔닝">범위 파티셔닝</h3>
<p>: 테이블의 저장 건수가 매우 많을 때 특정 기간으로 수평 분할하는 것</p>
<ul>
<li>데이터 보관 주기에 따른 테이블 관리가 용이하다.</li>
<li>특정 시점 기준으로 조회 시 테이블 스캔의 범위가 작으므로 동일한 SQL문이라도 성능이 좋아질 가능성이 높아진다.<h3 id="리스트-파티셔닝">리스트 파티셔닝</h3>
: 대용량 데이터를 특정 값에 따라 분리 저장하여 수평 분할하는 것</li>
<li>데이터 보관 주기에 따라 쉽게 삭제하는 기능은 제공하지 않는다.<h3 id="해시-파티셔닝">해시 파티셔닝</h3>
: 지정된 HASH 조건에 따라 해싱 알고리즘을 적용하여 테이블을 분리한다.</li>
<li>해싱 알고리즘에 의해 각각의 해시 파티션에 분리되어 데이터가 입력되므로 기존에 1개의 테이블에만 데이터를 입력하는 방식보다 입력 시의 경합 부하가 줄어든다.</li>
<li>설계자 및 데이터 입력자는 특정 데이터가 어떤 파티션에 저장되는지 정확하게 예측할 수 없다.</li>
<li>데이터 입력 시 경합에 의한 성능 부하를 해소하기 위해 사용한다.</li>
<li>데이터 보관 주기에 따라 쉽게 삭제하는 기능을 제공할 수 없다.</li>
<li>** 불특정 다수의 데이터를 자동으로 여러 개의 분할해서 저장하므로 특정 테이블에 데이터 처리가 집중적으로 발생될 때 일어날 수 있는 경합을 해소시킬 수 있다. **</li>
</ul>
<hr>
<h2 id="4-4-테이블에-대한-수평수직-분할의-절차">4-4) 테이블에 대한 수평/수직 분할의 절차</h2>
<ol>
<li>데이터 모델링을 완성한다.</li>
<li>데이터베이스(각 테이블의) 용량을 산정한다.</li>
<li>대량의 데이터가 처리되는 테이블에 대해서 트랜잭션 처리 패턴을 분석한다.</li>
<li>칼럼 단위로 집중화된 처리가 발생하는지, 로우 단위로 집중화된 처리가 발생되는지 분석하여 처리 작업이 집중화된 단위로 테이블을 분리하는 것을 검토한다.</li>
</ol>
<br>

<hr>
<br>

<h1 id="5-데이터베이스-구조와-성능">5. 데이터베이스 구조와 성능</h1>
<h2 id="5-1-슈퍼서브-타입-모델">5-1) 슈퍼/서브 타입 모델</h2>
<blockquote>
<p>공통 부분을 슈퍼 타입 엔터티로 도출하고 공통으로부터 상속받아 다른 엔터티와 차이가 있는 속성에 대해서는 별도의 서브 타입 엔터티로 구분하는 방식이다.</p>
</blockquote>
<ul>
<li>업무를 구성하는 데이터의 특징을 분석하겨 공통점과 차이점을 고려하여 효과적으로 표현할 수 있다.</li>
<li>비즈니스의 모습을 정확하게 표현하면서 물리적인 데이터 모델로 변환할 때 선택의 폭을 넓힐 수 있는 장점이 있다.</li>
</ul>
<h3 id="슈퍼서브-타입-모델-변환-방법">슈퍼/서브 타입 모델 변환 방법</h3>
<table>
<thead>
<tr>
<th>방법</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>슈퍼 타입 기준</strong><br>(Single 타입, All in One 타입)</td>
<td>- 슈퍼/서브 타입 모델을 하나의 테이블로 변환한 것이다. <br> <span style="color:green">ex) 고객 테이블 하나로만 구성한다. </span></td>
</tr>
<tr>
<td><strong>서브 타입 기준</strong><br>(Plus타입, Super+Sub 타입)</td>
<td>- 슈퍼/서브 타입을 서브 타입 테이블들로 변환한 것이다. <br> <span style="color:green">ex) 개인고객, 법인고객 테이블로 구성한다.</span> <br>- 도출된 각각의 서브 타입에는 변환 전 슈퍼 엔터티에 있던 칼럼들을 공통적으로 가지고 있다.</td>
</tr>
<tr>
<td><strong>개별 타입 기준</strong><br>(OneToOne 타입, 1:1타입)</td>
<td>- 슈퍼/서브 타입을 슈퍼 타입과 서브 타입의 각각 개별 테이블로 변환한 것이다. <br><span style="color:green">ex)고객, 개인고객, 법인고객 테이블로 구성한다. </span><br>- 슈퍼 테이블, 서브 테이블 모두 생성한 것이다.</td>
</tr>
</tbody></table>
<br>

<hr>
<h2 id="5-2-슈퍼서브-타입-모델-변환의-중요성">5-2) 슈퍼/서브 타입 모델 변환의 중요성</h2>
<ul>
<li>트랜잭션은 항상 슈퍼 타입 기준으로 처리하는데 테이블은 개별 타입으로 유지되어 UNION연산에 의해 성능이 저하될 수 있다. (<strong>슈퍼 타입 기준</strong>으로 테이블을 구성하는 것이 유리한 경우이다.)</li>
<li>트랜잭션은 항상 서브 타입을 기준으로 처리하는데 슈퍼 타입으로 있는 경우 성능이 저하되는 경우가 있다. (<strong>서브 타입 기준</strong>으로 테이블을 구성하는 것이 유리한 경우이다.)</li>
<li>트랜잭션은 항상 개별 타입 기준으로 터리하는데 테이블을 슈퍼 타입으로 되어 있어서 불필요하게 많은 양의 데이터가 집약되어 성능이 저하되는 경우가 있다. (<strong>개별 타입 기준</strong>으로 테이블을 구성하는 것이 유리한 경우이다.)</li>
</ul>
<blockquote>
<p>논리 데이터 모델링 시 정의한 슈퍼/서브 타입을 물리 데이터 모델로 변환 시 적절하게 선택을 할 필요가 있다.</p>
</blockquote>
<hr>
<h2 id="5-3-슈퍼서브-타입논리---슈퍼-타입물리-변환">5-3) 슈퍼/서브 타입(논리) -&gt; 슈퍼 타입(물리) 변환</h2>
<p>: 슈퍼/서브 타입 전체를 하나의 테이블로 구성하는 것을 의미한다.</p>
<blockquote>
<p>슈퍼/서브 타입의 데이터를 처리 시 항상 통합하여 처리한다고 가정하면 <strong>하나의 테이블로 구성하는 것</strong>이 성능상 유리할 수 있다. 데이터를 처리할 때 항상 통합하여 처리하는데, 개별로 분리하게 되면 조인 연산 혹은 UNION ALL 연산 등이 빈번해져서 오히려 성능에 부담을 줄 수 있기 때문</p>
</blockquote>
<hr>
<h2 id="5-4-슈퍼서브-타입논리---서브-타입물리-변환">5-4) 슈퍼/서브 타입(논리) -&gt; 서브 타입(물리) 변환</h2>
<blockquote>
<p>슈퍼/서브 타입의 데이터 처리 시 개별로 처리하는 일이 빈번하다고 가정하면, 많은 양의 데이터를 처리하기 위해 관련된 데이터까지 모두 처리해야 하는 비효율이 발생한다. 이때, <strong>비효율을 제거하기 위해서 서브 타입 기준으로 테이블을 변환한다.</strong></p>
</blockquote>
<ul>
<li>SQL문 성능이 향상될 가능성이 높아진다.</li>
</ul>
<hr>
<h2 id="5-5-슈퍼서브-타입논리---개별-타입물리-변환">5-5) 슈퍼/서브 타입(논리) -&gt; 개별 타입(물리) 변환</h2>
<p>: 기조의 슈퍼/서브 타입을 모두 개별 테이블로 변환한 것을 의미한다.</p>
<blockquote>
<p>대부분의 업무 처리가 개별로 발생한다고 가정하면, 각각에 대해 독립적으로 트랜잭션이 발생하야 당사자에 <strong>꼭 필요한 칼럼들만을</strong> 가지게 하는 것을 말한다.</p>
</blockquote>
<hr>
<h2 id="5-6-슈퍼서브-타입---물리-데이터로-변환-3가지">5-6) 슈퍼/서브 타입 -&gt; 물리 데이터로 변환 3가지</h2>
<table>
<thead>
<tr>
<th>구분</th>
<th>슈퍼타입</th>
<th>서브타입</th>
<th>개별타입</th>
</tr>
</thead>
<tbody><tr>
<td><strong>특징</strong></td>
<td>하나의 테이블</td>
<td>각각의 서브 타입 테이블</td>
<td>슈퍼,서브 각각의 테이블</td>
</tr>
<tr>
<td><strong>확장성</strong></td>
<td>나쁨</td>
<td>보통</td>
<td>좋음</td>
</tr>
<tr>
<td><strong>조인 성능</strong></td>
<td>우수함</td>
<td>나쁨</td>
<td>나쁨</td>
</tr>
<tr>
<td><strong>I/O성능</strong></td>
<td>나쁨</td>
<td>좋음</td>
<td>좋음</td>
</tr>
<tr>
<td><strong>관리 용이성</strong></td>
<td>좋음</td>
<td>좋지 않음</td>
<td>좋지 않음</td>
</tr>
<tr>
<td><strong>트랜잭션 용이에 따른 선택 방법</strong></td>
<td>전체를 일괄적으로 처리하는 경우 선택한다.</td>
<td>각각의 서브 타입을 기준으로 처리하는 경우 선택한다.</td>
<td>각각의 슈퍼,서브 타입을 기준으로 처리하는 경우 선택한다.</td>
</tr>
</tbody></table>
<hr>
<h2 id="5-7-pk칼럼">5-7) PK칼럼</h2>
<p>: 테이블에는 기본키(PK)가 존재한다.</p>
<h3 id="단일-pk">단일 PK</h3>
<p>: 단 1개의 칼럼으로 이루어져 있음</p>
<h3 id="복합-pk">복합 PK</h3>
<p>: 인덱스의 구성 칼럼이 2개 이상인 인덱스를 의미한다.</p>
<ul>
<li>PK칼럼의 순서에 따라 SQL문의 성능이 빨라질 수 있고 느려질 수도 있다.</li>
<li>테이블에 발생되는 트랜잭션 조회 패턴에 따라 복합 PK칼럼의 순서를 조정해야 한다.</li>
<li>인덱스 구성 칼럼 중 맨 앞에 위치하는 칼럼이 가능한 한 조건절에서 &quot;=&quot;조건으로 들어와야 한다.
  -&gt; 인덱스 선두 칼럼에 대한 조건이 들어오지 않는 경우 일반적으로 인덱스 전체를 읽거나 테이블 전체를 읽는다.<strong>(성능 저하 발생)</strong></li>
</ul>
<hr>
<h2 id="5-8-pk칼럼-성능">5-8) PK칼럼 성능</h2>
<blockquote>
<p>테이블 생성 시 PK는 DBMS에서 자동으로 인덱스도 같이 생성되기 때문에 PK가 복합PK일 경우 복합PK의 칼럼 순서가 성능에 영향을 미친다.</p>
</blockquote>
<h3 id="복합-pk-1">복합 PK</h3>
<ul>
<li>논리 데이터 모델링 시 PK순서에 대해 성능적으로 고민하지 않고 물리 데이터 모델에 그대로 적용하는 경우 비효율적인 복합PK의 칼럼 순서로 인해 성능 저하 발생</li>
</ul>
<hr>
<h2 id="5-9-pk칼럼-성능-저하의-경우">5-9) PK칼럼 성능 저하의 경우</h2>
<ol>
<li>복합PK에서 맨 앞의 칼럼에 대한 조건값이 <strong>WHERE절</strong>에 들어오지 않는 경우</li>
<li>복합PK에서 맨 앞의 칼럼에 대한 조건값이 <strong>BETWEEN절</strong>에 들어가는 경우</li>
</ol>
<br>

<hr>
<br>

<h1 id="6-분산-데이터베이스와-성능">6. 분산 데이터베이스와 성능</h1>
<h2 id="6-1-분산-데이터베이스의-개요">6-1) 분산 데이터베이스의 개요</h2>
<p>: 여러 곳으로 분산되어 있는 데이터베이스를 하나의 가상 시스템으로 사용할 수 있도록 한 데이터베이스</p>
<ul>
<li>논리적으로 동일한 시스템에 속하지만 컴퓨터 네트워크를 통해 물리적으로 분산되어 있는 데이터들의 모임 (물리적 위치가 분산되지만, 논리적으로는 여러 사용자가 공유할 수 있다.)</li>
</ul>
<hr>
<h2 id="6-2-분산-데이터베이스의-투명성">6-2) 분산 데이터베이스의 투명성</h2>
<p>: 해당 데이터베이스를 사용하는 사용자가 데이터베이스 시스템이 분산되어 있는 것을 인식하지 못하고 자신만의 데이터베이스 시스템을 사용하는 것으로 인식하도록 만드는 것</p>
<h3 id="분할-투명성단편화">분할 투명성(단편화)</h3>
<blockquote>
<p>하나의 논리적 Relation(테이블)이 여러 단편으로 분할되어 각 단편의 사본이 여러 Site에 저장된다. 하지만 사용자는 한 곳에 위치하는 것으로 인식해야 한다.</p>
</blockquote>
<h3 id="위치-투명성">위치 투명성</h3>
<blockquote>
<p>사용하려는 데이터의 저장 장소를 명시할 필요가 없다. 위치정보가 System Catalog에 유지되어야 한다. 사용자는 데이터가 어디에 위치하는지에 대해 신경 쓸 필요가 없는 것이다.</p>
</blockquote>
<h3 id="지역-사상-투명성">지역 사상 투명성</h3>
<blockquote>
<p>지역 DBMS와 물리적 DB사이의 Mapping을 보장한다. 각 지역 시스템 이름과 무관한 이름을 사용 가능하다. 사용자가 해당 데이터 어느 지역에 위치하는지를 신경 쓸 필요가 없어야 한다.</p>
</blockquote>
<h3 id="중복-투명성">중복 투명성</h3>
<blockquote>
<p>DB객체가 여러 Site에 중복되어 있는지 사용자는 전혀 알 필요가 없는 성질이다.</p>
</blockquote>
<h3 id="장애-투명성">장애 투명성</h3>
<blockquote>
<p>구성요소의 장애에 무관한 Transaction의 원자성을 유지한다. 분산 DB의 장애상황과는 무관하게 원자성을 유지해야 한다.</p>
</blockquote>
<h3 id="병행-투명성">병행 투명성</h3>
<blockquote>
<p>다수 Transaction이 동시에 수행 시 결과의 일관성을 유지해야 한다.<br>(Locking과 TimeStamp방법을 주로 이용한다.)</p>
</blockquote>
<hr>
<h2 id="6-3-분산-데이터베이스의-장점">6-3) 분산 데이터베이스의 장점</h2>
<ul>
<li>지역자치성, 점증적 시스템 용량 확장</li>
<li>신뢰성과 가용성</li>
<li>효용성과 융통성</li>
<li>빠른 응답 속도와 통신비용 절감</li>
<li>데이터의 가용성과 신뢰성 증가</li>
<li>시스템 규모의 적절한 조절</li>
<li>각 지역 사용자의 요구 수용 증대</li>
</ul>
<hr>
<h2 id="6-4-분산-데이터베이스의-단점">6-4) 분산 데이터베이스의 단점</h2>
<ul>
<li>소프트웨어 개발 비용</li>
<li>오류의 잠재성 증대</li>
<li>처리 비용의 증대</li>
<li>설계 및 관리의 복잡성과 비용</li>
<li>불규칙한 응답 속도</li>
<li>통제의 어려움</li>
<li>데이터 무결성에 대한 위협</li>
</ul>
<hr>
<h2 id="6-5-분산-데이터베이스의-적용-기법">6-5) 분산 데이터베이스의 적용 기법</h2>
<h3 id="테이블-위치location-분산">테이블 위치(Location) 분산</h3>
<ul>
<li>설계된 테이블의 위치를 각각 다르게 위치시키는 것이다.<h3 id="테이블-분할fragmentation-분산">테이블 분할(Fragmentation) 분산</h3>
</li>
<li>각각의 테이블을 쪼개어 분산하는 방법이다.</li>
<li>수평분할 : 지사(Node)에 따라 테이블을 특정 칼럼의 값을 기준으로 로우(Row)를 분리한다.</li>
<li>수직분할 : 지사(Node)에 따라 테이블 칼럼을 기준으로 칼럼을 분리한다. (로우단위로 분리되지 않는다.)<h3 id="테이블-복제replication-분산">테이블 복제(Replication) 분산</h3>
</li>
<li>동일한 테이블을 다른 지역이나 서버에서 동시에 생성하여 관리하는 유형이다.</li>
<li>부분복제 : 통합된 테이블을 한 군데(본사)에 가지고 있으면서 각 지사별로는 지사에 해당된 로우를 가지고 있는 형태이다.</li>
<li>광역복제 : 통합된 테이블을 한 군데(본사)에 가지고 있으면서 각 지사에도 본사와 동일한 데이터를 모두 가지고 있는 형태이다.<h3 id="테이블-요약summarization-분산">테이블 요약(Summarization) 분산</h3>
</li>
<li>지역 간에 또는 서버 간에 데이터가 비슷하지만 서로 다른 유형으로 존재하는 경우이다.</li>
<li>분석요약 : 각 지사별로 존재하는 요약정보를 본사에 통합하여 다시 전체에 대해서 요약 정보를 산출하는 분산방법이다.</li>
<li>통합요약 : 각 지사별로 존재하는 다른 내용의 정보를 분사에 통합하여 다시 전체에 대해서 요약정보를 산출하는 분산방법이다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQLD]데이터 모델링의 이해 💡]]></title>
            <link>https://velog.io/@yejin_823/SQLD1</link>
            <guid>https://velog.io/@yejin_823/SQLD1</guid>
            <pubDate>Tue, 30 Jan 2024 04:55:53 GMT</pubDate>
            <description><![CDATA[<h1 id="1-데이터-모델의-이해">1. 데이터 모델의 이해</h1>
<br>

<h2 id="1-1-모델링의-정의-및-특성">1-1) 모델링의 정의 및 특성</h2>
<p>데이터 모델링의 정의를 이해하기 전에 모델링에 대한 정의에 대해서 알아보자.</p>
<h3 id="-모델링의-정의">* 모델링의 정의</h3>
<ol>
<li>우리가 살고 있는 3차원의 현실 세계를 단순화하여 표현하는 것</li>
<li>현실 세계를 추상화하여 그 구조를 표현한 것</li>
<li>현실세계에 존재하는 사물이나 사건에 관한 관점 및 양상을 연관된 주제를 위하여 명확하게 하는 것</li>
</ol>
<br>

<h3 id="-모델링의-특징">* 모델링의 특징</h3>
<table>
<thead>
<tr>
<th align="center">특징</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><strong>추상화</strong></td>
<td>현실 세계를 일정한 형식에 맞게 표현하는 것</td>
</tr>
<tr>
<td align="center"><strong>단순화</strong></td>
<td>현실 세계를 서로가 약속한 규약을 준수하는 표기법이나 언어로 표현하는 것</td>
</tr>
<tr>
<td align="center"><strong>명확화</strong></td>
<td>현실 세계를 명확하게 기술 <br> 모델을 보는 여러 관계자가 쉽게 애매모호험을 제거하여 표현</td>
</tr>
</tbody></table>
<br>

<blockquote>
<p>** &quot;모델링은 추상화, 단순화, 명확화하기 위해 일정한 표기법으로 모델을 표현하는 기법&quot; **</p>
</blockquote>
<hr>
<h2 id="1-2-모델링의-3가지-관점">1-2) 모델링의 3가지 관점</h2>
<p>IT시스템의 대상이 되는 비즈니스를 분석하여 IT시스템으로 구성하는 과정에서 비즈니스의 내용과 IT시스템의 모습을 적절한 표기법으로 표현한 것을 모델링으로 3가지의 관점이 있다.</p>
<h3 id="ㄱ-데이터-관점-data-what">ㄱ. 데이터 관점 (Data, What)</h3>
<p><code>비즈니스와 관련된 데이터는 무엇인지 or 데이터 관의 관계는 무엇인지</code>
<strong>What</strong> 에 대한 관점</p>
<h3 id="ㄴ-프로세스-관점-process-how">ㄴ. 프로세스 관점 (Process, How)</h3>
<p><code>해당 비즈니스로 인해 일어나는 일은 어떠한 일인지</code>
<strong>How</strong>에 대한 관점</p>
<h3 id="ㄷ-상관-관점-data-vs-process">ㄷ. 상관 관점 (Data vs Process)</h3>
<p><code>데이터 관점과 프로세스 관점 간 서로 어떠한 영향을 받는지</code></p>
<hr>
<h2 id="1-3-데이터-모델링의-정의">1-3) 데이터 모델링의 정의</h2>
<blockquote>
<p>데이터 관점으로 업무를 분석하는 기법으로 약속된 표기법으로 데이터의 구조를 표현하는 과정</p>
</blockquote>
<ol>
<li>현실 세계의 비즈니스를 IT시스템으로 구현하기 위해 데이터 관점으로 업무를 분석하는 기법</li>
<li>현실 세계의 비즈니스를 약속된 표기법으로 표현하는 과정</li>
<li>IT시스템의 근간이 되는 데이터베이스를 구축하기 위한 분석 및 설계의 과정<br>

</li>
</ol>
<p>*<span style="color:gray">IT시스템은 RDBMS기반으로 구축되어 있으며 데이터 모델링을 총해 정의된 데이터 모델을 기반으로 물리적인 데이터베이스가 구축되고 SQL문을 활용한다.</span>*</p>
<hr>
<h2 id="1-4-데이터-모델이-제공하는-기능">1-4) 데이터 모델이 제공하는 기능</h2>
<p><em>데이터 모델링 과정을 통해 데이터 모델을 도출하는데 다양한 기능을 제공한다.</em></p>
<table>
<thead>
<tr>
<th align="center">항목</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><strong>가시화</strong></td>
<td>IT시스템의 모습을 가시화하는 기능을 제공</td>
</tr>
<tr>
<td align="center"><strong>명세화</strong></td>
<td>IT시스템의 구조와 발생하는 동작을 명세화하는 기능을 제공</td>
</tr>
<tr>
<td align="center"><strong>구조화된 틀</strong></td>
<td>IT시스템을 구현하기 위해 필요한 구조화된 틀을 제공</td>
</tr>
<tr>
<td align="center"><strong>문서화</strong></td>
<td>IT시스템 구축 시 산출물로 사용되는 문서를 제공</td>
</tr>
<tr>
<td align="center"><strong>다양한 관점</strong></td>
<td>다른 영역의 세부사항을 숨김으로써 다양한 영역에 집중할 수 있는 관점을 제공</td>
</tr>
<tr>
<td align="center"><strong>상세 수준의 표현 방법</strong></td>
<td>원하는 목표에 따라 구체화된 상세 수준의 표현 방법을 제공</td>
</tr>
</tbody></table>
<hr>
<h2 id="1-5-데이터-모델이-중요한-이유">1-5) 데이터 모델이 중요한 이유</h2>
<h3 id="ㄱ-파급효과-leverage">ㄱ. 파급효과 (Leverage)</h3>
<pre><code>: 데이터 설계 과정에서 비효율적인 데이터 설계 및 업무 요건을 충족하지 못하는 데이터 설계를 한다면 전 과정에 걸쳐서 엄청난 비용이 발생할 수 있다.</code></pre><h3 id="ㄴ-복잡한-정보-요구사항의-간결한-표현-conciseness">ㄴ. 복잡한 정보 요구사항의 간결한 표현 (Conciseness)</h3>
<pre><code>: 좋은 제이터 모델 설계를 통해 IT 시스템에서 구현해야 할 정보 요구사항을 명확하고 간결하게 표현할 수 있다.</code></pre><h3 id="ㄷ-데이터-품질-data-quality">ㄷ. 데이터 품질 (Data Quality)</h3>
<pre><code>: 데이터 모델의 잘못된 설계로 인해 &#39;데이터 중복, 비유연성, 비일관성&#39; 이 발생할 수 있고 이로 인해 데이터 품질이 저하될 수 있다.</code></pre><hr>
<h2 id="1-6-데이터-모델링의-3단계">1-6) 데이터 모델링의 3단계</h2>
<blockquote>
<p>현실 세계 -&gt; 개념적 구조 -&gt; 논리적 구조 -&gt; 물리 구조(데이터베이스)</p>
</blockquote>
<h3 id="1단계">1단계</h3>
<p><strong>개념적 데이터 모델링</strong></p>
<ul>
<li>IT시스템에서 구현하고자 하는 대상에 대해 <span style="color:coral">포괄적 수준의 데이터 모델링을 진행</span></li>
<li>전사적 데이터 모델링 시 많이 사용하는 단계</li>
</ul>
<h3 id="2단계">2단계</h3>
<p><strong>논리적 데이터 모델링</strong></p>
<ul>
<li>IT시스템에서 구현하고자 하는 비즈니스를 만족하기 위한 <span style="color:coral">기본키, 속성, 관계, 외래키 등을 정확하게 표현하는 단계</span></li>
</ul>
<h3 id="3단계">3단계</h3>
<p><strong>물리적 데이터 모델링</strong></p>
<ul>
<li>논리 데이터 모델을 기반으로 실제 물리 DB 구축을 위해 성능, 저장공간 등의 물리적인 특성을 고려하여 설계하는 단계</li>
<li><span style="color:coral">이 단계에서 완성된 물리 데이터 모델로 물리 DB을 구축</span></li>
</ul>
<hr>
<h2 id="1-7-데이터-독립성의-필요성">1-7) 데이터 독립성의 필요성</h2>
<blockquote>
<p><strong>데이터 독립성</strong>
: 하위 단계의 데이터 구조가 변경되더라도 상위 단계에는 영향을 미치지 않는 속성을 말한다.</p>
</blockquote>
<p><strong>데이터 구조가 변경되더라도 응용 프로그램 단에는 아무런 영향을 미치지 않도록 하는 것</strong></p>
<table>
<thead>
<tr>
<th><strong>출현 배경</strong></th>
</tr>
</thead>
<tbody><tr>
<td>- 보유한 데이터의 복잡도를 낮추고 중복된 데이터를 줄여 시간의 흐름에 따라 증가하는 유지보수 비용 절감 <br> - 사용자의 요구사항은 지속적으로 변하므로 그에 따른 화면과 물리 DB간 독립성을 유지하기 위해</td>
</tr>
</tbody></table>
<hr>
<h2 id="1-8-데이터베이스의-3단계-구조">1-8) 데이터베이스의 3단계 구조</h2>
<h3 id="ㄱ-외부단계">ㄱ. 외부단계</h3>
<h4 id="외부-스키마-external-schema">외부 스키마 (External Schema)</h4>
<p><strong>*<span style="color:gray">사용자 관점</span>*</strong></p>
<ul>
<li>각각의 사용자가 보는 DB스키마</li>
<li>개인 사용자 혹은 응용 프로그램 개발자가 접근하는 DB 스키마<h3 id="ㄴ-개념적-단계">ㄴ. 개념적 단계</h3>
<h4 id="개념-스키마-conceptual-schema">개념 스키마 (Conceptual Schema)</h4>
</li>
<li><strong><span style="color:gray">통합 관점</span>*</strong></li>
<li>모든 사용자의 관점을 하나로 통합한 비즈니스 전체의 DB를 기술한 스키마</li>
<li>응용 프로그램 및 사용자들이 필요한 데이터를 통합한 전체 DB를 기술한 것</li>
<li>실제 DB에 저장되는 데이터와 응용 프로그램 및 사용자들 간의 관계를 표현하는 스키마<h3 id="ㄷ-내부적-단계">ㄷ. 내부적 단계</h3>
<h4 id="내부-스키마-internal-schema">내부 스키마 (Internal Schema)</h4>
</li>
<li><strong><span style="color:gray">물리적 관점</span>*</strong></li>
<li>DB가 물리적으로 저장된 형식을 표현한 스키마</li>
<li>물리적 하드웨어 장치에 데이터가 실제로 저장되는 방법을 표현한 스키마</li>
</ul>
<hr>
<h2 id="1-9-3단계-구조-속-데이터-독립성">1-9) 3단계 구조 속 데이터 독립성</h2>
<h3 id="ㄱ-논리적-데이터-독립성">ㄱ. 논리적 데이터 독립성</h3>
<ul>
<li><span style="color:coral">개념 스키마</span>가 변경되어도 외부 스키마에는 영향을 미치지 않도록 지원하는 것</li>
<li><em>논리적 구조</em> 가 변경되어도 응용 프로그램에 영향을 미치지 않는다.</li>
</ul>
<p>*<span style="color:gray">사용자 특성에 맞는 변경이 가능</span>*
*<span style="color:gray">통합 구조의 변경이 가능</span>*</p>
<h3 id="ㄴ물리적-데이터-독립성">ㄴ.물리적 데이터 독립성</h3>
<ul>
<li><span style="color:coral">내부 스키마</span>가 변경되어도 외부/개념 스키마는 영향을 받지 않도록 지원하는 것</li>
<li><em>저장 장치의 구조 변경</em> 은 응용 프로그램/개념 스키마에 영향을 미치지 않는다.</li>
</ul>
<p>*<span style="color:gray">물리 구조에 영향 없이 개념 구조의 변경이 가능</span>*
*<span style="color:gray">개념 구조에 영향 없이 물리 구조의 변경이 가능</span>*</p>
<hr>
<h2 id="1-10-3단계-구조-속-사상매핑">1-10) 3단계 구조 속 사상(매핑)</h2>
<p>각 단계별 데이터 독립성의 보장이 가능한 이유는 각 단계와 단계 사이를 연결하는 사상(매핑)이 있기 때문으로 2가지의 사상이 있다.</p>
<h3 id="ㄱ-외부적개념적-사상-논리적-사상">ㄱ. 외부적/개념적 사상 (논리적 사상)</h3>
<blockquote>
<p>외부적 뷰와 개념적 뷰의 상호 호환성을 정의하는 사상</p>
</blockquote>
<ul>
<li><p>사용자가 접근하는 형식에 따라 다른 타입의 필드를 가질 수 있고, 이 경우 개념적 뷰의 필드 타입은 변화가 없다.</p>
<p>  &quot;논리적 데이터 독립성을 보장&quot;</p>
<h3 id="ㄴ-개념적내부적-사상-물리적-사상">ㄴ. 개념적/내부적 사상 (물리적 사상)</h3>
<blockquote>
<p>개념적 뷰와 저장된 데이터베이스의 상호 관련성을 정의하는 사상</p>
</blockquote>
</li>
<li><p>저장된 데이터베이스 구조가 바뀐다면 개념적/내부적 사상이 바뀌어야 개념 스키마가 그대로 남아 있는다.</p>
<p>  &quot;물리적 데이터 독립성을 보장&quot;</p>
</li>
</ul>
<hr>
<h2 id="1-11-데이터-모델링의-3가지-요소">1-11) 데이터 모델링의 3가지 요소</h2>
<h3 id="ㄱ-업무가-관여하는-어떤-것-things">ㄱ. 업무가 관여하는 어떤 것 (Things)</h3>
<table>
<thead>
<tr>
<th>복수 / 집합 개념 타입 / 클래스</th>
<th>개별 / 단수 개념 어커런스 / 인스턴스</th>
</tr>
</thead>
<tbody><tr>
<td>엔터티 타입 (Entity Type)</td>
<td>엔터티 (Entity)</td>
</tr>
<tr>
<td>엔터티 (Entity)</td>
<td>인스턴스 (Instance) <br> 어커런스 (Occurrence)</td>
</tr>
</tbody></table>
<blockquote>
<p>EX) 
어떤 것의 전체를 지칭하는 것 = ** 엔터티 타입 ** or ** 엔터티 **
엔터티 내에 추가된 것 = ** 인스턴스 ** or ** 어커런스 **</p>
</blockquote>
<h3 id="ㄴ-어떤-것이-가지는-성격-attributes">ㄴ. 어떤 것이 가지는 성격 (Attributes)</h3>
<p>&quot;Characteristic of a Thing&quot;</p>
<table>
<thead>
<tr>
<th>복수 / 집합 개념 타입 / 클래스</th>
<th>개별 / 단수 개념 어커런스 / 인스턴스</th>
</tr>
</thead>
<tbody><tr>
<td>속성 (Attributes)</td>
<td>속성값 (Attribute Value)</td>
</tr>
</tbody></table>
<blockquote>
<p>EX)
어떤 것이 가지는 성격 = ** 속성 **</p>
</blockquote>
<h3 id="ㄷ-업무가-관여하는-어떤-것-간의-관계-relationships">ㄷ. 업무가 관여하는 어떤 것 간의 관계 (Relationships)</h3>
<p>&quot;Association between Things&quot;</p>
<table>
<thead>
<tr>
<th>복수 / 집합 개념 타입 / 클래스</th>
<th>개별 / 단수 개념 어커런스 / 인스턴스</th>
</tr>
</thead>
<tbody><tr>
<td>관계 (Relationship)</td>
<td>페어링 (Pairing)</td>
</tr>
</tbody></table>
<blockquote>
<p>EX)
관계에 포함된 개별 연관성 = ** 페어링 **</p>
</blockquote>
<hr>
<h2 id="1-12-좋은-데이터-모델의-요소">1-12) 좋은 데이터 모델의 요소</h2>
<p>IT시스템의 성공적인 구축에 있어서 데이터 모델은 매우 중요한 역할이다.</p>
<ul>
<li><p>** 완전성 **
  : 업무에 필요한 데이터가 모두 정의되어야 함</p>
</li>
<li><p>** 중복 배제 **
  : 동일한 사실은 단 한번만 저장해야 함</p>
</li>
<li><p>** 업무 규칙 **
  : 데이터 모델 분석만으로도 비즈니스 로직이 이해되어야 함</p>
</li>
<li><p>** 데이터 재사용 **
  : 데이터 통합성과 독립성을 고려하여 재사용이 가능해야 함</p>
</li>
<li><p>** 의사소통 **
  : 데이터 모델을 보고 이해 당사자들끼리 의사소통이 이루어질 수 있어야 함</p>
</li>
<li><p>** 통합성 **
  : 동일한 데이터는 유일하게 정의해서 다른 영역에서 참고해야 함</p>
</li>
</ul>
<hr>
<h2 id="1-13-데이터-모델링의-유의사항">1-13) 데이터 모델링의 유의사항</h2>
<h3 id="중복duplication">중복(Duplication)</h3>
<blockquote>
<p>데이터 모델은 같은 데이터를 사용하는 사람, 시간 그리고 장소를 파악하는데 도움을 주어 데이터베이스가 여러 장소에 같은 정보를 저장하는 잘못을 하지 않도록 한다.</p>
</blockquote>
<h3 id="비유연성inflexibility">비유연성(Inflexibility)</h3>
<blockquote>
<p>데이터 모델을 어떻게 설계했느냐에 따라 사소한 업무변화에도 데이터 모델이 수시로 변경되어 유지보수의 어려움을 가중시킬 수 있다. 데이터의 정의를 데이터의 사용 프로세스와 분리함으로써 데이터 모델링은 데이터 혹은 프로세스의 작은 변화가 애플리케이션과 데이터 베이스에 중대한 변화를 일으킬 수 있는 가능성을 줄인다.</p>
</blockquote>
<h3 id="비일관성inconsistency">비일관성(Inconsistency)</h3>
<blockquote>
<p>데이터 중복이 없더라도 비일관성은 발생할 수 있다. 개발자가 서로 연관된 다른 데이터와 모순된다는 고려 없이 일련의 데이터를 수정할 수 있기 때문에 이와 같은 문제가 발생할 수 있다. 데이터 모델링을 할 때 데이터와 데이터 간의 상호 연관 관계에 대해 명확하게 정의한다면 이러한 위험을 사전에 예방하는 데 도움을 줄 수 있다.</p>
</blockquote>
<ul>
<li>사용자가 처리하는 프로세스 혹은 이와 관련된 프로그램과 테이블의 <strong>연계성을 높이는 것은 데이터 모델이 업무 변경에 대해 취약하게 만드는 단점</strong>에 해당한다.</li>
</ul>
<p><br></br></p>
<hr>
<br>

<h1 id="2-엔터티">2. 엔터티</h1>
<p><code>비즈니스 관점에서 IT시스템을 통해 저장 및 관리해야 하는 집합적인 어떤 것</code>
<br></p>
<h2 id="2-1-엔터티의-개념">2-1) 엔터티의 개념</h2>
<ol>
<li>사람, 사물, 사건, 개념 등의 명사에 해당</li>
<li>비즈니스 관점에서 IT시스템을 통해 관리가 필요한 관심사에 해당</li>
<li>결국 비즈니스를 구현하기 위해 저장해야 하는 어떤 것 (Thing)</li>
</ol>
<hr>
<h2 id="2-2-엔터티와-인스턴스">2-2) 엔터티와 인스턴스</h2>
<p>하나의 엔터티는 여러 개의 인스턴스를 가질 수 있으므로 <code>엔터티 = 인스턴스의 집합</code>이라고 할 수 있다.</p>
<blockquote>
<p>EX)
<strong>엔터티</strong> : 상가
<strong>인스턴스</strong> : 스타벅스, 이디야</p>
</blockquote>
<p><strong>* <span style="color:green">위의 엔터티와 인스턴스는 1:N 관계라고 할 수 있다. </span>*</strong></p>
<hr>
<h2 id="2-3-엔터티의-특징">2-3) 엔터티의 특징</h2>
<table>
<thead>
<tr>
<th align="center">특징</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><strong>업무에서 필요로 하는 정보</strong></td>
<td>- 비즈니스 요구 조건 만족을 위해 반드시 필요하고 저장 및 관리하고자 하는 정보여야 함 <br> *<span style="color:darkgray">환자라는 엔터티는 병원에서만 반드시 필요하고 일반 회사는 그렇지 않음</span>*</td>
</tr>
<tr>
<td align="center"><strong>식별가능해야 함</strong></td>
<td>- 유일한 식별자에 의해 식별이 가능해야 함 (집합 내에서 단 1개를 짚어낼 수 있어야 함)</td>
</tr>
<tr>
<td align="center"><strong>인스턴스의 집합</strong></td>
<td>- 영속적으로 존재하는 2개 이상의 인스턴스 집합이어야 함 <br> *<span style="color:darkgray">상가는 여러 개를 의미한다.</span>*</td>
</tr>
<tr>
<td align="center"><strong>업무 프로세스에 의해 이용</strong></td>
<td>- 엔터티는 비즈니스 프로세스에 의해 반드시 이용되어야 함 <br> - 업무 프로세스에 의해 명령문이 발생하지 않는 고립된 엔터티의 경우는 제거하거나 <br>누락된 프로세스가 존재하는지 살펴 프로세스를 추가해야 함</td>
</tr>
<tr>
<td align="center"><strong>속성을 포함</strong></td>
<td>- 엔터티에는 <strong>반드시</strong> 속성이 포함되어야 함 <br> - 속성을 포함하지 않고 엔터티의 이름만 가지고 있는 경우는 관계가 생략되어 있거나<br> 업무 분석이 미진하여 속성 정보가 누락되는 경우에 해당</td>
</tr>
<tr>
<td align="center"><strong>관계의 존재</strong></td>
<td>- 엔터티는 다른 엔터티와 <strong>반드시</strong> 관계가 있어야 함 <br> *<span style="color:darkgray">업무적 특성에 따라 관계가 없는 엔터티를 엔터티로 도출할 수도 있음</span>*</td>
</tr>
</tbody></table>
<hr>
<h2 id="2-4-엔터티의-분류">2-4) 엔터티의 분류</h2>
<p>엔터티는 <code>유무형</code>에 따른 분류와 <code>발생시점</code>에 따른 분류로 구분된다.</p>
<h3 id="유무형에-따른-분류">유무형에 따른 분류</h3>
<table>
<thead>
<tr>
<th>구분</th>
<th>예시</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>유형</td>
<td><span style="color:darkgray">사원, 물품, 강사</span></td>
<td>- 실체가 존재하고 물리적인 형태가 있으며 안정적이고 지속적으로 활용되는 엔터티</td>
</tr>
<tr>
<td>개념</td>
<td><span style="color:darkgray">조직, 보험상품</span></td>
<td>- 물리적인 형태가 존재하는 것은 아니지만 비즈니스적으로 관리해야 할 개념적 정보를 <br>저장하는 엔터티</td>
</tr>
<tr>
<td>사건</td>
<td><span style="color:darkgray">주문, 청구, 미납</span></td>
<td>- 비즈니스를 수행함으로써 발생되는 엔터티 <br> - 유행 / 개념 엔터티에 비해 데이터 발생량이 많으며 다양한 통계 자료에 이용될 수 있음</td>
</tr>
<tr>
<td><br></td>
<td></td>
<td></td>
</tr>
</tbody></table>
<h3 id="발생시점에-따른-분류">발생시점에 따른 분류</h3>
<table>
<thead>
<tr>
<th>구분</th>
<th>예시</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>기본</td>
<td><span style="color:darkgray">사원, 부서, 고객, 상품,<br>자재</span></td>
<td>- 비즈니스에서 스스로 태어난 존재에 대한 정보로서 타 엔터티와의 관계에 의해서 <br>생성되는 것이 아닌 독립적으로 생성이 가능한 엔터티<br>- 기본 엔터티는 타 엔터티의 부모 역할을 하게 됨</td>
</tr>
<tr>
<td>중심</td>
<td><span style="color:darkgray">계약, 사고, 예금원장,<br> 청구, 주문, 매출</span></td>
<td>- 기본 엔터티로부터 발생되며 비즈니스에 있어서 중심적인 역할을 하는 엔터티 <br>- 데이터의 양이 많이 발생되고 타 엔터티와의 관계 속에서 많은 행위 엔터티를 도출</td>
</tr>
<tr>
<td>행위</td>
<td><span style="color:darkgray">주문목록, 사원변경이력</span></td>
<td>- 2개 이상의 부모 엔터티로부터 발생되는 엔터티 <br> - 다양하고 복잡한 비즈니스를 처리하는 과정에서 데이터양이 많아질 수 있음 <br> - 상세 설계 단계 혹은 프로세스와 상관 모델링을 진행하면서 도출</td>
</tr>
</tbody></table>
<hr>
<h2 id="2-5-엔터티의-명명규칙">2-5) 엔터티의 명명규칙</h2>
<ol>
<li>가능한한 업무 담당자들이 사용하는 용어를 사용한다.</li>
<li>가능하면 약어를 사용하지 않는다.</li>
<li>엔터티는 단수명사여야 한다.</li>
<li>엔터티의 이름은 해당 모델 내에서 유일한 이름이어야 한다.</li>
<li>엔터티의 생성 의미에 맞게 이름을 부여한다.
<br></br></li>
</ol>
<hr>
<br>

<h1 id="3-속성">3. 속성</h1>
<p><code>인스턴스에서 관리하고자 하는 의미상 더 이상 분리되지 않는 최소의 데이터 단위</code>
<br></p>
<h2 id="3-1-속성의-개념">3-1) 속성의 개념</h2>
<ol>
<li>비즈니스에서 필요로 함</li>
<li>엔터티에 대한 설명으로 인스턴스의 구성요소가 됨</li>
<li>의미상 더 이상 분리되지 않는 데이터 단위</li>
</ol>
<hr>
<h2 id="3-2-엔터티-인스턴스-속성-속성값의-관계">3-2) 엔터티, 인스턴스, 속성, 속성값의 관계</h2>
<blockquote>
<ul>
<li>1개의 엔터티는 2개 이상의 인스턴스의 집합
<span style="color:green">지하철역은 2개 이상의 역이 존재한다.</span></li>
</ul>
</blockquote>
<ul>
<li>1개의 엔터티는 2개 이상의 속성
<span style="color:green">각각의 지하철역은 역명과 노선명을 가진다.</span></li>
<li>1개의 속성은 1개의 속성값
<span style="color:green">각각의 지하철역의 역명은 단 하나이다.</span><span style="color:coral"> 강남역은 강남역!</span></li>
</ul>
<hr>
<h2 id="3-3-속성의-표기법">3-3) 속성의 표기법</h2>
<p>속성명에 표시</p>
<ul>
<li><code>#</code> 은 식별자임을 의미</li>
<li><code>*</code> 은 필수값임을 의미</li>
<li><code>◦</code> 은 선택값임을 의미</li>
</ul>
<hr>
<h2 id="3-4-속성의-특징">3-4) 속성의 특징</h2>
<p>ㄱ. 엔터티와 마찬가지로 반드시 비즈니스에서 필요로 하고 IT시스템에서 저장 및 관리하고자 하는 정보여야 함
<span style="color:darkgray">ex) 지하철역 엔터티의 역명 속성</span>
ㄴ. 정규화 이론에 따라 속성이 속해 있는 엔터티의 주식별자에 함수적 종석성을 가져야 함
<span style="color:darkgray">ex) 지하철역 엔터티의 식별자인 지하철역번호가 노선명과 역명을 결정</span>
ㄷ. 하나의 속성에는 1개의 값만을 가진다. 하나의 속성에 여러 개의 값이 있는 다중 값일 경우 별도의 엔터티를 이용하여 분리함
<span style="color:darkgray">ex) 특정 지하철역의 노선명과 역명은 각각 하나씩</span></p>
<hr>
<h2 id="3-5-속성의-분류">3-5) 속성의 분류</h2>
<p>속성은 <code>특성</code>에 따른 분류와 <code>엔터티 구성 방식</code>에 따른 분류로 구분된다.</p>
<h3 id="특성에-따른-분류">특성에 따른 분류</h3>
<table>
<thead>
<tr>
<th>특성</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>기본 속성</strong><br>(Basic Attribute)</td>
<td>비즈니스 분석을 통해 도출된 속성을 의미 <br> <span style="color:darkgray">ex) 상가 엔터티의 상호명 속성</span></td>
</tr>
<tr>
<td><strong>설계 속성</strong><br>(Designed Attribute)</td>
<td>비즈니스 분석을 통해 도출된 것은 아니지만 데이터 모델 설계를 하면서 도출하는 속성 <br> <span style="color:darkgray">ex) 상가 엔터티의 표준산업분류코드 속성</span></td>
</tr>
<tr>
<td><strong>파생 속성</strong><br>(Derived Attribute)</td>
<td>다른 속성에 의해서 계산이나 변형이 되어 생성되는 속성 <br> <span style="color:darkgray">ex) 상가 엔터티의 주소정보를 기반으로 위도, 경도 속성의 값을 구할경우 위도, 경도 속성</span></td>
</tr>
<tr>
<td>### 엔터티 구성 방식에 따른 분류</td>
<td></td>
</tr>
<tr>
<td>구성방식</td>
<td>설명</td>
</tr>
<tr>
<td>----</td>
<td>----</td>
</tr>
<tr>
<td><strong>PK(Primary Key) 속성</strong></td>
<td>엔터티에서 단 하나의 인스턴스를 식별할 수 있는 속성 <br> <span style="color:darkgray">ex) 상가 엔터티의 상호번호 속성</span></td>
</tr>
<tr>
<td><strong>FK(Foreign Key) 속성</strong></td>
<td>타 엔터티와의 관계를 통해 포함된 속성 <br> <span style="color:darkgray">ex) 지하철승하차 엔터티의 지하철역번호 속성</span></td>
</tr>
<tr>
<td><strong>일반 속성</strong></td>
<td>엔터티 내에 존재하면서 PK 혹은 FK 속성이 아닌 속성 <br> <span style="color:darkgray">ex) 상가 엔터티의 상호명 속성</span></td>
</tr>
</tbody></table>
<hr>
<h2 id="3-6-도메인">3-6) 도메인</h2>
<ol>
<li>속성이 가질 수 있는 값의 범위를 도메인이라고 한다.</li>
<li>각 속성의 속성값은 정의된 도메인 이외의 값을 가질 수 없다.</li>
</ol>
<p><span style="color:darkgray"> - 학생 엔터티의 학점 속성의 도메인은 실수 값으로 정의 <br>- 학생 엔터티의 핸드폰번호 속성은 문자열로 정의</span></p>
<hr>
<h2 id="3-7-속성의-명명규칙">3-7) 속성의 명명규칙</h2>
<ol>
<li>비즈니스에 사용하는 이름을 부여한다.</li>
<li>속성명을 서술식으로 명명하지 않는다.</li>
<li>속성 명명 시 약어 사용은 가급적 하지 않는다.</li>
<li>전체 데이터 모델 내에서 유일한 이름의 속성명으로 명명하는 것이 좋다.
<br></br></li>
</ol>
<hr>
<br>

<h1 id="4-관계">4. 관계</h1>
<br>

<h2 id="4-1-관계의-정의">4-1) 관계의 정의</h2>
<ol>
<li>엔터티끼리 상호 연관성이 있는 상태</li>
<li>데이터 모델 내에 존재하는 엔터티 간 논리적인 연관성</li>
</ol>
<p><span style="color:darkgray">cf) 관계는 <strong>존재에 의한 관계</strong> &amp; <strong>행위에 의한 관계</strong> 가 있다.</span></p>
<hr>
<h2 id="4-2-관계의-페어링">4-2) 관계의 페어링</h2>
<p><code>엔터티 내의 인스턴스가 개별적으로 관계를 가지는 것</code></p>
<blockquote>
<ul>
<li>관계는 엔터티 안에 인스턴스가 개별적으로 관계를 가지는 것이고 이것의 집합을 관계로 표현한다.</li>
</ul>
</blockquote>
<ul>
<li>개별 인스턴스가 각각 다른 종류의 관계를 가지고 있다면 두 엔터티 사이에 2개 이상의 관계가 형성될 수 있다.</li>
<li>관계는 관계 페어링을 <strong><em>논리적</em></strong> 으로 표현한 것</li>
</ul>
<hr>
<h2 id="4-3-관계의-표기법">4-3) 관계의 표기법</h2>
<p>관계의 표기 시에는 <code>관계 차수</code> 및 <code>관계 선택사양</code>을 명확하게 해야 한다.</p>
<h3 id="관계-차수">관계 차수</h3>
<ul>
<li><p>2개의 엔터티 간 관계에서 참여자의 수를 표현하는 것
<span style="color:darkgray"> <em>1 : N, 1 : 1, N : M</em></span> </p>
<h3 id="관계-선택사양">관계 선택사양</h3>
</li>
<li><p>필수참여관계
<span style="color:darkgray"> ex) &#39;열차문&#39; 이 완전히 닫혀야만 &#39;열차는 출발&#39; ! <br></span><span style="color:coral">열차의 출발과 열차문의 완전한 닫힘을 &quot;필수적인 연관관계&quot;</span> </p>
</li>
<li><p>선택참여관계
<span style="color:darkgray"> ex) &#39;열차의 출발 안내 방송&#39; 은 &#39;열차의 출발&#39; 과는 상관없이 언제든지 방송할 수 있다. 안내와 상관없이 열차는 출발! <br></span><span style="color:coral">열차의 출발과 출발 안내 방송은 필수적인 상황은 아니므로 &quot;선택적인 연관관계&quot;</span> </p>
</li>
</ul>
<hr>
<h2 id="4-4-관계정의-시-체크-사항">4-4) 관계정의 시 체크 사항</h2>
<p><code>엔터티 간의 관계를 정의할 때는 체크 사항을 만족하는지 확인</code></p>
<ol>
<li>2개의 엔터티 사이에 관심 있는 연관 규칙이 존재하는가?</li>
<li>2개의 엔터티 사이에 정보의 조합이 발생되는가?</li>
<li>업무기술서, 장표에 관계연결에 대한 규칙이 서술되어 있는가?</li>
<li>업무기술서, 장표에 관계연결을 가능하게 하는 동사가 있는가?
<br></br></li>
</ol>
<hr>
<h1 id="5-식별자">5. 식별자</h1>
<p><code>엔터티에서 단 하나의 인스턴스를 구별해 낼 수 있는 논리적인 이름</code>
<br></p>
<h2 id="5-1-식별자의-개념">5-1) 식별자의 개념</h2>
<ul>
<li>엔터티의 각 인스턴스를 개별적으로 식별하기 위해 사용되는 하나의 속성 혹은 속성들의 조합을 식별자라고 한다.</li>
<li>엔터티 내에서 하나의 행을 콕 집어낼 때 사용하는 것</li>
</ul>
<hr>
<h2 id="5-2-식별자의-특징">5-2) 식별자의 특징</h2>
<table>
<thead>
<tr>
<th>특징</th>
<th>내용</th>
</tr>
</thead>
<tbody><tr>
<td><strong>유일성</strong></td>
<td>- 엔티티 내에 존재하는 각각의 인스턴스 집합은 주식별자에 의해 유일하게 구분할 수 있다. <br><span style="color:darkgray">ex) 사원 엔티티의 사원번호 속성은 주식별자로 고유하게 부여된다.</span></td>
</tr>
<tr>
<td><strong>최소성</strong></td>
<td>- 유일성을 만족한다면 주식별자를 구성하는 속성의 수는 최소한의 수로 이루어져야 한다. <br><span style="color:darkgray">ex) 사원번호만으로 고유한 구조인데 &#39;사원분류코드 + 사원번호&#39; 조합은 부적절한 구조이다.</span></td>
</tr>
<tr>
<td><strong>불변성</strong></td>
<td>- 엔터티 내 특정 인스턴스에 주식별자가 한번 정해지면 그 값은 변하지 말아야 한다. <br><span style="color:darkgray">ex) 한번 정해진 사원번호의 값은 다른 값으로 변경되지 않아야 한다.</span></td>
</tr>
<tr>
<td><strong>존재성</strong></td>
<td>- 주식별자가 지정되면 반드시 데이터 값이 존재해야 한다. (NULL 허용 불가)<br> - 주식별자로 정해진 속성은 반드시 데이터 값이 존재해야 한다.<br> - 주식별자는 NULL을 허용하지 않는다. <br> <span style="color:darkgray">ex) 사원번호가 없는 회사직원은 없다.</span></td>
</tr>
</tbody></table>
<hr>
<h2 id="5-3-식별자의-분류">5-3) 식별자의 분류</h2>
<h3 id="대표성-여부">대표성 여부</h3>
<table>
<thead>
<tr>
<th>식별자</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>주식별자</strong></td>
<td>- 엔터티 내에서 각각의 행을 구별할 수 있는 구분자 <br> - 다른 엔터티와 참조관계를 가질 때 연결할 수 있는 식별자 <br> <span style="color:darkgray">ex) 사원번호, 고객번호</span></td>
</tr>
<tr>
<td><strong>보조식별자</strong></td>
<td>- 엔터티 내에서 각각의 행을 구별할 수 있는 구분자지만 대표성을 가지지 못하므로 다른 엔터티와 <br>참조관계를 가질 때 연결할 수 없다. <br> <span style="color:darkgray">ex) 주민등록번호</span></td>
</tr>
<tr>
<td>### 스스로 생성 여부</td>
<td></td>
</tr>
<tr>
<td>식별자</td>
<td>설명</td>
</tr>
<tr>
<td>----</td>
<td>----</td>
</tr>
<tr>
<td><strong>내부식별자</strong></td>
<td>- 엔터티 내부에서 스스로 만들어지는 식별자 <br> <span style="color:darkgray">ex) 고객번호</span></td>
</tr>
<tr>
<td><strong>외부식별자</strong></td>
<td>- 다른 엔터티와의 관계를 통해 다른 엔터티로부터 받아오는 식별자 <br> <span style="color:darkgray">ex) 주문 엔터티의 고객번호</span></td>
</tr>
<tr>
<td>### 속성의 수</td>
<td></td>
</tr>
<tr>
<td>식별자</td>
<td>설명</td>
</tr>
<tr>
<td>----</td>
<td>----</td>
</tr>
<tr>
<td><strong>단일식별자</strong></td>
<td>- 하나의 속성으로 구성된 식별자<br> <span style="color:darkgray">ex) 고객 엔터티의 고객번호</span></td>
</tr>
<tr>
<td><strong>복합식별자</strong></td>
<td>- 둘 이상의 속성으로 구성된 식별자<br>- 과도한 복합식별자는 지양 <br> <span style="color:darkgray">ex) 주문상세 엔터티의 주문번호 + 상세순번</span></td>
</tr>
<tr>
<td>### 대체 여부</td>
<td></td>
</tr>
<tr>
<td>식별자</td>
<td>설명</td>
</tr>
<tr>
<td>----</td>
<td>----</td>
</tr>
<tr>
<td><strong>본질식별자</strong></td>
<td>- 비즈니스에 의해 만들어지는 식별자<br> <span style="color:darkgray">ex) 고객번호</span></td>
</tr>
<tr>
<td><strong>인조식별자</strong></td>
<td>- 비즈니스적으로 만들어지지는 않지만 본식별자가 복잡한 구성을 가지고 있기 때문에 만든 식별자<br> <span style="color:darkgray">ex) 주문 엔터티의 주문번호 (원래는 고객번호+주문순번)</span></td>
</tr>
</tbody></table>
<hr>
<h2 id="5-4-식별자-도출-기준">5-4) 식별자 도출 기준</h2>
<ol>
<li>비즈니스에서 자주 이용되는 속성을 주식별자로 지정한다.</li>
<li>명칭, 장소와 같이 이름으로 기술되는 속성은 가능하면 주식별자로 하지 않는다.</li>
<li>주식별자를 복합식별자로 할 경우 지나치게 많은 속성이 포함되지 않도록 한다.</li>
</ol>
<hr>
<h2 id="5-5-식별자-관계-or-비식별자-관계">5-5) 식별자 관계 or 비식별자 관계</h2>
<p>부모 엔터티로부터 받은 외부식별자를 주식별자로 이용할 것인지 (식별자 관계) <br> 부모와 연결이 되는 속성으로서만 이용할 것인지 (비식별자 관계) 
<span style="color:green"> ** 업무 특징, 자식 엔터티의 주식별자 구성, SQL작성 전략에 의해 결정!! ** </span></p>
<h3 id="식별자-관계">식별자 관계</h3>
<blockquote>
<p>자식 엔터티의 주식별자로 부모 엔터티의 주식별자가 상속이 되는 경우를 의미한다.</p>
</blockquote>
<ul>
<li>부모로부터 받은 식별자를 자식 엔터티의 주식별자로 이용하는 경우는 NULL이 허용되지 않는다.
  <span style="color:coral"> → 부모 엔터티가 생성되어야 자식 엔터티가 생성된다.</span></li>
<li>자식 엔터티에서 외부식별자가 주식별자 역할을 한다.</li>
<li>부모 엔터티의 식별자가 자식 엔터티에서도 식별자 역할을 하는 것이다.</li>
</ul>
<p>&quot; 식별자 관계로만 관계를 맺을 경우,
<code>SQL문의 복잡성이 올라가고 조인 조건이 누락되는 실수가 발생할 확률이 높아진다.</code> &quot;</p>
<h3 id="비식별자-관계">비식별자 관계</h3>
<blockquote>
<ol>
<li>부모 엔터티로부터 속성을 물려 받았지만 자식 엔터티의 주식별자로 사용하지 않고 일반적인 속성으로만 사용하는 경우를 의미한다.</li>
<li>자식 엔터티에서 받은 속성이 반드시 필수가 아니어도 무방하기 때문에 부모 없는 자식이 생성될 수 있는 경우를 의미한다.</li>
</ol>
</blockquote>
<ul>
<li>부모 엔터티의 주식별자를 자식 엔터티의 주식별자 속성으로 사용해도 되지만 자식 엔터티에서 별도의 주식별자를 생성하는 것이 더 유리하다고 판단될 때, 비식별자 관계에 의한 외부식별자로 표현한다.</li>
</ul>
<hr>
<h2 id="5-6-관계-설정-고려사항">5-6) 관계 설정 고려사항</h2>
<p>기본적으로 식별자 관계로 모든 관계를 연결하면서 조건에 해당할 경우 비식별자 관계로 조정한다.</p>
<ol>
<li>관계의 강/약 분석에서 약한 관계일 경우!</li>
<li>자식 테이블 독립 PK가 필요한 독립 PK구성이 필요한 경우!</li>
<li>SQL복잡성이 증가하여 PK 속성을 단순화해야 할 경우!</li>
</ol>
<table>
<thead>
<tr>
<th align="center">항목</th>
<th>식별자 관계</th>
<th>비식별자 관계</th>
</tr>
</thead>
<tbody><tr>
<td align="center">목적 <br></br></td>
<td><strong>강한 연결 관계</strong>를 표현한다.<br></br></td>
<td><strong>약한 연결 관계</strong>를 표현한다.<br></br></td>
</tr>
<tr>
<td align="center">자식 주식별자 영향</td>
<td>부모 엔터티의 주식별자 속성이 자식 엔터티의 <br><strong>주식별자의 구성</strong>에 포함된다.</td>
<td>부모 엔터티의 주식별자 속성이 자식 엔터티의 <br><strong>일반 속성</strong>이 된다.<br></br></td>
</tr>
<tr>
<td align="center">연결 고려사항</td>
<td>- 부모 엔티티에 <strong>종속되는 경우</strong>에 사용한다. <br></br> - 자식 엔터티의 주식별자 구성에 <strong>부모 엔터티<br>의 주식별자 속성이 필요한 경우</strong>에 사용한다. <br></br> - 부모 엔터티에게서 상속받은 주식별자 속성<br>을 타 엔터티에 <strong>이전이 필요한 경우</strong> 사용한다.</td>
<td>- <strong>약한 종속 관계</strong>인 경우에 사용한다.<br></br> - 자식 엔터티의 주식별자 구성을 <strong>독립적으로 <br>구성</strong>할 경우에 사용한다. <br></br> - 부모 엔터티로부터 상속받은 주식별자 속성<br>을 타 엔터티에게 <strong>이전하지 않도록 차단이 <br>필요한 경우</strong>에 사용한다. <br></br> - 부모 엔터티의 주식별자가 NULL이 허용되<br>는 (선택 관계) 경우에 사용한다.</td>
</tr>
</tbody></table>
]]></description>
        </item>
    </channel>
</rss>