<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>taehee.log</title>
        <link>https://velog.io/</link>
        <description>내 벨로그</description>
        <lastBuildDate>Tue, 25 Feb 2025 08:29:57 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. taehee.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/tae-log" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[description Style 안에 스크롤 되게]]></title>
            <link>https://velog.io/@tae-log/description-Style-%EC%95%88%EC%97%90-%EC%8A%A4%ED%81%AC%EB%A1%A4-%EB%90%98%EA%B2%8C</link>
            <guid>https://velog.io/@tae-log/description-Style-%EC%95%88%EC%97%90-%EC%8A%A4%ED%81%AC%EB%A1%A4-%EB%90%98%EA%B2%8C</guid>
            <pubDate>Tue, 25 Feb 2025 08:29:57 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-jsx">const descriptionStyle = css`
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.8);
  color: white;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  text-align: left;
  padding: 10px;

  /* ✨ 스크롤 가능하도록 설정 */
  overflow-y: auto;
  max-height: 100%;
  box-sizing: border-box; /* 패딩 포함하여 크기 조절 */

  opacity: 0;
  transition: opacity 0.3s ease-in-out;
  pointer-events: none;
`;

/* ✨ posterContainerStyle 수정 */
const posterContainerStyle = css`
  position: relative;
  display: flex;
  justify-content: center;
  align-items: center;
  width: 245px;
  height: 352px;
  background: white;
  border-radius: 8px;
  overflow: hidden;
  cursor: pointer;

  &amp;:hover .description {
    opacity: 1;
    pointer-events: auto; /* ✨ 추가: hover 시 상호작용 가능하도록 */
  }
`;
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Next.js svg 불러올 때 여백 오류]]></title>
            <link>https://velog.io/@tae-log/Next.js-svg-%EB%B6%88%EB%9F%AC%EC%98%AC-%EB%95%8C-%EC%97%AC%EB%B0%B1-%EC%98%A4%EB%A5%98</link>
            <guid>https://velog.io/@tae-log/Next.js-svg-%EB%B6%88%EB%9F%AC%EC%98%AC-%EB%95%8C-%EC%97%AC%EB%B0%B1-%EC%98%A4%EB%A5%98</guid>
            <pubDate>Tue, 25 Feb 2025 08:29:07 GMT</pubDate>
            <description><![CDATA[<p>걍 svg를 4배정도 가로 세로 크게 뽑아서 넣으면 됨</p>
<p>안쪽 이미지 넣는 곳 속성에</p>
<pre><code class="language-jsx">width: 100%;
height: 100%;
object-fit: cover;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[깃허브 명령어]]></title>
            <link>https://velog.io/@tae-log/%EA%B9%83%ED%97%88%EB%B8%8C-%EB%AA%85%EB%A0%B9%EC%96%B4</link>
            <guid>https://velog.io/@tae-log/%EA%B9%83%ED%97%88%EB%B8%8C-%EB%AA%85%EB%A0%B9%EC%96%B4</guid>
            <pubDate>Fri, 14 Feb 2025 07:36:35 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>명령어 입력</p>
<ol>
<li><p><code>git init</code></p>
</li>
<li><p><code>git remote add origin 깃허브주소</code></p>
</li>
<li><p><code>git remote -v</code> </p>
<ol>
<li>(주소확인)</li>
<li>remote랑 init은 처음에 한 번만</li>
</ol>
</li>
<li><p><code>git pull origin main</code></p>
<ol>
<li>(최신버전 업데이트)</li>
</ol>
</li>
<li><p><code>git add .</code></p>
</li>
<li><p><code>git commit -m“커밋 이름”</code></p>
<ol>
<li>feat: ~~</li>
<li>fix: ~~</li>
</ol>
</li>
<li><p><code>git push origin main</code> → 🚨 절대절대절대 협업할 때는 쓰면 안 됨!!!!!</p>
<ol>
<li>(내가 변경한 거 보내는 거)</li>
<li>처음 프로젝트 생성하고 에러나면<ol>
<li><code>git branch -m master main</code> </li>
</ol>
</li>
<li>branch 하려면<ol>
<li><code>git branch</code><ol>
<li>현재 브랜치 확인</li>
</ol>
</li>
<li><code>git branch taehee1</code><ol>
<li>taehee1은 내가 새로 만들고 싶은 브랜치 이름</li>
<li><code>git checkout taehee1</code><ol>
<li>이렇게 해야 옮겨짐 taehee1로</li>
<li>checkout = switch</li>
</ol>
</li>
</ol>
</li>
<li><code>git push origin taehee1</code></li>
</ol>
</li>
</ol>
</li>
</ol>
<hr>
<ul>
<li>여러명이서 협업할 때<ul>
<li>내꺼 올릴때
git push origin feature/1
merge하기 develop&lt;-&gt;feature/1
git checkout develop
git pull origin develop
git push origin develop</li>
<li>다른 사람 한 거 가져올때
git checkout develop
git pull origin develop
git checkout 본인의_브랜치
git merge develop</li>
</ul>
</li>
</ul>
<hr>
<blockquote>
<pre><code>  여기 아래부터는 자주 쓸 일 없음</code></pre></blockquote>
</li>
</ul>
<pre><code>- 폴더 구조 바꿨을 때
    1. 바꾼 폴더에서 `git init`
    2. `git remote add origin 깃허브주소`
    3. `git add -A`
    4. `git commit -m&quot;폴더 구조 변경&quot;`
    5. 원격 변경 사항을 로컬에 가져오기

        `git pull origin main --rebase`

        1. (만약 충돌이 발생할 경우 해결하기)

             1.  `git status`로 어떤 파일에서 충돌이 났는지 확인

            1. 충돌을 해결한 후, 다시 커밋

                ```bash
                git add -A
                git rebase --continue
                ```

    6. `git branch -m master main`
    7. `git push origin main`</code></pre><hr>
<ul>
<li><p>commit 메세지 수정</p>
<ul>
<li><p>바로 직전 꺼 수정</p>
<ul>
<li><p>아직 push 하지 않았다면</p>
<pre><code>   ```
   git commit --amend -m &quot;새로운 커밋 메시지&quot;
   ```</code></pre><ul>
<li><p>push 했다면</p>
<pre><code class="language-bash">  git commit --amend -m &quot;새로운 커밋 메시지&quot;
  git push --force-with-lease</code></pre>
</li>
</ul>
</li>
</ul>
</li>
<li><p>이전전전 꺼 수정</p>
<ol>
<li><p>최근 4개 보려면</p>
<pre><code>  ```bash
  git rebase -i HEAD~4
  ```</code></pre></li>
<li><p><code>i</code> 입력하면 Insert 모드로 바뀜</p>
<pre><code>  수정하려는 커밋들의 `pick`을 `reword`로 변경 (내용은 아직 변경 x)</code></pre></li>
<li><p><code>esc</code> → <code>:wq</code> 입력 → <code>Enter</code> </p>
</li>
<li><p>여기서 하나씩 뜨는 커밋 내용 바꾸기</p>
<ol>
<li><p>여기서도 i 입력한다음 수정하고,</p>
<pre><code>   `esc` → `:wq` 입력 → `Enter`</code></pre></li>
</ol>
</li>
<li><p>전에 커밋들 push까지 다했으면 force도 해줘야함</p>
<pre><code>  ```bash
  git push --force-with-lease
  ```</code></pre></li>
</ol>
</li>
</ul>
<hr>
<ul>
<li><p>commit 깃허브에서 삭제 되었을 때</p>
<ol>
<li><p>최근 작업 기록 확인</p>
<pre><code>  ```bash
  git reflog
  ```

  - ex) 출력 결과

      ```bash
      4f5a1d2 HEAD@{1}: rebase (pick): feat: 강의4 완료
      3d9c8a6 HEAD@{2}: rebase (pick): feat: map 기초
      b7e2d5f HEAD@{3}: rebase (pick): feat: map에 있는 이것저것들
      ```</code></pre></li>
<li><p>오래된 순 (3 → 2 → 1)으로 복구</p>
<pre><code>  ```bash
  git reset --hard HEAD@{3}

  git reset --hard HEAD@{2}

  git reset --hard HEAD@{1}
  ```    </code></pre><ol start="3">
<li><p>force</p>
<pre><code class="language-bash">   git push --force-with-lease</code></pre>
<pre><code class="language-bash">   git checkout main

   git push --set-upstream origin main --force-with-lease</code></pre>
</li>
</ol>
</li>
</ol>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[matplotlib 한글 깨짐 (mac)]]></title>
            <link>https://velog.io/@tae-log/matplotlib-%ED%95%9C%EA%B8%80-%EA%B9%A8%EC%A7%90-mac</link>
            <guid>https://velog.io/@tae-log/matplotlib-%ED%95%9C%EA%B8%80-%EA%B9%A8%EC%A7%90-mac</guid>
            <pubDate>Tue, 11 Feb 2025 09:33:36 GMT</pubDate>
            <description><![CDATA[<p>plt.rcParams[&#39;font.family&#39;] =&#39;AppleGothic&#39;
plt.rcParams[&#39;axes.unicode_minus&#39;] =False</p>
<p>이렇게 하면 해결되고,</p>
<p>다른 글씨체 하려면
<a href="https://giveme-happyending.tistory.com/168">여기 참고(윈도우 기준)</a></p>
<p><a href="https://sy-log.tistory.com/entry/matplotlib-pltpyplot-%ED%95%9C%EA%B8%80-%EA%B9%A8%EC%A7%90-%ED%95%9C%EA%B8%80%ED%8F%B0%ED%8A%B8-%ED%91%9C%EC%8B%9C%ED%95%98%EA%B8%B0">참고한 링크</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[jupyter notebook pdf 만들기]]></title>
            <link>https://velog.io/@tae-log/jupyter-notebook-pdf-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@tae-log/jupyter-notebook-pdf-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Tue, 11 Feb 2025 06:17:22 GMT</pubDate>
            <description><![CDATA[<p>File -&gt; Save and Export Notebook as -&gt; HTML</p>
<p><img src="https://velog.velcdn.com/images/tae-log/post/076f1b87-f337-4db9-86c4-87621dd9abb9/image.png" alt=""></p>
<p>한 다음에
다운로드 된 html 파일 크롬으로 열어서</p>
<p>⋮누르고 인쇄 눌러서 pdf로 저장</p>
<p><img src="https://velog.velcdn.com/images/tae-log/post/885f6a64-b9b7-485e-b807-ece87ad06c15/image.png" alt="">
<img src="https://velog.velcdn.com/images/tae-log/post/aebb3358-0e81-41f0-8f1b-f6f8fbfed044/image.png" alt=""></p>
<p><a href="https://marinelifeirony.tistory.com/101">출처</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 프로그래밍 - 자료구조 및 알고리즘 수업]]></title>
            <link>https://velog.io/@tae-log/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EB%B0%8F-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%88%98%EC%97%85</link>
            <guid>https://velog.io/@tae-log/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EB%B0%8F-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%88%98%EC%97%85</guid>
            <pubDate>Tue, 04 Feb 2025 01:47:28 GMT</pubDate>
            <description><![CDATA[<h3 id="14-search-and-sorting">14. search and sorting</h3>
<hr>
<p>순차탐색</p>
<ul>
<li><p>링크</p>
<p>  <a href="https://heytech.tistory.com/63">[알고리즘] 순차 탐색(Sequential Search)에 대해 알아보자!(+Python 구현)</a></p>
</li>
<li><p>코드 세가지</p>
<pre><code class="language-python">  def linear_search_while(L: list, value: Any) -&gt; int:
      i = 0
      while i &lt; len(L) and L[i] != value:
          i = i + 1
      if i == len(L):
          return -1
      else:
          return i</code></pre>
<pre><code class="language-python">  def linear_search_sentinel(L: list, value: Any) -&gt; int:
      L.append(value) # Add the sentinel
      i = 0
      while L[i] != value:
          i = i + 1
      L.pop() # Remove the sentinel
      if i == len(L):
          return -1
      else:
          return i</code></pre>
<pre><code class="language-python">  def linear_search_for(L: list, value: Any) -&gt; int:
      for i in range(len(L)):
          if L[i] == value:
              return i
      return -1</code></pre>
</li>
</ul>
<p>이진탐색</p>
<ul>
<li><p>링크</p>
<p>  <a href="https://heytech.tistory.com/64">[알고리즘] 이진 탐색(Binary Search)에 대해 알아보자!(+Python 구현)</a></p>
</li>
<li><p>코드</p>
<pre><code class="language-python">  def binary_search(L: list, v: Any) -&gt; int:
          start, end = 0, len(L) – 1
          while start != end + 1:
              mid = (start+end) // 2
              if L[mid] &lt; v:
                  start = mid + 1
              else:
                  end = mid - 1
          if start &lt; len(L) and L[start] == v:
              return start
          else:
              return -1</code></pre>
</li>
</ul>
<p>선택 정렬</p>
<ul>
<li><p>링크</p>
<p>  <a href="https://prodo-developer.tistory.com/110">[Algorithm] 선택정렬 / 버블정렬 / 삽입정렬</a></p>
<p>  <a href="https://prosto.tistory.com/159">선택 정렬(Selection Sort) - C언어/자료구조</a></p>
</li>
<li><p>코드</p>
<pre><code class="language-python">  def selection_sort(L: list) -&gt; None:
      for i in range(len(L)):
          smallest = find_min(L, i)
          L[i], L[smallest] = L[smallest], L[i] # swap

  def find_min(L: list, start_idx: int) -&gt; int:
      smallest = start_idx # (1) Initialize smallest
      for i in range(start_idx+1, len(L)): # (2) Update smallest
          if L[i] &lt; L[smallest]:
              smallest = i
          return smallest # (3) Return the final value</code></pre>
<pre><code class="language-python">  def selection_sort(L: list) -&gt; None:
      for i in range(len(L)):
          smallest = i
          for j in range(i+1, len(L)):
              if L[j] &lt; L[smallest]:
                  smallest = j
          L[i], L[smallest] = L[smallest], L[i] # swap</code></pre>
</li>
<li><p>시간복잡도 : O(n^2)</p>
</li>
</ul>
<h3 id="15-sorting-and-big-o">15. sorting and big O</h3>
<hr>
<p>삽입정렬</p>
<ul>
<li><p>링크</p>
<p>  <a href="https://gmlwjd9405.github.io/2018/05/06/algorithm-insertion-sort.html">[알고리즘] 삽입 정렬(insertion sort)이란 - Heee&#39;s Development Blog</a></p>
</li>
<li><p>ex) 카드 게임할 때 카드 정렬</p>
</li>
<li><p>코드</p>
<pre><code class="language-python">  def insertion_sort(L: list) -&gt; None:
      for i in range(1, len(L)):
          insert(L, i)

  def insert(L: list, last_idx: int) -&gt; None:
      for i in range(last_idx,0,-1): # (1) Go backwards
          if L[i-1] &gt; L[i]: # (2) Check stopping condition
              L[i-1], L[i] = L[i], L[i-1] # (3) Swap
          else:
              break</code></pre>
<pre><code class="language-python">  def insertion_sort(L: list) -&gt; None:
      for i in range(1, len(L)):
          for j in range(i,0,-1): # (1) Go backwards
              if L[j-1] &gt; L[j]: # (2) Check stopping condition
                  L[j-1], L[j] = L[j], L[j-1] # (3) Swap
              else:
                  break</code></pre>
</li>
<li><p>시간복잡도 : O(n^2)</p>
</li>
</ul>
<h3 id="16-recursion-and-mergesort">16. recursion and mergesort</h3>
<hr>
<p>피보나치 재귀</p>
<ul>
<li><p>코드</p>
<pre><code class="language-python">  def fibonacci(n: int) -&gt; int:
      if n == 1 or n == 2:
          return n
      else:
          return fibonacci(n-1) + fibonacci(n-2)</code></pre>
</li>
</ul>
<p>합병정렬</p>
<ul>
<li><p>링크</p>
<p>  <a href="https://gmlwjd9405.github.io/2018/05/08/algorithm-merge-sort.html">[알고리즘] 합병 정렬(merge sort)이란 - Heee&#39;s Development Blog</a></p>
</li>
<li><p>코드</p>
<pre><code class="language-python">  def mergeSortHelp(L: list, first: int, last: int) -&gt; None:
      if first == last: # Conditional statements
          return # Base case
      else: 
          mid = first + (last – first) // 2
          mergeSortHelp(L, first, mid) # Recursive call for sublist1
          mergeSortHelp(L, mid+1, last) # Recursive call for sublist2
          merge(L, first, mid, last) # Merge the two (sorted) sublists</code></pre>
<pre><code class="language-python">  def merge(L: list, first: int, mid: int, last: int) -&gt; None:
      k = first
      sub1 = L[first:mid+1]
      sub2 = L[mid+1:last+1]
      i = j = 0
      while i &lt; len(sub1) and j &lt; len(sub2):
          if sub1[i] &lt;= sub2[j]:
              L[k] = sub1[i]
              i = i+1
          else:
              L[k] = sub2[j]
              j = j+1
          k = k+1</code></pre>
</li>
<li><p>시간 복잡도</p>
<ul>
<li>O(NlogN)</li>
</ul>
</li>
<li><p>공간 복잡도</p>
<ul>
<li>O(N)</li>
</ul>
</li>
</ul>
<p>Tim Sort</p>
<ul>
<li>merge sort + insertion sort</li>
</ul>
<h3 id="17--arrays-and-linked-lists">17.  arrays and linked lists</h3>
<hr>
<p>Array</p>
<ul>
<li>장점<ul>
<li>접근이 쉽다</li>
<li>옆집</li>
</ul>
</li>
<li>단점<ul>
<li>resize가 어렵다 (사이즈를 늘리려 할 때 힘들다)</li>
<li>유동성이 떨어진다</li>
</ul>
</li>
</ul>
<p>Linked List</p>
<ul>
<li><p>장점</p>
<ul>
<li>데이터 추가가 빠르다</li>
<li>유동성이 좋다</li>
</ul>
</li>
<li><p>단점</p>
<ul>
<li>엑세스 속도가 느리다</li>
<li>집 주소 알려면 앞 주소에 가야한다</li>
</ul>
</li>
<li><p>코드</p>
<pre><code class="language-python">  class SLList():
      def __init__(self) -&gt; None:
          self.first = None

      def addFirst(self, x: int) -&gt; None:
          newFirst = LinkedNode(x)
           newFirst.next = self.first
          self.first = newFist

      def getFirst(self) -&gt; int:
          if self.first:
              return self.first.val
          return None</code></pre>
<pre><code class="language-python">  class SLList():
      def __init__(self) -&gt; None:
          self.first = None
          self.size = 0
      def addFirst(self, x: int) -&gt; None:
          newFirst = LinkedNode(x)
          newFirst.next = self.first
          self.first = newFirst
          self.size += 1
      def getFirst(self) -&gt; int:
          if self.first:
              return self.first.val
          return None
      def getSize(self) -&gt; int:
          return self.size

      def append(self, x: int) -&gt; None:
          self.size += 1
          curNode = self.first
          while(curNode.next != None):
          curNode = curNode.next
          curNode.next = LinkedNode(x)</code></pre>
<pre><code class="language-python">  class SLList():
      def __init__(self) -&gt; None:
          self.sentinel = LinkedNode(0)
          self.size = 0
      def addFirst(self, x: int) -&gt; None:
          newFirst = LinkedNode(x)
          newFirst.next = self.sentinel.next
          self.sentinel.next = newFirst
          self.size += 1
      def getFirst(self) -&gt; int:
          if self.sentinel.next:
              return self.sentinel.next.val
          return None
      def getSize(self) -&gt; int: # Improved with caching!
          return self.size

  def append(self, x: int) -&gt; None: # Improved with sentinel!
      self.size += 1
      curNode = self.sentinel
      while curNode.next != None:
          curNode = curNode.next
  curNode.next = LinkedNode(x)</code></pre>
</li>
</ul>
<h3 id="18-queues-and-stacks">18. queues and stacks</h3>
<hr>
<ul>
<li>큐 queue<ul>
<li>FIFO</li>
<li>pop()에 파라미터 필요없다</li>
</ul>
</li>
<li>스택 stack<ul>
<li>LIFO</li>
<li>pop()에 파라미터 필요없다</li>
<li>ex)<ul>
<li>가장 최근에 열린 괄호랑 매칭</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="22-binary-search-trees">22. binary search trees</h3>
<hr>
<ul>
<li><p>이진탐색 트리</p>
<p>  <a href="https://yoongrammer.tistory.com/71">[자료구조] 이진 탐색 트리 (BST, Binary Search Tree)</a></p>
<ul>
<li>삽입<ul>
<li>루트보다 크면 오른쪽 작으면 왼쪽에</li>
</ul>
</li>
<li>삭제<ul>
<li>자식이 없으면<ul>
<li>그냥 지우고</li>
</ul>
</li>
<li>자식이 1개 있으면<ul>
<li>부모랑 연결해주고 본인 지움</li>
</ul>
</li>
<li>자식이  2개 있으면<ul>
<li>왼쪽 중에서 가장 큰 거 or 오른쪽 중에서 가장 작은 거랑 위치 바꿈</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>코드</p>
<pre><code class="language-python">  class TreeNode():
      def __init__(self, x: int):
          self.val = x
          self.left = None
          self.right = None

  class BST():
      def __init__(self):
          self.root = None
      def search(self, x: int):
      def insert(self, x: int):
      def delete(self, x: int):</code></pre>
</li>
</ul>
<h3 id="23-trees">23. trees</h3>
<hr>
<ul>
<li><p>BFS &amp; DFS</p>
<p>  <a href="https://velog.io/@gusdh2/DFS-vs-BFS-%EA%B9%8A%EC%9D%B4%EC%9A%B0%EC%84%A0%ED%83%90%EC%83%89-vs-%EB%84%88%EB%B9%84%EC%9A%B0%EC%84%A0%ED%83%90%EC%83%89">DFS vs BFS (깊이우선탐색 vs 너비우선탐색)</a></p>
<ul>
<li><p>BFS</p>
<pre><code class="language-python">  class Tree():
      def visit(self, node: TreeNode):
          print(node.val)

      def BFT(self):
          if self.root == None:
              return
          q = [self.root]
          while q:
              curNode = q.pop(0)
              self.visit(curNode)
              for childNode in curNode.child:
                  if childNode:
                      q.append(childNode)</code></pre>
<pre><code class="language-python">  class Tree():
      def visit(self, node: TreeNode):
          print(node.val)

  def BFT(self):
      if self.root == None:
          return
      q = deque([self.root])
      while q:
          curNode = q.popleft()
          self.visit(curNode)
          for childNode in curNode.child:
              if childNode:
                  q.append(childNode)</code></pre>
</li>
</ul>
</li>
</ul>
<ul>
<li>Preorder, Inorder, Postorder</li>
</ul>
<pre><code>- 자녀 방문하기 전에 오면
    - 프리오더
- 자녀 방문하던 중에 오면
    - 인오더
- 자녀 방문하고 나서 오면
    - 포스트오더
- 코드
    - preorder

        ```python
        class Tree():
            def visit(self, node: TreeNode):
                print(node.val)

            def __DFT_preorderHelp(self, curNode: TreeNode):
                if curNode == None:
                    return
                self.visit(curNode)
                    for childNode in curNode.child:
                        self.__DFT_preorderHelp(childNode)

        def DFT_preorder(self):
            self.__DFT_preorderHelp(self.root)
        ```

    - inorder

        ```python
        class Tree():
                def visit(self, node: TreeNode):
                    print(node.val)

                def __DFT_inorderHelp(self, curNode: TreeNode):
                    if curNode == None:
                        return
                    for i in range(len(curNode.child)):
                        if i == 1:
                            self.visit(curNode)
                        self.__DFT_inorderHelp(curNode.child[i])

        def DFT_inorder(self):
            self.__DFT_inorderHelp(self.root)
        ```

    - postorder

        ```python
        class Tree():
            def visit(self, node: TreeNode, size: float) -&gt; None:
                node.val += size

            def __DFT_postorderHelp(curNode: TreeNode) -&gt; float:
                if not curNode:
                    return 0
                subSize = 0
                for i in range(len(curNode.child)):
                    subSize += self.__DFT_postorderHelp(curNode.child[i])
                self.visit(curNode, subSize)
                return curNode.val

        def DFT_postorder(self) -&gt; float:
            return self.__DFT_postorderHelp(self.root)
        ```</code></pre><h3 id="24-graphs">24. graphs</h3>
<hr>
<ul>
<li><p>Vertex : 노드</p>
</li>
<li><p>Edge : 노드의 쌍</p>
</li>
<li><p>path : 경로</p>
</li>
<li><p>simple path</p>
<ul>
<li>노드가 겹치지 않는</li>
</ul>
</li>
<li><p>cyclic</p>
<ul>
<li>사이클이 하나라도 있으면</li>
</ul>
</li>
<li><p>acyclic</p>
<ul>
<li>사이클이 전혀 없으면</li>
<li>ex) simple path</li>
</ul>
</li>
<li><p>undirected vs directed</p>
<ul>
<li>엣지는 방향성이 있을 수도 없을 수도 있음</li>
<li>Tree는 방향성 있음<ul>
<li>부모 → 자식</li>
</ul>
</li>
</ul>
</li>
<li><p>그래프 설계</p>
<pre><code class="language-python">  class undi_graph():
      def __init__(self, V: list, E: list) -&gt; None:
          self.V = V[:]
          self.neighbor = {}
          for v in V:
              self.neighbor[v] = []
          for (v, w) in E:
              self.neighbor[v].append(w)
              self.neighbor[w].append(v)</code></pre>
<ul>
<li><p>preorder 그래프</p>
<pre><code class="language-python">  class undi_graph():
      def __DFTHelp(self, visited: list, v: int) -&gt; None:
      if not visited[v]:
          visited[v] = True
          print(v)
          for w in self.neighbor[v]:
              self.__DFTHelp(visited, w)

  def DFT(self) -&gt; None:
          if self.V:
              visited = {}
          for v in self.V:
              visited[v] = False
          for v in self.V:
              self.__DFTHelp(visited, v)</code></pre>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 프로그래밍 - 파이썬 수업]]></title>
            <link>https://velog.io/@tae-log/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%88%98%EC%97%85</link>
            <guid>https://velog.io/@tae-log/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%88%98%EC%97%85</guid>
            <pubDate>Tue, 04 Feb 2025 01:45:21 GMT</pubDate>
            <description><![CDATA[<h3 id="1--intro">1.  Intro</h3>
<hr>
<p>알고리즘</p>
<ul>
<li>컴퓨터가 따라가는 논리적인 스텝</li>
</ul>
<p>프로그램</p>
<ul>
<li>알고리즘 번역한 거</li>
<li>특정 프로그래밍 언어로 쓰여있어야함</li>
</ul>
<p>Defining</p>
<p>Combining(Reusing)</p>
<p>애매함이 전혀 없어야함</p>
<h3 id="2--abstrction">2.  abstrction</h3>
<hr>
<p>추상화</p>
<p>사람이 한계가 있어서 추상화 필요</p>
<h3 id="3-hello-python">3. hello python</h3>
<hr>
<p>/ 소수점나오는 나눗셈</p>
<p>// 몫만 나오는 나눗셈</p>
<p>% 나머지</p>
<p>** 제곱</p>
<p>우선순위</p>
<p>**</p>
<p>-(음수)</p>
<p>*, /, //, %</p>
<p>+, -</p>
<p>int float</p>
<p>function 속에 function 넣을 수 있다</p>
<p>변수 이름은</p>
<ul>
<li>숫자로 시작 못하고</li>
<li>띄어쓰기 못함</li>
</ul>
<p>= 는 같다는 뜻이 아님</p>
<p>x, y = 1, 2</p>
<p>y, x = x, y 가능</p>
<p>이름(id) 안에 주소(address) 따라가면 value</p>
<p>할당 다시할때 자리를 차지하는게 아니라</p>
<p>다른 주소로 가는 느낌임</p>
<h3 id="4-function">4. function</h3>
<hr>
<p>들여쓰기 있어야함</p>
<p>지역변수 : 임시적</p>
<p>전역변수가 기본</p>
<h3 id="5-reassignment-practice">5. reassignment practice</h3>
<hr>
<p>float</p>
<ul>
<li>8/4</li>
<li>2.0-2.0+2</li>
<li>2*1.0</li>
<li>min(3, 2.0)</li>
<li>max(2.0, 2)</li>
</ul>
<h3 id="6-strings">6. strings</h3>
<hr>
<p>str</p>
<ul>
<li>len</li>
<li>+<ul>
<li>스트링끼리 더해서 연결</li>
<li>‘I’+’like’+’you’</li>
</ul>
</li>
<li>*<ul>
<li>스트링끼리 곱하기</li>
<li>“hi”*5</li>
</ul>
</li>
<li>\<ul>
<li>\’, \”, \, \t, \n, \r</li>
</ul>
</li>
</ul>
<p>boolean type</p>
<ul>
<li>True</li>
<li>False</li>
<li><blockquote>
<p>, &lt;, &gt;=, &lt;=, ==, !=</p>
</blockquote>
</li>
<li>숏컷<ul>
<li>에러를 띄워야하는데 읽지 않으니까 좋은 건 아님</li>
</ul>
</li>
<li>“” in “” → True</li>
</ul>
<p>조건문</p>
<ul>
<li>IF</li>
<li>Else</li>
</ul>
<h3 id="7-modules">7. modules</h3>
<hr>
<p>import math</p>
<p>import math as my_math</p>
<p>A.B</p>
<ul>
<li>A로 찾아가서 B라는 이름을 찾아라</li>
</ul>
<p>모듈 변수의 값을 변경할 수 있으나 하지마라!</p>
<p>내장함수도 변수이름으로 사용하지 말아라!</p>
<p>import * 하지마라</p>
<p>모듈은 파일 이름이 모듈</p>
<p>클래스는 여러개 양산 object들을 만들 수 있다</p>
<p>매소드는 클래스 안에 있는 함수 (파라미터 일일히 안 써도 됨)</p>
<p>나를 포함하는 클래스 object가 디폴트로 알규먼트에 들어감</p>
<h3 id="9-lists">9. lists</h3>
<hr>
<p>리스트는 </p>
<ul>
<li><p>순서가 있다</p>
</li>
<li><p>유연하다</p>
</li>
<li><p>검색 느림</p>
</li>
<li><p>수정할 수 있다</p>
</li>
<li><p>[]</p>
</li>
<li><p>0    1   2   3</p>
</li>
<li><p>-4 -3 -2 -1</p>
</li>
</ul>
<p>리스트 안에 리스트</p>
<ul>
<li>수정 가능</li>
</ul>
<p>리스트 메소드</p>
<ul>
<li>append<ul>
<li>새로운 걸 맨 마지막에</li>
</ul>
</li>
<li>insert<ul>
<li>한 칸씩 밀림</li>
</ul>
</li>
<li>students.sort(reverse=True)<ul>
<li>내림차순</li>
</ul>
</li>
</ul>
<p>카피</p>
<ul>
<li>슬라이싱 사용</li>
<li>원본 영향x</li>
</ul>
<p>Alias</p>
<ul>
<li>이름 사용</li>
<li>아예 똑같다</li>
</ul>
<h3 id="10-loops">10. loops</h3>
<hr>
<p>내림차순 하려면</p>
<p>start&gt;stop, step&lt;0</p>
<p>break</p>
<ul>
<li>해당하는 반복문을 나간다</li>
</ul>
<p>continue</p>
<ul>
<li>반복문을 계속 돈다</li>
</ul>
<p>반복문 문제점</p>
<p>: 무한반복</p>
<h3 id="11-sets">11. sets</h3>
<hr>
<p>sets</p>
<ul>
<li><p>순서없고</p>
<ul>
<li>몇 번째 가져오기 불가능</li>
</ul>
</li>
<li><p>중복x</p>
</li>
<li><p>검색기능이 빠르다</p>
<ul>
<li>해싱때문에</li>
</ul>
</li>
<li><p>set은 수정 가능</p>
<ul>
<li>add remove 가능<ul>
<li>순서 없으므로 위치 지정 불가능</li>
</ul>
</li>
<li>BUT, 요소는 수정 불가능</li>
</ul>
</li>
<li><p>비어있는 중괄호 쓰면 안 됨</p>
<ul>
<li><p>비어있는 set는</p>
<ul>
<li><p>a = set()</p>
<p>  이렇게 써야 함</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p>{”a“, “b”}</p>
</li>
<li><p>반복이 없고 순서가 필요하지 않은 조건에서 hashing 쓸 수 있음</p>
</li>
</ul>
<p>tuples</p>
<ul>
<li>읽기 전용</li>
<li>순서 있다</li>
<li>유연하다</li>
<li>검색 느림</li>
<li>튜플은 수정 안 되는데 튜플 안에 있는 리스트 같은 거를 건드리면 수정 가능</li>
<li>add나 remove 이런 거 없음</li>
<li>한 개짜리는 컴마 해야함<ul>
<li>(8,)</li>
<li>(5+3,)</li>
</ul>
</li>
</ul>
<p>딕셔너리</p>
<ul>
<li>키 중복 안 됨</li>
<li>검색 빠름</li>
<li>{}</li>
<li>키, 값</li>
<li>메소드<ul>
<li>ex) dict_grades.pop(k,v)<ul>
<li>없으면 없다는 뜻으로 v를 보여줘</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>비교</p>
<table>
<thead>
<tr>
<th></th>
<th>기호</th>
<th>순서 있는지</th>
<th>수정 가능한지</th>
<th>중복 가능한지</th>
</tr>
</thead>
<tbody><tr>
<td>리스트</td>
<td>[</td>
<td>O</td>
<td>O</td>
<td>O</td>
</tr>
<tr>
<td>세트</td>
<td>{</td>
<td>X</td>
<td>O (요소는 불가능)</td>
<td>X</td>
</tr>
<tr>
<td>튜플</td>
<td>(</td>
<td>O</td>
<td>X (요소가 수정 가능하면 가능)</td>
<td>O</td>
</tr>
<tr>
<td>딕셔너리</td>
<td>{</td>
<td>어느 버전부터는 있음</td>
<td>O</td>
<td>키: X, 값: O</td>
</tr>
</tbody></table>
<h3 id="12-file-io">12. file io</h3>
<hr>
<ul>
<li><p>file = open(’file_example.txt’, ‘r’)</p>
<ul>
<li>r : 읽기 모드</li>
<li>w : 쓰기 모드</li>
<li>a : 뒤에다가 덧붙일 때</li>
</ul>
</li>
<li><p>current location</p>
<ul>
<li>커서</li>
<li>현재 주목하는 부분</li>
</ul>
</li>
</ul>
<p>경로</p>
<ul>
<li><p>절대경로</p>
<ul>
<li>/로 시작</li>
</ul>
</li>
<li><p>상대경로</p>
<ul>
<li>../</li>
<li>윗 디렉토리로 감</li>
</ul>
</li>
<li><p>경로 알려주기</p>
<pre><code class="language-python">  import os

  os.getcwd() # 현재 경로 알려주기 (커랜트 월킹 디렉토리)

  os.chdir(&quot;/User/hskim/Desktop&quot;) # 경로 바꾸기 (체인지 디렉토리)</code></pre>
</li>
</ul>
<table>
<thead>
<tr>
<th><code>.read()</code></th>
<th>파일 전체를 문자열로 반환</th>
<th>파일 전체를 한 번에 읽기. 메모리 많이 사용</th>
</tr>
</thead>
</table>
<table>
<thead>
<tr>
<th><code>.readline()</code></th>
<th>한 줄을 문자열로 반환</th>
<th>한 번에 한 줄씩 읽기. 반복문 사용 가능</th>
</tr>
</thead>
</table>
<table>
<thead>
<tr>
<th><code>.readlines()</code></th>
<th>모든 줄을 리스트로 반환</th>
<th>모든 줄을 리스트로 저장</th>
</tr>
</thead>
</table>
<ul>
<li><p>lines.strip()</p>
<ul>
<li>양 끝에 공백 제거</li>
</ul>
</li>
<li><p>line = line.decode(”utf-8”)</p>
</li>
<li><p>헤더  스킵하는 방법</p>
<p>  <code>line = skip_header(input_file)</code></p>
</li>
<li><p>에러 해결</p>
<p>  <code>if line != ‘-’:</code></p>
</li>
</ul>
<h3 id="13-object-oriented-programming">13. object-oriented programming</h3>
<hr>
<p>4원칙</p>
<ul>
<li>Encapsulation<ul>
<li>캡슐 안에 넣는다</li>
</ul>
</li>
<li>Abstraction<ul>
<li>숨기고 필요한 것만 오픈한다</li>
</ul>
</li>
<li>Inheritance<ul>
<li>상속</li>
</ul>
</li>
<li>Polymorphism<ul>
<li>다형성</li>
</ul>
</li>
</ul>
<ol>
<li><strong>캡슐화:</strong> 관련 데이터를 객체로 묶어 관리.</li>
<li><strong>추상화:</strong> 내부 구현을 감추고 인터페이스만 제공.</li>
<li><strong>상속:</strong> 부모 클래스의 속성과 메서드를 자식 클래스에서 재사용.</li>
<li><strong>다형성:</strong> 동일한 이름의 메서드가 객체에 따라 다르게 동작.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터베이스 나머지 정리 (b+ tree, indexing, transaction, recovery etc.)]]></title>
            <link>https://velog.io/@tae-log/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EB%82%98%EB%A8%B8%EC%A7%80-%EC%A0%95%EB%A6%AC-b-tree-indexing-transaction-recovery-etc</link>
            <guid>https://velog.io/@tae-log/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EB%82%98%EB%A8%B8%EC%A7%80-%EC%A0%95%EB%A6%AC-b-tree-indexing-transaction-recovery-etc</guid>
            <pubDate>Tue, 04 Feb 2025 01:41:22 GMT</pubDate>
            <description><![CDATA[<h3 id="51-io-physical-storage-of-relations-and-access-methods">5.1 (IO) Physical Storage of relations and access methods</h3>
<hr>
<p>논리적 레벨</p>
<ul>
<li>관계로 구성, 관계는 레코드의 집합, 레코드는 속성으로 이루어짐</li>
</ul>
<p>물리적 레벨</p>
<ul>
<li>슬롯 페이지 구조 → 추가, 삭제, 업데이트 시의 공간 활용 최적화</li>
</ul>
<p>페이지 크기</p>
<ul>
<li>보통 8KB</li>
</ul>
<p>파일 레코드 구조</p>
<ul>
<li><p>블록 인터페이스</p>
<ul>
<li>입출력 작업을 위해</li>
</ul>
</li>
<li><p>But,  더 높은 수준에서는 레코드와 레코드 파일을 처리</p>
</li>
<li><p>테이블마다 하나의 파일이 존재</p>
<ul>
<li>하나의 파일은 여러 페이지로 구성<ul>
<li>각 페이지는 여러 레코드들을 포함</li>
</ul>
</li>
</ul>
</li>
<li><p>파일에서 지원해야하는 작업들</p>
<ol>
<li>레코드 삽입/삭제/수정</li>
<li>특정 레코드 가져오기</li>
<li>모든 레코드 스캔</li>
</ol>
</li>
</ul>
<p>Unordered Heap files</p>
<ul>
<li>가장 간단한 파일 구조</li>
<li>레코드 수준 작업을 지원하려면<ul>
<li>파일 내 페이지 추적</li>
<li>페이지 내 여유 공간 추적</li>
<li>페이지 내 레코드 추적</li>
</ul>
</li>
</ul>
<p>힙 파일</p>
<ul>
<li>페이지 디렉토리 사용<ul>
<li>링크드 리스트로 페이지 연결보다 크기 작게 할 수 있음</li>
</ul>
</li>
</ul>
<p>테이블스페이스(Tablespace)</p>
<ul>
<li>논리적 DBMS 파일, 여러개의 물리적 파일 포함</li>
</ul>
<p>세그먼트(Segment)</p>
<ul>
<li>데이터를 저장하는 단위</li>
</ul>
<p>익스텐트(Extent)</p>
<ul>
<li>디스크 공간 할당 단위</li>
</ul>
<p>디스크 블록(Block)</p>
<ul>
<li>행이나 튜플은 디스크 블록에 저장됨</li>
</ul>
<p>10만개 페이지면</p>
<ul>
<li><p>안에 100만개 레코드</p>
<p>  각 페이지에 10개씩</p>
<p>  8KB에 800MB</p>
<p>  → 100만개 페이지에 800MB</p>
</li>
</ul>
<p>디스크 공간의 가장 낮은 계층</p>
<ul>
<li>실제 디스크 공간을 관리함</li>
</ul>
<p>상위 계층의 호출</p>
<ul>
<li>페이지 할당/해제</li>
<li>페이지 읽기/쓰기</li>
</ul>
<p>페이지의 연속 할당</p>
<ul>
<li>페이지 요청 시 연속적으로 할당해야함</li>
</ul>
<p>페이지 포맷(Page Formats)</p>
<ul>
<li>record id = &lt;page id, slot#&gt;</li>
<li>레코드를 페이지 내에서 위치를 찾아 바로 가져올 수 있다</li>
<li>레코드 이동시키는 거 허용x<ul>
<li>외부 참조 때문</li>
</ul>
</li>
</ul>
<p>가변 길이 레코드(Variable Length Records)</p>
<ul>
<li>슬로티드 페이지 구조(Slotted Page Structure)<ul>
<li>레코드 페이지 내에서 이동 가능<ul>
<li>외부참조 깨지지 않음</li>
</ul>
</li>
</ul>
</li>
<li>slot Array로 관리<ul>
<li>&lt;record offset, length&gt;</li>
</ul>
</li>
<li>데이터 공간과 슬롯 배열이 만나는 지점 → 페이지가 가득 참</li>
</ul>
<p>Row-Store</p>
<ul>
<li>저장할 때</li>
</ul>
<p>Column-Store</p>
<ul>
<li>분석할 때</li>
</ul>
<p>Record Format : 고정 길이</p>
<ul>
<li>필드 타입 동일</li>
<li>시스템 카탈로그에 저장됨</li>
</ul>
<p>Record Format : 가변 길이</p>
<ul>
<li>i번째 필드에 대한 직접 접근 가능</li>
<li>Null 값의 효율적인 저장 지원</li>
<li>소량의 오버헤드만 발생시킴</li>
</ul>
<p>System Catalogs</p>
<ul>
<li>data dictionary</li>
<li>카탈로그는 관계형 데이터로 저장됨</li>
</ul>
<p>전체 테이블 스캔</p>
<ul>
<li><p>엑세스 방법</p>
<ul>
<li><p>모든 데이터를 읽는 거</p>
<pre><code class="language-sql">SELECT SUM(a)
FROM test;</code></pre>
</li>
<li><p>인덱스 기반 접근</p>
<ul>
<li>인덱스를 통해 빠르게 찾음</li>
</ul>
</li>
</ul>
</li>
<li><p>비용 모델</p>
<ul>
<li>디스크 I/O 수로 측정됨</li>
</ul>
</li>
</ul>
<p>OLAP vs OLTP</p>
<ul>
<li><p>OLAP (Analytical)</p>
<ul>
<li>분석적 처리를 위한 시스템</li>
<li>미리 집계, 최적화된 형태로 저장</li>
</ul>
</li>
<li><p>OLTP (Transactional)</p>
<ul>
<li><p>트랜잭션 처리를 위한 시스템</p>
</li>
<li><p>일상적인 트랜잭션 처리를 목표로, 상시 운영</p>
</li>
<li><p>짧고 간단한 쿼리</p>
</li>
<li><p>예시</p>
<ul>
<li><p>포인트 쿼리 (Point Query):</p>
<ul>
<li><p>특정 값에 대해 단 하나의 레코드를 검색하는 쿼리</p>
</li>
<li><p>ex)</p>
<ul>
<li><p><code>A</code> 컬럼에서 값이 <code>500000</code>인 레코드를 찾는 쿼리는 포인트 쿼리</p>
<pre><code class="language-sql">  SELECT B 
  FROM TEST 
  WHERE A = 500000;  /* 포인트 쿼리 */</code></pre>
<ul>
<li>이 쿼리는 <code>A = 500000</code>인 단 하나의 레코드를 검색합니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>범위 쿼리 (Range Query):</p>
<ul>
<li><p>특정 범위에 속하는 여러 레코드를 검색하는 쿼리</p>
</li>
<li><p>ex)</p>
<ul>
<li><p><code>A</code> 컬럼이 <code>50001</code>과 <code>50101</code> 사이에 있는 모든 레코드를 찾는 쿼리는 범위 쿼리</p>
<pre><code class="language-sql">  SELECT B 
  FROM TEST 
  WHERE A BETWEEN 50001 and 50101;  /* 범위 쿼리 */</code></pre>
<ul>
<li>이 쿼리는 <code>A</code> 컬럼의 값이 <code>50001</code>과 <code>50101</code> 사이에 있는 모든 레코드를 검색합니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>인덱스 기반 액세스 방법 (Index-based Access Method)</p>
<ul>
<li>힙 파일<ul>
<li>레코드를 순차적으로 저장하는 구조</li>
<li>인덱스를 사용하여 빠르게 찾을 수 있다</li>
</ul>
</li>
<li>인덱스<ul>
<li>효율적인 검색 가능</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="52-buffer-management">5.2 Buffer Management</h3>
<hr>
<p>OLTP: TPC-A/B/C 벤치마크</p>
<ul>
<li>인덱스를 통한 처리</li>
</ul>
<p>데이터베이스 I/O 아키텍처 (OLTP vs. OLAP)</p>
<ul>
<li>물리적 읽기<ul>
<li>디스크에서 데이터를 읽는 거</li>
</ul>
</li>
<li>물리적 쓰기<ul>
<li>메모리에 있는 데이터를 디스크에 기록하는 작업</li>
<li>버퍼에서 내보낼 페이지를 디스크에 기록할 때 발생</li>
</ul>
</li>
<li>IOPS (초당 입출력 작업 수)<ul>
<li>디스크나 저장 장치의 성능을 나타냄</li>
</ul>
</li>
</ul>
<p>버퍼 관리 (Buffer Management in DBMS)</p>
<ul>
<li><p>자주 접근되는 데이터 저장</p>
</li>
<li><p>페이지가 버퍼에 있을 경우 : hit</p>
</li>
<li><p>페이지가 버퍼에 없을 경우 : miss</p>
</li>
<li><p>데이터베이스 RAM에 있어야한다</p>
</li>
<li><p>hit의 비율을 높게 하는 게 좋다</p>
</li>
</ul>
<p>아래 두가지는 콜드 페이지 → 버퍼 내보내기 대상</p>
<ul>
<li>덜 frequent 했다</li>
<li>최근에 안 쓰였다</li>
</ul>
<p>LRU</p>
<ul>
<li>Least recently used</li>
<li>temporal locality 성질</li>
<li>head : 가장 최근에 사용됨</li>
<li>tail : 가장 최근에 잘 안 사용됨</li>
</ul>
<h3 id="61-b-tree-index">6.1 b-tree index</h3>
<hr>
<p>데이터 검색 방법의 문제점</p>
<ul>
<li>Full table scan<ul>
<li>단점 : 전체 다 뒤져야 함</li>
</ul>
</li>
<li>이진 탐색<ul>
<li>단점 : 정렬되어 있지 않으면 불가능<ul>
<li>heap 파일이라서 정렬되어 있지 않음</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Index 기반 접근</p>
<ul>
<li>Record ID<ul>
<li>(검색키 값, (데이터가 저장된 페이지 번호, 슬롯 번호))</li>
</ul>
</li>
<li>인덱스 검색<ul>
<li>3~4번의 인덱스 블록 접근 + 1번의 데이터 블록 접근</li>
</ul>
</li>
<li>실행 계획 표<ul>
<li>SELECT STATEMENT<ul>
<li>최종적으로 데이터를 반환하는 작업</li>
</ul>
</li>
<li>TABLE ACCESS BY INDEX ROWID<ul>
<li>인덱스가 반환한 Record ID를 이용해 실제 데이터 블록에서 레코드를 읽음</li>
</ul>
</li>
<li>INDEX RANGE SCAN<ul>
<li>인덱스 <code>TEST_A</code>에서 조건 <code>&quot;A = 50000&quot;</code>에 해당하는 값을 찾음</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>접근 유형</p>
<ul>
<li>Equality</li>
<li>Range search</li>
</ul>
<p>Trade-off</p>
<ul>
<li><p>Search time vs. Space/Insertion/Deletion overhead</p>
<ul>
<li><p>search time 줄이는 게 index 목표지만,</p>
<p>  삭제하거나 그러면 그때그때 index도 바꿔야하는 속도 문제 생김</p>
</li>
</ul>
</li>
</ul>
<p>B+ tree</p>
<ul>
<li>Dynamic 인덱스 구조</li>
<li>장점<ul>
<li>automatic</li>
<li>local</li>
<li>reorganizations<ul>
<li>자동으로 트리 재구성</li>
<li>삭제 되어도 로컬만 재구성</li>
</ul>
</li>
</ul>
</li>
<li>단점<ul>
<li>시간 오버헤드</li>
<li>공간 오버헤드</li>
</ul>
</li>
<li>단점보다 장점이 뛰어나서 많이 씀</li>
</ul>
<p>Clustered Index</p>
<ul>
<li>정렬된 데이터</li>
<li>데이터 레코드가 인덱스 키 값에 따라 정렬되어있으면 이거 써라</li>
<li>ex) ISAM</li>
</ul>
<p>Non-Clustered Index</p>
<ul>
<li>비정렬 데이터</li>
<li>데이터 레코드가 인덱스 키 값에 따라 정렬되어있지 않으면 이거 써라</li>
</ul>
<p>B+ tree 구조</p>
<ul>
<li>모든 리프랑 루트가 같은 길이이다 (= 밸런스 되어있다)</li>
<li>정렬되어 있음</li>
</ul>
<p>B+ tree Node</p>
<ul>
<li>포인터<ul>
<li>중간 노드<ul>
<li>다음 층 자식 노드 가리킴</li>
</ul>
</li>
<li>리프 노드<ul>
<li>데이터 레코드의 위치 가리킴</li>
</ul>
</li>
</ul>
</li>
<li>차수<ul>
<li>d ≤ m ≤ 2d<ul>
<li>d : 차수, m : 노드 개수</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Clustering_factor</p>
<ul>
<li>몇 개 페이지를 추가적으로 더 사용할지 알 수 있는 지표</li>
</ul>
<p>삽입&amp;삭제</p>
<ul>
<li>싱크를 유지<ul>
<li>테이블 데이터가 변경되면, 인덱스도 동시에 업데이트 되어야함</li>
</ul>
</li>
</ul>
<p>노드 분할</p>
<ul>
<li>인덱스 전체가 바뀌는 게 아니라 local하게 바뀜</li>
<li>Copy-up<ul>
<li>리프 노드에 중간값은 그대로 유지, 중간 값이 복사되어 상위 노드로 올라감</li>
<li>B+ 트리 리프에서는 이거 씀</li>
</ul>
</li>
<li>Push-up<ul>
<li>중간 값이 올라가면 하위 노드에서는 제거됨</li>
<li>B+ 트리 내부에서는 이거 씀</li>
</ul>
</li>
</ul>
<p>트리 성장</p>
<ul>
<li>만약 플래시 메모리 사용한다면<ul>
<li>분할 대신 오버플로우 사용</li>
<li>분할 시 4회, 오버플로우 시 2회</li>
</ul>
</li>
</ul>
<h3 id="62-query-processing-join-and-query-optimization">6.2 query processing (join and query optimization)</h3>
<hr>
<p>쿼리 평가</p>
<ul>
<li>Indexing</li>
<li>Iteration</li>
<li>Partitioning<ul>
<li>데이터를 정렬 또는 해싱을 사용하여 나눌 수 있음</li>
</ul>
</li>
</ul>
<p>동등 조인</p>
<pre><code class="language-sql">SELECT *
FROM Reserves R1, Sailors S1
WHERE R1.sid = S1.sid</code></pre>
<p>중첩 루프 조인</p>
<pre><code class="language-sql">for each tuple r in R do /* R: 외부 테이블 (Outer Relation) */
    for each tuple s in S do /* S: 내부 테이블 (Inner Relation) */
        if ri == sj then add &lt;r, s&gt; to result</code></pre>
<ul>
<li>index가 있어야 쓸 수 있음</li>
<li>튜플 단위<ul>
<li>비용<ul>
<li>M + pR * M * N<ul>
<li>M : R의 페이지 수</li>
<li>pR : R의 페이지당 튜플 수</li>
<li>N : S의 페이지 수</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>페이지 단위<ul>
<li>비용<ul>
<li>M + M * N<ul>
<li>M : R의 페이지 수</li>
<li>N : S의 페이지 수</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>작은 테이블을 외부 루프로 설정하면 I/O 비용이 감소</li>
</ul>
<pre><code class="language-sql">for each tuple r in R do
    for each tuple s in S where ri == sj do
        add &lt;r, s&gt; to result</code></pre>
<ul>
<li>조인 칼럼에 인덱스가 있는 경우<ul>
<li>인덱스를 통해 더 빠르게 찾을 수 있음</li>
</ul>
</li>
<li>비용<ul>
<li>M+((M⋅pR)⋅cost of finding matching S tuples)</li>
</ul>
</li>
</ul>
<p>버퍼 캐시</p>
<ul>
<li>메인 메모리에 위치한 데이터베이스 캐시 영역으로 데이터 I/O를 줄이기 위해 사용됨<ul>
<li>Sort-Merge Join vs Hash Join<ul>
<li>Sort-Merge Join<ul>
<li>sort_area_size</li>
<li>메모리 내에서 처리 안 되면, 임시 테이블스페이스를 사용</li>
</ul>
</li>
<li>Hash Join<ul>
<li>hash_area_size</li>
<li>메모리가 부족하면, 해시 테이블을 임시 테이블스페이스에 저장</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>index equi join 덕분에</p>
<ul>
<li>Nested Loop Join<ul>
<li>매칭 가능한 튜플만 검색하므로 나머지 안 봐도 됨</li>
</ul>
</li>
<li>Sorted-Merge Join<ul>
<li>한 쪽이 다른 쪽 초과하면 더 이상 비교하지 않고 넘어갈 수 있음</li>
</ul>
</li>
<li>Hash Join<ul>
<li>조건에 맞는 키 값만 비교</li>
</ul>
</li>
</ul>
<p>버퍼</p>
<ul>
<li>버퍼 페이지 부족한 경우<ul>
<li>MRU 가 가장 적합</li>
<li>LRU가 최악</li>
</ul>
</li>
<li>Index Nested Loops<ul>
<li>외부 테이블을 정렬하면, 버퍼 효율성 높일 수 있음</li>
</ul>
</li>
</ul>
<p>파싱</p>
<ul>
<li>Hard Parsing<ul>
<li>새로운 실행 계획을 생성</li>
</ul>
</li>
<li>Soft Parsing<ul>
<li>캐시된 실행 계획을 재사용</li>
</ul>
</li>
</ul>
<p>실행 계획 생성</p>
<ul>
<li>Plan 1 : Full Scan<ul>
<li>전체를 스탠하여 조건에 맞는 데이터 검색</li>
</ul>
</li>
<li>Plan 2 : Index Scan<ul>
<li>인덱스를 사용해 데이터 찾고, rowid를 사용해 실제 데이터 조회</li>
</ul>
</li>
</ul>
<h3 id="71-transaction-and-concurrency-control">7.1 transaction and concurrency control</h3>
<hr>
<p>트랜잭션</p>
<ul>
<li>문제<ol>
<li>unreliable</li>
<li>concurrent</li>
</ol>
</li>
<li>로그</li>
<li>동시성 제어<ul>
<li>잠금</li>
<li>트랜잭션 격리 수준</li>
<li>교착 상태 처리</li>
</ul>
</li>
<li>ex)<ul>
<li>상황 : 계좌 A에서 100$를 빼고, 계좌 B에 100$를 추가<ul>
<li><strong>Atomicity</strong>: 둘 중 하나라도 실패하면 전부 취소(롤백)</li>
<li><strong>Consistency</strong>: 계좌 A와 B의 합계는 변하지 않음</li>
<li><strong>Isolation</strong>: 다른 트랜잭션은 이 작업의 중간 상태를 볼 수 없음</li>
<li><strong>Durability</strong>: 장애 발생 시에도 결과는 유지</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="72-recovery">7.2 recovery</h3>
<hr>
<p>recovery</p>
<ul>
<li>atomicity<ul>
<li>복구 하려면 undo</li>
</ul>
</li>
<li>durability<ul>
<li>성공적으로 한 거는 뭐가 나더라도
다시 깨어났을 때 되어 있어야함</li>
<li>복구 하려면 redo</li>
</ul>
</li>
</ul>
<p>장애 유형</p>
<ul>
<li>트랜잭션 실패</li>
<li>시스템 장애</li>
<li>미디어 장애</li>
</ul>
<p>복구 메커니즘</p>
<ul>
<li>Write-Ahead Logging</li>
<li>Steal vs. No-Steal<ul>
<li>Steal : 디스크에 기록될 수 있는 정책</li>
<li>장애 발생하면 → Undo Log 사용</li>
</ul>
</li>
<li>Force vs. No-Force<ul>
<li>No-Force 장애 발생하면 → Redo Log 사용</li>
</ul>
</li>
<li>대부분은 Steal + No-Force</li>
</ul>
<p>로그 (Log)</p>
<ul>
<li>기록</li>
<li>undo log<ul>
<li>이전 상태로 복원</li>
</ul>
</li>
<li>redo log<ul>
<li>트랜잭션 수행 이후의 데이터 상태를 기록</li>
</ul>
</li>
<li>복구를 빨리 하는 게 목적</li>
</ul>
<p>체크포인팅</p>
<p>복구 알고리즘 : ARIES</p>
<p>SQLite 복구 사례</p>
<ul>
<li>Rollback Journal (RBJ)</li>
<li>Write-Ahead Logging (WAL)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터베이스 Advanced SQL]]></title>
            <link>https://velog.io/@tae-log/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-Advanced-SQL</link>
            <guid>https://velog.io/@tae-log/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-Advanced-SQL</guid>
            <pubDate>Sat, 25 Jan 2025 08:08:20 GMT</pubDate>
            <description><![CDATA[<h3 id="31-advanced-sql-roll-up-and-cube">3.1 (Advanced SQL) Roll-up and Cube</h3>
<hr>
<p>Cube</p>
<ul>
<li><p>다차원 집계 계산</p>
</li>
<li><p>코드</p>
<pre><code class="language-sql">  SELECT model, year, color, sum(amount)
  FROM sales
  GROUP BY CUBE(mode, year, color);</code></pre>
</li>
</ul>
<p>Rollup</p>
<ul>
<li><p>Cube의 부분집합</p>
</li>
<li><p>순서에 따라 계산</p>
</li>
<li><p>코드</p>
<pre><code class="language-sql">  SELECT job, deptno, sum(sal)
  FROM emp
  GROUP BY ROLLUP(deptno,job);</code></pre>
<pre><code class="language-sql">  SELECT deptno, job sum(sal)
  FROM emp
  GROUP BY deptno, job
  UNION ALL
  SELECT deptno, NULL, sum(sal)
  FROM emp
  GROUP BY deptno
  UNION ALL
  SELECT NULL, NULL, sum(sal)
  FROM emp</code></pre>
</li>
</ul>
<p>Grouping Function</p>
<ul>
<li><p>AS</p>
<ul>
<li><p>칼럼이나 테이블에 간단한 이름을 부여해 가독성 높임</p>
<pre><code class="language-sql">SELECT deptno, job, sum(sal), grouping(job) as T1
FROM emp
GROUP BY cube(deptno, job);</code></pre>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>decode</p>
<ul>
<li><p>특정 조건에 따라 값을 변환할 때 사용</p>
<pre><code class="language-sql">SELECT decode(grouping(deptno),0,to_char(deptno), &#39;ALL&#39;) as deptno,
decode(grouping(job),0,job, &#39;ALL&#39;) as job,
sum(sal)
FROM emp
GROUP BY cube(deptno, job)</code></pre>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>grouping_id()</p>
<ul>
<li><p>null이 실제 데이터인지, 집계 결과로 추가된 값인지 구분</p>
</li>
<li><p>0 → 실제 값, 1 → 생략된 집계</p>
<pre><code class="language-sql">SELECT deptno,job, sum(sal), grouping_id(deptno, job) as GRP_ID
FROM emp
GROUP BY CUBE(deptno, job);</code></pre>
</li>
</ul>
</li>
</ul>
<h3 id="32-advanced-sql-pivoting">3.2 (Advanced SQL) Pivoting</h3>
<hr>
<p>Pivoting</p>
<pre><code class="language-sql">SELECT *
FROM (SalesTable PIVOT (Sales for Month IN
(‘Jan’,’Feb’,’Mar’))</code></pre>
<ul>
<li>행을 열로 변환</li>
<li>IN 다음에 있는 게 열 이름으로 들어감</li>
</ul>
<p>Un-pivoting</p>
<pre><code class="language-sql">SELECT *
FROM (SalesReport UNPIVOT (Sales for Month IN
(‘Jan’,’Feb’,’Mar’))</code></pre>
<ul>
<li>열을 행으로 변환</li>
<li>IN 다음에 있는 게 행 이름으로 들어감</li>
</ul>
<h3 id="33-advanced-sql-analytic-function">3.3 (Advanced SQL) Analytic Function</h3>
<hr>
<pre><code class="language-sql">SELECT EMPNO, ENAME, SAL, RANK() OVER (ORDER BY SAL DESC) AS RANK FROM EMP</code></pre>
<ul>
<li>모든 직원의 급여를 내림차순으로 보여줌</li>
<li>쿼리 전체 구조<ul>
<li>EMP 테이블에서데이터 가져올 거고</li>
<li>EMPNO, ENAME, SAL, RANK가 출력되는 칼럼임</li>
<li>급여를 기준으로 내림차순</li>
</ul>
</li>
</ul>
<pre><code class="language-sql">SELECT DEPTNO, EMPNO, ENAME, SAL,
RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC)
AS DEPT_RANK FROM EMP ORDER BY DEPTNO</code></pre>
<ul>
<li>각 부서 내에서 급여에 따른 순위 확인</li>
<li>쿼리 전체 구조<ul>
<li>DEPTNO, EMPNO, ENAME, SAL, DEPT_RANK 출력되는 칼럼이고</li>
<li>급여기준으로 내림차순 할 거고</li>
<li>최종결과를 DEPTNO 기준으로 정렬해서 각 부서별로 데이터 묶는다</li>
</ul>
</li>
</ul>
<pre><code class="language-sql">SELECT EMPNO, ENAME, SAL,
RANK() OVER(ORDER BY SAL DESC) AS RANK,
DENSE_RANK() OVER(ORDER BY SAL DESC) AS DENSE_RANK,
ROW_NUMBER() OVER(ORDER BY SAL DESC) AS ROW_NUMBER
FROM EMP;</code></pre>
<ul>
<li>동일한 급여를 가진 직원의 순위 차이를 <code>RANK</code>, <code>DENSE_RANK</code>, <code>ROW_NUMBER</code>로 비교</li>
<li>쿼리 전체 구조<ul>
<li>RANK<ul>
<li>1, 2, 2, 4</li>
</ul>
</li>
<li>DENSE_RANK<ul>
<li>1, 2, 2, 3</li>
</ul>
</li>
<li>ROW_NUMBER<ul>
<li>1, 2, 3, 4</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code class="language-sql">SELECT DEPTNO, EMPNO, ENAME, SAL,
RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) AS DEPT_RANK FROM EMP</code></pre>
<ul>
<li>각 부서별 직원의 급여 순위를 확인</li>
<li>쿼리 전체 구조<ul>
<li>최종결과 부서별로 안 되어있을 수 있음</li>
</ul>
</li>
</ul>
<pre><code class="language-sql">SELECT DEPTNO, JOB, EMPNO, ENAME, SAL,
RANK() OVER(PARTITION BY DEPTNO, JOB ORDER BY SAL DESC) AS DEPT_RANK FROM EMP;</code></pre>
<ul>
<li>각 부서와 직업 그룹 내에서 급여 순위를 확인</li>
<li>쿼리 전체 구조<ul>
<li>deptno랑 job이 같은 그룹 내에서 순위 확인</li>
</ul>
</li>
</ul>
<pre><code class="language-sql">SELECT DEPTNO, EMPNO, ENAME, SAL,
ROUND(AVG(SAL) OVER(PARTITION BY DEPTNO) DEPTNO)) AS SAL
ROUND(AVG(SAL) OVER(PARTITION BY DEPTNO) DEPTNO)) AS DIFF FROM EMP</code></pre>
<ul>
<li>부서별 평균 급여와 각 직원의 급여 차이를 볼 수 있음</li>
<li>쿼리 전체 구조<ul>
<li>deptno별로 나누어 평균 급여 계산</li>
<li>round로 평균 급여 반올림하여 정수값</li>
<li>각 직원의 급여가 평균 급여와 얼마나 차이나는지 계산<ul>
<li>양수면 직원이 높은 거임</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code class="language-sql">SELECT EMPNO, ENAME, SAL,
NTILE(2) OVER(ORDER BY SAL DESC) AS NTILE2,
NTILE(4) OVER(ORDER BY SAL DESC) AS NTILE4
NTILE(10) OVER(ORDER BY SAL DESC) AS NTILE10 FROM EMP;</code></pre>
<ul>
<li>각 직원이 급여 기준으로 몇 번째 그룹에 속하는지를 보여줌</li>
<li>쿼리 전체 구조<ul>
<li>NTILE(2)<ul>
<li>급여 내림차순으로 정리해서 그룹 2개로 나눔</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code class="language-sql">SELECT EMPNO, ENAME, SAL,
SUM(SAL) OVER(ORDER BY EMPNO ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS ACC_SAL
FROM EMP</code></pre>
<ul>
<li>직원번호 순서로 각 행까지의 누적 급여를 보여줌</li>
<li>쿼리 전체 구조<ul>
<li><code>UNBOUNDED PRECEDING</code>: 첫 번째 행부터 시작합니다.</li>
<li><code>CURRENT ROW</code>: 현재 행까지를 포함</li>
<li>첫 번째부터 현재 행까지 누적 급여</li>
</ul>
</li>
</ul>
<pre><code class="language-sql">SELECT EMPNO, ENAME, SAL,
SUM(SAL) OVER(ORDER BY EMPNO ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) ACC_SAL
FROM EMP</code></pre>
<ul>
<li>각 직원의 급여를 주변 직원(1명 앞, 1명 뒤)의 급여 합계로 확인</li>
<li>쿼리 전체 구조<ul>
<li>직전 행 + 현재 행 + 다음 행 계산</li>
</ul>
</li>
</ul>
<pre><code class="language-sql">SELECT EMPNO, ENAME, SAL,
SUM(SAL) OVER(ORDER BY EMPNO RANGE BETWEEN 100 PRECEDING AND 200 FOLLOWING) AS ACC_SAL
FROM EMP</code></pre>
<ul>
<li>재 행의 직원 번호(EMPNO) 기준으로 100 이전부터 200 이후의 값을 포함하여 급여 합계를 계산</li>
<li>쿼리 전체 구조<ul>
<li>EMPNO 기준으로 100이전부터 200이후 까지 더하기</li>
</ul>
</li>
</ul>
<pre><code class="language-sql">SELECT DEPTNO, EMPNO, ENAME, SAL,
SUM(SAL) OVER(PARTITION BY DEPTNO ORDER BY EMPNO ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS ACC_SAL
FROM EMP;</code></pre>
<ul>
<li>부서별로 데이터를 나누고(<code>PARTITION BY DEPTNO</code>), 각 부서에서 직원 번호 기준으로 이전 1행과 다음 1행을 포함한 급여 합계를 계산</li>
</ul>
<pre><code class="language-sql">SELECT EMPNO, ENAME, SAL,
LAG(SAL) OVER (ORDER BY EMPNO) AS LAG1,
LEAD(SAL) OVER (ORDER BY EMPNO) AS LEAD1,
LAG(SAL,3) OVER (ORDER BY EMPNO) AS LAG3,
LEAD(SAL,3) OVER (ORDER BY EMPNO) AS LEAD3
FROM EMP;</code></pre>
<ul>
<li><code>LAG(SAL)</code>은 이전 행의 값을 가져오며, <code>LEAD(SAL)</code>은 다음 행의 값을 가져옴</li>
<li><code>LAG(SAL,3)</code>와 <code>LEAD(SAL,3)</code>은 현재 행 기준으로 3행 전과 후의 값을 가져옴</li>
<li>쿼리 전체 구조<ul>
<li>이전이나 이후에 데이터 없으면 null</li>
</ul>
</li>
</ul>
<h3 id="34-advanced-sql-tree-traversal-and-recursive-cte">3.4 (Advanced SQL) Tree Traversal and Recursive CTE</h3>
<hr>
<pre><code class="language-sql">SELECT empno, ename, job, mgr FROM emp
START WITH empno = 7698
CONNECT BY PRIOR mgr = empno;</code></pre>
<ul>
<li>7698번 직원과 그 하위 계층에 속한 직원들이 반환</li>
<li>쿼리 전체 구조<ul>
<li>7698인 직원 넘버를 가진 직원이랑</li>
<li>7698넘버를 가진 매니저의 하위에 있는 직원들을 보기</li>
</ul>
</li>
</ul>
<pre><code class="language-sql">SELECT empno, ename, job, mgr FROM emp
START WITH empno = 7698
CONNECT BY empno = PRIOR mgr;</code></pre>
<ul>
<li>7698번 직원이 관리하는 모든 상위 직원 계층을 반환</li>
</ul>
<pre><code class="language-sql">SELECT ename ||&#39; reports to &#39; || PRIOR ename &quot;Walk&quot; FROM emp
START WITH ename = &#39;KING&#39;
CONNECT BY PRIOR empno = mgr</code></pre>
<ul>
<li>KING 직원으로부터 시작된 보고 체계를 출력</li>
<li>쿼리 전체 구조<ul>
<li>현재 직원이 상위 직원에게 보고한다</li>
</ul>
</li>
</ul>
<pre><code class="language-sql">SELECT LPAD (&#39; &#39;, 3 * LEVEL-3)|| ename AS org_chart, LEVEL , empno , mgr , deptno FROM emp
START WITH mgr IS NULL CONNECT BY PRIOR empno = mgr</code></pre>
<ul>
<li>직원들의 계층 구조를 들여쓰기 형태로 보여줌</li>
<li>쿼리 전체 구조<ul>
<li>매니저가 null인 (최상위 계층)부터 시작</li>
<li>트리 레벨</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[exercise6 정리]]></title>
            <link>https://velog.io/@tae-log/%ED%8C%8C%EC%9D%B4%EC%8D%AC-DataFrame-exercise-6</link>
            <guid>https://velog.io/@tae-log/%ED%8C%8C%EC%9D%B4%EC%8D%AC-DataFrame-exercise-6</guid>
            <pubDate>Mon, 20 Jan 2025 04:41:14 GMT</pubDate>
            <description><![CDATA[<h2 id="stock-모듈">Stock 모듈</h2>
<hr>
<p><code>pip3 install pykrx</code></p>
<h3 id="marketdata-api">MarketData API</h3>
<ul>
<li><strong>get_market_ticker_list</strong><ul>
<li>지정한 일자(YYYYMMDD)의 코스피 시장에 상장된 ticker를 리스트로 반환</li>
<li>날짜를 지정하지 않으면 내부적으로 최근 영업일을 계산해서 ticker 반환</li>
<li>market 옵션을 추가하면 조회 시장을 지정할 수 있음</li>
</ul>
</li>
<li><strong>get_market_ticker_name</strong><ul>
<li>여기에 티커를 입력하면 종목이름을 반환</li>
</ul>
</li>
<li><strong>get_market_ohlcv</strong><ul>
<li>시작일/종료일/티커 세 개의 파라미터를 입력받아 OHLCV를 일자별로 정렬하여 DataFrame으로 반환</li>
<li>frequency 파라미터(d/m/y)를 추가할 수 있음</li>
<li>기본적으로 요청한 마지막 일을 기준으로 수정주가를 반영하여 정보를 가져옴</li>
<li>adjusted 파라미터를 사용해서 수정주가가 반영되지 않은 OHLCV 정보를 가져올 수 있음</li>
<li>get_stock_ticker_list() 함수와 함께 사용하면 전종목의 OHLCV를 가져올 수 있음</li>
<li>한 번에 너무 많은 정보를 요청하면 KRX 서버가 차단할 수 있으므로 
time 모듈을 사용해서 1초 지연 후 요청하도록 코드를 작성하면 됨</li>
</ul>
</li>
<li><strong>get_market_price_change</strong><ul>
<li>입력된 기간 동안의 가격 가격 변동 정보를 반환합니다. 다음 코드는 20180301-20180320 동안의 가격 변동폭을 조회</li>
<li>기본적으로 KOSPI 시장을 조회</li>
<li>market 파라미터에 KOSDAQ 또는 ALL을 입력할 수 있음</li>
</ul>
</li>
<li><strong>get_market_fundamental</strong><ul>
<li>코스피 시장의 DIV/BPS/PER/EPS/PBR를 조회</li>
<li>market 파라미터를 사용하면 특정 시장을 조회할 수 있음</li>
</ul>
</li>
<li><strong>get_market_trading_value_by_date</strong><ul>
<li>특정 기간 동안의 시장별/투자자별 거래대금을 조회</li>
<li>매수 혹은 매도 금액을 조회하고 싶다면 on 파라미터에 입력</li>
<li>세 번째 파라미터에 KOSPI, KOSDAQ, KONEX를 사용하면 각 시장의 거래대금을 조회<ul>
<li>ALL을 입력하면 세 개의 시장을 합친 통합 거래대금을 조회</li>
</ul>
</li>
<li>시장의 거래대금을 조회할 때는 ETF, ETN, ELW의 포함 여부를 지정할 수 있음<ul>
<li>만약 값을 지정하지 않는다면 해당 데이터를 제외한 값을을 반환</li>
</ul>
</li>
<li>detail 옵션을 추가하면 상세한 정보를 얻을 수 있음</li>
</ul>
</li>
<li><strong>get_market_net_purchases_of_equities</strong><ul>
<li>순매수 금액 순서로 정렬된 종목 리스트를 반환</li>
</ul>
</li>
<li><strong>get_market_cap</strong><ul>
<li>특정 일자의 종목별 시가총액/거래량/거래대금/상장주식수/외국인보유주식수를 조회</li>
<li>frequency 파라미터(d/m/y)를 추가할 수 있음</li>
</ul>
</li>
<li><strong>get_exhaustion_rates_of_foreign_investment</strong><ul>
<li>상장주식수/외국인한도수량/외국인보유수량/외국인한도소진률 정보를 조회</li>
<li>balance_limit을 True로 지정하면 외국인 보유한도의 제한 종목만 검색할 수 있음</li>
</ul>
</li>
</ul>
<h3 id="인덱스-조회-api">인덱스 조회 API</h3>
<ul>
<li><strong>get_index_ticker_list()</strong><ul>
<li>코스피 인덱스를 리스트로 반환</li>
</ul>
</li>
<li><strong>get_index_ohlcv()</strong><ul>
<li>입력된 기간 동안의 인덱스 OHLCV를 조회</li>
</ul>
</li>
<li><strong>get_index_listing_date()</strong><ul>
<li>인덱스의 상장일 및 기준비수 정보를 조회</li>
</ul>
</li>
<li><strong>get_index_price_change</strong><ul>
<li>지수의 등락률/거래량/거래대금을 반환하며, KRX / KOSPI / KOSDAQ 세 개의 지수를 지원</li>
</ul>
</li>
<li><strong>get_index_fundamental</strong><ul>
<li>특정 종목의 지정된 기간 동안 PER/PBR/배당수익률을 조회</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[exercise5 정리]]></title>
            <link>https://velog.io/@tae-log/%ED%8C%8C%EC%9D%B4%EC%8D%AC-DataFrame-exercise-5</link>
            <guid>https://velog.io/@tae-log/%ED%8C%8C%EC%9D%B4%EC%8D%AC-DataFrame-exercise-5</guid>
            <pubDate>Mon, 20 Jan 2025 04:40:41 GMT</pubDate>
            <description><![CDATA[<h2 id="macd"><strong>MACD</strong></h2>
<hr>
<h3 id="moving-average-convergencedivergence"><strong>Moving Average Convergence/Divergence</strong></h3>
<ul>
<li>to_frame<ul>
<li>Series 객체를 DataFrame 형식으로 변환</li>
</ul>
</li>
<li>figure()<ul>
<li>새로운 그림 객체를 생성하고, 그 위에 그래프를 그릴 준비를 함</li>
<li>figsize=()<ul>
<li>그림의 크기를 지정</li>
</ul>
</li>
</ul>
</li>
<li>make_mpf_style<ul>
<li>차트의 스타일을 사용자 정의하는 데 사용</li>
</ul>
</li>
<li>make_addplot<ul>
<li>캔들 차트 또는 OHLC 차트에 추가적인 데이터 시각화 요소(예: 이동평균선, 지표선 등)를 추가하는 데 사용</li>
</ul>
</li>
</ul>
<h3 id="stochastic-oscillator"><strong>Stochastic Oscillator</strong></h3>
<ul>
<li>tight_layout<ul>
<li>플롯의 레이아웃을 자동으로 조정하여 차트의 요소들이 서로 겹치지 않도록 함</li>
</ul>
</li>
</ul>
<h3 id="putting-everything-together"><strong>Putting everything together</strong></h3>
<ul>
<li>yfinance<ul>
<li>Yahoo Finance API를 통해 금융 데이터를 가져오기 위한 라이브러리</li>
</ul>
</li>
<li>mplfinance<ul>
<li>금융 데이터 시각화를 위한 라이브러리</li>
<li>ex)<ul>
<li>캔들 차트, 라인 차트</li>
</ul>
</li>
</ul>
</li>
<li>available_styles()<ul>
<li>mplfinance에서 제공하는 모든 스타일 이름을 반환</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[exercise4 정리]]></title>
            <link>https://velog.io/@tae-log/%ED%8C%8C%EC%9D%B4%EC%8D%AC-Pandas-exercise4-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@tae-log/%ED%8C%8C%EC%9D%B4%EC%8D%AC-Pandas-exercise4-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Fri, 10 Jan 2025 06:16:51 GMT</pubDate>
            <description><![CDATA[<h2 id="what-is-smoothing">What is Smoothing?</h2>
<hr>
<h3 id="what-is-smoothing-1">What is Smoothing?</h3>
<ul>
<li>download()<ul>
<li>주식 데이터 다운로드</li>
</ul>
</li>
</ul>
<h2 id="simple-average-smoothing"><strong>Simple Average Smoothing</strong></h2>
<hr>
<h3 id="mean-squared-error-mse"><strong>Mean Squared Error (MSE)</strong></h3>
<ul>
<li>metrics.mean_squared_error<ul>
<li>실제 값(y_true)과 예측 값(y_pred) 간의 평균 제곱 오차(MSE)를 계산</li>
</ul>
</li>
<li>mean_absolute_percentage_error<ul>
<li>실제 값(y_true)과 예측 값(y_pred)의 평균 절대 백분율 오차 (MAPE)를 계산하는 함수</li>
</ul>
</li>
<li>metrics.mean_absolute_error<ul>
<li>예측 값과 실제 값 간의 차이의 절댓값의 평균을 계산</li>
</ul>
</li>
<li>np.sqrt(metrics.mean_squared_error)<ul>
<li>평균 제곱근 오차 (RMSE)**는 MSE의 제곱근을 취한 값</li>
</ul>
</li>
</ul>
<h2 id="simple-moving-average-with-mplfinance"><strong>Simple Moving Average with Mplfinance</strong></h2>
<hr>
<h3 id="mplfnance"><strong>Mplfnance</strong></h3>
<ul>
<li>설치 안되어있으면 mplfiinance 설치해야함</li>
<li>droplevel()<ul>
<li>MultiIndex에서 특정 레벨을 제거하는 함수</li>
</ul>
</li>
<li>set_facecolor()<ul>
<li>차트의 배경 색 설정</li>
</ul>
</li>
</ul>
<h2 id="singlesimple-exponential-smoothing"><strong>Single(Simple) Exponential Smoothing</strong></h2>
<hr>
<h3 id="singlesimple-exponential-smoothing-1"><strong>Single(Simple) Exponential Smoothing</strong></h3>
<ul>
<li>make_addplot()<ul>
<li>차트에 보조 차트나 다른 지표들을 추가할 수 있게 도와줌</li>
</ul>
</li>
</ul>
<h3 id="mplfance-plot-with-ema"><strong>Mplfance plot with ema</strong></h3>
<ul>
<li>fit()<ul>
<li>시계열 데이터를 입력받고, 모델을 학습시키는 역할</li>
</ul>
</li>
<li>forecast()<ul>
<li>예측하고자 하는 미래 시점의 값을 계산</li>
</ul>
</li>
<li>summary()<ul>
<li>모델 또는 데이터에 대한 요약 정보를 제공하는 함수</li>
</ul>
</li>
<li>run_line_magic()<ul>
<li>IPython 또는 Jupyter 노트북에서 매직 명령어를 실행하는 데 사용되는 함수</li>
</ul>
</li>
<li>rcParams<ul>
<li>Matplotlib에서 사용되는 구성 설정 객체로, 그래프의 디폴트 설정을 변경하는 데 사용</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[exercise3 정리]]></title>
            <link>https://velog.io/@tae-log/%ED%8C%8C%EC%9D%B4%EC%8D%AC-Pandas-exercise-3</link>
            <guid>https://velog.io/@tae-log/%ED%8C%8C%EC%9D%B4%EC%8D%AC-Pandas-exercise-3</guid>
            <pubDate>Fri, 10 Jan 2025 05:58:15 GMT</pubDate>
            <description><![CDATA[<h2 id="handling-time-series-data">Handling Time Series Data</h2>
<hr>
<h3 id="date-and-time">Date and time</h3>
<ul>
<li><p>코드</p>
<pre><code class="language-python">  from datetime import datetime 

  noww = datetime.now() # 현재 날짜와 시간을 datetime 객체로 가져옴
  print(&#39;A01, \n&#39;, noww, &#39;\n&#39;)
  print(&#39;A02, \n&#39;, &#39;year = &#39;, noww.year, &#39;\n&#39;) # 현재 년도
  print(&#39;A03, \n&#39;, &#39;month = &#39;, noww.month, &#39;\n&#39;) # 현재 월
  print(&#39;A04, \n&#39;, &#39;day = &#39;, noww.day, &#39;\n&#39;) # 현재 일
  print(&#39;A05, \n&#39;, &#39;hour = &#39;, noww.hour, &#39;\n&#39;) # 현재 시간
  print(&#39;A06, \n&#39;, &#39;minute = &#39;, noww.minute, &#39;\n&#39;) # 현재 분
  print(&#39;A07, \n&#39;, &#39;second = &#39;, noww.second, &#39;\n&#39;) # 현재 초
  print(&#39;A08, \n&#39;, &#39;second = &#39;, noww.microsecond, &#39;\n&#39;) # 현재 마이크로초</code></pre>
</li>
<li><p>datetime.timedelta</p>
<ul>
<li>시간 차이를 표현하는 데 사용</li>
</ul>
</li>
<li><p>strptime()</p>
<ul>
<li>문자열을 datetime 객체로 변환</li>
<li>포맷 지정 필요</li>
<li>단일 값만 변환 가능</li>
</ul>
</li>
<li><p>strftime()</p>
<ul>
<li>datetime 객체를 문자열로 변환</li>
</ul>
</li>
<li><p>dayfirst=False</p>
<ul>
<li>기본형</li>
<li>월//년 순서로 해석</li>
</ul>
</li>
<li><p>dayfirst=True</p>
<ul>
<li>일/월/년 순서로 해석</li>
</ul>
</li>
<li><p>to_datetime()</p>
<ul>
<li>문자열을 datetime 객체로 변환</li>
<li>배열 처리 가능</li>
<li>유연함</li>
<li>dayfirst=True 와 같은 옵션도 가능</li>
</ul>
</li>
</ul>
<h3 id="making-time-series-data">Making Time Series Data</h3>
<ul>
<li><p>[::2]</p>
<ul>
<li>두 칸씩 뛰어넘기</li>
</ul>
</li>
<li><p>코드</p>
<pre><code class="language-python">  print(longer_ts[&#39;2020&#39;], &#39;\n&#39;) # 2020년에 해당하는 거 모두 뽑기
  print(longer_ts[&#39;2020-06&#39;], &#39;\n&#39;) # 2020년 6월에 해당하는 거

  print(ts[&#39;1/7/2011&#39;:&#39;1/10/2011&#39;], &#39;\n&#39;) # 2011/7/1 부터 2011/10/1 까지
  print(ts.truncate(after=&#39;1/8/2011&#39;), &#39;\n&#39;) #2011/8/1 이후로</code></pre>
</li>
<li><p>truncate</p>
<ul>
<li>데이터의 일부를 잘라내어 반환</li>
<li>before, after 기준 설정</li>
</ul>
</li>
<li><p>.groups</p>
<ul>
<li>그룹화한 객체에서 각 그룹의 인덱스 정보를 딕셔너리로 반환</li>
</ul>
</li>
<li><p>.resample</p>
<ul>
<li>시계열 데이터를 주어진 새로운 시간 간격에 맞게 다시 샘플링(재구성)하는 데 사용</li>
</ul>
</li>
<li><p>bfill()</p>
<ul>
<li>결측값을 뒤쪽 값으로 채움</li>
</ul>
</li>
<li><p>pd.date_range()</p>
<ul>
<li>특정 시작일(start)과 종료일(end) 사이의 날짜 범위를 생성</li>
</ul>
</li>
<li><p>freq</p>
<ul>
<li>원하는 주기(일, 주, 월 등)로 날짜를 설정 가능</li>
<li>&#39;D&#39;, &#39;W&#39;, &#39;M&#39;, &#39;MS&#39;, &#39;H&#39;</li>
</ul>
</li>
<li><p>pd.date_range():</p>
<ul>
<li>지정된 시작 시간과 기간 또는 종료 시간을 기준으로 날짜와 시간 범위를 생성</li>
<li>normalize=True:<ul>
<li>생성된 모든 datetime 객체를 자정(00:00:00)으로 정규화</li>
</ul>
</li>
</ul>
</li>
<li><p>periods=7</p>
<ul>
<li>7개의 연속적인 날짜를 생성</li>
</ul>
</li>
<li><p>rollforward</p>
<ul>
<li>주어진 날짜의 &quot;다음&quot; 기준으로</li>
</ul>
</li>
<li><p>rollback</p>
<ul>
<li>주어진 날짜의 &quot;이전&quot; 기준으로 이동.</li>
<li>Offset 기준 날짜에 이미 해당하면 현재 날짜를 반환</li>
</ul>
</li>
</ul>
<h3 id="timezone-and-utc">TimeZone and UTC</h3>
<ul>
<li>pytz.timezone(&#39;ROK&#39;)<ul>
<li>대한민국 표준시(Korea Standard Time, KST)를 나타냄</li>
</ul>
</li>
<li>tz_localize(&#39;ROK&#39;)<ul>
<li>시간대 정보가 추가되지만, 기존의 날짜 및 시간 값은 변경되지 x</li>
</ul>
</li>
<li>tz_convert<ul>
<li>기존의 시간대 정보를 보존하면서, 다른 시간대 기준으로 변환</li>
</ul>
</li>
</ul>
<h3 id="period">Period</h3>
<ul>
<li>Period<ul>
<li>특정 시간 범위를 나타냄</li>
<li>연도(&#39;A-DEC&#39;), 월(&#39;M&#39;), 분기(&#39;Q-DEC&#39;), 일(&#39;D&#39;) 등 다양한 주기 지원</li>
</ul>
</li>
<li>PeriodIndex<ul>
<li>여러 Period를 모아 인덱스로 사용</li>
<li>pd.period_range를 사용하여 연속적인 Period 생성 가능</li>
</ul>
</li>
</ul>
<h3 id="resampling">Resampling</h3>
<ul>
<li>다운샘플링<ul>
<li>더 높은 빈도 데이터를 낮은 빈도로 변환</li>
</ul>
</li>
<li>업샘플링<ul>
<li>더 낮은 빈도 데이터를 높은 빈도로 변환</li>
</ul>
</li>
</ul>
<h3 id="time-series-plotting">Time Series Plotting</h3>
<ul>
<li><p>ffill()</p>
<ul>
<li>빈 자리에 있는 값들을 채워주는 거</li>
</ul>
</li>
<li><p>.plot()</p>
<ul>
<li>그래프 볼 수 있음</li>
</ul>
</li>
<li><p>기간 보고 싶으면</p>
<pre><code class="language-python">  close_px[&#39;AAPL&#39;].loc[&#39;01-2011&#39;:&#39;03-2011&#39;].plot()</code></pre>
<pre><code class="language-python">  close_px.loc[&#39;2009&#39;].plot()</code></pre>
</li>
<li><p>rolling(window=N)</p>
<ul>
<li><p>지정된 윈도우 크기 (N)에 따라 데이터를 슬라이딩하며 연산(평균, 표준편차 등)을 수행</p>
<pre><code class="language-python">  close_px.AAPL.rolling(window=250).mean().plot()
  # 250일 이동 평균 계산

  close_px.AAPL.rolling(window=250).std().plot()
  # 250일 이동 표준편차 계산

  close_px.AAPL.rolling(window=250).mean().plot(logy=True)
  # y축을 로그 스케일로 설정</code></pre>
</li>
</ul>
</li>
</ul>
<h3 id="exponentially-weighted-moving-average">Exponentially-weighted moving average</h3>
<ul>
<li><p>pct_change()</p>
<ul>
<li>어느정도 변동성이 있는 지 볼 수 있음</li>
</ul>
</li>
<li><p>ewm() 함수</p>
<ul>
<li><strong>지수 가중 이동 평균</strong>(EWMA, Exponentially Weighted Moving Average)을 계산하는 함수</li>
<li>데이터에 시간적 가중치를 부여하여, 최근의 값에 더 큰 비중을 둔 평균을 계산</li>
</ul>
</li>
<li><p>plot() 함수</p>
<ul>
<li><p>데이터를 시작화하는 함수</p>
</li>
<li><p>코드</p>
<pre><code class="language-python">  df.plot(style=&#39;k-&#39;, ax=axes[0], label=&#39;Series&#39;)</code></pre>
<ul>
<li>style<ul>
<li>그래프의 스타일을 정의</li>
</ul>
</li>
<li>ax<ul>
<li>그래프를 그릴 특정 서브플롯 지정</li>
</ul>
</li>
<li>label<ul>
<li>그래프의 범례에 표시될 이름 지정</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>pct_change()</p>
<ul>
<li>DataFrame의 각 열에 대해 일일 수익률을 계산</li>
</ul>
</li>
<li><p>corr()</p>
<ul>
<li>함수는 두 시리즈나 두 DataFrame의 열 간의 상관 계수를 계산<ul>
<li>상관 계수 :
두 변수 간의 관계의 강도와 방향을 나타내는 값으로, 값의 범위는 -1과 1 사이</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="time-series-data-wrangling">Time series data wrangling</h3>
<ul>
<li><p>DateReader()</p>
<ul>
<li><p>웹에서 주식 시세, 경제 지표, 환율 등 다양한 금융 데이터를 Pandas DataFrame 형식으로 가져오는 데 사용</p>
<ul>
<li><p>pandas_datareader가 없으면</p>
<p>  <code>pip install pandas_datareader</code> 해서 설치하면 됨</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p>set_xlabel</p>
<ul>
<li>x축 레이블 지정</li>
</ul>
</li>
<li><p>set_ylable</p>
<ul>
<li>y축 레이블 지정</li>
</ul>
</li>
<li><p>컬러도 지정가능</p>
<pre><code class="language-python">  ax1.set_ylabel(&#39;Log Return&#39;, color=&#39;g&#39;)</code></pre>
</li>
<li><p>tick_params()</p>
<ul>
<li><p>축 눈금(ticks)과 눈금 레이블(tick labels)의 모양과 속성을 제어하는 데 사용</p>
<pre><code class="language-python">ax1.tick_params(axis=&#39;y&#39;, colors=&#39;g&#39;)  # y축 눈금과 레이블 색상을 초록색으로 설정</code></pre>
</li>
</ul>
</li>
<li><p>tick_layout()</p>
<ul>
<li><p>래프의 <strong>여백</strong>을 자동으로 조정하여 레이아웃을 최적화</p>
<pre><code class="language-python">plt.tight_layout()  # 레이아웃을 최적화하여 겹침을 방지</code></pre>
</li>
</ul>
</li>
<li><p>show()</p>
<ul>
<li>그래프를 화면에 표시하는 데 사용</li>
</ul>
</li>
<li><p>yfinace</p>
<ul>
<li>없으면 얘도 pip install로 설치</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[exercise2 정리]]></title>
            <link>https://velog.io/@tae-log/%ED%8C%8C%EC%9D%B4%EC%8D%AC-Pandas-exercise2-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@tae-log/%ED%8C%8C%EC%9D%B4%EC%8D%AC-Pandas-exercise2-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Thu, 09 Jan 2025 03:02:49 GMT</pubDate>
            <description><![CDATA[<h2 id="data-assembly">Data Assembly</h2>
<hr>
<h3 id="concatenation">Concatenation</h3>
<ul>
<li>pd.concat()<ul>
<li>여러 개의 DataFrame을 결합할 때 사용하는 함수</li>
<li>기본 적으로 행방향으로 결합 → axis=0<ul>
<li>열은 axis=1</li>
</ul>
</li>
<li>ignore_index=True<ul>
<li>기존의 인덱스를 무시하고 새롭게 연속된 인덱스를 할당할 수 있음</li>
</ul>
</li>
</ul>
</li>
<li>.iloc[3, ]<ul>
<li>네 번째 행(0부터 시작)을 가져옴</li>
</ul>
</li>
<li>.loc[3, ]<ul>
<li>인덱스 값이 3인 모든 행을 반환</li>
</ul>
</li>
<li>join=&#39;outer&#39;<ul>
<li>기본값</li>
<li>모든 열(컬럼)을 포함</li>
<li>공통 열이 없는 경우, 없는 값은 NaN으로 채워짐</li>
</ul>
</li>
<li>join=&#39;inner&#39;<ul>
<li>공통된 열(컬럼)만 유지</li>
<li>불필요한 데이터 제거에 유용</li>
</ul>
</li>
</ul>
<h3 id="merge-command">Merge command</h3>
<ul>
<li>.merge<ul>
<li>left_on=&#39;name’<ul>
<li>name 열을 기준으로 병합</li>
</ul>
</li>
<li>right_on=&#39;site’<ul>
<li>site 열을 기준으로 병합</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="join">Join</h3>
<ul>
<li>key<ul>
<li>병합의 기준이 되는 열</li>
</ul>
</li>
<li>lval<ul>
<li>왼쪽 데이터프레임에서 추가로 가져온 값</li>
</ul>
</li>
<li>rval<ul>
<li>오른쪽 데이터프레임에서 추가로 가져온 값</li>
</ul>
</li>
<li>pd.merge(left, right, on=&#39;key&#39;)<ul>
<li>두 데이터프레임을 key 열을 기준으로 병합</li>
</ul>
</li>
</ul>
<h2 id="reshaping">Reshaping</h2>
<hr>
<h3 id="reshaping-1">Reshaping</h3>
<ul>
<li>zip 함수와 *의 역할<ul>
<li>*는 리스트를 unpack하여 zip 함수에 전달</li>
</ul>
</li>
<li>pd.MultiIndex.from_tuples<ul>
<li>tuples 리스트를 다중 인덱스 객체로 변환</li>
</ul>
</li>
<li>stack과 unstack</li>
</ul>
<pre><code>- stack
    - 열을 행으로 변환
    - 데이터프레임이 길게
- unstack
    - 행을 열로 변환
    - 데이터프레임이 넓게</code></pre><h3 id="pivot-tables">Pivot tables</h3>
<ul>
<li><p>코드</p>
<pre><code class="language-python">  pd.pivot_table(df83, values=&#39;D&#39;, index=[&#39;A&#39;, &#39;B&#39;], columns=[&#39;C&#39;])</code></pre>
<ul>
<li>pd.pivot_table()<ul>
<li>데이터를 요약하거나 재구조화할 때 사용하는 피벗 테이블 생성 함수</li>
<li>기본 집계 함수 : mean<ul>
<li>aggfunc<ul>
<li>기본값은 mean이지만, 이를 통해 sum, count, min, max 등으로 요약 가능</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>values=&#39;D&#39;<ul>
<li>열 D의 값을 요약하여 피벗 테이블의 셀 값으로 사용</li>
</ul>
</li>
<li>index=[&#39;A&#39;, &#39;B&#39;]<ul>
<li>A와 B 열을 행 인덱스로 설정</li>
</ul>
</li>
<li>columns=[&#39;C&#39;]<ul>
<li>C 열의 값을 열 헤더로 설정</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="missing-data">Missing data</h3>
<ul>
<li>NaN<ul>
<li>비교불가능한 값으로, 자기 자신과도 같지 않음<ul>
<li>ex) NaN == NaN → False임</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="counting-missing-data">Counting missing data</h3>
<ul>
<li><p>count()</p>
<ul>
<li>각 열에 대해 결측값이 아닌 데이터의 개수를 세는 함수입니다</li>
</ul>
</li>
<li><p>np.count_nonzero(array)</p>
<ul>
<li>배열에서 0이 아닌 값의 개수를 계산</li>
<li>NaN 값의 개수를 알고 싶으면 isnull()과 함께 사용하면 됨</li>
</ul>
</li>
<li><p>.interpolate()</p>
<ul>
<li>누락된 값 (NaN) 을 선형 보간법을 사용해 자동으로 채워 넣음</li>
<li>method=&#39;linear&#39;<ul>
<li>기본값</li>
<li>선형 보간 방식으로 값을 채움</li>
</ul>
</li>
<li>method=&#39;polynomial&#39;<ul>
<li>다항식 보간법을 사용할 수 있음</li>
<li>order 매개변수로 다항식의 차수를 지정할 수 있음</li>
</ul>
</li>
<li>limit<ul>
<li>한 번에 보간할 수 있는 최대 NaN 개수를 제한할 수 있음</li>
</ul>
</li>
</ul>
</li>
<li><p>skipna</p>
<ul>
<li><p>skipna=True</p>
<ul>
<li>기본값</li>
<li>NaN 값을 무시하고 합을 계산</li>
</ul>
</li>
<li><p>skipna=False</p>
<ul>
<li><p>NaN 값을 무시하지 않고 계산에 포함</p>
<p>  만약 NaN이 하나라도 있으면 결과는 NaN</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="tidy-data">Tidy data</h3>
<ul>
<li><p>pd.melt()</p>
<ul>
<li>데이터프레임을 긴 형식으로 변환하는 데 사용됨</li>
<li>wide format 데이터를 tidy data 데이터로 바꾸는 데 유용</li>
<li>id_vars<ul>
<li>변환되지 않고 고정될 열을 지정</li>
</ul>
</li>
</ul>
</li>
<li><p>.str.split(&#39;_&#39;)</p>
<ul>
<li><p>문자열을 다루는 .str 접근자를 사용하여 각 값을 언더스코어(_)를 기준으로 나눔</p>
</li>
<li><p>문자열을 분할하여 리스트 형태로 반환</p>
<pre><code class="language-python">status_values = variable_split.str.get(0)</code></pre>
</li>
<li><p>.str.get(0)</p>
<ul>
<li>각 리스트에서 첫 번째 값을 가져옴</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[현대사회와 법]]></title>
            <link>https://velog.io/@tae-log/%ED%98%84%EB%8C%80%EC%82%AC%ED%9A%8C%EC%99%80-%EB%B2%95</link>
            <guid>https://velog.io/@tae-log/%ED%98%84%EB%8C%80%EC%82%AC%ED%9A%8C%EC%99%80-%EB%B2%95</guid>
            <pubDate>Tue, 07 Jan 2025 12:04:39 GMT</pubDate>
            <description><![CDATA[<h3 id="chapter-1-사례를-통한-법의-이해">Chapter 1 사례를 통한 법의 이해</h3>
<hr>
<p>Ⅰ. 자백의 증거능력</p>
<ul>
<li><p>간통죄</p>
</li>
<li><p>필요적 공범 범죄</p>
<ul>
<li>반드시 공범이 있어야 성립하는 범죄</li>
<li>ex) 내란죄, 소요죄, 도박죄<ul>
<li>간통죄는 폐지됐으니까 답안에는 적지 않기</li>
</ul>
</li>
<li>필요적 반대말은 임의적</li>
</ul>
</li>
<li><p>친고죄</p>
<ul>
<li>고소가 있어야만 처벌을 할 수 있는 범죄</li>
<li>ex) 사자의 명예회손죄, 모욕죄, 비밀침해죄, 업무비밀누설죄 (간통죄는 친고죄였음)</li>
</ul>
</li>
<li><p>반의사불벌죄</p>
<ul>
<li>의사에 반해서는 불벌하는 죄</li>
<li>고소가 없어도 처벌 가능</li>
<li>ex) 폭행죄, 협박죄, 명예회손죄, 출판물 등에 의한 명예회손죄, 과실치상죄</li>
</ul>
</li>
<li><p>친고죄와 반의사불벌죄 모두 피해자의 합의가 중요</p>
</li>
<li><p>피고인에게 불이익한 유일한 증거인 때에는 이를 유죄의 증거로 하지 못한다 (형사소송법 310조)</p>
</li>
</ul>
<p>Ⅱ. 법은 공평한가?</p>
<ul>
<li>동산<ul>
<li>점유의 공신력 인정</li>
</ul>
</li>
<li>부동산<ul>
<li>등기의 공신력 인정x<ul>
<li>독일은 인정, 프랑스•일본•우리나라는 인정x</li>
</ul>
</li>
<li>등기의 공신력 : 등기를 믿고 거래한 자에게 진실한 권리관계 인정하는 힘</li>
<li>인정 → 거래의 안전에 도움 &amp; 권리자 보호 못 함 / 인정x → 권리자 보호 &amp; 거래 활성 문제</li>
</ul>
</li>
</ul>
<p>Ⅲ. 살인과 낙태 사이</p>
<ul>
<li>살인과 낙태는 별개의 범죄</li>
<li>진통설(형법), 일부노출설, 전부노출설(민법), 독립호흡설</li>
</ul>
<p>Ⅳ. 고의와 과실</p>
<ul>
<li>고의 = 일부러</li>
<li>과실 = 주의의무의 위반 = 부주의 = 실수로<ul>
<li>과실 책임의 원칙<ul>
<li>고의 또는 과실에 의하여 손해배상책임이 인정된다는 원칙</li>
<li>민사법 전반에 걸친 대원칙</li>
</ul>
</li>
</ul>
</li>
<li>고의로 발생한 손해는 형사책임(몸(구속))과 민사책임(돈) 모두 진다</li>
<li>과실로 발생한 손해는 민사책임만 지고, 형사책임은 지지 않는다(예외있음)</li>
</ul>
<h3 id="chapter-2-법에-대한-일반적-이해">Chapter 2 법에 대한 일반적 이해</h3>
<hr>
<p>Ⅰ. 사회규범의 일종으로서의 법</p>
<ul>
<li>시간과 공간 장소에 따라 다양하고 상대적</li>
<li>종류<ul>
<li>관습<ul>
<li>습관이나 반복되어 온 행위의 기준</li>
</ul>
</li>
<li>도덕<ul>
<li>사회의 존속과 평화유지를 위한 가치기준, 바람직한 행동기준</li>
</ul>
</li>
<li>종교규범</li>
<li>법<ul>
<li>강제력</li>
<li>강제규범의 총체</li>
</ul>
</li>
</ul>
</li>
<li>강제력 → 위반할 경우 비난을 가할 수 있음</li>
<li>법 = 사회규범 중에서 최소한의 것만을 규정한 것</li>
</ul>
<p>Ⅱ. 법의 목적</p>
<ul>
<li>정의의 실현<ul>
<li>평균적(산술적) 정의 - 형식적(절대적) 평등</li>
<li>배분적(기하학적) 정의 - 실질적 평등</li>
<li>일반적(보편적) 정의</li>
<li>정의 개념의 가편성</li>
</ul>
</li>
<li>법적 안정성의 추구<ul>
<li>법 내용 명확해야함</li>
<li>법 자주 변경x</li>
<li>실행가능한 법</li>
<li>국민의 법의식에 합치</li>
</ul>
</li>
</ul>
<p>Ⅲ.  법의 분류</p>
<ul>
<li>자연법과 실정법<ul>
<li>자연법 → 보편타당성</li>
</ul>
</li>
<li>국내법과 국제법</li>
<li>공법과 사법</li>
<li>사회법<ul>
<li>노동법</li>
<li>사회보장법</li>
<li>경제법</li>
</ul>
</li>
<li>일반법과 특별법<ul>
<li>특별법우선의 원칙<ul>
<li>일반법&lt;특별법, 구법&lt;신법</li>
</ul>
</li>
</ul>
</li>
<li>실체법과 절차법</li>
</ul>
<p>Ⅳ. 법의 효력</p>
<ul>
<li>법의 시간적 효력<ul>
<li>법률불소급의 원칙<ul>
<li>시행 이전에 일어난 사항에 적용 안되는 것</li>
</ul>
</li>
<li>신법을 적용하는 것이 당사자에게 오히려 유리한 경우에는 예외 인정</li>
</ul>
</li>
<li>법의 장소적 효력</li>
<li>법의 인적 효력<ul>
<li>속인주의 : 국적을 기준</li>
<li>속지주의 : 영토기준</li>
<li>오늘날 국가는 속지주의 원칙으로 하면서 속인주의 가미</li>
<li>타국에 있는 타국민에게도 적용되는 경우가 있음</li>
</ul>
</li>
</ul>
<p>Ⅴ. 법의 적용과 해석</p>
<ul>
<li>사실의 확정은 원칙적으로 증거에 의해야 한다</li>
<li>법의 해석<ul>
<li>주관설 → 입법자의 의사 / 객관설 → 법률의 의사</li>
</ul>
</li>
</ul>
<h3 id="chapter-3-혼인">Chapter 3 혼인</h3>
<hr>
<p>Ⅰ. 약혼</p>
<ul>
<li>정혼과 다름<ul>
<li>정혼은 결혼 약속</li>
</ul>
</li>
<li>효과<ul>
<li>불법행위 손해배상 청구 가능</li>
<li>혼외자, 혼생자</li>
</ul>
</li>
<li>약혼의 해제<ul>
<li>혼인의 의사가 없음을 확정적으로 표시 (법원을 거칠 필요도 없음)</li>
<li>약혼 해제의 효과<ul>
<li>손해배상 청구 가능<ul>
<li>정신상의 손해도 포함</li>
</ul>
</li>
<li>약혼예물의 반환을 청구<ul>
<li>다수의 판례는 유책당사자의 예물반환청구권을 부정</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Ⅱ. 혼인</p>
<ul>
<li>법률혼과 사실혼</li>
<li>혼인의 성립요건<ul>
<li>실질적 요건<ul>
<li>당사자 간의 혼인의사 합치가 있을 것<ul>
<li>합치 없으면 가장 혼인</li>
</ul>
</li>
<li>혼인 가능연령(혼인적령)에 도달할 것</li>
<li>미성년자 등의 경우에 동의를 얻을 것</li>
<li>일정범위의 근친혼이 아닐 것</li>
<li>중혼이 아닐 것</li>
</ul>
</li>
<li>형식적 요건<ul>
<li>혼인신고가 있어야만 법률혼이 된다<ul>
<li>아닌 경우는 사실혼</li>
<li>등기가 되어야 효력이 발생한다</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>혼인의 무효와 취소<ul>
<li>취소의 소급효 제한</li>
<li>혼인의 무효<ul>
<li>무효 사유 : 혼인합의x, 8촌이내, 직계인척관계, 양부모계의 직계혈족관계</li>
<li>처음부터 부부가 아니었던 것으로 봄</li>
</ul>
</li>
<li>혼인의 취소<ul>
<li>취소 사유</li>
<li>취소의 효과(이혼의 효과)<ul>
<li>소급효의 제한, 신분의 변동, 손해배상청구, 재산분할청구, 자녀의 친권 및 양육문제</li>
</ul>
</li>
</ul>
</li>
<li>혼인의 효과<ul>
<li>혼인의 신분적 효과<ul>
<li>친족관계의 발생, 성년의제, 부부 상호간의 의무 발생(동거, 부양, 협조, 정조)<ul>
<li>계모서자관계와 적모서자관계가 법정혈족관계가 되는 유일한 방법은 입양이다<ul>
<li>지금은 인척관계임</li>
</ul>
</li>
<li>성년의제는 공법관계에서는 여전히 미성년자로 취급</li>
<li>부정한 행위는 이혼청구의 사유지만 강간은 자발적이지 않으므로 부정한 행위x</li>
</ul>
</li>
</ul>
</li>
<li>혼인의 재산적 효과<ul>
<li>부부재산계약</li>
<li>법정재산제<ul>
<li>부부별산제<ul>
<li>특유재산 각자 관리, 귀속불명의 재산은 부부의 공유</li>
</ul>
</li>
<li>혼인생활비용 공동부담의 원칙</li>
<li>일상가사대리권과 일상가사채무의 연대책임<ul>
<li>일상가사 : 부부의 공동생활에서 필요로 하는 통상의 사무</li>
</ul>
</li>
</ul>
</li>
<li>상속권의 발생</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="chapter-4-이혼">Chapter 4 이혼</h3>
<hr>
<p>Ⅰ. 이혼의 의의와 종류</p>
<ul>
<li><p>이혼의 의의</p>
<ul>
<li>혼인의 해소원인<ul>
<li>부부 일방의 사망, 실종선고, 이혼<ul>
<li>부부 일방이 사망한다고 인척관계 소멸x, 생존배우자가 재혼한 경우에 비로소 소멸</li>
</ul>
</li>
</ul>
</li>
<li>이혼 : 부부가 혼인관계를 더 이상 유지할수 없을 때에 부부의 협의나 법원의 재판에 의하여 부부의 신분관계와 재산관계를 청산하는 것.</li>
</ul>
</li>
<li><p>유책주의</p>
<ul>
<li>책임이 있는 사람의 요구 인정x</li>
<li>책임 있는 당사자의 재판상 이혼청구를 인정하지 않는다.</li>
</ul>
</li>
<li><p>파탄주의</p>
<ul>
<li>유책배우자의 이혼청구 인정</li>
</ul>
</li>
<li><p>이혼의 종류</p>
<ul>
<li>실질적 요건<ul>
<li>이혼의사의 합치<ul>
<li>미성년자는 혼인할 때에는 부모의 동의가 필요하지만, 이혼시에는 필요가 없다</li>
</ul>
</li>
</ul>
</li>
<li>협의상 이혼<ul>
<li>절차적 요건<ul>
<li>가정법원의 확인 (10초 걸림)<ul>
<li>혼인은 필요없지만 이혼은 확인 받아야함</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>재판상 이혼<ul>
<li>한 명은 원하지 않는 이유<ul>
<li>1호 : 배우자의 부정한 행위가 있을 때<ul>
<li>정조의무 위반</li>
<li>안 날로부터 6개월, 부정행위가 있었던 날로부터 2년</li>
</ul>
</li>
<li>2호 : 배우자가 악의로 다른 일방을 유기한 때</li>
<li>3호 : 배우자 또는 그 직계존속에 의해 심히 부당한 대우가 있을 때<ul>
<li>위자료 청구 가능</li>
</ul>
</li>
<li>4호 : 자기의 직계존속이 배우자로부터 심히 부당한 대우를 받았을 때</li>
<li>5호 : 배우자가 3년 이상 생사불명인 때<ul>
<li>생존하여 귀환하더라도 혼인은 부활x</li>
</ul>
</li>
<li>6호 : 기타 혼인을 계속하기 어려운 중대한 사유가 있는 때<ul>
<li>5호까지만 존재하면 명백한 유책주의, 6호는 파탄주의로 보임</li>
<li>처의 임신불능, 남편의 일시적 성적 장애, 사소한 불화, 무정자증 등은 인정x</li>
</ul>
</li>
</ul>
</li>
<li>유책배우자의 이혼 청구<ul>
<li>적극설</li>
<li>소극설<ul>
<li>축출이혼 문제</li>
</ul>
</li>
<li>제한적 소극설</li>
</ul>
</li>
<li>재판상 이혼의 절차<ul>
<li>조정전치주의 : 이혼 합의 안됐을 때 이혼하려는 자가 가정법원에 조정 신청해야하는 것</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Ⅱ. 이혼의 효과</p>
<p>= 혼인 취소</p>
<ul>
<li>일반적 효과</li>
<li>자녀에 대한 효과<ul>
<li>부자관계와 모자관계는 이혼 후에도 존속한다<ul>
<li>상속도 똑같이</li>
</ul>
</li>
<li>양육자 결정문제, 친권자 결정문제</li>
<li>과거의 양육비 청구 현재 인정</li>
</ul>
</li>
<li>재산적 효과<ul>
<li>재산분할청구권<ul>
<li>혼인 중에 취득한 재산의 분할을 청구할 수 있는 권리</li>
<li>부부 쌍방의 협력으로 이룩한 재산</li>
<li>일방의 명의도 특유재산으로 추정 받지만, 협력했다는 증거 있으면 분할대상 가능</li>
<li>특유재산도 협력했으면 분할의 대상이 된다</li>
<li>혼인 해소전에 미리 포기하는 것x</li>
<li>2년 이내에 청구 가능</li>
</ul>
</li>
<li>손해배상청구권</li>
</ul>
</li>
</ul>
<h3 id="chapter-5-상속1">Chapter 5 상속1</h3>
<hr>
<p>Ⅰ. 상속제도</p>
<ul>
<li>재산 상속</li>
<li>특별한 유언을 남기지 않은 경우에 법에 따라서 한다</li>
</ul>
<p>Ⅱ. 상속의 개시와 상속인</p>
<ul>
<li>피상속인의 사망과 상속의 개시<ul>
<li>사망하자마자 개시</li>
</ul>
</li>
<li>상속의 순위<ol>
<li>피상속인의 직계비속</li>
<li>피상속인의 직계존속</li>
<li>피상속인의 형제자매</li>
<li>피상속인의 4촌 이내의 방계혈족</li>
</ol>
<ul>
<li>피상속인의 배우자는 피상속인의 직계비속이나 직계존속이 있는 경우에는 그 상속인과 동순위로 공동상속인이 되고, 직계비속이나 직계존속이 모두 없는 경우에는 단독상속인이 된다</li>
<li>2순위는 1순위가 없을 때 상속받는다</li>
<li>자식이 여러명이면 공동상속인</li>
<li>태아는 이미 출생했다고 본다</li>
</ul>
</li>
</ul>
<p>Ⅲ. 상속의 결격과 대습상속</p>
<ul>
<li>상속의 결격<ul>
<li>상속을 받을 수 없는</li>
</ul>
</li>
<li>대습 상속<ul>
<li>1순위나 3순위가 상속을 받기 전에 사망하거나 결격자가 된 경우에 그 사람의 직계비속과 배우자가 사망 또는 결격된 사람을 대신해서 상속인이 되는 것</li>
<li>동시 사망의 추정 (규정이 있는 건 아님)</li>
</ul>
</li>
</ul>
<p>Ⅳ. 상속분</p>
<ul>
<li><p>법정상속분</p>
<ul>
<li>배우자는 50% 가산</li>
<li>균분상속의 원칙</li>
</ul>
</li>
<li><p>특별수익자의 상속분</p>
<ul>
<li>공동상속인 중에 피상속인으로부터 미리 증여를 받은 경우의 상속분계산</li>
</ul>
</li>
<li><p>기여분</p>
<ul>
<li>기여분권리자<ul>
<li>특별히 부양한 상속인, 특별히 기여한 상속인</li>
<li>공동상속인의 협의(전부 협의 해야한다) 또는 가정법원의 심판으로 결정한다</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="chapter-6-상속2">Chapter 6 상속2</h3>
<hr>
<p>Ⅰ. 상속의 승인과 포기</p>
<ul>
<li>3개월 내에 단순승인, 한정승인, 포기 할 수 있다<ul>
<li>포기한 사람이 없다고 생각하고 계산</li>
</ul>
</li>
<li>단순승인<ul>
<li>아무것도 안하고 있으면, 신고하지 않으면 단순승인</li>
<li>유산과 빚 무제한•무조건으로 승계</li>
</ul>
</li>
<li>상속포기<ul>
<li>3개월 내에 가정법원에 상속포기의 신고</li>
</ul>
</li>
<li>한정승인<ul>
<li>채무가 재산을 초과하는 사실을 알지 못하고 단순승인으로 의제된 경우에 그 사실을 안 날로부터 3개월 내에 한정승인 가능</li>
</ul>
</li>
</ul>
<p>Ⅱ. 유언</p>
<ul>
<li>유언제도<ul>
<li>재산처분의 자유</li>
</ul>
</li>
<li>유언의 자유와 제한<ul>
<li>무제한 인정되는 것은 아님</li>
<li>법정사항, 유류분, 유언방식 으로 제한됨</li>
</ul>
</li>
<li>유언의 방식<ul>
<li>유언의 요식성</li>
<li>종류<ul>
<li>자필증서</li>
<li>녹음</li>
<li>공정증서</li>
<li>비밀증서</li>
<li>구수증서</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Ⅲ. 유류분</p>
<ul>
<li>상속인의 유류분<ol>
<li>직계비속은 그 법정상속분의 1/2</li>
<li>배우자는 그 법정상속분의 1/2</li>
<li>직계존속은 그 법정상속분의 1/3</li>
<li>형제자매는 그 법정상속분의 1/3</li>
</ol>
</li>
<li>유류분의 산정<ul>
<li>유류분 산정의 기초재산 = 상속개시시의 재산가액 + 증여재산 - 채무<ul>
<li>증여는 상속개시전의 1년간에 행한 것에 한하여 산정하지만, 당사자쌍방이 유류분 권리자에 손해를 가할 것을 알고 증여를 한 때에는 1년전에 한 것도 같다</li>
</ul>
</li>
</ul>
</li>
<li>유루분반환청구권<ul>
<li>유류분 침해액의 산정<ul>
<li>유루분 부족액 = 유류분(액) - 순상속분액</li>
<li>순상속분액 = 상속 받은 적극재산액 - 상속채무 분담액</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="chapter-7-소멸시효와-공소시효">Chapter 7 소멸시효와 공소시효</h3>
<hr>
<ul>
<li>시험범위 아님</li>
</ul>
<h3 id="chapter-9-점유와-선의취득">Chapter 9 점유와 선의취득</h3>
<hr>
<p>Ⅰ. 점유</p>
<ul>
<li>사람만이 권리와 의무의 주체<ul>
<li>자연인 : 태어나면서부터 사람</li>
<li>법인 : 원래는 사람이 아니지만 법이 사람으로 인정해 준 것<ul>
<li>재단법인, 사단법인, 학교법인</li>
</ul>
</li>
</ul>
</li>
<li>물건은 권리의 객체<ul>
<li>동산, 부동산</li>
</ul>
</li>
<li>동물은 물건<ul>
<li>동물은 상속받을 수 없음</li>
</ul>
</li>
<li>소유권 : 물건을 전면적으로 지배할 수 있는 권리</li>
<li>점유 : 물건에 대한 현재의 사실상의 지배<ul>
<li>불법적인 방법일지라도 자동차에 대한 사실상의 지배를 하고 있으면 점유 인정</li>
</ul>
</li>
</ul>
<p>Ⅱ. 유실물습득과 점유이탈물횡령죄</p>
<ul>
<li><p>유실물법</p>
<ul>
<li>습득물의 조치<ul>
<li>제출받은 경찰서장 등은 공고해야함</li>
</ul>
</li>
<li>보상금<ul>
<li>물건 가액의 5/100~20/100 보상금 지급해야함</li>
</ul>
</li>
<li>습득자의 권리상실<ul>
<li>7일 이내에 절차 취해야함<ul>
<li>7일이 지나면 물건 주인이 나타나지 않은 경우에도 물건을 가질 수 없고 보상금 청구도 불가능</li>
</ul>
</li>
</ul>
</li>
<li>유실물의 소유권취득<ul>
<li>유실물은 법률에 정한 바에 의하여 공고한 후 6개월 내에 그 소유자가 권리를 주장하지 아니하면 습득자가 그 소유권을 취득한다<ul>
<li>물건을 찾아갈 수 있는 기간은 그 때로부터 3개월이다</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>유실물</p>
<ul>
<li><p>점유자의 의사에 기하지 않고 점유를 떠난 물건 = 잃어버린 물건 = 점유이탈물</p>
</li>
<li><p>점유이탈물횡령죄</p>
<ul>
<li>조치를 취하지 않았을 때 성립하는 범죄</li>
<li>1년 이하의 징역이나 300만원 이하의 벌금 또는 과료</li>
<li>ex) 길거리, 시내버스, 고속버스, 지하철 등<ul>
<li>일정한 관리인이 없는 곳</li>
</ul>
</li>
</ul>
</li>
<li><p>절도죄</p>
<ul>
<li>점유를 완전히 이탈한 물건이 아닌 경우</li>
<li>6년 이하의 징역 또는 1천만원 이하의 벌금</li>
<li>ex) 병원, 영화관, 당구장, 은행 현금자동입출금기 등</li>
<li>훨씬 무겁게 처벌</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Ⅲ. 선의 취득</p>
<ul>
<li><p>선의 : 어떤 사정을 알지 못하는 것</p>
</li>
<li><p>악의 : 어떤 사정을 알고 있는 것</p>
</li>
<li><p>선의인 자는 보호해주고 악의인 자는 보호받지 못함이 원칙</p>
</li>
<li><p>선의취득</p>
<ul>
<li>상대방의 점유를 신뢰하여 그 물건을 양수한 자는 설령 상대방이 무권리자라 할지라도 그 동산의 소유권을 유효하게 취득하는 제도<ul>
<li>취득한 사람이 선의이면 권리 취득 가능하다는 뜻<ul>
<li>선의 : 평온, 공연하게 동산을 양수한 자</li>
</ul>
</li>
</ul>
</li>
<li>목적 : 거래안전의 보호와 거래의 활성화를 도모</li>
<li>단점 : 진정한 권리자 희생</li>
</ul>
</li>
<li><p>선의취득 성립요건</p>
<ul>
<li>동산에 한정<ul>
<li>금전은 선의취득 대상 아님<ul>
<li>치의 표상으로 유통되는 금전 아니라 단순한 물건으로 거래되는 금전</li>
<li>도둑이 훔쳐간 순간 그사람 소유=점유<ul>
<li>50만원의 가치를 돌려주면 되니까 (5만원 10장 = 1만원 50장)</li>
</ul>
</li>
<li>예외 : 일련변호 특별한 지폐</li>
</ul>
</li>
</ul>
</li>
<li>양도인은 점유하고 있었어야 하며, 무권리자여야 한다</li>
<li>양수인은 유효한 거래를 통하여 평온•공연•선의•무과실로 점유를 취득하였어야 한다<ul>
<li>평온(↔폭력), 공연(↔은밀히)</li>
</ul>
</li>
</ul>
</li>
<li><p>도품, 유실물에 대한 특례</p>
<ul>
<li>선의취득의 경우에 그 동산이 도품이나 유실물인 때에는 도난 또는 유실한 날로부터 2년 내에 물건의 반환 청구 가능<ul>
<li>도품이나 유실물이 금전일 땐 아님</li>
</ul>
</li>
<li>2년동안의 소유권은 누구에게 속하는지 견해대립<ul>
<li>다수 판례는 일단 선의취득자가 취득하고, 진정한 소유자는 점유회복하는 때에 소유권회복 한다고 봄</li>
</ul>
</li>
<li>양수인이 경매나 공개시장, 상인에게서 매수한 때에는 피해자 또는 유실자는 양수인이 지급한 대가를 변상하고 그 물건의 반환을 청구할 수 있다<ul>
<li>유실자가 양수인에게 변상이 없이 돌려달라하면 돌려주지 않아도 됨</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Ⅳ. 취득시효</p>
<ul>
<li>부동산과 동산 모두 취득시효의 객체가 될 수 있다</li>
<li>부동산의 점유취득시효<ul>
<li>20년간 소유의 의사로 평온•공연하게 부동산을 점유하는 자가 등기를 하면 소유권 취득<ul>
<li>20년 중 점유 승계 있는 경우 합치기 가능</li>
</ul>
</li>
<li>객체 : 토지, 건물, 부동산의 일부</li>
<li>요건<ul>
<li>소유의 의사가 있는 점유, 자주점유, 평온•공연한 점유</li>
<li>갖춘사람이 등기하면 소유권 취득</li>
</ul>
</li>
</ul>
</li>
<li>부동산의 등기부취득시효<ul>
<li>소유자는 아니지만 소유자로 등기한 자가 10년간 소유의 의사로 평온•공연하게 선의이며 과실없이 부동산 점유하면 소유권 취득</li>
<li>요건<ul>
<li>등기기간과 점유기간이 각각 10년 이상</li>
<li>대부분 판례는 등기명의 넘겨받은 경우에 등기기간 합산 가능하다는 입장</li>
<li>등기 되어있으므로 요건 갖추면 바로 소유권 취득</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="chapter-10-범죄와-형벌">Chapter 10 범죄와 형벌</h3>
<hr>
<p>Ⅰ. 죄형 법정 주의</p>
<ul>
<li>범죄와 형벌은 법이 정해야한다<ul>
<li>아무리 나쁜 행위가 있다 하더라도 법률규정이 없으면 처벌x</li>
</ul>
</li>
<li>죄형법정주의의 파생원칙<ul>
<li>관습형법금지의 원칙<ul>
<li>관습 안되고 법조문에 있어야한다는 뜻</li>
</ul>
</li>
<li>명확성의 원칙<ul>
<li>형기(형벌의 진행기간)를 정해야함</li>
</ul>
</li>
<li>유추해석금지의 원칙<ul>
<li>엄격히 해석x, 확대해석x</li>
<li>안그러면 자의적인 형벌권 남용우려</li>
<li>행위자에게 유리하거나 형을 경감하는 유추해석은 가능</li>
</ul>
</li>
<li>소급효금지의 원칙<ul>
<li>제정 또는 개정되기 이전의 행위에 대해서 소급하여 적용할 수 없다</li>
<li>행위자에게 유리한 경우에는 소급적용이 가능하다</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Ⅱ. 범죄의 성립요건</p>
<ul>
<li>요건 세가지 갖추지 못하면 무죄</li>
<li>구성요건해당성<ul>
<li>형법조문의 구성 = 범죄의 구성요건 + 형벌<ul>
<li>구성요건 ex) 사람을 살해한 자…</li>
<li>형벌 ex) 사형</li>
</ul>
</li>
</ul>
</li>
<li>위법성<ul>
<li>구성요건에 해당하는 행위는 위법하고 책임이 있다고 추정<ul>
<li>특별한 사유에 아닌 경우도 있음 → 위법성 조각사유</li>
</ul>
</li>
</ul>
</li>
<li>책임<ul>
<li>책임능력 없는 사람 → ‘적법행위의 기대가능성’ 없고 → ‘비난 가능성’ 없으므로 → 형벌x<ul>
<li>책임 능력이 없어지는 특별한 사유 : 책임 조각 사유</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Ⅲ. 인과관계</p>
<ul>
<li>인과관계 없으면 책임 물을 수 없음</li>
</ul>
<p>Ⅳ. 고의와 과실</p>
<ul>
<li><p>고의</p>
<ul>
<li>구성요건적 사실을 인식하거나 인용하는 것</li>
<li>형법은 대부분 고의범, 예외적으로 과실범</li>
</ul>
</li>
<li><p>미필적 고의</p>
<ul>
<li>고의와 과실의 경계선</li>
<li>고의의 일종이므로 처벌은 직접적 고의와 같음</li>
</ul>
</li>
<li><p>과실</p>
<ul>
<li>ex) 과실치사 : 과실로 사망에 이르게 한 자는 2년 이하의 금고 또는 700만 이하의 벌금<ul>
<li>고의 살인은 사형 무기 또는 5년이상의 징역임</li>
</ul>
</li>
<li>손해가 발생할 것 인식하였지만 자신의 능력•기술 등으로 피할 수 있다고 믿은 경우</li>
</ul>
</li>
<li><p>민법에서는 엄격하게 구분하지 않지만, 형법에서는 고의범만을 처벌하므로 엄격히 구분</p>
</li>
</ul>
<p>Ⅴ. 미수론</p>
<ul>
<li>범죄행위를 하였으나 결과가 발생하지 않는 경우<ul>
<li>ex) 살인하려했는데 상처만 입힌 경우</li>
</ul>
</li>
<li>↔ 기수</li>
<li>요건<ul>
<li>실행의 착수</li>
<li>범죄의 미완성</li>
</ul>
</li>
<li>모든 미수를 다 처벌하지 않고 세가지만 처벌함<ul>
<li>장애미수<ul>
<li>외부적 장애로 못한 경우</li>
<li>‘하려고 했으나 하지 못했다’</li>
<li>미수는 대부분 장애미수</li>
<li>임의적 감경<ul>
<li>형을 감경해도 되고 안해도 되고</li>
</ul>
</li>
</ul>
</li>
<li>중지미수<ul>
<li>자의로 중지한 경우<ul>
<li>결과발생까지 막아야 인정가능</li>
</ul>
</li>
<li>‘할 수 있었으나 하지 않았다’</li>
<li>필요적 감면<ul>
<li>반드시 형을 감경하거나 면제해야함<ul>
<li>얘만 기수범이랑 똑같이 처벌 불가능</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>불능미수<ul>
<li>착오로 인하여 결과의 발생이 불가능하더라도 위험성이 있는 때</li>
<li>임의적 감면<ul>
<li>형을 감경 또는 면제할 수도 있고 기수범과 똑같이 처벌할 수도 있다</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Ⅵ. 공범론</p>
<ul>
<li>공동정범<ul>
<li>요건 : 각 공범자의 공동의 범행의사, 공동의 실행행위</li>
</ul>
</li>
<li>교사범</li>
</ul>
<pre><code>- 교사범 : 범죄의 고의가 없는 자를 부추기는 자

- 피교사자 : 부추기는 것에 넘어가 범죄를 수행하는 자
- 둘 다 동일한 형</code></pre><ul>
<li>방조범<ul>
<li>종범<ul>
<li>정범(직접 범죄를 저지른)의 형보다는 감경</li>
<li>수단과 방법에 제한x</li>
<li>부작위에 의한 방조도 가능<ul>
<li>ex) 산모가 모유수유 안했을 때</li>
</ul>
</li>
<li>범죄자의 실행행위가 종료된 후에는 방조범이 성립하지 않는다</li>
</ul>
</li>
</ul>
</li>
<li>간접정범<ul>
<li>공범은 아님<ul>
<li>여러사람이 나와서 같이 다루는 것 뿐임</li>
</ul>
</li>
<li>무죄</li>
<li>도구 느낌임</li>
</ul>
</li>
</ul>
<h3 id="chapter-11-위법성조각사유">Chapter 11 위법성조각사유</h3>
<hr>
<p>Ⅰ.  위법성조각사유의 의의</p>
<ul>
<li>범죄의 구성요건에 해당할지라도 위법하다고 볼 수 없는 사유</li>
<li>5가지 인정<ul>
<li>정당방위, 긴급피난, 자구행위, 피해자의 승낙, 정당행위</li>
</ul>
</li>
</ul>
<p>Ⅱ. 정당방위</p>
<ul>
<li>성립요건 충족하면 → 처벌x<ul>
<li>과잉 방위면 감경 또는 면제 → 처벌 가능<ul>
<li>야간에 공포 등으로 인한 때에는 → 처벌x<ul>
<li>책임을 물을 수 없으므로</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>‘법은 불법에 양보할 필요가 없다’</li>
<li>요건<ul>
<li>현재의 부당한 침해가 있을 것<ul>
<li>물건이나 동물에 의한 침해는 x<ul>
<li>동물을 도구로 이용한 사람에 의한 침해는 o</li>
</ul>
</li>
<li>과거의 침해에 대한 방어는 보복임</li>
</ul>
</li>
<li>자기 또는 타인의 법익을 방위하기 위한 행위일 것<ul>
<li>위 이유로 싸움은 정당방위 해당 안됨<ul>
<li>공격과 방어가 교차하므로</li>
</ul>
</li>
</ul>
</li>
<li>방위행위가 상당한 이유가 있을 것<ul>
<li>도구나 피신 등과 같은 다른 방법이 있었더라도 정당방위는 인정될 수 있다<ul>
<li>긴급피난과 구별</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>과잉방위<ul>
<li>과잉방위는 위법조각사유x<ul>
<li>야간에 있는 공포 등만 예외</li>
</ul>
</li>
<li>과잉방위에 대한 정당방위 역시 허용</li>
</ul>
</li>
<li>오상방위<ul>
<li>오상방위도 위법조각사유x<ul>
<li>정당방위 상황이 처음부터 존재하지 않는다고 봄</li>
</ul>
</li>
<li>형법규정없음<ul>
<li>정당한 이유 있으면 처벌x, 이유없으면 과실범으로 처벌o</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Ⅲ. 긴급피난</p>
<ul>
<li>성립요건 충족하면 → 처벌x<ul>
<li>위난을 피하지 못할 책임이 있는 자는 긴급피난 허용x<ul>
<li>ex) 군인, 경찰관, 소방관, 선장, 의사<ul>
<li>의무를 넘는 위난은 피난 가능<ul>
<li>ex) 소방관이 도저히 불을 끌 수 없는 상황</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>성립요건<ul>
<li>현재의 위난이 있을 것<ul>
<li>스스로 자초한 것이면 안됨</li>
</ul>
</li>
<li>자기 또는 타인에게 닥친 위난을 피하는 행위일 것</li>
<li>피난행위에 상당한 이유가 있을 것<ul>
<li>피난 행위가 유일한 방법인 경우만 인정된다 (보충성의 원칙)</li>
<li>피난행위에 의하여 보호되는 이익 &gt; 피난행위로 인하여 침해되는 이익 (균형성의 원칙)</li>
</ul>
</li>
</ul>
</li>
<li>과잉피난 : 상당한 이유 없는 경우<ul>
<li>과잉피난과 오상피난 모두 정당방위와 비슷하게 따름</li>
</ul>
</li>
</ul>
<p>Ⅳ. 자구행위</p>
<ul>
<li>= 자력구제</li>
<li>권리를 해결하려면 시간이 촉박하고, 실효성을 거둘 수 없는 것에 예외적으로 인정하는 경우</li>
</ul>
<p>Ⅴ. 피해자의 승낙</p>
<ul>
<li>경우에 따라 조각되는 경우도 있고 않는 경우도 있고 조금 줄어드는 경우도 있음<ul>
<li>피해자 승낙있으면 범죄가 성립하지 않는 경우<ul>
<li>위법성 조각(구성요건해당성 자체가 없어짐)<ul>
<li>해당성 자체를 조각하는 ‘양해’</li>
<li>해당하지만 위법성 조각하는 ‘승낙’</li>
</ul>
</li>
</ul>
</li>
<li>피해자의 승낙이 감경적 구성요건에 불과한 경우<ul>
<li>위법성이 조각되지는 않고 줄어들면 형을 덜 받게 됨</li>
</ul>
</li>
<li>피해자의 승낙이 있다 하더라도 범죄가 성립하는 경우<ul>
<li>미성년자의제강간죄<ul>
<li>만 16세 미만일 때<ul>
<li>일반인이 보았을 때 도저히 16세 미만이라고 생각되지 않는 정도면 범죄 성립x</li>
</ul>
</li>
<li>미성년자와 돈 주고 성매매</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Ⅵ. 정당행위</p>
<ul>
<li>법령에 의한 행위</li>
<li>업무로 인한 행위<ul>
<li>ex) 의사의 치료행위, 변호사의 직무행위, 성직자의 직무행위</li>
<li>불법적인 업무는x<ul>
<li>ex) 살인청부업</li>
</ul>
</li>
</ul>
</li>
<li>기타 사회상규에 위배되지 아니하는 행위</li>
</ul>
<h3 id="chapter-12-책임조각사유">Chapter 12 책임조각사유</h3>
<hr>
<p>Ⅰ. 책임조각사유 의의</p>
<ul>
<li>책임 = 행위자에 대한 법적 비난가능성<ul>
<li>적법행위의 기대가능성</li>
</ul>
</li>
<li>책임 능력<ul>
<li>책임능력 = 통찰능력 + 의사결정능력</li>
</ul>
</li>
<li>책임조각사유<ul>
<li>= 면책사유</li>
<li>책임무능력자<ul>
<li>전혀 책임을 물을 수 없는 경우</li>
</ul>
</li>
<li>한정책임능력자<ul>
<li>일정부분만 물을 수 있는 경우</li>
</ul>
</li>
<li>강요된 행위</li>
<li>원인에 있어서 자유로운 행위</li>
<li>과잉방위, 과잉피난</li>
</ul>
</li>
</ul>
<p>Ⅱ. 책임무능력자</p>
<ul>
<li>범죄의 구성요건에 해당하고 위법하더라도 처벌x</li>
<li>형사미성년자<ul>
<li>만 14세 미만<ul>
<li>가족관계등록부(호적) 기준이 아니라 실제 연령 기준</li>
</ul>
</li>
<li>c.f ) 19세미만 미성년자는 소년법<ul>
<li>판결시 기준</li>
<li>15년 유기징역</li>
</ul>
</li>
</ul>
</li>
<li>심신상실자<ul>
<li>정신분열증, 조울증, 알콜이나 약품중독, 치매, 심한 명정상태<ul>
<li>명정 : 정신을 차리지 못할 정도로 술에 취한 상태</li>
<li>법관의 판단</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Ⅲ. 한정책임능력자</p>
<ul>
<li>감경해도 좋고 안해도 좋다</li>
<li>심신미약자, 청각 및 언어장애인(농아자) → 감경<ul>
<li>농아자는 듣거나 말하는 것 둘 다 못해야함</li>
</ul>
</li>
</ul>
<p>Ⅳ. 강요된 행위</p>
<ul>
<li>성립요건<ul>
<li>저항할 수 없는 폭력<ul>
<li>심리적 폭력을 말함</li>
<li>제거할 힘이 있더라도 거부할 수 없는 처지에 있는 경우도 포함</li>
</ul>
</li>
<li>자기 또는 친족의 생명•신체에 대한 위해를 방어할 방법이 없는 협박<ul>
<li>타인x, 법익에 대한x</li>
</ul>
</li>
<li>강요된 행위</li>
</ul>
</li>
<li>효과<ul>
<li>피강요자의 책임<ul>
<li>피강요자의 강요된 행위는 적법행위에 대한 기대가능성이 없어 책임이 조각 → 벌x</li>
<li>위법성은 조각되지 않으므로 이에 대한 정당방위는 가능</li>
</ul>
</li>
<li>강요자의 책임<ul>
<li>대부분 간접정범으로 처벌</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Ⅴ. 원인에 있어서 자유로운 행위</p>
<ul>
<li>고의에 의한 원인</li>
<li>과실에 의한 원인</li>
<li>처벌o, 감경x</li>
</ul>
<h3 id="chapter-13-계약과-채무불이행">Chapter 13 계약과 채무불이행</h3>
<hr>
<p>Ⅰ. 계약의 의의</p>
<p>Ⅱ. 계약의 성립</p>
<ul>
<li>계약을 체결한다 = 채권, 채무가 발생한다</li>
<li>청약의 유인은 대부분 있지만 없을 수도 있다.</li>
<li>각자의 채무를 동시에 이행해야 하는 것이 원칙이다<ul>
<li>예외는 부동산</li>
</ul>
</li>
<li>동시이행의 항변권<ul>
<li>쌍무계약에서 상대방이 채무의 이행을 제공할 때까지 자기 채무의 이행을 거절할 수 있는 권리<ul>
<li>쌍무계약 : 대가적 의미를 지닌 채무를 부담하는 계약 (↔편무)</li>
</ul>
</li>
</ul>
</li>
<li>계약의 성립단계<ul>
<li>청약의 유인</li>
<li>청약</li>
<li>승낙<ul>
<li>승낙여부 자유</li>
<li>이때 계약 성립</li>
<li>의사표시만 합치되면 계약서 없더라도 계약은 성립</li>
</ul>
</li>
<li>계약성립요건으로서의 합의<ul>
<li>객관적합치+주관적합치</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Ⅲ. 민법상 15종의 전형계약</p>
<ul>
<li><p>증여, 매매, 교환, 소비대차, 사용대차, 임대차 고용, 도급, 여행계약, 현상광고, 위임, 임치, 조합, 종신정기금, 화해</p>
</li>
<li><p>재산권계약 : 증여, 매매, 교환</p>
<ul>
<li>재산권의 이전을 목적으로 하는 계약</li>
<li>증여<ul>
<li>무상</li>
<li>대표적인 편무계약</li>
<li>상대방이 승낙해야 증여 성립</li>
</ul>
</li>
<li>매매<ul>
<li>무조건 유상</li>
<li>대표적인 쌍무계약</li>
<li>물건 사고파는 것</li>
<li>매도인의 하자담보책임<ul>
<li>목적물에 하자가 있는 경우 매도인은 일정한 책임 부담</li>
</ul>
</li>
</ul>
</li>
<li>교환<ul>
<li>유상계약</li>
<li>금전이 오가지 않음</li>
</ul>
</li>
</ul>
</li>
<li><p>대차형계약 : 소비대차, 사용대차, 임대차</p>
<ul>
<li><p>물건의 이용을 목적으로 하는 전형계약</p>
</li>
<li><p>소비대차</p>
<ul>
<li>무상 or 유상</li>
<li>목적물과 같은 종류</li>
<li>보통 편무계약</li>
<li>ex) 돈, 술, 쌀<ul>
<li>돈 : 금전소비대차계약</li>
</ul>
</li>
</ul>
</li>
<li><p>사용대차</p>
<ul>
<li>무상</li>
<li>목적물 그 자체</li>
<li>ex) 볼펜 빌림</li>
</ul>
</li>
<li><p>임대차</p>
<ul>
<li>유상</li>
<li>목적을 그 자체</li>
<li>ex) 주택임대차계약</li>
</ul>
</li>
</ul>
</li>
<li><p>노무공급계약 : 고용, 도급, 여행계약, 현상광고, 위임, 임치</p>
<ul>
<li>타인의 노동력을 이용하는 것을 목적으로 하는 계약</li>
<li>고용<ul>
<li>쌍무→유상계약</li>
<li>ex) 고용계약, 근로계약<ul>
<li>고용이 자유로움, 근로가 제한</li>
</ul>
</li>
</ul>
</li>
<li>도급<ul>
<li>일의 완성</li>
<li>ex) 건축의뢰</li>
</ul>
</li>
<li>여행계약<ul>
<li>패키지 염두에 두고 만든 계약</li>
<li>도급과는 별개</li>
</ul>
</li>
<li>현상광고<ul>
<li>모든사람에게 광고</li>
<li>ex) 우수현상광고, 현상금광고<ul>
<li>ex) 대학생우수논문공고</li>
</ul>
</li>
<li>예외적으로 편무계약이지만 유상계약<ul>
<li>일반적으로 쌍무→유상, 편무→무상</li>
</ul>
</li>
</ul>
</li>
<li>위임<ul>
<li>무상 계약</li>
<li>사무의 처리 위탁</li>
<li>포괄적 위탁</li>
<li>ex) 변호사에게 자신의 소송 위임</li>
</ul>
</li>
<li>임치<ul>
<li>원칙적으로 무상</li>
<li>위임 중 물건의 보관이라는 특수한 상황</li>
<li>보관 및 반환의무</li>
</ul>
</li>
</ul>
</li>
<li><p>기타의 전형계약 : 조합, 종신정기금, 화해</p>
<ul>
<li>조합<ul>
<li>유상</li>
<li>공동사업</li>
</ul>
</li>
<li>종신정기금<ul>
<li>유상 or 무상</li>
<li>사망할 때까지 정기적으로 급부 반복</li>
</ul>
</li>
<li>화해<ul>
<li>내가 ~하는 조건으로 상대방도 ~하는 것이므로 유상이다</li>
</ul>
</li>
</ul>
</li>
<li><p>계약 이외의 법률 규정에 의한 채권•채무 발생원인</p>
<ul>
<li>사무관리<ul>
<li>의무없이 사무 처리해주는 행위<ul>
<li>의무로 처리는 위임</li>
</ul>
</li>
</ul>
</li>
<li>부당이득<ul>
<li>손해입히고 이익얻으면 이익반환하게 해주는 제도</li>
</ul>
</li>
<li>불법행위<ul>
<li>손해주는 행위, 손해배상 청구 가능</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Ⅳ. 계약의 소멸</p>
<ul>
<li>계약이 이행되었을 때 소멸</li>
<li>계약의 해제 : 처음부터 없었던 것</li>
<li>계약의 해지 : 없던게 되지는 않음</li>
<li>계속적 채권관계 : 소비대차, 사용대차, 임대차, 고용, 위임, 임치, 조합, 종신정기금</li>
</ul>
<p>Ⅴ. 채무불이행</p>
<ul>
<li>이행지체<ul>
<li>가능한데 채무 이행 안하고 있는 것</li>
<li>채권자 권리 : 이행청구, 계약해제권, 손해배상청구권</li>
</ul>
</li>
<li>이행불능<ul>
<li>고의 또는 과실 때문에 이행이 불능</li>
<li>ex) 주택 소유권 넘겨받기 전에 매도인 잘못으로 불남</li>
<li>채권자 권리 : 계약해제권, 손해배상청구권</li>
</ul>
</li>
<li>불완전이행<ul>
<li>채권자 권리 : 완전한 이행 청구(가능한경우), 계약해제권, 손해배상청구권</li>
<li>이행청구 한 후에도 손해배상청구 가능</li>
</ul>
</li>
</ul>
<h3 id="chapter-14-주택임차보호법">Chapter 14 주택임차보호법</h3>
<hr>
<ol>
<li>임대차와 전세권</li>
</ol>
<ul>
<li>임대차가 가장 중요</li>
<li>전세권 설정등기 해야하는 이유 : 이 집이 이미 전세권이 설정되어 있다는 것을 알려주기 위함</li>
<li>임대인 : 빌려주는 사람, 임차인 : 빌려 쓰는 사람</li>
<li>주택임대차보호법 생기기 전까지<ul>
<li>소유자 입장에서는 전세권 설정 보다 임대차계약 맺는 것이 훨씬유리<ul>
<li>전세권 설정해주면 → 주택의 담보력 저하</li>
</ul>
</li>
</ul>
</li>
</ul>
<ol>
<li>주택임대차보호법의 입법취지</li>
</ol>
<ul>
<li>서민의 주거안정을 도모</li>
<li>주택임차인의 권리와 지위를 보호함으로써 주거생활의 안정을 보장</li>
</ul>
<ol>
<li>주택임차권의 대항력</li>
</ol>
<ul>
<li>주택의 인도를 받고 주민등록을 마친 경우에는 그 다음 날부터 제3자에게 효력 생김<ul>
<li>임차권은 집주인에게만 요구할 수 있는 거였음</li>
</ul>
</li>
<li>대항력의 취득요건<ul>
<li>주택의 인도, 주민등록</li>
<li>취득요건이자 존속요건</li>
</ul>
</li>
<li>대항력의 발생 시기<ul>
<li>가족 중 한명이라도 인도 받고 주민등록 했으면 발생 가능</li>
<li>인도 → 주민등록 : 주민등록 다음 날부터</li>
<li>주민등록 → 인도 : 입주한 날부터</li>
</ul>
</li>
</ul>
<ol>
<li><p>임차주택 양수인의 임대인 지위의 승계</p>
</li>
<li><p>임대차기간</p>
</li>
</ol>
<ul>
<li>임대차기간의 2년보장 및 임차인의 선택권<ul>
<li>2년 미만 계약해도 2년으로 본다</li>
<li>임대차 종료 후에도 보증금 반환받을 때까지는 임대차관계 존속</li>
</ul>
</li>
<li>묵시적 갱신<ul>
<li>임대차 기간 끝나기 6개월 전~2개월 전 까지 계약 변경 통지 해야함<ul>
<li>안하면 다시 동일한 조건으로 임대차 한 것으로 본다</li>
<li>갱신된 경우 임차인은 언제든지 계약해지 통지 가능<ul>
<li>통지 받은 날로부터 3개월 지나면 해지 효력 발생</li>
</ul>
</li>
<li>임대인은 새롭게 시작한 2년 이내에는 나가 달라고 할 수 없다</li>
</ul>
</li>
</ul>
</li>
<li>계약갱신요구권<ul>
<li>임차인은 6개월 전~2개월 전 까지 계약갱신 요구가능<ul>
<li>임대인은 정당한 사유 없이 거절 못함</li>
</ul>
</li>
<li>갱신되는 존속기간은 2년</li>
<li>차임과 보증금은 증감가능<ul>
<li>1/20 내에 금액에서</li>
</ul>
</li>
<li>계약갱신되고도 얼마든지 해지가능</li>
</ul>
</li>
</ul>
<ol>
<li>보증금의 회수</li>
</ol>
<ul>
<li>보증금 순위에 의한 우선변제권<ul>
<li>요건<ul>
<li>주택의 인도(입주), 주민등록(전입신고), 임대차계약서상의 확정일자</li>
</ul>
</li>
<li>임차인이 임대차계약을 체결하기 이전 임차물에 저당권이 설정된 경우에는 저당권자보다는 우선하지 못하다</li>
<li>확정일자인 받아야함</li>
</ul>
</li>
<li>소액보증금의 최우선변제권</li>
</ul>
<ol>
<li>임대인의 차임증액청구권의 제한</li>
</ol>
<ul>
<li>광역시나 특별시는 증액청구 상한 달라질 수 있음</li>
</ul>
<ol>
<li>임차권등기명령제도</li>
</ol>
<ul>
<li>임차권등기 후에는 주택의 점유와 주민등록의 요건을 갖추고 있지 않더라도, 임차인이 종전에 가지고 있던 대항력과 우선변제권이 유지되므로 자유롭게 주거를 이전할 수 있다</li>
</ul>
<ol>
<li>적용범위</li>
</ol>
<ul>
<li>주택임대차보호법<ul>
<li>충분한 요건을 구비하고 주거용으로 사용되고 있는 것</li>
</ul>
</li>
<li>상가건물임대차보호법<ul>
<li>사업자등록 다음날부터 대항력</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[소비자보호와 법]]></title>
            <link>https://velog.io/@tae-log/%EC%86%8C%EB%B9%84%EC%9E%90%EB%B3%B4%ED%98%B8%EC%99%80-%EB%B2%95</link>
            <guid>https://velog.io/@tae-log/%EC%86%8C%EB%B9%84%EC%9E%90%EB%B3%B4%ED%98%B8%EC%99%80-%EB%B2%95</guid>
            <pubDate>Tue, 07 Jan 2025 12:01:49 GMT</pubDate>
            <description><![CDATA[<h3 id="chapter-4-약관ⅰ">Chapter 4 약관Ⅰ</h3>
<hr>
<p>약관의 개념과 그 규제</p>
<ul>
<li>계약<ul>
<li>복수당사자, 일반적으로 사회적 지위 대등</li>
</ul>
</li>
<li>약관에 의하여 계약자유의 원칙이 제한 받음</li>
<li>약관<ul>
<li>보통 대기업이 다수의 상대방과 계약체결하기 위해 미리<ul>
<li>불공정함을 막기 위해 → 약관규제법</li>
</ul>
</li>
<li>‘약관’ 명칭을 쓸 필요x</li>
<li>일방 당사자가 미리</li>
<li>다수의 상대방</li>
<li>내용 포함</li>
<li>형식 필요x</li>
</ul>
</li>
</ul>
<p>약관의 계약에의 편입</p>
<ul>
<li><p>계약설 vs 규범설</p>
<ul>
<li>우리나라 계약설의 입장</li>
<li>명시하고 설명한 경우에만</li>
</ul>
</li>
<li><p>한글로 명확하고 알아보기 쉽게</p>
</li>
<li><p>약관을 계약으로 편입하기 위해서는 아래의무 있어야함</p>
<ul>
<li><p>명시의무, 설명의무, 교부의무</p>
<ul>
<li><p>인지가능성 제공</p>
</li>
<li><p>설명은 중요한 내용에 한정됨</p>
</li>
<li><p>명시의무가 면제되는 업종</p>
<p>  ① 여객운송업</p>
<p>  ② 전기·가스 및 수도사업</p>
<p>  ③ 우편업</p>
<p>  ④ 공중전화 서비스 제공 통신업</p>
</li>
<li><p>설명의무 면제</p>
<ul>
<li>이미 잘 알고 있거나, 충분히 예상할 수 있거나, 되풀이</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>개별약정 우선의 원칙</p>
<ul>
<li>다르게 합의하면 약관보다 우선</li>
</ul>
</li>
</ul>
<p>약관의 해석원칙</p>
<ul>
<li>신의성실의 원칙</li>
<li>객관적·통일적 해석의 원칙</li>
<li>작성자 불이익 해석의 원칙</li>
<li>엄격(축소)해석의 원칙<ul>
<li>얘는 규제법에는 없지만 일반적으로 인정</li>
</ul>
</li>
</ul>
<h3 id="chapter-5-약관-ⅱ">Chapter 5 약관 Ⅱ</h3>
<hr>
<p>약관의 내용통제</p>
<ul>
<li>불공정한 약관은 무효<ul>
<li>신의성실의 원칙을 기준으로</li>
</ul>
</li>
<li>조항들<ul>
<li>부당한 면책조항<ul>
<li>고의 또는 중대한 과실로 인한 책임을 배제는 무효</li>
<li>경미한 과실의 면책은 유효</li>
</ul>
</li>
<li>부당한 손해배상의 예정조항</li>
<li>계약 해제해지에 관한 부당한 조항<ul>
<li>해제<ul>
<li>존재하지 않은 상태로 복귀</li>
<li>ex) 채무불이행은 해지</li>
</ul>
</li>
<li>해지<ul>
<li>그 시점부터 효력 소멸</li>
</ul>
</li>
</ul>
</li>
<li>채무의 이행과 관한 부당한 조항</li>
<li>고객의 권익보호에 대한 부당한 조항</li>
<li>의사표시의 부당한 의제조항</li>
<li>대리인 책임가중에 관한 부당한 조항</li>
<li>소송 제기의 금지 등에 관한 조항</li>
</ul>
</li>
<li>위 조항들 규정 제한 업종<ul>
<li>운송업</li>
<li>금융업, 보험업</li>
<li>무역보험</li>
</ul>
</li>
</ul>
<p>불공정한 약관조항의 효력</p>
<ul>
<li>약관규제법<ul>
<li>일부무효의 특칙, 일반적으로 잔존부분의 유효의 원칙</li>
</ul>
</li>
<li>민법<ul>
<li>전부무효를 원칙으로</li>
</ul>
</li>
</ul>
<p>표준약관제도</p>
<ul>
<li>공정거래위원회 개입</li>
<li>표준약관표지<ul>
<li>고객에게 더 불리하면 무효</li>
</ul>
</li>
<li>사업자가 권고받은 날 부터 4월 이내 조치해야함</li>
</ul>
<p>약관 분쟁의 조정</p>
<ul>
<li>약관분쟁조정협의회<ul>
<li>위원장 1명 포함한 9명</li>
<li>임기 3년</li>
<li>조정조서와 동일한 내용의 합의 (화해계약)</li>
<li>일괄적인 분쟁조정 (집단분쟁조정) 가능</li>
</ul>
</li>
</ul>
<h3 id="chapter-6-방문판매-등ⅰ">Chapter 6 방문판매 등Ⅰ</h3>
<hr>
<p>방문판매법의 제정목적과 적용범위</p>
<ul>
<li>특수판매 종류<ul>
<li>방문판매, 전화권유판매, 다단계판매, 후원방문판매, 계속거래, 사업권유거래</li>
<li>방문판매+전화권유판매 : 방문판매업자 등</li>
</ul>
</li>
<li>소비자<ul>
<li>본래적 의미의 소비자</li>
<li>소비생활 외의 목적으로 사용하거나 이용하는 자</li>
</ul>
</li>
<li>방문판매법 제외<ul>
<li>사업자가 상행위를 목적</li>
<li>금융상품계약</li>
<li>방문판매원을 두지않은</li>
</ul>
</li>
<li>다른법률과 방문판매법이 경합하는 경우<ul>
<li>다른 법률을 적용하는 것이 유리한 경우에는 그 법을 적용</li>
</ul>
</li>
</ul>
<p>방문판매 및 전화권유판매 규제</p>
<ul>
<li><p>공정거래위원회</p>
</li>
<li><p>계약</p>
<ul>
<li>계약 체결 전 → 정보제공의무</li>
<li>계약 체결 후 → 계약서 발급의무</li>
</ul>
</li>
<li><p>미성년자와 계약 : 법정대리인 동의 얻어야함</p>
</li>
<li><p>전화권유판매는 통화내용 3개월 이상 보존</p>
</li>
<li><p>청약철회</p>
<ul>
<li>방문판매 등 : 거의 다 14일 (고려기간, 냉각기간)<ul>
<li>광고와 내용이 다른 경우<ul>
<li>재화 등을 공급 받은 날 부터 3개월 이내</li>
<li>사실을 안 날 또는 알 수 있었던 날부터 30일이내</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>청약철회 배제되는 경우</p>
<p>  ① 소비자의 책임으로 멸실 or 훼손 (포장 제외)</p>
<p>  ② 소비하여 가치 현저히 낮아진</p>
<p>  ③ 시간 지남으로 가치 낮아짐</p>
<p>  ④ 복제할 수 있는 포장 훼손</p>
<p>  ⑤ 동의를 받은 경우</p>
<ul>
<li>②~④ 는 방문판매자등이 표시하는 조치하지 않으면 소비자가 청약철회 가능</li>
</ul>
</li>
<li><p>소비자의 청약철회등은 발송주의</p>
</li>
<li><p>환급</p>
<ul>
<li>방문판매자는 재화 발급받은 날부터 3영업일 이내에 환급해야함</li>
</ul>
</li>
<li><p>소비자 잘못</p>
<ul>
<li>계약해제, 손해배상 청구 가능</li>
<li>손해배상액은 정한 금액에 한도 있음</li>
</ul>
</li>
</ul>
<h3 id="chapter-7-방문판매-등-ⅱ">Chapter 7 방문판매 등 Ⅱ</h3>
<hr>
<p>다단계판매 및 후원방문판매 규제</p>
<ul>
<li>특색<ul>
<li>체결증명서류 등록</li>
<li>후원수당</li>
<li>연간 5만원 초과x</li>
</ul>
</li>
<li>공정거래 위원회나 특별시장등에 등록시 갖추어야할 서류<ul>
<li>5억원 이상임을 증명하는 서류</li>
<li>소비자피해보험계약등 체결 증명서류<ul>
<li>다단계와 후원방문판매는 반드시, 다른 거는 권장</li>
</ul>
</li>
<li>등록, 등록증, 등록부, 수첩</li>
<li>언제든지 탈퇴할 수 있으며</li>
<li>방문판매등과 정보제공의무 계약서발급의무 동일</li>
</ul>
</li>
<li>청약철회<ul>
<li>소비자가 다단계 판매원에 우선적으로, 그다음에 업자에게도 가능</li>
<li>다단계 판매원도 계약 체결한 날부터 3개월 이내에 서면으로 업자에게 가능</li>
</ul>
</li>
<li>환급<ul>
<li>다단계 판매자가 3영업일 이내에 대금 환금</li>
</ul>
</li>
<li>소비자 잘못으로 인한 손해배상 청구도 방문판매등과 같음</li>
<li>후원수당<ul>
<li>판매실적에 관계없이 줘야함</li>
<li>변경할 경우 3개월 이전에</li>
<li>35퍼센트 금액 초과하면 안 됨<ul>
<li>cf) 후원방문판매는 38퍼</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>계속거래 및 사업권유거래 규제</p>
<ul>
<li>계속거래등<ul>
<li>계속거래<ul>
<li>1개월 이상(학습지)</li>
<li>각각 10만원 및 3개월</li>
</ul>
</li>
<li>사업권유거래<ul>
<li>자판기</li>
<li>기간에 관계없이 30만원</li>
</ul>
</li>
</ul>
</li>
<li>계속거래는 청약철회 안 됨! But 언제든지 계약 해지 가능<ul>
<li>소비자 재회 반환, 대금 환급, 위약금 경감</li>
</ul>
</li>
<li>언제든지 소비자 열람<ul>
<li>방문, 전화, 인터넷: 즉시</li>
<li>우편: 3영업일 이내</li>
</ul>
</li>
</ul>
<h3 id="chapter-9-전자상거래-등ⅰ">Chapter 9 전자상거래 등Ⅰ</h3>
<hr>
<p>전자상거래법의 제정목적과 그 적용범위</p>
<ul>
<li>직접대면하지 않음</li>
<li>B2C거래에 한정</li>
<li>통신판매<ul>
<li>전자상거래&lt;통신판매</li>
<li>전화권유판매는 방문판매법이라 전자상거래법 적용 안 됨</li>
</ul>
</li>
<li>다른 법과의 관계<ul>
<li>다른 법을 적용하는 것이 소비자에게 유리할 경우 적용</li>
</ul>
</li>
</ul>
<p>전자상거래 등에 대한 특칙</p>
<ul>
<li><p>전자문서로 송신해야함</p>
<ul>
<li><p>작성자의 진정성 확인</p>
</li>
<li><p>고지의무</p>
</li>
<li><p>소비자에게 특정 전자서명 방법 강요 안 됨,</p>
<p>  소비자가 선택한 전자서명 제한도 안 됨</p>
</li>
</ul>
</li>
<li><p>전자상거래법은 예외로 기록 보존함</p>
<ul>
<li>표시·광고에 관한 기록: 6개월</li>
<li>계약 또는 청약철회 등에 관한 기록: 5년</li>
<li>대금결제 및 재화등의 공급에 관한 기록: 5년</li>
<li>소비자의 불만 또는 분쟁처리에 관한 기록: 3년</li>
</ul>
</li>
<li><p>조작실수 방지 의무</p>
</li>
<li><p>전자적 대금지급 관련자</p>
</li>
<li><p>재화에 관한 소비자 확인 절차</p>
</li>
<li><p>반드시 소비자피해보상보험계약 등을 체결</p>
</li>
<li><p>사이버몰 운영자</p>
<ul>
<li>초기화면에 표시해야하는데, 약관만 연결화면</li>
<li>휴대전화는 순차적으로 보이게</li>
</ul>
</li>
</ul>
<h3 id="chapter-10-전자상거래-등-ⅱ">Chapter 10 전자상거래 등 Ⅱ</h3>
<hr>
<p>통신판매 규제</p>
<ul>
<li><p>비대면성</p>
</li>
<li><p>청약철회</p>
<ul>
<li>전자상거래 : 7일</li>
<li>cf) 방문판매법: 14일</li>
</ul>
</li>
<li><p>공정거래위원회는 통신판매업자 정보 공개</p>
</li>
<li><p>통신판매업자도 계약 정보제공의무, 교부의무, 미성년자 고지의무 있는데, 추가로</p>
<p>  표시광고시 신원에 대한 정보제공의무 있음</p>
</li>
<li><p>공급</p>
<ul>
<li>공급의무<ul>
<li>통신판매업자 : 7일 이내 조치</li>
<li>선지급식 통신판매: 3영업일 이내에 조치</li>
<li>예외 → 별도 약정</li>
</ul>
</li>
<li>공급 불가능 시<ul>
<li>소비자에게 지체없이 알리기</li>
<li>선지급식 통신판매: 3영업일 이내에 환급<ul>
<li>지연되면, 연 15퍼 곱한 이자로 연 배상금 지급</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>광고와 내용이 다른 경우</p>
<ul>
<li>재화 등을 공급 받은 날 부터 3개월 이내</li>
<li>사실을 안 날 또는 알 수 있었던 날부터 30일이내</li>
</ul>
</li>
<li><p>청약 철회는 발송한 날 효력</p>
</li>
<li><p>증명책임은 통신판매업자에게 있음</p>
</li>
<li><p>반환 비용은 원칙적으로 소비자가 부담</p>
</li>
<li><p>휴업기간에도 통신판매업자 업무해야함</p>
</li>
<li><p>손해배상 청구 정한 금액 초과불과</p>
</li>
<li><p>편면적 강행규적(=일반적 강행규정)</p>
<ul>
<li>7일보다 짧은 약정을 하면 효력 없다</li>
</ul>
</li>
</ul>
<p>통신판매중개 규제</p>
<ul>
<li>초기화면</li>
<li>제공 열람</li>
<li>3영업일 이내에 알리고, 10영업일 이내에 처리방안 알리기</li>
<li>통신판매중개자가 자신이 당사자가 아니라는 사실을 고지하지 않은 경우에<ul>
<li>통신판매중개자도 책임 있음 → 연대배상책임</li>
<li>반대로 통신판매중개의뢰자가 상당한 주의를 기울이지 않은 경우에도 연대배상책임</li>
</ul>
</li>
</ul>
<h3 id="chapter-11-금융거래">Chapter 11 금융거래</h3>
<hr>
<p>금융소비자보호법의 제정목적과 적용범위</p>
<ul>
<li>금융소비자보호법 (2020년)<ul>
<li>예금 및 대출</li>
<li>금융투자상품</li>
<li>보험상품</li>
<li>예금 및 대출</li>
<li>신용카드, 시설대여, 연불판매, 할부금융</li>
</ul>
</li>
<li>유형<ul>
<li>예금성, 대출성, 투자성, 보장성</li>
</ul>
</li>
<li>소비자<ul>
<li>전문금융소비자, 일반금융소비자</li>
</ul>
</li>
<li>금융상품판매업<ul>
<li>금융상품직접판매업</li>
<li>금융상품판매대리중개업</li>
</ul>
</li>
<li>금융상품자문업</li>
</ul>
<p>금융소비자의 권리와 책무국가와금융상품판매업자등의 책무</p>
<ul>
<li>국가의 책무, 금융상품판매업자등의 책무</li>
</ul>
<p>금융상품판매업 및 금융상품자문업 규제</p>
<ul>
<li><p>금융위원회에 등록</p>
<ul>
<li>취급할 상품에 범위를 정하여 등록</li>
</ul>
</li>
<li><p>준수사항 (6대 판매원칙)</p>
<p>  ① 적합성원칙</p>
<ul>
<li><p>부적합한거 권유 금지</p>
<p>② 적정석 원칙</p>
</li>
<li><p>예금성은 아님</p>
<p>③ 설명의무</p>
<p>④ 불공정영업행위의금지</p>
</li>
<li><p>중도상환수수료 부과 금지</p>
<p>⑤ 부당권유행위 금지</p>
<p>⑥ 광고 규제</p>
</li>
<li><p>계약서류 제공의무</p>
<ul>
<li>소비자와 다툼있는 경우 금융상품직접판매업자 및 금융자문업자가 증명</li>
</ul>
</li>
</ul>
</li>
<li><p>손해배상책임</p>
</li>
<li><p>소비자는 금융상품직접판매업자와 금융상품판매대리중개업자 모두에게 손해배상 채임 부담</p>
</li>
<li><p>청약철회</p>
<ul>
<li><p>예금성은 아님</p>
<ul>
<li><p>보장성상품</p>
<ul>
<li><p>보험증권을 받을 날부터 15일과</p>
<p>  청약을 한 날부터 30일 중 먼저 도래하는 기간</p>
</li>
<li><p>서면 발송한 때</p>
</li>
</ul>
</li>
<li><p>투자성상품,금융상품자문 : 14일</p>
<ul>
<li>서면 발송한 때</li>
</ul>
</li>
<li><p>대출성상품 : 14일</p>
<ul>
<li>권리 반환한 때</li>
</ul>
</li>
</ul>
</li>
<li><p>청약철회시 금융상품판매업자는 3영업일 이내에 반환</p>
</li>
</ul>
</li>
<li><p>위법계약해지권</p>
<ul>
<li>5년 이내 계약해지 요구</li>
<li>10일 이내 해지수락요구 통보</li>
</ul>
</li>
</ul>
<p>금융분쟁의 조정</p>
<ul>
<li>금융감독원에 금융분쟁 조정위원회<ul>
<li>위원장 1명 포함한 35명 이내</li>
<li>임기 2년</li>
</ul>
</li>
<li>분쟁조정<ul>
<li>합의권고</li>
<li>신청 받을 날부터 30일 이내 이루어지지 않으면 위원회에 회부</li>
<li>조정안을 60일 이내에 작성</li>
<li>당사자가 제시받은 날부터 20일 이내에 수락하지 않으면 수락하지 않은 것으로 본다</li>
<li>수락한 경우 화해</li>
</ul>
</li>
</ul>
<h3 id="chapter-12-할부거래">Chapter 12 할부거래</h3>
<hr>
<p>할부거래법의 제정목적과 적용범위</p>
<ol>
<li>직접할부계약<ul>
<li>2개월 이상 3회 나누어</li>
</ul>
</li>
<li>간접할부계약<ul>
<li>2개월 이상 3회 나누어</li>
</ul>
</li>
<li>선불식 할부계약<ul>
<li>2개월 이상 2회 이상</li>
<li>ex) 상조회사</li>
</ul>
</li>
</ol>
<ul>
<li>할부거래 적용 안 되는 재화<ul>
<li>ex) 부동산</li>
</ul>
</li>
<li>다른 법률과의 관계<ul>
<li>소비자가 유리한 경우 그거 적용</li>
</ul>
</li>
<li>계약 체결 전 정부제공의무<ul>
<li>간접할부계약은 몇 개 표시하지 않을 수 있음</li>
</ul>
</li>
<li>할부계약의 서면주의<ul>
<li>간접할부계약은 몇 개 기재하지 않을 수 있음</li>
<li>글자는 9호 이상</li>
<li>9호에서 13호는 다른 색이나 굵은 글씨<ul>
<li>철회권 및 항변권 행사를 위한 서식</li>
</ul>
</li>
<li>불리하게 해석되어서는 아니 됨</li>
</ul>
</li>
<li>할부계약 청약철회: 7일<ul>
<li>발송주의, 할부거래업자가 증명</li>
</ul>
</li>
<li>청약철회권 배제되는 경우<ul>
<li>소비자 책임으로 멸실되거나 훼손</li>
<li>사용자의 소비로 현저히 낮아지는</li>
<li>시간 지남으로 현저히 낮아지는</li>
<li>복제 포장</li>
<li>10만원 미만 (신용카드는 20만원 미만)</li>
<li>재화공급 목적</li>
<li>but, 적절한 조치취하지 않았을 때 업자가 승낙하면 몇 개는 철회가능<ul>
<li>소비로 낮아지는, 시간, 복제포장</li>
</ul>
</li>
</ul>
</li>
<li>환급<ul>
<li>할부거래업자는 3영업일 이내에 환급</li>
<li>반환 비용은 할부업자가 부담</li>
</ul>
</li>
<li>해제<ul>
<li>14일 이상의 기간을 정하여 이행할 것을 소비자에게 서면으로 최고해야함</li>
<li>원상회복의 의무</li>
</ul>
</li>
<li>손해배상청구액 초과할 수 없다</li>
<li>소비자의 기한 이익 상실<ul>
<li>연속 2회 이상 지급 안하고, 금액이 가격의 10퍼 초과하는 경우</li>
<li>보증이 어려운 경우</li>
</ul>
</li>
<li>기한 되기 전에 한꺼번에 지급가능<ul>
<li>거절할 수 없음</li>
</ul>
</li>
<li>3년간 행사하지 않으면 채권의 소멸</li>
<li>소비자에게 불리한 것은 효력 없다 → 편면적 강행규적</li>
</ul>
<p>선불식 할부거래 규제</p>
<ul>
<li>서류<ul>
<li>자본금 15억원 이상</li>
<li>소비자피해보상보험계약등의 체결 증명 서류</li>
</ul>
</li>
<li>청약 철회 : 14일<ul>
<li>계약서를 받지 않은 경우는 계약일로부터 3개월</li>
</ul>
</li>
<li>다툼은<ul>
<li>선불식 할부거래업자가 증명</li>
</ul>
</li>
<li>환급은 3영업일 이내에 환급</li>
<li>전속관할</li>
</ul>
<h3 id="chapter-13-제조물의-결함">Chapter 13 제조물의 결함</h3>
<hr>
<p>제조물책입법의 의의와 제조물의 개념</p>
<ul>
<li>제조물 책임 2002<ul>
<li>과실책임의 원칙</li>
<li>소비자가 증명하기 어려움 → 무과실책임의 필요성</li>
<li>무과실손해배상책임</li>
</ul>
</li>
<li>제조물<ul>
<li>제조 도는 가공된 동상<ul>
<li>통조림o, 수혈용 혈액o</li>
<li>부동산x</li>
<li>부품o</li>
<li>의료행위x, 용역x</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>결함의 개념</p>
<ul>
<li>결함: 안전경 결여 → 제조물책임<ul>
<li>cf) 하자 → 하자담보책임임</li>
</ul>
</li>
<li>분류<ul>
<li>설계상의 결함<ul>
<li>의도와 다르게, 설계와 다르게</li>
</ul>
</li>
<li>제조상의 결함<ul>
<li>사용방법 다르게, 제조물 의험</li>
</ul>
</li>
<li>표시상의 결함</li>
</ul>
</li>
<li>통상적이어야함</li>
</ul>
<p>제조물책임의 주체</p>
<ul>
<li><p>제조업자</p>
</li>
<li><p>수입업자도 책임짐</p>
</li>
<li><p>표시제조업자</p>
<ul>
<li>OEM, PB</li>
</ul>
</li>
<li><p>공급업자</p>
<ul>
<li>얘는 피해자가 제조업자를 알 수 없는 경우에만 책임</li>
</ul>
</li>
<li><p>책임 성립요건</p>
<p>  ① 제조물일 것</p>
<p>  ② 결함있을 것</p>
<p>  ③ 사람에게 손해 발생</p>
<p>  ④ 결함이 원인이 되어 손해 발생 (인과관계 존재)</p>
<ul>
<li>확대 손해가 있어야함</li>
</ul>
</li>
<li><p>결함 증명</p>
<ul>
<li><p>소비자가 증명해야하는데 어려워서</p>
<p>  개정되어 증명 경감함</p>
</li>
</ul>
</li>
<li><p>결함 판단 기준시점</p>
<ul>
<li>공급된 시점</li>
</ul>
</li>
<li><p>개발도상의 결함</p>
<ul>
<li>기술 발전 안 되어서 몰랐으면 괜찮음</li>
</ul>
</li>
</ul>
<p>제조물책임</p>
<ul>
<li>징벌적 손해배상제도</li>
<li>손해의 3배한도</li>
<li>2인이상이면 연대하여 책임</li>
</ul>
<p>면책사유 및 면책특약의 제한</p>
<ul>
<li>사후관찰의무</li>
<li>손해배상 청구권<ul>
<li>피해자가 안 날 부터 3년간 행사해야함 안하면 소멸</li>
<li>제조업자가 손해를 발생시킨 제조물을 공급한 날부터 10년 이내에 행사</li>
<li>but, 신체에 누적되는 약같은 거는 (공급 아니고) 손해가 발생한 날 부터</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터베이스 basic sql]]></title>
            <link>https://velog.io/@tae-log/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-basic-sql</link>
            <guid>https://velog.io/@tae-log/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-basic-sql</guid>
            <pubDate>Tue, 07 Jan 2025 11:56:44 GMT</pubDate>
            <description><![CDATA[<h3 id="22-basic-sql">2.2 basic sql</h3>
<hr>
<p>기본 문법</p>
<pre><code class="language-sql">SELECT [DISTINCT] target-list
FROM relation-list
WHERE qualification</code></pre>
<ul>
<li>중복 제거 하지 않는 게 디폴트 → DISTINCT를 써서 중복 제거한다</li>
</ul>
<p>Q1. 103번 보트를 예약한 적이 있는 선원의 이름 구하기</p>
<pre><code class="language-sql">SELECT S.sname
FROM Sailors S, Reserves R
WHERE S.sid=R.sid AND R.bid=103</code></pre>
<p>Q4. 적어도 한 개의 배를 예약한 선원의 id</p>
<pre><code class="language-sql">SELECT S.sid
FROM Sailors S, Reserves R
WHERE S.sid=R.sid</code></pre>
<ul>
<li>DISTINCT 넣어야 중복제거 됨</li>
<li><a href="http://S.name">S.sname</a> 해도 되는데 동명이인일 수도 있으니까 sid랑 sname을 같이 뽑는 게 좋을 듯</li>
</ul>
<pre><code class="language-sql">WHERE S.sname LIKE ‘B_%B’</code></pre>
<p>↑ 여기 다시 보기</p>
<p>Q5. 빨간색이나 초록색 배를 예약한 선원의 id</p>
<pre><code class="language-sql">SELECT S.sid
FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid
AND (B.color=‘red’ OR B.color=‘
green’)</code></pre>
<pre><code class="language-sql">SELECT S.sid
FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid
AND B.color=‘red’
UNION
SELECT S.sid
FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid
AND B.color=‘
green’</code></pre>
<p>Q6. 빨간색과 초록색 배를 모두 예약한 선원의 id</p>
<pre><code class="language-sql">SELECT S.sid
FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid
AND B.color=‘red’
INTERSECT
SELECT S.sid
FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid
AND B.color=‘
green’</code></pre>
<p>중첩 쿼리</p>
<p>Q1. 103번 보트를 예약한 사람의 이름</p>
<pre><code class="language-sql">SELECT S.sname
FROM Sailors S
WHERE S.sid IN (SELECT R.sid     #IN은 앞이 뒤의 원소인지 아닌지 체크해주는 역할
                                FROM Reserves R
                                WHERE R.bid=103)</code></pre>
<pre><code class="language-sql">SELECT S.sname
FROM Sailors S
WHERE EXISTS (SELECT *
                            FROM Reserves R
                            WHERE R.bid=103 AND S.sid=R.sid)</code></pre>
<ul>
<li><p>103번 예약 안 한 사람 할려면 NOT IN 하면 됨</p>
<ul>
<li><p>빨간색 보트를예약하지 않은 선원의 이름</p>
<pre><code class="language-sql">  SELECT S.sname
  FROM Sailors S
  WHERE S.sid (NOT) IN (SELECT R.sid
                                              FROM Reserves R
                                              WHERE R.bid IN ( SELECT B.bid
                                                                               FROM Boats B
                                                                             WHERE B.color =‘red’)</code></pre>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>Horatio 라는 이름의 선원들 중 적어도 한 명보다 등급이 높은 선원 찾기</p>
<pre><code class="language-sql">  SELECT *
  FROM Sailors S
  WHERE S.rating &gt; ANY (SELECT S2.rating
                                              FROM Sailors S2
                                              WHERE S2.sname=‘Horatio’)</code></pre>
</li>
</ul>
<p>Q6. 빨간색과 초록색 배를 모두 예약한 선원의 id</p>
<pre><code class="language-sql">SELECT S.sid
FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘red’
            AND S.sid IN (SELECT S2.sid
                                        FROM Sailors S2, Boats B2, Reserves R2
                                        WHERE S2.sid=R2.sid AND R2.bid=B2.bid
                                                    AND B2.color=‘green’)</code></pre>
<p>Q9. 모든 배를 예약한 선원의 이름</p>
<pre><code class="language-sql">SELECT S.sname
FROM Sailors S
WHERE NOT EXISTS
        ((SELECT B.bid
            FROM Boats B)
         EXCEPT
            (SELECT R.bid
             FROM Reserves R
             WHERE R.sid=S.sid))</code></pre>
<pre><code class="language-sql">SELECT S.sname
FROM Sailors S
WHERE NOT EXISTS (SELECT B.bid
                                    FROM Boats B
                                    WHERE NOT EXISTS (SELECT R.bid
                                                                        FROM Reserves R
                                                                        WHERE R.bid=B.bid
                                                                                            AND R.sid=S.sid))</code></pre>
<p>집계함수</p>
<ul>
<li>count()</li>
<li>sum()</li>
<li>avg()</li>
<li>max()</li>
<li>min()</li>
</ul>
<p>선원들의 숫자</p>
<pre><code class="language-sql">SELECT COUNT (*)
FROM Sailors S</code></pre>
<p>등급이 10인 선원의 평균 나이</p>
<pre><code class="language-sql">SELECT AVG ( DISTINCT S.age)
FROM Sailors S
WHERE S.rating=10</code></pre>
<p>Group By 와 HAVING</p>
<pre><code class="language-sql">SELECT   [DISTINCT] target-list
FROM     relation-list
WHERE    qualification
GROUP BY grouping-list
HAVING   group-qualification</code></pre>
<ul>
<li><p>나이가 18살 이상인 선원 중에서, rating 별로 그룹화하고,  각 그룹에서 선원의 최소 나이와 rating을 출력 (단, 그룹 내 데이터가 2개 이상인 경우만)</p>
<pre><code class="language-sql">  SELECT S.rating, MIN (S.age)
  FROM Sailors S
  WHERE S.age &gt;= 18
  GROUP BY S.rating
  HAVING COUNT (*) &gt; 1  # 그룹화에 대한 조건</code></pre>
</li>
</ul>
<p>Null Values</p>
<ul>
<li>rating &gt; 8<ul>
<li>이거의 진리값을 모르니까 True도 False도 아닌 Unknown<ul>
<li>(셀렉션 조건은 True만 통과시킴)</li>
</ul>
</li>
</ul>
</li>
<li>T OR U = T; F OR U = U; F AND xx = F; U AND (T or U) = U</li>
<li>웬만한 거 null값 무시함<ul>
<li>AVG/SUM/MIN/MAX</li>
<li>Count(attr)</li>
</ul>
</li>
<li>null 값 무시 안 하는 거<ul>
<li>COUNT(*)</li>
</ul>
</li>
</ul>
<p>OUTER JOIN</p>
<ul>
<li><p>모든 데이터를 포함한다</p>
</li>
<li><p>매칭 되는 게 없는 건 null로</p>
<ul>
<li>cf) inner join은 매칭 되는 게 없으면 그냥 제외시켰음</li>
</ul>
</li>
<li><p>in == exists</p>
</li>
<li><p>not in != not exists</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터베이스 relational algebra]]></title>
            <link>https://velog.io/@tae-log/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-relational-algebra</link>
            <guid>https://velog.io/@tae-log/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-relational-algebra</guid>
            <pubDate>Tue, 07 Jan 2025 11:55:55 GMT</pubDate>
            <description><![CDATA[<h3 id="21-relational-algebra">2.1 relational algebra</h3>
<hr>
<p>관계대수</p>
<ul>
<li>operational</li>
<li>procedure</li>
</ul>
<p>대수</p>
<ul>
<li>피연산자</li>
<li>연산자</li>
<li>Axioms</li>
</ul>
<p>positional</p>
<ul>
<li>얘는 지양한다</li>
</ul>
<p>names-field notation</p>
<ul>
<li>name이나 필드의 값을 갖고서 표현함</li>
</ul>
<p>selection</p>
<ul>
<li>σ</li>
<li>조건 만족하는 거 골라냄</li>
</ul>
<p>projection</p>
<ul>
<li><p>π</p>
</li>
<li><p>원하는 열 보여줌</p>
</li>
<li><p>중복 제거함</p>
<ul>
<li><p>sql에서는 기본적으로 제거하지 않지만</p>
<p>  select distinct하면 중복 제거됨</p>
</li>
</ul>
</li>
</ul>
<p>cross-product</p>
<ul>
<li>X</li>
</ul>
<p>set-difference</p>
<ul>
<li>-</li>
</ul>
<p>union</p>
<ul>
<li>U</li>
</ul>
<p>join</p>
<ul>
<li><strong>⨝</strong></li>
<li>condition join (세타조인)</li>
<li>equi join<ul>
<li>공통 속성 중복</li>
</ul>
</li>
<li>natural join<ul>
<li>공통 속성 중복 x</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터베이스 Intro, relational model]]></title>
            <link>https://velog.io/@tae-log/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-Intro-relational-model</link>
            <guid>https://velog.io/@tae-log/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-Intro-relational-model</guid>
            <pubDate>Tue, 07 Jan 2025 11:54:38 GMT</pubDate>
            <description><![CDATA[<h3 id="11--intro">1.1  Intro</h3>
<hr>
<p>DBMS</p>
<ul>
<li>Database management system</li>
</ul>
<p>Relational Model</p>
<ul>
<li><p>maximal independence</p>
</li>
<li><p>Entities : 개체</p>
</li>
<li><p>Relationships : 관계</p>
</li>
</ul>
<p>DBMS를 쓰는 이유</p>
<ul>
<li>Data independence</li>
<li>Efficient data access</li>
<li>무결성 보안성 생산성 등등</li>
</ul>
<p>스키마</p>
<ul>
<li>데이터의 구조를 표현한 것</li>
<li>각각의 릴레이션은 스키마를 가진다</li>
</ul>
<p>무결성</p>
<p>3개의 스키마로 나눠서 관리하는 이유</p>
<ul>
<li>데이터 독립성을 달성하기 위해서</li>
</ul>
<p>rDBMS</p>
<ul>
<li>Logical 데이터 independence가 제공됨</li>
<li>physical 데이터 independence를 제공한다</li>
</ul>
<p>Transactions</p>
<ul>
<li>동시성 제어</li>
<li>recovery</li>
</ul>
<p>ACID</p>
<ul>
<li>Atomicity<ul>
<li>all or nothing</li>
</ul>
</li>
<li>Consistency</li>
<li>Isolation<ul>
<li>혼자 쓰는 것처럼 느껴지는</li>
</ul>
</li>
<li>Durability</li>
</ul>
<p>repeatable read : 읽을 때마다 값이 바뀌는</p>
<p>Oracle에서는 옛날 꺼랑 오늘 꺼도 보여줌</p>
<p>병행제어(Concurrency Control)로 문제 해결</p>
<h3 id="12-relational-model">1.2 relational model</h3>
<hr>
<p>relational Data Model</p>
<ul>
<li>Structure</li>
<li>Operations<ul>
<li>쿼리, 삭제, 삽입 등</li>
</ul>
</li>
<li>Constraints</li>
</ul>
<p>Data independence</p>
<p>중복 허용 안 됨</p>
<p>릴레이션</p>
<p>: a set of rows or tuples</p>
<ul>
<li>tuples ; row ; records ; cardinality</li>
<li>attribute ; columns ; fields; degree</li>
<li>행과 열의 순서는 중요하지 않다</li>
<li>primary key는 유니크하다</li>
</ul>
<p>비어있는 건 null값</p>
<p>DDL</p>
<ul>
<li>data definition Language</li>
<li>students relation</li>
<li>enrolled table</li>
</ul>
<p>type이 맞지 않으면 에러냄</p>
<p>m:n의 관계성 → 별도 테이블</p>
<p>m:1, 1:n, 1:1 → 별도 테이블x</p>
<p>DML</p>
<ul>
<li>Data manipulation Language</li>
<li>INSERT INTO</li>
<li>SET_ORIENTED SEMANTICS (집합 시맨틱)</li>
</ul>
<p>무결성 제약조건 (ICs)</p>
<ul>
<li>데이타 엔트리 에러</li>
<li>만족하는지 DBMS가 체크</li>
<li>Constraint의 두가지 예시<ul>
<li>Primary key<ul>
<li>entity의 무결성을 보장</li>
<li>primary key에는 null값 안 됨</li>
<li>primary key가 아니면 중복 허용 가능 (근데 또 유니크 키면 달라야함)</li>
<li>primary key에는 자동적으로 인덱스를 만들어서 다른 ex) 9999에 가있는지 빨리 체크할 수 있도록 한다</li>
</ul>
</li>
<li>foreign key<ul>
<li>참조 무결성</li>
<li>논리적인 포인터</li>
<li>dangling references 발생하지 않음</li>
<li>null 값 됨</li>
<li>자기를 참조하는 특수 형태의 외부키도 있음</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>key가 되려면</p>
<ol>
<li>키로 지정된 속성 값이 같으면 두 행은 동일한 행이어야 한다</li>
<li>키의 부분 집합으로는 고유성을 유지할 수 없다 (최소성을 가진다)</li>
</ol>
<p>Candidate key (후보키)</p>
<ul>
<li>primary가 될 수 있는 거 후보키</li>
</ul>
<p>superkey (슈퍼키)</p>
<ul>
<li>: {sid, name}<ul>
<li>⇒ name 빼도 괜찮으니까 슈퍼키</li>
</ul>
</li>
</ul>
<p>삽입하거나 지울 때</p>
<ol>
<li>CASCADE<ul>
<li>지운다</li>
<li>ex) 자퇴</li>
</ul>
</li>
<li>NO ACTION<ul>
<li>지우면 안 됨</li>
</ul>
</li>
<li>SET NULL<ul>
<li>ex) 부서 소속 없는 직원들</li>
</ul>
</li>
<li>SET DEFAULT<ul>
<li>디폴트 값으로 바꾼다</li>
</ul>
</li>
</ol>
<p>업데이트 되는 새로운 값이 parent table에 primary 값으로 존재하면 문제없음</p>
<p>존재하지 않으면 에러</p>
<p>트랜잭션에서 무결성 제약조건</p>
<ul>
<li>commit할 때까지 미뤄라<ul>
<li>Base type의 값이 바뀌면 view도 바뀜 (조건 아니면 안 바뀜)</li>
</ul>
</li>
</ul>
<p>View</p>
<ul>
<li>뷰는 definition만 저장된다<ul>
<li>실제로는 저장되는 게 x</li>
</ul>
</li>
<li>가상 릴레이션이다</li>
<li>장점<ol>
<li>간단하게 보고싶은 것만 볼 수 있음</li>
<li>data independence</li>
<li>security</li>
</ol>
</li>
<li>업데이트에서는 좀 제한적임</li>
<li>Materialized 뷰<ul>
<li>결과를 저장</li>
<li>속도를 빠르게 하기 위한</li>
</ul>
</li>
</ul>
<p>릴레이션</p>
<ul>
<li>지울 때<ul>
<li>DROP TABLE</li>
</ul>
</li>
<li>바꿀 때<ul>
<li>ALTER TABLE</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[exercise1 정리]]></title>
            <link>https://velog.io/@tae-log/%ED%8C%8C%EC%9D%B4%EC%8D%AC-Pandas-exercise1-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@tae-log/%ED%8C%8C%EC%9D%B4%EC%8D%AC-Pandas-exercise1-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Tue, 07 Jan 2025 11:41:55 GMT</pubDate>
            <description><![CDATA[<h2 id="the-series">The Series</h2>
<hr>
<h3 id="creating-a-series">Creating a Series</h3>
<ul>
<li><p>pd.Series([])</p>
<ul>
<li>1차원 데이터 구조</li>
</ul>
</li>
<li><p>index = []</p>
<ul>
<li>프레임 왼쪽에 index가 생김</li>
</ul>
</li>
<li><p>.index</p>
<ul>
<li>인덱스를 반환</li>
<li>정해둔 인덱스가 없으면 자동으로 0부터<ul>
<li>RangeIndex</li>
</ul>
</li>
</ul>
</li>
<li><p>.values</p>
<ul>
<li>값을 numpy 배열 형태로 출력</li>
</ul>
</li>
<li><p>.head()</p>
<ul>
<li>맨 처음 5개만<ul>
<li>괄호 안에 숫자 넣으면 그만큼만</li>
</ul>
</li>
</ul>
</li>
<li><p>.tail()</p>
<ul>
<li>뒷 부분 5개만</li>
</ul>
</li>
<li><p>.sample()</p>
<ul>
<li>랜덤하게 골라서 5개</li>
</ul>
</li>
<li><p>z12가 아래와 같을 때,</p>
<pre><code class="language-python">  z12 = pd.Series([1.1, 2.2, 3.3, 4.4, 5.5], [&#39;e&#39;, &#39;d&#39;, &#39;c&#39;, &#39;b&#39;, &#39;a&#39;]);</code></pre>
<ul>
<li>z12[&#39;c&#39;]<ul>
<li>c에 해당하는 거 출력</li>
</ul>
</li>
<li>z12[z12 &gt; 3]<ul>
<li>값이 3보다 큰 데이터만 출력</li>
</ul>
</li>
<li>np.sin(z12)<ul>
<li>각 값에 sin함수 적용 된 거 출력</li>
</ul>
</li>
</ul>
</li>
<li><p>새로운 인덱스에 맞춰 재배치</p>
<pre><code class="language-python">  z14 = pd.Series(zdata1, index=season14); # 이 순서대로 새로 정렬</code></pre>
</li>
<li><p>결측값 확인</p>
<ul>
<li>pd.isnull(z15)</li>
<li>z15.isnull()</li>
<li>notull은 반대임</li>
</ul>
</li>
</ul>
<h3 id="series-attributes">Series Attributes</h3>
<ul>
<li><p>csv</p>
<ul>
<li><p>쉼표로 구분 된 값</p>
<pre><code class="language-python">pd.read_csv(&#39;lasvegas.csv&#39;) </code></pre>
</li>
</ul>
</li>
<li><p>.DataFrame</p>
<ul>
<li>데이터프레임 생성</li>
</ul>
</li>
<li><p>.set_index()</p>
<ul>
<li>인덱스로 설정</li>
</ul>
</li>
<li><p>loc</p>
<ul>
<li><p>인덱스 이름 또는 열 이름으로 데이터 선택</p>
</li>
<li><p>ex)</p>
<pre><code class="language-python">  scientists.loc[&#39;William Gosset&#39;, &#39;Occupation&#39;]  # 특정 행과 열 선택

  # df.loc[&#39;index_label&#39;, &#39;column_label&#39;]</code></pre>
</li>
</ul>
</li>
<li><p>iloc</p>
<ul>
<li><p>정수 인덱스 위치로 데이터 선택</p>
</li>
<li><p>ex)</p>
<pre><code class="language-python">  scientists.iloc[2, 0]

  # df.iloc[row_index, column_index]</code></pre>
</li>
</ul>
</li>
</ul>
<h3 id="the-series-is-ndarray-like">The series is ndarray-like</h3>
<ul>
<li><p>std()</p>
<ul>
<li>표준표본편차</li>
</ul>
</li>
<li><p>describe()</p>
<ul>
<li>통계 요약을 제공</li>
</ul>
</li>
<li><p>Boolean 인덱싱</p>
<ul>
<li><p>ex)</p>
<pre><code class="language-python">  manual_bool_values = [True, True, False, False, True, True, False, False]</code></pre>
<ul>
<li>True에 해당하는 위치만 반환</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="operations-are-vectorized">Operations Are Vectorized</h3>
<ul>
<li>.sort_index(ascending=False)<ul>
<li>내림차순</li>
<li>기본 값은 오름차순 (True)</li>
</ul>
</li>
</ul>
<h2 id="dataframe">DataFrame</h2>
<hr>
<h3 id="creating-a-dataframe">Creating a DataFrame</h3>
<ul>
<li><p>이런 식으로 만든다</p>
<pre><code class="language-python">  scientists = pd.DataFrame(
      data={&#39;Occupation&#39;: [&#39;Chemist&#39;, &#39;Statistician&#39;], 
            &#39;Born&#39;: [&#39;1920-07-25&#39;, &#39;1876-06-13&#39;],
            &#39;Died&#39;: [&#39;1958-04-16&#39;, &#39;1937-10-16&#39;],
            &#39;Age&#39;: [37, 61]},
      index=[&#39;Rosaline Franklin&#39;, &#39;William Gosset&#39;], 
      columns=[&#39;Occupation&#39;, &#39;Born&#39;, &#39;Died&#39;, &#39;Age&#39;])</code></pre>
</li>
<li><p>랜덤 숫자로 채워진 데이터프레임 생성</p>
<pre><code class="language-python">  df21 = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list(&#39;ABCD&#39;))</code></pre>
</li>
<li><p>Timestamp</p>
<ul>
<li>날짜 연산과 인덱싱</li>
</ul>
</li>
<li><p>Categorical</p>
<ul>
<li>범주형 데이터 타입<ul>
<li>숫자로 측정할 수 없는 것</li>
</ul>
</li>
</ul>
</li>
<li><p>데이터프레임 전치</p>
<pre><code class="language-python">  print(&#39;\n PD27 \n&#39;, df22.T, &#39;\n&#39;)</code></pre>
</li>
<li><p>sort_index(axis=1)</p>
<ul>
<li>열방향으로 정렬</li>
</ul>
</li>
<li><p>sort_index(axis=0)</p>
<ul>
<li>행방향으로 정렬</li>
</ul>
</li>
<li><p>sort_values(by=&#39;E&#39;)</p>
<ul>
<li>열 ‘E’값을 기준으로 정렬</li>
</ul>
</li>
</ul>
<h3 id="boolean-subsetting-dataframe">Boolean Subsetting DataFrame</h3>
<ul>
<li>at<ul>
<li>loc과 유사하지만, 단일 값을 빠르게 접근할 때 사용<ul>
<li>loc은 여러 행과 열을 동시에 선택할 때 유용</li>
</ul>
</li>
</ul>
</li>
<li>.copy()<ul>
<li>깊은 복사<ul>
<li>사본이어서 원본 영향 안 받음</li>
</ul>
</li>
</ul>
</li>
<li>.isin<ul>
<li>특정 값이 열에 포함되어있는지 확인하고 필터링</li>
</ul>
</li>
</ul>
<h2 id="make-changes-to-series-and-dataframe">Make Changes to Series and DataFrame</h2>
<hr>
<h3 id="add-additional-columns">Add Additional Columns</h3>
<ul>
<li><p>.to_datetime()</p>
<ul>
<li>문자열 또는 다른 형식의 날짜 데이터를 pandas의 <code>datetime</code> 객체로 변환하는 함수</li>
</ul>
</li>
<li><p>코드</p>
<pre><code class="language-python">  scientists.sample(frac=1).reset_index(drop=True)</code></pre>
<ul>
<li>shape<ul>
<li>데이터프레임의 행과 열의 수를 반환</li>
</ul>
</li>
<li>sample()<ul>
<li>무작위로 샘플을 추출</li>
</ul>
</li>
<li>frac=1<ul>
<li>전체 데이터프레임을 무작위로 섞는다</li>
</ul>
</li>
<li>.reset_index()<ul>
<li>데이터프레임의 인덱스 초기화</li>
</ul>
</li>
<li>drop=True<ul>
<li>기존 인덱스를 열로 추가하지 않고, 완전히 제거</li>
<li>연속적인 정수형 인덱스</li>
</ul>
</li>
<li>drop()<ul>
<li>특정 행 또는 열을 삭제</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="data-loading-and-subsetting">Data Loading and Subsetting</h2>
<hr>
<h3 id="subsetting-columns">Subsetting Columns</h3>
<ul>
<li>.info<ul>
<li>간단한 요약 정보</li>
</ul>
</li>
<li>df.columns[[0, -1]]<ul>
<li>첫 번째 열과 마지막 열의 이름을 리스트로 반환</li>
</ul>
</li>
</ul>
<h3 id="subsetting-rows">Subsetting rows</h3>
<ul>
<li>df.iloc[:2, 1:4]<ul>
<li>행 : 0번 행부터 1번 행까지</li>
<li>열 : 1번 열부터 3번 열까지</li>
</ul>
</li>
<li>df.iat[’행’, ’열’]<ul>
<li>정수기반으로 인덱싱</li>
<li>단일 셀에만 사용 가능</li>
<li>단일 스칼라 값으로 반환 원할 때</li>
</ul>
</li>
</ul>
<h3 id="groupby">Groupby</h3>
<ul>
<li>astype<ul>
<li>데이터 타입 변경</li>
</ul>
</li>
</ul>
<h3 id="grouped-means">Grouped means</h3>
<ul>
<li>sep=&#39;\t’<ul>
<li>데이터 파일이 ‘\t’로 구분된 경우 사용</li>
<li>‘\t’를 기준으로 구분</li>
</ul>
</li>
<li>.nunique()<ul>
<li>고유 값의 개수를 계산</li>
<li>중복 값을 제거함</li>
<li>데이터에 몇 개의 고유 값이 있는지 알고 싶을 때</li>
</ul>
</li>
<li>.value_counts()<ul>
<li>고유 값의 빈도수를 계산</li>
<li>특정 값의 빈도 확인</li>
<li>각 값이 몇 번 나왔는지 알고 싶을 때</li>
<li>빈도수에 따라 내림차순 정렬됨</li>
</ul>
</li>
</ul>
<h3 id="missing-data">Missing data</h3>
<ul>
<li><p>.reindex()</p>
<ul>
<li>기존 데이터에서 재구성된 인덱스와 칼럼에 맞춰 값을 정렬</li>
<li>없는 값은 NaN으로</li>
</ul>
</li>
<li><p>기존 칼럼 + 추가 칼럼</p>
<pre><code class="language-python">  columns=list(df31.columns) + [&#39;E&#39;]</code></pre>
</li>
<li><p>.dropna(how=’any’)</p>
<ul>
<li>결측값이 있는 행을 삭제</li>
<li>how=’any’<ul>
<li>해당 행에 하나라도 NaN이 있으면 삭제</li>
</ul>
</li>
</ul>
</li>
<li><p>.fillna()</p>
<ul>
<li>결측값을 특정 값으로 대체</li>
</ul>
</li>
</ul>
<h3 id="mixing-it-up">Mixing it up</h3>
<ul>
<li>.mod()<ul>
<li>나머지</li>
</ul>
</li>
</ul>
<h3 id="statistics">Statistics</h3>
<ul>
<li><p>.shift(2)</p>
<ul>
<li>데이터를 아래로 2칸 이동</li>
</ul>
</li>
<li><p>코드</p>
<pre><code class="language-python">  df51.sub(s51, axis=&#39;index&#39;)</code></pre>
<ul>
<li>DataFrame의 요소별로 다른 데이터(Series 또는 DataFrame)를 뺌</li>
<li><code>axis=&#39;index&#39;</code>는 행 기준으로 연산을 수행하도록 지정<ul>
<li>즉, <code>df51</code>의 각 행에서 동일한 인덱스를 가진 <code>s51</code>의 값을 뺌</li>
</ul>
</li>
<li>요소별 연산에서 한쪽에 값이 <code>NaN</code>이면 결과도 <code>NaN</code>이 됨</li>
</ul>
</li>
<li><p>np.cumsum</p>
<ul>
<li>누적 합을 계산</li>
</ul>
</li>
<li><p>apply()</p>
<ul>
<li>DataFrame의 각 열 또는 행에 함수를 적용할 때 사용</li>
<li>기본적으로 열 단위로 적용</li>
</ul>
</li>
<li><p>lambda</p>
<ul>
<li>이름 가지지 않는 익명함수</li>
</ul>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>