<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>yeunever.log</title>
        <link>https://velog.io/</link>
        <description>소프트웨어공학 / 정보통신공학</description>
        <lastBuildDate>Sun, 05 Jan 2025 15:20:27 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>yeunever.log</title>
            <url>https://velog.velcdn.com/images/yeunever_/profile/96786c95-9078-4d26-adcb-0c6b653383d6/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. yeunever.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/yeunever_" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[No supported authentication methods available (server sent: publickey) 해결하기]]></title>
            <link>https://velog.io/@yeunever_/No-supported-authentication-methods-available-server-sent-publickey-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@yeunever_/No-supported-authentication-methods-available-server-sent-publickey-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 05 Jan 2025 15:20:27 GMT</pubDate>
            <description><![CDATA[<h1 id="no-supported-authentication-methods-available-server-sent-publickey-해결하기"><strong>No supported authentication methods available (server sent: publickey) 해결하기</strong></h1>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/0391002d-0579-4b92-85b5-c985765dec48/image.png" alt=""></p>
<p>다음 오류를 해결하기 전에, window 사용자가 ec2 서버에 접속할 수 있는 방법 2가지를 먼저 안내한 후에 마주한 트러블슈팅을 정리할 예정이다.</p>
<p><strong>키페어 생성 시</strong></p>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/e10ee92c-2f83-49e1-b021-afd5f152458c/image.png" alt=""></p>
<p>키페어를 생성할 때 보통, Mac 사용자의 경우 .pem 파일 형식으로 키페어를 생성하고, window의 경우 ppk 파일 형식으로 사용한다.</p>
<p>하지만, 함께 협업하는 서버개발자의 노트북 운영체제가 다르다면 어떻게 해야할까 ?</p>
<p>이 경우, pem 파일 형식으로 생성하는 것을 추천한다.</p>
<p>window 사용자도 ssh 를 통해 접속할 수 있기 때문이다.</p>
<h3 id="방법-1--pem-파일로-접속">방법 1 ) pem 파일로 접속</h3>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/b9df42c6-7599-43de-8b08-c3b888cf3c7a/image.png" alt=""></p>
<p><strong>연결</strong></p>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/ceb2e188-4620-4ec2-bdb6-906a67b1e1c6/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/a54bcfa0-1ec0-4432-b53d-1a06617242c8/image.png" alt=""></p>
<p>예시 내용 복사해서 붙여 넣으면</p>
<p>잘 접속되는 것을 확인할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/1f7409c0-0c92-4c13-a462-55151dabf7ce/image.png" alt=""></p>
<h3 id="방법-2-putty-사용하기">방법 2) PuTTY 사용하기</h3>
<p>window 개발자가 PuTTY를 사용하여 서버에 접속하는 방식이 있다.</p>
<p>해당 방식에서 오류와 만나게 되었다.</p>
<h1 id="❓-문제-발생">❓ 문제 발생</h1>
<p>PuTTY로 EC2 인스턴스에 접속을 시도하던 도중 <code>No supported authentication methods available (server sent: publickey)</code> 에러 발생</p>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/38318da3-06f4-4a08-aa4a-ab751786e0cc/image.png" alt=""></p>
<p>PuTTYgen으로 private key를 생성할 때, <code>변환</code> &gt; <code>키 불러오기</code> &gt; <code>.pem 파일 선택</code> &gt; <code>생성(Generate)</code> &gt; <code>개인키 저장(save private key)</code> 순서대로 진행했었는데 <code>생성</code> 과정은 필요가 없었다.</p>
<p><code>.pem 파일 선택</code>후 바로 <code>개인키 저장</code>을 하면 되는 것이다 !!</p>
<h3 id="✅-올바른-대처방법"><strong>✅</strong> 올바른 대처방법</h3>
<h3 id="puttygen으로-변환--키-불러오기--pem-파일-선택--개인키-저장save-private-key-순서대로-private-key를-생성">PuTTYgen으로 <code>변환</code> &gt; <code>키 불러오기</code> &gt; <code>.pem 파일 선택</code> &gt; <code>개인키 저장(save private key)</code> 순서대로 private key를 생성</h3>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/c445dcad-9e99-4c53-a87b-e0ca9969ce39/image.png" alt=""></p>
<p>load private key에 들어가서 원하는 pem 파일 선택 후 load</p>
<p>save private key 클릭</p>
<h3 id="2-putty에서-host-name-및-port-번호-지정">2. PuTTY에서 Host Name 및 Port 번호 지정</h3>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/130c5f30-ba8c-4d19-aa4b-b202da5b46ac/image.png" alt=""></p>
<p><code>Connection</code> &gt; <code>SSH</code> &gt; <code>Auth</code> &gt; <code>Credentials</code> &gt; <code>private key file for authentication</code>에 생성한 private-key.ppk 파일 불러오기 &gt; 우측 하단의 <code>Open</code>클릭</p>
<h3 id="3-서버-접속하기">3. 서버 접속하기</h3>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/8d563ff2-96e1-4e63-b3f6-79d9f3a3c8df/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SSH 접속 오류 \[ WARNING : REMOTE HOST IDENTIFICATION HAS CHANGED \]]]></title>
            <link>https://velog.io/@yeunever_/SSH-%EC%A0%91%EC%86%8D-%EC%98%A4%EB%A5%98-WARNING-REMOTE-HOST-IDENTIFICATION-HAS-CHANGED</link>
            <guid>https://velog.io/@yeunever_/SSH-%EC%A0%91%EC%86%8D-%EC%98%A4%EB%A5%98-WARNING-REMOTE-HOST-IDENTIFICATION-HAS-CHANGED</guid>
            <pubDate>Sun, 05 Jan 2025 12:46:50 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yeunever_/post/5a3f4472-879f-4295-9026-a096c4b84872/image.png" alt=""></p>
<p>서버에 접속하려고 했더니 다음과 같은 오류와 만났다.</p>
<p>이런 오류 심심찮게 마주하는데 항상 같은 오류를 만나면서 매번 붕어가 되어 다시 해결하는 내가 지겨워서 한 번에 정리하고자 정리하였다.</p>
<p>이 경고 메시지는 SSH를 통해 EC2 인스턴스에 접속하려고 할 때, <strong>원격 호스트의 SSH 키가 변경되었거나 충돌이 발생</strong>했을 때 나타나는 메시지다.</p>
<p>대략 내용은 원격 호스트 식별 정보가 변경되었다는 것이다. 기존에 등록되어있던 RSA key가 다르다. 누군가 기존 접속 정보를 바꾸어 정보를 가로채는 man-in-the-middle attack 에 발생에 유의해라. 해당 경고를 제거하려면 /root/.ssh/known_hosts 올바른 Host Key를 추가해라.</p>
<p><strong>SSH knwon_hosts 란?</strong></p>
<p>명칭과도 같이 알려진 호스트 정보를 말한다. 쉽게 기존에 자신이 ssh를 통해 접속 했다면, 해당 서버의 key를 받아 로컬에 저장하고 있는 구조이다.</p>
<p>따라서 해당 known_hosts 파일을 열어보면 아래와 같이 기존에 접속했던 사이트들의 ssh-rsa 키 값들이 정리가되었는걸 볼 수 있다.</p>
<h3 id="원인"><strong>원인</strong></h3>
<ol>
<li><strong>인스턴스 재생성</strong>: 기존 인스턴스를 삭제하고 동일한 IP를 가진 새 인스턴스를 시작한 경우.</li>
<li><strong>호스트 키 변경</strong>: EC2 인스턴스의 호스트 키가 재생성되었거나 SSH 설정이 변경된 경우.</li>
<li><strong>IP 주소 재사용</strong>: 동일한 IP 주소를 다른 인스턴스에서 사용한 경우.</li>
<li><strong>파일 경로 문제</strong>: BakeryServer.pem 파일이 잘못된 경로에 있거나 누락된 경우.</li>
</ol>
<h3 id="해결-방법"><strong>해결 방법</strong></h3>
<h3 id="1-host-key-문제-해결"><strong>1. Host Key 문제 해결</strong></h3>
<ul>
<li>SSH에서 known_hosts 파일에 저장된 기존 호스트 키와 새 키가 충돌하여 발생합니다. 문제를 해결하려면 known_hosts 파일에서 관련 엔트리를 제거해야 합니다.</li>
</ul>
<ol>
<li><strong>known_hosts 파일 경로로 이동</strong>:<ul>
<li>Windows에서: C:\\Users\\LG\\.ssh\\known_hosts</li>
<li>Mac/Linux에서: ~/.ssh/known_hosts</li>
</ul>
</li>
<li><strong>관련된 엔트리 삭제</strong>:<ul>
<li>문제 메시지에 따르면, 문제가 있는 엔트리는 <strong>라인 22</strong>에 있습니다. 이 라인을 삭제합니다.</li>
<li>직접 삭제하거나 아래 명령어를 사용:</li>
<li>ssh-keygen -R ec2-(IP주소).ap-northeast-2.compute.amazonaws.com</li>
<li>이 명령은 해당 호스트와 관련된 키를 known_hosts에서 삭제합니다.</li>
</ul>
</li>
<li><strong>SSH 재접속</strong>:<ul>
<li>삭제 후 다시 접속을 시도합니다. 새 호스트 키를 확인하라는 메시지가 표시되며, 이를 수락하면 연결됩니다.</li>
</ul>
</li>
</ol>
<hr>
<h3 id="2-키-파일pem-경로-문제-해결"><strong>2. 키 파일(.pem) 경로 문제 해결</strong></h3>
<p>메시지에 나오는 BakeryServer.pem 파일이 없거나 경로가 잘못된 경우 이를 수정해야 합니다.</p>
<ol>
<li><strong>키 파일 경로 확인</strong>:<ul>
<li>키 파일이 올바른 경로에 있는지 확인합니다.</li>
<li>예: C:\\Users\\LG\\Documents\\BakeryServer.pem 또는 다른 경로.</li>
</ul>
</li>
<li><strong>경로를 명시적으로 지정</strong>: SSH 명령에서 i 옵션으로 정확한 경로를 지정합니다:</li>
<li>ssh -i &quot;C:/Users/LG/Documents/BakeryServer.pem&quot; ubuntu@ec2-(IP주소).ap-northeast-2.compute.amazonaws.com</li>
<li><strong>키 파일 권한 설정</strong>:<ul>
<li>SSH 키 파일은 적절한 권한으로 설정되어야 합니다.</li>
<li>Windows:<ul>
<li>오른쪽 클릭 → &quot;속성&quot; → &quot;보안&quot; → 권한 제한.</li>
</ul>
</li>
<li>Linux/Mac:</li>
<li>chmod 400 BakeryServer.pem</li>
</ul>
</li>
</ol>
<hr>
<h3 id="3-man-in-the-middle-경고-무시-비추천"><strong>3. Man-in-the-Middle 경고 무시 (비추천)</strong></h3>
<p>보안 경고를 무시하고 계속하려면 다음 옵션을 사용할 수 있습니다. 하지만 <strong>보안 위험</strong>이 있으므로 실제 문제를 해결한 후 사용하는 것이 좋습니다.</p>
<pre><code>ssh -o StrictHostKeyChecking=no -i &quot;BakeryServer.pem&quot; ubuntu@ec2-(IP주소).ap-northeast-2.compute.amazonaws.com</code></pre><hr>
<h3 id="결론"><strong>결론</strong></h3>
<ol>
<li>known_hosts 파일에서 충돌을 일으키는 기존 호스트 키를 삭제하세요.</li>
<li>.pem 파일이 올바른 경로에 있는지 확인하고, 명령에 경로를 명시하세요.</li>
<li>SSH를 다시 시도하면서 새 키를 저장하도록 합니다.</li>
</ol>
<h3 id="위-3가지-방법-중-우리는-known_hosts-파일에서-충돌을-일으키고-있었으므로-1번-방식을-선택하였다">위 3가지 방법 중 우리는 known_hosts 파일에서 충돌을 일으키고 있었으므로, 1번 방식을 선택하였다.</h3>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/6f62991a-c7e9-498b-b784-abe0456ca487/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/b4637594-890c-4537-baef-86517c0fa2e6/image.png" alt=""></p>
<p>충돌되는 파일을 수정한 것을 확인할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/05e95cd1-8890-4d42-b8e0-34fe325ed57e/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Switch와 RESTful ]]></title>
            <link>https://velog.io/@yeunever_/Switch%EC%99%80-RESTful</link>
            <guid>https://velog.io/@yeunever_/Switch%EC%99%80-RESTful</guid>
            <pubDate>Wed, 01 Jan 2025 04:50:48 GMT</pubDate>
            <description><![CDATA[<h2 id="todo">ToDo</h2>
<ul>
<li><input checked="" disabled="" type="checkbox"> Switch?</li>
<li><input checked="" disabled="" type="checkbox"> What is RESTful?</li>
</ul>
<h3 id="switch란-">Switch란 ?</h3>
<p>스위치는 네트워크 장비로, 다양한 기기들을 서로 연결하여 데이터 패킷을 교환 하고, 네트워크 성능을 최적화 하는 역할을 합니다. 스위치는 OSI 2계층(데이터 링크 계층)에서 작동하며, MAC 주소를 기반으로 장치 간의 데이터 흐름을 제어합니다.</p>
<h3 id="osi-7계층의-주요-기능-요약">OSI 7계층의 주요 기능 요약</h3>
<p><img src="https://github.com/user-attachments/assets/58a1d82c-e69c-42ee-8cbb-deb275624c91" alt="image"></p>
<ul>
<li>응용층(L7): 네트워크 자원에 대한 접근 허용</li>
<li>표현층(L6) : 변환, 암/복호화, 압축/압축해제</li>
<li>세션층(L5) : 세션 설정, 세션 관리, 세션 종료</li>
<li>전송층(L4) : 신뢰할 수 있는 종단-대-종단 메시지(message) 전달과 오류 복구 제공</li>
<li>네트워크층(L3) : 네트워크 간 상호 연결을 통하여 발신지에서 목적지까지 패킷을 전달</li>
<li>데이터링크층(L2) : 비트들을 프레임으로 만들어 노드-대-노드 전달</li>
<li>물리층(L1) : 비트들을 전송매체를 통하여 전달하기 위한 기계적, 전기적 규격 제공</li>
</ul>
<h3 id="🔎-tcpip-프로토콜-그룹과-osi모델-비교">🔎 TCP/IP 프로토콜 그룹과 OSI모델 비교</h3>
<p><img src="https://github.com/user-attachments/assets/101d147c-b15f-4954-a0b6-513362fa23b9" alt="image"></p>
<ol>
<li>물리층과 데이터 링크층
특정 프로토콜을 지원하지 않고 기존의 모든 표준과 기술적인 프로토콜 지원</li>
<li>네트워크층
인터넷 프로토콜(IP) : host-to-host protocol
주소 변환 프로토콜(ARP)
인터넷 제어 메시지 프로토콜(ICMP)
인터넷 그룹 메시지 프로토콜(IGMP)</li>
<li>전송층
사용자 데이터그램 프로토콜(UDP)
전송 제어 프로토콜(TCP)
스트림 제어 전송 프로토콜(SCTP)</li>
<li>응용층
OSI 모델의 세션, 표현, 응용층을 합한 것</li>
</ol>
<h3 id="🔎-l1--l7-스위치-요약">🔎 L1 ~ L7 스위치 요약</h3>
<p><img src="https://github.com/user-attachments/assets/5a1fc58d-3527-4406-889f-06b1369ff248" alt="image"></p>
<p>☑️ <strong>L1 스위치 (허브, 더미 허브)</strong></p>
<p>가장 하위계층인 물리계층에서 작동하는 것으로 허브는 자신에게 꽃혀있는 모든 장비에게 데이터를 전부 전달한다.</p>
<p>☑️ <strong>L2 스위치 (스위칭 허브)</strong></p>
<p>데이터 링크 계층에서 작동하며, 자신에게 꽃혀있는 모든 장비에게 데이터를 전달하는 허브와 달리 각 장비의 MAC 주소를 내부적으로 저장하고 있기 때문에, 들어온 패킷의 MAC 주소를 읽어 해당하는 장비를 찾아 전달해주는 장비를 뜻한다.</p>
<p>☑️ <strong>L3 스위치 (라우터, 공유기)</strong></p>
<p>L3 스위치는 MAC 주소 뿐만 아니라 IP주소까지 알고 있다.
L3 스위치는 L2 스위치에 라우팅 기능이 추가된 장비로 고성능 하드웨어를 기초로 한다.</p>
<p>☑️ <strong>L4 스위치</strong></p>
<p>여러 대의 서버를 한 대처럼 묶을 수 있는 부하 분산(로드 밸런싱) 기능을 제공한다.
프로토콜을 기반으로 하여 애플리케이션 별로 우선순위를 두어 스위칭한다.
즉, L4 스위치는 IP주소 뿐만 아니라 포트주소도 참고한다.</p>
<p>☑️ <strong>L7 (L5,L6 스위치)</strong></p>
<p>보통 L7 스위치가 L5, L6의 기능까지 함께한다.
계층 HTTP의 URL, FTP 쿠키 정보 및 바이러스 패턴을 분석하여 보안에 더 유리하고 정교한 로드 밸런싱이 가능하다.
따라서 L7 스위치를 보안 스위치라고 부르기도 한다. (데이터 분석을 통해 DDoS 공격을 방어하고 패킷 패터링 등의 기능도 제공하기 때문)</p>
<h3 id="🔎-loadbalancing로드-밸런싱-">🔎 <strong>LoadBalancing(로드 밸런싱) ?</strong></h3>
<p>컴퓨터 네트워크 상으로 들어오는 트래픽이 하나의 서버에 집중되지 않도록 서버의 기능을 분산 구성하고, 이를 통해 컴퓨터 자원을 나누는 일을 말한다.</p>
<p>로드밸런싱의 이점 : 애플리케이션 서버와 방문자 또는 클라이언트 간의 인터넷 트래픽을 지시하고 제어하기 때문에 애플리케이션의 가용성, 확장성, 보안 및 성능이 향상된다.</p>
<h3 id="❓-l4-switch-l7-switch-가-무엇인지-조사해보세요">❓ L4 Switch, L7 Switch 가 무엇인지 조사해보세요.</h3>
<p>✅ <strong>L4 스위치</strong></p>
<ul>
<li>역할 : 전송층에서 작동하며 IP 주소와 TCP/UDP 포트 정보를 사용하여 네트워크 트래픽을 관리하고 분배한다.클라이언트 요청을 여러 서버에 분산하여 서버의 부하를 줄인다.</li>
<li>알 수 있는 정보 : IP 주소, TCP나 UDP 포트번호</li>
<li>비용 : L4 스위치는 비교적 저렴한 편. L7 스위치에 비해 단순한 기능을 수행하기 때문</li>
</ul>
<p>✅ <strong>L7 Switch</strong></p>
<ul>
<li>역할 : 응용층에서 작동하며 애플리케이션 레벨의 정보를 분석하여 트래픽을 관리, 트래픽을 처리할 때 HTTP, HTTPS, FTP 등의 프로토콜 정보를 분석하여 트래픽을 더 세분화하고 최적화함</li>
<li>알 수 있는 정보 : 쿠키 및 세션 정보와 같은 애플리케이션 레벨의 데이터
HTTP/HTTPS 요청의 URL, 메소드(GET, POST, PATCH, DELETE), 헤더 정보</li>
<li>비용 :  L7 스위치는 L4 스위치보다 비쌈( 애플레케이션 레벨의 복잡한 데이터 분석과 보안 기능을 제공하기 때문에 고성능 하드웨어가 필요하기 때문) SSL/TLS 암호화 해제 및 복호화 기능 등 고급 기능을 처리할 수 있어 가격이 높음.</li>
</ul>
<p><strong>요약하자면 , 요청의 내용을 얼마나 깊이 분석하느냐 !!의 차이</strong>
L4 스위치의 경우 3 ~ 4계층에 속하는 IP 주소 및 TCP/UDP Port 정보를 보고 로드밸런싱하지만, L7 스위치의 경우 3 ~ 7계층에 속하는 IP 주소 및 TCP/UDP Port 정보, 패킷 내용까지 모두 보고 로드밸런싱 해주는 장비이다.</p>
<hr>
<h2 id="what-is-restful">What is RESTful?</h2>
<h3 id="rest란-"><strong>REST란 ?</strong></h3>
<p>REST (Representational State Transfer)는 웹 서비스 설계 아키텍처의 하나로, 자원(Resource)을 정의하고 이를 HTTP 프로토콜을 통해 상태를 주고 받는 방식이다. 즉, 클라이언트와 서버 간의 상호작용을 규정하며, 웹의 기본 원칙과 패턴을 따르는 서비스 설계 방법론이다.</p>
<p>☑️<strong>자원(Resource)</strong>
자원은 웹 상에서 식별할 수 있는 모든 것(ex. 사용자, 게시물, 댓글, 상품)</p>
<p>☑️ <strong>표현(Representation)</strong>
자원의 표현은 자원이 전송될 때, 그 자원의 상태를 어떻게 표현하는지에 대한 것 (자원의 상태를 클라이언트와 서버 간에 교환하는 것이 핵심)
일반적으로 JSON이나 XML 형태로 전송</p>
<p>☑️<strong>무상태성</strong>
서버가 클라이언트의 상태를 저장하지 않으며, 각 요청은 독립적이라는 의미
클라이언트는 요청 시 필요한 모든 정보를 포함하여 서버에 보내야 하며, 서버는 요청을 처리하고 필요한 응답을 반환</p>
<p>☑️<strong>계층 구조</strong> 
REST 아키텍처는 계층적인 구조를 지향함
클라이언트는 서버와의 직접적인 통신 외에도, 프록시나 게이트웨이 같은 중간 계층을 통과하여 서버와 상호작용할 수 있음.</p>
<h3 id="💬-내가-클라이언트의-입장이라면-좋아할만한-api-path">💬 내가 클라이언트의 입장이라면 좋아할만한 API path</h3>
<ol>
<li>RESTful 표준 준수 (POST,GET, PATCH, DELETE)</li>
<li>자원 기반의 일관된 경로 (모든 경로 앞에 /api/를 붙이는 식으로)</li>
<li>경로에는 가능한 동작을 사용하지 않는 것</li>
<li>어순에 맞춰서 (ex 특정 사용자의 게시물 조회) → <code>GET /api/users{userId}/posts</code></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[TCP/IP 윈도우 소켓 프로그래밍 2장 [소켓 시작하기]]]></title>
            <link>https://velog.io/@yeunever_/TCPIP-%EC%9C%88%EB%8F%84%EC%9A%B0-%EC%86%8C%EC%BC%93-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-2%EC%9E%A5-%EC%86%8C%EC%BC%93-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@yeunever_/TCPIP-%EC%9C%88%EB%8F%84%EC%9A%B0-%EC%86%8C%EC%BC%93-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-2%EC%9E%A5-%EC%86%8C%EC%BC%93-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 29 Nov 2024 11:21:53 GMT</pubDate>
            <description><![CDATA[<h1 id="1-오류처리">1) 오류처리</h1>
<ol>
<li>오류를 처리할 필요가 없는 경우 : 리턴 값이 없거나 호출 시 항상 성공하는 일부 소켓함수</li>
<li>리턴값만으로 오류를 확인하고 처리하는 경우 : 윈도우의 WSAStartup() 함수</li>
<li>리턴값으로 오류 발생을 확인하고, 구체적인 내용은 오류 코드로 확인하는 경우 : 대부분의 소켓 함수</li>
</ol>
<h3 id="1-윈도우-오류처리">1. 윈도우 오류처리</h3>
<pre><code class="language-c">#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS

#include &lt;winsock2.h&gt;
#include &lt;ws2tcpip.h&gt;

#include &lt;tchar.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;

#pragma comment(lib,&quot;ws2_32&quot;)

// 에러메세지를 띄우고 화면을 종료하는 함수
void err_quit(const char* msg) {
    LPVOID lpMsgBuf;
    FormatMessageA(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
        NULL, WSAGetLastError(),
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (char *)&amp;lpMsgBuf, 0, NULL);
    MessageBoxA(NULL, (const char*)lpMsgBuf, msg, MB_ICONERROR);
    LocalFree(lpMsgBuf);
    exit(1);
}

// 에러메세지를 띄우는 함수
void err_display(const char* msg) {
    LPVOID lpMsgBuf;
    FormatMessageA(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
        NULL, WSAGetLastError(),
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (char *)&amp;lpMsgBuf, 0, NULL);
    printf(&quot;[%s] %s\n&quot;, msg, (char*)lpMsgBuf);
    LocalFree(lpMsgBuf);
}</code></pre>
<h3 id="2-리눅스-오류처리">2. 리눅스 오류처리</h3>
<pre><code class="language-c">void err_quit(const char *msg)
{
    char *msgbuf = strerror(errno);
    printf(&quot;[%s] %s\n&quot; , msg, msgbuf);
    exit(1);
}

void err_display(const char *msg)
{
    char *msgbuf = strerror(errno);
    printf(&quot;[%s] %s\n&quot; , msg, msgbuf); 
}</code></pre>
<h1 id="2-소켓-초기화와-종료">2) 소켓 초기화와 종료</h1>
<p>윈도우에서는 소켓 생성 전에 윈속 초기화와 소켓 닫기 후에 윈속 종료 단계가 더 필요하다. </p>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/a6dc504e-cede-4b26-ac79-14056e4db57f/image.png" alt=""></p>
<pre><code class="language-c"># include &lt;winsock2.h&gt;

// 프로그램 시작
int WSAStartup(
        WORD wVersionRequested, // 프로그램이 요구하는 최상위 윈속 버전
        LPWSADATA lpWSAData // 윈도우 운영체제가 제공하는 윈속 구현에 관한 정보
);

// 프로그램 종료
int WSACleanup(void);
</code></pre>
<h3 id="실습-2-1">실습 2-1</h3>
<pre><code class="language-c"># include &quot;..\..\Common.h&quot;

it main(int argc, char *argv[])
{
    // 윈속 초기화
        WSADATA wsa;
        if(WSAStartup(MAKEWORD(2,2), &amp;wsa) !=0) // 윈속 초기화가 실패(0이 아니라면) 한다면
            return 1; // 1 반환
        printf(&quot;[알림] 윈속 초기화 성공\n&quot;);

        // 윈속 종료
        WSACleanup();

        return 0;
}</code></pre>
<h1 id="3-소켓-생성과-닫기">3) 소켓 생성과 닫기</h1>
<p>윈도우에서는 윈속 초기화를 먼저 해야하지만, 리눅스에서는 별도의 초기화 과정 없이 곧바로 소켓을 만들 수 있다.</p>
<h3 id="1-소켓-생성하기">1. 소켓 생성하기</h3>
<p>소켓을 사용해 통신을 하려면 통신 양단이 같은 프로토콜을 사용해야함 (TCP, UDP)</p>
<p>socket() 함수는 사용자가 요청한 프로토콜을 사용해 통신할 수 있도록 내부적으로 리소스를 할당하고, 이에 접근할 수 있는 일종의 핸들값을 리턴한다. → 소켓 디스크립터</p>
<ul>
<li>주소체계 : IPv4 , IPv6 등</li>
<li>소켓 타입 : TCP나 UDP 에 따라 달라짐</li>
<li>프로토콜 : 명시적으로 지정해야 함</li>
</ul>
<p>윈도우</p>
<pre><code class="language-c">#include &lt;winsock2.h&gt;
SOCKET socket(
    int af, // 주소 체계 타입
    int type, // 소켓 타입 지정
    int protocol // 사용할 프로토콜 지정
);</code></pre>
<p>리눅스</p>
<pre><code class="language-c">#include &lt;sys/types.h&gt;
#include &lt;sys/socket.h&gt;
int socket(
    int domain, // 주소 체계 타입
    int type, // 소켓 타입 지정
    int protocol  // 사용할 프로토콜 지정
);</code></pre>
<h3 id="2--소켓-닫기">2.  소켓 닫기</h3>
<p>소켓은 사용한 통신을 마치면 관련 리소스를 반환해야한다.</p>
<p>closesocket() 또는 close() 사용</p>
<p>윈도우</p>
<pre><code class="language-c">#include &lt;winsock2.h&gt;
int closesocket(SOCKET s);</code></pre>
<p>리눅스</p>
<pre><code class="language-c">#include &lt;unistd.h&gt;
int close(int fd);</code></pre>
<h3 id="실습2-2">실습2-2</h3>
<pre><code class="language-c">#include &quot;V.Common.h&quot;  

int main(int argc, char *argv[]) {
    // 윈속 초기화
    WSADATA wsa;

    // 윈속 초기화 확인
    if(WSAStartup(MAKEWORD(2,2) , &amp;wsa) !=0)
        return 1; // 초기화 실패 시 프로그램 종료
    printf(&quot;[알림] 윈속 초기화 성공\n&quot;);

    // 소켓 생성
    SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == INVALID_S0CKET) err_quit(&quot;socket()&quot;);
    printf(&quot;[알림] 소켓 생성 성공\n&quot;);

    // 소켓 닫기
    closesocket(sock);

    // 윈속 종료
    WSACleanup();
    return 0;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[TCP/IP 윈도우 소켓 프로그래밍 1장 [네트워크와 소켓 프로그래밍]]]></title>
            <link>https://velog.io/@yeunever_/TCPIP-%EC%9C%88%EB%8F%84%EC%9A%B0-%EC%86%8C%EC%BC%93-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-1%EC%9E%A5-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC%EC%99%80-%EC%86%8C%EC%BC%93-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D</link>
            <guid>https://velog.io/@yeunever_/TCPIP-%EC%9C%88%EB%8F%84%EC%9A%B0-%EC%86%8C%EC%BC%93-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-1%EC%9E%A5-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC%EC%99%80-%EC%86%8C%EC%BC%93-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D</guid>
            <pubDate>Fri, 29 Nov 2024 11:13:31 GMT</pubDate>
            <description><![CDATA[<h1 id="1-tcp-ip-프로토콜-개요">1) TCP/ IP 프로토콜 개요</h1>
<h3 id="1-tcpip-프로토콜-구조">1. TCP/IP 프로토콜 구조</h3>
<p>호스트 : 최종 사용자의 응용 프로그램을 수행하는 주체</p>
<p>라우터 : 호스트에서 생성된 데이터를 여러 네트워크를 거쳐 전송함으로써 서로 다른 네트워크에 속한 호스트 간에 데이터를 교환할 수 있도록 하는 장비</p>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/2a4f3af8-7068-4df2-a767-4ea69643755d/image.png" alt=""></p>
<table>
<thead>
<tr>
<th></th>
<th>역할</th>
<th>구성요소</th>
<th>주소 지정 방식</th>
<th>대표 프로토콜</th>
</tr>
</thead>
<tbody><tr>
<td>네트워크 접근 계층</td>
<td>물리적 네트워크를 통한 실제 데이터 송수신을 담당</td>
<td>네트워크 하드웨어 + 장치 드라이버</td>
<td>물리주소</td>
<td></td>
</tr>
<tr>
<td>인터넷 계층</td>
<td>네트워크 접근 계층의 도움을 받아 데이터를 목적지 호스트까지 전달</td>
<td>• IP 주소 + 라우팅(or 라우터)</td>
<td>IP 주소</td>
<td></td>
</tr>
<tr>
<td>전송계층</td>
<td>- 최종 통신 목적지(응용 프로그램)를 지정하고, 오류 없이 데이터를 전송</td>
<td></td>
<td>포트 번호</td>
<td>TCP, UDP</td>
</tr>
<tr>
<td>응용계층</td>
<td>전송 계층을 기반으로 한 다수의 프로토콜과 이 프로토콜을 사용하는 응용 프로그램을 포괄</td>
<td></td>
<td></td>
<td>Telnet, FTP, HTTP, SMTP</td>
</tr>
<tr>
<td>- 라우팅 : 데이터를 목적지까지 전달하는 일련의 작업</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody></table>
<h3 id="2-데이터-전송-원리">2. 데이터 전송 원리</h3>
<p>패킷이란 ?</p>
<p>각 프로토콜에서 정의한 제어정보 (IP주소, 포트번호, 오류체크 코드 등) + 데이터</p>
<p>헤더 + 트레일러</p>
<h3 id="3-ip-주소-포트번호">3. IP 주소, 포트번호</h3>
<p>IP 주소 : 인터넷에 있는 호스트와 라우터의 식별자</p>
<p>포트번호 : 인터넷 통신의 종착점(하나 혹은 여러 프로세스)을 나타내는 식별자</p>
<table>
<thead>
<tr>
<th>포트번호</th>
<th>분류</th>
</tr>
</thead>
<tbody><tr>
<td>0~1023</td>
<td>알려진 포트</td>
</tr>
<tr>
<td>1024~49151</td>
<td>등록된 포트</td>
</tr>
<tr>
<td>49152~65535</td>
<td>동적/ 사설 포트</td>
</tr>
</tbody></table>
<h3 id="4-클라이언트-서버-모델">4. 클라이언트-서버 모델</h3>
<p>두 프로그램이 상호 작용하는 방식을 나타내는 용어</p>
<h1 id="2-소켓의-개념">2) 소켓의 개념</h1>
<p>소켓 : 버클리 유닉스에서 개발한 네트워크 프로그래밍 인터페이스</p>
<p>윈도우에서 사용할 수 있게 만든 것 : 윈도우 소켓 , (윈속)</p>
<h3 id="데이터-타입">데이터 타입</h3>
<p>소켓 : 일단 만들고 나면 함수를 호출하여 손쉽게 네트워크 통신을 수행</p>
<h3 id="통신-종단점">통신 종단점</h3>
<p>통신 종담점, 즉 통신의 출발점과 도착점</p>
<p>클라이언트 send(sock, .. ) → recv(sock, …) 서버</p>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/f6117425-3b5b-49ce-afd7-5020dfb533b5/image.png" alt=""></p>
<h3 id="네트워크-프로그래밍-인터페이스">네트워크 프로그래밍 인터페이스</h3>
<p>TCP/IP 프로토콜의 관점에서 네트워크 프로그래밍 인터페이스에 불과하다.</p>
<p>TCP/IP 프로토콜에서 응용계층과 전송계층 사이에 위치하는 것으로 간주</p>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/ca22bec9-96fc-48c8-b4cf-851e03103590/image.png" alt=""></p>
<h1 id="3-소켓의-특징과-구조">3) 소켓의 특징과 구조</h1>
<h3 id="1-소켓-특징">1. 소켓 특징</h3>
<p>윈도우 소켓 : 유닉스 소켓에 기반을 둔 네트워크 프로그래밍 인터페이스 → 소스코드 수준에서 호환성이 높음</p>
<p><strong>윈도의 소켓과 리누스 소켓의 차이점</strong></p>
<ul>
<li>DLL 초기화와 종료 작업을 위한 윈도우 전용 함수가 필요</li>
<li>GUI 를 갖추고 메시지 구동 방식으로 동작하므로 이를 위한 확장함수가 존재</li>
<li>멀티스레드를 지원</li>
</ul>
<h4 id="윈속windows-sockets의-장단점">윈속(Windows Sockets)의 장단점</h4>
<p><strong>장점</strong></p>
<ol>
<li><strong>유닉스 소켓과의 호환성</strong>: 소스 코드 수준에서 호환성이 높아 기존 코드를 쉽게 이식 가능.</li>
<li><strong>범용성</strong>: 여러 운영체제에서 사용 가능한 네트워크 프로그래밍 인터페이스.</li>
<li><strong>프로토콜 지원</strong>: TCP/IP 외 다른 프로토콜도 지원, 코드 수정 최소화로 프로토콜 변경 가능.</li>
<li><strong>세부 제어 가능</strong>: 저수준 프로그래밍 인터페이스로 고성능 네트워크 프로그램 개발 가능.</li>
</ol>
<p><strong>단점</strong></p>
<ol>
<li><strong>응용 프로토콜 설계</strong>: 프로그래머가 직접 응용 프로그램 수준의 프로토콜 설계 필요.</li>
<li><strong>데이터 변환 처리</strong>: 서로 다른 바이트 정렬 방식이나 데이터 단위를 사용하는 호스트 간 통신 시, 데이터 변환을 응용 프로그램에서 처리해야 함.</li>
</ol>
<h1 id="4-소켓-프로그램-맛보기">4) 소켓 프로그램 맛보기</h1>
]]></description>
        </item>
        <item>
            <title><![CDATA[2023 회고]]></title>
            <link>https://velog.io/@yeunever_/GDSC-2%EA%B8%B0-%ED%99%9C%EB%8F%99-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@yeunever_/GDSC-2%EA%B8%B0-%ED%99%9C%EB%8F%99-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Sun, 17 Nov 2024 09:37:27 GMT</pubDate>
            <description><![CDATA[<p>작성예정</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[제54회 SQL 개발자(SQLD)]]></title>
            <link>https://velog.io/@yeunever_/SQLD-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@yeunever_/SQLD-%ED%95%A8%EC%88%98</guid>
            <pubDate>Wed, 11 Sep 2024 02:10:19 GMT</pubDate>
            <description><![CDATA[<h1 id="공부시간">공부시간</h1>
<p>7일의 전사가 되어 불태웠다. 방학내내 너무 많이 쉰 탓에 자격증이라도 하나 획득하자 ! 라는 마인드로 임했다.</p>
<p>다만, 전공 데이터베이스 과목 성적이 A+였고, 해당 과목으로 멘토링을 진행했기 때문에 적은 시간을 들였지만 합격할 수 있었다고 생각한다. 따라서 내 방식을 추천하진 않는다.</p>
<h1 id="공부한-교재-및-참고-사이트">공부한 교재 및 참고 사이트</h1>
<p>국룰교재 노랭이 ! 를 이용했다.</p>
<p><a href="https://www.yes24.com/Product/Goods/124645703">노랭이 교재 참고</a></p>
<p>아래의 카페에서 개념과 요약 정리, 기출문제, 질문/답변 등 여러가지 정보를 획득할 수 있었다.</p>
<p><a href="https://cafe.naver.com/sqlpd">데이터 전문가 포럼 DP Forum</a></p>
<h2 id="걱정-포인트">걱정 포인트</h2>
<p>개정 범위 출제 ?
: 기출문제가 현저히 적다 !</p>
<p>개정되자마자 치른 52회차에서는 개정 범위에서 한 문제도 안 나왔다.</p>
<p>53회에서는 3~4문제 정도 나왔는데,,,, 그렇다면 54회는 개정 범위가 더 많이 나올 것만 같았다.</p>
<p>하지만 기출문제는 턱 없이 적다는 생각이 들었고, 따라서 자료를 찾던 중 괜찮은 카페를 발견했고, 하루 전날 가입해서 개정범위 관련된 문제들을 속성으로 풀고 시험에 응시하였다.</p>
<p><a href="https://cafe.naver.com/hongdatalab">홍쌤의 데이터랩</a></p>
<p>위 카페에서 개정범위와 관련된 문제는 한 번씩만 풀고, 유튜브로 해설을 참고하는 정도로만 공부했다.</p>
<p>시간이 부족하기도 했고, 어떤 부분이, 얼마나 어렵게 나올지 모르기 때문에 적당히 보고 넘어가는 방식을 선택했다.</p>
<p>또한, 최신 기출 문제들에 익숙해지고 싶어서 예상복원 문제들을 접해보았고,
따라서 시험장 마인드 세팅을 더 잘할 수 있었다 !</p>
<p><a href="https://yunamom.tistory.com/category/IT%EC%9E%90%EA%B2%A9%EC%A6%9D%20%EA%B3%B5%EB%B6%80/SQLD%20%EC%98%88%EC%83%81%EB%B3%B5%EC%9B%90">Study with yuna 예상 복원</a></p>
<h1 id="후기">후기</h1>
<p>일주일 간 와다다다 공부했고, 정신없이 얼레벌레 공부하는 느낌이 들었지만 다행히 하루 전날 어느 정도 정리된 느낌을 가지고 시험장에 갈 수 있었다. 첫 IT 자격증을 획득했다는 것에 의의를 두도록 하고, 다음에는 더 꼼꼼하게 미리 준비하고 싶다는 생각을 했다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQLD [SQL 기본]]]></title>
            <link>https://velog.io/@yeunever_/SQLD-SQL-%EA%B8%B0%EB%B3%B8</link>
            <guid>https://velog.io/@yeunever_/SQLD-SQL-%EA%B8%B0%EB%B3%B8</guid>
            <pubDate>Wed, 11 Sep 2024 02:03:31 GMT</pubDate>
            <description><![CDATA[<h1 id="select-문"><strong>SELECT 문</strong></h1>
<p><strong>SELECT 문장 실행 순서</strong></p>
<p>FWGHSO (왜 그래쏘)로 암기하기 !!</p>
<ul>
<li><p>FROM : 조회 테이블 확인</p>
</li>
<li><p>ON : 조인 조건 확인</p>
</li>
<li><p>JOIN : 테이블 조인 (병합)</p>
</li>
<li><p>WHERE : 데이터 추출 조건 확인</p>
</li>
<li><p>GROUP BY : 특정 컬럼 그룹화</p>
</li>
<li><p>HAVING : 그룹화 이후 데이터 추출 조건</p>
</li>
<li><p>SELECT : 데이터 추출</p>
</li>
<li><p>DISTINCT : 중복 제거</p>
</li>
<li><p>ORDER BY : 데이터 순서 정렬
<img src="https://velog.velcdn.com/images/yeunever_/post/424d39f1-530d-4611-ac09-a14813b99733/image.png" alt=""></p>
<h1 id="where-절">WHERE 절</h1>
</li>
<li><p>원하는 자료를 검색하기 위한 조건절이다</p>
</li>
<li><p>where 절에서는 두 개 이상의 테이블에 대한 조인 조건이나 결과를 제한하기 위한 조건을 기술할 수도 있다</p>
</li>
<li><p>where절은 조회하려는 데이터에 특정 조건을 부여할 목적으로 사용하기 때문에 다음과 같이 FROM절 뒤에 오게 된다.</p>
</li>
</ul>
<p><strong>연산자의 우선순위</strong></p>
<ol>
<li>괄호()</li>
<li>부정연산자(NOT)</li>
<li>산술 연산자 : 곱하기, 나누기, 계수, 더하기, 빼기</li>
<li>문자열 연결 연산자 : ORACLE의 &quot;||&quot; , SQL Server에서 &quot;+&quot;</li>
<li>비교 연산자와 SQL 비교 연산자</li>
</ol>
<ul>
<li>비교 연산자 : =, &gt;, &lt;, &gt;=, &lt;=, &lt;&gt;, !=, ...</li>
<li>SQL 비교 연산자 : BETWEEN A AND B, IN, LIKE, IS NULL</li>
</ul>
<ol>
<li>논리 연산자 중 NOT, AND, OR 순으로 처리</li>
</ol>
<p><strong>부정 비교 연산자</strong></p>
<ul>
<li><code>!=</code> : 같지 않다.</li>
<li><code>^=</code>  : 같지 않다.</li>
<li><code>&lt;&gt;</code>  : 같지 않다.</li>
<li><code>NOT 칼럼명</code> : ~와 같지 않다.</li>
<li><code>NOT 칼럼명 &gt;</code> : ~보다 크지 않다.</li>
</ul>
<h3 id="between-a-and-b">BETWEEN a AND b</h3>
<p>a와 b 값 사이에 있으면 된다. (a,b 각각은 포함)</p>
<h3 id="in-연산자">IN 연산자</h3>
<pre><code class="language-sql">SELECT *
  FROM emp
 WHERE job IN (&#39;ANALYST&#39;, &#39;MANAGER&#39;, &#39;SALESMAN&#39;)</code></pre>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/301fe0e3-b477-48f6-9edd-3b4fb6d347e7/image.png" alt=""></p>
<p>job 칼럼에 IN 연산자에 입력된 직업(ANALYST, MANAGER, SALESMAN) 중 <strong>하나라도 일치하면 조회된다</strong>.
IN 연산자의 결과와 OR 연산자의 결과가 동일하다.</p>
<h3 id="not-in-연산자">NOT IN 연산자</h3>
<pre><code class="language-sql">SELECT *
  FROM emp a
 WHERE mgr NOT IN (7839, 7566, 7902, 7782, 7698)</code></pre>
<p>해당 칼럼의 값이 NULL인 것은 제외하고 조회된다.
<img src="https://velog.velcdn.com/images/yeunever_/post/dfe790d6-3a7e-4920-95ed-adfcb14b2297/image.png" alt=""></p>
<h1 id="그룹함수">그룹함수</h1>
<ul>
<li>반드시 하나의 값만을 반환한다.</li>
<li>NULL 값은 무시된다.</li>
<li>NULL 값이 무시되지 않으려면 NVL, NVL2와 같은 함수를 이용한다.</li>
<li>GROUP BY 설정 없이 일반 컬럼과 기술될 수 없다.</li>
</ul>
<h1 id="group-by">GROUP BY</h1>
<p>WHERE 절을 통해 조건에 맞는 데이터를 조회하고나서, 2차 가공 정보가 필요할 수 있는데 이 때 GROUP BY 절을 사용한다.</p>
<p>GROUP BY 절은 SQL 문에서 FROM 절과, WHERE 절 뒤에 오며, 데이터들을 <strong>작은 그룹으로 분류</strong>하여 소그룹에 대한 <strong>항목별</strong>로 통계 정보를 얻을 때 <strong>추가로 사용</strong>된다.</p>
<p>즉 <strong><em>그룹핑 기준</em></strong> 을 설정 하는 것 이다.</p>
<ul>
<li>SELECT 절에 그룹 함수와 컬럼명이 같이 기술된 경우 해당 컬럼은 반드시 GROUP BY절에 그룹화돼야 한다.</li>
<li>GROUP BY 절은 반드시 그룹함수와 함께 쓰이며 그룹 함수의 결과 값은 GROUP BY 절에 기술된 컬럼의 항목들의 행의 개수에 의해 결정된다.</li>
</ul>
<p><strong>GROUP BY 절 특징</strong></p>
<ul>
<li>GROUP BY 절에서는 alias명 사용 불가</li>
<li>GROUP BY 절보다 where절이 먼저 수행되기 때문에 집계 함수는 where 절에 올 수 없다.
<img src="https://velog.velcdn.com/images/yeunever_/post/3758e2b3-2516-4f9f-bec4-d10fbf85c47a/image.png" alt="">
GROUP BY 절에 DEPTNO 를 사용하면 DEPTNO 가 같은 값끼리 묶여서 요약 정보만 SELECT 절에 표현 가능.
따라서 GROUP BY 컬럼과 집계 함수를 사용한 결과만이 전달 가능</li>
<li><blockquote>
<p>GROUP BY 절에 명시되지 않은 컬럼 전달 불가!</p>
</blockquote>
</li>
</ul>
<h1 id="having-절">HAVING 절</h1>
<ul>
<li>HAVING 절은 해석상 WHERE 절과 동일하다. 단 조건 내용에 그룹 함수를 포함하는 것만을 포함한다.</li>
<li>일반 조건은 WHERE 절에 기술하지만 그룹 함수를 포함한 조건은 HAVING 절에 기술한다.</li>
<li>GROUP BY절에 의한 집계 데이터에 출력 조건을 건다.</li>
<li>HAVING 절은 일반적으로 GROUP BY 절 뒤에 위치한다.</li>
</ul>
<pre><code class="language-sql">SELECT [DISTINCT] 컬럼, 그룹 함수(컬럼)
FROM 테이블명
[WHERE 조건]
[GROUP BY Group대상]
[HAVING 그룹 함수 포함 조건]
[ORDER BY 정렬대상 [ASC/DESC]]</code></pre>
<h1 id="order-by-절">ORDER BY 절</h1>
<p>특징</p>
<ul>
<li>SQL 문장으로 조회된 데이터들을 다양한 목적에 맞게 특정 칼럼을 기준으로 정렬하는데 사용된다.</li>
<li>DBMS마다 NULL 값에 대한 정렬 순서가 다를 수 있으므로 주의해야한다.</li>
<li>GROUP BY 절을 사용하는 경우 ORDER BY 절에 집계함수를 사용할 수도 있다.</li>
<li>칼럼명 대신 Alias 명이나 칼럼 순서를 나타내는 정수를 혼용해서 사용할 수 있다.<h1 id="조인">조인</h1>
<h1 id="표준조인">표준조인</h1>
</li>
</ul>
<p><strong>일반 집합 연산자</strong></p>
<p>UNION, UNION ALL</p>
<p>INTERSECTION</p>
<p>EXCEPT, MINUS</p>
<p>CROSS PRODUCT</p>
<h2 id="on과-using">ON과 USING</h2>
<p>USING : USING 은 <code>두 테이블간 조인 조건 컬럼의 컬럼명이 동일한 경우</code> 사용할 수 있는 키워드</p>
<p>컬럼명이 같을 경우 ON, USING 모두 사용 가능하나, 컬럼명이 다른 경우는 ON 만 사용 가능한 점</p>
<pre><code class="language-sql"># ON 사용
SELECT EMP.DEPTNO, EMPNO, ENAME, DNAME
FROM EMP INNER JOIN DEPT
ON EMP.DEPTNO = DEPT.DEPTNO;

# USING 사용
SELECT DEPTNO, EMPNO, ENAME, DNAME
FROM EMP INNER JOIN DEPT
USING (DEPTNO);</code></pre>
<h2 id="from절-join-형태">FROM절 JOIN 형태</h2>
<h3 id="inner-join"><strong>INNER JOIN</strong></h3>
<pre><code class="language-sql">SELECT EMP.DEPTNO, EMPNO, ENAME, DNAME
FROM EMP INNER JOIN DEPT
ON EMP.DEPTNO = DEPT.DEPTNO;</code></pre>
<h3 id="natural-join"><strong>NATURAL JOIN</strong></h3>
<ul>
<li>두 테이블 간의 동일한 이름을 갖는 모든 칼럼들에 대해 EQUI(=) JOIN을 수행</li>
<li>NATURAL JOIN이 명시되면, 추가로 USING 조건절, ON 조건절, WHERE 절에서 JOIN 조건을 정의할 수 없다.</li>
<li>JOIN에 사용된 칼럼들은 같은 데이터 유형이어야 하며, ALIAS나 테이블 명과 같은 접두사를 붙일 수 없다.</li>
</ul>
<p>→ 모든 칼럼에 OWNER 표시가 없어야 함</p>
<h3 id="cross-join"><strong>CROSS JOIN</strong></h3>
<ul>
<li>일반 집합 연산자의 PRODUCT의 개념으로 테 이블 간 JOIN 조건이 없는 경우 생길 수 있는 모든 데이터의 조합</li>
<li>두 개의 테이블에 대한 CARTESIAN PRODUCT 또는 CROSS PRODUCT와 같은 표현으로, 결과는 양쪽 집합의 M*N 건의 데이터 조합이 발생한다.</li>
</ul>
<h3 id="outer-join"><strong>OUTER JOIN</strong></h3>
<ul>
<li>LEFT OUTER JOIN<ul>
<li>조인 수행시 먼저 표기된 좌측 테이블에 해당하는 데이터를 먼저 읽은 후, 나중 표기된 우측 테이블에서 JOIN 대상 데이터를 읽어 온다.</li>
<li>Table A와 B가 있을 때(Table &#39;A&#39;가 기준이 됨), A와 B를 비교해서 B의 JOIN 칼럼에서 같은 값이 있을 때 그 해당 데이터를 가져오고, B의 JOIN 칼럼에서 같은 값이 없는 경우에는 B 테이블에서 가져오는 칼럼들은 NULL 값으로 채운다.</li>
<li>LEFT JOIN으로 OUTER 키워드를 생략해서 사용할 수 있다.</li>
</ul>
</li>
<li>RIGHT OUTER JOIN<ul>
<li>조인 수행시 LEFT JOIN과 반대로 우측 테이블이 기준이 되어 결과를 생성한다.</li>
<li>TABLE A와 B가 있을 때(TABLE &#39;B&#39;가 기준이 됨), A와 B를 비교해서 A의 JOIN 칼럼에 서 같은 값이 있을 때 그 해당 데이터를 가져오고, A의 JOIN 칼럼에서 같은 값이 없는 경 우에는 A 테이블에서 가져오는 칼럼들은 NULL 값으로 채운다.</li>
<li>RIGHT JOIN으로 OUTER 키워드를 생략해서 사용할 수 있다.</li>
</ul>
</li>
<li>FULL OUTER JOIN<ul>
<li>조인 수행시 좌측, 우측 테이블의 모든 데이터를 읽어 JOIN하여 결과를 생성한다.</li>
<li>TABLE A와 B가 있을 때(TABLE &#39;A&#39;, &#39;B&#39; 모두 기준이 됨), RIGHT OUTER JOIN과 LEFT OUTER JOIN의 결과를 합집합으로 처리한 결과와 동일하다.<ul>
<li>단, UNION ALL이 아닌 UNION 기능과 같으므로 중복되는 데이터는 삭제한다.</li>
</ul>
</li>
<li>FULL JOIN으로 OUTER 키워드를 생략해서 사용할 수 있다.
<img src="https://velog.velcdn.com/images/yeunever_/post/0946ef90-abb8-4a00-9b77-f0b67e8f418d/image.png" alt=""></li>
</ul>
</li>
<li>INNER JOIN의 결과<ul>
<li>양쪽 테이블에 모두 존재하는 키 값이 B-B, C-C 인 2건이 출력된다.</li>
</ul>
</li>
<li>LEFT OUTER JOIN의 결과<ul>
<li>TAB1을 기준으로 키 값 조합이 B-B, C-C, D-NULL, E-NULL 인 4건이 출력된다.</li>
</ul>
</li>
<li>RIGHT OUTER JOIN의 결과<ul>
<li>TAB2를 기준으로 키 값 조합이 NULL-A, B-B, C-C 인 3건이 출력된다.</li>
</ul>
</li>
<li>FULL OUTER JOIN의 결과<ul>
<li>양쪽 테이블을 기준으로 키 값 조합이 NULL-A, B-B, C-C, D-NULL, E-NULL 인 5건이 출력된다.</li>
</ul>
</li>
<li>CROSS JOIN의 결과<ul>
<li>JOIN 가능한 모든 경우의 수를 표시하지만 단, OUTER JOIN은 제외한다.</li>
<li>양쪽 테이블 TAB1과 TAB2의 데이터를 곱한 개수인 4 * 3 = 12건이 추출됨</li>
<li>키 값 조합이 B-A, B-B, B-C, C-A, C-B, C-C, D-A, D-B, D-C, E-A, E-B, E-C 인 12건이 출력된다.</li>
</ul>
</li>
</ul>
<p>** 문제풀이 
Q. 조인에 대한 설명으로 적절한 것**</p>
<ul>
<li>일반적으로 Join은 PK와 FK 값의 연관성에 의해 성립된다.</li>
<li>EQUI Join은 Join에 관여하는 테이블 간의 컬럼 값들이 정확하게 일치하는 경우에 사용되는 방법이다.</li>
<li>EQUI Join은 ‘=’ 연산자에 의해서만 수행되며, 그 이외의 비교 연산자를 사용하는 경우에는 모두 Non EQUI Join이다</li>
<li>대부분 Non EQUI Join을 수행할 수 있지만, 때로는 설계상의 이유로 수행이 불가능한 경우도 있다.</li>
</ul>
<p><strong>Q. 다음 중 아래에서 조인(JOIN)에 대한 설명으로 올바르지 않은 것은 ?</strong></p>
<p>가) 마스터 테이블과 슬레이브 테이블 간의 조인은 일반적으로 기본키와 외래키 사이에서 발생한다.</p>
<p>나) EQUI Join은 두 개의 테이블 간에 칼럼 값이 일치하는 것을 조회한다.</p>
<p><strong>다) EQUI Join은 &gt;, &lt; ≥, ≤를 사용한다.</strong></p>
<p>라) EQUI Join은 두 개의 테이블에서 교집합을 찾는다.</p>
<h1 id="함수">함수</h1>
<h2 id="문자형-함수">문자형 함수</h2>
<p>: 입력 문자열을 소문자로 변환</p>
<ul>
<li><p>CHR(ASCII 코드) : 코드 값에 따른 문자 출력</p>
</li>
<li><p>UPPER(문자열) → 대문자</p>
<p>  : 입력 문자열을 대문자로 변환</p>
</li>
<li><p>LTRIM(문자열, [특정문자] ) → 문자 사이에 있는 공백은 제거 안됨</p>
<p>  : 왼쪽 공백 제거, 특정문자 제거(제거 되면 멈춤)</p>
<p>  : 특정 문자로 여러 문자를 입력하면 그 안에 있는 모든 문자가 사라짐</p>
<p>  ex) LTRIM(’SQL’, ‘LE’) → SQ </p>
<p>  : ‘LE’ 에 ‘L’, ‘E’ 가 있기 때문에 L, E를 날리는 것 대신 바로 멈춘다.</p>
</li>
<li><p>RTRIM(문자열, [특정문자]) → 문자 사이에 있는 공백은 제거 안됨</p>
<p>  : 오른쪽 공백 제거, 특정문자 제거(제거 되면 멈춤)</p>
</li>
<li><p>TRIM([위치값] [특정문자] [FROM] 문자열) → , 없어도 됨 + 특정문자는 문자열 안됨</p>
<p>  : 왼쪽, 오른쪽 공백 제거하고 특정 문자 제거</p>
<p>  : 위치값은 LEADING=왼쪽부터, TRAILING=오른쪽부터, BOTH=둘 다</p>
</li>
<li><p>SUBSTR(문자열, 시작점, [길이] ) → 0부터 시작 X, 1부터 시작임</p>
<p>  : 문자열의 원하는 부분만 잘라서 반환(추출), 시작점 부터 자르기 시작해서, 길이 만큼 자른다.</p>
<p>  : 더 잘라질 수 없으면 최대한의 값으로 출력</p>
<p>  ex) SUBSTR(’블랙핑크제니’, 3, 2) → ‘핑크’</p>
<p>  ex) SUBSTR(’블랙핑’, 3, 3) → ‘핑’</p>
</li>
</ul>
<pre><code class="language-sql">SELECT SUBSTR(&#39;DATABASE&#39;, 7) FROM DUAL;
SELECT SUBSTR(&#39;DATABASE&#39;, -2) FROM DUAL;
SELECT SUBSTR(&#39;DATABASE&#39;, 8, -2) FROM DUAL;
SELECT SUBSTR(&#39;DATABASE&#39;, INSTR(&#39;DATABASE&#39;, &#39;S&#39;), 2) FROM DUAL;

// 3번째 줄은 NULL 반환하고, 나머지는 SE</code></pre>
<ul>
<li><p>INSTR(문자열, 찾고싶은 문자열, [시작점], [몇번째에 발견])</p>
<p>  : 문자열에서 원하는 문자 찾아서 위치 반환, 여러개 찾아지면 몇번째 문자의 위치를 반환</p>
<p>  → 시작 위치와 발견 인덱스는 생략 가능</p>
<p>  → 찾고자 하는 문자가 여러 개인 경우 4번째 인자인 순서를 통해 결정</p>
<p>  ex) INSTR(’A#B#C#’, ‘#’, 3, 2) → 6</p>
</li>
<li><p>LENGTH(문자열)</p>
<p>  : 문자열의 길이를 반환</p>
</li>
<li><p>REPLACE(문자열, 찾는 문자열, [변경 할 문자열])</p>
<p>  : 문자열에서 특정 문자열을 찾아서 이를 변경 → 변경 할 문자 입력 안하면 없앰</p>
</li>
<li><p>LPAD(문자열, 길이, 특정 문자)</p>
<p>  : 문자열이 설정한 길이가 될 떄 까지 왼쪽을 특정 문자로 채움</p>
</li>
<li><p>RPAD(문자열, 길이, 특정 문자)</p>
<p>  : 위와 동일 </p>
</li>
<li><p>CONCAT(문자, 문자) → 결합</p>
<p>  : 두 문자를 결합하는 함수
  <img src="https://velog.velcdn.com/images/yeunever_/post/2a61adb9-4136-4b62-9a75-78cec284c717/image.png" alt=""></p>
</li>
</ul>
<h2 id="숫자형-함수">숫자형 함수</h2>
<ul>
<li><p>ABS(수)</p>
<p>  : 절댓값 반환</p>
</li>
<li><p>SIGN(수)</p>
<p>  : 부호를 반환 → 양수 = 1 / 음수 = -1 / 0 = 0</p>
</li>
<li><p>CEIL(수) → 올림</p>
<p>  : 소수점 이하의 수를 올림 한 정수로 반환</p>
<p>  : 음수인 소수를 넣으면 버리게 되면 커진다.</p>
<p>  ex) CEIL(72.86) → 73</p>
<p>  ex) CEIL(-33.4) → -33</p>
</li>
<li><p>ROUND(수, [자릿수]) → 반올림</p>
<p>  : 수를 지정한 소수점 자릿수까지 반올림, Default = 정수로 만듬 = 0</p>
<p>  : 음수는 해당 자릿수의 정수를 반올림(-1 = 1의 자리를 반올림, -2 = 10자리)</p>
<p>  ex) ROUND(163.76, 1) → 163.8</p>
<p>  ex) ROUND(163.76, -2) → 200</p>
</li>
<li><p>TRUNC(수, [자릿수]) → 버림</p>
<p>  : 수를 지정한 소수점 자릿수까지 버림, Default = 0</p>
<p>  : 음수는 해당 자릿수의 정수까지 버림</p>
<p>  ex) TRUNC(54.29, 1) → 54.2</p>
<p>  ex) TRUNC(54.29, -1) → 50</p>
</li>
<li><p>FLOOR(수) → 소수점 이하 버림</p>
<p>  : 소수점 이하의 수를 버림</p>
<p>  ex) FLOOR(22.3) → 22</p>
<p>  ex) FLOOR(-22.3) → -23</p>
</li>
<li><p>MOD(수1, 수2) → 나머지</p>
<p>  : 수1을 수2로 나눈 나머지를 반환</p>
<p>  : 수2가 0일 경우 수1을 그대로 반환</p>
<p>  ex) MOD(15, 7) → 1</p>
<p>  ex) MOD(15, -4) → 3</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/50f98403-6473-4f5d-9709-8679694295a3/image.png" alt=""></p>
<h2 id="날짜-함수">날짜 함수</h2>
<ul>
<li><p>SYSDATE</p>
<p>  : 현재의 연, 월, 일, 시, 분, 초를 반환</p>
<p>  : nls_date_format에 따라 출력 포맷 달라질 수 있음)</p>
</li>
<li><p>EXTRACT(특정 단위 FROM 날짜데이터 or SYSDATE)</p>
<p>  : 특정 단위의 날짜를 반환</p>
<p>  ex) EXTRACT(YEAR FROM SYSDATE) → 2024</p>
<p>  ex) EXTRACT(MONTH FROM SYSDATE) → 3</p>
</li>
<li><p>ADD_MONTHS(날짜 데이터, 특정 개월 수)</p>
<p>  : 입력한 날짜 데이터에 특정 개월 수를 더한 날짜를 반환해주는 함수 </p>
<p>  : 날짜의 이전 달이나 다음 달에 기준 날짜의 일자가 존재하지 않으면 해당 월의 마지막 일자 반환</p>
<p>  ex) ADD_MONTHS( TO_DATE(’2021-12-31’), 1) → 2022-01-31</p>
<p>  ex) ADD_MONTHS( DATE ‘2022-01-31’, 1) → 2022-02-28</p>
</li>
</ul>
<h2 id="변환-함수">변환 함수</h2>
<p>명시적 형변환 : 변환 함수를 사용하여 데이터 유형을 명시적으로 나타냄</p>
<p>암시적 형변환 : DB가 내부적으로 알아서 데이터 유형을 변환함</p>
<ul>
<li><p>TO_NUMBER(문자열)</p>
<p>  : 문자열을 숫자로 변환</p>
<p>  : 숫자로 변환 안되는 진짜 문자가 들어가면 <strong>에러 발생</strong></p>
</li>
<li><p>TO_CHAR(수 or 날짜, [포맷])</p>
<p>  : 수나 날짜 데이터를 문자형 또는 입력 포맷으로 변환</p>
</li>
<li><p>TO_DATE(문자열, 포맷)</p>
<p>  : 포맷 형식의 문자 데이터를 YYYY-MM-DD 형식의 날짜 데이터로 바꿈</p>
</li>
</ul>
<h1 id="case">CASE</h1>
<p>함수가 아닌 CASE 구문형식으로도 특정 값을 치환 가능</p>
<ul>
<li><p>CASE 구문 &amp; WHEN 조건 &amp; ELSE 처리</p>
<p>  <strong>: 별도의 ELSE가 없으면 NULL 값이 ELSE의 DEFAULT가 된다.</strong></p>
</li>
</ul>
<ul>
<li><p>DECODE(대상, 값1, 리턴1, 값2, 리턴2, 값3, 리턴3……, ESLE 값)</p>
<p>  : CASE 구문과 같은 역할 조건의 구분은 없다.</p>
</li>
</ul>
<pre><code class="language-sql">SELECT CASE WHEN 조건1 THEN 결과1
            WHEN 조건2 THEN 결과2
            .....
            ELSE 결과
       END
FROM 테이블명;

# 예시
SELECT email,
CASE
    WHEN age &gt;= 20 AND age &lt; 30 THEN &#39;이십 대&#39;
    WHEN age BETWEEN 30 AND 39 THEN &#39;삼십 대&#39;
    ELSE &quot;기타&quot;
END as &quot;나이 대&quot;
FROM main_database.member;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQLD [계층형 질의와 셀프조인 / PIVOT과  UNPIVOT]]]></title>
            <link>https://velog.io/@yeunever_/SQLD-%EA%B3%84%EC%B8%B5%ED%98%95-%EC%A7%88%EC%9D%98%EC%99%80-%EC%85%80%ED%94%84%EC%A1%B0%EC%9D%B8-PIVOT%EA%B3%BC-UNPIVOT</link>
            <guid>https://velog.io/@yeunever_/SQLD-%EA%B3%84%EC%B8%B5%ED%98%95-%EC%A7%88%EC%9D%98%EC%99%80-%EC%85%80%ED%94%84%EC%A1%B0%EC%9D%B8-PIVOT%EA%B3%BC-UNPIVOT</guid>
            <pubDate>Mon, 09 Sep 2024 09:20:15 GMT</pubDate>
            <description><![CDATA[<h1 id="계층형-데이터란-">계층형 데이터란 ?</h1>
<p>테이블에 계층형 데이터가 존재하는 경우 데이터를 조회하기 위해서 계층형 질의를 사용한다.</p>
<p>계층형 데이터 : 동일 테이블에 계층적으로 상위와 하위 데이터가 포함된 데이터
<img src="https://velog.velcdn.com/images/yeunever_/post/0fa12f59-52d3-4548-a603-b1651e6d7f21/image.png" alt=""></p>
<p>ex) 사원 테이블에서는 사원들 사이에 상위 사원(관리자)과 하위 사원관계가 존재하고 조직 테이블에서는 조직들 사이에 상위 조직과 하위 조직 관계가 존재</p>
<h2 id="계층형-질의">계층형 질의</h2>
<pre><code class="language-sql">SELECT ...
FROM 테이블
WHERE  condition AND condition ...
START WITH condirion
CONNECT BY [NOCYCLE] condition AND condition ...
[ORDER SIBILINGS BY column, column, ... ]</code></pre>
<p><strong>START WITH 절 :</strong> 계층 구조 전개 시작 위치를 정하는 구문, 즉, 루트 데이터를 지정</p>
<p><strong>CONNECT BY 절 :</strong> 자식 데이터를 지정하는 구문, 자식 데이터는 CONNECT BY 절에 주어진 조건을 만족</p>
<p><strong>PRIOR</strong> </p>
<p>다음에 전개될 자식 데이터를 지정. 자식 데이터는 CONNECT BY에 주어진 조건을 만족해야함. </p>
<p>** PRIOR 키워드 : 바로 직전에 출력된 레코드(행)를 의미</p>
<ol>
<li>PRIOR 자식 = 부모:</li>
</ol>
<p>계층 구조가 부모데이터에서 자식 데이터(부모 → 자식), 방향으로 전개되는 <strong>순방향</strong> 전개를 함.</p>
<ol>
<li>PRIOR 부모 = 자식;</li>
</ol>
<p>계층 구조가 자식 데이터에서 부모 데이터(자식 → 부모), 방향으로 전개되는 <strong>역방향</strong> 전개를 함.</p>
<ol>
<li>NOCYCLE : 데이터를 전개하면서 이미 나타났던 동일한 데이터가 다시 나타난다면 이것을 가리켜 사이클이 형성되었다고 한다. 사이클이 발생하면 런타임 오류가 발생함. 하지만 NOCYCLE을 추가하면 사이클이 발생한 이후의 데이터는 전개하지 않는다.</li>
</ol>
<h3 id="자-부-순--부-자-역">자-부-순 / 부-자-역</h3>
<p><strong>NOCYCLE</strong></p>
<p>데이터를 전개하면서 이미 나타났던 동일한 데이터가 전개 중에 다시 나타나면 이것을 가리켜 사이클(CYCLE))이 형성되었다고 하며, 사이클이 발생한 데이터는 런타임 오류가 발생</p>
<p>하지만 NOCYCLE를 추가하면 사이클이 발생한 이후의 데이터는 전개하지 않음</p>
<p><strong>ORDER SIBLING BY</strong> : 형제 노드 (동일 LEVEL )사이에서 정렬을 수행 </p>
<p><strong>WHERE</strong> :  모든 전개를 수행한 후에 지정된 조건을 만족하는 데이터만 추출</p>
<p><strong>LEVEL :</strong>루트 데이터이면 1, 그 하위 데이터이면 2 이다. 리프(Leaf) 데이터까지 1씩 증가</p>
<p><strong>CONNECT_BY_ISLEAF :</strong> 전개 과정에서 해당 데이터가 리프 데이터이면 1, 그렇지 않으면 0 </p>
<p><strong>CONNECT_BY_ISCYCLE :</strong> 전개 과정에서 자식을 갖는데, 해당 데이터가 조상으로서 존재하면 1, 그렇지 않으면 0 .여기서 조상이란 자신으로부터 루트까지의 경로에 존재하는 데이터를 말함. CYCLE 옵션을 사용했을 때만 사용할 수 있음.</p>
<h2 id="계층형-질의-특징">계층형 질의 특징</h2>
<ul>
<li>루트노드의 LEVEL 은 1이다.</li>
</ul>
<h3 id="순방향부모-자식-계층형-질의"><strong>순방향(부모-&gt;자식) 계층형 질의</strong></h3>
<pre><code class="language-sql">SELECT
    LEVET,
    사원,
    관리자,
    CONNECT_BY_ISLEAF ISLEAF
FROM 사원 
START WITH 관리자 IS NULL
CONNECT BY PRIOR 사원 = 관리자;</code></pre>
<ul>
<li>A는 루트 데이터이기 때문에 레벨이 1이다.</li>
<li>A의 하위 데이터인 B, C는 레벨이 2이다.</li>
<li>C의 하위 데이터인 D, E는 레벨이 3이다.</li>
<li>리프 데이터는 B, D, E이다.</li>
<li>관리자 -&gt; 사원 방향의 전개이기 때문에 순방향 전개이다.
<img src="https://velog.velcdn.com/images/yeunever_/post/45dcb87e-a766-4942-822d-a356b7432e1b/image.png" alt=""></li>
</ul>
<h3 id="역방향자식-부모-계층형-질의"><strong>역방향(자식-&gt;부모) 계층형 질의</strong></h3>
<pre><code class="language-sql">SELECT
    LEVET,
    사원,
    관리자,
    CONNECT_BY_ISLEAF ISLEAF
FROM 사원
START WITH 사원 = &#39;D&#39;
CONNECT BY PRIOR 관리자 = 사원;</code></pre>
<ul>
<li>D는 루트 데이터이기 때문에 레벨이 1이다.</li>
<li>D의 상위 데이터인 C는 레벨이 2이다.</li>
<li>C의 상위 데이터인 A는 레벨이 3이다.</li>
<li>리프 데이터는 A이다.</li>
<li>역방향 전개이기 때문에 하위 데이터에서 상위 데이터로 전개이다.
<img src="https://velog.velcdn.com/images/yeunever_/post/98925910-faf6-47f9-b1db-76a969562e0d/image.png" alt=""></li>
</ul>
<h1 id="셀프조인">셀프조인</h1>
<p>동일 테이블 사이의 조인</p>
<p>FROM 절에 동일 테이블이 두 번 이상 나타난다.</p>
<p>동일 테이블 사이의 조인을 수행하면 테이블과 칼럼 이름이 모두 동일하기 때문에 <strong>식별을 위해 반드시 테이블 별칭(Alias)를 사용</strong>해야 한다</p>
<p>** 하나의 테이블에서 두 개의 칼럼이 연관 관계를 가지고 있는 경우에 사용한다.</p>
<p>계층형 질의에서 살펴보았던 사원이라는 테이블 속에는 사원과 관리자가 모두 하나의 사원이라는 개념으로 동일시하여 같이 입력되어 있다
<img src="https://velog.velcdn.com/images/yeunever_/post/b0d730e2-5be4-44cd-9bca-e8e094dd44a4/image.png" alt=""></p>
<p>셀프 조인은 동일한 테이블(사원)이지만 개념적으로는 두 개의 서로 다른 테이블(사원, 관리자)을 사용하는 것과 동일하다.</p>
<pre><code class="language-sql">SELECT
    E1.사원,
    E1.관리자,
    E2.관리자 차상위_관리자
FROM
    사원 E1,
    사원 E2
WHERE E1.관리자 = E2.사원;
ORDER BY E1.사원;</code></pre>
<p>자신과 자신의 직속 관리자는 동일한 행에서 데이터를 구할 수 있으나
차상위 관리자는 바로 구할 수 없다.</p>
<p>차상위 관리자를 구하기 위해서는 자신의 직속 관리자를 기준으로 사원 테이블과 한번 더 조인(셀프 조인)을 수행해야 한다.</p>
<h1 id="pivot의-개요">PIVOT의 개요</h1>
<p>PIVOT은 회전시킨다는 의미를 갖고 있다. PIVOT 절은 행을 열로 회전시키고, UNPIVOT 절은 열을 행으로 회전시킨다.</p>
<h2 id="피벗--펼치는-것">피벗 = 펼치는 것!!!</h2>
<p><strong>PIVOT : 행으로 나열되어 있는 데이터를 열로 나열하여 보기 쉽게 가공하는 것</strong></p>
<ul>
<li>교차표를 만드는 기능</li>
<li>STACK 컬럼, UNSTACK 컬럼, VALUE 컬럼의 정의가 중요!</li>
<li>FROM 절에 STACK, UNSTACK, VALUE 컬럼명만 정의 필요(필요 시 서브쿼리 사용하여 필요 컬럼 제한)</li>
<li>PIVOT 절에 UNSTACK, VALUE 컬럼명 정의</li>
<li>PIVOT 절 IN 연산자에 UNSTACK 컬럼 값을 정의</li>
<li>FROM 절에 선언된 컬럼중 PIVOT 절에서 선언한 VALUE 컬럼, UNSTACK 컬럼을 제외한 모든 컬럼은
STACK 컬럼이 됨</li>
</ul>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/2cd3d976-4bcb-46fa-a93a-5536c1b9dc14/image.png" alt=""></p>
<pre><code class="language-sql">SELECT *
    FROM 테이블명 또는 서브쿼리
    PIVOT (VALUE 칼럼명 FOR UNSTACK 칼럼명 IN (값1, 값2, 값3));

SELECT *
    FROM 원하는 데이터 값
    PIVOT (VALUE 칼럼명 FOR 펼치고 싶은 데이터 IN (값1, 값2, 값3));
    // 펼치고 싶은 데이터가 위로 들어감
</code></pre>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/a483b3fa-104b-4832-a5c8-4df47c3068ad/image.png" alt=""></p>
<pre><code class="language-sql">/* Oracle */
SELECT * FROM tSeason
PIVOT (MAX(sale) FOR season IN (&#39;봄&#39;, &#39;여름&#39;, &#39;가을&#39;, &#39;겨울&#39;)) pvt;
// FROM절 뒤에 오고 SELECT보다 먼저 수</code></pre>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/8a24236f-e560-428d-a5cd-c313c3b746b4/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeunever_/post/86ef5996-66fd-44b6-8b4d-9e9327447d5e/image.png" alt=""></p>
<h2 id="unpivot">UNPIVOT</h2>
<p>UNPIVOT은 이름과 같이 피봇의 반대 동작을 수행합니다.</p>
<p>피봇이 값을 열로 바꾸는데 비해 언피봇은 열을 값으로 변환하여 레코드에 기록한다.</p>
<ul>
<li><strong>STACK 칼럼</strong> : 이미 UNSTACK되어 있는 여러 컬럼을 하나의 컬럼으로 stack시 새로 만들 컬럼이름(사용자 정의)</li>
<li><strong>VALUE 칼럼</strong> : 교차표에서 셀 자리(VALUE)값을 하나의 컬럼으로 표현하고자 할 때 새로 만들 컬럼명(사용자 정의)</li>
<li><strong>값1, 값2</strong> … : 실제 UNSTACK되어 있는 컬럼 이름들</li>
<li><strong>* IN 뒤에 값은 UNSTACK 데이터 칼럼명이 숫자이지만 컬럼명은 문자로 지정되므로 **쌍따옴표 전달 필요</strong></li>
</ul>
<p>FROM 절에 데이터를 제한할 필요가 없음.</p>
<h1 id="정규-표현식의-개요">정규 표현식의 개요</h1>
<p>정규표현식 : 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어</p>
<p>정규 표현식(regular expression)은 문자열의 규칙을 표현하는 검색 패턴으로 주로 문자열 검색과 치환에 사용한다.</p>
<h3 id="특정한-범위-나타내기">특정한 범위 나타내기</h3>
<p>[a-c] a~c 까지의 알파벳을 포함한다면 추출</p>
<p>[cmf] 연속된 알파벳이 아니고 그냥 있기만 하면 추출</p>
<p><strong>패턴 위치 제한 걸어주기</strong></p>
<p>맨 앞 위치로 제한 : ^</p>
<p>맨 마지막 위치로 제한 : $</p>
<p>자리 하나를 차지 : .</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQLD [윈도우 함수, TOP N 쿼리]]]></title>
            <link>https://velog.io/@yeunever_/SQLD-%EC%9C%88%EB%8F%84%EC%9A%B0-%ED%95%A8%EC%88%98-TOP-N-%EC%BF%BC%EB%A6%AC</link>
            <guid>https://velog.io/@yeunever_/SQLD-%EC%9C%88%EB%8F%84%EC%9A%B0-%ED%95%A8%EC%88%98-TOP-N-%EC%BF%BC%EB%A6%AC</guid>
            <pubDate>Mon, 09 Sep 2024 08:41:52 GMT</pubDate>
            <description><![CDATA[<h1 id="윈도우-함수의-개요">윈도우 함수의 개요</h1>
<p>기존 관계형 데이터베이스는 컬럼과 컬럼간의 연산, 비교, 집계 등은 쉬운 반면, 행과 행간의 관계를 정의하거나 비교, 연산하는 것은 하나의 SQL 문으로 처리하기 어렵다.</p>
<p>절차형 프로그램을 작성하거나, INLINE VIEW 를 이용하여 복잡한 SQL 문을 작성해야 했던 것을 부분적으로라도 행과 행간의 관계를 쉽게 정의하기 위해 사용하는 함수가<strong><em>윈도우 함수(WINDOW FUNCTION)</em></strong>이다.</p>
<h2 id="윈도우-함수-문법window-function-syntax">윈도우 함수 문법<strong>(WINDOW FUNCTION SYNTAX)</strong></h2>
<pre><code class="language-sql">SELECT WINDOW_FUNCTION (ARGUMENTS)

OVER ( [PARTITION BY 컬럼] [ORDER BY 절] [WINDOWING 절] )

FROM 테이블 명</code></pre>
<ul>
<li><strong>WINDOW_FUNCTION</strong> : 기존에 사용하던 함수도 있고, 새롭게 WINDOW 함수용으로 추가된 함수도 있다.</li>
<li><strong>ARGUMENTS(인수)</strong> : 함수에 따라 <strong>0 ~ N개</strong> 의 인수가 지정될 수 있다.</li>
<li><strong>PARTITION BY 절</strong> : 전체 집합을 기준에 의해 <strong>소그룹</strong> 으로 나눌 수 있다.</li>
<li><strong>ORDER BY 절</strong> : 어떤 항목에 대해 순위를 기정할 지 <strong>ORDER BY 절</strong>을 기술한다.</li>
<li><strong>ROWS</strong> : <strong>물리적</strong>인 ROW 단위로 행 집합을 지정 ( 현재행을 기준으로 몇개의 행을 포함하는지 )</li>
<li><strong>RANGE</strong> : <strong>논리적</strong>인 상대번지로 행 집합을 지정 ( 현재행을 기준으로 어떤 값의 범위를 포함하는지)</li>
<li><strong>BETWEEN ~ AND 절</strong> : 윈도우의 <strong>시작</strong> 과 <strong>끝</strong> 위치를 지정한다.</li>
<li><strong>UNBOUNDED PRECEDING</strong> : PARTITION의 <strong>첫 번째 로우</strong> 에서 윈도우가 시작</li>
<li><strong>UNBOUNDED FOLLOWING</strong> : PARTITION의 <strong>마지막 로우</strong> 에서 윈도우가 시작</li>
<li><strong>CURRENT ROW</strong> : 윈도우의 <strong>시작이나</strong> 끝 위치가 현재 로우</li>
<li><strong>WINDOWING 절</strong> : 함수의 대상이 되는 행 기준의 범위를 강력하게 지정할 수 있다 ROWS➡️ <strong>물리적</strong> 인 결과 행의 수를, RANGE➡️ <strong>논리적</strong> 인 값에 의한 범위를 나타내는데, 둘 중의 하나를 <strong>선택</strong>해서 사용할 수 있다.</li>
</ul>
<p><strong>예시</strong></p>
<pre><code class="language-sql">SELECT 상품분류코드
       , AVG(상품가격) AS 상품가격
       , COUNT(*) OVER(ORDER BY AVG(상품가격)
                       RANGE BETWEEN 10000 PRECEDING
                       AND 10000 FOLLOWING) AS 유사개수
FROM 상품
GROUP BY 상품분류코드;</code></pre>
<p>유사개수 칼럼은 상품분류코드별 평균상품가격을 서로 비교하여 <del>10000</del>+10000 사이에 존재하는 상품분류코드의 개수를 구한 것이다.</p>
<h2 id="윈도우-함수의-종류">윈도우 함수의 종류</h2>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/f8e7d70f-b874-4196-8f15-e6861d8fe85f/image.png" alt=""></p>
<h2 id="순위함수">순위함수</h2>
<p><strong>RANK 함수</strong></p>
<p>이름 그대로 각 행의 순위를 보여주는 함수이며,ORDER BY 를 포함한 QUERY 문에서 특정 컬럼에 대한 순위를 구하는 함수이다.</p>
<ul>
<li>ORDER BY 를 포함한 QUERY 문에서 특정 항목(칼럼)에 대한 순위를 구하는 함수이다.</li>
<li>특정 범위(PARTITION) 내에서 혹은 전체 데이터에 대한 순위 구한다.</li>
<li>동일한 값에 대해서는 동일한 순위를 부여한다.<ul>
<li>여러 개의 행이 같은 순위인 경우, 다음 랭크는 이어진 숫자(+1)가 아니다.1등인 행이 2개 있다면 다음 행은 3등이 되는 것이다.</li>
</ul>
</li>
</ul>
<p><strong>DENSE_RANK 함수</strong></p>
<p>DENSE_RANK 함수는 RANK 함수와 다르게 순서 있는 집합에서 각 행의 순위를 구하는 함수이다.</p>
<ul>
<li><p>RANK 함수와 흡사하나, 동일한 순위를 하나의 건수로 취급한다.</p>
</li>
<li><p>특정 범위(PARTITION) 내에서 혹은 전체 데이터에 대한 순위 구한다.</p>
<pre><code class="language-sql">SELECT JOB, ENAME, SAL,

     RANK() OVER ( ORDER BY SAL DESC ) RANK,
     DENSE_RANK() OVER ( ORDER BY SAL DESC ) DENSE_RANK
</code></pre>
</li>
</ul>
<p>FROM EMP ;</p>
<pre><code>![](https://velog.velcdn.com/images/yeunever_/post/7cd51df3-c4a9-4913-9972-eaf33ae10ddf/image.png)
**ROW_NUMBER 함수**

동일한 값이라도 고유한 순위를 부여한다는 점이 RANK,DENSE_RANK와 다르다.

- 각 파티션이 연속적인 정수를 할당받기 때문에, 파티션이 바뀔 때마다 번호가 초기화되고 파티션 안에서는 번호가 중복되지 않는다.
- 페이징(pagination)에서 쓰인다.

```sql
SELECT JOB, ENAME, SAL,
       RANK( ) OVER (ORDER BY SAL DESC) RANK,
       ROW_NUMBER() OVER (ORDER BY SAL DESC) ROW_NUMBER
FROM EMP;</code></pre><p><img src="https://velog.velcdn.com/images/yeunever_/post/99a182d2-0ec4-4dfa-bdd1-0fcf82f5a264/image.png" alt=""></p>
<h2 id="그룹-내-행-순서함수">그룹 내 행 순서함수</h2>
<p><strong>FIRST_VALUE 함수</strong></p>
<ul>
<li>FIRST_VALUE 함수를 이용해 파티션별 윈도우에서 <strong>가장 먼저 나온 값</strong>을 구한다.</li>
</ul>
<p><strong>LAST_VALUE 함수</strong></p>
<ul>
<li>LAST_VALUE 함수를 이용해 파티션별 윈도우에서 <strong>가장 나중에 나온 값</strong>을 구한다.</li>
</ul>
<p><strong>NTILE</strong></p>
<ul>
<li>행을 특정 컬럼 순서에 따라 정해진 수의 그룹으로 나누기 위함 필수</li>
<li>그룹 번호가 리턴됨</li>
<li>ORDER BY 필수</li>
<li>PARTITION BY를 사용하여 특정 그룹을 또 원하는 수 만큼 그룹 분리 가능</li>
</ul>
<p><strong>LAG 함수</strong></p>
<p>LAG 함수를 이용해 파티션별 윈도우에서 이전 몇 번째 행의 값을 가져올 수 있다.</p>
<p>즉 <strong>현재 읽혀진 데이터의 이전 값을 알아내는 함수</strong></p>
<ul>
<li>LAG(인수1,인수2,인수3 )</li>
<li><strong>인수1</strong> : 입력 칼럼</li>
<li><strong>인수2</strong> : 몇 번째 <strong>앞의 행</strong> 을 가져올지 결정(DEFAULT 1)</li>
<li><strong>인수3</strong> : 파티션의 첫 번째 행의 경우 가져올 데이터가 없어 NULL 값일 경우, <strong>변경할 값</strong> 입력 (✅ NVL/ISNULL함수 와 동일)</li>
</ul>
<p><strong>LEAD 함수</strong></p>
<p>LEAD 함수를 이용해 파티션별 윈도우에서 이후 몇 번째 행의 값을 가져올 수 있다. 즉 <strong>이후 값을 알아내는 함수</strong></p>
<h3 id="그룹-내-비율-함수"><strong>그룹 내 비율 함수</strong></h3>
<ul>
<li>칼럼 값에 대한 백분률 ➡️ <strong>RATIO_TO_REPORT</strong></li>
<li>행의 순서에 대한 (0~1사이 값) 백분률 ➡️ <strong>PERCENT_RANK</strong></li>
<li>1/(파티션) 전체 건수로 표현하는 백분률 ➡️ <strong>CUME_DIST</strong></li>
</ul>
<p><strong>그룹 함수의 형태</strong></p>
<ul>
<li>SUM, COUNT, AVG, MIN, MAX 등</li>
<li><strong>OVER 절을 사용하여 윈도우 함수로 사용 가능</strong></li>
<li>반드시 연산할 대상을 그룹함수의 입력값으로 전달</li>
</ul>
<p>SUM OVER()</p>
<h3 id="윈도우함수의-연산범위--집계-연산-시-행의-범위-설정-가능">윈도우함수의 연산범위 : 집계 연산 시 행의 범위 설정 가능</h3>
<ul>
<li>ROWS, RANGE 차이</li>
</ul>
<p>1) ROWS : 값이 같더라도 각 행씩 연산</p>
<p>2) RANGE : 같은 값의 경우 하나의 RANGE로 묶어서 동시 연산</p>
<ul>
<li>BETWEEN A AND B</li>
</ul>
<p>A 시작점 정의</p>
<ul>
<li>CURRENT ROW : 현재행부터</li>
<li>UNBOUNDED PRECEDING : 처음부터</li>
<li>N PRECEDING : N 이전부터</li>
</ul>
<p>B 마지막 시점 정의</p>
<ul>
<li>CURRENT ROW : 현재행부터</li>
<li>UNBOUNDED FOLLWOING : 마지막까지</li>
<li>N FOLLWOING : N 이후부터</li>
</ul>
<h1 id="top-n-쿼리">TOP N 쿼리</h1>
<p>페이징 처리를 효과적으로 수행하기 위해 사용</p>
<p>전체 결과에서 특정 N개 추출 ex) 빌보드 차트 3</p>
<ul>
<li>같은 순위의 것을 모두 가져오고 싶다면 WITH TIES 를 사용하고, ORDER BY로 정렬해야함</li>
</ul>
<h3 id="top-n-추출-방법">TOP N 추출 방법</h3>
<ol>
<li>ROWNUM</li>
<li>RANK</li>
<li>FETCH</li>
</ol>
<ul>
<li>윈도우 함수를 사용하여 상위 N개에 대한 값을 추출할 수 있으나 단일 Query로 표현 불가하다.</li>
</ul>
<h2 id="rownum">ROWNUM</h2>
<p>출력된 데이터 기준으로 행 번호 부여</p>
<p>절대적인 행 번호가 아닌 가상의 번호이므로 특정 행을 지정할 수 없음(=연산 불가)</p>
<p>→ ROWNUM 할당 전에 먼저 순서대로 데이터를 정렬한 뒤 ROWNUM을 부여 후 추출하는 것이 좋다.</p>
<p>첫 번째 행이 증가한 이후 할당되므로 <code>&gt;</code> 연산 사용불가 </p>
<p>ROWNUM 잘못된 사용</p>
<pre><code class="language-sql">SELECT *
FROM EMP
WHERE ROWNUM &gt; 1; 
// 크다 조건 전달 불가

SELECT *
FROM EMP
WHERE ROWNUM = 4;
// 항상 불변하는 절대적 번호가 아니므로 &#39;=&#39; 연산자 단독전달불가</code></pre>
<p>예제) EMP 테이블에서 급여가 높은 순서대로 상위 5명의 직원 정보 출력</p>
<pre><code class="language-sql">SELECT EMPNO, ENAME, DEPTNO, SAL
FROM EMP
WHERE ROWNUM &lt;= 5;
ORDER BY SAL DESC;</code></pre>
<p>추출원리 : WHERE절에 의해 먼저 5개를  추출 뒤 이 결과가 집합에 대해 정렬 수행</p>
<p>** 해결 : 먼저 서브쿼리를 사용하여 SAL에 대해 내림차순 정렬을 해놓고 상위 5개 추출</p>
<pre><code class="language-sql">SELECT *
    FROM(SELECT *
                FROM EMP
                ORDER BY SAL DESC)
WHERE ROWNUM &lt;= 5;
ORDER BY SAL DESC;</code></pre>
<h2 id="fetch-절">FETCH 절</h2>
<ul>
<li>출력될 행의 수를 제한하는 절</li>
<li>단일 쿼리로도 정렬 순서대로 상위 N개에 대한 값을 추출할 수 있다.</li>
<li>ORDER BY 절 뒤에 사용</li>
</ul>
<pre><code class="language-sql">ORDER BY 컬럼 OFFSET N {ROW | ROWS} -- OFFSET : 건너뛸 행의 수 
    FETCH {FIRST | NEXT} N {ROW | ROWS} ONLY </code></pre>
<ul>
<li>OFFSET : 건너뛸 행의 수
ex) 성적 높은순 1 등 제외, 나머지 3 명</li>
<li>N : 출력할 행의 수</li>
<li>FETCH : 출력할 행의 수를 전달하는 구문</li>
<li>FIRST : OFFSET 을 쓰지 않았을 때 처음부터 N 행 출력 명령</li>
<li>NEXT : OFFSET 을 사용했을 경우 제외한 행 다음부터 N 행 출력 명령</li>
<li>ROW | ROWS : 행의 수에 따라 하나일 경우 단수, 여러값이면 복수형(특별히 구분하지 않아도 됨)</li>
</ul>
<h3 id="offset-옵션">OFFSET 옵션</h3>
<ul>
<li>FIRST : OFFSET 을 쓰지 않았을 때는 처음부터 N 행 출력</li>
<li>NEXT : OFFSET 을 사용할 경우 제외한 행 다음부터 N 행 출력
<img src="https://velog.velcdn.com/images/yeunever_/post/30fbb584-2ff2-4b34-92d9-63bf38a2fec1/image.png" alt=""></li>
</ul>
<h3 id="only--with-ties">ONLY / WITH TIES</h3>
<p>ONLY - 내가 지정한 딱 row limits 갯수만 리턴
WITH TIES - 내가 지정한 row limits 에서 맨 마지막 행과 same sort key인 row들도 줄줄이 보여줌</p>
<p>출처 : <a href="https://velog.io/@zinu/SQLD-2%EA%B3%BC%EB%AA%A9-SQL-%EA%B8%B0%EB%B3%B8-%EB%B0%8F-%ED%99%9C%EC%9A%A9-%EC%9C%88%EB%8F%84%EC%9A%B0-%ED%95%A8%EC%88%98">https://velog.io/@zinu/SQLD-2%EA%B3%BC%EB%AA%A9-SQL-%EA%B8%B0%EB%B3%B8-%EB%B0%8F-%ED%99%9C%EC%9A%A9-%EC%9C%88%EB%8F%84%EC%9A%B0-%ED%95%A8%EC%88%98</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQLD 그룹함수(ROLLUP,CUBE,GROUPING SETS)]]></title>
            <link>https://velog.io/@yeunever_/SQLD-%EA%B7%B8%EB%A3%B9%ED%95%A8%EC%88%98ROLLUPCUBEGROUPING-SETS</link>
            <guid>https://velog.io/@yeunever_/SQLD-%EA%B7%B8%EB%A3%B9%ED%95%A8%EC%88%98ROLLUPCUBEGROUPING-SETS</guid>
            <pubDate>Mon, 09 Sep 2024 08:19:01 GMT</pubDate>
            <description><![CDATA[<h1 id="그룹함수">그룹함수</h1>
<ul>
<li>ROLLUP,CUBE,GROUPING SETS 세 가지 그룹 함수 모두 일반 그룹 함수로 동일한 결과를 추출할 수 있다.</li>
<li>함수의 인자로 주어진 칼럼의 순서에 따라 다른 결과를 추출하게 되는 함수는 ROLLUP이며, 나열된 칼럼에 대해 계층 구조로 집계를 출력한다.</li>
<li>ROLLUP,CUBE,GROUPING SETS 함수들에 의해 집계된 레코드에서 집계 대상 칼럼 이외의  GROUP 대상 칼럼의 값은 NULL을 반환한다.</li>
</ul>
<h1 id="rollup"><strong>ROLLUP</strong></h1>
<p>소그룹간의 합계를 계산하는 함수입니다. ROLLUP을 사용하면 GROUP BY로 묶은 각각의 소그룹 합계와 전체 합계를 모두 구할 수 있습니다.</p>
<pre><code class="language-sql">SELECT 상품ID, 월, SUM(매출액) AS 매출액
FROM 월별매출
GROUP BY ROLLUP(상품ID, 월);</code></pre>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/48e28ce4-f589-47c6-a6d1-5b91b63918ef/image.png" alt=""></p>
<p>NULL값으로 표시된 부분들이 바로 ROLLUP함수를 써서 나온 합계입니다.</p>
<p>P001 그룹의 매출액 합계, P002 그룹의 매출액 합계, P003 그룹의 매출액 합계가 각각 계산되었으며 전체 Total 합계 또한 한 번에 표시할 수 있습니다.</p>
<p>결과값에서 알 수 있듯이 GROUP BY절에 명시한 모든 컬럼에 대한 소그룹의 합계를 구해주는 것이 아니고 <strong>맨 처음 명시한 컬럼에 대해서만 소그룹 합계를 구해줍니다.</strong></p>
<p>이때 각 그룹명은 따로 지정하지 않았기 때문에 null값으로 표시되었습니다. 그룹명을 지정하는 것은 맨 마지막 GROUPING 함수에서 자세히 다루겠습니다.</p>
<pre><code class="language-sql">GROUP BY ROLLUP(컬럼1, 컬럼2)
=
GROUP BY 컬럼1, 컬럼2
UNION ALL
GROUP BY 컬럼1
UNION ALL
모든 집합 그룹 결과</code></pre>
<p>만약 ? 소계를 구해야 할 값이 하나라면, 소계는 출력된 것으로 간주</p>
<h1 id="cube"><strong>CUBE</strong></h1>
<p>CUBE함수는 항목들 간의 다차원적인 소계를 계산합니다. ROLLUP과 달리 GROUP BY절에 명시한 모든 컬럼에 대해 소그룹 합계를 계산해줍니다.</p>
<pre><code class="language-sql">SELECT 상품ID, 월, SUM(매출액) AS 매출액
FROM 월별매출
GROUP BY CUBE(상품ID, 월);</code></pre>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/a183dc98-905d-471c-8f97-8940d59522a3/image.png" alt=""></p>
<p>ROLLUP함수를 사용했을 때보다 결과가 좀 더 복잡합니다. 상품ID별 합계뿐만 아니라 월별 합계까지 한 번에 볼 수 있습니다.</p>
<pre><code class="language-sql">GROUP BY CUBE(컬럼1, 컬럼2)
=
GROUP BY 컬럼1, 컬럼2
UNION ALL
GROUP BY 컬럼1
UNION ALL
GROUP BY 컬럼2
UNION ALL
모든 집합 그룹 결과</code></pre>
<h1 id="grouping-sets"><strong>GROUPING SETS</strong></h1>
<p>GROUPING SETS는 특정 항목에 대한 소계를 계산하는 함수입니다. </p>
<pre><code class="language-sql">SELECT 상품ID, 월, SUM(매출액) AS 매출액
FROM 월별매출
GROUP BY GROUPING SETS(상품ID, 월);</code></pre>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/e28fa67f-1dff-4d82-908c-880d419bf374/image.png" alt=""></p>
<p>앞의 ROLLUP, CUBE에 비해 훨씬 결과가 단순합니다.</p>
<p>ROLLUP과 CUBE는 GROUP BY 결과에 소그룹 합계와 토탈 합계를 보여주지만 GROUPING SETS는 각 소그룹별 합계만 간단하게 보여줍니다.</p>
<p>GROUPING SETS 함수는 각각의 컬럼으로 GROUP BY한 값을 UNION ALL 한 것과 동일한 결과를 보여줍니다.</p>
<pre><code class="language-sql">SELECT 상품ID, 월, SUM(매출액) AS 매출액
FROM 월별매출
GROUP BY 상품ID

UNION ALL

SELECT 상품ID, 월, SUM(매출액) AS 매출액
FROM 월별매출
GROUP BY 월;</code></pre>
<h1 id="grouping"><strong>GROUPING</strong></h1>
<p>GROUPING은 직접적으로 그룹별 집계를 구하는 함수는 아니지만 위의 집계함수들을 지원하는 함수입니다.</p>
<p>집계가 계산된 결과에 대해서는 1의 값을 갖고 그렇지 않은 결과에 대해서는 0의 값을 갖습니다.</p>
<pre><code class="language-sql">SELECT 
    CASE GROUPING(상품ID) WHEN 1 THEN &#39;모든 상품ID&#39; ELSE 상품ID END AS 상품ID,
    CASE GROUPING(월) WHEN 1 THEN &#39;모든 월&#39; ELSE 월 END AS 월, 
    SUM(매출액) AS 매출액
FROM 월별매출
GROUP BY ROLLUP(상품ID, 월);</code></pre>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/9e8bc6ed-5d15-4e6c-a6ef-bb3db8684b7c/image.png" alt=""></p>
<p>CASE WHEN문을 사용해서 맨 처음에 단순 ROLLUP함수만 썼을 때 NULL값으로 표시되었던 곳에 값을 넣어주었습니다. </p>
<p>집계가 계산된 결과에 대해서만 값을 넣어주면 되기 때문에 GROUPING(컬럼명)=1인 경우에만 &#39;모든상품ID&#39; 또는 &#39;모든월&#39; 값을 부여했고 0인 경우에는 원래대로 상품ID와 월을 써주었습니다.</p>
<p>참고 블로그 : <a href="https://for-my-wealthy-life.tistory.com/44">https://for-my-wealthy-life.tistory.com/44</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQLD [NULL 속성의 이해]]]></title>
            <link>https://velog.io/@yeunever_/SQLD-NULL-%EC%86%8D%EC%84%B1%EC%9D%98-%EC%9D%B4%ED%95%B4</link>
            <guid>https://velog.io/@yeunever_/SQLD-NULL-%EC%86%8D%EC%84%B1%EC%9D%98-%EC%9D%B4%ED%95%B4</guid>
            <pubDate>Mon, 09 Sep 2024 08:11:38 GMT</pubDate>
            <description><![CDATA[<h2 id="의미">의미</h2>
<ul>
<li>DBMS에서 아직 정해지지 않은 값을 의미</li>
<li>0과 빈 문자열(’ ‘)과는 다른 개념</li>
<li>모델 설계 시 각 컬럼 별로 NULL을 허용할 지를 결정함</li>
</ul>
<h2 id="특성">특성</h2>
<ol>
<li><strong>NULL을 포함한 연산결과는 항상 NULL</strong></li>
</ol>
<p>→ 컬럼에 공백으로 보이는 것은 NULL로 생각해야 함 . 이 때, NULL을 포함한 연산결과는 NULL이 리턴됨(NULL을 사전 치환하면 연산 가능)</p>
<ol>
<li><strong>집계함수는 NULL을 제외한 연산 결과 리턴</strong></li>
</ol>
<p>→ SUM, AVG, MIN, MAX 등의 함수는 항상 NULL을 무시함. NULL일 경우 제외되고 NOT NULL인 행만 세어서 리턴함</p>
<p>*** 출제</p>
<p>ISNULL함수는 결과값이 NULL일 경우 지정된 값을 반환한다. </p>
<p>칼럼의 NULL값을 확인할 때는 ISNULL을 사용해야 한다.</p>
<p>SELECT COUNT(COL1) FROM TAB1 WHERE COL2 = NULL  --&gt; 이 WHERE절은 잘못되어있다.</p>
<p>NULL 비교는 오직 IS NULL, IS NOT NULL로만 가능</p>
<p>NULL의 ERD 표기법과 바커 표기
<img src="https://velog.velcdn.com/images/yeunever_/post/bbcd411d-bd21-458b-80a9-1da62999add9/image.png" alt=""></p>
<h1 id="null-관련-함수">NULL 관련 함수</h1>
<h3 id="nvl표현식1-표현식2---oracle---isnull표현식1-표현식1---sql-server">NVL(표현식1, 표현식2) - ORACLE ,  ISNULL(표현식1, 표현식1) - SQL Server</h3>
<ul>
<li>표현식 1의 결과값이 null이면 표현식 2의 값을 출력한다.</li>
<li>단, 표현식 1과 표현식2의 데이터 타입이 같아야 한다.</li>
<li>null 관련 가장 많이 사용되는 함수이다.
<img src="https://velog.velcdn.com/images/yeunever_/post/7ba0969e-dd6f-4004-8a7c-f5ab542386b1/image.png" alt=""></li>
</ul>
<p>NVL 함수는 칼럼의 값이 NULL인 경우 특정 값으로 치환하기 위해서 사용한다.</p>
<p>NVL2 함수는 칼럼의 값이 NULL인 경우와 NULL이 아닌 경우 두 가지 케이스 모두 특정 값을 반환할 수 있다.</p>
<p>NVL 함수는 NULL인 경우 단순 기본값을 부여하기 위해서 자주 사용하며, NVL2 함수는 NULL을 기준으로 If ~ else ~와 같이 판단하여 특정 값을 반환할 수 있다.</p>
<h3 id="nvl2값-지정값1-지정값2"><strong>NVL2(</strong>&quot;값&quot;, &quot;지정값1&quot;, &quot;지정값2&quot;<strong>)</strong></h3>
<p>NVL2 함수는 NULL이 아닌 경우 지정값1을  출력하고, NULL인 경우 지정값2를 출력한다.</p>
<ul>
<li>함수 : <strong>NVL2(</strong>&quot;값&quot;, &quot;지정값1&quot;, &quot;지정값2&quot;<strong>)</strong> // <strong>NVL2(</strong>&quot;값&quot;, &quot;NOT NULL&quot;, &quot;NULL&quot;<strong>)</strong></li>
</ul>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/81efd2ec-ad24-4c0d-ac38-e5ac8b2d3f28/image.png" alt=""></p>
<h3 id="nullif표현식1-표현식2">NULLIF(표현식1, 표현식2)</h3>
<ul>
<li>표현식1과 표현식2가 같으면 NULL을 같지 않으면 표현식 1을 리턴한다.
ex) SELECT ENAME, EMPNO, MGR, NULLIF(MGR, 7698) AS NM FROM EMP;
<img src="https://velog.velcdn.com/images/yeunever_/post/f88e8b6a-4694-46a3-9e0c-2345f46a2684/image.png" alt=""></li>
</ul>
<h3 id="coalesce-표현식1-표현식2">COALESCE (표현식1, 표현식2,...)</h3>
<ul>
<li>임의의 개수 표현식에서 NULL이 아닌 최초의 표현식을 나타낸다.</li>
<li>모든 표현식이 NULL이면 NULL을 리턴한다.
<img src="https://velog.velcdn.com/images/yeunever_/post/9b00dce6-27fd-4bf2-afd4-1bb9828d20ca/image.png" alt=""></li>
</ul>
<h3 id="decode표현식1-표현식2-표현식3-null">DECODE(표현식1, 표현식2, 표현식3, NULL)</h3>
<p>표현식1 = 표현식2 → 표현식3 , 아니면 NULL</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQLD 1과목 [2장 데이터 모델과 SQL]]]></title>
            <link>https://velog.io/@yeunever_/SQLD-1%EA%B3%BC%EB%AA%A9-2%EC%9E%A5-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EA%B3%BC-SQL</link>
            <guid>https://velog.io/@yeunever_/SQLD-1%EA%B3%BC%EB%AA%A9-2%EC%9E%A5-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EA%B3%BC-SQL</guid>
            <pubDate>Mon, 09 Sep 2024 08:05:42 GMT</pubDate>
            <description><![CDATA[<h3 id="성능-데이터-모델링의-개요">성능 데이터 모델링의 개요</h3>
<ol>
<li><strong>성능 데이터 모델링</strong>의 정의<ul>
<li>성능 저하의 원인 중 하나는 데이터 모델링의 근복적인 디자인이 잘못되어 있는 경우도 많다</li>
<li>따라서 성능 데이터 모델링을 통해 성능향상을 도모해야한다</li>
<li>성능 데이터 모델링이란?<ul>
<li>데이터베이스 성능향상을 목적으로 설계단계의 데이터모델링 때부터 성능과 관련된 사항이 모델링에 반영될 수 있도록 하는 것</li>
</ul>
</li>
</ul>
</li>
<li>성능 데이터 모델링 수행시점<ul>
<li>사전에 성능 모델링을 할수록 성능 향상을 위한 비용은 적게 든다</li>
<li>분석/설계 단계에서 성능을 고려해 데이터 모델링을 수행할 경우 재업무 비용을 최소화할 수 있다</li>
<li>따라서 분석/설계 단계에서 처리성능을 향상시킬 방법을 고려해야한다</li>
</ul>
</li>
<li>성능 데이터 모델링 고려사항<ul>
<li><strong>성능 데이터 모델링 프로세스</strong><ul>
<li><strong>정규화</strong> → 정규화가 1등</li>
<li>DB <strong>용량 산정</strong></li>
<li><strong>트랜잭션의 유형 파악 → 테이블 수직 분할 할 때(반정규화)</strong></li>
<li>용량과 트랜잭션의 유형에 따라 <strong>반정규화</strong></li>
<li>이력모델 조정, PK/FK 조정, 슈퍼타입/서브타입 <strong>조정</strong></li>
<li>성능관점에서 데이터 모델을 <strong>검증</strong></li>
</ul>
</li>
</ul>
</li>
</ol>
<h1 id="정규화">정규화</h1>
<h3 id="정규화란">정규화란?</h3>
<p>: 엔티티를 작은 단위로 분리하는 과정</p>
<p>→ 큰 엔티티를 작은 엔티티들로 분리하고 관계 맺음</p>
<p>: <strong>논리 데이터 모델에서 행하는 과정</strong>이다.(개념 모델링 X, 물리 모델링 X)</p>
<p><strong>정규화의 특징 및 하는 이유와 개념 = 장점</strong></p>
<ul>
<li>데이터의 무결성을 위해 수행</li>
<li>최소한의 데이터만을 하나의 엔티티에 넣는 과정, 데이터 분해 과정</li>
<li>데이터 일관성 확보</li>
<li>데이터 독립성 확보 → 데이터 중복 제거</li>
<li>데이터 유언성 확보 → 필요 데이터들의 분할로 인해 유연하게 접근 가능</li>
<li><strong>입력, 수정, 삭제 성능은 일반적으로 향상</strong><ul>
<li>→ 조회 성능이 저하 될 수 있음</li>
</ul>
</li>
</ul>
<hr>
<p><strong>정규화의 단점</strong></p>
<ul>
<li>엔티티 갯수 증가</li>
<li>이로 인한 관계 증가</li>
<li>데이터 조회 시 여러번의 조인이 요구</li>
<li><strong>조회 성능의 저하</strong><ul>
<li>식별자, 비식별자랑 헷갈리지말자 → 식별자 = join 최소화</li>
</ul>
</li>
</ul>
<hr>
<h3 id="정규화의-종류">정규화의 종류</h3>
<p>각 정규화를 통해 이루어지는 행위가 있는데</p>
<p>이 행위를 만족하는 엔티티 구조는</p>
<p>제 1 정규형 릴레이션</p>
<p>제 2 정규형 릴레이션</p>
<p>제 3 정규형 릴레이션 이라고 칭한다.</p>
<h3 id="제-1-정규화">제 1 정규화</h3>
<p>: 테이블 칼럼들이 원자성(특성의 중복을 방지) 갖게 하기 위해 엔티티 분해</p>
<p>→ 하나의 인스턴스가 비슷한 속성을 여러개 가지지 않게 하기 위해 분리하는 것</p>
<h3 id="제-2-정규화">제 2 정규화</h3>
<p>: 엔티티의 모든 일반 속성은 반드시 주 식별자의 모든 속성들에</p>
<p>‘부분 종속’이 아닌 ‘완전 종속’을 가져야한다.</p>
<p>이 때 만약 ‘부분 종속’을 가지는 일반 속성이 있다면 해당 속성과 해당 속성의 결정자인 부분 종속을 이루고 있는 주 식별자의 속성을 따로 떼어내 추가적인 엔티티를 만들어 제 2 정규형을 만족하는 릴레이션을 구축하는 것</p>
<p>: 또는 주 식별자의 속성이 아닌 일반 속성 끼리 종속 관계를 맺어도 이에 대해 해당 일반 속성이 새로운 엔티티에서 제 2 정규성을 만족하도록 엔티티를 추가적으로 만들어준다.</p>
<p>ex) 엔티티 1에서 일반속성A→일반속성B 이면</p>
<p>일반속성 B는 엔티티 1에서 제거하고 A는 엔티티 1에 남겨둔 채로</p>
<p>엔티티 2를 만들고 일반속성 B를 엔티티 2의 일반속성으로 엔티티 1의 일반속성 A를 FK로 사용하여 엔티티 2의 주식별자 로서 엔티티를 구축하고 릴레이션을 유지하게하는 것 </p>
<h3 id="제-3-정규화">제 3 정규화</h3>
<p>: 정규화된 엔티티의 일반 속성들은 주 식별자에만 함수적 종속을 가져야한다.</p>
<p>그런데 만약 주 식별자의 속성들끼리 종속 관계를 가지고 그 이후에 또 일반 속성에 대해 결정자가 되던지 일반 속성끼리 종속성을 가지는데 이 때의 결정자가 주 식별자 속성에 종속되어있는등</p>
<p>A → B, B → C 와 같은 이행적 종속 을 이루는 TABLE(엔티티) 일 때</p>
<p>이러한 ‘이행적 종속’을 깨도록 추가적인 엔티티를 만들고 관계를 형성해주는 것이</p>
<p>제 3 정규화 이다.</p>
<h3 id="bcnf-정규화">BCNF 정규화</h3>
<pre><code>: **모든 결정자가 후보키가 되도록 테이블을 분해**하는 것

→ 후보키 : 식별자의 ‘유일성’, ‘최소성’ 을 만족하는 속성 집합(or 단일 속성)</code></pre><h3 id="제-4-정규화">제 4 정규화</h3>
<pre><code>: 여러 칼럼이 하나의 칼럼 종속시킬 때 분해해서 ‘**다중값 종속성’ 제거**    </code></pre><h3 id="제-5-정규">제 5 정규</h3>
<pre><code>: **조인에 의해 새로운 종속성 발생** 시 이를 막기 위해 엔티티 재 분해</code></pre><h1 id="관계와-조인의-이해">관계와 조인의 이해</h1>
<h3 id="관계란">관계란?</h3>
<p>: 부모 엔티티의 식별자를 자식에 상속하고, <strong>상속된 속성</strong>을 <strong>매핑키(조인키)</strong>로 활용</p>
<p><strong>관계의 분류</strong></p>
<ul>
<li>존재 관계</li>
<li>행위 관계</li>
</ul>
<hr>
<h3 id="조인이란">조인이란?</h3>
<p>: 데이터 중복을 피하기 위해 테이블은 정규화에 의해 분리</p>
<p>→ 이렇게 분리된 테이블을 동시에 출력하거나 관계가 있는 테이블 참조 위해서는 테이블 연결</p>
<p>→ 이 때 이러한 연결 과정을 JOIN 이라 칭한다.</p>
<hr>
<h3 id="계층형-데이터-모델">계층형 데이터 모델</h3>
<p>: 하나의 엔티티 내에서 인스턴스 끼리 계층 구조를 가지는 경우</p>
<p>→ 계층 구조를 갖는 인스턴스끼리 연결하는 조인을 셀프 조인이라 한다.</p>
<p>(같은 테이블 내에서 여러 번 조인 되는 것)</p>
<p>ex) 인스턴스 A를 긁었는데 그 안에 속성 B에 대한 값이 해당 엔티티 내의 다른 인스턴스에 있는 값이여서 이들을 두 속성을 같이 SELECT 하고, WHERE &amp; AND로 조건 먹인다음 긁어낼 때 두 SELECT에 의해 하나의 엔티티 내에서 여러번 조인이 발생</p>
<hr>
<h3 id="상호배타적-관계">상호배타적 관계</h3>
<p>: 하나의 부모가 2개의 자식 엔티티를 가질 때 행위 조건에 따라 두 자식 중 하나의 자식만 관계를 가질 수 있는 것을 상호배타적 관계라 칭한다.</p>
<ul>
<li>두 테이블 중 하나만 가능한 관계를 말함
ex) 주문 엔터티에는 개인 또는 법인번호 둘 중 하나만 상속될 수 있음 =&gt; 상호배타적 관계
즉, 주문은 개인고객이거나 법인고객 둘 중 하나의 고객만이 가능
<img src="https://velog.velcdn.com/images/yeunever_/post/3202be29-4c45-4d4b-a6a6-0f59eb844d27/image.png" alt=""><h1 id="모델이-표현하는-트랜잭션의-이해">모델이 표현하는 트랜잭션의 이해</h1>
</li>
</ul>
<h2 id="트랜잭션의-특징">트랜잭션의 특징</h2>
<ul>
<li><p><strong>하나의 연속적인 업무 단위를 뜻함</strong></p>
</li>
<li><p>트랜잭션에 묶인 엔티티들은 <strong>‘필수적 관계’</strong> 가짐</p>
</li>
<li><p>하나의 트랜잭션에 속한 동작들은 모두 성공하거나, 모두 취소(UNDO)되어야한다.</p>
<p>  → 트랜잭션의 ‘원자성’</p>
</li>
<li><p>서로 독립적으로 업무가 발생하면 안됨, 순차적으로 함께</p>
</li>
<li><p>부분 커밋 불가, 동시 커밋&amp;롤백</p>
</li>
</ul>
<p>● 필수적, 선택적 관계와 ERD</p>
<ul>
<li>두 엔터티의 관계가 서로 필수적일 때 하나의 트랜잭션을 형성</li>
<li>두 엔터티가 서로 독립적 수행이 가능하다면 선택적 관계로 표현</li>
</ul>
<p><strong>IE 표기법)</strong></p>
<ul>
<li><strong>원을 사용</strong>하여 필수적 관계와 선택적 관계를 구분</li>
<li>필수적 관계에는 <strong>원을 그리지 않는다.</strong></li>
<li>선택적 관계에는 관계선 끝에 <strong>원을 그린다.</strong></li>
</ul>
<p><strong>바커표기법)</strong></p>
<ul>
<li><strong>실선과 점선으로 구분</strong></li>
<li>필수적 관계는 관계선을 <strong>실선</strong>으로 표기</li>
<li>선택적 관계는 관계선을 <strong>점선</strong>으로 표기
<img src="https://velog.velcdn.com/images/yeunever_/post/1cc0be52-e182-41b9-a949-a87c095cad16/image.png" alt=""><h1 id="본질-식별자와-인조-식별자">본질 식별자와 인조 식별자</h1>
</li>
</ul>
<p><strong>원조(본질) 식별자</strong>
: 업무에 의해 만들어지는 식별자(꼭 필요한 식별자)</p>
<p><strong>인조(대리) 식별자</strong>
: 원조 식별자가 PK 2개 이상인 복합 식별자 일 때 
속성들을 하나의 속성으로 묶어서 사용하면 이것이 인조 식별자
: 꼭 필요하진 않지만 편의성을 위해 인위적으로 만들어지는 것</p>
<p><strong>인조 식별자의 단점</strong></p>
<ul>
<li><strong>중복 데이터 발생 가능성</strong> → 데이터 품질 저하</li>
<li><strong>불필요한 인덱스 생성</strong> → 저장 공간 낭비 및 DML 성능 저하</li>
<li><strong>개발 편의성이 줄어들 수 있음</strong></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQLD 1과목 [1장 데이터 모델링의 이해]]]></title>
            <link>https://velog.io/@yeunever_/1%EA%B3%BC%EB%AA%A9-1%EC%9E%A5-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81%EC%9D%98-%EC%9D%B4%ED%95%B4</link>
            <guid>https://velog.io/@yeunever_/1%EA%B3%BC%EB%AA%A9-1%EC%9E%A5-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81%EC%9D%98-%EC%9D%B4%ED%95%B4</guid>
            <pubDate>Mon, 09 Sep 2024 07:58:50 GMT</pubDate>
            <description><![CDATA[<h1 id="1-데이터-모델링의-이해">1. 데이터 모델링의 이해</h1>
<h2 id="데이터-모델">데이터 모델</h2>
<ul>
<li>데이터 모델링은 현실 세계를 데이터베이스로 표현하기 위해서 추상화 한다.</li>
<li>데이터 모델링을 하기 위해서는 고객과의 의사소통을 통해 고객의 업무프로세스를 이해해야 한다.</li>
<li>고객의 업무 프로세스를 이해한 후 데이터 모델링 표기법을 사용해서 모델링을 한다.</li>
<li>데이터 모델링은 고객이 쉽게 이해할 수 있도록 복잡하지 않게 모델링 해야 한다.</li>
<li>데이터 모델링은 고객의 업무 프로세스를 추상화하고, 소프트웨어를 분석, 설계하면서 점점 더 상세해진다.</li>
<li>데이터 모델링은 고객의 비즈니스 프로세스를 이해하고 비즈니스 프로세스의 규칙을 정의
정의된 비즈니스 규칙을 데이터 모델로 표현</li>
<li>데이터 모델링 자체로서 업무의 흐름을 설명(별도의 표기 필요없음)하고 분석하는 부분에 의미를 가짐.</li>
<li>분석된 모델을 가지고 데이터베이스 생성하여 개발 및 데이터관리에 사용하기 위함</li>
</ul>
<h3 id="데이터-모델링-유의점-및-3가지-관점-및-중요-3요소">데이터 모델링 유의점 및 3가지 관점 및 중요 3요소</h3>
<p><strong>유의점</strong></p>
<ul>
<li><p><strong>중복(Duplication)</strong></p>
<p>  : 같은 데이터가 엔티티에 중복 저장되면 안된다.</p>
</li>
<li><p><strong>비유연성(Inflexibility)</strong></p>
<p>  : 애플리케이션의 ‘<strong>사소한 변경</strong>’에도 데이터 모델이 수시로 변경되면 안된다.</p>
<p>  → <strong>데이터 모델과 프로세스 분리</strong>해서 유연성 높여야한다.</p>
</li>
<li><p><strong>비일관성(Inconsistency)</strong></p>
<p>  : 중복이 없는 경우에도 비일관성 발생 가능성 있음</p>
<p>  → 데이터 간의 <strong>연관 관계에 대해 명확</strong>하게 정의</p>
</li>
</ul>
<p><strong>관점</strong></p>
<ul>
<li><p><strong>데이터 관점 (What, Data)</strong></p>
<p>  : 어떤 데이터들이 업무와 얽혀있는지</p>
</li>
<li><p><strong>프로세스 관점 (How, Process)</strong></p>
<p>  : 업무가 실제로 처리하고 있는 일이 무엇인지</p>
</li>
<li><p><strong>데이터와 프로세스의 상관 관점 (Data vs Process, Intercation)</strong></p>
<p>  : 프로세스 흐름에 따라 데이터가 어떤 영향을 받는지</p>
</li>
</ul>
<p><strong>중요 요소</strong></p>
<ul>
<li>Things : 대상(Entity)</li>
<li>Attribute : 속성</li>
<li>Relationships : 관계</li>
</ul>
<h2 id="데이터-모델링의-특징">데이터 모델링의 특징</h2>
<ul>
<li>데이터 모델링은 <strong>추상화</strong> 해야 한다. → 추상화는 공통적인 특징을 찾고 간략하게 표현한다.</li>
<li>데이터 모델링은 <strong>단순화</strong> 해야 한다. → 복잡한 문제를 피하고 누구나 이해할 수 있게 표현한다.</li>
<li>데이터 모델링은 <strong>명확</strong>해야 한다. → 의미적 해석이 모호하지 않고 명확하게 해석 되어야 한다.</li>
</ul>
<h2 id="데이터-모델링의-종류">데이터 모델링의 종류</h2>
<h3 id="①-개념적-모델링conceptual-data-modeling">① 개념적 모델링(Conceptual Data Modeling)</h3>
<ul>
<li>고객의 비즈니스 프로세스를 분석하고 업무 전체에 대해서 <strong>업무 중심적</strong>이고 <strong>포괄적</strong>인 수준의 데이터 모델링을 정한다.</li>
<li>복잡하게 표현하지 않고 중요한 부분을 위주로 모델링하는 단계</li>
<li>업무적 관점에서 모델링하며 기술적인 용어는 가급적 사용하지 않는다.</li>
<li><strong>추상화 수준이 가장 높은</strong> 수준의 모델</li>
<li>엔터티(Entity)와 속성(Attribute)을 도출하고 개념적 ERD(Entity Relationship fingar)를 작성한다.
(엔터티란 실체, 객체라는 의미. 즉 업무에 필요하고 유용한 정보를 저장하고 관리하기 위한 집합적인 것)
(사람, 장소, 물건, 사건, 개념 등의 명사에 해당, 업무상 관리가 필요한 관심사에 해당한다.</li>
</ul>
<h3 id="②-논리적-모델링logical-data-modeling">② 논리적 모델링(Logical Data Modeling)</h3>
<ul>
<li>개념적 모델링을 논리적 모델링으로 변환하는 작업으로 특정 데이터베이스 모델에 종속한다.</li>
<li>식별자를 도출하고 필요한 모든 관계, 속성 등을 정의한다.</li>
<li>정규화를 수행해서 데이터 모델의 독립성을 확보하고 <strong>재사용성</strong>을 높인다.</li>
<li>정규화의 기본 목표는 테이블 간에 중복된 데이터를 허용하지 않는다는 것이다.</li>
<li>중복된 데이터를 허용하지 않음으로써 무결성(Integrity)를 유지할 수 있으며, DB의 저장 용량 역시 줄일 수 있다.</li>
<li>M:N 관계형 식별자 확정, 정규화, 무결성 정의 등을 수행</li>
<li>비즈니스 정보의 논리적 구조 및 구축을 파악</li>
</ul>
<h3 id="③-물리적-모델링physical-modeling">③ 물리적 모델링(Physical Modeling)</h3>
<ul>
<li>데이터베이스를 실제 구축하는 단계. 즉, 테이블, 인덱스, 함수 등을 생성하는 단계</li>
<li>성능, 보안, 가용성을 고려해서 데이터베이스를 구축</li>
<li>데이터베이스 이식</li>
</ul>
<h3 id="데이터-모델링의-관점">데이터 모델링의 관점</h3>
<p>데이터 관점, 프로세스 관점, 데이터와 프로세스 관점
<img src="https://velog.velcdn.com/images/yeunever_/post/4823f242-1ea9-40d5-a161-b6f3eeaf908d/image.png" alt=""></p>
<h3 id="외부-스키마">외부 스키마</h3>
<ul>
<li>사용자 관점, 업무상 관련 있는 데이터 접근(권한 설정), 사용자가 보는 개인적 DB 스키마</li>
<li>관련 데이터베이스의 일부를 표시. 뷰(View)를 표시</li>
<li>응용 프로그램이 접근하는 데이터베이스를 정의</li>
</ul>
<h3 id="개념-스키마">개념 스키마</h3>
<ul>
<li>설계자 관점, 사용자 전체 관점을 통합한 전체 데이터베이스 구조</li>
<li>전체 데이터베이스 내의 규칙과 구조를 표현</li>
<li>통합 데이터베이스 구조</li>
</ul>
<h3 id="내부-스키마">내부 스키마</h3>
<ul>
<li>개발자 관점, 데이터베이스의 물리적 저장 구조</li>
<li>데이터 저장 구조, 레코드 구조, 필드 정의, 인덱스 등을 의미</li>
<li>운영체제와 하드웨어에 종속적</li>
</ul>
<p>논리적 독립성 : 개념 스키마가 변경되도 외부 스키마가 영향 받지 않음</p>
<p>물리적 독립성 : 내부 스키마가 변경되도 개념 스키마가 영향 받지 않음</p>
<h2 id="erd-표기법">ERD 표기법</h2>
<p>1976년 피터첸(Peter Chen)에 의해 Entity-Relationship Model(E-R Model)이라는 표기법이 만들어졌다.
<img src="https://velog.velcdn.com/images/yeunever_/post/b9795393-ecbf-44d8-b37f-5b47d40965c1/image.png" alt=""></p>
<h2 id="erd-작성순서">ERD 작성순서</h2>
<ol>
<li>엔티티 그리기</li>
<li>엔티티를 적절하게 배치하기</li>
<li>엔티티 간 관계 설정하기</li>
<li>관계명 기술하기(❉ 관계 명칭은 관계 표현에 있어 매우 중요한 부분에 해당됨)</li>
<li>관계의 참여도 기술하기</li>
<li>관계의 필수여부 기술하기</li>
</ol>
<h1 id="2-엔터티">2. 엔터티</h1>
<h2 id="엔터티의-개념">엔터티의 개념</h2>
<p>엔터티 : 데이터베이스의 구성요소 중 독립적으로 식별 가능한 객체</p>
<h2 id="엔터티-특징">엔터티 특징</h2>
<ul>
<li>유일한 식별자에 의해 식별 가능해야 한다. (EX. 성별 같은 식별자는 중복성이 커서 불가능함)</li>
<li>영속적으로 존재하는 인스턴스의 집합이어야한다.(한 개가 아니라 두 개 이상)</li>
<li>엔터티는 반드시 업무 프로세스에 의해 이용된다.</li>
<li>반드시 속성을 가져야 한다. 그리고 1개의 엔터티는 무조건 2개 이상의 속성을 가진다.</li>
<li>엔터티는 다른 엔터티와 최소한 1개 이상의 관계를 맺는다.</li>
<li>엔터티 명은 약어를 지양해야 한다.</li>
</ul>
<p><strong>** 빈출유형 **</strong></p>
<ul>
<li>엔터티를 그린다(혹은 도출한다).</li>
<li>엔터티를 적절하게 배치한다.</li>
<li>엔터티간 관계를 설정한다.</li>
<li>관계명을 기술한다.</li>
<li>관계의 참여도를 기술한다.</li>
<li>관계의 필수여부를 기술한다.</li>
</ul>
<h3 id="엔티티-명명-규칙">엔티티 명명 규칙</h3>
<ol>
<li>가능하면 현업 업무에서 사용하는 용어 사용하기</li>
<li>가능하면 약어 사용하지 않기</li>
<li>단수 명사 사용</li>
<li>모든 엔티티에서 유일한 이름 부여하기</li>
<li>엔티티가 생성되는 의미대로 이름을 자연스럽게 부여하기</li>
</ol>
<h2 id="엔터티의-분류과-그에-따른-종류">엔터티의 분류<strong>과 그에 따른 종류</strong></h2>
<p><strong>유형, 무형에 따른 분류 → 개사유~ 계셔유~</strong></p>
<ul>
<li><strong>유형</strong> 엔티티 : 모델링 대상이 <strong>물리적인 형태가 존재</strong> ex) 상품, 회원</li>
<li><strong>개념</strong> 엔티티 : 모델링 대상이 <strong>형태 없음</strong> ex) 부서, 학과</li>
<li><strong>사건</strong> 엔티티 : 모델링 대상이 <strong>행위로 인해 발생</strong>하는 것 ex) 주문, 이벤트 응모</li>
</ul>
<p><strong>발생 시점에 따른 분류 → 행기중 !</strong></p>
<ul>
<li><strong>기본</strong> 엔티티ex) 상품, 회원, 부서</li>
<li>: 모델링 대상이 업무에 대해 <strong>원래 존재하는 요소</strong> → 독립적, 자식 엔티티 가질 수 있음</li>
<li><strong>중심</strong> 엔티티ex) 주문, 매출, 계약</li>
<li>: 모델링 대상의 <strong>업무 과정 중 하나</strong>, <strong>기본 엔티티로부터 파생, 행위 엔티티 생성</strong></li>
<li><strong>행위</strong> 엔티티ex) 주문 내역, 이벤트 응모 이력 등</li>
<li>: <strong>2개 이상의 엔티티로부터 파생</strong></li>
</ul>
<h3 id="인스턴스">인스턴스</h3>
<p>인스턴스는 데이터베이스에 저장된 데이터 내용의 전체 집합을 의미한다.</p>
<ul>
<li>스키마에 대한 실제 데이터, 테이블의 각 행ㅇㄹ 의미</li>
<li>시간에 따라 자주 변경이 이루어짐</li>
<li>인스턴스의 집합 : 데이터베이스 상태</li>
<li>주어진 시점에서 데이터베이스에 있는 데이터의 스냅 샷
<img src="https://velog.velcdn.com/images/yeunever_/post/2c3ac623-4574-4479-9468-f743ddcb7345/image.png" alt="">
<img src="https://velog.velcdn.com/images/yeunever_/post/c45d842f-0722-42c9-8ed4-ed3d8efa2d98/image.png" alt=""><h1 id="3-속성">3. 속성</h1>
</li>
</ul>
<h2 id="속성이란-">속성이란 ?</h2>
<ul>
<li><p>어떤 사물 또는 개념에 없어서는 안 될 징표의 전부(사전적 정의)</p>
</li>
<li><p>업무에서 필요로 하는 인스턴스로 관리하고자 하는 의미상 더 이상 분리되지 않는 최소의 데이터 단위(모델링 관점의 정의)
<img src="https://velog.velcdn.com/images/yeunever_/post/8e03a75d-7f93-482a-b5c2-1c9fc3d8f079/image.png" alt=""></p>
</li>
<li><p><strong>* 빈출개념 ***</strong></p>
</li>
<li><p>한 개의 속성은 반드시 한 개의 속성값만을 가집니다.</p>
</li>
<li><p>한 개의 엔터티는 최소 2개 이상의 속성을 가집니다.</p>
</li>
<li><p>한 개의 엔터티는 최소 1개 이상의 다른 엔터티와의 관계를 가집니다.</p>
</li>
<li><p>한 개의 엔터티는 최소 2개 이상의 인스턴스 집합이어야 한다.</p>
</li>
</ul>
<h2 id="속성의-특징">속성의 특징</h2>
<ul>
<li>엔터티와 마찬가지로 반드시 해당 업무에서 필요하고 관리하고자 하는 정보이어야 한다.</li>
<li>정규화 이론에 근간하여 <strong>정해진 주식별자에 함수적 종속성</strong>을 가져야 한다.</li>
<li>하나의 속성에는 한 개의 값만을 가진다. 하나의 속성에 여러 개의 값이 있는 다중값일 경우 별도의 엔터티를 이용하여 분리한다.</li>
</ul>
<h2 id="속성의-분류">속성의 분류</h2>
<ul>
<li>속성의 특징에 따라<ul>
<li>기본속성 : 업무상 필요한 데이터에 대해 정의</li>
<li>설계속성 : 업무를 규칙화하기 위해 새로 만들거나 변형한 속성</li>
<li>파생속성 : 다른 속성의 영향을 받아 발생. 주로 계산하는 값들이 이에 해당.</li>
</ul>
</li>
</ul>
<p><strong>속성 명칭 부여할 때 유의할 점</strong></p>
<p>1) 해당업무에서 사용하는 이름을 부여 한다. </p>
<p>2) 서술식 속성명은 사용하지 않는다. </p>
<p>3) 약어사용은 가급적 지양한다.</p>
<p>4) 유일성을 통해 구분할 수 있도록 하자.</p>
<p><strong>함수적 종속성</strong></p>
<ul>
<li>한 속성의 값이 다른 속성의 값에 종속적인 관계를 갖는 특징을 말함</li>
<li>즉, 어떤 속성 A 의 값에 의해 다른 속성 B 도 유일하게 결정된다면, B 는 A 에 함수적으로로 종속됐다 하고,</li>
<li>이를 수식으로 나타내면 A → B 라고 표현함</li>
</ul>
<p>1) 완전 함수적 종속</p>
<ul>
<li><p>특정 컬럼이 기본키에 대해 완전히 종속될 때를 말함</p>
</li>
<li><p>PK 를 구성하는 컬럼이 2 개 이상일 경우 PK 값 모두에 의한 종속관계를 나타낼 때 완전 함수 종속성 만족
2) 부분 함수적 종속</p>
</li>
<li><p>기본키 전체가 아니라, 기본키 일부에 종속될 때를 말함</p>
<h2 id="도메인">도메인</h2>
</li>
</ul>
<p>각각의 속성이 가질 수 있는 값의 범위</p>
<p>ex) 주문이라는 엔터티가 있을 때 단가라는 속성 값의 범위는 100 ~ 10000 사이의 실수 값이며 제품명이라는 속성은 길이가 20자리 이내의 문자열로 정의가 가능하다.</p>
<p><strong>&#39;</strong>범위&#39; 가 언급되면 도메인에 대한 이야기입니다.</p>
<h1 id="4-관계">4. 관계</h1>
<h2 id="관계란-">관계란 ?</h2>
<p>ERD에서 관계를 연결할 때는 따로 구분하지 않고 단일화된 표기법으로 통일해서 사용한다.</p>
<h2 id="관계의-종류">관계의 종류</h2>
<ul>
<li>존재적 관계 : 존재 자체로 서로 연관성을 갖는 관계</li>
</ul>
<p>ex) 부서와 사원의 관계는 존재에 의한 관계</p>
<ul>
<li>행위적 관계 : 한 엔터티가 특정 행위나 이벤트를 일으킨 경</li>
</ul>
<p>ex) 고객과 주문의 관계는 행위에 의한 관계 -&gt; 고객이 제품을 &#39;주문&#39;한다는 개념이므로</p>
<p><strong>두 개의 엔터티 사이에서 관계를 도출할 때 체크할 사항</strong></p>
<ol>
<li>두 개의 엔터티 사이에 관심있는 연관규칙이 존재하는가 ?</li>
<li>두 개의 엔터티 사이에 정보의 조합이 발생되는가 ?</li>
<li>업무기술서, 장표에 관계 연결에 대한 규칙이 서술되어 있는가 ?</li>
<li>업무기술서, 장표에 관계 연결을 가능하게 하는 동사(Verb)가 있는가 ?</li>
</ol>
<p><strong>관계차수</strong>
1:1 , 1:M , M:N 으로만 있음. 그 이외의 것은 틀린 말.</p>
<p><strong>관계선택사양</strong>
필수관계인지 선택관계인지</p>
<p><strong>UML의 클래스다이어그램에 의해 나뉘는 종류</strong></p>
<ul>
<li><p><strong>연관</strong> 관계</p>
<p>  : 필수적 관계(존재적 관계, 식별자 관계) - 항상 서로 이용(실선)</p>
<p>  : <strong>멤버 변수로 선언</strong></p>
</li>
<li><p><strong>의존</strong> 관계</p>
<p>  : 선택전 관계(비식별자 관계) - 상대 클래스 행위에 따라 이용(점선)</p>
<p>  : <strong>행위 코드 오퍼레이션에서 파라미터로 사용</strong></p>
</li>
</ul>
<p><strong>관계의 페어링</strong></p>
<ul>
<li>엔터티 안에 인스턴스가 개별적으로 관계를 가지는 것</li>
<li>관계란 페이링의 집합을 의미함</li>
</ul>
<p><strong>관계와 차수, 페어링 차이</strong></p>
<ul>
<li>학생과 강의 엔터티는 관계를 가짐</li>
<li>한 학생은 여러 강의를 수강할 수 있고, 한 강의도 여러 학생에게 수강될 수 있으므로 M 대 N 관계이며, 이 때 차수는 M:N 가 됨</li>
<li>인스턴스의 관계를 보면 &quot;학생 A 가 강의 B 를 2023 년 1 학기에 수강했고 성적은 &#39;A+&#39;를 받았다&quot;와 같은 특정한 페어링이 형성</li>
<li>이런식으로 관계의 <strong>차수</strong>는 하나의 엔터티와 다른 엔터티 간의 레코드 연결 방식을 나타내는 반면, <strong>관계의 페어링</strong>은 두 엔터티 간의 특정 연결을 설명하고 추가 정보를 제공하는 용도로 사용.</li>
</ul>
<h1 id="5-식별자">5. 식별자</h1>
<h2 id="식별자란-"><strong>식별자란 ?</strong></h2>
<p>엔터티를 대표할 수 있는 유일성을 만족하는 속성</p>
<p>하나의 엔티티는 반드시 하나의 유일한 식별자가 존재해야 한다.</p>
<h2 id="식별자의-특징">식별자의 특징</h2>
<ul>
<li>유일성 - 주식별자에 의해 엔터티내에 모든 인스턴스들이 유일하게 구분되어야 한다.</li>
<li>최소성 - 주식별자를 구성하는 속성의 수는 유일성을 만족하는 최소의 수가 되어야 한다.</li>
<li>불변성 - 지정된 주식별자의 값은 자주 변하지 않는 것이어야 한다.</li>
<li>존재성 - 주식별자가 지정이 되면 반드시 값이 들어와야 한다.</li>
</ul>
<h2 id="식별자의-종류">식별자의 종류</h2>
<p> ◾대표성에 따라</p>
<ul>
<li><em>주 식별자(Primary identifier) :</em> 대표성을 만족하는 식별자로 다른 엔터티와 참조관계를 연결 할 수 있다.</li>
<li><em>보조 식별자(Alternate identifier) :</em> 대표성을 가지지 못해 참조관계 연결 할 수 없다. 즉 유일성과 최소성만 만족하는 식별자</li>
</ul>
<p><strong>주식별자 도출기준</strong></p>
<ul>
<li><p>해당 업무에서 자주 이용되는 속성을 주식별자로 지정한다.</p>
</li>
<li><p>명칭, 내역 등과 같이 이름으로 기술되는 것들은 가능하면 주식별자로 지정하지 않는다.</p>
</li>
<li><p>복합으로 주식별자로 구성할 경우 너무 많은 속성이 포함되지 않도록 한다.</p>
<ul>
<li>주식별자로 선정하기 위한 속성이 복합으로 구성되어 주식별자가 될 수 있을 때 가능하면 주식별자 선정하기 위한 속성의 수가 많지 않도록 해야 한다.</li>
<li>식별자의 속성의 개수가 많을 때(일반적으로 7~8개 이상)는 새로운 인조식별자를 생성하여 데이터 모델을 구성하는 것이 데이터 모델을 한층 더 단순하게 하고, 애플리케이션을 개발할 때 조건절을 단순하게 할 수 있는 방법이 될 수 있다.</li>
</ul>
</li>
<li><p>해당 업무에서 자주 이용되는 속성</p>
<p>◾ 생성 여부에 따라</p>
</li>
<li><p><em>내부 식별자 :</em> 엔터티 내부에서 스스로 만들어지는 식별자 즉 자연스럽게 존재하는 식별자</p>
</li>
<li><p><em>외부 식별자(Foreign identifier) :</em> 다른 엔터티와의 관계를 통해 생성 되는 식별자</p>
</li>
</ul>
<p>→ 데이터베이스 생성 시 FK역할을 함</p>
<p> ◾ 속성 수에 따라</p>
<ul>
<li><p><em>단일 식별자(Single identifier) :</em> 하나의 속성을 가진 식별자</p>
</li>
<li><p><em>복합 식별자(Composit identifier) :</em> 둘 이상의 여러 속성으로 구성된 식별자</p>
<p>◾ 대체여부에 따라</p>
</li>
<li><p><em>본질 식별자 :</em> 업무에 의해 만들어지며 ,대체될 수 없는 식별자</p>
</li>
<li><p><em>인조 식별자 :</em> 인위적으로 만들어지는 대체가능한 식별자</p>
</li>
</ul>
<h3 id="식별자의-특성과-특정-여부에-따른-분류"><strong>식별자의 특성과 특정 여부에 따른 분류</strong></h3>
<p><strong>대표성 여부</strong></p>
<ul>
<li><p><strong>주 식별자</strong>(PK) - # 으로 표현</p>
<p>  : <strong>유일성, 최소성, 불변성, 존재성을 모두 만족하는 식별자</strong></p>
<p>  → PK는 여러 속성이 존재 할 수 있으나, 여러 속성이 존재 할 경우 나머지 일반 속성들이 해당 PK들 속성들에 대해 함수적 종속성을 띄어야함 → 그렇지 않으면 2차 정규화하여 부분 종속에 해당하는 속성들만 따로 추가 엔티티를 생성한다.</p>
<ul>
<li>주 식별자 도출 기준<ul>
<li>해당 업무에서 자주 이용되는 속성</li>
<li>명칭, 내역 등의 이름은 피함</li>
<li>속성 수를 최대한 적게 구성</li>
<li>자주 변하지 않는 값</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>보조 식별자</strong></p>
<p>  : 인스턴스 <strong>식별은 가능하나</strong> 엔티티를 <strong>대표하는 식별자는 아님</strong></p>
<p>  → 즉 다른 엔티티와의 참조 관계로 연결되지 않는다.</p>
<p>  ex) 회원 엔티티에서</p>
<p>  #회원번호</p>
<p>  *회원명</p>
<p>  *아이디 </p>
<p>  → 에서 아이디는 다른 인스턴스랑 중복될 수 없기 때문에 해당 엔티티에서 인스턴스를 구분짓게 할 수 있는 식별자이나</p>
<p>  → 이게 엔티티를 대표하지는 못 함</p>
</li>
</ul>
<p><strong>스스로 생성 되었는가에 대한 여부</strong></p>
<ul>
<li><p><strong>내부</strong> 식별자</p>
<p>  : 다른 엔티티 참조 없이 해당 엔티티 내부에서 스스로 생성된 식별자</p>
</li>
<li><p><strong>외부</strong> 식별자</p>
<p>  : 다른 엔티티에서 온 식별자 - 다른 엔티티와 연결고리 역할</p>
<p>  → 만약 부모 엔티티의 FK를 받아서 이를 주식별자로 사용하면</p>
<p>  → 해당 자식 엔티티의 PK는 <strong>SQL 조인에서 반드시 사용</strong>되고 WHERE 절에서 사용 가능성이 높음</p>
</li>
</ul>
<p><strong>단일 속성인지에 대한 여부(주 식별자 구성이 여러 속성인가)</strong></p>
<ul>
<li><p><strong>단일</strong> 식별자 : 주 식별자가 1개의 속성으로 구성</p>
</li>
<li><p><strong>복합</strong> 식별자 : <strong>주 식별자가 2개 이상의 속성</strong>으로 구성</p>
<p>  → 주 식별자가 2개 이상이면 해당 속성들의 우선순위를 잘 매겨서 잘 복합시킨 후 일반 속성들에게 종속시켜야 주 식별자로서 기능을 다 하게 된다.</p>
</li>
</ul>
<p><strong>대체되었는지 기존에 있는지에 대한 분류</strong></p>
<ul>
<li><p><strong>원조(본질)</strong> 식별자 : <strong>업무에 의해 만들어지는 식별자</strong>, 가공되지 않은 원래 식별자</p>
</li>
<li><p><strong>인조(대리)</strong> 식별자 : 인위적으로 만들어지는 식별자, 주 식별자가 복잡할 때 이를 통합</p>
<p>  → ex) 주문번호 - 대표적 인조, 대리 식별자</p>
<p>  → 기존 : 사번+주문일자+순번을 주 식별자로 두고 주문을 처리하다가</p>
<p>  → 이를 “주문번호” 라는 단일 속성의 주 식별자로 만들면 이게 인조, 대리 식별자가 됨</p>
</li>
</ul>
<p>단점)  1. 중복 데이터 발생 가능성 → 데이터 품ㅈㄹ 저하</p>
<pre><code> 2. 불필요한 인덱스 생성 → 저장공간 낭비 및 DML 성능 저하</code></pre><h1 id="비식별자">비식별자</h1>
<p> 비식별자는 &#39;약한 연결관계이고, 부모엔터티와 자식엔터티 간에 상호작용이 의무가 아닌 선택사항이다.<img src="https://velog.velcdn.com/images/yeunever_/post/c20a3938-9f43-4b4c-bd79-21effa645271/image.png" alt=""></p>
<h2 id="비식별자의-특징">비식별자의 특징</h2>
<ul>
<li><p>연관성이 약하다</p>
</li>
<li><p>자식테이블에서 독립적인 PK구조 , 부모와 자식 사이가 종속적인게 아니라 독립적이므로 약한 연결관계</p>
</li>
<li><p>복잡성이 증가되는 것을 방지</p>
</li>
<li><p>문제풀이
  Q. 프로젝트를 전개할 때는 식별자와 비식별자를 선택하여 연결해야 하는 높은 수준의 데이터모델링 기술이 필요하다. 다음 중 비식별자관계를 선택하는 기준으로 부적절한 것은?</p>
<ol>
<li><p>관계의 강약을 분석하여 상호간에 연관성이 약할 경우 비식별자관계를 고려한다.</p>
</li>
<li><p>자식테이블에서 독립적인 PK(Primary Key)의 구조를 가지기 원할 때 비식별자관계를 고려한다.</p>
</li>
<li><p>모든 관계가 식별자 관계로 연결되면 SQL Where절에서 비교하는 항목이 증가되어 조인에 참여하는 테이블에 따라 SQL문장이 길어져 SQL문의 복잡성이 증가되는 것을 방지하기 위해 비식별자관계를 고려한다.</p>
</li>
<li><p>부모엔터티의 주식별자를 자식엔터티에서 받아 손자엔터티까지 계속 흘려보내기 위해 비식별자관계를 고려한다.</p>
<p>자, 문제가 좀 길죠? 이 문제를 토대로 비식별자의 특징을 알기 위함입니다.</p>
</li>
</ol>
<ul>
<li><p>1번부터 봅시다. <strong>&#39;연관성이 약할 경우&#39;</strong> 라는 말이 나왔네요? 그럼 비식별자입니다.</p>
</li>
<li><p>2번 봅시다. 자식테이블에서 <strong>독립적인 PK구조</strong> 라는 말이 나왔습니다. 부모와 자식 사이가 종속적인게 아니라 독립적이므로 약한 연결관계입니다. 비식별자입니다.</p>
</li>
<li><p>3번 봅시다. 제가 설명했던 특징은 아니지만, 여기서 중요한 키워드는 <strong>&#39;복잡성이 증가되는 것을 방지&#39;</strong> 입니다. 이것 역시 비식별자의 중요한 특징입니다. 외웁시다.</p>
</li>
<li><p>4번은 부모엔터티의 주식별자 -&gt; 자식 -&gt; 손자엔터티와 같은 유대관계를 보이고 있습니다. 이런 연결관계는 비식별자보단 상대적으로 강한 식별자관계의 특징에 해당합니다.</p>
<p>따라서 답은 4번입니다.</p>
</li>
</ul>
</li>
</ul>
<h3 id="식별자-관계-vs-비식별자-관계">식별자 관계 vs 비식별자 관계</h3>
<p><strong>식별자 관계</strong> </p>
<p><strong>→ 트랜잭션에 의한 관계 - 동시에 커밋, 롤백 - 하나의 커밋 단위로 엔티티들이 묶임</strong></p>
<p>: 부모 엔티티의 식별자 속성이 <strong>자식 엔티티의 주 식별자</strong>가 되는 관계</p>
<ul>
<li>강한 연결 관계</li>
<li>실선(항시 연결)</li>
<li>부모-자식 관계가 항시 유지</li>
<li><strong>SQL문의 조인을 최소화 해줌</strong></li>
<li>데이터의 생명주기가 같은 경우</li>
</ul>
<p><strong>비식별자 관계</strong></p>
<p>: 부모 엔티티의 식별자 속성이 <strong>자식 엔티티의 일반 속성</strong>이 되는 관계</p>
<ul>
<li><p>약한 연결 관계</p>
</li>
<li><p>점선(선택적 연결)</p>
</li>
<li><p>부모-자식 관계가 유지 안 될 수 있음</p>
<p>  → 일반 속성 값은 NULL이 들어갈 수 있기 때문에 부모 엔티티의 식별자 속성에 값이 없을 때 자식 엔티티의 속성 값(인스턴스)이 생성 가능하다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[우분투리눅스] 6장 프로세스 관리]]></title>
            <link>https://velog.io/@yeunever_/%EC%9A%B0%EB%B6%84%ED%88%AC%EB%A6%AC%EB%88%85%EC%8A%A4-6%EC%9E%A5-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EA%B4%80%EB%A6%AC</link>
            <guid>https://velog.io/@yeunever_/%EC%9A%B0%EB%B6%84%ED%88%AC%EB%A6%AC%EB%88%85%EC%8A%A4-6%EC%9E%A5-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EA%B4%80%EB%A6%AC</guid>
            <pubDate>Tue, 20 Aug 2024 18:28:58 GMT</pubDate>
            <description><![CDATA[<h1 id="1-프로세스의-개념">1. 프로세스의 개념</h1>
<ul>
<li>프로세스 : 현재 실행 중인 프로그램</li>
<li>프로세스의 부모-자식 관계</li>
</ul>
<p>모든 프로세스는 부모-자식 관계를 가지고 있다.</p>
<p>필요에 따라 부모 프로세스는 자식 프로세스를 생성한다.</p>
<ul>
<li>프로세스 번호 PID</li>
</ul>
<p>PID는 1번부터 시작하고 프로세스가 실행되면서 하나씩 증가하여 부여</p>
<ul>
<li>프로세스의 종류</li>
</ul>
<ol>
<li>데몬 프로세스 : 특정 서비스를 제공하기 위해 존재하며 리눅스 커널에 의해 실행</li>
<li>고아 프로세스 : 자식 프로세스가 실행중인데 부모 프로세스가 먼저 종료되면 자식 프로세스는 고아 프로세스가 된다.</li>
<li>좀비 프로세스 : 자식 프로세스가 실행을 종료했는데도 프로세스 테이블 목록에 남아있는 경우에 이러한 자식 프로세스는 좀비 프로세스가 된다.</li>
</ol>
<h1 id="2-프로세스-관리-명령">2. 프로세스 관리 명령</h1>
<h2 id="프로세스-목록-확인-ps">프로세스 목록 확인 ps</h2>
<p>&lt;유닉스 옵션&gt;</p>
<p><code>ps -e</code> : 시스템에서 실행 중인 모든 프로세스의 정보 출력 (entire)</p>
<p><code>ps -f</code> :  프로세스 자세한 정보 출력</p>
<p><code>ps -ef</code> : 전체 프로세스 목록 자세하게 출력</p>
<p>cf) <code>ps -ef | more</code> : 전체 프로세스 목록 출력을 페이지 단위로 확인</p>
<p><code>ps -u uid</code> : 특정 사용자에 대한 모든 프로세스의 정보 출력</p>
<p><code>ps -p pid</code> : pid로 지정한 특정 프로세스의 정보를 출력</p>
<p>&lt;BSD 옵션&gt;</p>
<p><code>ps -a</code> : 터미널에서 실행시킨 프로세스의 정보 출력</p>
<p><code>ps -u</code> : 프로세스 소유자 이름, CPU 사용량, 메모리 사용량 등 상세 정보를 출력</p>
<p><code>ps -au</code> : 터미널에서 실행시킨 프로세스 상세 정보 출력</p>
<p><code>ps -x</code> : 시스템에서 실행중인 모든 프로세스의 정보 출력</p>
<p><code>ps -aux</code> : 전체 프로세스 목록 자세하게 출력</p>
<p>&lt;GNU 옵션&gt;</p>
<p>— pid PID 목록 : 목록으로 지정한 특정 PID 정보 출력</p>
<h2 id="특정-프로세스-정보-검색-ps--grep--pgrep">특정 프로세스 정보 검색 [ps | grep / pgrep]</h2>
<ol>
<li>ps | grep</li>
</ol>
<p><code>ps -ef | grep bash</code> : bash 셸에 대한 정보 검색</p>
<ol>
<li>pgrep</li>
</ol>
<p><code>pgrep -x</code> : 패턴과 정확히 일치하는 프로세스의 정보 출력</p>
<p><code>pgrep -n</code> : 패턴을 포함하고 있는 가장 최근 프로세스의 정보 출력</p>
<p><code>pgrep -u 사용자명</code> : 특정 사용자에 대한 모든 프로세스 출력</p>
<p><code>pgrep -l</code> : PID와 프로세스 이름 출력</p>
<p><code>pgrep t term</code> : 특정 단말기와 관련된 프로세스의 정보 출력</p>
<p><code>ps -f $(pgrep -x bash)</code></p>
<h2 id="프로세스-종료">프로세스 종료</h2>
<p>시그널 : 프로세스에 무언가 발생했음을 알리는 간단한 메세지</p>
<p><code>kill [-시그널] PID</code></p>
<p>9 : 프로세스 강제종료</p>
<h2 id="프로세스-관리-도구">프로세스 관리 도구</h2>
<p>top : 현재 실행 중인 프로세스의 정보를 주기적으로 출력</p>
<h1 id="3-포그라운드-백그라운드-프로세스와-작업제어">3. 포그라운드 ,백그라운드 프로세스와 작업제어</h1>
<ul>
<li>포그라운드 프로세스 : 사용자가 입력한 명령이 실행되어 결과가 출력될 때까지 기다려야 하는 포그라운드 방식으로 처리되는 프로세스</li>
<li>백그라운드 프로세스: 명령을 실행하면 명령의 처리가 끝나는 것과 관계없이 곧바로 프롬프트가 출력되어 사용자가 다른 작업을 계속 할 수 있음</li>
<li>작업 제어 : 작업 전환, 작업 일시 중지, 작업 종료를 뜻함</li>
</ul>
<p><code>jobs</code> : 현재 실행 중인 백그라운드 작업을 보는 명령</p>
<p><code>jobs %번호</code> : 해당 번호의 작업 정보를 출력</p>
<p><code>jobs %+ 또는 %%</code> : 작업 수서가 +인 작업 정보를 출력</p>
<p><code>jobs%-</code> : 작업 순서가 -인 작업 정보를 출력</p>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/9c7efcda-ceaa-476f-8120-899e41fd1766/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/99fe79e7-5d8d-466f-8755-bb023c1d4c45/image.png" alt=""></p>
<p>작업 종료 :   <code>ctrl+c</code> </p>
<p><code>nohup</code> : 로그아웃한 후에도 백그라운드 작업을 계속 실행</p>
<h1 id="4-작업-예약">4. 작업 예약</h1>
<h3 id="정해진-시간에-한-번-실행">정해진 시간에 한 번 실행</h3>
<p><code>at</code> : 예약한 명령을 정해진 시간에 실행</p>
<p><code>at -l</code> : 현재 실행 대기 중인 명령의 전체 목록을 출력 <code>atq</code></p>
<p><code>at -r 작업번호</code>  : 현재 실행 대기 중인 명령 중 해당 작업 번호를 삭제한다 <code>atrm</code> , <code>at -d</code></p>
<p><code>at - m</code> : 출력 결과가 없더라도 작업이 완료되면 사용자에게 메일로 알려준다</p>
<p><code>at -f</code> : 표준 입력 대신 실행할 명령을 파일로 지정</p>
<h3 id="정해진-시간에-반복-실행">정해진 시간에 반복 실행</h3>
<p><code>contrab</code>  : 사용자의 contrab 파일을 관리</p>
<p><code>contrab -e</code> : 사용자의 contrab 파일을 편집</p>
<p><code>contrab -l</code> : contrab 파일의 목록을 출력</p>
<p><code>contrab -r</code> : contrab 파일을 삭제</p>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/d67275c7-9416-46c1-a726-e55a8e66f684/image.png" alt=""></p>
<ul>
<li><p>교수님 강조 명령어</p>
<p>  ps -ef 
  ps -aux
  |(파이프) 및 grep 연결</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[우분투리눅스] 5장 파일 접근 권한 관리]]></title>
            <link>https://velog.io/@yeunever_/%EC%9A%B0%EB%B6%84%ED%88%AC%EB%A6%AC%EB%88%85%EC%8A%A4-5%EC%9E%A5-%ED%8C%8C%EC%9D%BC-%EC%A0%91%EA%B7%BC-%EA%B6%8C%ED%95%9C-%EA%B4%80%EB%A6%AC</link>
            <guid>https://velog.io/@yeunever_/%EC%9A%B0%EB%B6%84%ED%88%AC%EB%A6%AC%EB%88%85%EC%8A%A4-5%EC%9E%A5-%ED%8C%8C%EC%9D%BC-%EC%A0%91%EA%B7%BC-%EA%B6%8C%ED%95%9C-%EA%B4%80%EB%A6%AC</guid>
            <pubDate>Tue, 20 Aug 2024 18:25:11 GMT</pubDate>
            <description><![CDATA[<h1 id="1-파일-속성">1) 파일 속성</h1>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/c0015769-4e7c-4191-addb-e15d23e50883/image.png" alt=""></p>
<p><code>file</code> : 지정한 파일의 종류를 알려준다</p>
<p><code>groups</code> : 사용자가 속한 그룹을 알려준다.</p>
<h1 id="2-파일-접근-권한">2) 파일 접근 권한</h1>
<h3 id="접근-권한-종류">접근 권한 종류</h3>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/fd602ade-7d10-4448-86ad-842568b101a1/image.png" alt=""></p>
<h3 id="접근-권한-표기-방법">접근 권한 표기 방법</h3>
<p><code>rw-r--r--</code> </p>
<p><code>rw-</code> 소유자 <code>r--</code> 그룹<code>r--</code> 기타 사용자</p>
<p>읽기 권한 : r (read)</p>
<p>쓰기 권한  : w (write)</p>
<p>실행 권한 : x (execute)</p>
<h3 id="접근-권한의-변경-명령-chmod">접근 권한의 변경 명령 chmod</h3>
<p><code>chmod</code> : 파일이나 디렉터리의 접근 권한을 변경한다.
<code>chmod</code> : 하위 디렉터리까지 모두 변경할 수 있다.</p>
<p>기호모드: 접근권한을 변경하기 위해 문자와 기호를 사용하여 권한을 표시
숫자모드: 접근권한을 변경하기 위해 숫자를사 용</p>
<h1 id="3-기호를-이용한-파일-접근-권한-명령">3) 기호를 이용한 파일 접근 권한 명령</h1>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/ae323e64-f321-4cc8-bda1-04d258e9eebf/image.png" alt=""></p>
<p>+권한부여
-권한제거
=접근 권한 설정</p>
<h1 id="4-숫자를-이용한-파일-접근-권한-변">4) 숫자를 이용한 파일 접근 권한 변</h1>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/c77ce8a2-401f-4dcf-9adc-09498defe79b/image.png" alt=""></p>
<h1 id="5-기본-접근-권한-설정">5) 기본 접근 권한 설정</h1>
<p>기본 접근권한이 자동 설정</p>
<p>일반 파일 : 소유자 -rw , 그룹, 기타 사용자는 r</p>
<p>디렉터리 :  소유자 rwx, 그룹, 기타사용자 rx</p>
<p><code>unmask</code> :  기본 접근 권한을 출력하거나 변경</p>
<p>마스크 값의 의미</p>
<ul>
<li>마스크 값은 파일이나 디렉터리 생성시 부여하지 않을 권한을 지정해 놓은 것.- &#39;마스크(Mask)&#39;의 원래 의미가 일부분을 가리는 기능.</li>
<li>마스크 값이 &#39;022&#39;일 경우, 접근 권한의 숫자 모드로 해석시 &#39;----w--w-&#39; 이고 이는 그룹과 기타 사용자에게 쓰기 권한을 부여하지 않겠다는 뜻.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/c2165733-636c-444b-b1c1-1ecb7b93b404/image.png" alt=""></p>
<h1 id="6-특수-접근-권한">6) 특수 접근 권한</h1>
<p>접근 권한은 원래 4자리</p>
<p>SetUID : 파일이 실행되는 동안 파일을 실행한 사용자의 권한이 아니라 파일 소유자의 권한으로 실행</p>
<p>접근 권한에서 맨 앞자리에 4를 설정</p>
<p>스타키 비트 :  디렉터리에 설정하며 이 비트가 설정되어 있으면 누구나 파일을 생성할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[관계데이터모델]]></title>
            <link>https://velog.io/@yeunever_/%EA%B4%80%EA%B3%84%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%AA%A8%EB%8D%B8</link>
            <guid>https://velog.io/@yeunever_/%EA%B4%80%EA%B3%84%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%AA%A8%EB%8D%B8</guid>
            <pubDate>Thu, 24 Aug 2023 19:56:10 GMT</pubDate>
            <description><![CDATA[<h2 id="1-관계-데이터-모델">1. 관계 데이터 모델</h2>
<h3 id="⭐-릴레이션relation--행과-열로-구성된-테이블">⭐ 릴레이션(relation) : 행과 열로 구성된 테이블</h3>
<ul>
<li>수학의 집합에서 나온 개념</li>
<li>테이블 : 릴레이션의 시각적인 표현 방법</li>
</ul>
<h3 id="⭐-관계-relationship">⭐ 관계( relationship)</h3>
<ol>
<li>릴레이션(테이블)내의 관계 : 릴레이션 내의 데이터들의 집합으로 표현</li>
<li>릴레이션(테이블)간의 관계 : 릴레이션을 식별 가능한 값을 이용해 표현 -- &gt; 관계 데이터 모델을 다른 데이터 모델과 구분하는 특징 </li>
</ol>
<h3 id="⭐-릴레이션-스키마내포-schema--관계-데이터베이스의-릴레이션이-어떻게-구성되는지-어떤-정보를-담고-있는지에-대한-기본적인-구조를-정의">⭐ <strong>릴레이션 스키마(=내포 schema)</strong> : 관계 데이터베이스의 릴레이션이 어떻게 구성되는지, 어떤 정보를 담고 있는지에 대한 기본적인 구조를 정의</h3>
<p>테이블의 헤더에 나타나며 각 데이터의 특징을 나타내는 속성, 자료타입 등의 정보를 담고 있음.
그러나 컴퓨터로 처리되는 과정에서 데이터베이스는 속성 이름만으로 어떤 형태의 자료가 있는지 알 수 없으므로 도메인이라는 개념을 도입함.</p>
<ul>
<li><p>속성(attribute) : 릴레이션 스키마의 열</p>
</li>
<li><p>도메인(domain) : 속성이 가질 수 있는 값의 집합</p>
</li>
<li><p>차수(degree) : 속성의 개수</p>
<h3 id="⭐릴레이션-인스턴스-릴레이션-스키마에-실제로-저장된-데이터의-집합">⭐릴레이션 인스턴스: 릴레이션 스키마에 실제로 저장된 데이터의 집합</h3>
</li>
<li><p>투플(tuple) : 릴레이션의 행</p>
</li>
<li><p>카디날리티(cardinality) : 투플의 수
<img src="https://velog.velcdn.com/images/yeunever_/post/1c127ddc-49a8-4734-851e-fb30c230775f/image.png" alt="">
🎨 릴레이션의 특징</p>
<ol>
<li>속성은 단일 값을 가진다</li>
<li>속성은 서로 다른 이름을 가진다</li>
<li>한 속성의 값은 모두 같은 도메인 값을 가진다</li>
<li>속성의 순서는 상관없다</li>
<li>릴레이션 내의 중복된 투플은 허용하지 않는다</li>
<li>투플의 순서는 상관없다
<img src="https://velog.velcdn.com/images/yeunever_/post/1b28c3af-8c71-4fda-9e90-a87fe0d5306f/image.png" alt="">
관계 데이터 모델</li>
</ol>
</li>
<li><p>관계 데이터 모델은 데이터를 2차원 테이블 형태인 릴레이션으로 표현하며
릴레이션에 대한 제약조건(constraints)과 관계 연산을 위한 관계대수(relational
algebra)를 정의함.
<img src="https://velog.velcdn.com/images/yeunever_/post/3c0c5234-d553-44b8-9867-e098a1eb48f4/image.png" alt=""></p>
</li>
</ul>
<h2 id="2-무결성-제약조건">2. 무결성 제약조건</h2>
<h3 id="🔥키-특정-투플을-식별할-때-사용하는-속성-혹은-속성의-집합">🔥키: 특정 투플을 식별할 때 사용하는 속성 혹은 속성의 집합</h3>
<ul>
<li><p>릴레이션은 중복된 투플을 허용하지 않기 때문에 각각의 투플에 포함된 속성들 중어느 하나(혹은 하나 이상)는 값이 달라야 함. 즉 키가 되는 속성(혹은 속성의 집합)은 반드시 값이 달라서 투플들을 서로 구별할 수 있어야 함</p>
</li>
<li><p>키는 릴레이션 간의 관계를 맺는 데도 사용</p>
<h4 id="⭐슈퍼키--투플을-유일하게-식별할-수-있는-하나의-속성-혹은-속성의-집합">⭐슈퍼키 : 투플을 유일하게 식별할 수 있는 하나의 속성 혹은 속성의 집합</h4>
<ul>
<li>투플을 유일하게 식별할 수 있는 값이면 모두 슈퍼키가 될 수 있음</li>
</ul>
<h4 id="⭐후보키--투플을-유일하게-식별할-수-있는-속성의-최소-집합">⭐후보키 : 투플을 유일하게 식별할 수 있는 속성의 최소 집합</h4>
<h4 id="⭐기본키--여러-후보키-중-하나를-선정하여-대표로-삼는-키">⭐기본키 : 여러 후보키 중 하나를 선정하여 대표로 삼는 키</h4>
<ul>
<li>후보키가 하나뿐이라면 그 후보키를 기본키로 사용하면 되고 여러 개라면 릴레이션
의 특성을 반영하여 하나를 선택하면 됨. 
🎨 기본키 선정 시 고려사항
▪ 릴레이션 내 투플을 식별할 수 있는 고유한 값을 가져야 함.
▪ NULL 값은 허용하지 않음.
▪ 키 값의 변동이 일어나지 않아야 함.
▪ 최대한 적은 수의 속성을 가진 것이라야 함.
▪ 향후 키를 사용하는 데 있어서 문제 발생 소지가 없어야 함.</li>
</ul>
<h4 id="⭐대리키--기본키가-보안을-요하거나-여러-개의-속성으로-구성되어-복잡하거나-마땅한-기본키가-없을-때는-일련번호-같은-가상의-속성을-만들어-기본키로-삼는-경우가-있음-이러한-키를-대리키surrogate-key-혹은-인조키artificial-key라고-함">⭐대리키 : 기본키가 보안을 요하거나, 여러 개의 속성으로 구성되어 복잡하거나, 마땅한 기본키가 없을 때는 일련번호 같은 가상의 속성을 만들어 기본키로 삼는 경우가 있음. 이러한 키를 대리키(surrogate key) 혹은 인조키(artificial key)라고 함.</h4>
</li>
<li><p>대리키는 DBMS나 관련 소프트웨어에서 임의로 생성하는 값으로 사용자가 직관적으
로 그 값의 의미를 알 수 없음</p>
</li>
</ul>
<h4 id="⭐대체키--기본키로-선정되지-않은-후보키를-말함">⭐대체키 : 기본키로 선정되지 않은 후보키를 말함</h4>
<h4 id="⭐외래키--다른-릴레이션의-기본키를-참조하는-속성을-말함">⭐외래키 : 다른 릴레이션의 기본키를 참조하는 속성을 말함.</h4>
<ul>
<li>다른 릴레이션의 기본키를 참조하여 관계 데이터 모델의 특징인 릴레이션 간의 관계(relationship)를 표현함.</li>
<li>외래키 사용 시 참조하는 릴레이션과 참조되는 릴레이션이 꼭 다른 릴레이션일 필요는 없음. 즉 자기 자신의 기본키를 참조할 수도 있음.</li>
</ul>
<p>🎨 외래키의 특징
▪ 관계 데이터 모델의 릴레이션 간의 관계를 표현함.
▪ 다른 릴레이션의 기본키를 참조하는 속성임.
▪ 참조하고(외래키) 참조되는(기본키) 양쪽 릴레이션의 도메인은 서로 같아야 함.
▪ 참조되는(기본키) 값이 변경되면 참조하는(외래키) 값도 변경됨.
▪ NULL 값과 중복 값 등이 허용됨.
▪ 자기 자신의 기본키를 참조하는 외래키도 가능함.
▪ 외래키가 기본키의 일부가 될 수 있음.</p>
<h4 id="키--내용-요약">키 – 내용 요약</h4>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/c39b9499-4f5c-4430-8f46-c9d4ca3742ed/image.png" alt=""></p>
<h2 id="🔥무결성-제약조건">🔥무결성 제약조건</h2>
<p>데이터 무결성(integrity, 無缺性) :데이터베이스에 저장된 데이터의 일관성과 정확성을 지키는 것을 말함</p>
<h4 id="💡-도메인-무결성-제약조건도메인-제약">💡 도메인 무결성 제약조건(도메인 제약)</h4>
<p>• 릴레이션 내의 투플들이 각 속성의 도메인에 지정된 값만을가져야 한다는 조건
• SQL 문에서 데이터 형식(type), 널(null/not null), 기본 값(default), 체크(check) 등을 사용하여 지정할 수 있음.</p>
<h4 id="💡-개체-무결성-제약조건기본키-제약">💡 개체 무결성 제약조건(기본키 제약)</h4>
<p>• 릴레이션은 기본키를 지정하고 그에 따른 무결성 원칙 즉, 기본키는 NULL 값을 가져서는 안 되며 릴레이션내에 오직 하나의 값만 존재해야 한다는 조건임.</p>
<p>▪ 삽입 : 기본키 값이 같으면 삽입이 금지됨.
▪ 수정 : 기본키 값이 같거나 NULL이면 수정이 금지됨.
▪ 삭제 : 특별한 확인이 필요하지 않으며 즉시 수행함.</p>
<h4 id="💡-참조-무결성-제약조건외래키-제약">💡 참조 무결성 제약조건(외래키 제약)</h4>
<p>• 릴레이션 간의 참조 관계를 선언하는 제약조건
• 자식 릴레이션의 외래키는 부모 릴레이션의 기본키와 도메인이 동일해야 하며, 자식 릴레이션의 값이 변경될때 부모 릴레이션의 제약을 받는다는 것</p>
<p>◼ 삽입
▪ 학과(부모 릴레이션) : 새로운 투플을 삽입하면 정상적으로 진행
▪ 학생(자식 릴레이션) : 참조받는 테이블에 외래키 값이 없으면 삽입이 금지
(이런 경우 외래키에 대응하는 새로운 투플을 부모 릴레이션에 먼저 삽입한 후 수행해야 함)</p>
<p>◼ 삭제
▪ 학생(자식 릴레이션) : 바로 삭제 가능함.
▪ 학과(부모 릴레이션) : 참조하는 릴레이션이 있는 경우 4가지 조치를 고려할 수 있음
① 즉시 작업을 중지
② 자식 릴레이션의 관련 투플을 삭제
③ 초기에 설정된 다른 어떤 값으로 변경
④ NULL 값으로 설정</p>
<p>◼ 수정
▪ 삭제와 삽입 명령이 연속해서 수행되는 것으로 보면 됨.
▪ 부모 릴레이션의 수정이 일어날 경우 삭제 옵션에 따라 처리된 후 문제가 없으면 다시 삽입제약조건에 따라 처리됨.</p>
<h2 id="3-관계대수">3. 관계대수</h2>
<h3 id="⭐-관계대수relational-algebra-關係代數">⭐ 관계대수(relational algebra, 關係代數)</h3>
<p>릴레이션에서 원하는 결과를 얻기 위해 수학의 대수와 같은 연산을 이용하여 질의하는 방법을 기술하는 언어</p>
<h3 id="⭐-관계대수와-관계해석">⭐ 관계대수와 관계해석</h3>
<ul>
<li>관계대수 : 어떤 데이터를 어떻게 찾는지에 대한 처리 절차를 명시하는 절차적인 언어이며,DBMS 내부의 처리 언어로 사용됨</li>
<li>관계해석 : 어떤 데이터를 찾는지 명시하는 선언적인 언어로 관계대수와 함께 관계 DBMS의 표준 언어인 SQL의 이론적인 기반을 제공함
→ 관계대수와 관계해석은 모두 관계 데이터 모델의 중요한 언어이며 실제 동일한 표현 능력을가지고 있음.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/6c2274db-5de6-40ae-a633-4456aa26bac3/image.png" alt=""></p>
<h3 id="⭐관계대수식">⭐관계대수식</h3>
<ul>
<li>관계대수는 릴레이션 간 연산을 통해 결과 릴레이션을 찾는 절차를 기술한 언어로, 이 연산을 수행하기 위한 식을 관계대수식(relational algebra expression)이라고 함.
관계대수식은 대상이 되는 릴레이션과 연산자로 구성되며, 결과는 릴레이션으로 반환됨. 반환된 릴레이션은 릴레이션의 모든 특징을 따름. </li>
</ul>
<h4 id="💡-릴레이션relation의-수학적-개념">💡 릴레이션(relation)의 수학적 개념</h4>
<p>예) A = {2, 4}, B = {1, 3, 5} 일 때
AXB = {(2,1), (2,3), (2,5), (4,1), (4,3), (4,5)} // A원소와 B원소의 순서쌍 집합
릴레이션 R은 카티전 프로덕트의 부분집합으로 정의
예) R1 = {(2,1), (4,1)}, R2={(2, 1), (2, 3), (2, 5)}, R3={(2, 3), (2, 5), (4, 3), (4, 5)}</p>
<p>원소 개수가 n인 집합 S의 부분집합의 개수는 2ⁿ이므로, 카티전 프로덕트 A×B의
부분집합의 개수는카티전 프로덕트의 기초 집합 A, B 각각이 가질 수 있는 값의 범위를 도메인(domain)이라고 함.</p>
<p>즉 집합 A의 도메인은 {2, 4}
릴레이션 역시 집합이므로 집합에서 가능한 연산은 합집합(∪), 교집합(∩), 카티전 프로덕트(×)
등이 있음.
R1 ∪ R2 = {(2, 1), (4, 1), (2, 3), (2, 5)}
R1 ∩ R2 = {(2, 1)}</p>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/3bdf7316-c260-41d5-86b0-7e3fa971a8cb/image.png" alt=""></p>
<h3 id="⭐관계대수식-1">⭐관계대수식</h3>
<ul>
<li>관계대수는 릴레이션 간 연산을 통해 결과 릴레이션을 찾는 절차를 기술한 언어로, 이 연산을 수행하기 위한 식을 관계대수식(relational algebra expression)이라고 함.</li>
<li>관계대수식은 대상이 되는 릴레이션과 연산자로 구성되며, 결과는 릴레이션으로 반환됨. 반환된 릴레이션은 릴레이션의 모든 특징을 따름. </li>
</ul>
<p>▪ 단항 연산자 : 연산자&lt;조건&gt; 릴레이션
▪ 이항 연산자 : 릴레이션1 연산자&lt;조건&gt; 릴레이션2</p>
<h3 id="⭐셀렉션selection">⭐셀렉션(selection)</h3>
<p>릴레이션의 투플을 추출하기 위한 연산임. 하나의 릴레이션을 대상으로 하는 단항 연산자이며,찾고자 하는 투플의 조건(predicate)을 명시하고 그 조건에 만족하는 투플을 반환함.
◼ 형식 : σ&lt;조건&gt; (R) (R은 릴레이션, σ 는 그리스 문자이며 대문자는 Σ )
◼ 셀렉션의 확장
◼ 형식 : σ&lt;복합조건&gt; (R) (R은 릴레이션, σ 는 그리스 문자이며 대문자는 Σ )</p>
<h3 id="⭐프로젝션projection">⭐프로젝션(projection)</h3>
<p>◼ 릴레이션의 속성을 추출하기 위한 연산으로 단항 연산자임.
◼ 형식 : π&lt;속성리스트&gt; (R) (R은 릴레이션, π 는 그리스 문자이며 대문자는 Π )</p>
<h3 id="⭐합집합">⭐합집합</h3>
<p>◼ 두 개의 릴레이션을 합하여 하나의 릴레이션을 반환함. 이 때 두 개의 릴레이션은 서로 같은 속성순서와 도메인을 가져야 함. 합병가능해야함.(union compatible)
◼ 형식 : R ∪ S </p>
<h3 id="⭐교집합">⭐교집합</h3>
<p>◼ 합병가능한 두 릴레이션을 대상으로 하며, 두 릴레이션이 공통으로 가지고 있는 투플을 반환함.
◼ 형식 : R ∩ S</p>
<h3 id="⭐차집합">⭐차집합</h3>
<p>◼ 첫 번째 릴레이션에는 속하고 두 번째 릴레이션에는 속하지 않는 투플을 반환함.
◼ 형식 : R - S</p>
<h3 id="⭐카티전-프로덕트cartesian-product">⭐카티전 프로덕트(cartesian product)</h3>
<p>◼ 두 릴레이션을 연결시켜 하나로 합칠 때 사용함. 결과 릴레이션은 첫 번째 릴레이션의 오른쪽에 두 번째 릴레이션의 모든 투플을 순서대로 배열하여 반환함. 결과 릴레이션의 차수는 두 릴레이션의 차수의 합이며, 카디날리티는 두 릴레이션의 카디날리티의 곱임. 두 릴레이션을 연결시켜 하나로 합칠 때 사용함.
◼ 형식 : R × S</p>
<h3 id="⭐조인join">⭐조인(join)</h3>
<p>--&gt;  두 릴레이션의 공통 속성을 기준으로 속성 값이 같은 투플을 수평으로 결합하는 연산임. 조인을 수행하기 위해서는 두 릴레이션의 조인에 참여하는 속성이 서로 동일한 도메인으로 구성되어야 함. 조인 연산의 결과는 공통 속성의 속성 값이 동일한 투플만을 반환함.</p>
<p>◼ 형식 : R C S = σc
(R×S) (R과 S는 릴레이션, c 는 조인조건)</p>
<h4 id="조인-연산의-구분">조인 연산의 구분</h4>
<p>▪ 기본연산 : 세타조인( ), 동등조인( ), 자연조인( )
▪ 확장된 조인 연산 : 세미조인( ), 외부조인( ) </p>
<p>✏️ 세타조인(theta join, θ)
▪ 조인에 참여하는 두 릴레이션의 속성 값을 비교하여 조건을 만족하는 투플만 반환함.
▪ 세타조인의 조건은 {=, ≠, ≤, ≥, ＜, ＞} 중 하나가 됨.
▪ 형식 : R (r 조건 s) S (R과 S는 릴레이션이며 r은 R의 속성, s는 S의 속성)</p>
<p>✏️ 동등조인(equi join)
▪ 세타조인에서 = 연산자를 사용한 조인을 말함. 보통 조인 연산이라고 하면 동등조인을 지칭함.
▪ 형식 : R (r = s) S</p>
<p>✏️ 자연조인(natural join)
▪ 동등조인에서 조인에 참여한 속성이 두 번 나오지 않도록 두 번째 속성을 제거한 결
과를 반환함.
▪ 형식 : R N(r, s) S</p>
<p>✏️ 외부조인(outer join)
▪ 자연조인 시 조인에 실패한 투플을 모두 보여주되 값이 없는 대응 속성에는 NULL 값을 채워서 반환
▪ 모든 속성을 보여주는 기준 릴레이션 위치에 따라 왼쪽(left) 외부조인, 오른쪽(right) 외부조인, 완전(full) 외부조인으로 나뉨.
▪ 형식 : 왼쪽(left) 외부조인 – R (r, s) S
완전(full) 외부조인 – R (r, s) S
오른쪽(right) 외부조인 - R (r, s) S</p>
<p>✏️ 세미조인(semi join)
▪ 자연조인을 한 후 두 릴레이션 중 한쪽 릴레이션의 결과만 반환하며, 기호에서 닫힌 쪽 릴레이
션의 투플만 반환함.
▪ 형식 : R (r, s) S</p>
<p>✏️ 디비전(division)
▪ 릴레이션의 속성 값의 집합으로 연산을 수행함.
▪ 형식 : R ÷ S</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터베이스 용어정리]]></title>
            <link>https://velog.io/@yeunever_/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%9A%A9%EC%96%B4%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@yeunever_/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%9A%A9%EC%96%B4%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Thu, 24 Aug 2023 19:47:29 GMT</pubDate>
            <description><![CDATA[<h3 id="⭐릴레이션--관계형-데이터베이스에서-정보를-구분하여-저장하는-기본-단위">⭐릴레이션 : 관계형 데이터베이스에서 정보를 구분하여 저장하는 기본 단위</h3>
<h2 id="🔥키-특정-투플을-식별할-때-사용하는-속성-혹은-속성의-집합">🔥키: 특정 투플을 식별할 때 사용하는 속성 혹은 속성의 집합</h2>
<ul>
<li><p>릴레이션은 중복된 투플을 허용하지 않기 때문에 각각의 투플에 포함된 속성들 중어느 하나(혹은 하나 이상)는 값이 달라야 함. 즉 키가 되는 속성(혹은 속성의 집합)은 반드시 값이 달라서 투플들을 서로 구별할 수 있어야 함</p>
</li>
<li><p>키는 릴레이션 간의 관계를 맺는 데도 사용</p>
<h3 id="⭐슈퍼키--투플을-유일하게-식별할-수-있는-하나의-속성-혹은-속성의-집합">⭐슈퍼키 : 투플을 유일하게 식별할 수 있는 하나의 속성 혹은 속성의 집합</h3>
<ul>
<li>투플을 유일하게 식별할 수 있는 값이면 모두 슈퍼키가 될 수 있음</li>
</ul>
<h3 id="⭐후보키--투플을-유일하게-식별할-수-있는-속성의-최소-집합">⭐후보키 : 투플을 유일하게 식별할 수 있는 속성의 최소 집합</h3>
<h3 id="⭐기본키--여러-후보키-중-하나를-선정하여-대표로-삼는-키">⭐기본키 : 여러 후보키 중 하나를 선정하여 대표로 삼는 키</h3>
<ul>
<li>후보키가 하나뿐이라면 그 후보키를 기본키로 사용하면 되고 여러 개라면 릴레이션
의 특성을 반영하여 하나를 선택하면 됨. 
🎨 기본키 선정 시 고려사항
▪ 릴레이션 내 투플을 식별할 수 있는 고유한 값을 가져야 함.
▪ NULL 값은 허용하지 않음.
▪ 키 값의 변동이 일어나지 않아야 함.
▪ 최대한 적은 수의 속성을 가진 것이라야 함.
▪ 향후 키를 사용하는 데 있어서 문제 발생 소지가 없어야 함.</li>
</ul>
<h3 id="⭐대리키--기본키가-보안을-요하거나-여러-개의-속성으로-구성되어-복잡하거나-마땅한-기본키가-없을-때는-일련번호-같은-가상의-속성을-만들어-기본키로-삼는-경우가-있음-이러한-키를-대리키surrogate-key-혹은-인조키artificial-key라고-함">⭐대리키 : 기본키가 보안을 요하거나, 여러 개의 속성으로 구성되어 복잡하거나, 마땅한 기본키가 없을 때는 일련번호 같은 가상의 속성을 만들어 기본키로 삼는 경우가 있음. 이러한 키를 대리키(surrogate key) 혹은 인조키(artificial key)라고 함.</h3>
</li>
<li><p>대리키는 DBMS나 관련 소프트웨어에서 임의로 생성하는 값으로 사용자가 직관적으
로 그 값의 의미를 알 수 없음</p>
</li>
</ul>
<h3 id="⭐대체키--기본키로-선정되지-않은-후보키를-말함">⭐대체키 : 기본키로 선정되지 않은 후보키를 말함</h3>
<h3 id="⭐외래키--다른-릴레이션의-기본키를-참조하는-속성을-말함">⭐외래키 : 다른 릴레이션의 기본키를 참조하는 속성을 말함.</h3>
<ul>
<li>다른 릴레이션의 기본키를 참조하여 관계 데이터 모델의 특징인 릴레이션 간의 관계(relationship)를 표현함.</li>
<li>외래키 사용 시 참조하는 릴레이션과 참조되는 릴레이션이 꼭 다른 릴레이션일 필요는 없음. 즉 자기 자신의 기본키를 참조할 수도 있음.</li>
</ul>
<p>🎨 외래키의 특징
▪ 관계 데이터 모델의 릴레이션 간의 관계를 표현함.
▪ 다른 릴레이션의 기본키를 참조하는 속성임.
▪ 참조하고(외래키) 참조되는(기본키) 양쪽 릴레이션의 도메인은 서로 같아야 함.
▪ 참조되는(기본키) 값이 변경되면 참조하는(외래키) 값도 변경됨.
▪ NULL 값과 중복 값 등이 허용됨.
▪ 자기 자신의 기본키를 참조하는 외래키도 가능함.
▪ 외래키가 기본키의 일부가 될 수 있음.</p>
<h3 id="키--내용-요약">키 – 내용 요약</h3>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/c39b9499-4f5c-4430-8f46-c9d4ca3742ed/image.png" alt=""></p>
<h2 id="🔥무결성-제약조건">🔥무결성 제약조건</h2>
<h3 id="⭐데이터-무결성integrity-無缺性-데이터베이스에-저장된-데이터의-일관성과-정확성을-지키는-것을-말함">⭐데이터 무결성(integrity, 無缺性) :데이터베이스에 저장된 데이터의 일관성과 정확성을 지키는 것을 말함</h3>
<h3 id="①-도메인-무결성-제약조건">① 도메인 무결성 제약조건</h3>
<p>• 도메인 제약(domain constraint)이라고도 하며, 릴레이션 내의 투플들이 각 속성의 도메인에 지정된 값만을가져야 한다는 조건
• SQL 문에서 데이터 형식(type), 널(null/not null), 기본 값(default), 체크(check) 등을 사용하여 지정할 수 있음.</p>
<h3 id="②-개체-무결성-제약조건">② 개체 무결성 제약조건</h3>
<p>• 기본키 제약(primary key constraint)이라고도 함.
• 릴레이션은 기본키를 지정하고 그에 따른 무결성 원칙 즉, 기본키는 NULL 값을 가져서는 안 되며 릴레이션내에 오직 하나의 값만 존재해야 한다는 조건임.</p>
<h3 id="③-참조-무결성-제약조건">③ 참조 무결성 제약조건</h3>
<p>• 외래키 제약(foreign key constraint)이라고도 하며, 릴레이션 간의 참조 관계를 선언하는 제약조건
• 자식 릴레이션의 외래키는 부모 릴레이션의 기본키와 도메인이 동일해야 하며, 자식 릴레이션의 값이 변경될때 부모 릴레이션의 제약을 받는다는 것</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바 기본 문법 개념정리]]></title>
            <link>https://velog.io/@yeunever_/%EC%9E%90%EB%B0%94-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@yeunever_/%EC%9E%90%EB%B0%94-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Thu, 24 Aug 2023 19:20:01 GMT</pubDate>
            <description><![CDATA[<h1 id="java-programming-이란-">Java Programming 이란 ?</h1>
<p>자바(Java)는 1995년 미국의 썬 마이크로시스템즈의 제임스 고슬링(James Gosling)과 다른 연구원들이 개발한 객체 지향적 프로그래밍 언어이다.</p>
<p>자바의 특징</p>
<ol>
<li>쉽다. ( C와 C++문법을 바탕으로 하지만 포인터와 다중상속 부분이 삭제됨)</li>
<li>플랫폼에 독립적이다. ( JVM만 있으면 모든 운영체제에서 실행 가능)</li>
<li>객체지향 언어다.</li>
<li>메모리 관리를 자동으로 해준다.</li>
</ol>
<h1 id="변수와-계산">변수와 계산</h1>
<h1 id="제어문">제어문</h1>
<h1 id="배열">배열</h1>
<p>배열은 데이터형이 같은 변수가 여러 개 필요할 때 사용함.
배열 생성방법 : new라는 키워드를 사용</p>
<h4 id="1차원-배열-선언-및-사용-방법">1차원 배열 선언 및 사용 방법</h4>
<pre><code class="language-java">public class ArrayExam{
    public static void main(String[] args){
        int[] array1 = new int[100]; // array1이 배열이름, 인덱스는 100까지 사용가능
        int[] array2 = new int[]{1,2,3,4};
        int[] array3 = {1,2,3,4};

        int value = array3[0];
        System.out.println(value);

        array1[0] = 50; // 배열 array1의 0번 인덱스에 50 담기
        array1[1] = 100;

        // System.out.println(array1[1]);
        }
  }
</code></pre>
<p>배열에 값을 넣을 때는 배열의 이름과 배열의 표시인 대괄호 안에 인덱스를 적으면 됨.
📌 배열은 기본 자료형이 아니라 이 부분을 참조하라는 참조형 !!</p>
<h4 id="배열-사용하기">배열 사용하기</h4>
<pre><code class="language-java">public class ArrayWithFor{
    public static void main(String[] args){
        int[] iarraay = new int[100];

        for(int i=0; i &lt; iarrray.length; i++){
            iarray[i] = i + 1; // 100개의 배열 안에 0부터 차례로 숫자를 할당
            }
          for(int i =0; i &lt; array.length; i++){ 
          /* 배열인덱스는 0부터
          배열의 크기는 배열명.length를 사용*/
          sum = iarray[i];
          }
          int sum = 0;
          /* for문 안에 선언하면 for블록 밖에서는 변수를 사용하지 못함. 
          게다가 for블록을 실행하고 다시 반복하는 시점에 변수를
          매번 새롭게 선언하므로 지속적인 값 저장 X */
          for(int i =0; i &lt; array.length; i++){ // 배열 크기만큼 반복
          sum += iarray[i]; //  반복문 밖에서 선언한 변수 누적
          }

          System.out.println(sum); // 변수 출력
         }
     }</code></pre>
<h4 id="2차원-배열">2차원 배열</h4>
<p>선언할 때 배열표시를 두 번 적으면 됨. </p>
<h4 id="for-each문">for each문</h4>
<p>for(형과 값을 받아줄 변수명:출력하고 싶은 자료구조)</p>
<pre><code class="language-java">for (int index=0; index &lt; array.length; index++) {
    int i = array[index];
    System.out.println(i);
    }

for (int i:array) {
    System.out.println(i);</code></pre>
<p>위 두 코드는 같은 문장.
for each문
for문 내에서 인덱스를 초기화, 배열의 크기와 인덱스 크기를 비교하여 인덱스를 증가, 배열에 저장된 인덱스에 해당하는 값을 꺼내서 변수에 담음</p>
<h1 id="클래스와-객체">클래스와 객체</h1>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/d62066f2-4e53-483a-8c39-4ee5ad27a8b0/image.png" alt=""></p>
<p>|   용어정리 |
|----|:----|
|객체|  우리가 소프트웨어 세계에 구현해야 할 대상 |<br>|클레스|  객체를 구현하기 위한 설계도 |<br>|인스턴스|클레스라는 설계도에 따라 소프트웨어 세상에 구현된 실체   |<br>|인스턴스화|클레스를 메모리에 올려 인스턴스를 만드는 과정  | </p>
<h4 id="클레스-선언">클레스 선언</h4>
<pre><code class="language-java">public class 클레스 명 { //  클레스 블록
    public static void main (String[] args){
        Car c1 = new Car();
        /* new 뒤의 Car은 생성자,
           c1이라는 객체를 생성,
           --&gt; 메모리에 객체가 만들어졌고 이를 인스턴스라고 함.
        }
        /* c1은 가리키는 변수, 참조하는 변수, 레퍼런스하는 변수이고
        변수가 인스턴스를 가지는 것이 아니라 말 그대로 가리킨다는 의미 */
}</code></pre>
<h4 id="참조형">참조형</h4>
<p>기본형  : 논리형, 문자형, 정수형, 실수형
참조형(=래퍼런스형, 클래스 타입, 사용자 정의형 타입) : 배열, 클레스 ... 등등
 ==&gt; 주로 객체 연결을 위한 타입
 <img src="https://velog.velcdn.com/images/yeunever_/post/d91729c8-67fb-46cc-b290-8448454f99e2/image.png" alt="">
Q : 객체를 변수에 담으면 안되나 ?
A : 객체는 하나의 변수에 담기에 너무 크다. 뿐만 아니라 그 크기가 유동적이다. 때문에 자바는 객체 접근을 위해 어드레싱(addresing) 방식 즉, 주소지를 통한 접근 방식을 취한다.</p>
<ul>
<li>String 클레스 정리</li>
</ul>
<ol>
<li>new 키워드 없이 인스턴스를 만드는 경우<pre><code class="language-java">String str1 = &quot;hello&quot;; 
String str2 = &quot;hello&quot;;
/* &quot;hello&quot;라는 문자열은 상수를 저장하는 영역에 저장됨.
두번째 문장이 실행될 때 hello라는 문자열 상수는 이미 만들어졌으므로
str이 참조하는 인스턴스를 str2도 참조함.*/</code></pre>
</li>
</ol>
<ol start="2">
<li>new 키워드로 인스턴스를 만드는 경우
```java
String str1 = new String(&quot;hello&quot;); 
String str2 = new String(&quot;hello&quot;);
/* 인스턴스는 무조건 새로 만들어진다.
두 번째 문장이 실행될 때도 새로 만들고, str3과 str4는 서로 다른 인스턴스를 참조</li>
</ol>
<p>*/</p>
<pre><code>
```java
String str5 = &quot;Hello World&quot;; 
String str6 = str5.substring(3);
/* String은 불변 클레스
메서드를 호출해도 내부의 값은 변하지 않고 모두 새로운 String을 생성해서 반환
*/</code></pre><h4 id="필드-선언">필드 선언</h4>
<p><img src="https://velog.velcdn.com/images/yeunever_/post/0791c3b0-12b5-43ac-8fac-cb82bfd55262/image.png" alt=""></p>
<ol>
<li>이름과 번호를 필드로 가진 Car 클래스 선언<pre><code class="language-java">public class Car{
 String name;
 int number;
}</code></pre>
</li>
<li>Car 클래스를 인스턴스화하기<pre><code class="language-java">Car c1 = new Car();
Car c2 = new Car();
// Car라는 인스턴스가 메모리에 두 개 만들어진다.
// 객체별로 name과 number라는 필드를 가진다.</code></pre>
</li>
<li>속성 이용하기<pre><code class="language-java"></code></pre>
</li>
</ol>
<p>c1.name = &quot;소방차&quot;; // c1.name은 c1이 참조하는 객체의 name을 의미한다.
c1.number = 1234; // c1.number는 c1이 참조하는 객체의 number을 의미한다.</p>
<p>c2.name = &quot;구급차&quot;; 
c2.number = 1111;</p>
<p>System.out.println(c1.name);
System.out.println(c2.number);</p>
<pre><code>#### 메서드 선언
사물 = 상태 + 행동
사물 = field + Method

* 매서드 실행 : 객체.메서드명();
* 메서드 정의
![](https://velog.velcdn.com/images/yeunever_/post/e3651c40-d57f-42ac-b96f-384555ef304d/image.png)

```java
public calss MyClass{
    public 리턴형 메서드명 (매개변수들){
    // 리턴형 : 메서드를 실행한 다음 결괏값을 되돌려줄 때 사용하는 자료형
    실행될 코드
    }
}</code></pre><pre><code class="language-java">public class HelloWorld{ // HelloWorld 클래스 : 프로그램의 최소단위
    public static void main(String args[]){ 
        //메인 메서드 : 프로그램의 시작점
        System.out.println(&quot;Hello World&quot;);
        }
    }</code></pre>
<h4 id="변수의-스코프와-static">변수의 스코프와 static</h4>
]]></description>
        </item>
    </channel>
</rss>