<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>_soon.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Sun, 02 Apr 2023 13:08:50 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>_soon.log</title>
            <url>https://velog.velcdn.com/images/_soon/profile/8db31a07-0232-4183-a6c2-952684077ee8/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. _soon.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/_soon" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[스프링의 정석] - Spring MVC - 클라이언트 서버, HTTP 요청과 응답]]></title>
            <link>https://velog.io/@_soon/%EC%8A%A4%ED%94%84%EB%A7%81%EC%9D%98-%EC%A0%95%EC%84%9D-Spring-MVC</link>
            <guid>https://velog.io/@_soon/%EC%8A%A4%ED%94%84%EB%A7%81%EC%9D%98-%EC%A0%95%EC%84%9D-Spring-MVC</guid>
            <pubDate>Sun, 02 Apr 2023 13:08:50 GMT</pubDate>
            <description><![CDATA[<h3 id="원격-프로그램의-실행">원격 프로그램의 실행</h3>
<ul>
<li>브라우저에 URL을 입력한 후 호출하면 컴퓨터에 있는 WAS프로그램이 ip주소를 받아 실행한다.</li>
</ul>
<p>로컬 환경이 아닌 외부에서 프로그램을 실행하기 위해서는  2가지 일을 해야한다.</p>
<ol>
<li>프로그램 등록</li>
<li>URL과 프로그램을 연결<pre><code class="language-java">package com.fastcampus.ch2;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
</code></pre>
</li>
</ol>
<p>@Controller   // 1. 프로그램 등록
public class Hello {</p>
<pre><code>    @RequestMapping(&quot;/hello&quot;)  // 2. URL에 /hello를 호출하면 해당 main 메서드가 호출된다.
    public void main() {
            System.out.println(&quot;Hello&quot;);
    }</code></pre><p>}
// 브라우저 URL : localhost:8080/ch2 </p>
<pre><code>@Controller로 프로그램을 등록시켜줬으니 브라우저URL에 hello를 검색하면 main()메서드가 실행되어 main()메서드 안의 Hello가 호출된다.
이 때 main()메서드는 객체생성을 하지 않았지만, 톰캣에서 자체적으로 객체를 생성해주기 때문에 main()메서드의 호출이 가능하다.

## 클라이언트와 서버
---
&gt; 
**클라이언트(client) : 서비스를 요청하는 애플리케이션 
    서버(server) : 서비스를 제공하는 애플리케이션**


### 서버의 종류
어떤 서비스를 제공하냐에 따라 달라진다.
Email Service를 제공하면 Email server고
File Service를 제공하면 File server고
browser를 이용한 모든 Service를 제공하는게 Web server다.

### 서버의 포트
1대의 PC에 여러가지 서버를 제공할 수 있는데, 포트번호를 통해 구분한다.
ip주소 뒤에 prot번호를 적으면 어떤 서버로 요청할건지 구분한다.
`ex`
111.22.33.44:25 &lt;span style=&quot;color:red&quot;&gt;`25`&lt;/span&gt; -&gt; Email server
111.22.33.44:22  &lt;span style=&quot;color:red&quot;&gt;`22`&lt;/span&gt; -&gt; File server
111.22.33.44:80  &lt;span style=&quot;color:red&quot;&gt;`80`&lt;/span&gt; -&gt; Web server

### 웹 애플리케이션 서버(WAS)란?
웹 애플리케이션을 서비스하는 서버
**서버에 모든 프로그램을 설치해서 클라이언트가 프로그램을 사용할 수 있게 해준다.**

**📌 WAS에 프로그램을 설치하면 한곳에서 update를 하고 클라이언트의 설치용량도 필요없기 때문에 클라이언트에 프로그램을 설치하는 것보다 효율적이다.**

### Tomcat의 내부 구조
Tomcat Server안에는 Service가 있고, 그 서비스를 처리하는 것이 Engine(Catalina)이다.
Engine안에는 여러개의 Host가 존재하고, Host안에는 여러개의 Context가 있다. `Context는 Spring Project를 의미`
Context안에 있는 Servlet은 Controller로 생각할 수 있다.
요청이 들어오면 Server(Tomcat)안에 Thread Pool이 대기하고 있다가 한가한 Thread가 도맡아 작업한다.

![Tomcat내부구조](https://user-images.githubusercontent.com/103868639/229182545-bbfb1038-8872-482f-afea-875e6ca872e9.png)

### Tomcat의 설정파일 - server.xml, web.xml
- 톰캣설치경로/conf/server.xml&amp;nbsp; : Tomcat 서버 설정 파일
- 톰캣설치경로/conf/web.xml&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : Tomcat의 모든 web app의 공통 설정
- 웹앱이름/WEB-INF/web.xml&amp;nbsp;&amp;nbsp;&amp;nbsp; : web app의 개별 설정

공통 설정을 먼저 한 후에 개별 설정을 한다.

## HTTP요청과 응답
--- 
### HttpServletRequest
- 웹 브라우저에서 URL을  입력 후 요청 → 톰캣이 HttpServletRequest객체 생성 후 URL 요청 정보를 담고 → main()의 매개변수로 넘겨준다.
우리는 request객체를 이용해서 요청정보를 알 수 있다.

### HttpServletRequest의 메서드

![HttpServletRequestMethod](https://user-images.githubusercontent.com/103868639/229183747-6fce9a34-6dbe-432d-930a-253c473e5885.png)
getQueryString()은 값을 전달할 때 사용한다.
![getQueryString](https://user-images.githubusercontent.com/103868639/229184043-6a12edf5-0f74-467f-8ab0-e0c5f58fe74a.png)
&amp;은 구분자로 사용하고 year=2021이, month=10, day=1이 저장된다.

### 서버가 제공하는 리소스에는 2가지가 존재한다.
1. 동적 리소스
: 실행하는 프로그램, 스트리밍

2. 정적 리소스
: 이미지 *js, *.css, *html 등등
&lt;br&gt;


### 프로토콜(protocol)이란?
&gt; 
- **서로 간의 통신을 위한 약속 규칙**
- **주고받을 데이터에 대한 형식을 정의한 것**


### HTTP(Hyper Text Transfer Protocol)란?
&gt;
- **텍스트를 전송하기 위한 프로토콜 약속이다.**
- **단순하고 읽기 쉽다.**
- **상태를 유지하지 않는다. (stateless) - 같은 클라이언트에서 요청이 와도 알지 못함. 클라이언트의 정보를 저장하지 않음**
- **쿠키와 세션을 사용해 이를 보완한다.**
- **확장 가능하다. - 커스텀 헤더(header) 추가 기능, 우리가 원하는 대로 추가가 가능하다.**


### HTTP 메시지
브라우저에 URL을 입력해서 전송하면 요청 메시지가 서버로 전달된다.
```html
&lt;!-- 요청 메시지 --&gt;
GET/ch2/hello HTTP/1.1
Host : 111.22.33.44.8080
Connection:keep-alive
Cache-Control:max-age=0
Accept-Encoding:gzip, deflate, br</code></pre><p>서버는 요청을 받고 응답 메시지를 전송한다.</p>
<pre><code class="language-html">&lt;!-- 요청 메시지 --&gt;
GET/ch2/hello HTTP/1.1
Host : 111.22.33.44.8080
Connection:keep-alive
Cache-Control:max-age=0
Accept-Encoding:gzip, deflate, br</code></pre>
<h3 id="http-메시지---응답-메시지-형식">HTTP 메시지 - 응답 메시지 형식</h3>
<pre><code class="language-html">HTTP/1.1 200 OK  &lt;!-- 상태코드 : 200 OK 성공했다는 의미 --&gt;
Content-Length : 44
Content-Type : text/html
Date : Sat, 20 Oct 2021 19:03:38 GMT   &lt;!-- 상태코드 아래는 헤더 N줄 --&gt;

&lt;html&gt;
&lt;head&gt;&lt;/head&gt;
&lt;body&gt;Hello&lt;/body&gt;
&lt;/html&gt;</code></pre>
<table>
<thead>
<tr>
<th align="center">상태코드</th>
<th>의미</th>
</tr>
</thead>
<tbody><tr>
<td align="center">1XX</td>
<td>Informational</td>
</tr>
<tr>
<td align="center">2XX</td>
<td>Success <span style="color:orange">성공</span></td>
</tr>
<tr>
<td align="center">3XX</td>
<td>Redirect <span style="color:orange">다른 URL요청</span></td>
</tr>
<tr>
<td align="center">4XX</td>
<td>Client Error <span style="color:orange">클라이언트 에러</span></td>
</tr>
<tr>
<td align="center">5XX</td>
<td>Server Error <span style="color:orange">서버 처리중 에러</span></td>
</tr>
</tbody></table>
<h3 id="http-메시지---요청-메시지">HTTP 메시지 - 요청 메시지</h3>
<pre><code class="language-html">&lt;!-- Http 요청 메시지 - GET --&gt;
GET/ch2/getYoil?year=2021&amp;month=12&amp;day=1 HTTP/1.1
Host:111.22.33.44:8080
User-Agent:Mozilla/5.0(Windows NT 10.0)
Accept:text/html
Connection:keep-alive</code></pre>
<p>쿼리스트링에 데이터를 직접 입력해서 보낸다. 바디에 첨부 X
리소스를 요청해서 데이터를 얻어오기 위함이며, read 읽기 전용
<br></p>
<pre><code class="language-html">&lt;!-- Http 요청 메시지 - POST --&gt;
POST/ch2/getYoil HTTP/1.1
Host:111.22.33.44:8080
User-Agent:Mozilla/5.0(Windows NT 10.0)
Accept:text/html
Connection:keep-alive

&lt;!-- 바디 --&gt;
year=2021&amp;month=12&amp;day=1</code></pre>
<p>바디 부분에 데이터를 저장해서 서버로 보낸다.
write글쓰기, 로그인, 회원가입, 파일첨부 등에 많이 사용</p>
<h3 id="http-메서드---get-post">HTTP 메서드 - GET, POST</h3>
<table>
<thead>
<tr>
<th>GET</th>
<th>POST</th>
</tr>
</thead>
<tbody><tr>
<td>. 서버의 리소스를 가져오기 위해 설계</td>
<td>. 서버에 데이터를 올리기 위해 설계</td>
</tr>
<tr>
<td>. Query String을 통해 데이터를 전달 (소용량)</td>
<td>. 전송 데이터 크기의 제한이 없음 (대용량)</td>
</tr>
<tr>
<td>. URL에 데이터 노출되므로 <span style="color:red">보안에 취약함</span></td>
<td>. 데이터를 요청 메시지의 body에 담아 전송</td>
</tr>
<tr>
<td>. 데이터 <span style="color:red">공유에 유리</span></td>
<td>. <span style="color:red">보안에 유리</span>, 데이터 <span style="color:red">공유에는 불리</span></td>
</tr>
<tr>
<td>ex. 검색엔진에서 검색단어 전송에 이용</td>
<td>ex. 게시판에 글쓰기, 로그인, 회원가입에 사용</td>
</tr>
</tbody></table>
<h3 id="텍스트-파일-vs-바이너리-파일">텍스트 파일 vs 바이너리 파일</h3>
<p>바이너리 파일 : 문자와 숫자가 저장되어 있는 파일
텍스트 파일 &nbsp;&nbsp; : 문자만 저장되어 있는 파일, <span style="color:orange">사람이 읽기가 쉽다.</span></p>
<table>
<thead>
<tr>
<th align="center">파일 종류</th>
<th align="center">쓰기</th>
<th align="center">읽기</th>
</tr>
</thead>
<tbody><tr>
<td align="center">바이너리</td>
<td align="center">문자 → 문자<br>숫자 → 숫자</td>
<td align="center">문자 → 문자<br>숫자 → 숫자</td>
</tr>
<tr>
<td align="center">텍스트</td>
<td align="center">문자 → 문자<br><span style="color:orange">숫자 → 문자</span></td>
<td align="center">문자 → 문자<br><span style="color:orange"><del>문자 → 숫자</del></span></td>
</tr>
<tr>
<td align="center"><img src="https://user-images.githubusercontent.com/103868639/229352515-84b2201f-f38f-41f8-ac15-215347e95312.png" align=left ></td>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td align="center"><hr/></td>
<td align="center"></td>
<td align="center"></td>
</tr>
</tbody></table>
<h3 id="mime--multipurpose-internet-mail-extensions-">MIME ( Multipurpose Internet Mail Extensions )</h3>
<p>텍스트 기반 프로토콜 바이너리 데이터<code>이미지, 동영상</code>를 전송하기 위해 고안한 것이다.
HTTP의 Context-Type헤더에 사용한다. 데이터의 타입을 명시하는 것
<img src="https://user-images.githubusercontent.com/103868639/229354521-f94fe099-f1f8-48e8-82cb-a7e26b1a4430.png" align=left></p>
<hr/>

<h3 id="base64---64진법">Base64 - 64진법</h3>
<p>바이너리 데이터를 텍스트 데이터로 변환할 때 사용
64진법은 ‘0’<del>’9’, ‘A’</del>’Z’, ‘a’~’z’, ‘+’, ‘/’ 모두 64개의 문자로 구성 
26 + 26 + 10 + 2 = 64개 ( 6bit )의 문자로 구성
<img src="https://user-images.githubusercontent.com/103868639/229354676-f79c5a9b-f774-40a8-bfd8-c38d3349d76b.png" align=left></p>
<hr/>]]></description>
        </item>
        <item>
            <title><![CDATA[[핵심 데이터 모델링] - 물리 모델링]]></title>
            <link>https://velog.io/@_soon/%ED%95%B5%EC%8B%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81-%EB%AC%BC%EB%A6%AC-%EB%AA%A8%EB%8D%B8%EB%A7%81</link>
            <guid>https://velog.io/@_soon/%ED%95%B5%EC%8B%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81-%EB%AC%BC%EB%A6%AC-%EB%AA%A8%EB%8D%B8%EB%A7%81</guid>
            <pubDate>Sat, 18 Mar 2023 15:13:27 GMT</pubDate>
            <description><![CDATA[<h1 id="물리-모델링이란">물리 모델링이란</h1>
<hr>
<blockquote>
<p>📌** 논리 모델링 결과를 실제 업무에서 사용할 수 있게 바꾸는 것
             성능이 제일 중요하다. 성능이 안좋으면 역정규화도 진행함**</p>
</blockquote>
<ul>
<li>** 물리 모델링은 논리 데이터 모델을 DB종류에 맞게 데이터를 저장할 수 있는 테이블 구조로 변환하는 과정이다.**</li>
<li>엔티티 및 서브타입을 테이블로 변환하고, 속성을 컬럼으로 변환해 데이터타입 및 길이를 지정</li>
</ul>
<h2 id="테이블-설계">테이블 설계</h2>
<hr>
<blockquote>
<p>📌 <strong>관계형 모델에서는 논리 데이터 모델을 테이블로 변환한다.
엔티티 -&gt; 테이블
속성 -&gt; 컬럼</strong> </p>
</blockquote>
<ul>
<li>테이블명은 엔티티명을 참고해 작성한다.<ul>
<li>주제영역 약어와 엔티티명의 표준 영문 약어를 조합해서 만들거나</li>
<li>대, 중, 소 주제영역 약어와 일련번호를 조합해 만든다.<br></li>
</ul>
</li>
<li>테이블은 로우<code>Row</code>와 컬럼<code>Column</code>으로 구성되며. 가장 기본적인 오브젝트이다.
  DB내 모든 데이터는 테이블에 저장되며, 로우<code>행</code> or 컬럼<code>열</code> 방식으로 저장된다.
  <img src="https://user-images.githubusercontent.com/103868639/225927416-21854219-0ad5-4e6b-b703-eed843c32913.png" alt="테이블"></li>
</ul>
<ul>
<li><p>테이블에선 슈퍼타입/서브타입 구조를 직접 표현할 수 없다.
통합해서 설계하거나, 각각 엔티티를 각각의 테이블로 설계한다.</p>
<h3 id="슈퍼타입-기준-테이블-설계">슈퍼타입 기준 테이블 설계</h3>
</li>
<li><p>서브타입 엔티티를 -&gt; 슈퍼타입 엔티티로 통합해 테이블 설계</p>
</li>
<li><p>순서..는 그냥 그림으로 설명한다.
<img src="https://user-images.githubusercontent.com/103868639/225927704-c98d5792-e6c4-47c2-afd7-abab08bc7cd6.png" alt="슈퍼테이블기준설계"></p>
</li>
<li><p>주의할점</p>
<ul>
<li>슈퍼타입 엔티티에서 공통으로 관리하는 속성이 많고, 서브타입이 몇개 없거나 속성이 많지 않을 때 사용</li>
<li>고객유형코드에 해당하는 경우만 주민등록번호 또는 법인등록번호 값이 있으므로 Not Null을 지정할 수 없다<ul>
<li>경우에 따라 인덱스도 각각 추가해야 한다.<h3 id="서브타입-기준-테이블-설계">서브타입 기준 테이블 설계</h3>
</li>
</ul>
</li>
</ul>
</li>
<li><p>슈퍼타입 속성 -&gt; 서브타입으로 내려 서브타입 단위로 테이블을 생성</p>
</li>
<li><p>슈퍼타입 엔티티에 연결된 관계 대신 서브타입 엔티티에 관계를 추가</p>
</li>
<li><p>슈퍼타입 엔티티를 삭제하고 서브타입 엔티티에 테이블명을 준다.
<img src="https://user-images.githubusercontent.com/103868639/225928015-06af692a-d157-4258-aeba-5c9a4b4cf91c.png" alt="서브타입기준테이블설계"></p>
</li>
<li><p>주의할점</p>
<ul>
<li>서브타입 엔티티 속성들이 명확히 구분되어야 한다.</li>
<li>전체 집합을 데이터 처리 시 두 집합을 UNION ALL 해야하고, 다른 테이블과 관계가 있으면 개별 서브타입에 관계를 추가해야한다.</li>
<li>이처럼 여러 테이블을 처리해야 한다면 프로그램이 복잡해진다.<h3 id="슈퍼타입서브타입-테이블-설계">슈퍼타입/서브타입 테이블 설계</h3>
</li>
</ul>
</li>
<li><p>슈퍼타입과 서브타입 엔티티를 개별 테이블로 설계 -&gt; 테이블 명을 부여하는 방식</p>
</li>
<li><p>슈퍼타입, 서브타입 테이블은 1 : 1 관계로 정의한다.
<img src="https://user-images.githubusercontent.com/103868639/225928236-a4c7fe5e-9a52-4542-8e64-35bacba4df25.png" alt="슈퍼 서브타입테이블설계 (2)"></p>
</li>
<li><p>전체 데이터에 대해 공통적인 속성을 처리할 경우 -&gt; 슈퍼타입 테이블을 읽어서 처리하고,
서브타입 테이블에서 관리하는 데이터를 화면에서 상세조회하는 경우 -&gt; 서브타입 테이블을 읽어 처리한다.
<code>ex</code> 
고객이 보험에 가입한 보험 목록을 조회 -&gt; 슈퍼타입 테이블 조회, 
특정 보험계약을 선택할 경우 -&gt; 서브타입 테이블  상세정보 조회</p>
</li>
</ul>
<h2 id="관계-설계">관계 설계</h2>
<hr>
<ul>
<li><p>관계는 기본적인 관계, 상호배타적 관계, 순환 관계로 나눌 수 있다.</p>
<h3 id="기본적인-관계">기본적인 관계</h3>
</li>
<li><p>부모 테이블의 PK를 -&gt; 자식테이블 PK나 FK로 상속받는다.</p>
</li>
</ul>
<h3 id="상호배타적-관계">상호배타적 관계</h3>
<ul>
<li>DBMS는 상호배타적 관계를 지원 X<ul>
<li>논리적인 상호배타적 관계를 DBMS가 수용할 수 있도록 테이블을 설계해야함</li>
<li>설계방법은, 1. 한 컬럼으로 통합하는 방법과 2. <del>개별 컬럼으로 분리하는 방법</del>이 있다.<ul>
<li>분리하는 방법은 논리적 구조와 물리적 구조가 다르고, 프로그램이 복잡해져 되도록 통합해 설계한다.</li>
</ul>
</li>
</ul>
</li>
<li>자식 테이블 컬럼 통합/분리 설계
<img src="https://user-images.githubusercontent.com/103868639/225928663-827c3f8a-652e-4487-bf3a-39a4da1c3ac1.png" alt="자식테이블컬럼통합분리설계"></li>
<li>통합하는 방법은 관계에 참여한 모든 관계를 동일한 컬럼<code>고객번호</code>으로 변환하고, 별도 구분 컬럼<code>고객유형코드</code>을 추가해 구분한다.</li>
<li>분리하는 방법은 개별 컬럼<code>개인번호/법인번호/단체번호</code>으로 변환하고, 구분컬럼<code>고객유형코드</code>을 추가해 구분한다.<ul>
<li>해당 관계에 대해 FK설정할 수 있으나, Not Null을 지정할 수 없고, 개별 컬럼마다 인덱스를 생성해야하는 단점이 있다.</li>
</ul>
</li>
</ul>
<h3 id="관계-옵셔널리티-확정">관계 옵셔널리티 확정</h3>
<ul>
<li>논리 모델링 단계에서 정확하지 않거나, 모호하게 설계한 옵셔널리티를 검토하여 확정한다.<br></li>
<li>부모, 자식 엔티티가 Mandatory 관계인 경우
: 테이블에 데이터가 입력되는 시점을 기준으로 결정<ul>
<li>부모 테이블에 데이터가 입력되면 자식 테이블도 동시에 입력된다.<br></li>
</ul>
</li>
<li>자식 엔티티와 Optional 관계인 경우
: 부모 테이블 PK데이터가 자식 테이블에 없어도된다.<ul>
<li>자식 테이블에 데이터가 입력될 때 부모 테이블에 해당 데이터가 이미 존재햐아 한다.<br></li>
</ul>
</li>
<li>양쪽 엔티티가 Optional인 경우
: 부모 테이블 데이터가 없는 상태 -&gt; 자식 테이블에 데이터가 발생하는 유형<ul>
<li>나중에 부모 테이블에 데이터가 생성되면서 자식 테이블 참조 FK를 변경한다.</li>
</ul>
</li>
</ul>
<h2 id="컬럼-설계">컬럼 설계</h2>
<hr>
<ul>
<li>논리 데이터모델의 속성에 대해 표준용어, 표준단어, 표준도메인을 적용하는 작업이 끝</li>
</ul>
<h3 id="속성-컬럼-변환">속성-컬럼 변환</h3>
<ul>
<li>일반적으로 논리 모델에서 정의한 속성은 거의 그대로 사용한다.</li>
<li><strong>💡 시스템에서 데이터에 대한 변화를 추적하고, 트랜잭션을 관리하기 위해 시스템 컬럼을 추가할 수 있다.</strong><ul>
<li><strong>최초등록일시, 최초등록자식별번호, 최종수정일시, 최종수정자식별번호 컬럼이 해당한다.</strong></li>
<li>시스템 컬럼은 모든 테이블에 공통적으로 추가하며 테이블 가장 마지막에 위치하도록 한다.
<img src="https://user-images.githubusercontent.com/103868639/225928986-5faf6ab9-94e7-4bab-aa0d-26735c277909.png" alt="시스템컬럼"></li>
</ul>
</li>
</ul>
<h3 id="데이터-타입-및-길이-지정">데이터 타입 및 길이 지정</h3>
<ul>
<li><p>컬럼에 대한 데이터 타입 지정 관련해 몇 가지 살펴볼 이슈가 있다.</p>
<br></li>
<li><p>이슈 1
: CHAR<code>고정길이</code>, VARCHAR2<code>가변길이</code>중 어느것을 적용할 것인가?
고정 길이의 경우 CHAR로 하는게 좋을꺼 같지만, 빈칸을 공백으로 채우고, 값을 비교하는데 어려움이 있다.
혼용해서 사용하면 내부적인 형 변환등의 문제도 발생할 수 있다.
성능은 그리 고려할 필요는 없다. CHAR이 크게 나은 점도 없다.
결론은 그냥 VARCHAR2만 사용하는게 좋을 듯 하다.</p>
<br></li>
<li><p>이슈 2
: 일자<code>YYYYMMDD</code>컬럼을 VARCHAR2(8)로 할지 DATE형으로 할지에 대한 고민
데이터 타입을 정하는데 데이터 품질을 우선으로 할지 개발 생산성과 성능을 고려할 것인지도 고민된다.
VARCHAR2(8)은 개발자들이 선호하지만 날짜가 아닌 데이터가 유입될 수 있고
날짜형 데이터 타입은 날짜를 문자형식으로 변환하는 일이 많아 생산성이 ↆ 되지만 오류 데이터가 들어올 가망은 거의 없다.(시분초까지 하면 오류가 입력될 여지는 있음)
품질이 우선이면 → DATE형, 생산성이 우선이면 → VARCHAR2(8)
＊CARCHAR2(8)로 한다면 제약조건을 추가하거나, 인덱스를 만들어 오류 데이터가 입력되는걸 방지한다.</p>
<pre><code class="language-sql">alter table emp add constraint emp_ck_ent_dt
check (ent_dt = to_char(to_date(ent_dt, &#39;yyyyMMdd&#39;), &#39;yyyyMMdd&#39; ));
또는
create index emp_ix01 on emp( to_date(ent_dt), &#39;yyyyMMdd&#39;) );

insert into emp values(&#39;20190230&#39;);
-- ORA-01839 : date not valid for month specified</code></pre>
</li>
</ul>
<h3 id="기본키pk--primary-key-지정">기본키(PK : Primary Key) 지정</h3>
<blockquote>
<p>📌 <strong>기본키는 Not Null 이어야 하고, Unique 해야한다.</strong></p>
</blockquote>
<ul>
<li>논리 데이터 모델의 주 식별자를 기본키<code>PK</code>로 생성한다.</li>
<li>자체 컬럼으로 구성하는 경우 핵심 엔티티, 중요 엔티티에 해당하는 테이블이고, 데이터에 대한 일정한 채번규칙을 가지고 있어야 한다.</li>
<li>부모 테이블에서 상속받는 경우는 상속받은 컬럼에 숫자형 데이터타입을 가지는 일련번호 컬럼을 추가하는게 일반적이다.<br></li>
<li>다른 테이블들의 키로만 구성된 테이블은 교차 or 매핑 성격의 데이터를 가지는 테이블이다.
참조하는 컬럼과 동일한 데이터 타입과 길이로 정의한다.<ul>
<li>다만, 기본키는 조회조건에서 가장 많이 쓰는 컬럼 순으로 구성하고, 값의 종류가 많은 컬럼이 먼저 오도록 구성한다.</li>
</ul>
</li>
</ul>
<h2 id="데이터-무결성-설계">데이터 무결성 설계</h2>
<hr>
<blockquote>
<p><strong>일관성 (Consistency) : 내 계좌에 100원이 나가면 상대방 계좌에 100원이 추가됨
무결성 (Integrity) : 제약조건으로 이상한 데이터가 들어오면 안된다.</strong></p>
</blockquote>
<ul>
<li>데이터 무결성은 데이터를 저장하고 관리할 때 데이터의 정확성과 일관성을 유지하기 위해 정의한 규칙이다.</li>
<li>데이터 무결성은 아래 3가지가 있다.</li>
</ul>
<ol>
<li>실체 무결성 (Entity Integrity)</li>
<li>영역 무결성 (Domain Integrity)</li>
<li>참조 무결성 (Referential Integrity)</li>
</ol>
<h3 id="실체-무결성entity-integrity">실체 무결성(Entity Integrity)</h3>
<ul>
<li>실체 무결성은 기본키<code>PK</code>와 관련된 제약조건으로 식별자 값은 Not Null, Unique 이여야 한다.<pre><code class="language-sql">create table emp (
        emp_no   varchar2(6)   not null,
        emp_nm   varchar2(50)  not null, 
        brth_dt  varchar2(8) 
);
alter table emp add constraint emp_pk primary key (emp_no) ; 
alter table emp add constraint emp_uk unique (emp_nm, brth_dt) ;</code></pre>
</li>
</ul>
<h3 id="영역-무결성domain-integrity">영역 무결성(Domain Integrity)</h3>
<ul>
<li>데이터의 속성 값들은 정해진 데이터 범위를 벗어나지 않아야 하고, 데이터 타입, 길이, 유효값을 유지해야 한다.</li>
<li>Check, Default, Not Null 제약조건에 해당<pre><code class="language-sql">create table emp (
        emp_no   varchar2(6)   not null,
        emp_nm   varchar2(50)  not null, 
        brth_dt  varchar2(8) ,
        reg_dtm  date          default sysdate not null
);
alter table emp add constraint emp_ck_brth_dt
check (brth_dt = to_char(to_date(brth_dt, &#39;yyyyMMdd&#39;), &#39;yyyyMMdd&#39;)); 
</code></pre>
</li>
</ul>
<p>insert into emp values(&#39;000001&#39;, &#39;홍길동&#39;, &#39;20190231&#39;, sysdate);
-- ORA-01847 : day of month must be between 1 and last day of month;</p>
<pre><code>- 등록일시`reg_dtm` 데이터를 입력하지 않았을 경우 기본값을 sysdate, default로 지정된다.
    생년월일`brth_dt`은 문자형 데이터 타입이지만 check 제약조건을 통해 `yyyyMMdd` 날짜 형식 데이터가 아닌 경우 오류를 발생시킨다.
    2월 31일은 없는 날짜이므로 입력될 수 없다.

### 참조 무결성(Referential Integrity)
- 참조 무결성은 데이터 모델에서 정의된 실체 간의 관계조건을 유지하는 것
- 참조하는 테이블은 참조할 수 없는 외래 키`FK`를 가져갈 수 없고, 참조되는 테이블은 외래키가 존재하는 한 데이터를 삭제하거나 변경할 수 없다. FK제약조건에 해당
```sql
alter table emp add constraint emp_fk FOREIGN KEY (dept_cd)
    references dept(dept_cd) on delete set null ;

insert into emp(emp_no, dept_cd) values(&#39;000002&#39;, &#39;0002&#39;);
-- ORA-02291 : integrity constraint violated - parent key not found</code></pre><ul>
<li>부서<code>dept</code> 테이블에 존재하지 않는 부서코드<code>0002</code>를 사원<code>emp</code>테이블에 입력할 경우 FK 제약조건에 걸려 오류 발생</li>
<li>FK 제약은 확실하고 간편한 방법이지만 성능적인 측, 관리적은 측면도 고려해야 한다.
보통은 FK를 설정하지 않고 개발한다음 나중에 개발이 마무리되면  FK를 설정한다.</li>
</ul>
<h2 id="성능을-고려한-데이터-구조">성능을 고려한 데이터 구조</h2>
<ul>
<li>물리 모델링 단계에서 대량의 자주 데이터를 처리하거나, 특정 범위를 자주 처리하는 경우는 확인하여 테이블을 설계해야 한다.
  필요할 경우 집계 테이블을 추가하는 정도?    </li>
</ul>
<h3 id="집계요약-테이블-추가">집계/요약 테이블 추가</h3>
<ul>
<li>대량의 데이터를 실시간으로 읽어, 집계하고 처리할 경우 집계 테이블을 추가할 수 있음<ul>
<li>성능적인 문제를 해결하면서 다양한 집계처리를 포함하고, 공통된 조건을 분석해 테이블을 설계한다.</li>
<li>배치 처리/작업 : 월간 데이터를 실시간이 아닌 월말이나 초에 정리하고 전월처리로 계산한다.</li>
</ul>
</li>
</ul>
<h3 id="컬럼-추가">컬럼 추가</h3>
<ul>
<li>정규화를 잘 했으면 컬럼 중복으로 인한 오류 데이터 유입을 최소화 할 수 있다.</li>
<li>성능 문제 때문에 정규화를 일부 포기하고 반정규화 하거나 중복 컬럼을 추가해야 하는 경우도 있다.
  적당한 타협선이 필요하다.</li>
<li>부모 테이블에서 인조 식별자를 기본키로 설계한 경우 기본키를 상속받으면서 본질 식별자에 해당하는 컬럼을 추가하거나,
  자주 조회 조건으로 사용하는 컬럼을 자식 테이블에 추가하는 경우가 대표적이다.  <br></li>
<li>부모 테이블에 컬럼을 추가하는 경우도 있다.
  부모 테이블에서 자식 테이블의 집계된 값이나 최종 데이터 값을 가지고 있다면, 매번 자식 테이블에서 최소/최대, 
  건수/합계, 등 최종 데이터 값을 추출할 필요가 없으므로 성능이 향상된다.
  <img src="https://user-images.githubusercontent.com/103868639/225957411-df6ed53e-6d44-46a2-a2be-02d15898fa8b.png" alt="부모테이블중복컬럼추가"></li>
</ul>
<h3 id="테이블-분할">테이블 분할</h3>
<ul>
<li>테이블은 컬럼<code>가로</code>과 로우<code>세로</code>로 구성되어 있고, 데이터를 처리할 때 가로 세로 면적이 처리범위가 된다. 면적을 줄이기 위해 가로, 세로를 줄이는 방법이 있다.<br></li>
<li>테이블 수직분할 
  : 가로를 줄이는 방법으로 테이블의 컬럼을 두 개 이상의 테이블로 나눠 관리하는 방법<pre><code>  **1 :1 구조로 나누는 이유? : 성능과 보안 때문**
  `ex` 게시판 테이블
  게시물내용 컬럼은 아주 많은 문자가 입력되므로 게시판 데이터의 대부분을 차지한다.
  보통은 게시물 목록을 보여주고, 게시물 선택 시 → 게시물 내용 확인 순이다.
  게시물 목록 조회시 데이터는 가져오지 않지만, **컬럼이 포함되어 있어 불필요하게 큰 데이터를 처리할 수 밖에 없다.**
  이와 같이 사용하는 컬럼들끼리 묶어 다른 테이블로 분리하면 성능 향상에 도움이 된다.
  ![테이블수직분할](https://user-images.githubusercontent.com/103868639/225971781-ad3af109-3878-4391-8a56-61427a56d941.png)</code></pre></li>
</ul>
<h2 id="물리-설계">물리 설계</h2>
<ul>
<li>물리 모델링 이후 DBMS 특성을 고려해 성능, 관리, 보안, 개발 생산성의 목적에 맞게 물리적인 설계를 한다.</li>
<li>프로젝트에서 주로 사용하는 DB오브젝트는 테이블, 인덱스, 뷰<code>읽기전용</code>, 시노님<code>object 별명</code>, 함수<code>반환값O</code>, 프로시저<code>반환값X</code>, 시퀀스 등이 있다.
<img src="https://user-images.githubusercontent.com/103868639/226114086-d31ca7d0-0c4e-4b22-9950-40255393864b.png" alt="오브젝트설계목적"></li>
<li>테이블, 인덱스, 시노님은 설계 단계에서 DA/DBA가 설계하고, 뷰, 함수, 프로시저, 시퀀스는 개발 단계에서 개발자가 직접 생성하거나 DBA에게 요청한다.
  데이터를 저장하고 관리하는 오브젝트는 테이블과 인덱스 등이 있다.</li>
</ul>
<h3 id="오브젝트-명명-규칙">오브젝트 명명 규칙</h3>
<ul>
<li>테이블, 뷰, 시퀀스, 함수, 프로시저 등은 명명 규칙에 따라 영문 약어 및 일련번호 등을 조합하여 부여한다.<ul>
<li><code>ex</code> TCM_CUST (테이블), VCM_CUST (뷰), SCM_CUST_NO_01 ( 시퀀스), FCM_CUST_NM (함수), PCM_CUST_DEL (프로시저)</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[핵심 데이터 모델링] - 논리 모델링]]></title>
            <link>https://velog.io/@_soon/%ED%95%B5%EC%8B%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81-%EB%85%BC%EB%A6%AC-%EB%AA%A8%EB%8D%B8%EB%A7%81</link>
            <guid>https://velog.io/@_soon/%ED%95%B5%EC%8B%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81-%EB%85%BC%EB%A6%AC-%EB%AA%A8%EB%8D%B8%EB%A7%81</guid>
            <pubDate>Tue, 14 Mar 2023 12:31:56 GMT</pubDate>
            <description><![CDATA[<h1 id="논리-모델링이란">논리 모델링이란?</h1>
<hr>
<blockquote>
<p>📌 <strong>개념 모델링의 내용을 구체적으로 정의한다</strong></p>
</blockquote>
<ul>
<li>비즈니스에서 필요로 하는 데이터를 명확하고 구체적으로 정의하는 과정</li>
<li>핵심 엔티티를 중심으로 업무에 필요한 하위 엔티티로 확장하면서 상세화 한다.</li>
<li>엔티티를 정의하고 관계를 명확히 하되, DBMS의 물리적인 특성까지 고려할 필요 X</li>
</ul>
<h3 id="방법">방법</h3>
<ul>
<li>기초 논리 데이터 모델 설계<ul>
<li>주제영역별 핵심 엔티티 도출</li>
<li>엔티티간 주요 속성 도출</li>
</ul>
</li>
</ul>
<ul>
<li>논리 데이터 모델 설계<ul>
<li>업무영역에 필요한 데이터 모델을 설계</li>
<li>시스템 관점 데이터는 반영 X</li>
<li>이력관리에 대해 꼭 관리할 필요가 있는지 반영해야함</li>
</ul>
</li>
</ul>
<h2 id="엔티티-정의-및-상세화">엔티티 정의 및 상세화</h2>
<hr>
<h3 id="핵심-엔티티-key-entity-기준정보">핵심 엔티티 (Key Entity, 기준정보)</h3>
<ul>
<li><p>유형 및 분류 (Type &amp; Category)
: 각종 코드 정보, 데이터 집합을 유형화 하거나 계층적으로 분류하는 정보
<code>ex</code> 고객유형코드, 상품분류코드 등 각종 코드정보</p>
<br>
</li>
<li><p>업무규칙 및 지식 (Rule &amp; Knowledge)
: 업무처리를 위한 각종 규정과 지식
<code>ex</code> 직급별 연봉, 보험료 조건, 지역별 담당자</p>
<br>
</li>
<li><p>업무주체 및 대상 (Subject &amp; Object) <code>핵심 엔티티</code>
: 비즈니스 이벤트의 주체 또는 대상
<code>ex</code> 부서, 사원, 고객, 상품</p>
<br>
</li>
<li><p>장소 (Where)
: 비즈니스 이벤트가 발생하는 장소.
<code>ex</code> 물류창고, 공장, AS센터, 도로, 채널, 지역, 좌표 등등</p>
<br>

</li>
</ul>
<h3 id="중요-엔티티-main-entity-업무기본">중요 엔티티 (Main Entity, 업무기본)</h3>
<ul>
<li>업무 주체 <code>고객, 직원</code> 와 업무 대상<code>상품</code> 간의거래나 업무 행위에 의해 발생함</li>
<li>주문, 약정, 입출고 처럼 구별 가능한 업무 행위를 대표하는 엔티티<br>

</li>
</ul>
<h3 id="행위-엔티티-action-entity-업무상세">행위 엔티티 (Action Entity, 업무상세)</h3>
<ul>
<li>업무 행위에 대한 상세내역 및 업무 결과에 대한 상태를 나타내는 엔티티<ul>
<li>상세 / 내역 - 주문 내역, 예산 내역처럼 항목 단위로 분류하거나, 더 작은 단위로 세분화한 엔티티</li>
<li>상태 - 시간의 간격을 두고 업무 단계별로 담당자가 처리하는 흐름<ul>
<li>시간의 흐름에 따른 정보의 상태, 내용 변경 면에서 이력 엔티티와 유사할 수 있다. but
이력 : 시간이 흐름에 따른 정보 변경,
상태 : 업무처리 흐름에 대한 상태 관리</li>
</ul>
</li>
<li>이력 - 변경 전 데이터를 추가로 관리하는 엔티티<ul>
<li>이력관리가 필요한지 확인해 볼 필요는 있다.  <br></li>
</ul>
</li>
<li>이력관리<ul>
<li>전체 항목 이력관리
: from ~ to 방식, 기간을 작성
<img src="https://user-images.githubusercontent.com/103868639/225923857-323c52a9-1bb5-4194-bd57-df999158823f.png" alt="이력관리"><br></li>
<li>점 이력 관리
: 변경 시점<code>시작시점</code>만 관리한다.
<code>ex</code> 대출같이 언제 빌려갔는지는 점이력으로 관리한다.
<img src="https://user-images.githubusercontent.com/103868639/225924138-ab478b5d-8157-48d5-ab68-570a579ee274.png" alt="점이력관리"><br></li>
<li>선분이력 관리
: 시작시점과 종료시점을 같이 관리한다.
<code>ex</code>  가격은 계속 변하기 때문에 from ~ to 선분이력으로 관리
변경이 발생했을 때 이전 이력 &#39;변경종료일자&#39; -&gt; (&#39;99991231&#39; -&gt; &#39;20190430&#39;)로 Update하고, 
새로운 이력에 변경시작일자 (&#39;20190501&#39;) 과 변경종료일자 (&#39;99991231&#39;) 구간으로 관리한다.
<img src="https://user-images.githubusercontent.com/103868639/225924286-215741f9-9da9-4149-89da-390768fb7f18.png" alt="선분이력관리"><br>

</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="엔티티-도출-및-식별">엔티티 도출 및 식별</h3>
<ul>
<li>데이터를 분석하여 엔티티로 구체화하는 과정</li>
<li>현행 데이터 모델이 있는 경우, 불필요한 업무나 기능과 관련된 테이블을 식별 후 삭제
: 이미 그려진 그림을 지우는 건 생각보다 어렵다. </li>
<li>작업이 어느정도 마무리되면 현업과 인터뷰 전에 엔티티명, 관계선, 속성명을 정리하는 것이 좋다.<br>

</li>
</ul>
<h3 id="엔티티-명명">엔티티 명명</h3>
<ul>
<li>엔티티명은 테이블 내에서 유일하게 부여하며, 데이터를 가장 명확히 표한할 수 있도록 작성한다.</li>
<li>너무 길지 않아야 하고, 구체적인 용어를 사용하는게 좋음</li>
<li>유사한 엔티티를 별도로 설계한 경우 주제영역이나 수식어를 붙여서 구분한다.
<code>ex</code> 여신과 수신업무에서 &#39;계좌&#39;를 정의한 경우 여신계좌, 수신계좌로 명확히 구분 <code>여신:대출업무, 수신:예금업무</code><br>

</li>
</ul>
<h3 id="엔티티-명명규칙">엔티티 명명규칙</h3>
<ul>
<li>엔티티 명은  단수형 명사를 사용한다.
<code>ex</code> 고객, 부서, 상품, 주문, 계약<br></li>
<li>엔티티 범위와 내용을 정의하기 위해 수식어를 사용한다.
<code>ex</code> 주소 -&gt; 고객주소, 입급내역 -&gt; 계약입금내역<br></li>
<li>교차 엔티티는 양쪽 엔티티명의 조합을 기본 이름으로 한다.
<code>ex</code> 계약 + 상품 -&gt; 계약상품<br></li>
<li>낱 단어는 정확한 의미를 파악하기 어려우므로 아주 예외적인 경우를 제외하고는 사용 X
<code>ex</code> 고객별실적 -&gt; 고객단위실적, 예산계획및실적 -&gt; 예산계획실적<br></li>
<li>한글과 알파벳 대문자를 사용, 숫자, 언더바를 허용 O
띄어쓰기, 특수 문자 허용 X<br>

</li>
</ul>
<h2 id="관계-도출-및-정의">관계 도출 및 정의</h2>
<hr>
<h2 id="속성-도출-및-정의">속성 도출 및 정의</h2>
<hr>
<ul>
<li>모든 속성을 도출하고, 속성명, 성성정의, 설명, 필수여부, 데이터타입 등을 정의해야 함</li>
</ul>
<h3 id="속성-도출">속성 도출</h3>
<ul>
<li>요구사항이나 현행 ERD 등 엔티티를 도출하고 식별하는 과정과 유사함</li>
</ul>
<h3 id="식별자-지정">식별자 지정</h3>
<ul>
<li>식별자는 유일하게 식별 가능하고, 최소 속성으로 구성, 변하지 않으며, 반드시 존재하는 값이어야 함</li>
<li>식별자는 존재하는 속성에 따라 본질 식별자와 대체<code>보조</code> 식별자로 구분한다.<br></li>
<li>본질식별자
: 엔티티에 원래 존재하는 속성으로 구성된 식별자
<code>ex</code> 사원 엔티티의 사원번호, 주민등록번호
아닌 경우도 있다.<br><code>ex</code> 업무처리나 이벤트 성격의 데이터인 회원ID, 계좌번호<br></li>
<li>인조식별자는 결재번호처럼 결재를 보고할 때 본질식별자<code>(사원번호 + 보고날짜)</code> 대신 인위적으로 부여한 일련번호 형식의 식별자를 의미</li>
</ul>
<h3 id="인조식별자를-정의하는-경우">인조식별자를 정의하는 경우</h3>
<ul>
<li><p>논리 데이터 모델은 업무 변경에 유연하게 대응하고 확장성을 가져야 한다.</p>
</li>
<li><p>서로 다른 본질 식별자를 가진 엔티티를 통합할 때 본질식별자를 그대로 사용하면 구조가 복잡해지고 데이터 값이 없는 경우도 발생함</p>
<br></li>
<li><p>인조식별자를 사용하면 식별자를 변경할 가능성이 낮아지고, 설계 변경을 최소화할 수 있어 유연하고 확장 가능한 모델을 설계할 수 있음</p>
<blockquote>
<p>📌 </p>
</blockquote>
</li>
<li><p><em>식별관계 : 다른 table의 PK를 내 PK로 가져오는것
요약 : FK면서 PK
FK : 다른 테이블의 PK*</em></p>
</li>
<li><p>식별관계 중 키가 많아지는 걸 방지하기 위해 없는 키를 생성하는데 이게 인조키다.
<img src="https://user-images.githubusercontent.com/103868639/225924692-0c31a61c-290b-42de-8350-8e262c68af8d.png" alt="인조식별자정의"></p>
<br>

</li>
</ul>
<h3 id="도메인-및-데이터타입-지정">도메인 및 데이터타입 지정</h3>
<blockquote>
</blockquote>
<p>📌 도메인 : 속성들이 가질 수 있는 값의 범위
속성 : 테이블을 구성하는 컬럼, 속성은 값을 얻는다.
예) 고객 엔티티의 속성은?   이름, 연락처, 주소, 가입일, 등등...</p>
<ul>
<li>속성에서 도메인을 지정하거나, 데이터타입을 지정하여 속성이 가질 수 있는 데이터 값의 범위를 정의한다.<br>

</li>
</ul>
<h3 id="옵셔널리티not-null-지정">옵셔널리티(Not Null) 지정</h3>
<ul>
<li>엔티티에 데이터가 입력될 때 속성 값을 반드시 입력해야할 경우 Mandatory<code>(필수, Not Null)</code>지정</li>
<li>값을 가지지 않아도 되는 경우 Optional<code>(선택, Null)</code>로 지정<br>


</li>
</ul>
<h2 id="데이터-표준화">데이터 표준화</h2>
<hr>
<ul>
<li>데이터에 대한 명칭과 의미를 정하고 활용하는 데이터에 대한 형식 및 범위를 규정하는 활동</li>
<li>구성원이 같은 용어를 동일한 의미로 사용하기 위함</li>
</ul>
<h3 id="단어-표준화">단어 표준화</h3>
<p><a href="https://blog.naver.com/easttree/221850248981," title="17. 표준단어사전">표준단어사전</a> &lt; 블로그 참조</p>
<p><img src="https://user-images.githubusercontent.com/103868639/225926046-a4b3106c-bbab-4712-abd0-b225ce360cf9.png" alt="표준단어기준관리예시">
<br></p>
<p><img src="https://user-images.githubusercontent.com/103868639/225926416-95f39d9e-1e73-4269-9bd8-8a911537126a.png" alt="영문약어명명기준예시"></p>
<br>

<h3 id="코드-표준화">코드 표준화</h3>
<ul>
<li><p>업무에서 통계를 내거나 한정된 데이터 값을 목록화하여 관리하고자 하는 대상을 코드로 식별하여 정의</p>
</li>
<li><p>코드는 공통코드로 통합하거나, 개별 테이블 형태로 관리<code>(목록성 코드라고 함)</code>한다.</p>
</li>
<li><p>코드 표준화 대상은 목록성 코드와 공통코드 모두를 포함한다.</p>
<br></li>
<li><p>코드사전
<img src="https://user-images.githubusercontent.com/103868639/225926722-8c75c1ea-ebc0-4b72-882e-777cd7a9f8ab.png" alt="코드표준화코드사전"></p>
<br>
</li>
<li><p>코드 사전은 코드에 대한 코드유형ID, 코드유형명, 코드, 코드명 등을 정의</p>
</li>
<li><p>업무에서 동일한 의미로 사용하는 코드는 최대한 통합하여 단일 코드유형으로 정의
<code>ex</code> 거래은행(&quot;한국은행&quot;, &quot;기업은행&quot;), 이체은행(&quot;산업은행&quot;, &quot;국민은행&quot;)이 있다면
은행(&quot;한국은행&quot;, &quot;기업은행&quot;, &quot;산업은행&quot;, &quot;국민은행&quot;)으로 통합할 수 있음</p>
</li>
<li><p>여기서, 특정 업무에서 은행코드 중 일부만 사용한다고 하면, 코드유형ID를 별도로 등록 가능</p>
<ul>
<li>but 이 경우도 코드는 001(한국은행), 002(산업은행) 등 동일하게 부여하는게 좋다.<br></li>
<li>분류형
: 코드를 대/중/소 분류체계로 계층을 나누고, 상위 코드에 코드를 추가하는 방식<ul>
<li>코드 구성에 의미를 두어야 함, 직관적이나 코드 추가, 재분류시 관리하기가 어려움</li>
<li><code>ex</code> 농업 : 01, 작물 재배업 : 001, 곡물 밑 식량작물 재배업 : 0111, 축산업 : 012</li>
</ul>
</li>
<li>일련번호형
: 의미없이 순차적으로 일련번호를 부여하는 방식<ul>
<li>코드 추가 시 반영이 쉽다. </li>
<li><code>ex</code> 고객유형, 개인 : 01, 법인 : 02, 기타 : 99</li>
</ul>
</li>
</ul>
</li>
<li><p>약어형
: 성별코드처럼 약어를 그대로 사용하는 방식</p>
<ul>
<li>코드만 보고 무슨 데이터인지 알 수 있게 직관적으로 작성해야 함</li>
<li><code>ex</code> 성별, 남자 : M, 여자 : F</li>
</ul>
</li>
<li><p>차용성
: 업무에서 사용하는 코드를 그대로 쓰는 방식</p>
<ul>
<li>업무적으로 통용되는 코드나, 인터페이스를 위해 사전에 정한 코드를 사용함</li>
<li><code>ex</code> 은행코드, 한국은행 : 001, 산업은행 : 002, 기업은행 : 003</li>
</ul>
</li>
<li><p>&#39;사용여부&#39;, &#39;사용유무&#39;는 두가지 값을 가지며  Y/N, 1/0 처럼 코드로 관리하는게 좋다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[핵심 데이터 모델링] - 개념 모델링]]></title>
            <link>https://velog.io/@_soon/%ED%95%B5%EC%8B%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81</link>
            <guid>https://velog.io/@_soon/%ED%95%B5%EC%8B%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81</guid>
            <pubDate>Mon, 13 Mar 2023 12:00:55 GMT</pubDate>
            <description><![CDATA[<h1 id="개념-모델링">개념 모델링</h1>
<blockquote>
</blockquote>
<p>📌 ** 개념 및 업무를 파악하는 용도로 사용함**
** 데이터를 식별하고 모형화 해 하나의 엔티티와 속성들로 표현하는 방식 **</p>
<hr>
<h2 id="데이터-모델링-접근-방법">데이터 모델링 접근 방법</h2>
<ul>
<li>하향식(Top-Down)<ul>
<li>데이터를 업무 담당자별로 개념을 식별해 정의하는 방식<ul>
<li>개념 모델링 → 논리 모델링 → 물리 모델링 순</li>
<li>큰 규모의 프로젝트나 업무별 담당자가 있을 경우 진행</li>
<li>장점 :  현업과 의사소통을 해가면 진행  →  결과물에 대한 의견 일치</li>
</ul>
</li>
</ul>
</li>
<li>상향식(Bottom-Up)<ul>
<li>작은 규모의 프로젝트나, 현업의 참여가 한정된 경우,</li>
<li>기존 ERD, 보고서, 매뉴얼, 업무지침서를 통해 모델링 진행<ul>
<li>주의 사항 : 모델링 과정을 관련자와 공유하면서 진행해야 설계 변경을 줄일 수 있다.</li>
</ul>
</li>
<li>데이터를 업무 담당자 별로 개념을 식별해 정의하는 방식</li>
</ul>
</li>
</ul>
<h3 id="데이터-모델링-순서">데이터 모델링 순서</h3>
<p><img src="https://user-images.githubusercontent.com/103868639/225921418-45489b00-4aa7-49bc-8f58-2f89de4dcc29.png" alt="데이터모델링순서">
<br></p>
<ul>
<li><p>분석</p>
<ol>
<li>현행 분석<ol>
<li>현행 업무 분석(AS-IS) <code>기존ERD가 있는지 확인</code></li>
<li>현행 데이터 분석</li>
</ol>
</li>
<li>요구사항 정의 (AS-IS ~ TO-BE 방식으로 어필)</li>
<li>방향성 수립 (TO-BE)</li>
</ol>
</li>
<li><p>설계</p>
<ol>
<li>개념 모델링<ol>
<li>주제영역 정의</li>
<li>핵심엔티티 정의</li>
</ol>
</li>
<li>논리모델링<ol>
<li>엔티티 정의</li>
<li>관계 정의</li>
<li>속성 정의</li>
</ol>
</li>
<li>물리 모델링 <code>도메인, Type, PK, Not Null</code><ol>
<li>테이블 설계</li>
<li>무결성 설계</li>
<li>인덱스 등 설계</li>
</ol>
</li>
</ol>
</li>
<li><p>데이터 표준</p>
</li>
<li><p>주로 관리해야 될 필요성이 있는 객체를 표준화 한다.</p>
<ul>
<li>표준 단어 : 표준 단어를 관리함으로써 동일한 개념을을 의미하는 용어가 중복되지 않게 예방</li>
<li>표준 용어 : 업무적으로 사용하는 용어에 대한 표준을 정의해 용어 사용에 혼란을 방지함</li>
<li>표준 도메인 : 데이터 타입과 자릿수가 같은 것을 표준 도메인이라고 한다.</li>
<li>표준 코드 : 도메인의 한 유형으로, 특정 도메인 값(코드 값)이 이미 정의되어 있는 도메인.  따라서 코드에 대한 표준은 다른 표준과는 다르게 데이터 값(코드 값)까지 미리 정의해야 한다.</li>
</ul>
</li>
<li><p>데이터 모델링은 요구사항을 수집하고 , 현행 시스템 데이터 구조 분석 → 문제점 및 개선 방향 도출</p>
</li>
<li><p>개념 모델링 데이터 주제영역 식별, 정의 → 높은 응집도 &amp;&amp; 낮은 결합도 관점으로 주제 영역을 세분화 → 핵심 엔티티 및 식별자를 도출해 관계를 정의</p>
</li>
<li><p>리버스 모델 활용</p>
<ul>
<li>기존에 물리 모델링을 리버스해서 논리 모델링을 수행하는 경우</li>
<li>ERD가 없거나 현행화가 이루어지지 않은 경우 주로 사용.</li>
<li>DB 정보를 이용해 엔티티 및 속성 도출, 관계 식별 ERD 작성한다.</li>
</ul>
</li>
</ul>
<h2 id="개념-모델링-1">개념 모델링</h2>
<ul>
<li>업무 영역으로부터 요구사항을 형상화하여 개념 도출</li>
<li>개념을 구체화하여 엔티티 식별</li>
<li>주제 영역을 확실히 정하는 것이 중요함</li>
</ul>
<h3 id="개념-모델링-순서">개념 모델링 순서</h3>
<blockquote>
</blockquote>
<p>📌 **  주제영역 도출 → 주제영역 분류 및 정의 → 핵심 엔티티 정의 및 관계 정의 **</p>
<h3 id="주제영역">주제영역</h3>
<ul>
<li>최상위 단계에서 분류한 데이터 집합</li>
<li>타 영역 데이터와 상호작용은 최소화하도록 정의
<code>ex</code> 정부 데이터
<img src="https://user-images.githubusercontent.com/103868639/225921966-b59f8b0c-e63c-46c9-856e-eca9bbd62394.png" alt="주제영역"><br>

</li>
</ul>
<h3 id="주제영역-도출">주제영역 도출</h3>
<ul>
<li>하향식 방법<ul>
<li>상위 주제 영역을 식별 후 상위 주제 영역에 속하는 계층을 세분화해 나아가는 방법</li>
</ul>
</li>
<li>상향식 방법<ul>
<li>엔티티를 분류하고 그룹핑해 주제 영역을 도출하는 방법</li>
</ul>
</li>
<li><code>ex</code> 인터넷 뱅킹
<img src="https://user-images.githubusercontent.com/103868639/225922580-6eccc33e-a850-4d23-a6f1-6dc134237fdd.png" alt="주제영역도출"><br>

</li>
</ul>
<h3 id="주제영역-분류">주제영역 분류</h3>
<ul>
<li>주제영역 후보 도출 후 기준에 따라 데이터 분류 빛 통합</li>
<li>주제영역분류 종류<ul>
<li>업무 기능 중심 분류</li>
<li>데이터 관점 분류</li>
</ul>
</li>
<li><code>ex</code> 인터넷 뱅킹
<img src="https://user-images.githubusercontent.com/103868639/225922758-5733380a-10ad-4f84-a773-6ecfa88b5a98.png" alt="주제영역분류"><br>

</li>
</ul>
<h3 id="주제영역-정의">주제영역 정의</h3>
<ul>
<li><p>업무영역 전체</p>
<ul>
<li>포함 여부 확인</li>
<li>중복 여부 확인</li>
<li>동일 기준 적용 검토</li>
</ul>
</li>
<li><p>주제영역명 명명 규칙</p>
<ol>
<li>관리하는 정보를 설명하는 단수형 명사를 사용</li>
<li>한글과 영문 대문자 사용, 숫자 및 특수 문자 사용 금지</li>
<li>영문 약어는 알파벳 대문자와 숫자로 구성</li>
<li>주제 영역은 영문 2자리로 구성<ul>
<li>하위 주제영역은 상위 약어에 숫자 2자리를 붙여 구성
<code>ex</code> CU01, CU0201</li>
</ul>
</li>
</ol>
</li>
<li><p><code>ex</code>  인터넷 뱅킹
<img src="https://user-images.githubusercontent.com/103868639/225923345-6a8c85df-6cbd-4663-a326-d71f12924b83.png" alt="주제영역정의"></p>
<br>
</li>
<li><p>💡<strong>주제 영역을 정의할 때 어려운 점</strong></p>
</li>
<li><p>개념 부족</p>
<ul>
<li>주제 영역 개념에 대한 낮은 이해도<ul>
<li>⭐<strong>정의하기 전 현업을 대상으로 주제영역 개념에 관해 설명 필요</strong></li>
</ul>
</li>
</ul>
</li>
<li><p>의견 차이</p>
<ul>
<li>모델러 - 데이터 관점 접근</li>
<li>현업 - 실제 업무의 기능, 흐름 구현<ul>
<li>⭐<strong>다양한 관점에서 생각하는 습관 필요</strong></li>
</ul>
</li>
</ul>
</li>
<li><p>확신 부족</p>
<ul>
<li>주제 영역을 잘 정의했는지 판단하기 어려운 경우<ul>
<li>⭐ <strong>일관된 기준을 작용하여 생각 차이를 좁힌다.</strong></li>
</ul>
</li>
</ul>
</li>
<li><p>오너십</p>
<ul>
<li>이해 불가</li>
</ul>
</li>
</ul>
<h3 id="핵심-엔티티-식별">핵심 엔티티 식별</h3>
<ul>
<li>주제 영역별로 대표성을 갖는 핵심 엔티티를 도출하고 식별함<br>

</li>
</ul>
<h3 id="식별자-및-속성-정의">식별자 및 속성 정의</h3>
<ul>
<li>식별자는 엔티티 개념을 가장 명확하게 표한할 수 있는 속성으로 구성함 (PK)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[핵심 데이터 모델링] - 데이터 모델링이란?]]></title>
            <link>https://velog.io/@_soon/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81-%EC%9D%B4%EB%A1%A0</link>
            <guid>https://velog.io/@_soon/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81-%EC%9D%B4%EB%A1%A0</guid>
            <pubDate>Mon, 13 Mar 2023 07:35:17 GMT</pubDate>
            <description><![CDATA[<h1 id="데이터-모델링이란">데이터 모델링이란?</h1>
<hr>
<blockquote>
</blockquote>
<p>📌 <strong>현실에 있는것 → 프로그래밍화 시키는 과정</strong></p>
<p>데이터 시스템 구조를 사람이 이해할 수 있게 형상화 하는 과정.
사람이 정보로 의미있는 대상을 식별(개념적) ➡️ 기호 등을 통해 추상화하여 표현(논리적) ➡️ DB구축을 위해 구체화(물리적)
why? 현업 인터뷰, 업무 지침서 등 현행 업무를 파악하기 위해서 한다.</p>
<blockquote>
<p>📌 <strong>데이터 모델의 종류</strong></p>
</blockquote>
<ul>
<li>개체관계 모델(ER, Entity-Relationship Model) </li>
<li>관계 모델(Relational Model)</li>
<li>계층 모델(Hierarchical Model)</li>
<li>망 모델(network model)</li>
</ul>
<blockquote>
<p>📌 ** 모델링 순서**
<strong>개념 모델링 ➡️ 논리 모델링 ➡️ 물리 모델링</strong></p>
</blockquote>
<p>흔하게 보이는 영수증을 보게되면 생각보다 많은 정보들이 들어있다.
<code>ex</code> 매장명, 주소, 전화번호, 주문 상품 수량, 금액, 카드사, 카드번호 등등…</p>
<p>영수증의 데이터에서 <em>관리해야할 데이터를 식별하고 모형화하여 하나의 엔티티와 속성들로 표현할 수 있다</em>.
이러한 과정을 개념 모델링이라고도 부른다. <code>개념 모델링은 개념을 파악하고 업무를 파악하는 용도로 사용된다.</code></p>
<p>논리 모델링은 엔티티와 속성이 나누어진 개념 모델링을 업무에서 사용할 수 있게 체계화 하고 구체화하여 데이터 모델로 표현한다.</p>
<p>물리 모델링은 논리 모델링을 업무와 타협하는 단계이다.</p>
<h3 id="er모델-entity-relationship-model">ER모델 (Entity-Relationship Model)</h3>
<p>ER모델은 표현하고자 하는 현실 세계의 업무를 <strong>개체</strong>와 <strong>관계</strong>라는 두 가지 개념으로 표현하는 모델이다.
ER표기법을 사용하여 표현한다. 
ERD : ER에서 사용하는 실체와 관계를 도식화한 것, 이를 알기 쉽게 도형으로 표현한다.</p>
<h3 id="er모델의-질적-특성">ER모델의 질적 특성</h3>
<ul>
<li>완전성(Completeness) : ER모델은 현실 세계의 모든 업무적인 요구사항을 표현하고 있어야 한다.</li>
<li>정확성(Correctness) : ER모델의 개념대로 데이터 모델을 작성해야 한다.  <code>요구사항 확인을 잘해야 한다.</code></li>
<li>최소성(Minimality) : 요구사항의 모든 특성이 ER모델에 한번만 나타나도록 설계해야 한다. <code>중복이 없어야 한다.</code></li>
<li>자명성(Self-explanation) : 요구사항을 쉽게 반영할 수 있도록 유연한 모델을 설계해야한다.</li>
</ul>
<h1 id="er모델-구성요소">ER모델 구성요소</h1>
<hr>
<blockquote>
</blockquote>
<p>📌 엔티티, 관계, 속성, 식별자</p>
<ul>
<li>엔티티(Entity)  <code>클래스와 비슷함</code></li>
<li>관계(Relationship) </li>
<li>속성(Attribute) <code>iv와 비슷함</code></li>
<li>식별자(Identifier) </li>
</ul>
<h2 id="엔티티entity">엔티티(Entity)</h2>
<p>엔티티는 고객, 상품, 직원, 조직, 서비스, 직업처럼 개념적인 것이다. <code>객체지향개념의 클래스와 비슷하다.</code>
엔티티는 <em>반드시 각 인스턴스를 식별할 수 있는 속성이나 관계가 하나 이상 정의되어야 한다</em>.</p>
<ul>
<li>슈퍼타입, 서브타입 엔티티로 확장 가능하다.
<code>ex</code> 고객 (슈퍼타입), 개인 고객, 법인 고객 (서브타입)
<code>Java로 예를 들면 서브타입은 슈퍼타입을 상속받았다.</code>
<img src="https://user-images.githubusercontent.com/103868639/225914432-384a7e79-50b8-48cc-b404-1453613e72a0.png" alt="Entity (2)"></li>
</ul>
<ul>
<li>엔티티의 일반화
여러개의 엔티티를 공통의 성격으로 묶어 하나의 엔티티로 재정의한다.
두개의 하위수준 엔티티를 합쳐 하나의 상위수준으로 바꾸는 상향식 접근방식 </br>
<code>ex</code> 개인고객, 법인고객 ➡️ 고객으로 합침 - join을 하지않아 개발 생산성 증대,
but 속성의 의미가 불분명해  데이터 무결성 문제가 발생 할 수 있음
↘️ 데이터 무결성 문제 : 잘못된 데이터가 들어올 수 있음</li>
</ul>
<blockquote>
<p>💡<strong>DB제약조건 무결성 : PK, FK, Not Null 등등.. (잘못된 데이터가 들어오지 않게하기 위함)</strong></p>
</blockquote>
<ul>
<li><p>엔티티의 특수화
일반화의 반대 개념으로, 하나의 상위수준 엔티티를 둘로 쪼개 두개의 하위수준 엔티티로 나누는 하향식 접근방식</p>
</li>
<li><p>엔티티의 집단화
여러 엔티티가 하나의 엔티티로 취급하는 경우
<code>ex</code> 고객과 상품간의 관계를 단일 엔티티(주문상품)으로 재정의 해 배송과 관계를 맺는다.</p>
</li>
<li><p>엔티티의 다양한 분류
<img src="https://user-images.githubusercontent.com/103868639/225915079-c5c4a988-9335-42ad-be08-3f10e463efb8.png" alt="엔티티분류"></p>
</li>
<li><p>관계에 따른 분류</p>
<ul>
<li>강한 엔티티 : 독립적으로 존재하며, 엔티티 내에서 고유하게 인스턴스를 식별할 수 있다. <code>고객, 상품 등</code></li>
<li>약한 엔티티 : 다른 엔티티에 종속적이며, 자체 식별자를 가질 수 없고, 다른 엔티티의 식별자를 상속받아 사용한다. <code>주문상품은 주문에서 주문번호를 상속받아 식별자로 사용</code></li>
</ul>
</li>
</ul>
</br>

<ul>
<li>형태에 따른 분류<ul>
<li>독립 엔티티 : 사람, 물건, 장소, 개념처럼 원래부터 현실에 존재하는 엔티티 <code>고객, 상품, 창고, 조직</code></li>
<li>업무중심 엔티티 : 업무를 처리하면서 발생하는 데이터 <code>주문, 결제, 배송, 청구</code></li>
<li>종속 엔티티 : 업무중심 엔티티에서 1차 정규화로 분리된 엔티티 <code>주문상품, 주문배송</code></li>
<li>교차 엔티티 : 엔티티 간에 발생하는 트랜잭션에 의해 성성된 엔티티</li>
</ul>
</li>
</ul>
</br>

<ul>
<li>생성 관점에 따른 분류<ul>
<li>핵심 엔티티 : 고객, 상품, 조직처럼 부모 엔티티가 없는 독립적인 엔티티</li>
<li>중요 엔티티 : 핵심 엔티티간의 거래 관계에 의해 생성되는 엔티티, 업무에 핵심이 되는 엔티티
<code>계약은 고객과 상품의 거래 관계에 의해 생성되며, 고객과 상품을 부모로 갖는다.</code></li>
<li>행위 엔티티 : 실제 업무 행위에 의해 지속해서 발생하는 거래 행위에 대한 엔티티</li>
</ul>
</li>
</ul>
</br>

<ul>
<li>유무형에 따른 분류<ul>
<li>실체 엔티티 : 고객, 상품과 같이 눈으로 볼 수 있는 물리적인 형태를 가지는 엔티티</li>
<li>비실체 엔티티<ul>
<li>개념 엔티티 : 조직, 보험상품, 서비스 등 형태는 없지만 개념적으로 존재하는 엔티티</li>
<li>사건 엔티티 : 계약, 주문, 결제 등 업무 행위와 관련된 엔티티</li>
</ul>
</li>
</ul>
</li>
</ul>
<blockquote>
</blockquote>
<p>📌 <strong>ER 모델의 구성요소</strong></p>
<ul>
<li><strong>엔티티</strong></li>
<li><strong>관계 - 관계수, 선택성, 식별성, 관계명</strong></li>
<li><strong>속성</strong></li>
</ul>
<h2 id="관계relationship">관계(Relationship)</h2>
<hr>
<p>엔티티와 엔티티 간에 존재하는 업무 규칙을 정의하고 엔티티 간에 어떤 관계가 이루어질 수 있는지 표현한다.</p>
<ul>
<li>구성요소</li>
</ul>
<ol>
<li>관계수(cardinality)</li>
<li>선택성(optionality)</li>
<li>식별성(Identifier Inheritance)</li>
<li>관계명</li>
</ol>
<h3 id="관계수-cardinality">관계수 (Cardinality)</h3>
<p>엔티티간의 대응되는 최대 인스턴스 수
상대 엔티티 쪽에 까마귀 발 (Crow’s Foot)로 표시한다.
<code>반드시 양쪽다 서로의 관계를 확인해야함</code></p>
<ul>
<li><p>1 : 1 
: 엔티티 하나가 다른 엔티티 하나와 관계를 가지는 경우다.
<code>ex</code> 직원과 인턴과정, 
중요한 문서가 있을 때, 테이블을 쪼개 보여줄 수 있는 부분과 보안상 가려야하는 부분 1 : 1로 join해서 관계를 맺는다.
<img src="https://user-images.githubusercontent.com/103868639/225916277-e526c273-e77d-4bc9-aaa4-255c0c78ab65.png" alt="관계수1"></p>
</br>
</li>
<li><p>1 : M 
: 엔티티 하나가 다른 엔티티 여러 개와 관계
<code>ex</code> 부서와 직원
<img src="https://user-images.githubusercontent.com/103868639/225916618-93af623d-0259-4f9d-b37f-3f19654acb10.png" alt="관계수2"></p>
</br>
</li>
<li><p>M : N 
: A엔티티가 B엔티티 개체 여러개와 관련있고, B엔티티 개체 하나는 A엔티티 개체 여러개와 관계가 있다. <code>ex</code> 학생과 수강과목
<img src="https://user-images.githubusercontent.com/103868639/225917081-ed0ec445-fb8f-4d71-b3e0-6db344e2a99b.png" alt="관계수3"></p>
</br>

</li>
</ul>
<h3 id="선택성-optionality">선택성 (Optionality)</h3>
<p>필수냐 선택이냐 로 구분이 가능하다.
엔티티 인스턴스에 대한 상대 엔티티 인스턴스 존재 유무를 나타낸다.</p>
<ul>
<li><p>필수 — 필수
: A 엔티티의 인스턴스에 대해 B 엔티티 인스턴스가 반드시 존재해야 하고, 
B 엔티티의 인스턴스에 대해 A 엔티티의 인스턴스도 반드시 존재해야 한다.
<code>ex</code>상품을 선택하지 않고 주문을 하는 경우는 없으므로, 주문은 주문상품이 반드시 존재해야 한다.
<img src="https://user-images.githubusercontent.com/103868639/225917492-fb59c52e-6c20-4368-9ff7-eaca405310d0.png" alt="선택성1"></p>
</br>
</li>
<li><p>필수 — 선택
: A 엔티티의 인스턴스에 대해 B 엔티티 인스턴스가 존재하지 않아도 되고, 
B 엔티티 인스턴스에 대해 A 엔티티 인스턴스는 반드시 존재해야 한다. 
<code>ex</code>주문하지 않은 고객은 있을 수 있으나, 모든 주문은 반드시 주문한 고객이 있어야 한다.
<img src="https://user-images.githubusercontent.com/103868639/225917653-1921baa2-2082-43f4-b94a-fa851f7ab91e.png" alt="선택성2"></p>
</br>
</li>
<li><p>선택  — 선택 
: A 엔티티 인스턴스에 대해 B 엔티티 인스턴스가 존재하지 않아도 되고, 
B 엔티티 인스턴스에 대해 A엔티티 인스턴스도 존재하지 않아도 된다. 
<code>ex</code>사원은 소개사원으로 등록된 계좌가 존재하지 않을 수 있고, 고객이 펀드상품에 가입할 때 소개 사원을 지정하지 않아도 되므로 계좌는 소개 사원이 존재하지 않을 수 있다.
<img src="https://user-images.githubusercontent.com/103868639/225917843-417cf344-137c-4f47-a874-e04f05335fc8.png" alt="선택성3"></p>
</li>
</ul>
</br>


<h3 id="식별자-상속-identifier-inheritance">식별자 상속 (Identifier Inheritance)</h3>
<p>식별자 상속은 식별관계와 비식별 관계로 구분할 수 있다. </p>
<p>식별 관계는 참조되는 상위 엔티티 식별자가 참조하는 하위 엔티티 식별자로 상속되는 경우를 말한다.
<code>ex) 고객주소의 고객번호(FK)가 주문 엔티티에서 고객번호(FK)로 상속된다.</code></p>
<p>비식별 관계는 식별자가 아닌 일반 속성으로 상속되는 관계를 말한다.
*️⃣ 다른 테이블의 PK이자 내 테이블의 FK, FK인 동시에 PK인것</p>
<blockquote>
</blockquote>
<p>📌 <strong>ER 모델의 구성요소</strong></p>
<ul>
<li><strong>엔티티</strong></li>
<li><strong>관계 - 관계수, 선택성, 식별성, 관계명</strong></li>
<li><strong>속성</strong></li>
</ul>
</br>

<h2 id="속성">속성</h2>
<hr>
<p>데이터를 표현하는 가장 작은 단위, 하나의 엔티티는 두개 이상의 속성을 가진다.</p>
<ul>
<li><p>속성명 : 실체의 특성을 규정하는 속성 명칭</p>
</li>
<li><p>식별자 여부 : 해당 속성이 엔티티 식별자에 해당하는지 표시</p>
</li>
<li><p>옵셔널리티 : 엔티티에 인스턴스가 발생할 때 값을 가져야 하는지에 대한 구분.</p>
</li>
<li><p>도메인 : 속성이 허용하는 데이터 형식과 범위를 가지고 있다.</p>
</li>
</ul>
</br>

<h2 id="식별자">식별자</h2>
<hr>
<p>엔티티에서 인스턴스를 개별적으로 식별할 수 있는 속성들이다.</p>
<ul>
<li>특징 : 유일성, 최소성, 불변성, 존재성(Not null)</li>
</ul>
<blockquote>
</blockquote>
<p>📌 <strong>관계형 데이터 모델 (RDB)</strong></p>
<ul>
<li><strong>Key</strong></li>
<li><strong>제약조건</strong></li>
<li><strong>함수종속</strong></li>
<li><strong>정규화</strong></li>
</ul>
</br>

<h1 id="관계형-데이터-모델이론">관계형 데이터 모델이론</h1>
<hr>
<p>데이터를 2차원 테이블(표) 형식으로 정의하고 표현한 모델이다.
테이블 == 릴레이션
릴레이션은 스키마<code>헤더</code> 와 실제 값은 인스턴스<code>본문</code>로 구성된다.
<img src="https://user-images.githubusercontent.com/103868639/225919488-9a1d8098-e393-40dc-9600-0f2120f15707.png" alt="관계형데이터모델이론"></p>
<ul>
<li><p>스키마 : 구조</p>
<ul>
<li>릴레이션명<ul>
<li>표를 구성하는 각 열을 의미</li>
</ul>
</li>
<li>Attribute<ul>
<li>더는 쪼갤 수 없는 원자 값</li>
<li>값이 서로 다르며 유일해야 함</li>
</ul>
</li>
</ul>
</li>
<li><p>인스턴스 : 실제 값</p>
<ul>
<li>Tuples<ul>
<li>릴레이션의 각 행</li>
<li>중복된 튜플 허용 X</li>
<li>값은 동일해도 OK</li>
</ul>
</li>
</ul>
</li>
</ul>
</br>

<h2 id="key">Key</h2>
<hr>
<h3 id="슈퍼-키-super-key">슈퍼 키 (Super Key)</h3>
<p>: 튜플을 고유하게 식별할 수 있는 속성 집합</p>
<ul>
<li>릴레이션은 한 개 이상의 슈퍼 키를 가질 수 있음</li>
<li>슈퍼 키 값은 모든 튜플에서 유일해야 함
<code>ex</code> 사원번호 + 사원명 이 두개가 고유 값.  슈퍼키임 </li>
</ul>
<h3 id="후보-키-candidate-key">후보 키 (Candidate Key)</h3>
<p>: 튜플을 고유하게 식별 할 수 있는 최소한의 속성 집합</p>
<ul>
<li>모든 후보 키는 슈퍼 키지만, 모든 슈퍼 키가 후보 키는 아님 (슈퍼 키 가 후보 키 포함)</li>
</ul>
<h3 id="기본-키-primary-key">기본 키 (Primary Key)</h3>
<p>: 하나 이상의 후보 키 중에서 선택된 단 한개의 키</p>
<ul>
<li>유일성, 최소성을 가짐</li>
<li>NULL 값 불가능</li>
</ul>
<h3 id="대체-키-alternate-key">대체 키 (Alternate Key)</h3>
<p>: 후보 키 중에서 기본 키가 아닌 후보 키</p>
<h3 id="외래-키-foreign-key">외래 키 (Foreign Key)</h3>
<p>: 어떤 릴레이션의 어트리뷰트 값이 →  다른 릴레이션에 속한 어트리뷰트의 기본 키를 참조하는 경우</p>
<ul>
<li>NULL값 가능</li>
<li>중복된 튜플 OK</li>
</ul>
</br>

<p><strong>관계도</strong>
<img src="https://user-images.githubusercontent.com/103868639/225919704-b468e957-3682-4361-ac02-eb3b56f0ffdd.png" alt="관계도">
</br></p>
<h2 id="제약조건">제약조건</h2>
<hr>
<blockquote>
</blockquote>
<p>📌 <strong>목적 : DB에 오염된 데이터가 들어오는걸 막기 위함</strong></p>
<blockquote>
</blockquote>
<p>📌 <strong>PK, FK, Not Null, Unique, Domain &lt;-외워</strong></p>
<ul>
<li>키 제약조건 (PK)<ul>
<li>필드에 Unique와 Not Null 특징을 가짐</li>
</ul>
</li>
<li>실체무결성 (Not Null)<ul>
<li>필드에 NULL값을 저장할 수 없게 함</li>
</ul>
</li>
<li>영역무결성 (Domain)<ul>
<li>정의된 영역 내의 값만 받음</li>
</ul>
</li>
<li>참조무결성 (FK)<ul>
<li>외래키는 부모 릴레이션의 기본 키 값만 가능</li>
</ul>
</li>
<li>Unique<ul>
<li>중복값 X</li>
</ul>
</li>
</ul>
<br>

<h2 id="함수종속">함수종속</h2>
<hr>
<blockquote>
</blockquote>
<p>📌 <strong>관계형 DB설계 시, 정규화 과정에서 이 개념이 중요하게 사용된다.</strong></p>
<p><code>ex</code> “고객” 테이블이 { 고객번호, 고객명, 생년월일, 전화번호, 주소 }  속성을 가지고 있을 떄
고객번호 컬럼에 다른 컬럼들이 함수적으로 종속된다.
고객번호 → (고객명, 생년월일, 전화번호, 주소)</p>
<p><code>짧게 요약</code>
테이블의 특정 컬럼 A의 값을 알게되면, 다른 컬럼 B의 값을 알 수 있을 때
컬럼 B는 A에 함수적 종속성이 있다.
고객번호를 알면 고객명을 알 수 있으며, “고객명은 고객번호에 함수적 종속성이 있다.”</p>
</br>

<h2 id="정규화">정규화</h2>
<hr>
<blockquote>
</blockquote>
<p>📌 <strong>정규화 : 단계별로 테이블 쪼개기</strong></p>
<p>중복을 없애기 위해 더 작은 단위의 테이블로 설계하는 과정</p>
<h3 id="장점">장점</h3>
<ol>
<li>데이터 입력, 수정, 삭제 과정에서 발생하는 이상 현상 최소화</li>
<li>데이터 구조 변경 시 유연성이 증가한다.</li>
<li>작은 단위로 세분화 할 경우 재활용성이 높아진다.</li>
<li>중복 최소화, 수행속도 향상</li>
</ol>
<br>

<h3 id="주의사항">주의사항</h3>
<p>: 성능의 저하가 심하면 어쩔 수 없이 다시 join한다. (역정규화)</p>
<br>

<h3 id="제1정규형">제1정규형</h3>
<p>: 중복되는 값이나, 중복열이 있을 경우 정규화 진행</p>
<ul>
<li>같은 개념의 컬럼이 여러개, 다중 값을 가지는 경우 별도의 테이블로 분리함</li>
<li>엑셀에 데이터를 다 입력해서 중복값 찾아 정규화하기</li>
<li>분리된 테이블은 원 테이블의 기본키를 FK로 사용, 나머지 중 유일하게 식별 가능한 컬럼을 기본키로 추가.
<img src="https://user-images.githubusercontent.com/103868639/225919263-58f72434-4295-4f6f-bfb0-e2586d047f93.png" alt="제1정규형"><br>

</li>
</ul>
<h3 id="제2정규형">제2정규형</h3>
<p>: 제1정규형을 만족하고, 키가 아닌 어트리뷰트는 후보키 전체에 종속되어야 한다.</p>
<ul>
<li>쉽게 “묶을 수 있는 걸 따로 묶어서 뺀다”
<img src="https://user-images.githubusercontent.com/103868639/225918926-c35dc54e-a8dc-47bd-a02c-669d9d333e7a.png" alt="제2정규형"><br>

</li>
</ul>
<h3 id="제3정규형">제3정규형</h3>
<p>: 제2정규형을 만족하고, 키가 아닌 어트리뷰트들 간에는 서로 종속적인 관계가 없어야 한다.</p>
<ul>
<li>키가 아닌 어트리뷰트가 다른 어트리뷰트에 포함되면 따로 테이블을 분리해야함
<img src="https://user-images.githubusercontent.com/103868639/225919898-b958b795-2012-460d-9844-1567699bc4a3.png" alt="제3정규형"><br>

</li>
</ul>
<h3 id="연결함정">연결함정</h3>
<p>: 정규화 과정에서 무손실 분해의 원칙이 지켜지지 않아,</p>
<p>원래 있던 관계성을 잃어 버리는 현상</p>
<ul>
<li><p>부채꼴 함정</p>
<ul>
<li><p>관계가 모호할 때가 있음</p>
<p><code>ex</code> 
  회사에서 물품을 구매한 공급사를 관리하고, 여러 상품을 구매한다.
  각각, 관계를 표현했을 때 물품이 어느 공급사에서 구매한 것인지 알 수없는 현상이 발생
  <img src="https://user-images.githubusercontent.com/103868639/225920315-7c171ea3-56ed-467f-8887-24d6612add99.png" alt="부채꼴함정"></p>
<p><code>해결방안</code>
  회사 → 공급사, 공급사 → 물품 간의 관계 변환
  <img src="https://user-images.githubusercontent.com/103868639/225920529-cbcb667b-7ad5-410e-a2ad-48a9be8be9e3.png" alt="부채꼴함정해결방안"></p>
</li>
</ul>
</li>
<li><p>균열 함정</p>
<ul>
<li><p>일부 엔티티와 엔티티 사이의 관계가 존재하지 않을 때 발생</p>
<p><code>ex</code>
  공급사를 통하지 않고 직접 물품을 구매할 수는 없을까?</p>
<p><code>해결방안</code>
  이럴 경우 회사 → 물품 관계를 맺어줘야 함
  <img src="https://user-images.githubusercontent.com/103868639/225920773-9b52aa06-5469-4a5a-af9f-dca853ef7a40.png" alt="균열함정"></p>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>