<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>wlsgk7779 님의 블로그</title>
    <link>https://wlsgk7779.tistory.com/</link>
    <description>wlsgk7779 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Tue, 7 Jul 2026 08:32:18 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>wlsgk7779</managingEditor>
    <item>
      <title>카테캠 1단계 1주 2회차 강의</title>
      <link>https://wlsgk7779.tistory.com/10</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://colab.research.google.com/drive/124xuFcS6BsCwfLiipltllz7llec_c9WW?usp=sharing&quot;&gt;https://colab.research.google.com/drive/124xuFcS6BsCwfLiipltllz7llec_c9WW?usp=sharing&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;openai의 tool call 동작 코드&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프롬프트와 관련하여 zero shot, few shot, instruction, CoT 등이 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Zero-shot&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시 없이 바로 질문하는 것&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1782991668358&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;이 문장이 긍정인지 부정인지 말해줘.
오늘 날씨 정말 좋다&quot;

&amp;rarr; AI: &quot;긍정&quot;​&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Few-shot&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시를 몇 개 보여주고 패턴을 따라하게 하는 것&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1782991692936&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;긍정이면  , 부정이면  

오늘 날씨 좋다 &amp;rarr;  
기분이 별로야 &amp;rarr;  

오늘 점심 맛있었어 &amp;rarr; ?&quot;

&amp;rarr; AI: &quot; &quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. Instruction&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AI한테 역할과 규칙을 명확하게 지시하는 것&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1782991717841&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;너는 일정 관리 AI야.
날짜는 반드시 YYYY-MM-DD 형식으로 써.
삭제 전에 반드시 목록을 먼저 조회해.&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. CoT (Chain of Thought)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단계별로 생각하게 유도하는 것&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1782991738808&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# CoT 없이
&quot;15 * 27은?&quot; &amp;rarr; &quot;405&quot;

# CoT 있이
&quot;15 * 27을 단계별로 계산해줘&quot;
&amp;rarr; &quot;15 * 20 = 300
   15 * 7 = 105
   300 + 105 = 405&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;비교 정리&lt;/h3&gt;
&lt;div&gt;기법핵심언제 쓰냐
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Zero-shot&lt;/td&gt;
&lt;td&gt;예시 없이 질문&lt;/td&gt;
&lt;td&gt;간단한 질문&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Few-shot&lt;/td&gt;
&lt;td&gt;예시 보여주기&lt;/td&gt;
&lt;td&gt;특정 형식/패턴 원할 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instruction&lt;/td&gt;
&lt;td&gt;역할/규칙 지시&lt;/td&gt;
&lt;td&gt;AI 행동 제어할 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CoT&lt;/td&gt;
&lt;td&gt;단계별 사고 유도&lt;/td&gt;
&lt;td&gt;복잡한 문제 풀 때&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;옛날 vs 요즘 프롬프트 방식&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;옛날 (모델 성능 낮을 때)&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1782992140014&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;너는 일정 관리 AI야.
일정 생성할 때는 이렇게 해.
일정 조회할 때는 이렇게 해.
날짜 형식은 이렇게 해.
절대 이건 하면 안 돼.
반드시 이 순서로 해.
...&quot;
&amp;rarr; 처음부터 모든 규칙을 빽빽하게 써야 했음&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;요즘 (모델 성능 좋을 때)&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1782992178162&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. 일단 기본 프롬프트만 주고 실행
         &amp;darr;
2. 문제 발생한 부분 발견
         &amp;darr;
3. 그 부분만 보완&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 사용하는게 few shot과 CoT 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;few shot : 예시를 보여주는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CoT : 동작 순서를 알려주는 느낌&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bafQ8E/dJMcai4TRmk/g16jzEM9Mt5oiiaeXqQJ90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bafQ8E/dJMcai4TRmk/g16jzEM9Mt5oiiaeXqQJ90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bafQ8E/dJMcai4TRmk/g16jzEM9Mt5oiiaeXqQJ90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbafQ8E%2FdJMcai4TRmk%2Fg16jzEM9Mt5oiiaeXqQJ90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;485&quot; height=&quot;314&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 식으로 언제 이 툴을 써야하는지 description에 써줄 수 있다. 예시 같은 것을.&lt;/p&gt;</description>
      <author>wlsgk7779</author>
      <guid isPermaLink="true">https://wlsgk7779.tistory.com/10</guid>
      <comments>https://wlsgk7779.tistory.com/10#entry10comment</comments>
      <pubDate>Thu, 2 Jul 2026 21:30:59 +0900</pubDate>
    </item>
    <item>
      <title>카테캠 2주차 과제 진행</title>
      <link>https://wlsgk7779.tistory.com/9</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1주차에서 아래 내용과 시스템 프롬프트를 좀 수정함&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;tool_name&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; : &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;personal_list_schedules&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;__name__&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>wlsgk7779</author>
      <guid isPermaLink="true">https://wlsgk7779.tistory.com/9</guid>
      <comments>https://wlsgk7779.tistory.com/9#entry9comment</comments>
      <pubDate>Thu, 2 Jul 2026 09:48:26 +0900</pubDate>
    </item>
    <item>
      <title>카테캠 1주차 과제 진행</title>
      <link>https://wlsgk7779.tistory.com/8</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;0. 먼저 WSL (윈도우에서 리눅스 환경 쓰는거)를 우분투로 연결할건지 선택하기. (참고)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜냐하면&lt;b&gt; ./run.sh --install&lt;/b&gt; 이런 명령어를 과제 준비할 때 써야하는데, 리눅스 터미널에서 쓸 수 있는거라서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우에서 쓰려면 &lt;b&gt;run.sh&lt;/b&gt; 파일 안에 있는 명령어들을 따로 하나하나 입력줘야 해서 불편할 수 있고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매번 저런 명령어 만나면 AI한테 윈도우용 명령어로 바꿔달라고 해서 입력해야함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 WSL 연결을 한다면, 우분투22.04 클릭해서 터미널 나오면 cd .. (이전 폴더로 가기) 랑 ls (하위폴더보기) 등으로 위로 나간다음에 아래와 같이 경로가 &quot;/&quot; 까지 간 후 ls 하면 아래와 같은 폴더들이 나옴.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 cd mnt 로 이동하면 그 안에 c 라는게 있는데 그게 윈도우의 c드라이브라서 거기서 쭉쭉 녕이 카카오 폴더? 있는 곳까지 이동해서 code . 하면 WSL 연결돼서 열린다. =&amp;gt; 그러면 VScode 터미널이 리눅스 터미널로 열린다! =&amp;gt; 그러면 &lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;./run.sh --install&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 명령어도 그냥 칠 수 있음!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRxA88/dJMcacczAvA/CMk17r8gNEvHGJwhZu1mnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRxA88/dJMcacczAvA/CMk17r8gNEvHGJwhZu1mnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRxA88/dJMcacczAvA/CMk17r8gNEvHGJwhZu1mnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRxA88%2FdJMcacczAvA%2FCMk17r8gNEvHGJwhZu1mnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;125&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진하는 아래와 같은 경로가 우분투에서의 윈도우 작업 폴더야 /mnt/c/Users/ASUS/kakao&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;77&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l2NwF/dJMcaiX5H6V/kbCPoL8Z54kItTXN8hHFT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l2NwF/dJMcaiX5H6V/kbCPoL8Z54kItTXN8hHFT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l2NwF/dJMcaiX5H6V/kbCPoL8Z54kItTXN8hHFT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl2NwF%2FdJMcaiX5H6V%2FkbCPoL8Z54kItTXN8hHFT0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;668&quot; height=&quot;77&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;77&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;저 /mnt 아래 c 부터는 윈도우 경로랑 같다고 보면 댐!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 노션에서 &quot;클론코딩 프로젝트 PR/일정 안내&quot; 확인하고 1-1 부터 1-4 까지 진행하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1-1, 1-2 는 진행했겠지?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1-3 : chungnam-clone 레포들어가서 링크 복사 후 git clone 하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1-4 : 이름/final 브랜치까지 만들고 push를 통해 깃허브에서 동일한 이름의 브랜치 만들기까지&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1317&quot; data-origin-height=&quot;690&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSqOfH/dJMcaijzKnr/kwAhc7IhcmIQzbFtrZVJe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSqOfH/dJMcaijzKnr/kwAhc7IhcmIQzbFtrZVJe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSqOfH/dJMcaijzKnr/kwAhc7IhcmIQzbFtrZVJe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSqOfH%2FdJMcaijzKnr%2FkwAhc7IhcmIQzbFtrZVJe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1317&quot; height=&quot;690&quot; data-origin-width=&quot;1317&quot; data-origin-height=&quot;690&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;*만약&lt;/span&gt; &lt;span style=&quot;color: #ee2323;&quot;&gt;WSL 연결해서 한다고 하면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-2 push 인증 부분을 리눅스 환경에서 다시 진행해야한다! (윈도우로 할거면 안 해도 됨)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우분투 22.04 열어서 아래 2가지 명령어 입력해서 깃허브에 인증하면 됨&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #818898;&quot;&gt;# gh 설치&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #70b8ff;&quot;&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style=&quot;color: #70b8ff;&quot;&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style=&quot;color: #70b8ff;&quot;&gt;install&lt;/span&gt;&lt;span&gt; gh &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #818898;&quot;&gt;# GitHub 로그인&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;gh auth login&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMdorV/dJMcajitfVx/Uf9mD97MkIYdblRQQk2za1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMdorV/dJMcajitfVx/Uf9mD97MkIYdblRQQk2za1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMdorV/dJMcajitfVx/Uf9mD97MkIYdblRQQk2za1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMdorV%2FdJMcajitfVx%2FUf9mD97MkIYdblRQQk2za1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;971&quot; height=&quot;320&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 노션 그 페이지 바로 밑에 이 부분에서 명령어 1, 2 진행하기 &lt;span style=&quot;color: #ee2323;&quot;&gt;(3, 4는 나중에 완성하면 진행하는 것)&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(이름/final 브랜치로 이동 후 최신상태 가져오고(git pull) 이걸 베이스로 이름/week1 브랜치 생성하는 과정임)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yHlWt/dJMcaaskFEF/o3kM3vk6GABkLvwxZJzJ00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yHlWt/dJMcaaskFEF/o3kM3vk6GABkLvwxZJzJ00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yHlWt/dJMcaaskFEF/o3kM3vk6GABkLvwxZJzJ00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyHlWt%2FdJMcaaskFEF%2Fo3kM3vk6GABkLvwxZJzJ00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;590&quot; height=&quot;240&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. &amp;nbsp;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;과제 경로에서 해당 명령어 실행하기&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;applescript&quot; style=&quot;background-color: #151b23; color: #f0f6fc; text-align: start;&quot;&gt;&lt;code&gt;./run.sh --install&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;sh 파일&lt;/span&gt;은 스크립트 파일인데, 여러 명령어들이 순서대로 모여있는거임!&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이걸 저 ./run.sh 로 실행해서 안에 있는 명령어를 알아서 실행하게 할 수 있는데, sh파일은 리눅스의 스크립트 파일이라 윈도우에서 실행 안됨.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;윈도우에서 실행하려면&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span&gt;&lt;span&gt;uv sync&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;uv run python app.&lt;/span&gt;&lt;span&gt;py&lt;/span&gt;&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;위 2가지 명령어 실행하면 되는 듯.&lt;b&gt; (sh파일 내부를 AI한테 복붙해서 윈도우 명령어로 바꿔달라고 하면 됨)&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;--install이 붙어서 uv sync(패키지설치하기) 까지 하는 것이고,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; 앞으로 실행할 때는 &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;uv run python app.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;py 치면될듯&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4.&lt;span&gt; 과제 경로에서 env 예시파일 복사해서 env 파일 만들기&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;cp&amp;nbsp;.env.example&amp;nbsp;.env&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이거 입력해서 .env 파일 생성되면 어제처럼 &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;25&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZLnXr/dJMcab5O4VF/yVN0kH8r0QFXh5srAeh1EK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZLnXr/dJMcab5O4VF/yVN0kH8r0QFXh5srAeh1EK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZLnXr/dJMcab5O4VF/yVN0kH8r0QFXh5srAeh1EK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZLnXr%2FdJMcab5O4VF%2FyVN0kH8r0QFXh5srAeh1EK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;25&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;25&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에 API 키 넣으면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. 공부 및 과제 진행하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#&amp;nbsp;[수강생&amp;nbsp;구현&amp;nbsp;가이드] &lt;/b&gt;&lt;br /&gt;&lt;b&gt;# &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;목표 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;Nana가&amp;nbsp;&quot;내&amp;nbsp;일정&amp;nbsp;만들어줘/보여줘/지워줘&quot;&amp;nbsp;같은&amp;nbsp;개인&amp;nbsp;일정&amp;nbsp;요청을&amp;nbsp;받았을&amp;nbsp;때 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;LLM이&amp;nbsp;직접&amp;nbsp;고를&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;LangChain&amp;nbsp;tool&amp;nbsp;3개를&amp;nbsp;완성합니다.&amp;nbsp;Week&amp;nbsp;1의&amp;nbsp;일정은 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;앱&amp;nbsp;DB에&amp;nbsp;저장하지&amp;nbsp;않는&amp;nbsp;현재&amp;nbsp;대화&amp;nbsp;전용&amp;nbsp;임시&amp;nbsp;메모리입니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;# &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;구현&amp;nbsp;위치와&amp;nbsp;사용할&amp;nbsp;코드 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;이&amp;nbsp;파일(student_parts/week01_wake_up_nana.py)&amp;nbsp;안의&amp;nbsp;@tool&amp;nbsp;함수&amp;nbsp;3개를&amp;nbsp;직접&amp;nbsp;구현합니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;임시&amp;nbsp;저장소는&amp;nbsp;이&amp;nbsp;파일&amp;nbsp;상단의&amp;nbsp;PERSONAL_SCHEDULES&amp;nbsp;리스트입니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;JSON&amp;nbsp;문자열&amp;nbsp;반환은&amp;nbsp;이&amp;nbsp;파일의&amp;nbsp;_json(payload)&amp;nbsp;helper를&amp;nbsp;사용합니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;새&amp;nbsp;일정&amp;nbsp;ID는&amp;nbsp;_new_personal_id(),&amp;nbsp;생성&amp;nbsp;시각은&amp;nbsp;_now_iso()를&amp;nbsp;사용합니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;현재&amp;nbsp;채팅&amp;nbsp;범위&amp;nbsp;분리는&amp;nbsp;fixed/session_scope.py의&amp;nbsp;current_session_scope()&amp;nbsp;값을 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;schedule&amp;nbsp;dict의&amp;nbsp;session_id에&amp;nbsp;넣고,&amp;nbsp;조회/삭제&amp;nbsp;때&amp;nbsp;같은&amp;nbsp;session_id만&amp;nbsp;대상으로&amp;nbsp;삼아&amp;nbsp;처리합니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;week01_tools()가&amp;nbsp;세&amp;nbsp;tool을&amp;nbsp;LangChain&amp;nbsp;agent에&amp;nbsp;공개하고,&amp;nbsp;build_week01_agent()가&amp;nbsp;이&amp;nbsp;목록을&amp;nbsp;사용합니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;# &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;구현&amp;nbsp;대상 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;1.&amp;nbsp;personal_create_schedule &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;title/date/start_time/end_time/attendees&amp;nbsp;인자로&amp;nbsp;schedule&amp;nbsp;dict를&amp;nbsp;만듭니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;id는&amp;nbsp;&quot;personal_&quot;&amp;nbsp;접두어가&amp;nbsp;붙은&amp;nbsp;임시&amp;nbsp;ID,&amp;nbsp;created_at은&amp;nbsp;현재&amp;nbsp;시각으로&amp;nbsp;채웁니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;attendees가&amp;nbsp;None이면&amp;nbsp;빈&amp;nbsp;list로&amp;nbsp;바꾸고,&amp;nbsp;session_id=current_session_scope()를&amp;nbsp;함께&amp;nbsp;넣어 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PERSONAL_SCHEDULES에&amp;nbsp;append합니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;반환&amp;nbsp;JSON에는&amp;nbsp;ok,&amp;nbsp;tool_name,&amp;nbsp;created_schedule을&amp;nbsp;넣습니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;Week&amp;nbsp;1&amp;nbsp;반환에는&amp;nbsp;structured_request나&amp;nbsp;sqlite_save를&amp;nbsp;넣지&amp;nbsp;않습니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;# &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;2.&amp;nbsp;personal_list_schedules &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;PERSONAL_SCHEDULES를&amp;nbsp;직접&amp;nbsp;수정하지&amp;nbsp;않고&amp;nbsp;현재&amp;nbsp;대화&amp;nbsp;범위의&amp;nbsp;일정만&amp;nbsp;조회합니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;date_from이&amp;nbsp;있으면&amp;nbsp;그&amp;nbsp;날짜&amp;nbsp;이상,&amp;nbsp;date_to가&amp;nbsp;있으면&amp;nbsp;그&amp;nbsp;날짜&amp;nbsp;이하만&amp;nbsp;남깁니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;날짜&amp;nbsp;비교는&amp;nbsp;YYYY-MM-DD&amp;nbsp;문자열&amp;nbsp;기준으로&amp;nbsp;충분합니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;반환&amp;nbsp;JSON에는&amp;nbsp;ok,&amp;nbsp;tool_name,&amp;nbsp;schedules를&amp;nbsp;넣습니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;# &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;3.&amp;nbsp;personal_delete_schedule &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;schedule_id가&amp;nbsp;일치하면서&amp;nbsp;현재&amp;nbsp;대화&amp;nbsp;범위에&amp;nbsp;속한&amp;nbsp;일정만&amp;nbsp;삭제합니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;리스트&amp;nbsp;객체&amp;nbsp;자체는&amp;nbsp;유지해야&amp;nbsp;하므로&amp;nbsp;PERSONAL_SCHEDULES[:]에&amp;nbsp;새&amp;nbsp;목록을&amp;nbsp;대입합니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;삭제&amp;nbsp;전후&amp;nbsp;길이&amp;nbsp;비교로&amp;nbsp;deleted&amp;nbsp;값을&amp;nbsp;만들고&amp;nbsp;JSON으로&amp;nbsp;반환합니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;다른&amp;nbsp;대화&amp;nbsp;범위의&amp;nbsp;같은&amp;nbsp;ID는&amp;nbsp;삭제하면&amp;nbsp;안&amp;nbsp;됩니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;# &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;중요한&amp;nbsp;반환&amp;nbsp;규칙 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;LangChain&amp;nbsp;tool은&amp;nbsp;문자열&amp;nbsp;반환이&amp;nbsp;가장&amp;nbsp;안정적입니다.&amp;nbsp;dict를&amp;nbsp;만든&amp;nbsp;뒤&amp;nbsp;_json(...)으로&amp;nbsp;감싸세요. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;Week&amp;nbsp;1&amp;nbsp;도구는&amp;nbsp;현재&amp;nbsp;대화&amp;nbsp;안에서만&amp;nbsp;쓰는&amp;nbsp;임시&amp;nbsp;일정&amp;nbsp;dict만&amp;nbsp;반환하며&amp;nbsp;SQLite/App&amp;nbsp;store를&amp;nbsp;호출하지&amp;nbsp;않습니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;# &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;참고&amp;nbsp;코드 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;week01_system_prompt,&amp;nbsp;week01_tools(),&amp;nbsp;build_week_agent(),&amp;nbsp;trace&amp;nbsp;helper는&amp;nbsp;구현&amp;nbsp;대상이&amp;nbsp;아닙니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;이&amp;nbsp;함수들은&amp;nbsp;&quot;LLM이&amp;nbsp;어떤&amp;nbsp;tool을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있는지&quot;와&amp;nbsp;&quot;trace를&amp;nbsp;어떻게&amp;nbsp;보여주는지&quot;를&amp;nbsp;이해할&amp;nbsp;때&amp;nbsp;읽습니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;# &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;검증&amp;nbsp;방법 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;앱을&amp;nbsp;./run.sh&amp;nbsp;--week1로&amp;nbsp;실행하고&amp;nbsp;채팅에&amp;nbsp;하네스&amp;nbsp;프롬프트를&amp;nbsp;넣습니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;상세&amp;nbsp;trace에서&amp;nbsp;LLM이&amp;nbsp;personal_create_schedule/list/delete&amp;nbsp;중&amp;nbsp;어떤&amp;nbsp;tool을&amp;nbsp;골랐는지&amp;nbsp;확인합니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;tool&amp;nbsp;결과&amp;nbsp;JSON에&amp;nbsp;created_schedule,&amp;nbsp;schedules,&amp;nbsp;deleted가&amp;nbsp;있는지도&amp;nbsp;확인합니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;# &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;함수별&amp;nbsp;동작&amp;nbsp;설명 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;join_system_prompt(parts) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;여러&amp;nbsp;주차에서&amp;nbsp;만든&amp;nbsp;system&amp;nbsp;prompt&amp;nbsp;조각을&amp;nbsp;하나의&amp;nbsp;문자열로&amp;nbsp;합칩니다.&amp;nbsp;뒤&amp;nbsp;주차&amp;nbsp;지시가&amp;nbsp;앞&amp;nbsp;주차&amp;nbsp;지시보다 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;우선된다는&amp;nbsp;공통&amp;nbsp;헤더를&amp;nbsp;붙여서,&amp;nbsp;Week&amp;nbsp;2&amp;nbsp;이후&amp;nbsp;파일들이&amp;nbsp;같은&amp;nbsp;방식으로&amp;nbsp;prompt를&amp;nbsp;누적할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;합니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;# &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;_json(payload) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LangChain&amp;nbsp;tool이&amp;nbsp;반환할&amp;nbsp;dict를&amp;nbsp;JSON&amp;nbsp;문자열로&amp;nbsp;바꿉니다.&amp;nbsp;ensure_ascii=False를&amp;nbsp;사용해&amp;nbsp;한글&amp;nbsp;답변과 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;일정&amp;nbsp;제목이&amp;nbsp;escape되지&amp;nbsp;않게&amp;nbsp;합니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;# &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;_now_iso() &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;일정&amp;nbsp;생성&amp;nbsp;시각을&amp;nbsp;timezone이&amp;nbsp;포함된&amp;nbsp;ISO&amp;nbsp;문자열로&amp;nbsp;만듭니다.&amp;nbsp;학생&amp;nbsp;코드에서는&amp;nbsp;created_at&amp;nbsp;기록용으로만&amp;nbsp;사용합니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;# &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;_new_personal_id() &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Week&amp;nbsp;1&amp;nbsp;임시&amp;nbsp;일정에&amp;nbsp;붙일&amp;nbsp;짧은&amp;nbsp;고유&amp;nbsp;ID를&amp;nbsp;만듭니다.&amp;nbsp;DB&amp;nbsp;ID가&amp;nbsp;아니라&amp;nbsp;현재&amp;nbsp;Python&amp;nbsp;프로세스&amp;nbsp;안에서&amp;nbsp;쓰는&amp;nbsp;임시&amp;nbsp;ID입니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;# &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;_schedule_scope(schedule) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;일정&amp;nbsp;dict가&amp;nbsp;어느&amp;nbsp;대화&amp;nbsp;범위에&amp;nbsp;속하는지&amp;nbsp;읽습니다.&amp;nbsp;예전&amp;nbsp;테스트처럼&amp;nbsp;session_id가&amp;nbsp;없는&amp;nbsp;row는&amp;nbsp;기본&amp;nbsp;scope로&amp;nbsp;취급합니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;# &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;_current_session_schedules() &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PERSONAL_SCHEDULES&amp;nbsp;전체&amp;nbsp;중&amp;nbsp;현재&amp;nbsp;conversation/session&amp;nbsp;범위에&amp;nbsp;속한&amp;nbsp;일정만&amp;nbsp;골라&amp;nbsp;반환합니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;# &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;personal_create_schedule(...) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LLM이&amp;nbsp;일정&amp;nbsp;생성이&amp;nbsp;필요하다고&amp;nbsp;판단했을&amp;nbsp;때&amp;nbsp;호출하는&amp;nbsp;tool입니다.&amp;nbsp;입력&amp;nbsp;인자로&amp;nbsp;schedule&amp;nbsp;dict를&amp;nbsp;만들고 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PERSONAL_SCHEDULES에&amp;nbsp;append한&amp;nbsp;뒤,&amp;nbsp;생성된&amp;nbsp;schedule을&amp;nbsp;JSON&amp;nbsp;문자열로&amp;nbsp;반환합니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;# &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;personal_list_schedules(date_from,&amp;nbsp;date_to) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;현재&amp;nbsp;대화&amp;nbsp;범위의&amp;nbsp;임시&amp;nbsp;일정만&amp;nbsp;읽고&amp;nbsp;날짜&amp;nbsp;범위&amp;nbsp;필터를&amp;nbsp;적용합니다.&amp;nbsp;리스트를&amp;nbsp;수정하지&amp;nbsp;않고&amp;nbsp;조회&amp;nbsp;결과만&amp;nbsp;반환합니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;# &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;personal_delete_schedule(schedule_id) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;현재&amp;nbsp;대화&amp;nbsp;범위에서&amp;nbsp;schedule_id가&amp;nbsp;같은&amp;nbsp;일정만&amp;nbsp;제거합니다.&amp;nbsp;다른&amp;nbsp;대화&amp;nbsp;범위의&amp;nbsp;일정은&amp;nbsp;같은&amp;nbsp;ID처럼&amp;nbsp;보여도&amp;nbsp;지우지&amp;nbsp;않습니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;# &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;week01_tools() &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Week&amp;nbsp;1&amp;nbsp;agent가&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;tool&amp;nbsp;목록을&amp;nbsp;반환합니다.&amp;nbsp;create_agent(...)가&amp;nbsp;이&amp;nbsp;목록을&amp;nbsp;보고&amp;nbsp;tool&amp;nbsp;calling을&amp;nbsp;수행합니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;# &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;week01_system_prompt()&amp;nbsp;/&amp;nbsp;week01_prompt_parts() &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Week&amp;nbsp;1&amp;nbsp;agent의&amp;nbsp;역할,&amp;nbsp;현재&amp;nbsp;날짜,&amp;nbsp;tool&amp;nbsp;사용&amp;nbsp;규칙을&amp;nbsp;담은&amp;nbsp;system&amp;nbsp;prompt를&amp;nbsp;만듭니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;# &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;build_week01_agent()&amp;nbsp;/&amp;nbsp;build_week_agent() &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LangChain&amp;nbsp;agent를&amp;nbsp;한&amp;nbsp;번만&amp;nbsp;만들고&amp;nbsp;재사용합니다.&amp;nbsp;build_week_agent()는&amp;nbsp;실행기에서&amp;nbsp;공통으로&amp;nbsp;호출하는&amp;nbsp;표준&amp;nbsp;이름입니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;# &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;list_personal_schedule_dicts(...) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tool이&amp;nbsp;아닌&amp;nbsp;내부&amp;nbsp;helper입니다.&amp;nbsp;다른&amp;nbsp;주차&amp;nbsp;코드가&amp;nbsp;Week&amp;nbsp;1&amp;nbsp;임시&amp;nbsp;일정을&amp;nbsp;dict&amp;nbsp;list로&amp;nbsp;바로&amp;nbsp;읽어야&amp;nbsp;할&amp;nbsp;때&amp;nbsp;사용합니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;# &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;ensure_demo_personal_schedule() &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;데모/테스트에서&amp;nbsp;빈&amp;nbsp;일정&amp;nbsp;저장소를&amp;nbsp;피하려고&amp;nbsp;기본&amp;nbsp;임시&amp;nbsp;일정을&amp;nbsp;하나&amp;nbsp;넣습니다.&amp;nbsp;이미&amp;nbsp;일정이&amp;nbsp;있으면&amp;nbsp;아무&amp;nbsp;일도&amp;nbsp;하지&amp;nbsp;않습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQeTBv/dJMcabrei6V/qcmoadQOQbyPKdAlQbjV5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQeTBv/dJMcabrei6V/qcmoadQOQbyPKdAlQbjV5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQeTBv/dJMcabrei6V/qcmoadQOQbyPKdAlQbjV5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQeTBv%2FdJMcabrei6V%2FqcmoadQOQbyPKdAlQbjV5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;446&quot; height=&quot;562&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>wlsgk7779</author>
      <guid isPermaLink="true">https://wlsgk7779.tistory.com/8</guid>
      <comments>https://wlsgk7779.tistory.com/8#entry8comment</comments>
      <pubDate>Tue, 30 Jun 2026 10:15:11 +0900</pubDate>
    </item>
    <item>
      <title>일본문화</title>
      <link>https://wlsgk7779.tistory.com/6</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;챕터5&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&quot; 봄 연중행사 &quot;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;(1) 오쇼가쓰 1월 1일&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 1월1일부터 3일까지 : &lt;span style=&quot;color: #ee2323;&quot;&gt;산가니치&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 새해 : &lt;span style=&quot;color: #ee2323;&quot;&gt;오쇼가쓰&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 정초에 참배하는 것 : 하쓰모데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 명절이나 설에 먹는 요리 : 오세치요리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 오세치요리 5가지 : 연근조림, 마른멸치조림, 다시마조림, 검은콩, 새우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 콩은 &quot;마메&quot;라고함, 성실하다는 &quot;마메마메시이&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 기뻐하다는 &quot;요로코부&quot;인데 다시마는 &quot;곤부&quot; 뒤가 비슷함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. 오쇼가쓰에 먹는 떡국 : 오조니&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. 오조니에 들어가는 둥글게 생긴 떡 : 가가미모치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. 세벳돈 : 오토시다마&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. 도시가미 강림을 나타내는 소나무 대나무 장식 : 가도마쓰&lt;br /&gt;12. 가가미모치는 &quot;동거울&quot;을 연상하게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13. 신년 장식물로서 볏짚을 왼쪽으로 꼬아 만든것 : 시메나와&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;14. 신을 모시는 선반 : 가미다나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15. 시메나와를 장식한 것 : 시메카자리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16. 시메카자리가 장식된 곳은 &quot;신성한 장소&quot; 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;17. 새해에 일본인들은 복주머니 같은 [ 후쿠부루로 ]를 산다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;(2) 세쓰분&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 세쓰분은 원래 [ 춘하추동 ] 의 분기점이 되는 4가지를 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 오늘날에는 봄의 세쓰분을 칭한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 세쓰분 전야의 콩 뿌리기를 [ 마메마키 ] 라고 부른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 콩을 뿌리는 이유는 [ 집안의 잡귀를 쫓아내려 한 것 ] 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 콩을 뿌리는 역할은 [ 집주인 ] 이나 [ 그 해의 간지와 동일한 해에 출생한 사람 ]이 담당한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 볶은 콩을 먹으면 1년간 병이 들지 않고 건강하게 보낼 수 있다고 하여 [ 자기 나이 수만큼 ] 콩을 먹는다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;(3) 히나 마쓰리 3월 3일&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 3월 3일에 열리는 여자 어린이들의 성장과 행복을 기원하는 전통행사이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 3월 3일 전후에 복숭아 꽃이 피는 까닭에 [ 모모노셋쿠 ] 라고도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 딸들의 축제라는 뜻에서 [ 온나노셋쿠 ] 라고도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 제일 윗 단에는 왕과 왕비를 나타내는 [ 이리비나 ] 두고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 그 아래 단에는 궁녀 인형 3개인 [ 산닌간죠 ]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 그 아래에는 악기 연주하는 인형 5개인 [ 고닌바야시 ]&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;(4) 하나미&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 벚꽃나무 밑에 자리 잡고 노는 잔치를 [ 하나미 ] 라고한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 벚꽃이 만개될 것으로 예상된 지역을 선으로 이은 것을 [ 사쿠라전선 ] 이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&quot; 여름 연중행사 &quot;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;(1) 단고노셋쿠 5월 5일 (어린이날)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 단고노셋쿠에는 마당에 [ 고이노보리 ]를 매달고 목욕을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 잉어 깃발은 잉어가 폭포를 거슬러 가듯 [ 입신출세 ] 하라는 의미이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 잉어가 입신출세의 상징이 된 이유는 중국 고사에서 [ 등용문 ]이라는 말이 나왔기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 무사인형과 작은 갑옷, 투구를 둬서 강하게 자라기를 기원한다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;(2) 다나바타 7월 7일 (다시 나를 바타줘)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 견우와 직녀가 만들 수 있도록 까마귀와 까치가 [ 오작교 ]라는 다리를 놓아준다고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 저녁에 비가 오면 만났다는 기쁨의 눈물, 이튿날 새벽에 비가 오면 이별의 슬픈 눈물&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 7월 7일 다나바타 마쓰리가 열리고, 소원을 적는 길고 가느다란 종이인 [ 단자쿠 ]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;(3) 오본 (추석)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 오본은 달력에는 표시되지 않은 비공식적인 연휴지만, 샐러리맨들에게 긴 연휴의 기회이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 본이란 죽은 이의 영혼을 의미하는 [ 우라본 ] 이라는 불교용어에서 유래됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 오본이 시작되는 13일 저녁 무렵이 되면 [ 무카에비 ] 라고 하여 조상의 영혼을 맞이하는 불을 피우는데 요즘은 전구를 쓰기도함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 불단 앞에 [ 본다나 ]라는 조상의 정령을 모시는 선반을 임시로 설치한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 16일에는 집이나 절 입구에 [ 오쿠리비 ]라는 조상의 영혼을 보내는 불을 피운다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 본다나에 올린 음식을 강이나 바다에 띄어 보내는 [ 쇼로나가시 ] 를 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 오본 기간동안, 밤에 동네 사람들이 모여 노래, 피리 북 장난에 맞춰 추는 춤을 [ 본오도리 ] 라고한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #953b34;&quot;&gt;&quot; 가을 연중행사 &quot;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;(1) 오쓰키미 음력 8월 15일 (달 보기) 오! 쓰키(달) 미 (아름답다)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 밝은 달은 감상하는 것을 [ 오쓰키미 ]라고한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 음력 8월 15일, 보름달이 떠오르는 날을 [ 십오야 ] 라고 하며, [ 쓰키미 단고 ] 등의 공양물을 놓고 달맞이를 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&quot;겨울 연중행사 &quot;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;(1) 시치고산 11월 15일&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 시치고산은 11월 15일에 3세와 5세 남자아이, 3세와 7세 여자아이에게 나들이 옷을 입혀 마을의 수호신인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[ 우지가미 ]를 모시는 신사에 가서 액막이를 받는 행사이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 옛날에는 &quot;일곱살까지는 신에게' 라고 할 정도로 유아의 사망률이 높아서 7세까지 무사히 살아 온 아이의 성장을 씨족신에게 보여 감사한다는 의미가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 또한 홀수를 행운의 수로 생각하여 [ 시치고산 ] 이라는 이름이 붙게 됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 시치고산 때는 [ 지토세아메 ] 라는 시치고산 축하용 홍백의 가래엿을든 아이들의 모습을 볼 수 있다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;(2) 도시노세 12월 28~12월 31 ( 도시가미 신이 곧 노세~~ )&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 12월 28일부터 12월 31일경으로 일년을 마무리하고 새해를 맞이하는 준비기간을 [ 도시노세 ] 라고한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 한해를 정리하고 새해를 새롭게 시작한다는 의미로 신년맞이 대청소인 [ 스스하라이 ]를 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 섣달 그믐날 밤인 [ 오미소카 ]에는 제야의 종소리를 들으며 새해를 축하하는 메밀국수인 [ 도시코시소바 ]를 먹는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 또한 홍백가합전인 [ 고하쿠우타갓센 ] 을 본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 사찰에서는 오전 0시를 목전에 두고 제야의 종을 치기 시작해 108번을 울린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 도시코시소바는 긴 국수처럼 가족의 건강과 장수가 계속되길 기원하는 뜻과,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 국수가 잘 끊어지는 것에서 유래해 액운과 빚을 청산한다는 의미를 담고있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;(3) 연하장&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 12월이 되면 연하장을 쓰는데, 감사한 사람들 등에게 보내는 인사장이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 연하장은 추첨용 복권인 [ 오토시다마 쿠지 ] 가 붙어있어 행운도 전달할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. [연하특별우편제도] 에 의해 연말까지 우체국에 모아둔 연하장을 설날아침에 일제히 배달한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[ 국 경 일 ]&lt;/b&gt;&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1월 1일 : 오쇼가쓰 (새해)&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1월 1일로 한 해의 시작을 축하한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1월 1일만 빨간날이지만 3일까지 공휴일이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조상들에게 추도를 표하고 새해에 신사나 절을 가기도 한다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1월 둘째 주 월요일&amp;nbsp; : 성인의 날&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전년도 4월 2일부터 그 이듬해 4월 1일까지 20세가 된 사람을 성인으로 인정하고 축하하는 날&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 성인이 된 여성들은 성인의 날에 [ 후리소데 ] 를 입는다. 가장 화려하고 미혼 여성만 입을 수 있음&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2월 11일 : 건국기념일&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2월 23일 : 천황탄생일&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2019년 5월에 즉위한 레이와일왕의 생일&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3월 21일 : 춘분의 날&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;밤과 낮의 길이가 같은 날을 뜻한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;춘분과 추분을 중심으로 한 전후 3일간의 1주일을 [ 히간 ] 이라고하며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;히간은 생사의 바다를 건너 도달하는 깨달음의 세계, 즉 저세상이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 시간에는 사람들이 조상의 묘에 성묘하러 가고 일본 황실에서도 천황의 조상에 대한 제사&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4월 29일 : 쇼와의 날 : 골든 위크 시작 날&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 천황의 선친인 히로히토 천황의 생일&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5월 3일 : 헌법기념일&lt;/b&gt;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5월 4일 : 녹색의 날&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;국경일의 3일과 5일 사이에 끼어있어서 국경일이 됨&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5월 5일 : 어린이날 : 골든위크 마지막 날&lt;/b&gt;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;7월 셋째 주 월요일 : 바다의 날&lt;/b&gt;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;8월 11일 : 산의 날&lt;/b&gt;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;9월 셋째 주 월요일 : 경로의 날&lt;/b&gt;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;9월 23일 : 추분의 날&lt;/b&gt;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;10월 둘째 주 월요일 : 스포츠의 날&lt;/b&gt;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;11월 3일 : 문화의 날&lt;/b&gt;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;11월 23일 : 근로감사의 날&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유래는 가을에 수확한 곡물을 신에게 드리면서 감사하는 [ &lt;b&gt;니이나메사이&lt;/b&gt; (궁중제사) ] 에서 비롯되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[ 챕터 7 ] 애니&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[애니메이션의 태동기]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본격적인 애니메이션의 시작은&lt;b&gt; [ 1940년대 ]&lt;/b&gt; 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일본에서 처음 상영된 디즈니 장편 애니메이션은&amp;nbsp;&lt;b&gt;[ 백설공주 ]&amp;nbsp;&lt;/b&gt;인데, 이는 애니메이션계 종사하는 사람들이게 신선한 충격..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제 2차 세계대전 이후 대형 영화사인&amp;nbsp;&lt;b&gt;[ 도에 ]&amp;nbsp;&lt;/b&gt;는 1956년 자회사로 애니메이션 전문업체인 &lt;b&gt;[ 도에동화 ]&amp;nbsp;&lt;/b&gt;를 설립했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도에동화는 1958년 일본 최초의 장편 컬러 애니메이션인&amp;nbsp;&lt;b&gt;[ 백사전 ]&amp;nbsp;&lt;/b&gt;을 제작함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백사전은 중국의 민화를 제재로 한 러브스토리 애니메이션.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; [애니메이션의 출발기]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1960년대에 만화가 겸 애니메이션 작가로 활동한 [ 데즈카 오사무 ]가 등장하여 흐름을 바꿈&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데즈카 오사무는 1961년 [ 무시프로덕션 ] 을 설립하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일본 최초의 TV용 애니메이션인 &lt;b&gt;[ 철완아톰 ]&lt;/b&gt; 을 제작.!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적은 제작비와 부족한 시간을 해결하기 위해 &lt;b&gt;[ 리미티드 애니메이션 기법 ]&lt;/b&gt; 을 시도해 대성공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[ 리미티드 애니메이션 기법 ] 이란 1초간 촬영하는 그림의 매수를 줄여 움직임에 절대적으로 필요한 캐릭터의 일부 동작과 키 포즈에 해당하는 움직임만을 그려내는 제작방식.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래 [ 철완아톰 ] 은 데즈카 오사무가 14년간 연재하던 만화였는데 TV애니메이션 성공으로 인해 63년부터 66년까지 총 193화가 흑백으로 제작, 1980년에는 컬러로 리메이크됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애니메이션의 인기로 인해 아톰은 학용품이나 옷 등에 새겨지기도 함!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로덕션이 위치한 사이타마현에서 지역사회 특성화의 일환으로 아톰에게 특별주민등록증 발급해줌!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 시기에 제작된 대표적인 애니로는 [ 거인의 별 ] [ 태양의 왕자 호루스의 대모험 ] 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1969년부터 현재까지 매주 일요일 저녁 후지 TV에서 방영되고 있는&lt;b&gt; 최장수 애니메이션&lt;/b&gt;인 &lt;b&gt;[ 사자에산 ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[애니메이션의 발전기]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 기동전사 건담 ]&lt;/b&gt;은 주인공을 중심으로 펼쳐지는 기존 틀을 깸. 로봇 또한 현실성이 중시되면서 &lt;b&gt;[ 리얼 로봇물 ]&lt;/b&gt; 이라는 새 장르탄생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;일본 최초 주제가 앨범이 제작&lt;/b&gt;되고 100만장 이상이 판매된 애니메이션은&lt;b&gt; [ 캔디 캔디 ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소년들이 로봇물에 빠질 때, 소녀들은 캔디캔디에 빠졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1978년 미야자키 하야오 감독이 단독 연출을 맡은 [ 미래소년 코난 ]은 데뷔작이자&lt;b&gt; NHK 최초의 애니메이션 연속물&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[애니메이션의 전성기]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1980년대는 내용과 기술면에서 큰 발전을 거둔 애니의 전성기이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방송 목적이 아니라 판매 목적으로 나온 OVA(original vidio animation)가 출현한 것도 이때이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1983년 오시이 마모루가 감독한 지구인과 달 이주민 사이의 정체성의 대립을 그린 &lt;b&gt;[ 달로스 ]&lt;/b&gt; 가 &lt;b&gt;OVA 애니메이션의 최초 작품&lt;/b&gt;이었지만&amp;nbsp;&lt;b&gt;흥행 실패 ㅠㅠ&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 다나카 요시키 소설이 원작인 &lt;b&gt;[은하영웅전설]은 큰 성공.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 110화가 OVA로 제작되었고 외전도 나옴, 만화책이나 컴퓨터게임으로도 나옴!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1980년대에는 &lt;b&gt;가이낙스 와 스튜디오 지브리의 설립!!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 스튜디오를 통해 원작을 만화에 의지하지 않는 오리지널 스토리의 극장용 애니메이션 작품이 다수 제작!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[애니메이션의 세계화]&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1990년대 특징으로 [ 오타쿠 ]문화를 대두로 들 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 오타쿠 ]란&amp;nbsp;&lt;/b&gt;특정 분야나 취미에 열중하는 사람을 가리키는 일본어로 광적인 매니아라고 할수있따.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[ 오타쿠 ] 는 원래 '당신', '댁' 이라는 뜻을 지닌 대명사이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[ 오타쿠 ] 라는 말은 1983년 일본에서 처음 사용되었는데, 만화나 애니, 게임, 비디오 등 서로 관련있는 대중 문화에 몰두하여 같은 취미를 가진 사람들이 동호회에서 만나 예의를 지키고 존중하는 의미에서 오타쿠라고 불렸다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이러한 &lt;b&gt;오타쿠 문화를 발전&lt;/b&gt;시킨 것은 1995년에 방영된&lt;b&gt; [ 신세기 에반게리온 ]&amp;nbsp;&lt;/b&gt;이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;신세기 에반게리온은 가이낙스의 에바 프로젝트에 의해 제작되었는데 TV방영 당시엔 그닥 주목 받지 못함.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그러나 뒤늦게 오타쿠의 관심대상이 되면서&lt;b&gt; [ 에바 신드롬 ]&amp;nbsp;&lt;/b&gt;을 불러일으켰다!&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;오타쿠들은 작품에서 전달하고자 하는 수수께끼를 푸는 재미에 열광하였고, 1997년에는 극장판까지 만들어짐&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 공각기동대 ]&lt;/b&gt; 도 선풍을 불러일으킴. 참신한 기술과 완성도 높은 내용으로&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1996년 &lt;b&gt;미국 빌보드지의 비디오 차트에서 1위&lt;/b&gt;를 하였고 수많은 영향을 미쳤다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2004년 속편으로 &lt;b&gt;[ 이노센스 ]&lt;/b&gt; 가 나왔는데, 이는 칸느 영화제에 출품되어 높은 평을 받았고, 미국평론가들에게 2004년 최고의 애니로 뽑혔다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;지브리의 애니메이션도 디즈니 보급망을 타고 세계 애니메이션 시장에 수출되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[ 챕터 9 ] 기모노&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;중요한 거 같은 것만.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 헤이안 시대에는 천황과 귀족들은 자신의 부와 권력을 상징하기 위해 겹쳐입는 옷으로 형태가 발전함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적으로 &lt;b&gt;귀족 가문의&lt;/b&gt; &lt;b&gt;남자 정장인 [ 소쿠타이 ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;여성 귀족용 복식인 [ 주니히토에 ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;둘 다 소맷부리가 크고 넓다. 가장 기본 속옷으로 [ 고소데 ] 입음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 무사시대일때 무가의 여자들은 고소데 위에 더 긴 고소데를 걸쳐입는&lt;b&gt; [ 우치카케 ]&lt;/b&gt; 입음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계급층은 쇼군으로서의 위엄과 무사로서의 활동성을 겸하여 &lt;b&gt;[ 가타기누 ] 입은 후 얇은 [ 오비 ] 로 마감함&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 가타기누 ] 의 특징은 어깨선에 각을 넣어 왜소한 체격을 커버할 수 있다!!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;아따 (어깨) 기누~ 로 가타기누 외우기.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 메이지나 다이쇼 시대 학교 안팎에서는 여학생들이 일상적으로 &lt;b&gt;[ 하카마 ]&lt;/b&gt; 라는 넓은 치마를 즐겨입음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 문화가 되어서 현재도 입학식이나 졸업식에 [ 하카마 ]를 정장으로 입기도함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다이쇼 후기에는 하카마를 대신해 세라복이라고 불리는 세알러칼라가 달려있는 교복등장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 하카마 ]는 [ 넷카마 ] 와 말이 비슷!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 기모노의 종류 1 ( 하오리와 하카마 )&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;남자들의 옷은 보통&lt;b&gt; [ 나가기 ] [ 하오리 ] [ 하카마 ]&lt;/b&gt; 로 크게 구분할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1). [ 나가기 ]&lt;/b&gt; : 발목까지 옷자락이 닿는 길이의 기모노&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2). [ 하오리 ]&lt;/b&gt; : 보통 무릎 위 중간까지만 오는 겉옷?느낌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 중 &lt;b&gt;[몬쓰키하오리]&lt;/b&gt; 는 결혼식이나 중요한 행사에 예장으로 입는 것으로, 양쪽 가슴에 가문의 문장을 넣는다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몬쓰키하오리 중 가장 정식 형태는 &lt;b&gt;[ 구로몬쓰키하오리 ]&amp;nbsp;&lt;/b&gt;라고 하고, 보통 결혼식 때 일생에 한번 입을 정도임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래 방한용으로 입기 시작한 하오리는 고소데 위에 입는 나가기 바깥에 겁쳐 입으며, 하오리의 길이도 유행이 바뀌는 양상이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) [ 하카마 ] :&amp;nbsp;&lt;/b&gt;다이쇼시대부터 여학생도 입음. 약간 통이 넓은 치마바지 같은 형태임!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 기모노를 보호하거나 보온용 목적이었지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재의 하카마는 남성이 결혼식을 할 대나 다도회 등이 있을 때 예장용으로 주로 입는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검도 등을 할 때 입는 도복도 하카마를 변형한 것!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기모노의 종류 2&amp;nbsp; :&lt;/b&gt;&amp;nbsp;&lt;b&gt;도메소데와 후리소데&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여성의 기모노는&lt;b&gt; 소매 길이를 보면 그 여성이 기혼인지, 미혼인지 알 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 도메소데 ]&lt;/b&gt; : 기혼 여성이 입는 기모노로, 소매의 길이가 짧고, 품격을 중요시하여 결혼식이나 중요 의식에 주로 입는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검은 색 바탕으로 아랫 자락에 한폭의 그림과 같은 무늬가 들어가고, 어깨 앞쪽으로 가문을 상징하는 문양이 장식되는 것이 보통이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 후리소데 ]&lt;/b&gt; : 미혼 여성이 입는 기모노로, 도메소데에 비하면 훨씬 길이가 긴 예복용 기모노를 입는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;길고 우아하게 늘어뜨릴 수 있는 이 소매에까지 염색이나 자수로 화려함을 더한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기혼 여성들은 소매가 길면 기능적인 면에서 활동이나 작업하기가 불편하기 때문에 소매가 짧아지는게 당연하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 미혼여성들은 젊은 화려함을 부각시키는데 넓은 소매를 멋스럽게 장식하는 것이 자연스러운것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-----------------------------------------------------&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기모노의 종류 3 : 유카타&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유카타는 헤이안시대에 귀족들이 목욕할 때 입었던 속옷 겸 목욕타운이었다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에도시대에 서민들의 목욕문화가 보편화 되며 하얀색 목면 기모노를 유카타라고 불렀다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘날의 [ 유카타 ] 는 유난히 무덥고 습기가 많은 일본의 여름을 시원하게~보낼 수 있는 계절의상으로,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정식 기모노에 비해서 입는 법이 간단하고 가격이 저렴하면서 재질과 색감이 다양하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 7월과 8월에 마쓰리나 불꽃놀이를 즐기는 곳에서 화려하고 다양한 유카타를 입은 남녀노소가 있따.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐릭터 인형이나 부채 등을 등 뒤 오비 매듭에 꽂고 다니면서 손을 편하게 하는동시에 형식에 구애받지 않아 마쓰리(축제)와 뗄 수 없는 아이템이다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 한편 유카타를 목욕가운으로 쓰는 곳은 일본의 전통 숙박시설인 [ 료칸 ] 이다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-----------------------------------------------------&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기모노의 종류 4 : 오비와 게타&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 오비 ]&amp;nbsp;&lt;/b&gt;는 기모노를 입을 때 마무리로 허리춤을 감아 여미는 넒은 폭의 천이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기모노를 완성하는데 꼭 필요한 요소이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재는 벨트보다는 다양한 무늬와 색감과 재질을 사용해 기모노에 포인트를 주는 역할이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 다비 ]&amp;nbsp;&lt;/b&gt;는 기모노를 입을 때 신는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다비는 엄지와 나머지 네 발가락으로 나뉘어 있는데, 전통 신발인 게타와 조리와 맞춰 착용하며, 발꿈치 쪽에서 후크로 고정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본은 흰색이다. 여러 디자인이 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 게타 ]&amp;nbsp;&lt;/b&gt;는 전통 신발로, 나무판 위에 있는 세 개의 구멍을 끈으로 연결하여 발을 고정하는 형태로 바닥에는 &quot;하&quot; 라고 하는 돌기부분이 있따. 바닥이 높게 고안된 것은 여름에 비가 많고, 자갈길이 많은 풍토 지형적 특성 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 조리 ]&amp;nbsp;&lt;/b&gt;는 게타보다는 격식이 있어 정장용으로 맞춰 신는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[ 챕터 10 ] 요리&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[자연을 살린 요리]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 일본은 식재료 본연의 맛을 살리는 것을 중요시한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 그래서 향신료나 양념을 많이 사용하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 신선한 소재의 맛을 살리는 조미료와 육수가 발달했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 일본식 조미료 종류에는 설탕, 소금, 식초, 미소, 소유, 미린, 와사비 등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 조미료는 넣는 순서는 히라가나 사 행의 사(사토, 설탕) 시(시오, 소금) 스(스, 식초) 세(세유,쇼유,간장) 소(미소, 된장) 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[동서양을 절충한 요리]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 일본 음식 문화의 특징은 일본요리와 서양요리를 절충해 새로운 스타일의 [ 양식 ] 을 만들어낸것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. [ 양식 ] 요리의 특징은 기본 룰은 그대로 지키면서 주식인 밥에 맞도록 바꾼것!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 오므라이스, 카레라이스, 고로케, 하야시라이드, 돈가스 등이 양식 요리로 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[인스턴트 식품과 도시락]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 청일 전쟁 때 중국군의 비상식량인 건면에서 아이디어를 얻어 세계 최초의 인스턴트 라면인 [닛신 치킨 라면] 이 탄생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 닛신 식품에서 세계 최초의 컵라면도 출시!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 이 외에도 냉동식품이나 레토르트 식품 등이 널리 보급되고 인기를 끌었는데, 인스턴트&amp;nbsp; 식품에서는 느낄 수 없는 진짜에 가까운 맛 때문이다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 백화점 지하의 고급 식품관을 [ 데파치카 ] 라고한다. 데파트 와 지카의 합성어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 편의점이나 슈퍼마켓에서 도시락을 사다가 사무실이나 집에서 먹는 것을 [ 나카쇼쿠 ] 라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 역에서 파는 도시락이라는 뜻의 [ 에키벤 ]은 각 고장의 특산물을 활용한 도시락이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[일본의 보존식품]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 일본에서는 기후와 풍토에 알맞은 보존 음식이 발달했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 호시모노, 쓰케모노, 시오카라, 낫토 등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 호시모노는 햇빛에 말리는 건조법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 쓰케모노는 야채를 소금이나 간장, 된장 등에 절인 음식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 시오카라는 젓갈&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 낫토는 삶은 콩에 낫토균을 배양해 발효시킨 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[전통 요리]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 일본은 전통적인 향응을 위한 기본 요리로 3 종류가 있는데, 혼젠요리, 차카이세키 요리, 가이세키 요리가 있따.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. [ 혼젠 요리 ] 는 정식 연회에서 차려지는 요리이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. [ 차카이세키 요리 ] 는 다도에서 차를 내기 전에 간단하게 내는 요리이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. [ 가이세키 요리 ] 는 연회요리로서 일반적으로 이용되는 요리이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 혼젠 요리는 주로 관혼상제 때 쓰인 정식식단으로써, 차리기가 매우 복잡하나 일본음식의 기초적 식단으로 구성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혼젠 요리라는 이름은 손님 대접을 위한 상차림에서 중앙에 놓는 밥상을 ' 혼젠 ' 이라고 부른 것에서 왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 차카이세키요리는 선종의 수행 승려들이 공복감을 막기 위해 가슴에 따뜻한 돌을 품었다는 데서 유래&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 에도시대 연회에서 식사를 즐긴 것에서 유래된 가이세키 요리는 혼젠요리 형식의 차카이세키요리 형식을 가미한것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[외식 문화]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>wlsgk7779</author>
      <guid isPermaLink="true">https://wlsgk7779.tistory.com/6</guid>
      <comments>https://wlsgk7779.tistory.com/6#entry6comment</comments>
      <pubDate>Tue, 16 Jun 2026 07:42:13 +0900</pubDate>
    </item>
    <item>
      <title>카테캠 2차과제</title>
      <link>https://wlsgk7779.tistory.com/5</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;새 폴더를 만들어서 vite와 tailwind 세팅함&lt;br /&gt;기존 UI를 컴포넌트 단위로 나누려고 AI에게 트리구조를 그려달라고 하고, 그대로 폴더와 파일을 생성해달라고 했음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;todo-react/ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&amp;nbsp;├──&amp;nbsp;public/ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&amp;nbsp;│&amp;nbsp;&amp;nbsp;&amp;nbsp;└──&amp;nbsp;image/&amp;nbsp;(둥둥이&amp;nbsp;이미지&amp;nbsp;파일들) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4&amp;nbsp;└──&amp;nbsp;src/ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;App.jsx&amp;nbsp;(메인&amp;nbsp;레이아웃&amp;nbsp;및&amp;nbsp;상태&amp;nbsp;관리) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;App.css&amp;nbsp;(기존&amp;nbsp;바닐라&amp;nbsp;스타일) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;└──&amp;nbsp;components/ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;Header.jsx &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;DateNavigator.jsx &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;CalendarModal.jsx &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;11&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;TodoInput.jsx &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;12&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;└──&amp;nbsp;TodoList.jsx&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 구조로 컴포넌트를 나눔&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CRUD기능을 마이그레이션 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제시해주신&amp;nbsp;CRUD(Create,&amp;nbsp;Read,&amp;nbsp;Update,&amp;nbsp;Delete)&amp;nbsp;핵심&amp;nbsp;기능을&amp;nbsp;React&amp;nbsp;방식으로 &lt;br /&gt;&amp;nbsp;&amp;nbsp;완벽하게&amp;nbsp;마이그레이션했습니다!&amp;nbsp;  &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ️&amp;nbsp;구현된&amp;nbsp;주요&amp;nbsp;기능 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.&amp;nbsp;Create&amp;nbsp;(생성): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;TodoInput.jsx에서&amp;nbsp;text&amp;nbsp;상태를&amp;nbsp;관리하며,&amp;nbsp;입력값이&amp;nbsp;비어있을&amp;nbsp;경우&amp;nbsp;&quot;⚠️&amp;nbsp;할 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;일을&amp;nbsp;입력해야&amp;nbsp;둥둥이가&amp;nbsp;춤을&amp;nbsp;춰요!&quot;라는&amp;nbsp;안내&amp;nbsp;메시지를&amp;nbsp;표시합니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;엔터&amp;nbsp;키를&amp;nbsp;누르거나&amp;nbsp;'추가'&amp;nbsp;버튼을&amp;nbsp;클릭하면&amp;nbsp;새로운&amp;nbsp;Todo가&amp;nbsp;생성됩니다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.&amp;nbsp;Read&amp;nbsp;(조회&amp;nbsp;&amp;amp;&amp;nbsp;필터): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;App.jsx에서&amp;nbsp;localStorage를&amp;nbsp;활용해&amp;nbsp;데이터를&amp;nbsp;유지하며,&amp;nbsp;현재&amp;nbsp;선택된&amp;nbsp;날짜와 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;필터(전체/진행&amp;nbsp;중/완료)에&amp;nbsp;맞는&amp;nbsp;목록만&amp;nbsp;계산해서&amp;nbsp;보여줍니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;필터&amp;nbsp;상태에&amp;nbsp;따라&amp;nbsp;빈&amp;nbsp;화면의&amp;nbsp;메시지(둥둥이&amp;nbsp;멘트)가&amp;nbsp;동적으로&amp;nbsp;변합니다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.&amp;nbsp;Update&amp;nbsp;(수정): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;인라인&amp;nbsp;수정&amp;nbsp;UI:&amp;nbsp;TodoItem.jsx&amp;nbsp;내부에&amp;nbsp;isEditing&amp;nbsp;상태를&amp;nbsp;두어,&amp;nbsp;'수정'&amp;nbsp;버튼 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;클릭&amp;nbsp;시&amp;nbsp;prompt()&amp;nbsp;대신&amp;nbsp;즉시&amp;nbsp;입력창으로&amp;nbsp;전환됩니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;텍스트뿐만&amp;nbsp;아니라&amp;nbsp;카테고리도&amp;nbsp;수정&amp;nbsp;모드에서&amp;nbsp;함께&amp;nbsp;변경할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;4.&amp;nbsp;Delete&amp;nbsp;&amp;amp;&amp;nbsp;Toggle&amp;nbsp;(삭제&amp;nbsp;및&amp;nbsp;완료&amp;nbsp;처리): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;삭제&amp;nbsp;버튼&amp;nbsp;클릭&amp;nbsp;시&amp;nbsp;즉시&amp;nbsp;목록에서&amp;nbsp;제거됩니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;체크박스를&amp;nbsp;통해&amp;nbsp;완료&amp;nbsp;상태를&amp;nbsp;토글할&amp;nbsp;수&amp;nbsp;있으며,&amp;nbsp;완료&amp;nbsp;시&amp;nbsp;기존&amp;nbsp;CSS&amp;nbsp;테마에 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;따라&amp;nbsp;취소선&amp;nbsp;및&amp;nbsp;투명도&amp;nbsp;처리가&amp;nbsp;시각적으로&amp;nbsp;적용됩니다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;확인&amp;nbsp;포인트 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;useState&amp;nbsp;활용:&amp;nbsp;App.jsx에서는&amp;nbsp;전체&amp;nbsp;데이터(배열)를&amp;nbsp;관리하고, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TodoItem.jsx에서는&amp;nbsp;각&amp;nbsp;항목의&amp;nbsp;'수정&amp;nbsp;중&amp;nbsp;여부'와&amp;nbsp;같은&amp;nbsp;로컬&amp;nbsp;UI&amp;nbsp;상태를&amp;nbsp;관리하여 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;역할이&amp;nbsp;명확히&amp;nbsp;분리되었습니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;선언적&amp;nbsp;UI:&amp;nbsp;바닐라&amp;nbsp;JS처럼&amp;nbsp;직접&amp;nbsp;DOM을&amp;nbsp;조작(appendChild,&amp;nbsp;remove)하지&amp;nbsp;않고, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;오직&amp;nbsp;상태(todos,&amp;nbsp;isEditing)만&amp;nbsp;변경하면&amp;nbsp;React가&amp;nbsp;화면을&amp;nbsp;자동으로&amp;nbsp;그려줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음단계도 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네,&amp;nbsp;맞습니다!&amp;nbsp;방금&amp;nbsp;진행한&amp;nbsp;CRUD&amp;nbsp;마이그레이션&amp;nbsp;단계에서&amp;nbsp;상태별&amp;nbsp;필터링&amp;nbsp;기능도&amp;nbsp;함께 &lt;br /&gt;&amp;nbsp;&amp;nbsp;구현을&amp;nbsp;완료했습니다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;이미&amp;nbsp;구현된&amp;nbsp;내용을&amp;nbsp;바탕으로&amp;nbsp;확인해&amp;nbsp;드릴게요: &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;필터링&amp;nbsp;기능&amp;nbsp;구현&amp;nbsp;확인 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.&amp;nbsp;필터&amp;nbsp;상태&amp;nbsp;관리&amp;nbsp;(useState): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;App.jsx에&amp;nbsp;const&amp;nbsp;[filter,&amp;nbsp;setFilter]&amp;nbsp;=&amp;nbsp;useState('all');가&amp;nbsp;선언되어&amp;nbsp;있어 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;현재&amp;nbsp;어떤&amp;nbsp;탭이&amp;nbsp;선택되었는지&amp;nbsp;기억하고&amp;nbsp;있습니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.&amp;nbsp;탭&amp;nbsp;전환&amp;nbsp;후&amp;nbsp;Todo&amp;nbsp;추가&amp;nbsp;시&amp;nbsp;유지: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;탭을&amp;nbsp;전환하면&amp;nbsp;filter&amp;nbsp;상태가&amp;nbsp;바뀌고,&amp;nbsp;그&amp;nbsp;상태에서&amp;nbsp;할&amp;nbsp;일을&amp;nbsp;추가해도 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;App.jsx의&amp;nbsp;filter&amp;nbsp;값은&amp;nbsp;그대로&amp;nbsp;유지되므로&amp;nbsp;새로&amp;nbsp;추가된&amp;nbsp;할&amp;nbsp;일도&amp;nbsp;필터&amp;nbsp;규칙에 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;따라&amp;nbsp;자동으로&amp;nbsp;보이고&amp;nbsp;숨겨집니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.&amp;nbsp;시각적&amp;nbsp;구분: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;TodoList.jsx에서&amp;nbsp;className={filter&amp;nbsp;===&amp;nbsp;'active'&amp;nbsp;?&amp;nbsp;'active'&amp;nbsp;:&amp;nbsp;''}와&amp;nbsp;같은 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;코드를&amp;nbsp;통해&amp;nbsp;현재&amp;nbsp;선택된&amp;nbsp;버튼에만&amp;nbsp;active&amp;nbsp;스타일(흰색&amp;nbsp;배경&amp;nbsp;+&amp;nbsp;그림자)이 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;적용되도록&amp;nbsp;처리했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;---일간뷰 마이그레이션 완료 --&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일간&amp;nbsp;뷰(Daily&amp;nbsp;View)&amp;nbsp;기능을&amp;nbsp;성공적으로&amp;nbsp;마이그레이션했습니다!&amp;nbsp;  &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ️&amp;nbsp;구현된&amp;nbsp;내용 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.&amp;nbsp;날짜&amp;nbsp;이동&amp;nbsp;로직:&amp;nbsp;DateNavigator의&amp;nbsp;좌우&amp;nbsp;화살표&amp;nbsp;버튼을&amp;nbsp;클릭하면&amp;nbsp;selectedDate &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;상태가&amp;nbsp;하루씩&amp;nbsp;앞뒤로&amp;nbsp;변경되도록&amp;nbsp;구현했습니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.&amp;nbsp;동적&amp;nbsp;Todo&amp;nbsp;목록:&amp;nbsp;날짜가&amp;nbsp;바뀌면&amp;nbsp;App.jsx에서&amp;nbsp;filteredTodos를&amp;nbsp;자동으로&amp;nbsp;다시 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;계산합니다.&amp;nbsp;즉,&amp;nbsp;해당&amp;nbsp;날짜에&amp;nbsp;저장된&amp;nbsp;Todo만&amp;nbsp;화면에&amp;nbsp;나타납니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.&amp;nbsp;날짜별&amp;nbsp;할&amp;nbsp;일&amp;nbsp;저장:&amp;nbsp;새로운&amp;nbsp;Todo를&amp;nbsp;추가할&amp;nbsp;때&amp;nbsp;현재&amp;nbsp;보고&amp;nbsp;있는 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;날짜(selectedDate)가&amp;nbsp;자동으로&amp;nbsp;함께&amp;nbsp;저장됩니다.&amp;nbsp;(어제&amp;nbsp;날짜를&amp;nbsp;보면서 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;추가하면&amp;nbsp;어제&amp;nbsp;날짜로&amp;nbsp;저장돼요!) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;4.&amp;nbsp;한국어&amp;nbsp;날짜&amp;nbsp;표시:&amp;nbsp;2026년&amp;nbsp;6월&amp;nbsp;8일&amp;nbsp;(월)과&amp;nbsp;같이&amp;nbsp;기존&amp;nbsp;바닐라&amp;nbsp;프로젝트와&amp;nbsp;동일한 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;친숙한&amp;nbsp;형식으로&amp;nbsp;날짜를&amp;nbsp;표시합니다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;확인&amp;nbsp;포인트 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;날짜&amp;nbsp;이동:&amp;nbsp;화살표를&amp;nbsp;눌렀을&amp;nbsp;때&amp;nbsp;상단&amp;nbsp;날짜&amp;nbsp;텍스트가&amp;nbsp;잘&amp;nbsp;변하는지&amp;nbsp;확인해&amp;nbsp;보세요. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;데이터&amp;nbsp;분리:&amp;nbsp;오늘&amp;nbsp;할&amp;nbsp;일을&amp;nbsp;추가하고&amp;nbsp;어제&amp;nbsp;날짜로&amp;nbsp;이동했을&amp;nbsp;때,&amp;nbsp;오늘&amp;nbsp;추가한&amp;nbsp;할 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;일이&amp;nbsp;사라지고(숨겨지고)&amp;nbsp;깨끗한&amp;nbsp;화면이&amp;nbsp;나오는지&amp;nbsp;확인해&amp;nbsp;보세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-------------주간뷰 완료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주간&amp;nbsp;뷰(Weekly&amp;nbsp;View)&amp;nbsp;마이그레이션을&amp;nbsp;완료했습니다!&amp;nbsp; ️ &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ️&amp;nbsp;구현된&amp;nbsp;주요&amp;nbsp;기능 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.&amp;nbsp;주간&amp;nbsp;날짜&amp;nbsp;트랙:&amp;nbsp;이번&amp;nbsp;주&amp;nbsp;월요일부터&amp;nbsp;일요일까지&amp;nbsp;7일간의&amp;nbsp;날짜를&amp;nbsp;한눈에 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;보여줍니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.&amp;nbsp;Todo&amp;nbsp;개수&amp;nbsp;표시:&amp;nbsp;각&amp;nbsp;날짜&amp;nbsp;아래에&amp;nbsp;해당&amp;nbsp;날짜에&amp;nbsp;할&amp;nbsp;일이&amp;nbsp;몇&amp;nbsp;개&amp;nbsp;있는지&amp;nbsp;실시간으로 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;계산해서&amp;nbsp;보여줍니다.&amp;nbsp;(바닐라&amp;nbsp;JS의&amp;nbsp;복잡한&amp;nbsp;DOM&amp;nbsp;조작&amp;nbsp;없이&amp;nbsp;React의&amp;nbsp;filter로 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;간단히&amp;nbsp;해결!) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.&amp;nbsp;날짜&amp;nbsp;동기화:&amp;nbsp;주간&amp;nbsp;뷰의&amp;nbsp;특정&amp;nbsp;날짜를&amp;nbsp;클릭하면&amp;nbsp;아래&amp;nbsp;일간&amp;nbsp;뷰와&amp;nbsp;목록이&amp;nbsp;즉시 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;해당&amp;nbsp;날짜로&amp;nbsp;업데이트됩니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;4.&amp;nbsp;주&amp;nbsp;단위&amp;nbsp;이동:&amp;nbsp;좌우&amp;nbsp;화살표를&amp;nbsp;통해&amp;nbsp;이전&amp;nbsp;주나&amp;nbsp;다음&amp;nbsp;주로&amp;nbsp;편리하게&amp;nbsp;이동할&amp;nbsp;수 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;있습니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;5.&amp;nbsp;오늘&amp;nbsp;&amp;amp;&amp;nbsp;선택&amp;nbsp;날짜&amp;nbsp;강조:&amp;nbsp;오늘&amp;nbsp;날짜에는&amp;nbsp;노란색&amp;nbsp;동그라미&amp;nbsp;스타일이,&amp;nbsp;현재&amp;nbsp;선택한 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;날짜에는&amp;nbsp;흰색&amp;nbsp;카드&amp;nbsp;스타일이&amp;nbsp;적용되어&amp;nbsp;시각적으로&amp;nbsp;구분됩니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;6.&amp;nbsp;상태&amp;nbsp;유지:&amp;nbsp;새로고침을&amp;nbsp;해도&amp;nbsp;내가&amp;nbsp;보고&amp;nbsp;있던&amp;nbsp;주차와&amp;nbsp;선택한&amp;nbsp;날짜가&amp;nbsp;그대로 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;유지되도록&amp;nbsp;로컬&amp;nbsp;스토리지와&amp;nbsp;연동했습니다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;핵심&amp;nbsp;포인트&amp;nbsp;(Vanilla&amp;nbsp;JS와&amp;nbsp;비교) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;바닐라&amp;nbsp;JS에서는&amp;nbsp;주간&amp;nbsp;뷰를&amp;nbsp;그릴&amp;nbsp;때마다&amp;nbsp;innerHTML을&amp;nbsp;통째로&amp;nbsp;갈아&amp;nbsp;끼웠지만, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;React에서는&amp;nbsp;todos나&amp;nbsp;selectedDate&amp;nbsp;상태가&amp;nbsp;바뀔&amp;nbsp;때마다&amp;nbsp;개수와&amp;nbsp;스타일만&amp;nbsp;쏙쏙 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;효율적으로&amp;nbsp;다시&amp;nbsp;그려집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;---------------&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &amp;nbsp;현재까지의&amp;nbsp;진행&amp;nbsp;상황&amp;nbsp;요약 &lt;br /&gt;&amp;nbsp;&amp;nbsp;나중에&amp;nbsp;기억나지&amp;nbsp;않으실&amp;nbsp;때를&amp;nbsp;위해&amp;nbsp;제가&amp;nbsp;정리해&amp;nbsp;드릴게요. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.&amp;nbsp;컴포넌트&amp;nbsp;구조화:&amp;nbsp;App,&amp;nbsp;Header,&amp;nbsp;DateNavigator,&amp;nbsp;TodoInput,&amp;nbsp;TodoList, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TodoItem으로&amp;nbsp;분리&amp;nbsp;완료. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.&amp;nbsp;CRUD&amp;nbsp;마이그레이션:&amp;nbsp;생성,&amp;nbsp;조회,&amp;nbsp;수정(인라인),&amp;nbsp;삭제&amp;nbsp;기능&amp;nbsp;완료. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.&amp;nbsp;필터링&amp;nbsp;&amp;amp;&amp;nbsp;날짜:&amp;nbsp;전체/진행중/완료&amp;nbsp;필터&amp;nbsp;및&amp;nbsp;일간&amp;nbsp;뷰(좌우&amp;nbsp;이동)&amp;nbsp;완료. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;4.&amp;nbsp;주간&amp;nbsp;뷰:&amp;nbsp;요일별&amp;nbsp;트랙&amp;nbsp;및&amp;nbsp;날짜별&amp;nbsp;Todo&amp;nbsp;개수&amp;nbsp;표시&amp;nbsp;완료. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;5.&amp;nbsp;카테고리:&amp;nbsp;카테고리&amp;nbsp;추가,&amp;nbsp;삭제(일반으로&amp;nbsp;이관)&amp;nbsp;기능&amp;nbsp;완료. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;6.&amp;nbsp;데이터&amp;nbsp;보존:&amp;nbsp;localStorage&amp;nbsp;연동으로&amp;nbsp;새로고침해도&amp;nbsp;유지됨. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;남은&amp;nbsp;작업:&amp;nbsp;한&amp;nbsp;달&amp;nbsp;치&amp;nbsp;날짜를&amp;nbsp;보여주는&amp;nbsp;달력&amp;nbsp;모달(CalendarModal)의&amp;nbsp;상세&amp;nbsp;로직&amp;nbsp;구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가 기능 구현----------&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 카테고리 별로 Todo와 주간뷰, 월간뷰에서 개수를 볼 수 있도록 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;---------------------------------------&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dateUtils.js는&amp;nbsp;프로젝트&amp;nbsp;내&amp;nbsp;여러&amp;nbsp;곳에서&amp;nbsp;공통으로&amp;nbsp;사용되는&amp;nbsp;날짜&amp;nbsp;관련&amp;nbsp;로직을&amp;nbsp;한데 &lt;br /&gt;&amp;nbsp;&amp;nbsp;모아&amp;nbsp;관리하는&amp;nbsp;유틸리티&amp;nbsp;파일입니다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;왜&amp;nbsp;만들었나요?&amp;nbsp;(필요성) &lt;br /&gt;&amp;nbsp;&amp;nbsp;기존에는&amp;nbsp;App.jsx,&amp;nbsp;DateNavigator.jsx,&amp;nbsp;CalendarModal.jsx&amp;nbsp;등&amp;nbsp;여러&amp;nbsp;컴포넌트에서 &lt;br /&gt;&amp;nbsp;&amp;nbsp;각자&amp;nbsp;동일한&amp;nbsp;날짜&amp;nbsp;포맷팅&amp;nbsp;함수를&amp;nbsp;중복해서&amp;nbsp;정의하고&amp;nbsp;있었습니다.&amp;nbsp;이를&amp;nbsp;한곳으로 &lt;br /&gt;&amp;nbsp;&amp;nbsp;통합함으로써: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.&amp;nbsp;코드&amp;nbsp;중복&amp;nbsp;제거:&amp;nbsp;똑같은&amp;nbsp;코드를&amp;nbsp;여러&amp;nbsp;번&amp;nbsp;쓸&amp;nbsp;필요가&amp;nbsp;없습니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.&amp;nbsp;유지보수&amp;nbsp;용이:&amp;nbsp;날짜&amp;nbsp;표시&amp;nbsp;방식을&amp;nbsp;바꾸고&amp;nbsp;싶을&amp;nbsp;때&amp;nbsp;이&amp;nbsp;파일&amp;nbsp;하나만&amp;nbsp;수정하면 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;모든&amp;nbsp;화면에&amp;nbsp;적용됩니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.&amp;nbsp;일관성:&amp;nbsp;앱&amp;nbsp;전체에서&amp;nbsp;날짜가&amp;nbsp;동일한&amp;nbsp;규칙(형식)으로&amp;nbsp;계산되고&amp;nbsp;표시됨을 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;보장합니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;주요&amp;nbsp;기능&amp;nbsp;(함수&amp;nbsp;설명) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.&amp;nbsp;formatDate(date):&amp;nbsp;Date&amp;nbsp;객체를&amp;nbsp;2026-06-09와&amp;nbsp;같은&amp;nbsp;표준&amp;nbsp;문자열&amp;nbsp;형식으로 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;변환합니다.&amp;nbsp;주로&amp;nbsp;할&amp;nbsp;일&amp;nbsp;데이터를&amp;nbsp;저장하거나&amp;nbsp;비교할&amp;nbsp;때&amp;nbsp;사용합니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.&amp;nbsp;formatDateKorean(date):&amp;nbsp;2026년&amp;nbsp;6월&amp;nbsp;9일&amp;nbsp;(화)와&amp;nbsp;같이&amp;nbsp;사용자가&amp;nbsp;보기&amp;nbsp;편한 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;한국어&amp;nbsp;형식으로&amp;nbsp;변환합니다.&amp;nbsp;화면&amp;nbsp;상단&amp;nbsp;날짜&amp;nbsp;표시에&amp;nbsp;사용됩니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.&amp;nbsp;getMonday(date):&amp;nbsp;특정&amp;nbsp;날짜가&amp;nbsp;속한&amp;nbsp;주의&amp;nbsp;월요일&amp;nbsp;날짜를&amp;nbsp;계산해줍니다.&amp;nbsp;주간 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;뷰(7일&amp;nbsp;단위)를&amp;nbsp;정확하게&amp;nbsp;그리거나&amp;nbsp;주를&amp;nbsp;이동할&amp;nbsp;때&amp;nbsp;핵심적인&amp;nbsp;역할을&amp;nbsp;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--------컴포넌트 구성요소-----&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;UI&amp;nbsp;컴포넌트&amp;nbsp;(src/components/) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Header.jsx:&amp;nbsp;앱의&amp;nbsp;제목과&amp;nbsp;둥둥이&amp;nbsp;캐릭터&amp;nbsp;이미지를&amp;nbsp;표시합니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;DateNavigator.jsx:&amp;nbsp;상단&amp;nbsp;주간&amp;nbsp;7일&amp;nbsp;트랙과&amp;nbsp;일간&amp;nbsp;이동&amp;nbsp;버튼을&amp;nbsp;포함한&amp;nbsp;날짜 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;탐색기입니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;CategoryFilter.jsx:&amp;nbsp;카테고리별로&amp;nbsp;모아볼&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;칩(Chip)&amp;nbsp;형태의&amp;nbsp;필터 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UI입니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;TodoInput.jsx:&amp;nbsp;새로운&amp;nbsp;할&amp;nbsp;일을&amp;nbsp;입력하고,&amp;nbsp;카테고리를&amp;nbsp;추가/삭제하는&amp;nbsp;입력 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;영역입니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;TodoList.jsx:&amp;nbsp;상태&amp;nbsp;필터(전체/진행&amp;nbsp;중/완료)와&amp;nbsp;할&amp;nbsp;일&amp;nbsp;목록,&amp;nbsp;그리고&amp;nbsp;할&amp;nbsp;일이 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;없을&amp;nbsp;때의&amp;nbsp;빈&amp;nbsp;화면을&amp;nbsp;렌더링합니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;TodoItem.jsx:&amp;nbsp;개별&amp;nbsp;할&amp;nbsp;일&amp;nbsp;항목입니다.&amp;nbsp;체크박스,&amp;nbsp;텍스트&amp;nbsp;수정,&amp;nbsp;삭제&amp;nbsp;기능을 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;담당합니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;CalendarModal.jsx:&amp;nbsp;월별&amp;nbsp;달력을&amp;nbsp;보여주는&amp;nbsp;팝업&amp;nbsp;모달입니다.&lt;/p&gt;</description>
      <author>wlsgk7779</author>
      <guid isPermaLink="true">https://wlsgk7779.tistory.com/5</guid>
      <comments>https://wlsgk7779.tistory.com/5#entry5comment</comments>
      <pubDate>Mon, 8 Jun 2026 23:03:46 +0900</pubDate>
    </item>
    <item>
      <title>운영체제 기말내용 정리 (크게크게)</title>
      <link>https://wlsgk7779.tistory.com/4</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 파일시스템&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;● 파일시스템이란 ' 운영체제가 저장장치에 데이터를 저장하고 관리하는 방식 '&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;●&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; 보조기억장치인 디스크를 논리적으로 나눠서 각 파티션마다 파일시스템을 만들 수 있다. (예시 C드라이브 D드라이브)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;●&lt;span&gt; 파일시스템의 구성 : boot block, super block, FCB list, data blocks&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;1. boot block은 패스&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;2. super block은 파일시스템에 대한 메타 정보 저장&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;3. FCB list (inode list) 는 FCB들을 배열로 저장한 것.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;4. Data Blocks는 실제 파일 내용이 저장되는 공간임&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Data blocks에서 파일을 할당하는 3가지 방법&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;1. Contiguous allocation : 연속 할당 방식&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Chained allocation (Linked allocation) : 블록에 다음 블록을 가리키는 포인터를 둬서 연결하는 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. indexed allocation : 한 파일에 대한 블록들의 위치를 저장하는 인덱스 블록을 사용하여 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Free Space 관리하는 4가지 방법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Counting : 빈 블록의 번호와 연속된 길이는 저장. Contiguous allocation 방식과 비슷함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Linked list (free list) : 빈 블록마다 다음 빈 블록을 가리키는 포인터를 둬서 연결하는 방식. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Chained allocation과 비슷함.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;3. Grouping : 인덱스 블록을 사용해서 빈 블록의 위치를 저장하는 방식. indexed allocation과 비슷.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;4. bit vector (bit map) : 각 블록에 대한 할당/비할당 여부를 1비트로 표시하는 배열을 사용하는 방식. 단점은 크기가 너무 커짐.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;2. 파일시스템 예시&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;UNIX의 파일 관리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일의 종류 : 일반파일, 디렉토리, 스페셜파일로 구성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일시스템의 구성 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 부트블록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 슈퍼블록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. inode list (inode table)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. data blocks&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;UNIX에서 Data Blocks을 할당하는 방식 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;indexed allocation 방식을 약간 변형하여 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이유 : 일반적인 indexed 방식은 인덱스 블록 -&amp;gt; 실제 블록 이렇게 두번 이상 접근해야함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;변형 : 각 파일의 FCB에 첫 10개의 블록을 따로 저장한 후, 이후 것들에 대해서는 인덱스 블록에 저장하고, FCB에 인덱스 블록을 저장한다.&lt;br /&gt;&lt;br /&gt;인덱스 블록을 중첩적으로 둬서 큰 파일도 저장할 수 있지만, 그정도로 커질빠에는 나눠서 저장하는 게 좋다.&lt;br /&gt;&amp;gt; 이유는 한 파일이 너무 크면 속도가 느리기에, 나눠서 저장하는게 읽거나 쓰는 것이 빠르기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;리눅스의 Virtual File System&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일시스템은 여러개를 사용할 수가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 사용자 프로그램에서 여러 파일시스템에 대한 조작법을 다 알고 있어야 할까?&lt;br /&gt;&amp;gt; 아니다! VFS를 통해서 일관적인 인터페이스를 제공한다. 사용자 프로그램은 어떤 파일시스템이든 동일한 systemcall을 사용할 수 있게 해주는게 VFS이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;리눅스의 Inode (FCB)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스의 FCB는 Inode라고 부르며, UNIX와 다른 점은 다이렉트로 접근할 수 있는 블록 개수가 10개에서 12개까지 늘어났다는 점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최대 저장 크기도 뭐 8KB (2블록크기) 정도 늘어났을거야.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;3. I/O관리와 디스크 스케쥴링&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 먼저 I/O 디바이스라는건 입출력 장치이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 I/O 장치는 기계파트와 전자파트(컨트롤러)로 이루어져 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨트롤러는 제어 레지스터(명령함), 상태 저장 레지스터, 내부 버퍼 등으로 구성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨트롤러는 폴링이나 인터럽트에 의해 제어된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;I/O시스템의 구성요소는&lt;br /&gt;1. 커널에 있는 I/O management = kernel I/O subsystem&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Device deriver interface&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Device drivers&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디바이스 드라이버 인터페이스는?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OS가 연결가능한 모든 I/O 장치에 대해서 알 필요가 없도록하는 표준 인터페이스!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디바이스 드라이버 인터페이스에게 요청하면 이 녀석이 해당 디바이스 드라이버와 연결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 실제 디바이스에게 명령함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디바이스 드라이버는?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;I/O 장치를 제어하는 기능들의 모음이다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모듈 형식이라 필요할 때만 커널에 올라간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Kernel I/O management의 6가지 기능&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 장치예약 - Device reservation : 장치를 한 가지 프로세스만 사용할 수 있도록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 디바이스 스케쥴링 - Device scheduling : 한 장치에 대해 여러 프로세스가 요청할 때 큐를 통해 순서관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 오류처리 - Error Handling : I/O 처리 과정에서 오류 발생하면 적절히 조치를 취함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 버퍼링 : 장치간 데이터를 전송하는 동안 메모리에 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 캐싱 : 자주 쓰는 데이터를 캐시에 복사본으로 저장 (원본 x)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 스풀링 - Spooling : 출력을 디스크에 대기열로 저장&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;3-1. Interrupt Handling&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶커널로 들어가는 3가지 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Interrupt : 하드웨어 신호&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Trap : CPU가 거는 인터럽트 (소프트웨어 신호)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. System call&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 인터럽트&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터럽트란 장치가 OS에게 비동기적인 이벤트를 알리는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중첩되어 발생하거나 처리가 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어 타입 인터럽트, 키보드 입력, 마우스 입력 등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입 인터럽트가 자주 발생하는 이유 &amp;gt; 더 자주 커널을 실행하기 위해서이다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 CPU는 명령어를 1개 수행한 후에 인터럽트가 걸렸는지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶인터럽트를 처리하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 유저모드라면 모드체인지하여 커널모드로 진입&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 커널스택에 현재 문맥을 저장한다. (레지스터 값 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 인터럽트 핸들러가 누가 인터럽트를 걸었는지 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. IDT(interrupt descriptor table)에서 해당 인터럽트의 ISR을 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 이때 최소한의 일(급한일)만 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 처리 중 인터럽트가 또 발생하면 위 과정을 반복&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 모든 ISR처리가 끝나면 특별코드블록을 실행하여, 남은 부분을 처리하고 ready로 상태를 변경하는 등의 일을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. 스케쥴러를 실행한다. (이때 문맥전환이 일어날 수도, 아니면 기존 프로세스가 계속 실행될수도)&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2. 트랩&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Trap은 CPU가 발생시키는 동기적인 이벤트로 이벤트 발생 시점을 예측할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램 실행 중 특정 명령어에서 Trap이 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트랩의 예시 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 0으로 나누기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 잘못된 명령어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 세그먼테이션 폴트 (허용안된 메모리 접근시도)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* protection fault (읽기 전용인데 쓰려고할때)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; page fault 실행해야할 부분이 메모리에 안 올라와 있을 때.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;page fault를 제외하면 모두 강제 종료 시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트랩의 처리 방식은 인터럽트와 비슷하게 IDT에서 ISR을 실행하여 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;3. 시스템콜&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템콜은 프로세스가 커널 기능을 요청하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부적으로는 인터럽트를 발생시켜 IDT에서 system_call() 이라는 부분으로 들어가고,&lt;br /&gt;그 안에 sys call table에서 요청한 기능을 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;3-2. OS가 I/O 제어하는 3가지 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Polling&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Interrupt Driven I/O&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Direct Memory Access (DMA)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. Polling (=Programmed I/O)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프로그램을 실행함으로써 I/O 상태를 확인하는 방식.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;디바이스 드라이버가 디바이스에게 일을 시키는데,&lt;br /&gt;디바이스의 컨트롤러 부분에 4가지 주요 레지스터가 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. Status register : 디바이스의 상태 저장 (Commend-ready, Busy, Error)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. Control register : 디바이스 드라이버가 어떤 명령을 할 지 저장&lt;br /&gt;3. Data-in register : 장치를 통해 입력할 내용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4. Data-out register : 장치를 통해 출력할 내용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;결국 디바이스 드라이버가 일을 시키고 계속 컨트롤러의 상태 레지스터를 확인하면서&lt;br /&gt;상태 레지스터의 Busy가 1에서 0이 될 때를 기다린다! -&amp;gt; busy waitng 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;I/O가 일찍 끝나는 경우, 문맥전환이 없는 방식이기 때문에 효과적이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;하지만 오래 걸리는 I/O의 경우에는 그동안 CPU가 계속 상태 확인만 하기 때문에 다른일을 할 수 없다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. Interrupt Driven I/O&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;인터럽트를 통해 해당 I/O가 끝났는지 확인하는 방식&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. 유저 프로세스에서 systemcall로 요청하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;polling방식과 똑같이 디바이스 드라이버가 장치에게 명령을 함!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. 그 다음에 프로세스 관리로 넘어가서 해당 프로세스를 block상태로 바꾸고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;문맥전환을 통해 다른 프로세스를 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. 만약 해당 I/O가 끝나면 CPU에게 인터럽트를 건다!&lt;br /&gt;4. CPU는 커널로 들어가 해당 인터럽트를 ISR로 처리하고, 상태를 ready로 바꿔준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;5. 이후 스케쥴러를 실행하여 우선순위에 따라 실행될 프로세스가 결정된다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. Direct Memory Access (DMA) &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;DMA는 위와 좀 다른 성격이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;DMA를 안 쓰면 장치의 결과를 CPU가 직접 레지스터를 통해 메모리로 옮겨야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그러면 CPU가 거기에 시간을 많이 잡아먹기 때문에 다른 일을 할 수가 없다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt; 그래서 이를 대신 해줄 DMA 컨트롤러 라는게 나왔고, CPU는 DMA 컨트롤러에게 대신 메모리에 저장하라고 명령한다.&lt;br /&gt;&lt;br /&gt;이를 통해 CPU는 이 일을 하지 않고 DMA가 입출력 장치 &amp;lt;-&amp;gt; 메모리(RAM) 사이에 데이터를 전달해준다.&lt;br /&gt;그리고 일을 다 하면 다 했다고 CPU에게 인터럽트를 건다!&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;3-3. 디스크 스케쥴링&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;OS의 논리적인 디스크의 최소 단위는 블록이고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;실제 디스크의 물리적인 최소 단위는&amp;nbsp;&lt;b&gt;섹터&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;lt; 디스크 구조 알아보기 &amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;gt; 섹터 : 디스크의 물리적 최소 단위&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;gt; 트랙 : 디스크의 한 줄 (원), 트랙에는 여러 섹터가 있다. 그리고 하나의 디스크 표면에는 여러 트랙이 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;gt; 헤드 : 디스크 면을 읽어서 섹터의 데이터를 읽는다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;gt; 디스크 암 : 디스크를 읽는 팔 역할로, 끝에는 헤드가 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;디스크 드라이버는 논리 블록의 1차원 배열로 주소를 지정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;실제로는 여러 디스크면, 트랙, 섹터들 등 여러 차원으로 구성되지만, 이를 간단하게&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;하나의 배열로 블록 주소를 지정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;섹터 크기 = 블록 크기라고 할때&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. 바깥쪽트랙부터 다 읽고&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. 아랫면도 같은 트랙 읽고&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. 그 아래 디스크의 같은 트랙 읽고 . . 모두 읽으면&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4. 첫 디스크의 하나 안쪽 트랙으로 넘어가서 읽는다! 반복&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위 과정을 배열로 담아서 쓰는거임!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt; 디스크 I/O의 시간 &amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;디스크를 읽거나 쓸 때 걸리는 시간에 대해 알아보자.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. Seek Time : 탐색시간, 헤드가 트랙에 찾아가는 시간 &lt;span style=&quot;color: #ee2323;&quot;&gt;(가장길다)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. Rotational Delay : 회전지연, 헤드에 읽어야할 섹터부분이 회전하며 오는데 걸리는 시간&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. Data Tranfer Time : 실제 데이터 전송이 발생하고, 데이터를 읽거나 쓰는 시간&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;이 중 Seek Time이 성능 차이의 주 원인이 됨!!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;단일 디스크에 대해서 여러 I/O 요청이 발생하는데, 이때 무작위로 선택하면 성능저하가 발생하니&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;디스크 스케쥴링이 필요한 것이다...!!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;lt; 디스크 스케쥴링 방식 3가지 &amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. FIFO : 요청이 들어온대로 접근하기 &amp;gt; &lt;span style=&quot;color: #ee2323;&quot;&gt;랜덤에 가까워서 오래걸림&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. SSTF (Shortest Seek Time First) : 현재 헤드가 있는 부분에서 가장 가까운 트랙을 우선으로 접근하여 처리&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;-&amp;gt;&lt;span style=&quot;color: #ee2323;&quot;&gt; 대신 우선순위를 기반으로 하기 때문에 기아상태 문제 발생 가능&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. SCAN(엘리베이터, LOOK) : 한쪽 방향으로 쭉 이동하면서 처리하기 &amp;gt; &lt;span style=&quot;color: #006dd7;&quot;&gt;기아상태 없어!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;-&amp;gt; 이동 방향에 더이상 읽을 섹터가 없으면 방향을 바꾼다!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt; 디스크 캐시 &amp;gt; = page cache, buffer cache&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램이 같은 블록을 요청할 수 있으니, 최근 불러온 블록을 캐시에 저장하여 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; 캐시가 가득 찰 때 대체하는 방식 &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. LRU - Least Recently Used : 가장 오래된 블록을 버리자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. LFU - 가장 적게 사용된 블록을 버리자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>wlsgk7779</author>
      <guid isPermaLink="true">https://wlsgk7779.tistory.com/4</guid>
      <comments>https://wlsgk7779.tistory.com/4#entry4comment</comments>
      <pubDate>Sun, 7 Jun 2026 22:36:42 +0900</pubDate>
    </item>
    <item>
      <title>[카테캠] 프리코스 2주 1일차 - SQL 조회와 조작</title>
      <link>https://wlsgk7779.tistory.com/3</link>
      <description>&lt;h3 id=&quot;SE-1bb59255-79bb-49c1-8aed-3b6f1dcdba8a&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. SQL 시작하기&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;1-1. SQL이란?&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶ 데이터베이스란?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;여러 사람이 공유해서 사용할 목적으로 통합하여 관리되는 데이터의 모음!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;데이터베이스의 종류에 따라 사용방법이 조금씩 다르지만 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;검색&lt;/span&gt;&lt;/b&gt;과 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;분석&lt;/span&gt;&lt;/b&gt;에 사용되는&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;기본적인 방법은 데이터베이스 종류와 상관없이 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;동일&lt;/b&gt;&lt;/span&gt;하다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶ SQL&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;S&lt;/span&gt;&lt;/b&gt;tructed &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Q&lt;/span&gt;&lt;/b&gt;uery &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;L&lt;/span&gt;&lt;/b&gt;anguage의 약자로&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;데이터베이스에 &lt;span style=&quot;color: #ee2323;&quot;&gt;접근&lt;/span&gt;하고 &lt;span style=&quot;color: #ee2323;&quot;&gt;조작&lt;/span&gt;하기 위한 표준 &lt;span style=&quot;color: #ee2323;&quot;&gt;언어&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶&lt;/span&gt; &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;SQL이 할 수 있는 것&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;1. 데이터 검색&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;2. 데이터 삽입&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;3. 데이터 수정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;4. 데이터 삭제&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;5. 데이터베이스 생성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;6. 테이블 생성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;7. 등&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;1-2. 테이블에서 데이터 검색하기&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶ 관계형 데이터 베이스&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;하나 이상의 테이블로 이루어지며&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;서로 연결된 데이터를 가지고 있음!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;SQL을 통해 제어 가능 !&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶ 테이블의 구성요소&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;475&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmYuvV/dJMcab5r0BO/m6CGFDrOCny5tYOyxSVDak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmYuvV/dJMcab5r0BO/m6CGFDrOCny5tYOyxSVDak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmYuvV/dJMcab5r0BO/m6CGFDrOCny5tYOyxSVDak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmYuvV%2FdJMcab5r0BO%2Fm6CGFDrOCny5tYOyxSVDak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;596&quot; height=&quot;316&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;475&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컬럼 : 주제, 제목 같은 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레코드 : 내용, 값 같은 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶ 테이블에서 데이터를 가져오기&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780074595829&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT : 검색 명령어
FROM : ~로 부터
WHERE : 조건

SELECT 검색대상1, 검색대상2.. FROM 테이블명;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;테이블에서 검색 컬럼에 대한 모든 정보 검색하기 !&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;* 을 통해 모든 컬럼에 대해 정보를 가져올 수 있다 !&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▷&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;DISTINCT&lt;/span&gt;&lt;/b&gt; : 컬럼내용 중복제거 !&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;검색할 컬럼에 대한 내용에 중복이 있을 경우 한가지만 보여준다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;DISTINCT 뒤에 2개 이상의 컬럼을 적으면,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;한 쪽 컬럼에 중복이 있어도 다른 쪽 컬럼의 값이 다르면 다르게 취급 !&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780075243944&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT DISTINCT 제목, 저자 FROM book;

&quot;어린왕자&quot;, &quot;김진하&quot;
&quot;어린왕자&quot;, &quot;황은영&quot;

위 상황처럼 한 쪽 컬럼에 중복이 있어도,
다른 쪽 컬럼의 값이 다르면 다르게 취급 !&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;1-3. 조건을 추가하여 검색하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶ &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;b&gt;WHERE&lt;/b&gt; : &lt;/span&gt;조건을 만드는 방법&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색하고자 하는 데이터의 조건을 설정할 수 있는 명령이다.&lt;/p&gt;
&lt;pre id=&quot;code_1780077400741&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM book WHERE title = '돈키호테';

book 테이블에서 title 속성이 '돈키호테'인 모든 컬럼 검색&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;1-4. 여러 개의 조건 추가하기&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;국어성적이 90점 이상이거나 수학 성적이 80점 초과인 데이터를 검색하는 등,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여러 개의 조건을 검사하여 검색하는 것을 알아보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶비교연산자&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;gt; , &amp;lt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;gt;= , &amp;lt;=&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;=&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;!=&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780087352466&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM score WHERE korean &amp;gt;= 90;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶복합조건 연산자&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;AND, &amp;amp;&amp;amp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;OR, ||&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;NOT, !&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780087449227&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM score WHERE korean &amp;gt;= 90 OR math &amp;gt; 80;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶기타 연산자&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;BETWEEN&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780087588994&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM score WHERE math BETWEEN 80 AND 90;
math에서 80과 90사이에 값 (80과 90도 포함)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IN&lt;/p&gt;
&lt;pre id=&quot;code_1780087644694&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;A IN B
A에서 B에 해당하는 것&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NOT IN&lt;/p&gt;
&lt;pre id=&quot;code_1780087680190&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;A NOT IN B
A에서 B에 없는 것&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;SE-1bb59255-79bb-49c1-8aed-3b6f1dcdba8a&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 데이터를 제어하는 DML&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;2-1. 테이블에서 유사한 값 찾기&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶LIKE : 특정 문자가 포함된 문자열을 찾고 싶을 때 사용하는 명령&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;WHERE 뒤에서 사용할 수 있다!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▷와일드카드 %&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열에서 특정 문자열을 포함하는 것을 찾고 싶을 때 LIKE와 함께 사용한다 !&lt;/p&gt;
&lt;pre id=&quot;code_1780088328644&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM book WHERE title LIKE '어린왕자'; - title에서 '어린왕자'를 찾기
SELECT * FROM book WHERE title LIKE '왕자%'; - title에서 '왕자'로 시작하는 것 찾기
SELECT * FROM book WHERE title LIKE '%왕자'; - title에서 '왕자'로 끝나는 것 찾기
SELECT * FROM book WHERE title LIKE '%왕자%'; - title에서 '왕자'가 들어가는 것 찾기&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;2-2. 데이터 정렬하기&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶ORDER BY : 데이터를 검색할 때 정렬하여 결과를 추출하는 명령어&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;WHERE을 쓰는 자리에 ORDER BY를 쓴다!&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780089123409&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM score ORDER BY math DESC; - 수학 과목을 기준으로 내림차순 정렬
SELECT * FROM score ORDER BY math ASC; - 수학 과목을 기준으로 오름차순 정렬&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;2-3. 테이블에 데이터 삽입하기&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶INSERT INTO : 테이블에 새 데이터 삽입하기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1780089636232&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;INSERT INTO book(id, title, author, publicher)
VALUES('3', '햄릿', '윌리엄 셰익스피어', '엘리스 출판');

INSERT INTO book  --( )를 안 적을 경우 정의한 순서대로 데이터 넣으면 됨 !
VALUES('3', '햄릿', '윌리엄 셰익스피어', '엘리스 출판');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>카테캠</category>
      <author>wlsgk7779</author>
      <guid isPermaLink="true">https://wlsgk7779.tistory.com/3</guid>
      <comments>https://wlsgk7779.tistory.com/3#entry3comment</comments>
      <pubDate>Sat, 30 May 2026 06:23:12 +0900</pubDate>
    </item>
    <item>
      <title>[카테캠] 프리코스 1주 5일차 - DB와 SQL 기초</title>
      <link>https://wlsgk7779.tistory.com/2</link>
      <description>&lt;h3 id=&quot;SE-1bb59255-79bb-49c1-8aed-3b6f1dcdba8a&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 데이터베이스 소개&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;데이터 : 현실 세계에서 수집된 단순한 사실과 값&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;정보 : 데이터를 특정 목적에 의해 해석하거나 가공한 형태&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶&lt;/span&gt;데이터베이스의 정의&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;데이터들의 집합.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;한 조직 안에서 여러 사용자와 응용 프로그램이 &lt;span style=&quot;color: #ee2323;&quot;&gt;공동&lt;/span&gt;으로 사용하는 데이터들을&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;통합&lt;/span&gt;하여 &lt;span style=&quot;color: #ee2323;&quot;&gt;저장&lt;/span&gt;하고 &lt;span style=&quot;color: #ee2323;&quot;&gt;운영&lt;/span&gt;하는 데이터&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶데이터베이스의 필요성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;파일처리 시스템 : 각 프로그램이 &lt;b&gt;자기만의 파일을 직접 만들어서&lt;/b&gt; 데이터를 저장하고 관리하는 방식&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▷&lt;/span&gt; 파일처리 시스템의 한계&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- 데이터 종속의 문제 : 데이터의 구조가 바뀌면 그걸 사용하는 응용 프로그램의 구조도 바뀌어야 함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- 데이터 중복의 문제 : 응용 프로그램 별로 데이터를 생성할 수도 있는데 이때 데이터가 중복될 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- 데이터 무결성 문제 : 중복으로 저장되어 있으니, 김민준 이라는 학생의 정보가 바뀌면 모두 바꿔줘야함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶데이터베이스의 특징&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- 실시간 접근성 : 사용자가 원할 때 언제든지 접근가능해야함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- 지속적인 변화 : 데이터 삽입, 삭제, 갱신을 통해 최신 데이터를 유지해야함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- 동시 공유 : 여러 사용자가 동시에 이용할 수 있어야 함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- 내용에 대한 참조 : 데이터가 저장된 물리적 위치가 아닌 값을 가지고 검색할 수 있어야 함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;SE-1bb59255-79bb-49c1-8aed-3b6f1dcdba8a&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 데이터베이스의 종류&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶RDB와 NoSQL&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;RDB와 NoSQL의 핵심적인 차이는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&quot;관계&quot;&lt;/span&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▷RDB (Relational DataBase) :&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- 관계형 모델을 기반으로 SQL을 이용해 데이터를 관리함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▷NoSQL (Not only SQL) :&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- 데이터 간 관계를 정의하지 않고, 그래서 RDB보다는 유연한 모델을 이용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶관계형 데이터베이스 (RDB)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- 데이터를 행과 열을 가지는 테이블로 표현한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- 테이블 간의 관계를 이용해서 데이터를 효과적으로 관리해 무결성을 보장&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;- 정의된 테이블(스키마)에 맞게 데이터가 삽입되므로 데이터의 안정성을 보장&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;- 데이터의 구조가 일관적인 경우에 주로 사용한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▷RDBMS(Relational Database Management System)의 종류&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;RDBMS란 관계형 데이터베이스 관리 시스템으로 MySQL, PostgreSQL, MariaDB 등이 있음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶NoSQL&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- 데이터를 저장할 수 있는 유형의 제한이 없음!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- 새로운 유형의 데이터를 추가하기가 용이&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- 데이터의 구조가 일관적이지 않고 자주 변경되는 경우 적합&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- 대용량의 데이터(이미지, 동영상 등)를 더 빠르게 처리할 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▷NoSQL의 종류&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;MongoDB, Redis, Apache Cassandra 등이 있음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;SE-1bb59255-79bb-49c1-8aed-3b6f1dcdba8a&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 관계형 데이터베이스 만들기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶&lt;/span&gt; &lt;/span&gt; 구성요소&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;583&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctll5U/dJMcagMubH2/a3BkDbt1ctH5np7znkbsY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctll5U/dJMcagMubH2/a3BkDbt1ctH5np7znkbsY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctll5U/dJMcagMubH2/a3BkDbt1ctH5np7znkbsY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fctll5U%2FdJMcagMubH2%2Fa3BkDbt1ctH5np7znkbsY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;583&quot; height=&quot;276&quot; data-origin-width=&quot;583&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶ 관계&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;867&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIJltz/dJMcagMubJH/BBEJYqrcK5VlOD82qG05h0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIJltz/dJMcagMubJH/BBEJYqrcK5VlOD82qG05h0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIJltz/dJMcagMubJH/BBEJYqrcK5VlOD82qG05h0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIJltz%2FdJMcagMubJH%2FBBEJYqrcK5VlOD82qG05h0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;616&quot; height=&quot;288&quot; data-origin-width=&quot;867&quot; data-origin-height=&quot;405&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배달 앱 같은 곳에서 주문번호는 계속해서 생겨나는데 고객의 이름이나 ID는 거의 바뀌지 않음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 ID 이름 주소와 함께 주문번호도 같이 저장한다면 ID, 이름, 주소는 주문번호가 생길 때마다 중복해서 생겨남.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이를 ID라는 하나의 속성으로 테이블을 연결해서 효과적으로 관리할 수 있다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶ SQL을 통한 테이블 관리 알아보기 !&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▷ SQL 작성 규칙&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b12Eh5/dJMcadhTPIN/bKf7kLSVGZrgvx1AuRA2d1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b12Eh5/dJMcadhTPIN/bKf7kLSVGZrgvx1AuRA2d1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b12Eh5/dJMcadhTPIN/bKf7kLSVGZrgvx1AuRA2d1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb12Eh5%2FdJMcadhTPIN%2FbKf7kLSVGZrgvx1AuRA2d1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;585&quot; height=&quot;220&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▷ 테이블 정의하기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;b&gt;CREATE TABLE 테이블명 ( 속성 1 데이터타입 1, 속성 2 데이터타입 2, ...);&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779981020386&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE customer(
    id      VARCHAR(10),
    name    VARCHAR(10),
    address VARCHAR(30)
);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▷ 정의한 테이블 확인하기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;b&gt;SHOW TABLES;&lt;/b&gt; - 생성된 모든 TABLE을 확인하기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;b&gt;DESC 테이블명;&lt;/b&gt; - 특정 테이블에 대한 정보를 확인하기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1779980965353&quot; class=&quot;sql&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;-- 현재 데이터베이스에 있는 모든 테이블 목록 보기
SHOW TABLES;

-- customer 테이블의 구조 보기 (컬럼명, 타입, 제약조건 등)
DESC customer;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▷ 데이터 삽입하기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; INSERT INTO&lt;/b&gt; 테이블명 ( 속성1, 속성2, ...) &lt;b&gt;VALUES&lt;/b&gt;( 속성값1, 속성값2, ...);&lt;/p&gt;
&lt;pre id=&quot;code_1779981335837&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;INSERT INTO customer (id, name, address)
VALUES('kmax6', '김민준', '서울시 관악구 신림동');

-- 속성의 순서는 중요하지 않음
INSERT INTO customer (name, address, id)
VALUES('이서연', '서울시 동작구 대방동', 'flykite');

-- 모든 속성을 순서대로 입력하는 경우 속성 목록은 생략 가능
INSERT INTO customer
VALUES('freeman123', '박서준', '서울시 관악구 신림동');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;* 속성을 정의한 순서와 관계없이 새로운 순서를 인자로 받아 VALUES 순서와 매치해주면 된다!&lt;br /&gt;* 모든 속성에 대해 추가를 할 것이면 ( )를 적지 않고 테이블명만 적은 후 VALUES에 정의한 순서대로 값을 넣어주면 된다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▷ 데이터 출력하기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; SELECT&lt;/b&gt; 속성 1, 속성 2, ... &lt;b&gt;FROM&lt;/b&gt; 테이블명;&lt;/p&gt;
&lt;pre id=&quot;code_1779981623578&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT id, name, address FROM customer;

-- 출력하고 싶은 속성 조정 가능
SELECT address, name FROM customer;

-- &quot;*&quot;을 이용해 모든 속성 출력 가능
SELECT * FROM customer;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶ 데이터베이스 정의어, 조작어, 제어어&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;관계형 데이터베이스를 활용하기 위해 사용하는 표준 언어로 아래와 같은 것들이 있다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt; 데이터 정의어(DDL, Data Definition Language) : 테이블과 같은 데이터 구조 정의&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;데이터 조작어(DML, Data Manipulaion Language) : 데이터 조회 및 탐색&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;데이터 제어어(DCL, Data Control Language) : 데이터베이스에 접근하는 권한 관리&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▷&lt;/span&gt; 데이터 정의어에 대해 알아보기&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;0. 먼저 데이터 타입에 대해 알아보자.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D2l9H/dJMb997CewG/HFV1S31kio7LAYP4n7Zhpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D2l9H/dJMb997CewG/HFV1S31kio7LAYP4n7Zhpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D2l9H/dJMb997CewG/HFV1S31kio7LAYP4n7Zhpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD2l9H%2FdJMb997CewG%2FHFV1S31kio7LAYP4n7Zhpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;552&quot; height=&quot;246&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;이 외에도 TINYINT, BIGINT, TIME, DATE 등이 있음!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;자료형은 DBMS마다 차이가 있을 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;1. 테이블 정의하기&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779982195989&quot; class=&quot;sql&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;CREATE TABLE customer(
    id      VARCHAR(10),
    name    VARCHAR(10),
    address VARCHAR(30)
);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 테이블 수정하기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779982361967&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 컬럼 추가
ALTER TABLE customer ADD COLUMN birthday DATE NULL;
-- 컬럼 수정
ALTER TABLE customer MODIFY COLUMN id varchar(15) NULL;
-- 컬럼 이름 변경
ALTER TABLE customer CHANGE COLUMN name korean_name varchar(10) NOT NULL;
-- 컬럼 삭제
ALTER TABLE customer DROP COLUMN address;
-- 테이블 이름 변경
ALTER TABLE customer RENAME member;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;span style=&quot;color: #ee2323;&quot;&gt;주의해야 할 점&lt;/span&gt;은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;MODIFY, CAHNGE&lt;span style=&quot;color: #000000;&quot;&gt; 는&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;한 속성에 대해 새로 정의하는 느낌이라 속성의 한가지만 바꿔도 다른 것들도 다시 정의를 해줘야한다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;(NULL / NOT NULL 명시 안 하면 기본값 NULL 적용됨)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* MODIFY는 이름을 제외한 속성의 내용을 바꿀 때 사용하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* CHANGE는 속성의 이름까지 바꿀 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 테이블 삭제하기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779982817385&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DROP TABLE 테이블명&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;SE-1bb59255-79bb-49c1-8aed-3b6f1dcdba8a&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. 데이터베이스 구성하기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶ 제약 조건&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;제약조건이란 &quot;테이블에 잘못된 데이터가 입력되는 것을 방지하기 위한 규칙&quot;으로&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;제약조건을 통해 무결성을 지킬 수 있음.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;-&amp;gt; 한마디로 속성에 대한 값에 올 수 있는 조건을 걸어 제약을 두는 것 !&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▷ NOT NULL&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;널(NULL) 값을 비허용하는 것&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;아무 데이터도 입력하지 않으면 에러 발생&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;NOT NULL을 명시하지 않으면 기본적으로 NULL 허용이다!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779986083350&quot; class=&quot;sql&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;id VARCHAR(16) NOT NULL&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▷ UNIQUE&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;한 테이블에서 중복되는 속성 값을 가지는 것을 비허용하는 것&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;한 속성에 대해 같은 값이 존재하면 에러 발생&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;*NULL 값은 비교가 불가능하므로 중복되어도 됨&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779986125009&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;id VARCHAR(10) UNIQUE&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▷ DEFAULT&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;아무 값도 들어오지 않았을 때의 기본 값을 지정할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779986165237&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;id VARCHAR(16) DEFAULT '기본값'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▷ CHECK&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;들어올 수 있는 값의 범위를 제한하여 특정 값만 허용하는 것&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;제한한 값이 아닐 경우에 에러 발생&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779986211018&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;age INT CHECK(age&amp;gt;19)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;---------------------------------------------------------------------&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶ 제약 조건 정의 (CONSTRAINT)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;속성을 정의할 때 붙이는 것과 다른 방법으로 CONSTRAINT를 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;CONSTRAINT를 사용하면 해당 제약조건의 이름을 정할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;사용법 :&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;CONSTRAINT&amp;nbsp;제약조건이름&amp;nbsp;제약조건&amp;nbsp;(적용할&amp;nbsp;속성)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779986520260&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--테이블 정의하는 부분 안에 사용 'CONSTRAINT 제약조건이름 제약조건 (적용할 속성)'
CREATE TABLE customer(
    id	VARCHAR(10),
    age INT,
    CONSTRAINT id_unique UNIQUE (id),
    CONSTRAINT age_check CHECK (age&amp;gt;=10)
);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶ 제약 조건 추가&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;제약 조건을 추가할 수 있다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;사용법:&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건이름 제약조건 (적용할 속성);&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;**DEFAULT 제약조건수정은 조금 다르다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;ALTER TABLE ALTER 속성 SET DEFAULT 기본값;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779986795226&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ALTER TABLE customer
ADD CONSTRAINT address_unique UNIQUE (address);

ALTER TABLE customer
ADD CONSTRAINT customer_chk_2 CHECK (age &amp;gt;= 19 AND name = '김민준');

ALTER TABLE customer
ALTER address SET DEFAULT '주소 없음';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶ 제약 조건 삭제&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;사용법 :&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건이름;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;DEFAULT 제약 조건 삭제 :&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;ALTER TABLE 테이블명 ALTER 속성 DROP DEFAULT;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779986964384&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ALTER TABLE customer DROP CONSTRAINT customer_chk_2;

ALTER TABLE customer
ALTER address DROP DEFAULT;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;SE-1bb59255-79bb-49c1-8aed-3b6f1dcdba8a&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5. 데이터베이스의 키&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶ 키란?&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;b&gt;조건에 만족하는 튜플을 찾거나, 정렬할 때 기준이 되는 속성&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;b&gt;- &lt;span style=&quot;color: #006dd7;&quot;&gt;기본키&lt;/span&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;b&gt;- &lt;span style=&quot;color: #8a3db6;&quot;&gt;외래키&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;- 후보키 : 기본키가 될 수 있는 키로 유일성과 최소성(최소한의 속성)을 만족&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;- 대체키 : 후보키지만 기본키가 아닌 키&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;- 슈퍼키 : 튜플을 식별할 수 있는 유일성은 만족하지만 최소성은 만족하지 않는 키&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▷&lt;span style=&quot;color: #006dd7;&quot;&gt;기본키&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;b&gt;서로 다른 튜플을 유일하게 식별할 수 있는 기준이 되는 속성&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;- 중복되는 값을 가질 수 없음 (UNIQUE)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;- 널 값을 가질 수 없음 (NOT NULL)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;- 한 테이블 당 1개만 설정 가능하다 !&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7i2ha/dJMcac4j4zO/n3wabXpO497su5kqGaFqyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7i2ha/dJMcac4j4zO/n3wabXpO497su5kqGaFqyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7i2ha/dJMcac4j4zO/n3wabXpO497su5kqGaFqyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7i2ha%2FdJMcac4j4zO%2Fn3wabXpO497su5kqGaFqyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;397&quot; height=&quot;192&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;192&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위 표의 경우 이름과 주소는 중복될 수 있으므로 ID가 기본키로 가장 적합하다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▷&lt;span style=&quot;color: #8a3db6;&quot;&gt;외래키&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;다른 테이블의 기본키를 참조하는 속성으로 테이블의 관계를 정의&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- 참조되는 테이블의 기본키에 없는 값은 지정할 수 없다! (NULL은 가능)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- 기본 키와 다르게 2개 이상의 값을 가질 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWfuH6/dJMcabRRdQG/mnu5v0cQ8qb53UrOuqrzRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWfuH6/dJMcabRRdQG/mnu5v0cQ8qb53UrOuqrzRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWfuH6/dJMcabRRdQG/mnu5v0cQ8qb53UrOuqrzRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWfuH6%2FdJMcabRRdQG%2Fmnu5v0cQ8qb53UrOuqrzRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;470&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;470&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;왼쪽 표에서 ID가 기본키라고 가정할 때,&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;오른쪽 표에서 ID가 기본키를 참조하는 외래키가 될 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▷SQL로 키를 지정하는 법&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;기본키 설정 : PRIMARY KEY&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;외래키 설정 : FOREIGN KEY (외래키로 만들 속성) REFERENCES 참조되는 테이블(참조되는 속성)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779993779685&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE customer(
    id      VARCHAR(10) PRIMARY KEY,
    name    VARCHAR(10),
    address VARCHAR(30)
);

CREATE TABLE order_history(
    customer_id VARCHAR(10),
    order_id    VARCHAR(14),
    FOREIGN KEY (customer_id) REFERENCES customer(id),
    CONSTRAINT order_history_pk PRIMARY KEY (customer_id, order_id)
);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에서 보이듯이 CONSTRAINT를 통해 기본키를 등록할 수 있는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;기본키에 대한 속성으로 2개&lt;/b&gt;&lt;/span&gt;를 넣는 모습을 볼 수 있음 !!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &amp;gt; 고객ID와 주문ID가 있는 경우, 같은 고객에 대해서 많은 주문 ID가 생길 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &amp;gt; 이 경우 고객ID만으로는 특정 튜플을 식별할 수 없음 !!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &amp;gt; 그래서 주문ID까지 기본키로 설정해야 특정 튜플을 식별 가능하다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▷ 무결성 제약 조건 : &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;데이터가 올바르고 일관되게 유지되도록 강제하는 규칙 !&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- 개체 무결성 : 기본키는 널 값과 중복된 값을 가질 수 없음&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- 참조 무결성 : 외래키는 &lt;span style=&quot;color: #ee2323;&quot;&gt;널&lt;/span&gt;이거나 참조되는 릴레이션의 기본키 값과 동일&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;(고객ID라는 기본키를 참조하지만, &lt;span style=&quot;color: #ee2323;&quot;&gt;비회원인 경우 고객ID가 NULL&lt;/span&gt;일 수 있으니 허용)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;------------------------------------------------------------------------------------------------------------&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- 도메인 무결성 : 특정 속성값은 그 속성이 정의된 도메인에 속한 값이어함&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- NULL 무결성 : 특성 속성값은 널 값을 가질 수 없음&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- 고유 무결성 : 각 튜플이 가지는 속성값들은 서로 달라야 함 (모두 같으면 안됨)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- 키 무결성 : 테이블에 최소 한 개 이상의 키가 존재&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;SE-1bb59255-79bb-49c1-8aed-3b6f1dcdba8a&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6. 데이터 모델링&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;현실 세계에 존재하는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;데이터를 데이터베이스화 하는 과정&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶ 데이터 모델과 구성요소&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;현실 세계의 데이터를 단순화, 추상화하여 표현한 모델&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- 개체(Entity) : 데이터로 표현하고자 하는 현실 세계의 개념이나 정보의 단위 (ex. 킥보드, 회원) - 명사로 생각하기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- 속성(Attribute) : 개체에 대한 정보 (ex. 킥보드의 브랜드/이용가격, 회원의 아이디/이름)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- 관계(Relationship) : 개체 간의 연관성 (ex. 고객은 킥보드를 대여한다) - 동사로 생각하기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶ 데이터 모델링 과정&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;개념적 설계&amp;nbsp; &amp;gt; 논리적 설계 &amp;gt; 물리적 설계&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- 개념적 설계 : &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;현실 세계를 추상적 개념으로 표현하는 과정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;사람이 이해하기 쉽게 추상적으로 표현( 고객 --주문한다--&amp;gt; 상품)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- 논리적 설계 : &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;DBMS가 처리할 수 있는 데이터 구조(스키마)를 설계&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;실제 DB로 저장할 구조로 표현 ( 고객(id, 이름, 주소), 주문(주문번호, 고객id, 상품id) 등)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;br /&gt;- 물리적 설계 : &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;DBMS에 테이블을 저장할 구조를 설계&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 컴퓨터에 어떻게 저장될지 표현 &amp;rarr; 파일 구조, 인덱스 등 실제 저장 방식&lt;/p&gt;</description>
      <category>카테캠</category>
      <author>wlsgk7779</author>
      <guid isPermaLink="true">https://wlsgk7779.tistory.com/2</guid>
      <comments>https://wlsgk7779.tistory.com/2#entry2comment</comments>
      <pubDate>Fri, 29 May 2026 00:52:13 +0900</pubDate>
    </item>
    <item>
      <title>[카테캠] 프리코스 1주 2일차 - 비동기와 테스트</title>
      <link>https://wlsgk7779.tistory.com/1</link>
      <description>&lt;div id=&quot;SE-8abba7eb-9841-4ae2-9ecc-6f1efd7b0f62&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-1bb59255-79bb-49c1-8aed-3b6f1dcdba8a&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 비동기 입문 - 개념과 문법&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-d889d0af-4116-47d3-9337-8e698d6b74ea&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;비동기 프로그래밍 : 하나의 작업이 응답을 기다리는 동안, 다른 작업을 먼저 진행하는 것&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7857939c-22f6-4871-b0cc-c4e8ee2747d2&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;비동기&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;는 단일 쓰레드에서 이루어지며&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; I/O 대기를 최소화&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 하는 방법&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-eb0066e3-81e1-4d33-825f-a17fde23e6b5&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;비동기는 동시에 여러 연산을 하는 것이 아니라, 대기 상태에 빠진 작업이 다른 작업에게 실행 권한을 양보하는 구조&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-03f1e40d-5820-4c2b-8016-abd05114c8df&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e122e7f5-0d82-4554-a806-cc455ff38eb0&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;비동기 프로그래밍을 하려면 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;asyncio 패키지&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;를 import 해야한다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-8f359ce8-10ab-4e97-bc55-4cb4649019d9&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yHWRK/dJMcadWnGBY/AtfJKeOZsILoTxAlACEgaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yHWRK/dJMcadWnGBY/AtfJKeOZsILoTxAlACEgaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yHWRK/dJMcadWnGBY/AtfJKeOZsILoTxAlACEgaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyHWRK%2FdJMcadWnGBY%2FAtfJKeOZsILoTxAlACEgaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;822&quot; height=&quot;192&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;192&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-5c8c3aaa-a6bf-4ed0-a682-8fde5acffcac&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;asyncio 패키지를 통해 할 수 있는 것들&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-93a9e291-74ab-4195-98a7-c41dae1bc0b3&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-bff5a8cd-bd2b-4805-b474-609dedabd0b3&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷코루틴 : 비동기로 동작하는 함수&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f6aa7023-d653-4236-ba86-2785b61c7a4a&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;태스크 : 루프에 예약되어 실행 대기 중인 작업&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-cd5dc5d5-f538-4282-882f-5491452462ab&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;루프 : 모든 비동기 작업을 지휘하는 중앙 엔진&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2ac60ef7-3fc6-4130-9732-9f59976d1169&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-03eb885e-7546-4b78-b704-ce6af359103f&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷비동기 함수 :&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e1bf5301-680e-488d-af71-a8c1360f28bb&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;async def로 정의할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f7ab71f3-bbff-4b0f-8707-e1158a4de8d9&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;비동기 함수를 호출하면 실행되는 것이 아닌, 비동기적으로 실행될 수 있는 상태인 코루틴을 반환&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-52586e9c-3f0d-4fb8-af7b-c7b6e10942f4&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2dc1c88e-647f-473b-b429-d1f62d0b0dfe&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷await :&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9359ef3d-1e6f-4156-8347-b7a0f26d6907&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;작업이 끝날 때까지 기다리되, 다른 작업이 있으면 먼저 하라는 의미&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9517b5df-357b-40c6-8345-456bebda4372&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 반드시 async def 로 정의된 비동기 함수 안에서만 사용할 수 있다&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-24fd0a64-42eb-4089-b50c-632468a44121&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기다릴 수 있는 대상 (비동기 처리 가능 대상이나 Awaitable 객체) 앞에 붙일 수 있다&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0b87a7c3-1eb2-4716-887c-1997eb9e7c31&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e7bfeaa1-fe0b-413d-a170-c64750ee8c4d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷asyncio.run(코루틴) :&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-173503dc-df4b-45ee-8e58-2013f73b2c75&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;새로운 이벤트 루프를 생성하여 코루틴을 실행하고 루프를 종료한다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d4bcd37c-045a-4a88-b8b2-4ba2081dec30&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;프로그램에서 딱 한 번만 호출한다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-82418b28-c54f-43e6-acc6-d6d0e0fe5b13&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이미 루프가 실행 중이면 런타임에러 발생&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a42b1637-a7bc-4b7a-8b90-7297b04bde7e&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f8ec49a5-688b-418c-866a-8f29aaef45a5&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷create_task :&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5571fc42-2140-4309-a86c-4b94ee39e5dc&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;코루틴을 태스크 객체로 감싸서 이벤트 루프에 즉시 실행을 예약한다&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-44f17b54-c25e-4eab-8ef3-c241beab159a&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;명시적으로 await를 호출하여 기다리지 않아도 루프에 여유가 생기면 백그라운드에서 실행&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0ffd5348-e647-4d66-880a-4d61c3f214b4&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;태스크의 생성은 task = asyncio.create_task(코루틴) 으로 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b50ca1fd-566e-47b0-9154-6b0b3941deaf&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;await와 달리 해당 코루틴 동작을 멈추지 않고 아래 문장을 쭉 실행하게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b52b93c2-1775-4c09-9962-13abd4d2e78e&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또한 실행한 task에 반환값이 있다면 r = await task로 반환값을 기다려 받을 수 있고,&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c25071ef-662a-4851-b025-1acbd61bb074&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;만약 이미 task 실행이 완료된 상태라면 바로 반환값이 나오게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-76559fa2-3839-4a98-88e1-6f241f8e1e7e&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4cf6dcaf-cc7a-4590-bc0b-58012314b2bd&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷await asyncio.sleep() :&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-50f9cf26-4528-4003-9f7f-c444381b37da&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 문구는 time.sleep() 과 다르게 해당 쓰레드 동작이 멈추지 않고, 이벤트 루프에게 제어권을 넘겨줘&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7b77479d-9003-47e2-bd0a-bbdab963168a&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이벤트 루프가 다른 task를 실행할 수 있도록 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-02cb1ff6-8d11-4c7b-83b3-e9978d808805&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-4d8db60d-d5a5-4998-b675-7d1fd550610c&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnBM33/dJMcadouLqh/4odvmdrWuFe68xKnvDhkf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnBM33/dJMcadouLqh/4odvmdrWuFe68xKnvDhkf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnBM33/dJMcadouLqh/4odvmdrWuFe68xKnvDhkf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnBM33%2FdJMcadouLqh%2F4odvmdrWuFe68xKnvDhkf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;822&quot; height=&quot;398&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;398&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-79058eda-3527-4f05-ad56-5b78d32e239a&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-19717472-3069-4677-9abd-0c1ab90db62b&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;SE-506186bb-d7e9-446e-ad53-97d0c6b81fe5&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 동시처리 극대화&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-765228f1-d130-43cd-bc8c-abdc70251504&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여러 개의 독립적인 비동기 작업을 한 번에 묶어서 실행하는 것&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c545490b-a82e-4e1c-a3ad-15cb5a51261b&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;전체 실행 시간은 가장 오래 걸리는 단일 작업의 시간과 동일하다&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f554dc93-9325-48ad-9eab-36b0e8117382&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e64eb7ec-45d2-4769-84a1-9bf6125a9c13&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▶첫 번째 방법 : gather() - 결과를 한 번에 모으는 수집가&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2739f695-e4bf-491c-a6c3-95c44802c033&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7282a0ed-3fb8-456c-8fa2-86787ece6e10&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷asyncio.gather()을 사용하면 여러 코루틴을 한 번에 실행한다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-fd74da58-1ff5-43a7-987c-c7cf9d41e7a1&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷모든 작업이 끝나면 그 결과들을 리스트 형태로 모아서 반환&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-961a28b6-524e-4502-a6ef-01ecf4ca69c0&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷단, 이전 작업의 결과가 다음 작업에 필요한 경우(의존성이 있는 경우) 순차 실행을 해야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b8eefe33-1129-4798-b3bd-d4a048c1d158&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷gather()은 인자로 받은 코루틴들을 동시에 실행하고 전부 끝나면 리스트로 결과를 수집하는데,&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ed197b2f-edfa-419b-a18c-face7e38ae77&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이때 결과 리스트는 실행한 순서를 보장한다. (호출한 순서대로 결과를 저장)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-071e8637-bf8b-42b0-88ef-005dcecdb948&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷어떤 task에서 오류가 발생하면 나머지는 그냥 실행함&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-c8869350-2efa-4e6e-a471-5c1efbb5d847&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;163&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bV0C7r/dJMcadouLqb/bYCjapHATSXO8MXkTgaVC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bV0C7r/dJMcadouLqb/bYCjapHATSXO8MXkTgaVC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bV0C7r/dJMcadouLqb/bYCjapHATSXO8MXkTgaVC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbV0C7r%2FdJMcadouLqb%2FbYCjapHATSXO8MXkTgaVC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;346&quot; height=&quot;163&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;163&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-ee1e6f81-a00a-486b-bd2d-cdf63fcd5507&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;gather() 사용 예시&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-71664fbc-8097-41f0-8aa6-01b2e1fb8ff8&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-e82b60d9-3d0b-4e63-8e78-36e73701eb62&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-caf763d1-a946-46b6-9706-cd0082b02f0b&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▶두 번째 방법 : TaskGroup() - 안전한 울타리를 제공하는 관리자&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-1c4e9582-f153-448b-9874-ed71754c3257&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-38c954c9-57e9-4584-9352-144b64c07837&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷관련된 작업들을 하나의 그룹으로 묶어 더 안전하게 생명주기 관리&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-173218a1-fb48-4870-b33c-957800b65e2a&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷모든 작업이 완료될 때까지 기다리고, 예외 발생 시 모든 작업을 안전하게 취소한다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4e074a5d-ffc8-4637-aa1a-b9a330ff3d98&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷모든 예외를 ExceptionGroup으로 묶어서 발생시키고 except* 문법으로 타입별 분리 처리&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f2c54aea-eb94-4a71-a5c4-664c239de0e5&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷async with asyncio.TaskGroup() as tg : 와 같이 async with 구문을 사용해야함! &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-1745db95-f14c-47cf-b69d-ab4312793dd2&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷task에 대한 결과 값은 개별적으로 t1.result(), t2.result()로 조회할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-97bedce2-374c-4c0e-9d56-55cf86708a74&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;357&quot; data-origin-height=&quot;147&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZRdgB/dJMcabRMnkS/OgYr7IiznAWbMIYbefrsMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZRdgB/dJMcabRMnkS/OgYr7IiznAWbMIYbefrsMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZRdgB/dJMcabRMnkS/OgYr7IiznAWbMIYbefrsMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZRdgB%2FdJMcabRMnkS%2FOgYr7IiznAWbMIYbefrsMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;357&quot; height=&quot;147&quot; data-origin-width=&quot;357&quot; data-origin-height=&quot;147&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-e5e452b4-367d-4f03-a60a-5c511d0c161b&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;TaskGroup() 사용 예시&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-7da101d2-ca0a-4468-9d8d-d52b14a4f792&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wi6EP/dJMcabRMnkT/1GEgJfEO1zD1ajK1NVa9AK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wi6EP/dJMcabRMnkT/1GEgJfEO1zD1ajK1NVa9AK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wi6EP/dJMcabRMnkT/1GEgJfEO1zD1ajK1NVa9AK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwi6EP%2FdJMcabRMnkT%2F1GEgJfEO1zD1ajK1NVa9AK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;662&quot; height=&quot;296&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-4d727be3-78d6-411d-bd57-2db02fcd835e&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;except* 을 이용한 예외그룹 처리 예시&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-d25dafbf-bbb0-4955-8dcb-d4c5a0c3b233&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-b13b9224-73c5-4cad-85dc-5980f6c2307e&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-35913f50-b85d-4679-bcd0-2fb34472c701&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▶ asyncio.gather()와 asyncio.TaskGroup() 비교&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-f792cabd-b593-4d3c-83c7-a9d080afdbe0&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;785&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YX2uB/dJMcadouLqd/eDJmTYdr0PLSEEpVaxNy1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YX2uB/dJMcadouLqd/eDJmTYdr0PLSEEpVaxNy1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YX2uB/dJMcadouLqd/eDJmTYdr0PLSEEpVaxNy1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYX2uB%2FdJMcadouLqd%2FeDJmTYdr0PLSEEpVaxNy1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;785&quot; height=&quot;387&quot; data-origin-width=&quot;785&quot; data-origin-height=&quot;387&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-7ca0158d-7183-4255-8adb-d8b1aacc9108&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-b3089a1d-7ea5-4e72-8c33-a033b8ebe0b2&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;SE-0826a8fc-7904-481b-b822-1544600e1a9b&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 안정적인 비동기 : 예외와 타임아웃&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-31bdefb7-ec18-4bf0-8448-df26ec01903c&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;단일 코루틴에서는 비동기도 익숙한 try/except가 동일하게 적용됨!&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8923fe13-0b52-4b48-b2f7-e391f0d0c92b&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 여러 작업을 동시에 gather() 등으로 실행한다면 어떻게 될까?&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3bb171a1-0272-4836-9a47-8745bb5a3179&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-750c7e91-4424-421d-946a-9db106a89c15&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▶gather()에서의 예외&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a13c87b5-bbb7-4ea0-9f96-e0af9489cc86&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷먼저 asyncio.gather의 기본 동작은 예외 전파이다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a29d38a3-f061-4196-9035-b2b5f7b04cf5&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt; 예외 전파란 하나의 예외가 발생하면 즉시 호출자에게 전파되며, 나머지 Task는 계속 실행&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-290be7bd-d522-47df-89b7-1650c27809a6&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷예외를 수집하는 옵션도 있는데 이는 &quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;return_exceptions=True&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot; 이다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e895188e-e440-4749-b447-8b40dc8830b7&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 옵션은 예외를 '반환 가능한 결과값'의 하나로 취급하도록 하여&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; 결과 리스트에 오류를 저장&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;한다&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-15d7f354-70ef-4bb2-9dbc-034a24d515c7&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷위 옵션을 통해 작업별 상태를 확인하고, 선택적으로 재시도하고, 성공한 결과는 먼저 활용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-45e81c7a-fe35-4eb1-a51b-69901eb88422&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;821&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YVBNF/dJMcadouLqg/O9TwofzSXUL003Czbca7yK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YVBNF/dJMcadouLqg/O9TwofzSXUL003Czbca7yK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YVBNF/dJMcadouLqg/O9TwofzSXUL003Czbca7yK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYVBNF%2FdJMcadouLqg%2FO9TwofzSXUL003Czbca7yK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;821&quot; height=&quot;345&quot; data-origin-width=&quot;821&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-eba899fd-4d77-4306-805b-e5747e53a382&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-75353314-5db1-4701-bf6b-e02714d60f48&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷위 사진처럼 다중 코루틴 예외를 처리할 때는 상황에 따라 적절한 것을 선택하여 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-af152ba6-b73d-4145-999f-a8169d18ca60&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ec2ed6fe-c97a-40ae-9617-d45951371b3f&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▶비동기 time out 설정&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b8113d55-ce6b-4fc8-8260-5cf534b4d3bf&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷비동기 방식에서는 하나의 지연이 전체 흐름에 영향을 미친다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-63247b55-ea99-440f-8bcc-d51aac0ed001&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷이때 Timeout을 설정하여 일정 시간 이후에 다른 대응을 할 수 있도록 제한을 둘 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7de9d26a-c711-4d64-9300-b9478cf9cfcd&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷asyncio.wait_for()을 이용하여 구현할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-d26c8ef4-5f88-4807-add1-7e8485fb7396&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;278&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yO5Ni/dJMcadouLqc/KTUWeZRbSNeO227rtkgVNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yO5Ni/dJMcadouLqc/KTUWeZRbSNeO227rtkgVNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yO5Ni/dJMcadouLqc/KTUWeZRbSNeO227rtkgVNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyO5Ni%2FdJMcadouLqc%2FKTUWeZRbSNeO227rtkgVNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;278&quot; height=&quot;130&quot; data-origin-width=&quot;278&quot; data-origin-height=&quot;130&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-59e1a097-78e4-4f90-a601-770b45733860&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;asyncio.wait_for() 사용 예시&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-ac8bb821-de45-45a1-8e53-53c7c1cc07ff&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-50d4d640-731c-44c2-a174-d755afc97855&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷위 사진과 같이 인자로 실행할 코루틴과 timeout 값을 설정하여 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-bc44c391-014e-48d9-a2f1-fd16e7ee163b&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이때 timeout으로 설정한 시간보다 작업 시간이 길면 &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;​&lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;asyncio.TimeoutError&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 가 발생하기 때문에&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-713566b5-f651-428b-8e69-726afb0d4323&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;try-except 문으로 감싸서 처리해줘야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c1e68411-7d48-4fed-9b88-843d4a386256&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷Timeout이 없을 때는 전체 시스템 흐름이 꼬이고 사용자 경험이 악화되지만,&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-642823a8-8734-4ca1-a473-301599b609f9&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Timeout이 있다면 빠른 피드백을 제공하고, 시스템 리소스도 보호할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-58ffd776-47de-4fee-9c97-480081e395e0&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;SE-6d1e26c6-6b2c-45e7-8c70-ee22ef7f2cce&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. 비동기 심화와 유의사항&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-60bc9f45-b96b-4520-a55c-7f291140a70c&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▶&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;cancel()&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-762fe1e4-b9ef-496e-9010-debc6b441aaa&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어떤 task에 대해 더 이상 필요가 없어진다면 시스템 자원 확보를 위해 즉시 중단해야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-32f997f4-6c3e-49ba-9ae0-3bc3a8b7e5e4&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이때&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; cancel()&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 을 사용할 수 있음!&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-86a4d662-45cd-4724-83f9-37d5fee17844&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;task.cancel() 을 하면 해당 task에 대해 취소 요청을 하는 것이다. (&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;즉시 중단은 아님&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-adde555f-9784-41c0-9870-146fa70917d3&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그리고 await task를 한다면 해당 task는 취소 되었으므로 &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;asyncio.CanceledError &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가 발생하게 됨.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6fa19a15-8d42-42a4-be33-91a3a7cd8ea6&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여기서 task는 create_task()를 통해 반환된 Task 객체이다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-a0f15366-982d-4f05-a675-e64b6f983d2b&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;245&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzMQhn/dJMcagMpd5z/raLvOmCUKkWJ8FDQRWXnpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzMQhn/dJMcagMpd5z/raLvOmCUKkWJ8FDQRWXnpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzMQhn/dJMcagMpd5z/raLvOmCUKkWJ8FDQRWXnpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzMQhn%2FdJMcagMpd5z%2FraLvOmCUKkWJ8FDQRWXnpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;245&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;245&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-5bf9ce4e-c8ec-49c6-9dc1-bf555bc4094f&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;task.cancel() 사용 예시&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-e51c8f4a-edda-44e6-99af-eb08f5a92a4e&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-ec6eff93-0f6c-4968-9a3f-c3b643beb7f9&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▶&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;asyncio의 주요 에러 정리&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-ad3caf2e-e6f7-4393-8a58-dfd28a438daa&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Tqgbc/dJMcadWnGBW/zy7AX2lOvVkH8jblAwUr70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Tqgbc/dJMcadWnGBW/zy7AX2lOvVkH8jblAwUr70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Tqgbc/dJMcadWnGBW/zy7AX2lOvVkH8jblAwUr70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTqgbc%2FdJMcadWnGBW%2Fzy7AX2lOvVkH8jblAwUr70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;811&quot; height=&quot;352&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-2dd24cd6-ffa1-4c1d-bed8-95ef68764961&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-3e052569-3730-4676-82b6-6e6962ebddcb&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▶&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;세마포어&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-39a49031-8566-4515-8e22-0dc2fdee77f2&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;무한한 동시성은 시스템 파괴를 부른다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9c5118b8-624b-46f1-9bf9-fd53ed5a28e0&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 허락된 만큼만 통과시키는 톨게이트 역할이 필요한데 이를 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Semaphore&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;라고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a04ab037-153c-4d58-9be2-af123f242af4&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이를 통해 비동기의 장점을 살리되, 외부 서비스에 과도한 부담을 주지 않도록 동시 실행 수를 엄격하게 조절한다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-abf700f4-6037-4598-994a-9aad92210a8b&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;sem = asyncio.Semaphore(최대 접근 수)로 세마포어 객체를 받은 후에&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b23589c8-c675-4bb1-9425-f82cc8b3d871&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;async with sem: 구문 안에 내용을 쓰면 해당 구문 안을 실행하는 최대 task 수는 세마포어 수로 제한이 되고, 이를 초과하면 대기를 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6a6904c6-5344-443f-8baa-b014f7dc7799&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;API호출이나 DB연결 등 실무에 필수적이다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-599df2ef-5fcb-4d3a-b868-765e2cad1eb3&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zz9Wv/dJMcadouLqf/qk5IMWtsprkHLeEPLg1drK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zz9Wv/dJMcadouLqf/qk5IMWtsprkHLeEPLg1drK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zz9Wv/dJMcadouLqf/qk5IMWtsprkHLeEPLg1drK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzz9Wv%2FdJMcadouLqf%2Fqk5IMWtsprkHLeEPLg1drK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;487&quot; height=&quot;306&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-c538118a-9bd3-48de-9cb6-51e5874c8940&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;세마포어 사용 예시&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-26bcfd10-ce0e-4e22-8f3c-ec29190c3b87&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-dbaeb2bb-4b29-4ed2-951e-0e69eb9df5ba&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▶&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;async with 구문&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f5072d0f-26b6-489d-b6ba-e8b9572df76b&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;열어둔 문은 자원의 누수로 이어진다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a8ef9e8c-fc70-471a-a85f-32fff533b925&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;비동기 코드를 다루는 네트워크 클라이언트나 데이터베이스 연결 객체는 단순한 변수가 아닌 물리적 자원이다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-fde25252-f495-4887-abf8-c816b2b539cb&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;비동기로 열었다면, 반드시 비동기로 닫아야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-777e36ff-812a-4da1-96c0-ef2628a9b12d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;async with&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;는 작업 중 에러가 발생하더라도 자원 정리 단계를 반드시 보장하는 비동기 패턴이다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-89b0e1ad-bbe4-4ab0-84e2-61d7ac95248f&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zPd02/dJMcagMpd5y/TU86WeIVY4HEVtLM8eliCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zPd02/dJMcagMpd5y/TU86WeIVY4HEVtLM8eliCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zPd02/dJMcagMpd5y/TU86WeIVY4HEVtLM8eliCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzPd02%2FdJMcagMpd5y%2FTU86WeIVY4HEVtLM8eliCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;788&quot; height=&quot;252&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-28dbebf6-e354-40e7-be95-c07a793f2832&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;async with 구문 사용 예시&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-4e150826-8654-459a-8fb6-81aa0ee717ca&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-ce856e92-c553-4db5-be39-c2e0623d34ad&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▶위 3가지 정리&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-f8f0dca8-97dc-4ed7-8d93-cc9b1517d6af&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;377&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beSnGi/dJMcadWnGB1/s98jnQ7yFc1zIlSKz2ipkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beSnGi/dJMcadWnGB1/s98jnQ7yFc1zIlSKz2ipkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beSnGi/dJMcadWnGB1/s98jnQ7yFc1zIlSKz2ipkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeSnGi%2FdJMcadWnGB1%2Fs98jnQ7yFc1zIlSKz2ipkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;793&quot; height=&quot;377&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;377&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-7430dbea-362f-4735-8012-5acb5f327121&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-baf8be05-04ab-49b5-9829-028fab21f975&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2312363f-6347-478f-aeb7-ac61e3456f0a&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▶&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;동기식 블로킹 함수 대처&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-bbfb772a-9476-4c7f-adcf-f08c37c9d226&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;동기식 블로킹 함수가 실행되면 이벤트 루프 전체가 멈춰버리는 (Freezing) 치명적 병목이 발생한다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f8a126ce-ac83-4351-b566-ca5a698bc798&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해결책으로는 run_in_executor를 사용하여 블로킹 함수를 메인 루프가 아닌 별도의 스레드 풀로 격리하여 실행한다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b47c6d36-ca8a-4b0f-a71e-03e7352a7027&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사용법으로는 먼저 loop = asyncio.get_event_loop()로 현재 사용 중인 루프를 가져오고,&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a863c0d4-d0db-4762-af76-1b585fd96794&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;await loop.run_in_executor(executor, 동기함수, 인자)로 별도 스레드 풀에서 동기함수를 실행할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-123ce483-35c4-4588-88a1-932f8a9e5ab3&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인자 1 executor는 보통 None으로 둬서 기본 스레드풀을 사용하게 한다. (지정해줄 수 있음)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6780edd8-21d9-4b12-9ad9-d3053a247295&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인자 2 동기함수는 ( ) 없이 써줘야 한다!&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-362fd80f-c1c0-43af-8f56-a290c16ba96e&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;245&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjieSy/dJMcagMpd5A/zjSn0Kt4Izsiw6IWluvKiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjieSy/dJMcagMpd5A/zjSn0Kt4Izsiw6IWluvKiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjieSy/dJMcagMpd5A/zjSn0Kt4Izsiw6IWluvKiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjieSy%2FdJMcagMpd5A%2FzjSn0Kt4Izsiw6IWluvKiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;381&quot; height=&quot;245&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;245&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-c88c52d7-6e54-4af1-9d53-2576fbb0a3e8&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;run_in_executor() 사용 예시&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-10947ae2-6c51-4637-a2f5-973f56239559&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-a30932fb-2829-4c80-a498-0b3947774270&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;핵심 포인트는 동기함수를 별도 스레드에서 실행해서 루프 블로킹을 방지하고,&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-112d62aa-f6c2-4994-b956-55848239ef21&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;비동기 전환이 안 되는 옛 코드를 대처할 수 있다 등&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d8ce908d-7b3d-44c8-aeaf-144190d6c3d5&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-f71ace1d-d188-4346-a572-21b13546a337&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MtnVk/dJMcadWnGB3/Ct2qACqW4uOXskznKV6Jzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MtnVk/dJMcadWnGB3/Ct2qACqW4uOXskznKV6Jzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MtnVk/dJMcadWnGB3/Ct2qACqW4uOXskznKV6Jzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMtnVk%2FdJMcadWnGB3%2FCt2qACqW4uOXskznKV6Jzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;820&quot; height=&quot;402&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-4be6aebc-894d-40d6-8163-8d471a9266ba&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-7b311f64-9cd1-4010-9da6-907d68e1d79d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e94a76c3-4868-4cb7-8cac-ea43d7ce36ab&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;* 비동기는 무조건 빠른 것이 아니다!&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e7df8f3f-7f7e-4df7-9655-6400622574f9&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;* 단일 요청의 처리 속도를 높이는 것이 아니라, 동시에 처리할 수 있는 요청의 수(처리량)를 극대화하는 기술이다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-87d8c65b-1471-4a8c-90c4-209bf8af43bc&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;* 부하 상황에서는 지연 시간의 변동성이 커질 수 있음을 설계 시 인지해야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-1a8a4cb5-2ec0-434b-83fb-37ded96763ad&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;SE-b47b3ca9-564e-49d5-a0f2-0b3a44c2128f&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5. 테스트의 개념과 pytest 시작하기&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-e0c642e9-9663-485c-96a3-5a9612ce0eb6&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;프로젝트가 커질수록 기능 추가나 구조 변경 시 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;기존 기능이 깨지는 일이 빈번하게 발생&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c35475df-3cbc-4b54-afc9-2a88b2a49e66&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;테스트 없는 코드 수정은 예기치 않은 오류를 반드시 동반&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-856e8cbd-715d-4b8c-a042-22323092e0ca&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▶테스트란?&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-998c7f59-a4f3-40ef-94b2-36f4d633e353&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어떤 입력을 넣었을 때, 기대한 결과가 정확히 나오는지 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;코드로 검증하는 과정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-39356974-5589-417c-b495-811c56bf6bcc&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;단위 테스트(Unit Test) : &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;개별 코드 단위 (메서드, 클래스) 검증, 격리된 환경에서 빠르게 실행, 회귀 테스트 기반&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(?)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-123cc95c-66f9-4e52-9926-d139c33ff2e3&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;통합 테스트(Integration Test) : &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;모듈 간 상호작용 검증, 데이터 흐름 및 인터페이스 확인, 종속성 및 외부 시스템 통합 확인&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-aaf26b3a-5353-4019-8631-42417b102dd4&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;시스템 테스트(System Test)&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; : 전체 시스템 기능 검증, 실제 운영 환경과 유사한 조건, 성능-부하-스트레스 테스트 포함&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-1358fc80-dce3-461c-bfd4-4e9a22db9fce&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;인수 테스트(Acceptance Test)&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; : 최종 사용자 관점의 검증, 비즈니스 요구사항 충족 확인, 알파-베타 테스트 및 인수 기준 검증&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9f33ea3f-c653-4595-bb11-b3f5280c3e32&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ac00125e-61f7-4eca-955e-2c3910fc2e17&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▶테스트 코드를 작성하는 이유&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e3c464d1-cad7-4ecf-ae49-d73b0334e286&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷문제점 조기 발견&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-faf20ff4-d0b9-4e8e-8387-2673ce8489e2&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷리팩토링 용이성&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4064cfab-1350-4f67-b261-b3f229f5beb9&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷개발 효율성 극대화 : 어느정도 개발 단계 이후에는 사용하는게 디버깅 시간을 압도적으로 단축&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c31ddbbe-ea9e-47ec-93c7-7c190021a2bc&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5e801732-3a02-4b45-bf3c-38465e329910&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▶테스트의 3단계 핵심 구조 (AAA)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-755de399-aea9-402a-90a0-beccd7f8465c&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;준비 (Arrange) : 테스트를 위한 초기 상태 설정 (a=2, b=3 등)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b80c9c0d-4f3f-4a38-b802-474c5e3e8fd3&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;실행(Act) : 검증할 대상 기능 호출 (add(a,b) 등)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-239ab43a-cf6a-4021-9f3b-9f3aff32bc6d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;검증(Assert) : 예상된 결과와 실제 결과 비교(&quot;결과는 예상대로 5이다&quot; 등)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4d5a6a83-5f3b-4ef5-905b-b7721b39842d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c707da2e-0d5f-4445-b73d-d5e34b6e65ec&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▶unittest vs pytest&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-8f54a10f-fe36-46c8-bb42-e7d186f91023&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beRa8Y/dJMcadWnGB2/gfJX1FkJQUDZVAh7dKzkg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beRa8Y/dJMcadWnGB2/gfJX1FkJQUDZVAh7dKzkg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beRa8Y/dJMcadWnGB2/gfJX1FkJQUDZVAh7dKzkg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeRa8Y%2FdJMcadWnGB2%2FgfJX1FkJQUDZVAh7dKzkg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;815&quot; height=&quot;340&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;340&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-f6bfe6ec-8bee-4d9e-87f5-eb0e523f3de6&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-00362a9f-3799-4503-b414-016b44a25c43&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;pytest 방식에서는 assert 문 하나로 모든 비교 연산 (==, !=, &amp;lt;, in) 가능 !!&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-228601a3-da5e-4fab-aee2-871772a2249d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또한 간결함, 호환성, 확장성 등의 이유로 pytest를 사용&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-55653962-3839-4d2f-9118-6704de889cb9&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0e8a2af6-222d-487c-ae6c-46ab5bec528f&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷pytest의 명칭 규약&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-936089ac-cc13-4b81-8ec5-0aa5575a39a0&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;pytest가 테스트를 자동으로 수집하기 위한 필수 조건!&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #333333;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;test_*.py 또는 *_test.py 로 모듈 이름을 짓기&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 테스트 함수 명은 반드시 test_ 로 시작하기&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클래스로 묶을 경우 이름을 'Test'로 시작하고 상속은 불필요&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p id=&quot;SE-f9536a1c-8394-48e3-ae47-66512577433d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;SE-4709ce5f-cd21-4d56-a0a1-e580d6b860f6&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6. 예외처리와 경계값 테스트&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-29c59ec4-67da-4578-bbd2-79c1841ea4ec&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;테스트의 진짜 목적은 '성공'을 확인하는 것이 아니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-85330e16-70ac-4474-a98c-e8565a29f298&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;테스트는 코드가 올바르게 실패하는지 검증하고,&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d4751551-ce50-450a-8278-023355324319&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;미래의 코드 수정을 위한 안전망이며,&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c87c608a-adff-4968-b95d-a5f3bebfb47d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;더 나은 소프트웨어 구조를 강제하는 설계 도구이다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0d1955d2-19e8-449b-9c95-3313ba82521f&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;정상적인 케이스만 확인하는 것은 절반의 테스트이며, 잘못된 입력에서 올바르게 실패하는가?도 확인해봐야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e11e8109-f750-4bb4-a155-9bc82d7eb527&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의도된 에러를 낚아채는 예외 처리를 확인하기 위해서는 with pytest.raises()를 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-9d52854f-7e06-41d5-9c7b-33011b04a5ca&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷with pytest.raises()&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f457b9c5-1135-4553-ad9d-595cec58c4c9&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;특정 코드를 실행했을 때 의도한 예외가 발생하는지 명시적으로 검사하는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b8cd2381-8281-4c39-9c8c-7bc74721b253&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;with pytest.raises(예외이름, 예외객체, match == &quot; &quot;) : 구문을 이용할 수 있는데 이 안에 예외를 유발하는 실제 함수를 호출하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b3f6db1f-9bb8-40b9-8451-e331ec4a256a&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;단순히 에러의 종류만 포착하는 것이 아니라, match 인자를 통해 발생한 에러 메시지가 특정 문자열을 포함하는지도 알 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-756387ae-af7e-40c9-8723-5e89d5a3a287&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cje3WK/dJMcadWnGBZ/KvVzd6Wg4M2js2cunBZfFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cje3WK/dJMcadWnGBZ/KvVzd6Wg4M2js2cunBZfFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cje3WK/dJMcadWnGBZ/KvVzd6Wg4M2js2cunBZfFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcje3WK%2FdJMcadWnGBZ%2FKvVzd6Wg4M2js2cunBZfFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;362&quot; height=&quot;300&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-8e6113bc-4f1d-4334-aafe-187b7739412a&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;with pytest.raises() 사용 예시&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-2bde63b3-d8c0-473a-9023-3f87b976b3f9&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-d6d27aff-f546-442d-8ccc-5953d25094f2&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;SE-c90fb2e7-b743-4b68-9013-143d56a38e6e&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;7. 테스트 자동화하기&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-f6fc7fbc-0e00-4231-a782-01aea58161fd&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;테스트를 하나하나 매개변수만 바꿔가면서 테스트 하는 것은 시간도 많이 걸리고 비효율적일 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-157f3cec-4740-45a2-92a2-894989f45018&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이를 해결할 수 있는 두 가지 핵심 기능이 있는데 바로 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Fixture&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;와 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Parametrize&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-41ff9c87-9b32-43f9-97a1-9a95671b4f3b&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-57f6785e-a635-48c5-8b74-a9b75acc3c9f&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▶Fixture (사전 준비)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6177a282-f501-4ab9-ba8f-db864a11cfb6&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Fixture는 테스트 전 필요한 준비 작업 (DB연결, 객체 생성 등)을 한 번만 정의할 수 있도록 하는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d5372bf7-1b9d-46b3-977c-382f32a31cfd&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;conftest.py파일에 작성하면 모든 파일에서 import 없이 즉시 자동 공유가 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a7c8ec07-e9bb-4fb0-9caa-e764bbb3aa12&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Fixture 문법은 @pytest.fixture 인데 ( ) 안에 데코레이터 옵션도 넣을 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-7ec077f0-e0f0-4326-a23a-d5fc824bd23b&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;326&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m5iN2/dJMcadWnGBV/EWcaWJ5iWeF7LZEdevhrt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m5iN2/dJMcadWnGBV/EWcaWJ5iWeF7LZEdevhrt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m5iN2/dJMcadWnGBV/EWcaWJ5iWeF7LZEdevhrt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm5iN2%2FdJMcadWnGBV%2FEWcaWJ5iWeF7LZEdevhrt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;326&quot; height=&quot;148&quot; data-origin-width=&quot;326&quot; data-origin-height=&quot;148&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-e2784e97-cd74-4eec-b994-c72e54eb686a&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-ca347f32-0bae-44b5-b6b8-3498377daba7&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위 사진처럼 일반 함수 위에 @pytest.fixture를 붙여준 다음, 테스트 함수 인자로 Fixture 함수 이름을 넣어주면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-98634e84-6e20-4448-8dcd-42ee52c16dea&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그러면 테스트 함수 안에서 인자로 받은 fixture함수의 return 값이 자동으로 주입된다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-12d7dc2e-337f-482c-87a7-90d37dda7249&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e9f82f18-7710-4415-91a8-f06b1d6ccbd0&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▷conftest.py&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2d12c561-34f7-4e8d-b63a-ffb4e66843c8&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;conftest.py는 Fixture 공유 파일이다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-19ebee08-f00e-4690-841b-7a0760ead984&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;한마디로 conftest.py 안에 있는 fixture들은 같은 폴더나 하위 폴더 파일들에서 별도로 import하지 않고 사용가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c421fa9a-5e05-4f06-bd4a-7aeccd00f361&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여러 테스트 파일이 같은 fixture을 사용해야 할 때 쓸 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e94f0611-b0df-46b6-b39a-8d2442e37f16&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이때 파일 이름은 반드시 conftest.py 로 해야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-144850d4-ffc1-4440-a2c0-bbbe55ce8256&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-cf011493-01ca-4cb5-890b-c98814a6e746&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▶parametrize&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-29cd8b24-32a5-40bf-8697-27f773d20c37&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하나의 테스트 함수에 여러 입력값을 주입하여 반복 테스트를 간결하게 수행할 수 있게 해주는 마커이다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a1a0a8fb-c751-4a35-a63f-054ffb2e7a21&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;일단 Marker라는 것은 pytest에서 테스트 함수에 메타데이터를 붙이거나 동작을 제어하는 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;데코레이터&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2feb43fc-d768-43e4-a186-5c640fcf1dc6&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;@pytest.mark.마커이름 으로 사용할 수 있는데 이 중 parametrize는 여러 입력값과 결과 값을 전달하여 중복코드를 제거하고, 케이스를 확장할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-38620c8b-ed8c-4c36-9bbc-4b1692408e9c&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FZXh8/dJMcadWnGB0/l7xkhmIqmxj5oC35B1uMU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FZXh8/dJMcadWnGB0/l7xkhmIqmxj5oC35B1uMU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FZXh8/dJMcadWnGB0/l7xkhmIqmxj5oC35B1uMU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFZXh8%2FdJMcadWnGB0%2Fl7xkhmIqmxj5oC35B1uMU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;737&quot; height=&quot;262&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-2a95a3b7-a380-47a5-b887-e6eb7faf3e1d&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oJ3ms/dJMcadWnGBX/KvmVpWysZAvqHK3nO1AbH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oJ3ms/dJMcadWnGBX/KvmVpWysZAvqHK3nO1AbH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oJ3ms/dJMcadWnGBX/KvmVpWysZAvqHK3nO1AbH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoJ3ms%2FdJMcadWnGBX%2FKvmVpWysZAvqHK3nO1AbH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;346&quot; height=&quot;225&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-e8807c9b-3593-4c29-bacf-4dcaa74526e4&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-d1da7e08-c812-496e-b2c5-1d3bcf0b0ce6&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위 사진처럼 매개변수에 첫번 째로 &quot;인자이름1, 인자이름2 .. &quot; 처럼 사용할 변수들을 쓰고, 두번째로는 튜플을 감싸는 리스트를 적는데, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;각 튜플은 테스트할 값들이다. 하나의 튜플이 하나의 테스트 케이스가 되는 것이고, 튜플 안의 값들이 변수로 들어가는 것처럼 동작한다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;8. 실전테스트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▶Mock&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;테스트를 할 때 실제 환경에 영향을 주는 위험한 로직은 가짜 객체인 'Mock'으로 대체하여 완벽하게 고립시켜야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;1. 대체 : unittest.mock.patch를 사용해 특정 모듈이나 함수를 Mock 객체로 전환&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;2. 검증 : assert_called_once_with(인자)를 사용해 해당 함수가 기대한 인자와 함께 정확히 호출되었는지 확인&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;Mocking의 원리는 의존성을 격리하는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;테스트 대상이 외부 의존성(API, DB)에 요청을 보낼 때 이를 Mock이 가로채서 가짜 응답을 만들어 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▷Mock 패밀리 : Mock , MagicMock , patch&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;Mock : 최소형 가짜로 호출과 반환만 흉내내는 기본 가짜이다. 매직 메서드(__len__, __iter__)은 사용불가하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;MagicMock : 매직 메서드를 자동 처리해주는 Mock이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;patch : 가짜를 꽂는 도구로 실제 코드 위치에 MagicMock을 주입하고, 테스트가 끝나면 자동으로 원래 함수를 복구한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;(*보통 직접 import 하는 것은 patch이고, 그 결과 객체는 자동으로 MagicMock이 된다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▷가짜로 바꾸는 법 ! @unittest.mock.patch&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;실제 테스트에서 특정 모듈이나 함수를 patch를 통해 mock으로 바꾸는 법은&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;1. 먼저 from unittest.mock import patch 를 통해 patch를 import하고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;2. Mock을 주입할 테스트 함수 위에 @patch(&quot;가짜로 바꿀 위치&quot;)를 쓰고, 함수에는 def 테스트함수(mock)으로 MagicMock을 변수로 받아와 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;367&quot; data-origin-height=&quot;210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqLZlx/dJMb997xJqx/mfjuC9q6zcH3GM7aIaAqJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqLZlx/dJMb997xJqx/mfjuC9q6zcH3GM7aIaAqJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqLZlx/dJMb997xJqx/mfjuC9q6zcH3GM7aIaAqJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqLZlx%2FdJMb997xJqx%2FmfjuC9q6zcH3GM7aIaAqJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;367&quot; height=&quot;210&quot; data-origin-width=&quot;367&quot; data-origin-height=&quot;210&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▷가짜 응답 제어 : return_value 와 side_effect&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;mock.return_value = (설정값) 을 통해 정답 응답을 고정값으로 설정한다. 이 경우 인자가 뭐가 오든 같은 값을 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;mock.side_effect = [ ... ] 을 통해 mock을 호출할 때마다 순차적으로 리스트 안 값을 호출한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▷patch의 2가지 사용법&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;1. 위와 같이 @patch(&quot; &quot;)을 사용하는 방법으로, 이 경우 함수 전체에 패치를 적용하며 mock을 자동으로 주입한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;2. 테스트 함수 안에 with patch() as mock:&amp;nbsp; 문을 사용하여 해당 구문 안만 패치하고, as로 mock을 받을 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;-&amp;gt; 공통점으로는 범위 종료 시 자동으로 복구된다. with문 같은 경우 with문 위와 탈출 후에는 mock이 적용되지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;* 함수 전체를 가짜로 -&amp;gt; @patch()&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;* 일부 구간만 가짜로 -&amp;gt; with patch() as&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;* 여러 곳을 패치할 땐 @patch() 를 중첩하여 사용하며, 인자 순서 = 아래에서 위 이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;▷호출 검증 메서드 비교&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhR5xh/dJMb99T0bmv/V6Qj3KE7JKKYKkwNcPXrZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhR5xh/dJMb99T0bmv/V6Qj3KE7JKKYKkwNcPXrZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhR5xh/dJMb99T0bmv/V6Qj3KE7JKKYKkwNcPXrZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhR5xh%2FdJMb99T0bmv%2FV6Qj3KE7JKKYKkwNcPXrZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;406&quot; height=&quot;106&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>카테캠</category>
      <author>wlsgk7779</author>
      <guid isPermaLink="true">https://wlsgk7779.tistory.com/1</guid>
      <comments>https://wlsgk7779.tistory.com/1#entry1comment</comments>
      <pubDate>Thu, 21 May 2026 23:11:31 +0900</pubDate>
    </item>
  </channel>
</rss>