<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>에반, 어른반</title>
    <link>https://itmining.tistory.com/</link>
    <description>&amp;quot;어른이면서 애이기도 하고 싶다.&amp;quot;</description>
    <language>ko</language>
    <pubDate>Mon, 10 Aug 2026 00:01:05 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>에반황</managingEditor>
    <item>
      <title>Kubernetes 씹어먹기 - 0. 쿠버네티스를 커리어에 끼얹자.</title>
      <link>https://itmining.tistory.com/174</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;01 들어가며&lt;/h2&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;안녕하세요. 에반황이에요. 이전에 &lt;a href=&quot;https://itmining.tistory.com/173#%EC%BB%A4%EB%A6%AC%EC%96%B4%20%EC%A0%84%ED%99%98-1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;블로그를 다시 시작하다.&lt;/a&gt; 포스팅에서 다뤘듯 최근에 직무를 변경했는데요. 제일 중요한 직무 중 하나인 쿠버네티스(Kubernetes)를 내 커리어에 적을 수 있을 정도로 공부해보려 해요.&lt;/span&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bT32Kd/btsDuRYFhQl/U7qAoFt1tyEh30zTkjHGt0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bT32Kd/btsDuRYFhQl/U7qAoFt1tyEh30zTkjHGt0/img.jpg&quot; data-alt=&quot;시리즈 이름이 씹어먹기인 이유&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bT32Kd/btsDuRYFhQl/U7qAoFt1tyEh30zTkjHGt0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbT32Kd%2FbtsDuRYFhQl%2FU7qAoFt1tyEh30zTkjHGt0%2Fimg.jpg&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;306&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;시리즈 이름이 씹어먹기인 이유&lt;/figcaption&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;02 얻고자 하는 것&lt;/h2&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;쿠버네티스를 씹어 먹고 나선 다음의 목표를 달성하고 해요:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;팀 내에서 '쿠버네티스 좀 아는 놈' 포지션 잡기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;CKA 자격증 취득하기&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 두 가지를 이루면 올해 목표인 &lt;a href=&quot;https://itmining.tistory.com/173#%EC%BB%A4%EB%A6%AC%EC%96%B4%EC%A0%81%20%EC%84%B1%EC%88%99-1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;커리어의 성숙&lt;/a&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;03 포스팅 계획&lt;/h2&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;새로운 파트장이 본인은 새로운 공부를 할 때, 설명을 할 때 다음의 차례로 진행한다고 했어요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;전체 아키텍처 분석&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;개별 엔티티 구성요소 분석&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;엔티티 별로 구성요소 분석&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;각자의 동작 원리 순서 분석&lt;/span&gt;&lt;/li&gt;
&lt;/ol&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;font-family: 'Noto Serif KR';&quot;&gt;이 방법이 너무 괜찮아 보여 저도 다음과 같은 목차로 진행하려고 해요.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;쿠버네티스 클러스터 전체 아키텍처 알아보기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;쿠버네티스 구성 요소 핵심 컨셉 알아보기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;각 구성 요소의 개념 정리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;각 구성 요소의 동작 원리 정리&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&quot;다음 포스팅은 쿠버네티스 클러스터 전체 아키텍처 알아보기로 돌아오겠습니다!&quot;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;</description>
      <author>에반황</author>
      <guid isPermaLink="true">https://itmining.tistory.com/174</guid>
      <comments>https://itmining.tistory.com/174#entry174comment</comments>
      <pubDate>Mon, 15 Jan 2024 22:59:00 +0900</pubDate>
    </item>
    <item>
      <title>블로그 다시 시작하다.</title>
      <link>https://itmining.tistory.com/173</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;01 들어가며&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;안녕하세요! 약 2년 만에 돌아온, 아무도 기다리지 않았던 블로그의 주인장예요. 다시 블로그를 시작하기 앞서 왜 시작했고, 왜 쉬었으며, 어떻게 운영할지에 대한 정리를 해보고자 글을 써요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;483&quot; data-origin-height=&quot;285&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zRe3R/btsC4phHFZM/YSvO6loND01JIIbHFQd8rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zRe3R/btsC4phHFZM/YSvO6loND01JIIbHFQd8rk/img.png&quot; data-alt=&quot;반겨주세요. 제발.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zRe3R/btsC4phHFZM/YSvO6loND01JIIbHFQd8rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzRe3R%2FbtsC4phHFZM%2FYSvO6loND01JIIbHFQd8rk%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;483&quot; height=&quot;285&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;483&quot; data-origin-height=&quot;285&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;반겨주세요. 제발.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;02 왜 시작했나&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;990&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cG7Wqo/btsC7npSl6M/jwFYBw4moQu5U8Qm8KIIFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cG7Wqo/btsC7npSl6M/jwFYBw4moQu5U8Qm8KIIFk/img.png&quot; data-alt=&quot;무려 2016년에 시작한 첫 포스팅&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cG7Wqo/btsC7npSl6M/jwFYBw4moQu5U8Qm8KIIFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcG7Wqo%2FbtsC7npSl6M%2FjwFYBw4moQu5U8Qm8KIIFk%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;990&quot; height=&quot;150&quot; data-origin-width=&quot;990&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;무려 2016년에 시작한 첫 포스팅&lt;/figcaption&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;블로깅의 첫 시작의 목적은 여느 취준생과 다르지 않았어요. '취업' 때문이었죠. 카카오에 인턴으로 취업하게 되었고 리더로부터 안드로이드에 대한 핵심 개념들을 매일 작성하는 과제를 받아서 '자의' 반 '타의' 반으로 시작하게 되었어요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;759&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FqBc3/btsC4JArSyN/AfZQhoC5tsO1rRpWNPjyd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FqBc3/btsC4JArSyN/AfZQhoC5tsO1rRpWNPjyd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FqBc3/btsC4JArSyN/AfZQhoC5tsO1rRpWNPjyd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFqBc3%2FbtsC4JArSyN%2FAfZQhoC5tsO1rRpWNPjyd0%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;1246&quot; height=&quot;759&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;759&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;블로그를 하며 &quot;나도 블로거야&quot;라며 으쓱하기도 했었죠.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NHPJn/btsC52fsOE9/lnzJ3ke6akxeokWnZEoK3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NHPJn/btsC52fsOE9/lnzJ3ke6akxeokWnZEoK3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NHPJn/btsC52fsOE9/lnzJ3ke6akxeokWnZEoK3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNHPJn%2FbtsC52fsOE9%2FlnzJ3ke6akxeokWnZEoK3K%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;694&quot; height=&quot;432&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;02 성과&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;악바리로 리더의 과제를 수행하다 보니 리더에게도 인정받았어요. 이에 멈추지 않고 저는 블로깅을 계속했어요. 그 원동력은 바로 성과였죠. 두 꼭지로 구분해 보았는데요. '함께 자라기', '수치로 보이는 성장'예요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;함께 자라기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;새로운 지식을 남이 이해할 수 있게 정리한다는 것에 대한 뿌듯함 + 성장하는 즐거움이 느껴졌어요. 제 글을 읽고 성장하는 분들이 생긴 것이었죠. 여태껏 배우기만 해 왔던 내가 누군가의 성장에 도움을 줄 수 있다는 게 굉장한 희열이었어요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1752&quot; data-origin-height=&quot;1742&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AYpAd/btsC7npSoWt/P0frrUOU0Q9FEODOAap2G0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AYpAd/btsC7npSoWt/P0frrUOU0Q9FEODOAap2G0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AYpAd/btsC7npSoWt/P0frrUOU0Q9FEODOAap2G0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAYpAd%2FbtsC7npSoWt%2FP0frrUOU0Q9FEODOAap2G0%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;1752&quot; height=&quot;1742&quot; data-origin-width=&quot;1752&quot; data-origin-height=&quot;1742&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;수치로 보이는 성장&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;물론 수치적으로도 방문자가 꾸준히 늘었어요. 막상 사회를 나와보면 나를 평가할 수 있는 수단이 많지 않다고 느끼는데, 마치 게임 스탯처럼 내가 하는 만큼 는다는 기분을 느낄 수 있는 몇 안 되는 기회였다고 생각해요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1836&quot; data-origin-height=&quot;970&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qlirQ/btsDav1K3J8/FkhDneFpdk62j49CN2yJ11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qlirQ/btsDav1K3J8/FkhDneFpdk62j49CN2yJ11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qlirQ/btsDav1K3J8/FkhDneFpdk62j49CN2yJ11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqlirQ%2FbtsDav1K3J8%2FFkhDneFpdk62j49CN2yJ11%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;1836&quot; height=&quot;970&quot; data-origin-width=&quot;1836&quot; data-origin-height=&quot;970&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;물론 구글애드센스를 통해 외화를 벌어오는 민간 외교관 역할도 정말 색다른 경험이었어요.  &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2138&quot; data-origin-height=&quot;1320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ekOgRi/btsC8U8MvwO/69ciWy9vXfK1DEk1T1knG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ekOgRi/btsC8U8MvwO/69ciWy9vXfK1DEk1T1knG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ekOgRi/btsC8U8MvwO/69ciWy9vXfK1DEk1T1knG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FekOgRi%2FbtsC8U8MvwO%2F69ciWy9vXfK1DEk1T1knG0%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;2138&quot; height=&quot;1320&quot; data-origin-width=&quot;2138&quot; data-origin-height=&quot;1320&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&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;942&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bw5hl4/btsC4ffjr2Q/RZhhhNwAfAHXnKSqHIMYt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bw5hl4/btsC4ffjr2Q/RZhhhNwAfAHXnKSqHIMYt0/img.png&quot; data-alt=&quot;돈... 돈으로 사게나!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bw5hl4/btsC4ffjr2Q/RZhhhNwAfAHXnKSqHIMYt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbw5hl4%2FbtsC4ffjr2Q%2FRZhhhNwAfAHXnKSqHIMYt0%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;1254&quot; height=&quot;942&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;942&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;돈... 돈으로 사게나!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;03 왜 쉬었나&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;블로그를 제일 열심히 했던 시기는 2017~2019였어요.&amp;nbsp;이 시기 이후&amp;nbsp;&lt;/span&gt;왜 쉬었는지는 저의 커리어패스와도 연관이 있어요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;817&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sut2O/btsC4DmGJbg/gc6giP0bAkenhm8txoV520/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sut2O/btsC4DmGJbg/gc6giP0bAkenhm8txoV520/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sut2O/btsC4DmGJbg/gc6giP0bAkenhm8txoV520/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsut2O%2FbtsC4DmGJbg%2Fgc6giP0bAkenhm8txoV520%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;1654&quot; height=&quot;817&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;817&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;2016년 취업 이후, 저는 빨리 월요일이 되어 출근하고 싶던&amp;nbsp;&lt;/span&gt;패기롭던&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;신입이었죠. 저 때 했던 업무를&amp;nbsp;&lt;/span&gt;간략하게 설명드리자면 웹을 구현하는데 필요한 기술인 HTML5, Javascript 등을 가지고 웹 게임을 만드는 나름 새로운 길을 개척하는 업무였어요. 하지만 몇 개월 업무를 진행하니 기술적인 도전도 없었고 동기를 제외하곤 가르쳐줄 시니어도 없어 동기부여가 되지 않는 상황이었죠.&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;font-family: 'Noto Serif KR';&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;저만의 노력으로는 효율성이 너무 떨어진다고 생각했기 때문에 시너지를 내기 위해 그 당시 저에겐 기술적 도전이 매우 많았던 백엔드 개발자로 전직을 요청했어요. 그리고 당시 주니어들에게 대중적이었던 기술들을 하기 시작해요. Spring, AWS, MySQL, Redis 등이었죠.&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;font-family: 'Noto Serif KR';&quot;&gt;이후 저로썬 기술적 도전을 해결 및 업무에 적용하기에도 바빴으며 그 내용을 적기엔 내 실력이 너무나 부족하다 느꼈어요. 다른 개발자 분들의 실력은 깊게 파놓은 우물처럼 보였죠. 결국 이 때는 내가 바쁘게 업무 하니까 늘겠거니라는 착각과 함께 더딘 성장을 하게 돼버렸네요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;686&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bp1ARd/btsC8Uubtpg/6kJJckJnIwP39GrfMiJsiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bp1ARd/btsC8Uubtpg/6kJJckJnIwP39GrfMiJsiK/img.png&quot; data-alt=&quot;끝이 보이지 않는 깊이.. (실제론 인피니티 미러라는 것  )&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bp1ARd/btsC8Uubtpg/6kJJckJnIwP39GrfMiJsiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbp1ARd%2FbtsC8Uubtpg%2F6kJJckJnIwP39GrfMiJsiK%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;894&quot; height=&quot;686&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;686&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;끝이 보이지 않는 깊이.. (실제론 인피니티 미러라는 것  )&lt;/figcaption&gt;
&lt;/figure&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;657&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuVBcx/btsC1n5XjzS/k9Ocv129Pz57fubylImka1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuVBcx/btsC1n5XjzS/k9Ocv129Pz57fubylImka1/img.jpg&quot; data-alt=&quot;내 눈엔 노력은 안보이고 깊게 파인 우물만 보여&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuVBcx/btsC1n5XjzS/k9Ocv129Pz57fubylImka1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuVBcx%2FbtsC1n5XjzS%2Fk9Ocv129Pz57fubylImka1%2Fimg.jpg&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;886&quot; height=&quot;657&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;657&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;내 눈엔 노력은 안보이고 깊게 파인 우물만 보여&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;04 왜 돌아왔나&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;커리어 전환&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1655&quot; data-origin-height=&quot;817&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Q0Lrm/btsC6y6gDoR/QQ69y2ivZerC4pkX1ioqsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q0Lrm/btsC6y6gDoR/QQ69y2ivZerC4pkX1ioqsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q0Lrm/btsC6y6gDoR/QQ69y2ivZerC4pkX1ioqsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ0Lrm%2FbtsC6y6gDoR%2FQQ69y2ivZerC4pkX1ioqsK%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;1655&quot; height=&quot;817&quot; data-origin-width=&quot;1655&quot; data-origin-height=&quot;817&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 또한 커리어패스와 연관이 있는데요. 여러 가지 이유로 카카오에 약 2년 만에 손뼉 치고 이동이라는 사내 이동 시스템이 다시 부활했고 현재 이동하게 된 조직의 공고가 떴어요. 키워드는 AI, Cloud, MLOps 등 내 길이 아니라고 부정해 왔던 굉장히 기술적 도전이 많이 필요해 보였던 용어들이었어요. 그러나 모르는 것이 있어야 업무에 활력이 생기는 저라서 이번에도&amp;nbsp; 도전했죠.&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;font-family: 'Noto Serif KR';&quot;&gt;막상 들어가니 웬걸 조직도를 보지도 않고 왔네요. 이동한 조직 구성도는 다음과 같아요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;기술부문 &amp;gt; 클라우드플랫폼실 &amp;gt; 클라우드컴퓨팅팀 &amp;gt; AI클라우드플랫폼파트 &amp;gt; AI에이전트플랫폼셀&lt;/span&gt;&lt;/blockquote&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;font-family: 'Noto Serif KR';&quot;&gt;역시나 이번에도 조직원들이 파놓은 우물은 너무나 깊어 보였어요. 이러한 고민을 새로운 리더에게 공유하니 다음 얘기를 해주셨어요. &quot;남들이 깊게 파놓은 우물은 한 번에 판 게 아니에요, 절대 그렇게 팔 수 없어요. 깊이가 깊어지려면 옆을 더 파야해요.&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1960&quot; data-origin-height=&quot;1920&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YGk18/btsC6ScyArI/0dVgGxjPszK3K7uQu4qlPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YGk18/btsC6ScyArI/0dVgGxjPszK3K7uQu4qlPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YGk18/btsC6ScyArI/0dVgGxjPszK3K7uQu4qlPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYGk18%2FbtsC6ScyArI%2F0dVgGxjPszK3K7uQu4qlPk%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;1960&quot; height=&quot;1920&quot; data-origin-width=&quot;1960&quot; data-origin-height=&quot;1920&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;머리를 땅 얻어맞는 듯한 깨달음이었어요. &quot;과거 나는 깊게 파기 위해 옆을 야금야금 파서 하나의 포스팅을 완성했었구나&quot;. 다시 그 기억을 살려 블로그와 함께 깊은 우물을 만들어나가려 해요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;다시 느끼고 싶은 성과&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;사회생활을 하니 아는 사람은 많아지지만 나의 사회는 점점 작아지는 것을 느껴요. (물론 제가 의도적으로 선택과 집중을 하는 것도 있지만요.) 위에서 얘기했던 성과를 통해 느꼈던 기쁨에는 '함께 자라기'와 누군가 나의 성과를 '수치적으로 평가'가 있었죠. 현실적으로 오프라인의 좁은 사회에서의 평가는 한계를 느끼지만, 블로그 사회에선 좀 더 넓게 영향을 미치는 사람이 되고 싶어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;커리어적 성숙&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;업무를 진행하다 보면 당연히 아는 것이 늘어나지만, 그와 함께 까먹는 것도 너무 많다는 걸 요즘 느끼고 있어요. 이를 위해 올해부턴 처음으로 업무 일지도 작성하기 시작했어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;앞으로 기록을 통해 나의 지식을 정리하고, 이를 남에게 설명할 수 있을 정도로 만들고자 해요. 이게 가능해야 제가 시니어가 될 수 있다고 생각해요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;05 운영 계획&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;디자인 변경&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;아이티 마이닝이라는 블로그명은 IT 지식에 대해 삽질(광부로서)을 하자는 포부였어요. 이제는 좀 더 저를 브랜딩 할 수 있는 에반이 포함된 이름으로 (당장은 에반, 어른반) 바꾸려고 해요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;스킨도 더 이쁘게 바꿔보려고 해요. Velog가 딱 제 취향인데 구글애드센스를 포기할 수가 없군요.  &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;방향성&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;성과 파트에서 블로그의 즐거움을 느꼈기 때문에 함께 자라기, 수치적으로 보이는 성장 두 가지를 더 발전시키려고 해요. 댓글로 더 소통하고 수치적으로도 어떻게 성장하고 있는지 기록할까 해요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;나의 성장 기록도 남기려고 해요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;개발 스킬만이 아닌 회고, 일기 등 여러 갈래의 이야기를 다뤄볼까 해요.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7Mdu7/btsC2yTJHkx/Kn1NwkxDfWIkrnHxmDsv31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7Mdu7/btsC2yTJHkx/Kn1NwkxDfWIkrnHxmDsv31/img.png&quot; data-alt=&quot;잘부탁드립니다!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7Mdu7/btsC2yTJHkx/Kn1NwkxDfWIkrnHxmDsv31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7Mdu7%2FbtsC2yTJHkx%2FKn1NwkxDfWIkrnHxmDsv31%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;1920&quot; height=&quot;1080&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;잘부탁드립니다!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>About</category>
      <author>에반황</author>
      <guid isPermaLink="true">https://itmining.tistory.com/173</guid>
      <comments>https://itmining.tistory.com/173#entry173comment</comments>
      <pubDate>Sun, 7 Jan 2024 00:40:50 +0900</pubDate>
    </item>
    <item>
      <title>Java Enum 기본</title>
      <link>https://itmining.tistory.com/149</link>
      <description>&lt;p&gt;데이터 중에는 몇 가지로 한정된 값만을 갖는 경우가 흔히 있다. 예를 들어 계절은 봄, 여름, 가을, 겨울 그리고 요일은 월, 화, 수, 목, 금, 토, 일이라는 한정된 값을 가진다. 이렇게 한정된 값만을 가지는 데이터 타입이 열거 타입(Enumeration type)이다.&lt;/p&gt;
&lt;h3&gt;열거 타입의 장점&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;문자열과 비교해 IDE의 지원을 받을 수 있다. (자동완성, 오타 검증, 텍스트 리팩토링)&lt;/li&gt;
&lt;li&gt;허용 가능한 값들을 제한&lt;/li&gt;
&lt;li&gt;리팩토링 시 변경 범위가 최소화 된다. (내용 추가가 필요해도 Enum 코드 외에 수정할 필요가 없다.)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;해당 장점은 모든 언어가 Enum에서 얻을 수 있는 장점이다. 더 나아가 Java Enum의 경우 C/C++과 다르게 Enum이 int 값이 아니라 완전한 기능을 가진 클래스이다. 이를 기반한 장점이 더 있다.&lt;/p&gt;
&lt;h3&gt;열거 타입 선언&lt;/h3&gt;
&lt;p&gt;열거 타입 선언을 위해서는 먼저 열거 타입의 이름을 정하고 열거 타입 이름으로 소스 파일(.java)를 생성해야 한다. 관례상 첫 문자를 대문자로 하고 나머지는 소문자로 구성한다. 두 단어 이상으로 구성됬다면 단어의 첫 문자를 대문자로 한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Season.java
Week.java&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Season.java&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;소스 파일의 내용은 다음과 같이 열거 타입 선언이 온다. public enum 키워드는 열거 타입을 선언하기 위한 키워드이다.&lt;br&gt;열거 타입을 선언했다면 이제 열거 상수를 선언하면 된다. 열거 상수는 열거 타입의 값으로 사용되는데, 관례적으로 모두 대문자로 작성한다. 여러 단어일 경우는 &lt;code&gt;LOGIN_SUCCESS&lt;/code&gt;, &lt;code&gt;LOGIN_FAILED&lt;/code&gt;와 같이&lt;code&gt;_&lt;/code&gt;로 연결하는 것이 관례다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public enum Season {
  SPRING,
  SUMMER,
  AUTUMN,
  WINTER
}&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;열거 타입 변수&lt;/h3&gt;
&lt;p&gt;열거 타입 선언 후 사용하는 방법에 대해 알아보자. 열거 타입도 하나의 데이터 타입이므로 변수를 선언하고 사용해야한다.&lt;br&gt;다음은 열거 타입 변수를 선언하는 방법이다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;열거타입 변수;
Season season;
Season weddingSeason;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;열거 타입 변수를 선언했다면 다음과 같이 열거 상수를 저장할 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;열거타입 변수 = 열거타입.열거상수;
Season weddingSeason = Season.AUTUMN;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;열거 타입 변수는 다음과 같이 null을 저장할 수 있는데, 열거 타입도 참조 타입이기 때문이다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Season season = null;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;참조 타입 변수는 객체를 참조하는 변수로 알고 있는데 열거 상수는 객체일까? 그렇다. 열거 상수는 열거 객체로 생성된다. 열거 타입 Season의 경우 SPRING에서 WINTER까지 4개의 Season 객체로 생성된다. 그리고 메소드 영역에 생성된 열거 상수가 해당 Season 객체를 각각 참조하게 된다.&lt;/p&gt;
&lt;p&gt;그렇다면 다음 코드를 어떻게 이해하면 좋을까?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Season season = Season.SPRING;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;열거 타입 변수 season은 스택 영역에 생성된다. season에 저장되는 값은 Season.SPRING 열거 상수가 참조하는 객체의 번지이다. 따라서 열거 상수 Season.SPRING과 season 변수는 서로 같은 Season 객체를 참조하게 된다.&lt;br&gt;그렇기 때문에 season 변수와 Season.SPRING 상수의 &lt;code&gt;==&lt;/code&gt; 연산 결과는 true가 된다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;season == Season.SPRING // true&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;열거 객체의 메소드&lt;/h3&gt;
&lt;h4&gt;name()&lt;/h4&gt;
&lt;p&gt;열거 객체의 문자열 리턴&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Season season = Season.SPRING;
String name = season.name(); // &amp;quot;SPRING&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;ordinal()&lt;/h4&gt;
&lt;p&gt;열거 객체가 몇 번째인지를 리턴&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public enum Season {
  SPRING, // 0
  SUMMER, // 1
  AUTUMN, // 2
  WINTER  // 3
}

Season season = Season.AUTUMN;
int ordinal = season.ordinal(); // 2&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;compareTo()&lt;/h4&gt;
&lt;p&gt;매개값으로 주어진 열거 객체를 기준으로 전 후로 몇 번째 위치하는지 비교&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Season season1 = Season.SPRING; // 0
Season season2 = Season.WINTER; // 3
int result1 = season1.compareTo(season2); // -3
int result2 = season2.compareTo(season1); // 3&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;valueOf()&lt;/h4&gt;
&lt;p&gt;매개값으로 주어지는 문자열과 동일한 문자열을 가지는 열거 객체를 리턴한다.&lt;br&gt;외부로부터 문자열을 받아 열거 객체로 변환할 때 유용하다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Season season = Season.valueOf(&amp;quot;SPRING&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;values()&lt;/h4&gt;
&lt;p&gt;열거 타입의 모든 열거 객체들을 배열로 만들어 리턴&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Season[] seasons = Season.values();
for(Season season : seasons) {
  System.out.println(season);
}&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;열거 상수를 다른 값과 연결하기&lt;/h3&gt;
&lt;p&gt;열거 상수 각각이 열거 객체이므로 열거 객체에 생성자를 사용해서 다음과 같이 열거 상수에 다른 값을 할당할 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public enum Type {
    // 상수(&amp;quot;연결할 문자&amp;quot;)
    WALKING(&amp;quot;워킹화&amp;quot;), 
    RUNNING(&amp;quot;러닝화&amp;quot;),
    TRACKING(&amp;quot;트래킹화&amp;quot;), 
    HIKING(&amp;quot;등산화&amp;quot;);

    final private String name;

    private Type(Stirng name) { // enum에서 생성자 같은 역할
        this.name = name;
    }
    public String getName() { // 문자를 받아오는 함수
        return name;
    }
}
public class Shoes {
    public static void main(String[] args) {
        for(Type type : Type.values()){
            System.out.println(type.getName());
        }
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;결과&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;워킹화
러닝화
트래킹화
등산화&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;클래스의 static final 이용해 열거 타입 선언하기&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;class Type {
    static final String WALKING = &amp;quot;워킹화&amp;quot;;
    static final String RUNNING = &amp;quot;러닝화&amp;quot;;
    static final String TRACKING = &amp;quot;트래킹화&amp;quot;;
    static final String HIKING = &amp;quot;등산화&amp;quot;;
}

public class Shoes {
    public static void main(String[] args) {
        String w = Type.WALKING;
        System.out.println(w);
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;결과&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;워킹화&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;[웹사이트] &lt;a href=&quot;https://www.opentutorials.org/module/1226/8025&quot;&gt;생활코딩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[웹사이트] &lt;a href=&quot;http://woowabros.github.io/tools/2017/07/10/java-enum-uses.html&quot;&gt;우아한형제들 기술 블로그&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[서적] 이것이 자바다&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Basic/Java</category>
      <author>에반황</author>
      <guid isPermaLink="true">https://itmining.tistory.com/149</guid>
      <comments>https://itmining.tistory.com/149#entry149comment</comments>
      <pubDate>Wed, 27 Nov 2019 16:55:02 +0900</pubDate>
    </item>
    <item>
      <title>Spring Jackson 프로퍼티 Naming Strategy</title>
      <link>https://itmining.tistory.com/148</link>
      <description>&lt;h2&gt;1. 개요&lt;/h2&gt;
&lt;p&gt;Jackson은 Java Object를 Json으로 변환하는 가장 유명한 라이브러리입니다. POJO를 JSON으로 바꾸는 동안 프로퍼티명은 키로서 사용됩니다. 하지만 때때로 우리는 프로퍼티명을 다른 방식으로 사용하고 싶을 때가 있죠. Jackson은 이를 위해 여러가지 네이밍 전략을 제공하고 있습니다.&lt;br /&gt;(&lt;code&gt;SnakeCaseStrategy&lt;/code&gt;, &amp;nbsp;&lt;code&gt;PascalCaseStrategy&lt;/code&gt;, &amp;nbsp;&lt;code&gt;LowerCaseStrategy&lt;/code&gt;, &amp;nbsp;&lt;code&gt;KebabCaseStrategy&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;EmployeeController.java&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;spring boot 어플리케이션에 Employee라는 POJO를 응답으로 반환하는 RestController를 만들어봅시다. 응답은 자동으로 Jackson의 기본 네이밍 전략에 의해 JSON 형식으로 날아갈 겁니다.&lt;/p&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;@RestController
public class EmployeeController {
    @GetMapping(&quot;/getEmployee&quot;)
    public Employee getEmployees() {
        Employee employee=new Employee();
        employee.setEmployeeId(19);
        employee.setEmployeeName(&quot;Harry&quot;);
        employee.setEmployeeRole(&quot;DEVELOPER&quot;);
        return employee;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Employee.java&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Employee라는 프로퍼티명이 &lt;code&gt;CamelCase&lt;/code&gt;인 POJO 객체를 만듭니다.&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;public class Employee {

    private int employeeId;
    private String employeeName;
    private String employeeRole;

    public int getEmployeeId() { return employeeId; }

    public void setEmployeeId(int employeeId) { this.employeeId = employeeId;}

    public String getEmployeeRole() { return employeeRole; }

    public void setEmployeeRole(String employeeRole) { this.employeeRole = employeeRole; }

    public String getEmployeeName() { return employeeName; }

    public void setEmployeeName(String employeeName) { this.employeeName = employeeName; }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Spring Jackson 프로퍼티 네이밍 전략&lt;/h2&gt;
&lt;p&gt;spring boot 어플리케이션은 &lt;code&gt;application.properties&lt;/code&gt; 또는 &lt;code&gt;application.yml&lt;/code&gt; 내에 있는 &lt;code&gt;spring.jackson.property-naming-strategy&lt;/code&gt; 설정하고&lt;/p&gt;
&lt;p&gt;spirng boot 어플리케이션이 아니거나 spring MVC 어플리케이션이라면 &lt;code&gt;Jackson2ObjectMapperBuilder&lt;/code&gt; 를 빈으로 등록하고 네이밍 전략과 관련 있는 configuration을 정의합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;하단에 Jackson이 지원하는 다섯가지 전략이 있습니다 :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;LOWER_CAMEL_CASE&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LOWER_CASE&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SNAKE_CASE&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;UPPER_CAMEL_CASE&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;KEBAB_CASE&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;b&gt;EmployeeContollerTest.java&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;이를 테스트하는 간단한 테스트를 만들어 확인해 봅시다. 해당 테스트를 생략하고 하단의 결과만 보셔도 무방합니다.&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
class EmployeeControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void get_employees() throws Exception {
        mockMvc.perform(get(&quot;/getEmployee&quot;))
                .andDo(print())
                .andExpect(status().isOk());
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. LowerCamelCase&lt;/h3&gt;
&lt;p&gt;application.properties&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;spring.jackson.property-naming-strategy=LOWER_CAMEL_CASE&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;또는&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;@Bean
public Jackson2ObjectMapperBuilder jacksonBuilder() {
     Jackson2ObjectMapperBuilder b = new Jackson2ObjectMapperBuilder();
     b.propertyNamingStrategy(PropertyNamingStrategy.LOWER_CAMEL_CASE);
     return b;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;결과:&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
    &quot;employeeId&quot;: 19,
    &quot;employeeName&quot;: &quot;Harry&quot;,
    &quot;employeeRole&quot;: &quot;DEVELOPER&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. LowerCaseStrategy&lt;/h3&gt;
&lt;p&gt;application.properties&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;spring.jackson.property-naming-strategy=LOWER_CASE&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;또는&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;@Bean
public Jackson2ObjectMapperBuilder jacksonBuilder() {
     Jackson2ObjectMapperBuilder b = new Jackson2ObjectMapperBuilder();
     b.propertyNamingStrategy(PropertyNamingStrategy.LOWER_CASE);
     return b;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;결과:&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;  {
    &quot;employeeid&quot;: 19,
    &quot;employeename&quot;: &quot;Harry&quot;,
    &quot;employeerole&quot;: &quot;DEVELOPER&quot;
  }&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. SnakeCaseStrategy&lt;/h3&gt;
&lt;p&gt;application.properties&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;spring.jackson.property-naming-strategy=SNAKE_CASE&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;또는&lt;/p&gt;
&lt;p&gt;If we do not have application.properties file than create a bean with following configurations.&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;@Bean
public Jackson2ObjectMapperBuilder jacksonBuilder() {
     Jackson2ObjectMapperBuilder b = new Jackson2ObjectMapperBuilder();
     b.propertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
     return b;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;결과:&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;employee_id&quot;: 19,
  &quot;employee_name&quot;: &quot;Harry&quot;,
  &quot;employee_role&quot;: &quot;DEVELOPER&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3&gt;4. UpperCamelCaseStrategy&lt;/h3&gt;
&lt;p&gt;application.properties&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;spring.jackson.property-naming-strategy=UPPER_CAMEL_CASE&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;또는&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;@Bean
public Jackson2ObjectMapperBuilder jacksonBuilder() {
     Jackson2ObjectMapperBuilder b = new Jackson2ObjectMapperBuilder();
     b.propertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE);
     return b;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;결과:&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;EmployeeId&quot;: 19,
  &quot;EmployeeName&quot;: &quot;Harry&quot;,
  &quot;EmployeeRole&quot;: &quot;DEVELOPER&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3&gt;5. KebabCaseStrategy&lt;/h3&gt;
&lt;p&gt;application.properties&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;spring.jackson.property-naming-strategy=KEBAB_CASE&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;또는&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;@Bean
public Jackson2ObjectMapperBuilder jacksonBuilder() {
     Jackson2ObjectMapperBuilder b = new Jackson2ObjectMapperBuilder();
     b.propertyNamingStrategy(PropertyNamingStrategy.KEBAB_CASE);
     return b;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;결과:&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;employee-id&quot;: 19,
  &quot;employee-name&quot;: &quot;Harry&quot;,
  &quot;employee-role&quot;: &quot;DEVELOPER&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2&gt;3. 결론&lt;/h2&gt;
&lt;p&gt;이 포스트에서 우리는 자바 오브젝트를 JSON으로 변환하여 응답으로 전달할 때 프로퍼티명을 다양한 네이밍 규칙을 통해 바꾸어 보았습니다. &lt;code&gt;application.properties&lt;/code&gt; 또는 &lt;code&gt;Jackson2ObjectMapperBuilder&lt;/code&gt; 빈을 통해서 설정하는 방법도 다뤘습니다.&lt;/p&gt;
&lt;h2&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2&gt;4. 참조&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://fasterxml.github.io/jackson-databind/javadoc/2.7/com/fasterxml/jackson/databind/PropertyNamingStrategy.html&quot;&gt;PropertyNamingStrategy.java API document&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring&quot;&gt;Spring boot with Jackson example&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Backend/Spring</category>
      <author>에반황</author>
      <guid isPermaLink="true">https://itmining.tistory.com/148</guid>
      <comments>https://itmining.tistory.com/148#entry148comment</comments>
      <pubDate>Tue, 26 Nov 2019 14:52:06 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Boot] Pagination과 Sort</title>
      <link>https://itmining.tistory.com/139</link>
      <description>&lt;h1&gt;1. 개요&lt;/h1&gt;
&lt;p&gt;Pagination은 큰 데이터를 표현할 때 도움이 됩니다. 또한 어떠한 기준으로 데이터를 정렬하며 페이징해야할 수 있습니다.&lt;br /&gt;이번 튜토리얼은 Spring Data Jpa를 사용하여 페이징하는 방법에 대해 알아보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. 초기 셋업&lt;/h1&gt;
&lt;p&gt;첫 째로, Product 라는 entity를 다음과 같이 만들어봅시다:&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;@Entity
public class Product {

    @Id
    private long id;
    private String name;
    private double price; 

    // constructors, getters and setters 

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;우리의 도메인 클래스입니다. 각 Product 인스턴스는 유니크 식별자로 id를 사용하고 name과 price를 가지고 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3. Repository 생성&lt;/h1&gt;
&lt;p&gt;우리가 만든 Product 에 접근하기 위해 ProductRepository 를 만들어봅시다.&lt;/p&gt;
&lt;pre class=&quot;fortran&quot;&gt;&lt;code&gt;public interface ProductRepository extends PagingAndSortingRepository&amp;lt;Product, Integer&amp;gt; {

    List&amp;lt;Product&amp;gt; findAllByPrice(double price, Pageable pageable);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;PagingAndSortingRepository를 확장 함으로써, 페이징과 정렬을위한 findAll(Pageable Pageable)과 findAll (Sort sort) 메소드를 사용할 수 있습니다. 일단 PagingAndSortingRepository를 확장하면 위 코드의 findAllByPrice 처럼 Pageable, Sort 파라미터를 사용할 수 있게 됩니다. 또는, 우리는 PagingAndSortingRepository 를 확장한 JpaRepository 를 대신 사용하여도 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;4. Pagination&lt;/h1&gt;
&lt;p&gt;일단 우리의 repository를 PaginAndSortingRepository 를 통해 확장한 후에 다음을 하면 됩니다:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Pageable 인터페이스를 구현한 PageRequest 객체를 만들거나 얻습니다.&lt;/li&gt;
&lt;li&gt;PageRequest 객체를 repository 메소드에 우리가 의도한데로 인자로 전달합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PageRequest 객체는 요청된 페이지 숫자와 페이지 사이지를 넘김으로서 만듭니다. (페이지 숫자는 0부터 시작합니다):&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;Pageable firstPageWithTwoElements = PageRequest.of(0, 2);

Pageable secondPageWithFiveElements = PageRequest.of(1, 5);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Spring MVC에서는 Spring Data Web Support 를 이용해 Pageable 객체를 가져올 수도 있습니다.&lt;br /&gt;PageRequest 객체가 있으면 repository 메소드를 호출하며 전달할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;pf&quot;&gt;&lt;code&gt;Page&amp;lt;Product&amp;gt; allProducts = productRepository.findAll(firstPageWithTwoElements);

List&amp;lt;Product&amp;gt; allTenDollarProducts = 
  productRepository.findAllByPrice(10, secondPageWithFiveElements);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;findAll(Pageable pageable) 메소드는 기본적으로 Page 객체를 리턴합니다.&lt;br /&gt;그러나, 우리는 또한 커스텀 메소드를 통해 페이지네이션된 데이터를 Page , Slice 또는 List 의 타입으로 받을 수 있습니다.&lt;/p&gt;
&lt;p&gt;Page 인스턴스는 Product 의 목록 뿐 아니라 페이징할 수 있는 전체 목록의 숫자도 알고 있습니다. 이를 실행하기 위해 추가적으로 쿼리 작업이 들어갑니다. 이러한 작업에 대한 비용을 방지하기 위해, 우리는 대신 Slice나 List로 반환 받을 수 있습니다. Slice 는 단지 다음 slice가 가능한지 아닌지만 알고 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;5. Pagination과 Sorting&lt;/h1&gt;
&lt;p&gt;유사하게, 우리의 쿼리 결과를 정렬하기 위해선 Sort 객체를 메소드에 전달하면 됩니다.&lt;/p&gt;
&lt;pre class=&quot;gradle&quot;&gt;&lt;code&gt;Page&amp;lt;Product&amp;gt; allProductsSortedByName = productRepository.findAll(Sort.by(&quot;name&quot;));&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;만약, 정렬과 페이지네이션을 둘다 하고 싶다면 어떻게해야할까요?&lt;/p&gt;
&lt;p&gt;정렬에 대한 디테일 정보를 PageRequest 객체에 전달하면 됩니다.&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;Pageable sortedByName = 
  PageRequest.of(0, 3, Sort.by(&quot;name&quot;));

Pageable sortedByPriceDesc = 
  PageRequest.of(0, 3, Sort.by(&quot;price&quot;).descending());

Pageable sortedByPriceDescNameAsc = 
  PageRequest.of(0, 5, Sort.by(&quot;price&quot;).descending().and(Sort.by(&quot;name&quot;)));&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;6. 결론&lt;/h1&gt;
&lt;p&gt;이번 튜토리얼에선, 어떻게 Spring Data JPA를 통해 쿼리된 데이터를 페이지네이트하고 정렬하는지 알아봤습니다.&lt;br /&gt;이에 대한 튜토리얼은 Github 에서 찾아볼 수 있습니다.&lt;/p&gt;</description>
      <category>Backend/Spring</category>
      <author>에반황</author>
      <guid isPermaLink="true">https://itmining.tistory.com/139</guid>
      <comments>https://itmining.tistory.com/139#entry139comment</comments>
      <pubDate>Thu, 11 Jul 2019 14:52:13 +0900</pubDate>
    </item>
    <item>
      <title>[Django] 장고 웹서비스의-이해</title>
      <link>https://itmining.tistory.com/135</link>
      <description>&lt;h2&gt;&lt;span&gt;&lt;span&gt;django 프로젝트 구성&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;장고를 이용해 웹서비스를 구성할 때 보통 다음과 같은 구조를 가진다고 합니다. 기본적으로 WSGI Web Application Server 하단 부분을 구현하게 되는데&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;, 상단의 웹 서버와 웹 애플리케이션 서버에 대한 궁금증으로 조사해본 결과를 공유합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;569&quot; height=&quot;815&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r5HQv/btqv8l0JrhM/fkJWzNAaXW7sRWu6Dd0NY1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r5HQv/btqv8l0JrhM/fkJWzNAaXW7sRWu6Dd0NY1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r5HQv/btqv8l0JrhM/fkJWzNAaXW7sRWu6Dd0NY1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr5HQv%2Fbtqv8l0JrhM%2FfkJWzNAaXW7sRWu6Dd0NY1%2Fimg.jpg&quot; width=&quot;569&quot; height=&quot;815&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;&lt;span&gt;Web Server가 뭔데?&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;웹서버는 다른 말로 HTTP Server라고도 부른다. 웹브라우저의 카운터 파트너로서 서버 쪽에서 정보를 제공하는 소프트웨어를 의미한다. 클라이언트로부터의 HTTP요청을 받아 &lt;b&gt;정적&lt;/b&gt;인 페이지/파일을 돌려준다. (동적인 부분은 WSGI가 담당. 아래에서 다룹니다.) &lt;b&gt;가벼움과 높은 성능을 목표&lt;/b&gt;로 한다. 웹 서버&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;, 리버스 프록시 및 메일 프록시 기능을 가진다. 대표적인 웹서버는 &lt;b&gt;Apache&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;, Nginx&lt;/b&gt;가 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;&lt;span&gt;Nginx가 뭐지?&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;NGINX는 차세대 웹서버로 불린다. 위의 그래프를 통해서 알 수 있듯이 Apache의 독주에 제동을 걸고 있다. NGINX의 특징은 한마디로 정의하면 아래와 같다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;더 적은 자원으로 더 빠르게 데이터를 서비스 할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;&lt;span&gt;NGINX와 Apache의 관계&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;Apache는 웹의 산증인이라고 해도 과언이 아니다. 위의 그래프에 따르면 1996년 이래로 한번도 1등의 자리를 놓친적이 없다. 오픈소스이고&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;, 무료로 사용할 수 있는 소프트웨어인 아파치가 웹을 지탱하고 있다고해도 과언이 아니다. 하지만&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;, 아파치는 오래전에 만들어진 소프트웨어다. 아파치가 만들어진 시대의 요구사항이 이제는 유효하지 않은 것도 있고&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;, 새로운 요구사항과 충돌하는 것도 있을 것이다. 그렇다고 과거의 유산을 청산하고 마냥 새로운 시대의 요구사항만 쫒아갈수는 없는 것이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;NGINX는 새로운 시대의 요청에 부응해서 만들어진 웹서버이다. &lt;b&gt;개발의 모든 목적이 높은 성능에 맞춰져 있다.&lt;/b&gt; 그리고 잘 사용하지 않는 기능은 과감하게 제외했다. 덕분에 폭발적인 증가세에 있는 인터넷 서비스를 지탱하는데 적합하다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;&lt;span&gt;Django는 웹 서버야?&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;장고는 장고만의 웹서버를 사용한다. 개발 목적으로 python으로 짜여진 가벼운 wsgi(web server gateway interface)를 사용한다. 그렇다. 장고도 웹서버인 것이다. (정확하게 얘기하자면&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;, 장고 자체는 웹 프레임워크이고 runserver를 통해 웹 서버와 웹 애플리케이션 서버 역할을 하는 것.) 하지만 &lt;b&gt;프로덕션 과정에서는 사용하지 않는 것을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;a href=&quot;https://docs.djangoproject.com/en/2.2/ref/django-admin/#runserver&quot;&gt;추천&lt;/a&gt;&lt;span&gt;&lt;span&gt;한다.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;DO NOT USE THIS SERVER IN A PRODUCTION SETTING. It has not gone through security audits or performance tests. (We&amp;rsquo;re in the business of making Web frameworks, not Web servers, so improving this server to be able to handle a production environment is outside the scope of Django.) 이 서버를 프로덕션 세팅에서 사용하지마라. 이것은 보안 검수나 퍼포먼스 테스트를 통과하지 않았다. (우리는 웹 서버를 만드려는게 아니고 웹 프레임워크를 만들었고, 그렇기 때문에 프로덕션 환경에서 서버를 향상시키고 싶다면 장고 외의 서버를 사용하라. )&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;WAS&lt;span&gt;(Web Application Server)는 뭔데?&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;간단하게 말해 웹 서버 위에 &lt;b&gt;서버 어플리케이션을 얹은 것.&lt;/b&gt; &lt;b&gt;동적 리소스 처리를 위해 사용.&lt;/b&gt; (정적 처리도 가능하긴 함) 웹 서버(Nginx)와 웹 애플리케이션(Django)간의 연결을 중계 (Nginx에서 받은 요청을 Django에서 처리하기 위한 중계인 역할을 해준다.) Nginx는 Python을 모르기 때문에 uWSGI는 HTTP 요청을 python으로&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;, Django로 부터 받은 응답을 Nginx가 알 수 있도록 변환해준다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;&lt;span&gt;WSGI 서버는 뭔데?&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;웹서버와 파이썬을 사용한 웹 어플리케이션 개발환경 간의 인터페이스에 대한 표준 규칙. 파이썬의 웹 어플리케이션 서버!&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;파이썬으로 선택할 수 있는 웹 프레임워크에서 사용할 수 있는 기존 웹서버는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;CGI&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;FastCGI&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;mod_python&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;, 또는 커스텀으로 만들어진 API 등으로 상당히 제한되어 있었다. 또 반대로 웹서버를 선택하는 것이 파이썬 웹개발환경을 제한하기도 하였다. 이를 위해 표준으로 나온 것이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;WSGI&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;WSGI는 웹서버와 웹 어플리케이션(또는 프레임워크) 간에 호환성있는 웹 어플리케이션 개발환경을 만들기 위해 로우-레벨 인터페이스로 만들어졌다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;WSGI는 보통 서버 사이드와 게이트웨이 사이드(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;Nginx&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;Apache&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;등)를 가진다. 그리고 어플리케이션 또는 프레임워크 사이드와 통신한다. WSGI 요청을 처리하기 위해서 서버사이드는 어플리케이션을 실행하고 환경정보를 제공하며&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;, 콜백 함수를 어플리케이션 사이드에 전달한다. 그러면 어플리케이션은 요청을 실행하고 전달받은 콜백 함수를 통하여 응답을 서버사이드에 넘겨준다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;서버와 어플리케이션 사이에서&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;, 양방향의 API를 실행할 수 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;WSGI 미들웨어&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;(이하 미들웨어&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;, middleware)가 사용되기도 한다. 서버는 클라이언트의 요청을 받아 미들웨어에 넘겨준다. 미들웨어가 요청을 처리한 후에는 요청을 어플리케이션에 보낸다. 어플리케이션에서 나온 응답은 다시 미들웨어를 통해 서버와 궁극적으로 클라이언트 측에 전달된다. WSGI 친화적인 어플리케이션에서는 이러한 미들웨어 여러 개가 스택을 이루어 사용될 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;&lt;span&gt;Web Server와 Web Application Server&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;678&quot; height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DbQTp/btqv6EAAZ4X/YlIVo8EgcK9wfM75gNFDXK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DbQTp/btqv6EAAZ4X/YlIVo8EgcK9wfM75gNFDXK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DbQTp/btqv6EAAZ4X/YlIVo8EgcK9wfM75gNFDXK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDbQTp%2Fbtqv6EAAZ4X%2FYlIVo8EgcK9wfM75gNFDXK%2Fimg.jpg&quot; width=&quot;678&quot; height=&quot;291&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;그렇다면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;WAS&lt;span&gt;만 쓰면 되지 어째서 웹서버를 따로 쓰느냐는 의문이 생길 수 있다. 그 이유는 목적이 다르기 때문이다. &lt;b&gt;웹 서버는 정적인 데이터만 처리하는 서버&lt;/b&gt;이다. 이미지나 단순 html파일과 같은 리소스를 제공하는 서버는 웹 서버를 통하면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;WAS&lt;span&gt;를 이용하는 것보다 &lt;b&gt;빠르고 안정적이다.&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;WAS&lt;/b&gt;&lt;span&gt;&lt;b&gt;는 동적인 데이터를 처리하는 서버&lt;/b&gt;이다. DB와 연결되어 데이터를 주고 받거나 프로그램으로 데이터 조작이 필요한 경우에는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;WAS&lt;span&gt;를 활용 해야 한다. 실무에서는 둘 다를 연동해서 사용한다. 정적 처리는 웹서버에서&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;, 동적 처리는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;WAS&lt;span&gt;에서 처리한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;&lt;span&gt;참고&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://datascienceschool.net/view-notebook/f9b09998601441f4a7026e62353cf751/&quot;&gt;python 웹 서비스 개요&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://juliahwang.kr/network/2017/09/17/WSGI%EB%9E%80%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80.html&quot;&gt;WSGI란 무엇인가?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://brownbears.tistory.com/350&quot;&gt;WSGI, WAS, CGI 이해&lt;/a&gt;&lt;/p&gt;</description>
      <category>Backend/Django</category>
      <author>에반황</author>
      <guid isPermaLink="true">https://itmining.tistory.com/135</guid>
      <comments>https://itmining.tistory.com/135#entry135comment</comments>
      <pubDate>Mon, 17 Jun 2019 10:24:44 +0900</pubDate>
    </item>
    <item>
      <title>[c#] async / await 사용 예시</title>
      <link>https://itmining.tistory.com/129</link>
      <description>&lt;h1&gt;C# async await&lt;/h1&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;예제&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-c#&quot; lang=&quot;c#&quot;&gt;// 3가지 주의해야할 Signiture가 있음:
//  - 메소드는 async 수식어가 있어야한다.  
//  - return type은 Task나 Task&amp;lt;T&amp;gt;여야 한다.
//    여기서는, integer를 반환하기 때문에 Task&amp;lt;int&amp;gt;를 반환한다.
//  - 메소드의 이름은 Async로 끝나야한다.
async Task&amp;lt;int&amp;gt; AccessTheWebAsync()  
{   
    using (HttpClient client = new HttpClient())  
    {  
        // GetStringAsync는 Task&amp;lt;string&amp;gt;을 리턴. 
        // 기다리면 문자열을 얻는다는 뜻이다. (urlContents).
        Task&amp;lt;string&amp;gt; getStringTask = client.GetStringAsync(&quot;https://docs.microsoft.com&quot;);  
  
        // GetStringAsync로부터 얻는 string 값과 관계 없는 작업을 여기서 진행한다. 
        DoIndependentWork();  
  
        // await 연산자는 AccessTheWebAsync를 지연시킵니다. 
        //  - getStringTask가 완료되기 전에 AccessTheWebAsync를 진행할 수 없습니다.
        //  - 그동안 제어권은 호출자인 AccessTheWebAsync로 넘어갑니다.
        //  - getStringTask가 완료되면 제어가 다시 시작됩니다.
        //  - await 연산자는 getStringTask로부터 문자열 결과를 가져옵니다.
        string urlContents = await getStringTask;  
  
        // return 구문은 integer 결과를 명시합니다.
        // AccessTheWebAsync를 기다리는 모든 메서드는 length 값을 가져옵니다.
        return urlContents.Length;  
    }  
}  
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;async / await의 개념은 위의 예제를 통해 이해할 수 있습니다. Async한 작업을 하는 메서드 내에서는 다음과 같은 일을 하게 됩니다.&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;Async 메서드 호출&lt;/li&gt;
&lt;li&gt;Async 작업과 관련 없는 작업 진행&lt;/li&gt;
&lt;li&gt;완료를 기다림&lt;/li&gt;

&lt;/ol&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;만약 2번의 과정이 필요 없다면 다음과 같이 코드를 단순화 할 수 있습니다.&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-csharp&quot; lang=&quot;csharp&quot;&gt;string urlContents = await client.GetStringAsync(&quot;https://docs.microsoft.com&quot;);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;메서드는 일반적으로 비동기 작업이 완료될 때까지 메서드가 계속될 수 없는 지점을 표시하는 하나 이상의 대기 표현을 포함하고 있습니다. 한편, 메서드가 일시 중단되고 컨트롤이 메서드의 호출자로 반환됩니다. 이 항목의 다음 단원은 일시 중단 지점에서 발생하는 상황을 보여줍니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;비동기 메서드에서 수행되는 작업&lt;/h2&gt;&lt;p&gt;비동기 프로그래밍을 이해하는 데 있어 가장 중요한 점은 메서드에서 메서드로 제어 흐름을 이동하는 방법입니다. 다음 다이어그램이 과정을 안내합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 610px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9908603B5C9AF35E35&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9908603B5C9AF35E35&quot; width=&quot;610&quot; height=&quot;503&quot; filename=&quot;image-20190319114538175.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;다이어그램의 번호는 다음의 순서로 진행됩니다.&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;p&gt;이벤트 처리기가 호출되어 &lt;code&gt;AccessTheWebAsync&lt;/code&gt; 비동기 메서드를 기다립니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;AccessTheWebAsync&lt;/code&gt;는 &lt;a href=&quot;https://docs.microsoft.com/ko-kr/dotnet/api/system.net.http.httpclient&quot;&gt;HttpClient&lt;/a&gt; 인스턴스를 만들고 &lt;a href=&quot;https://docs.microsoft.com/ko-kr/dotnet/api/system.net.http.httpclient.getstringasync&quot;&gt;GetStringAsync&lt;/a&gt; 비동기 메서드를 호출하여 웹 사이트의 내용을 문자열로 다운로드합니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;GetStringAsync&lt;/code&gt;에서 특정 작업이 발생하여 진행이 일시 중단됩니다. 웹 사이트에서 다운로드 또는 다른 차단 작업을 수행할 때까지 기다려야 할 수 있습니다. 리소스를 차단하지 않기 위해 &lt;mark&gt;&lt;code&gt;GetStringAsync&lt;/code&gt;는 해당 호출자인 &lt;code&gt;AccessTheWebAsync&lt;/code&gt;에 제어 권한을 양도&lt;/mark&gt;합니다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GetStringAsync&lt;/code&gt;는 &lt;code&gt;TResult&lt;/code&gt;가 문자열인 &lt;a href=&quot;https://docs.microsoft.com/ko-kr/dotnet/api/system.threading.tasks.task-1&quot;&gt;Task&lt;/a&gt;를 반환하고 &lt;code&gt;AccessTheWebAsync&lt;/code&gt;는 &lt;code&gt;getStringTask&lt;/code&gt; 변수에 &lt;mark&gt;작업을 할당&lt;/mark&gt;합니다. 이 작업은 &lt;mark&gt;작업이 완료될 때 실제 문자열 값을 생성하기 위한 코드와 함께 &lt;code&gt;GetStringAsync&lt;/code&gt;를 호출하는 지속적인 프로세스&lt;/mark&gt;를 나타냅니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;getStringTask&lt;/code&gt;가 아직 대기되지 않았으므로 &lt;code&gt;AccessTheWebAsync&lt;/code&gt;가 &lt;code&gt;GetStringAsync&lt;/code&gt;의 최종 결과에 무관한 다른 작업을 계속할 수 있습니다. 이 작업은 동기 메서드 &lt;code&gt;DoIndependentWork&lt;/code&gt;를 호출하여 나타냅니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;DoIndependentWork&lt;/code&gt;는 작업을 수행하고 호출자에게 반환하는 동기 메서드입니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;AccessTheWebAsync&lt;/code&gt;에 &lt;mark&gt;&lt;code&gt;getStringTask&lt;/code&gt; 결과 없이 수행할 수 있는 작업이 없습니다. 다음으로 &lt;code&gt;AccessTheWebAsync&lt;/code&gt;는 다운로드한 문자열의 길이를 계산하여 반환하려 하지만, 메서드가 문자열을 확인할 때까지 해당 값을 계산할 수 없습니다.&lt;/mark&gt;&lt;/p&gt;
&lt;p&gt;따라서 &lt;code&gt;AccessTheWebAsync&lt;/code&gt;는 &lt;mark&gt;await 연산자를 사용해서 해당 프로세스를 일시 중단하고 &lt;code&gt;AccessTheWebAsync&lt;/code&gt;를 호출한 메서드에 제어 권한을 양도&lt;/mark&gt;합니다. &lt;code&gt;AccessTheWebAsync&lt;/code&gt;는 &lt;code&gt;Task&amp;lt;int&amp;gt;&lt;/code&gt;를 호출자에게 반환합니다. 작업은 다운로드한 문자열의 길이인 정수 결과를 만든다는 약속을 나타냅니다.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;참고&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GetStringAsync&lt;/code&gt;가 대기하기 전에 &lt;code&gt;getStringTask&lt;/code&gt;(및 &lt;code&gt;AccessTheWebAsync&lt;/code&gt;)가 완료되면 &lt;code&gt;AccessTheWebAsync&lt;/code&gt;에 컨트롤이 유지됩니다. 일시 중단 및 &lt;code&gt;AccessTheWebAsync&lt;/code&gt;의 반환 비용은 호출된 비동기 프로세스(&lt;code&gt;getStringTask&lt;/code&gt;)가 이미 완료되었고 &lt;code&gt;AccessTheWebSync&lt;/code&gt;가 최종 결과를 기다릴 필요가 없다면 낭비됩니다.&lt;/p&gt;
&lt;p&gt;호출자(이 예제의 이벤트 처리기) 내에서 처리 패턴이 계속됩니다. 호출자가 해당 결과를 기다리거나 즉시 기다리기 전에 &lt;code&gt;AccessTheWebAsync&lt;/code&gt;에서 결과에 의존하지 않는 다른 작업을 수행할 수 있습니다.&lt;code&gt;AccessTheWebAsync&lt;/code&gt;에 대한 이벤트가 대기 중이며 &lt;code&gt;AccessTheWebAsync&lt;/code&gt;가 &lt;code&gt;GetStringAsync&lt;/code&gt;를 대기 중입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;GetStringAsync&lt;/code&gt;가 완료되고 문자열 결과를 생성합니다. &lt;code&gt;GetStringAsync&lt;/code&gt;를 호출할 경우 문자열 결과가 예상대로 반환되지 않습니다. (메서드가 이미 3단계에서 작업을 반환했습니다.) 대신 문자열 결과가 메서드 &lt;code&gt;getStringTask&lt;/code&gt;의 완료를 나타내는 작업에 저장됩니다. await 연산자가 &lt;code&gt;getStringTask&lt;/code&gt;에서 결과를 검색합니다. 할당 문은 검색된 결과를 &lt;code&gt;urlContents&lt;/code&gt;에 할당합니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;AccessTheWebAsync&lt;/code&gt;에 문자열 결과가 있는 경우 메서드가 문자열 길이를 계산할 수 있습니다. 그런 다음 &lt;code&gt;AccessTheWebAsync&lt;/code&gt; 작업도 완료되고 대기 이벤트 처리기를 다시 시작할 수 있습니다. 이 항목 뒷부분의 전체 예에서는 이벤트 처리기가 길이 결과 값을 검색하고 출력하는지 확인할 수 있습니다.
비동기 프로그래밍을 처음 접하는 사용자인 경우 동기 동작과 비동기 동작의 차이점을 살펴보세요. 동기 메서드는 작업이 완료될 때 반환되지만(5단계) &lt;mark&gt;비동기 메서드는 작업이 일시 중단될 때 반환&lt;/mark&gt;됩니다. 비동기 메서드가 해당 작업을 완료하면 작업이 완료된 것으로 표시되고 결과가 있을 경우 작업에 저장됩니다.&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;스레드&lt;/h2&gt;&lt;p&gt;비동기 메서드는 &lt;mark&gt;비차단 작업&lt;/mark&gt;입니다. 비동기 메서드의 &lt;code&gt;await&lt;/code&gt; 식은 대기한 작업이 실행되는 동안 &lt;mark&gt;현재 스레드를 차단하지 않습니다. 대신에 이 식은 메서드의 나머지를 연속으로 등록하고 제어 기능을 비동기 메서드 호출자에게 반환&lt;/mark&gt;합니다.&lt;/p&gt;&lt;p&gt;&lt;code&gt;async&lt;/code&gt; 및 &lt;code&gt;await&lt;/code&gt; 키워드로 인해 &lt;mark&gt;추가 스레드가 생성되지 않습니다.&lt;/mark&gt; 비동기 메서드는 &lt;mark&gt;자체 스레드에서 실행되지 않으므로 다중 스레드가 필요하지 않습니다.&lt;/mark&gt; 메서드는 &lt;mark&gt;현재 동기화 컨텍스트에서 실행되고 메서드가 활성화된 경우에만 스레드에서 시간을 사용&lt;/mark&gt;합니다. &lt;a href=&quot;https://docs.microsoft.com/ko-kr/dotnet/api/system.threading.tasks.task.run&quot;&gt;Task.Run&lt;/a&gt;을 사용하여 CPU 바인딩 작업을 백그라운드 스레드로 이동할 수 있지만 백그라운드 스레드는 프로세스를 지원하지 않고 결과를 사용할 수 있을 때까지 기다립니다.&lt;/p&gt;&lt;p&gt;비동기 프로그래밍에 대한 비동기 기반 접근 방법은 거의 모든 경우에 기존 방법보다 선호됩니다. 특히, 이 접근 방식은 코드가 더 간단하고 경합 조건을 방지할 필요가 없기 때문에 I/O 바인딩 작업의 &lt;a href=&quot;https://docs.microsoft.com/ko-kr/dotnet/api/system.componentmodel.backgroundworker&quot;&gt;BackgroundWorker&lt;/a&gt; 클래스보다 효과적입니다. 비동기 프로그래밍은 코드 실행에 대한 조합 세부 정보를 &lt;code&gt;Task.Run&lt;/code&gt;가 스레드 풀로 변환하는 작업과 구분하기 때문에 &lt;a href=&quot;https://docs.microsoft.com/ko-kr/dotnet/api/system.threading.tasks.task.run&quot;&gt;Task.Run&lt;/a&gt; 메서드를 함께 사용하는 비동기 프로그래밍은 CPU 바인딩 작업을 위한 &lt;a href=&quot;https://docs.microsoft.com/ko-kr/dotnet/api/system.componentmodel.backgroundworker&quot;&gt;BackgroundWorker&lt;/a&gt;보다 효과가 뛰어납니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;전체 예제&lt;/h2&gt;&lt;p&gt;다음 코드는 이 항목에서 설명하는 WPF(Windows Presentation Foundation) 애플리케이션의 MainWindow.xaml.cs 파일입니다. &lt;a href=&quot;https://code.msdn.microsoft.com/Async-Sample-Example-from-9b9f505c&quot;&gt;비동기 샘플: &quot;Async 및 Await를 사용하는 비동기 프로그래밍&quot;의 예제&lt;/a&gt;에서 샘플을 다운로드할 수 있습니다.&lt;/p&gt;&lt;p&gt;C#복사&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-csharp&quot; lang=&quot;csharp&quot;&gt;using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
using System.Windows;  
using System.Windows.Controls;  
using System.Windows.Data;  
using System.Windows.Documents;  
using System.Windows.Input;  
using System.Windows.Media;  
using System.Windows.Media.Imaging;  
using System.Windows.Navigation;  
using System.Windows.Shapes;  
  
// Add a using directive and a reference for System.Net.Http;  
using System.Net.Http;  
  
namespace AsyncFirstExample  
{  
    public partial class MainWindow : Window  
    {  
        // Mark the event handler with async so you can use await in it.  
        private async void StartButton_Click(object sender, RoutedEventArgs e)  
        {  
            // Call and await separately.  
            //Task&amp;lt;int&amp;gt; getLengthTask = AccessTheWebAsync();  
            //// You can do independent work here.  
            //int contentLength = await getLengthTask;  
  
            int contentLength = await AccessTheWebAsync();  
  
            resultsTextBox.Text +=
                $&quot;\r\nLength of the downloaded string: {contentLength}.\r\n&quot;;
        }  
  
        // Three things to note in the signature:  
        //  - The method has an async modifier.   
        //  - The return type is Task or Task&amp;lt;T&amp;gt;. (See &quot;Return Types&quot; section.)  
        //    Here, it is Task&amp;lt;int&amp;gt; because the return statement returns an integer.  
        //  - The method name ends in &quot;Async.&quot;  
        async Task&amp;lt;int&amp;gt; AccessTheWebAsync()  
        {   
            // You need to add a reference to System.Net.Http to declare client.  
            using (HttpClient client = new HttpClient())  
            {  
                    // GetStringAsync returns a Task&amp;lt;string&amp;gt;. That means that when you await the  
                    // task you'll get a string (urlContents).  
                    Task&amp;lt;string&amp;gt; getStringTask = client.GetStringAsync(&quot;https://docs.microsoft.com&quot;);  
  
                    // You can do work here that doesn't rely on the string from GetStringAsync.  
                    DoIndependentWork();  
  
                    // The await operator suspends AccessTheWebAsync.  
                    //  - AccessTheWebAsync can't continue until getStringTask is complete.  
                    //  - Meanwhile, control returns to the caller of AccessTheWebAsync.  
                    //  - Control resumes here when getStringTask is complete.   
                    //  - The await operator then retrieves the string result from getStringTask.  
                    string urlContents = await getStringTask;  
  
                    // The return statement specifies an integer result.  
                    // Any methods that are awaiting AccessTheWebAsync retrieve the length value.  
                    return urlContents.Length;  
            }  
        }  
  
        void DoIndependentWork()  
        {  
            resultsTextBox.Text += &quot;Working . . . . . . .\r\n&quot;;  
        }  
    }  
}  
  
// Sample Output:  
  
// Working . . . . . . .  
  
// Length of the downloaded string: 25035.  
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;





























&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Basic/C#</category>
      <author>에반황</author>
      <guid isPermaLink="true">https://itmining.tistory.com/129</guid>
      <comments>https://itmining.tistory.com/129#entry129comment</comments>
      <pubDate>Wed, 27 Mar 2019 12:53:28 +0900</pubDate>
    </item>
    <item>
      <title>[C#] CS0120: non-static field 에러</title>
      <link>https://itmining.tistory.com/128</link>
      <description>&lt;hr class=&quot;tx-hr-image-4&quot; style=&quot;background: url(//i1.daumcdn.net/deco/contents/horizontalrule/line08.gif?v=2) repeat-x scroll left; height: 15px; border:0; width:54px; margin:30px auto&quot;&gt;&lt;h2&gt;Error 메시지&lt;/h2&gt;&lt;p&gt;error CS0120: An object reference is required for the non-static field, method, or property &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;발생 상황&lt;/h2&gt;&lt;pre&gt;&lt;code class=&quot;language-csharp&quot; lang=&quot;csharp&quot;&gt;class Program
{
    void TestMethod() 
    {    
        // Process
    }

    static void Main(string[] args)
    {
        TestMethod();
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;TestMethod()를 진행하려고 하는데, 위와 같은 에러 메시지가 떴다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;해결 방법1&lt;/h2&gt;&lt;pre&gt;&lt;code class=&quot;language-c#&quot; lang=&quot;c#&quot;&gt;class Program
{
    static void TestMethod() 
    {    
        // Process
    }

    static void Main(string[] args)
    {
        TestMethod();
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;말 그대로 non-static field인 메서드를 실행하려고 했기 때문에 났던 에러이다. static을 사용하면 인스턴스를 생성하지 않아도 사용할 수 있는 정적메서드가 된다. 메서드에 static을 붙여주면 해결 완료.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;해결 방법2&lt;/h2&gt;&lt;pre&gt;&lt;code class=&quot;language-c#&quot; lang=&quot;c#&quot;&gt;class Program
{
    void TestMethod() 
    {    
        // Process
    }

    static void Main(string[] args)
    {
        Program p = new Program();
        p.TestMethod();
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;static한 메서드로 사용하고 싶지 않다면, 해당 객체를 생성한 후 접근하면 해결 완료.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;hr class=&quot;tx-hr-image-4&quot; style=&quot;background: url(//i1.daumcdn.net/deco/contents/horizontalrule/line08.gif?v=2) repeat-x scroll left; height: 15px; border:0; width:54px; margin:30px auto&quot;&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Basic/C#</category>
      <author>에반황</author>
      <guid isPermaLink="true">https://itmining.tistory.com/128</guid>
      <comments>https://itmining.tistory.com/128#entry128comment</comments>
      <pubDate>Tue, 19 Mar 2019 11:43:29 +0900</pubDate>
    </item>
    <item>
      <title>[C#] TCP/IP 프로토콜과 소켓 프로그래밍</title>
      <link>https://itmining.tistory.com/127</link>
      <description>&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;경고!!&lt;/p&gt;&lt;p&gt;제가 아는 부분에 대해서 공유드리는 목적의 발표입니다. 이 부분에 대해 빠삭하지 않기 때문에 질문에 대한 답을 당장은 드릴 수 없을 수 있지만, 추후에 공부를 통해서 답을 드리겠습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;네트워크 프로그래밍&lt;/h2&gt;
&lt;p&gt;저희가 목표로 하는 통신 기능이 있는 C# 코드를 구현하기 전에 네트워크 프로그래밍이 무엇인지 감을 잡도록 하겠습니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;인터넷의 유래&lt;/h3&gt;
&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 520px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9949D54E5C8F251617&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9949D54E5C8F251617&quot; width=&quot;520&quot; height=&quot;540&quot; filename=&quot;1.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;최초의 컴퓨터는 프로그램을 입력받고 실행한 뒤 결과를 출력하는 정도가 전부였습니다. 이 시기의 컴퓨터는 다음 그림처럼 중앙 컴퓨터에 더미 터미널 여러개를 연결했다고 합니다.  &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 820px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/998E194A5C8F252221&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F998E194A5C8F252221&quot; width=&quot;820&quot; height=&quot;728&quot; filename=&quot;2.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;  더미 터미널은 연산 능력은 없고, 입력(키보드)와 출력(모니터)만 할  수 있었습니다. 이 터미널은 지능은 없었지만 중앙 컴퓨터와 &lt;mark&gt;데이터를 주고 받는&lt;/mark&gt; 기능을 가지고 있었습니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://www.history.com/.image/t_share/MTU4MDgxMzYyMjA3NzEyNDYw/coldwar.jpg&quot; alt=&quot;cold warì ëí ì´ë¯¸ì§ ê²ìê²°ê³¼&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/p&gt;&lt;p&gt;  냉전이 한창이던 1957년 소련은 위성을 하늘에 쏘았고, 이는 미국을 자극했습니다. 자국보다 앞선 우주 기술을 가지고 있다는 것에 충격을 받았고, 각 분야는 빠르게 발전했습니다. &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://internetofbusiness.com/wp-content/uploads/2016/09/darpa-640x216.png&quot; alt=&quot;DARPAì ëí ì´ë¯¸ì§ ê²ìê²°ê³¼&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/p&gt;&lt;p&gt;  그 중 하나인 DARPA라는 기관은 군대를 위한 신기술을 개발하기 시작했습니다. 냉전 시대에 설립된 이 기관은 막대한 예산을 지원받으며 미군을 위한 연구를 진행했죠. DARPA의 본부는 알링톤에 있었고, 프로젝트는 상당수가 대학이나 외부 연구소에서 진행되었습니다. 각 연구기관의 축적된 연구 자료를 본부에 전달할 수 있는 유일한 방법은 &lt;mark&gt;택배&lt;/mark&gt;였습니다. 믿을만한 요원에게 연구자료를 맡겨야했죠. &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 451px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/994C6E475C8F260A14&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F994C6E475C8F260A14&quot; width=&quot;451&quot; height=&quot;480&quot; filename=&quot;3.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;  DARPA는 이를 해결하기 위해 &lt;mark&gt;네트워크와 네트워크를 연결하는 방법&lt;/mark&gt;을 마련하기 위해 연구를 진행했습니다. 네트워크와 네트워크가 연결되면 한쪽 네트워크에 접속한 사용자는 다른 네트워크에 있는 컴퓨터에 접근할 수 있게 됩니다. 또 네트워크를 통해 다른 네트워크로 접속할 수 있게 됩니다. 이 방식을 이용해 DARPA는 연구기관을 잇는 회선을 일일히 구축하지 않고 연구소들의 컴퓨터를 연결했습니다. 이른바 DARPANET이라 불리던 이 네트워크는 점점 더 많은 연구기관으로 연결되고 세계로 연결되더니 1980년대 말에 이르러서는 &lt;mark&gt;인터넷이라는 국제 통신망을 형성&lt;/mark&gt;하게 되었습니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;TCP/IP 스택&lt;/h2&gt;
&lt;p&gt;  컴퓨터끼리 네트워크에서 데이터를 주고 받기 위해 그 네트워크에서 사용하는 규칙인 &lt;mark&gt;프로토콜&lt;/mark&gt;을 따라야합니다. 컴퓨터들이 네트워크를 통해 데이터를 주고 받기 위한 &lt;mark&gt;통신 규약&lt;/mark&gt;을 의미합니다. 인터넷은 전 세계 네트워크 표준으로 자리 잡았고, 인터넷의 통신 프로토콜로 사용되는 TCP/IP는 실질적으로 인터넷 표준 프로토콜로 자리잡았습니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;img src=&quot;https://www.dummies.com/wp-content/uploads/290809.image0.jpg&quot; alt=&quot;tcp/ip protocolsì ëí ì´ë¯¸ì§ ê²ìê²°ê³¼&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/p&gt;&lt;p&gt;  위의 그림은 TCP/IP의 규칙의 종류를 보여주고 있습니다. 이처럼 TCP/IP 프로토콜은 굉장히 많은 규칙의 집합입니다. 이 네트워크는 물리적인 통신선으로 어떤 재질로 만들어야 하는가에 대한 규칙. 1:1, 1:N 그리고 N:N 네트워크에서 대화 상대를 어떻게 판단하는가에 대한 규칙. 데이터 송수신할 때의 바이트 오더에 대한 규칙 등등이 그 예입니다. TCP/IP는 표준 프로토콜로, 인터넷에서 데이터를 주고 받는데 필요한 일련의 &lt;mark&gt;프로토콜 모음&lt;/mark&gt;입니다.  TCP/IP는 다음과 같이 &lt;mark&gt;4개의 계층으로 구성되어있으며, 계층이 포개져있는 형태때문에 TCP/IP 스택&lt;/mark&gt;이라고 부릅니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/263B4346565471F415&quot; alt=&quot;tcp/ip osi 4 layerì ëí ì´ë¯¸ì§ ê²ìê²°ê³¼&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/p&gt;&lt;p&gt;  계층을 분리할 때 여러가지 방식이 있는데 대표적으로 OSI 7계층(open system interconnection)이나, RFC 1122 4계층으로 나누는 방식이 있습니다. TCP/IP 프로토콜은 4계층으로 나누고 있습니다. 웹 브라우저, 메신저, 팟캐스트 등 어플리케이션의 데이터들은  모두 이  4계층을 오르내리고 있습니다. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;왜 이렇게 계층으로 나누었을까요?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;  DARPANET에 기반한 인터넷은 점점 커졌고, 각 기능에 대한 요구사항을 해결하기 위해 전체 프로그램을 수정하였습니다. 이러한 비용을 줄이기 위해 프로그램을 계층으로 나누었습니다. 각각의 요구사항 해결할 때 다른 계층에 영향 미치지 않도록 각 계층은 인터페이스를 정의하게 됩니다. 계층의 내부는 인터페이스에 맞춰 요구사항을 해결하고, 각 계층의 통신은 인터페이스를 통해 이뤄지도록 구현하였습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;애플리케이션 계층&lt;/h4&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;img src=&quot;https://www.versatek.com/wp-content/uploads/2015/01/OSI-model-info-011.png&quot; alt=&quot;OSI 모델 정보&quot; referrerpolicy=&quot;no-referrer&quot; style=&quot;text-align: center;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;img src=&quot;https://www.versatek.com/wp-content/uploads/2015/01/OSI-model-info-021.png&quot; alt=&quot;OSI ëª¨ë¸ ì ë³´ 02&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;img src=&quot;https://www.versatek.com/wp-content/uploads/2015/01/OSI-model-info-031.png&quot; alt=&quot;OSI-model-info-03&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/p&gt;&lt;h4&gt;어떤 매체로 피자를 주문할지(프로토콜 지정 - 여기선 핸드폰 주문)와 어떤 언어로 주문(암호화, 복호화)할지 통화를 연결(세션 생성)하는 것까지를 포함해서 어플리케이션 계층에서 진행.&lt;/h4&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이 계층은 응용 프로그램 즉 개발자가 작성한 어플리케이션에 프로토콜들을 제공하는 계층입니다. 크롬이나, 파이어폭스, 이메일들의 응용 프로그램이 이 계층에 속하는 것이 아닌 어플리케이션이 사용하는 프로토콜들이 모여있는 계층입니다. 원격 로그인을 위한 TELNET, 파일 전송을 위한 FTP, 메일 전송을 위한 SMTP 그리고 웹 데이터를 주고 받기 위한 HTTP 등이 존재합니다. 각각의 프로토콜들은 하부 계층의 TCP나 UDP에 기반하여 동작합니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;트랜스포트 계층&lt;/h4&gt;&lt;h4 style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;img src=&quot;https://www.versatek.com/wp-content/uploads/2015/01/OSI-model-info-04.png&quot; alt=&quot;OSI ëª¨ë¸ ì ë³´ 04&quot; referrerpolicy=&quot;no-referrer&quot; style=&quot;text-align: center;&quot;&gt;&lt;/h4&gt;&lt;h4&gt;프로토콜에 따라 의심쩍은 피자를 검사하여 괜찮은 피자만 배달거나 피클이 빠졌을 때 다시 배달을 하는 것과 같은 신뢰성 작업을 합니다.&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;  이름 그대로 &lt;mark&gt;패킷의 운송&lt;/mark&gt;을 담당합니다. 그 중에서도 TCP(Transmission Control Protocol)은 보내는 쪽과 받는 쪽 간의 연결성을 제공하여, &lt;mark&gt;신뢰할 수 있는 패킷 전송 서비스&lt;/mark&gt;를 제공합니다(이를 Stream 방식으로 부르기도 합니다). 여러 개의 패킷을 보낼 때 순서를 보장하며, 패킷이 손실되거나 유실되면 그 부분을 &lt;mark&gt;재전송&lt;/mark&gt;해주기도 합니다. TCP/IP에서 TCP가 바로 이 프로토콜을 가리키는 것이며, TCP는 IP가 제공하지 않는 연결성, 신뢰성을 제공합니다. HTTP를 비롯한 여러 프로토콜이 이 TCP와 IP 프로토콜 위에서 동작합니다. &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;  이러한  TCP 프로토콜에 정의되어 있는 규칙을 조금 더 파보자면 다음의 4가지로 나눌 수 있습니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;세션 관리(연결성)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;TCP는 세션 관리를 통해 각 연결의 흐름을 제어하도록 정의되어 있습니다. 여기서 말하는 &lt;code&gt;세션이란 서버가 해당 클라이언트와 데이터 통신을 하기 위해 제공하는 전용 통로&lt;/code&gt;라고 생각 하시면 됩니다.&lt;/p&gt;&lt;p&gt;일반적으로 클라이언트가 서버에 접속하기 위해서는 TCP 연결을 요청하게 되며, 서버쪽에서는 연결을 요청한 클라이언트를 위한 세션이 생성됩니다. 이 세션은 &lt;mark&gt;해당 클라이언트만 사용할 수 있는 유일한 통로&lt;/mark&gt;가 됩니다. 이미 연결 되어 있는 클라이언트 외에 다른 클라이언트가 연결을 요청하면 해당 클라이언트를 위한 새로운 세션을 생성하게 됩니다. 생성되어 있는 세션은 해당 클라이언트와 통신하기 위해서 사용하며 다른 클라이언트가 사용하는 세션은 사용 할 수 없습니다. 이렇게 각각의 클라이언트에 따라 구분되어 있는 연결 관리는 서로 다른 클라이언트에서 전송한 패킷이 충돌되는 것을 방지함으로써 인터넷에서 데이터의 전송을 안전하게 보장 해 줍니다.&lt;/p&gt;
&lt;/li&gt;

&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;핸드 셰이크(신뢰성)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;TCP는 핸드셰이크(HandShake)라 불리는 기법을 이용하여 인터넷에서 데이터가 유실되는 것을 방지하도록 정의되어 있습니다. 이는 TCP에서 &lt;mark&gt;데이터 전송 후 해당 데이터를 잘 받았다는 메시지를 받고, 알았다는 메시지를 보내 정의 되어 있는 것&lt;/mark&gt;이 마치 악수하면서 인사하는 것과 비슷하다고 해서 유래된 이름입니다.&lt;/p&gt;&lt;p&gt;핸드셰이크는 일정한 시간이 흐른 후에도 데이터를 잘 받았다는 메시지가 도착하지 않으면 데이터가 유실되었다고 판단하여 데이터를 재전송 하게 됩니다. 이렇게 꼼꼼하게 데이터의 확인 과정을 거치면서 네트워크 상황이 좋지 않아서 &lt;mark&gt;중간에 데이터가 유실되는 상황이 벌어지더라도 데이터의 신뢰성을 확보&lt;/mark&gt; 할 수 있습니다.&lt;/p&gt;&lt;p&gt;네트워크 상에서 패킷을 전송할 때 패킷의 유실 위험을 막기 위해 데이터를 전송하고 응답 패킷(ACK)이 올 때까지 기다렸다가 또 다음 패킷을 보내고 응답 패킷(ACK)을 받는 방법입니다. TCP는 이런 방법을 통해서 데이터의 유실을 막고 신뢰성 있는 데이터 전송을 보장해 줍니다.&lt;/p&gt;
&lt;/li&gt;

&lt;/ul&gt;
&lt;/li&gt;

&lt;/ol&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;&lt;p&gt;패킷 순서 조합&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 742px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99C7C9435C8F254E13&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99C7C9435C8F254E13&quot; width=&quot;742&quot; height=&quot;520&quot; filename=&quot;3.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;핸드셰이크 같이 데이터를 하나씩 전송하고 확인하는 과정을 거치면 데이터의 신뢰성을 보장할 수 있는 장점이 생기지만 데이터 전송 속도가 떨어지는 문제점이 발생할 수 있습니다. 아무리 데이터의 신뢰성이 보장되더라도 데이터 전송 속도가 너무 떨어지면 사용하기에 불편한 프로토콜이 될 것입니다.&lt;/p&gt;&lt;p&gt;이렇게 &lt;mark&gt;전송 속도가 떨어지는 문제점을 보완하기 위해 나온 것이 패킷의 순서 조합&lt;/mark&gt;입니다. 이는 데이터에 번호를 부여한 다음에 메시지의 전송 속도가 떨어지는 것을 막기 위해 여러 개의 데이터를 한 번에 보내는 방법입니다. 데이터를 받은 곳에서는 데이터의 순서에 맞추어 데이터를 정렬하고 데이터를 잘 받았다는 메시지를 전송해줍니다.&lt;/p&gt;
&lt;/li&gt;

&lt;/ul&gt;
&lt;/li&gt;

&lt;/ol&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;&lt;p&gt;포트를 이용한 서비스 다중화&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;네트워크를 통한 장치에서 인터넷을 사용하기 위해 설정하는 것은 IP 주소 밖에 없습니다. 그렇다면 단 하나의 IP 주소를 통하여 여러 가지 프로그램은 어떻게 동작할 수 있을까요? 그 정답은 TCP 프로토콜에 있는 포트라는 개념입니다.&lt;/p&gt;&lt;p&gt;TCP에서 IP는 주소 외에도 포트라는 개념이 있어 우리가 사용하는 애플리케이션 포트를 하나씩 할당해 줍니다. 각각의 애플리케이션은 자신에게 할당 된 포트를 이용하여 통신할 데이터를 주고 받게 됩니다.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;포트가 필요한 이유?&lt;/p&gt;&lt;p&gt;유스페이스 A동(IP주소)에 호수(포트번호)라고 이해하면 편합니다. 유스페이스 A동에 만약 피자집만 존재한다면 유스페이스 A동을 통해서 주문을 해도 될 겁니다. 하지만 치킨 집, 곱창 집이 들어오게 되면 각 호수에 대한 주소가 따로 필요하겠죠. 이를 위해 존재하는 것이 포트번호입니다. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/li&gt;

&lt;/ul&gt;
&lt;/li&gt;

&lt;/ol&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://www.versatek.com/wp-content/uploads/2015/01/OSI-model-info-11.png&quot; alt=&quot;OSI ëª¨ë¸ ì ë³´ 11&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;  하지만 TCP 프로토콜에는 장점만 있는 것이 아닙니다. 데이터가 작을 경우 하나의 데이터만 보내도 되며 이 경우 순서 보장에 대한 이슈는 사라지게 됩니다. 또한 꼭 받아야하는 데이터가 아닌 경우 재전송이 필요없겠죠. 작고, 신뢰성을 요구하지 않는 데이터는  필요 없는 기능이 붙어 전송이 더뎌지게 됩니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;  트랜스포트 계층은 이런 문제를 해결하기 위해 또 다른 프로토콜인 UDP(User Datagram Protocol)을 제공합니다. 이는 연결성, 순서, 신뢰성 모두 제공하지 않지만 성능이 더 우수합니다(이를 데이터그램 방식이라고 부르기도 합니다). &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;네트워크(인터넷) 계층&lt;/h4&gt;&lt;h4 style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;img src=&quot;https://www.versatek.com/wp-content/uploads/2015/01/OSI-model-info-051.png&quot; alt=&quot;OSI-model-info-05&quot; referrerpolicy=&quot;no-referrer&quot; style=&quot;text-align: center;&quot;&gt;&lt;/h4&gt;&lt;h4 style=&quot;text-align: center;&quot;&gt;네비게이션을 키고 가장 빠른 길을 찾아서 찾아가는 것과 같습니다.&lt;/h4&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;  네트워크 계층은 패킷을 &lt;mark&gt;수신해야할 상대의 주소를 지정&lt;/mark&gt;하고, 나가는 패킷에 대해서 적절한 크기로 분할하며 들어오는 패킷에 대해서는 재조립을 수행합니다. 이 계층에서 사용되는 규약이 바로 &lt;mark&gt;IP(Internet Protocol)&lt;/mark&gt;입니다. TCP/IP에서 한 부분을 차지하는 중요한 부분이죠.  &lt;/p&gt;&lt;p&gt;  IP는 내보낸 패킷을 상대방이 잘 수령했는지에 대해 보장하지 않습니다. 택배로 비유하여 소포가 배달 중 문제가 생겨 파손되거나 분실되도 전혀 책임을 지지 않는 악덕 택배회사죠. 택배를 잘 수령했는지 여부를 파악하는 기능 자체가 없습니다. 그저 트랜스포트 계층에서 내려온 패킷에 주소를 붙여 링크 계층으로 보낼 뿐입니다. 이 때문에 여러 개의 소포를 보낼 때 순서대로 도착하지 않아도 이상할 것이 없습니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;링크(네트워크 인터페이스) 계층&lt;/h4&gt;
&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;img src=&quot;https://www.versatek.com/wp-content/uploads/2015/01/OSI-model-info-062.png&quot; alt=&quot;OSI-model-info-06&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;img src=&quot;https://www.versatek.com/wp-content/uploads/2015/01/OSI-model-info-071.png&quot; alt=&quot;OSI-model-info-07&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;  TCP/IP는 네트워크 물리적 구성으로부터 독립적인 프로토콜입니다. 컴퓨터가 네트워크에 물리적으로 전화선 모뎀으로 연결되던, LAN에 이더넷 케이블로 연결되던, Wi-Fi로 연결되어 있던 신경쓰지 않습니다. 이 것은 링크계층에서 네트워크의 &lt;mark&gt;물리적인 연결 매체를 통해 패킷을 주고받는 작업을 담당&lt;/mark&gt;해주기 때문입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;  가령 어떤 패킷이 네트워크를 통해 들어오면 먼저 이 링크 계층에 들어오게 됩니다. 링크 계층은 이 패킷에서 물리적 데이터 전송에 사용되던 부분(패킷의 헤더나 푸터)를 제거하고 인터넷 계층에 넘깁니다. 이렇게 함으로서 네트워크 계층에서는. &lt;mark&gt;어떤 물리적인 장치로 패킷이 넘어왔던 신경쓰지 않고 처리를 시작&lt;/mark&gt;할 수 있게 됩니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;패킷이란?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/ndZjU.gif&quot; alt=&quot;osi packet flowì ëí ì´ë¯¸ì§ ê²ìê²°ê³¼&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;  패킷은 &quot;소포&quot;라는 뜻의 영단어입니다. 네트워크를 통해 오고가는 데이터를 패킷이라고 부릅니다. 그 이유는 &quot;내용물&quot;인 데이터를 애플리케이션 계층, 트랜스포트 계층, 네트워크 계층, 링크 계층에서 각각 필요한 정보들을 포장해서 보내기 때문입니다. 그리고 받을 때도 각 계층에서는 포장지를 한겹 한겹 벗겨서 데이터를 얻어내죠.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;더 많은 정보는 다음의 &lt;a href=&quot;https://www.youtube.com/watch?v=vv4y_uOneC0&quot;&gt;유튜브 동영상&lt;/a&gt;을 확인하세요.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Socket 프로그래밍&lt;/h2&gt;
&lt;h3&gt;소켓이란?&lt;/h3&gt;
&lt;p&gt;  네트워크는 간단하게 말해서 네트워크에 연결되어 있는 서로 다른 두 컴퓨터가 데이터를 주고 받는 것 입니다. 이것이 전부입니다! 이를 위해선 물리적 연결이 우선 필요합니다. 하지만 대부분의 컴퓨터는 이미 물리적 연결이 이루어져 있으므로 신경쓰지 않도록 합니다. 그 다음으로는 물리적 연결을 기반으로 하는 소프트웨어적인 데이터 송수신 방법을 고민하면 됩니다. 하지만 운영체제에서 이미 &lt;mark&gt;소켓&lt;/mark&gt;이라는 것을 제공하기 때문에 데이터 송수신의 원리를 잘 몰라도 소켓을 통해서 데이터를 주고 받을 수 있습니다. 그래서 네트워크 프로그래밍을 소켓 프로그래밍이라고도 하죠.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://files.realpython.com/media/Python-Sockets-Tutorial_Watermarked.815ce6c85789.jpg&quot; alt=&quot;socket programmingì ëí ì´ë¯¸ì§ ê²ìê²°ê³¼&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/p&gt;&lt;p&gt;  그렇다면 왜 소켓이라는 말을 쓸까요? 우리는 전력망으로부터 전기를 공급 받기 위해 소켓을 꽂죠. 마찬가지로 멀리 떨어져있는 컴퓨터와 데이터를 송수신 하기위해 인터넷이라는 네트워크망에 연결을 해야합니다. 프로그래밍에서의 소켓은 네트워크 망에 연결하는 도구가 되는 것입니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;소켓의 유형&lt;/h3&gt;
&lt;p&gt;소켓의 유형에는 TCP/IP 프로토콜 기반의 Stream 방식과 UDP/IP 프로토콜 기반의 Datagram 방식이 있습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Stream 방식&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; 가장 큰 특징은 &lt;mark&gt;양방향 연결이 필요&lt;/mark&gt;하다는 것입니다. 또한 보낸 곳에서 받는 곳까지 &lt;mark&gt;데이터가 소실되거나 변하지 않게 보장해 주며 보낸 순서대로 받을 수 있게 해줍니다.&lt;/mark&gt; 하지만 보낸 한 개의 패킷을 여러 개로 나누어 받거나 반대로 여러 개의 패킷을 한 개로 뭉쳐서 받을 수 있으니 그에 대한 적절한 처리를 따로 해주어야 합니다.&lt;/li&gt;

&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Datagram 방식&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; 스트림 방식과는 달리 &lt;mark&gt;양방향 연결이 필요 없고 보낸 데이터가 중간에 소실 될 수 있다&lt;/mark&gt;는 특징을 가지고 있습니다. 언제 어떻게 소실될지는 여러 가지 이유로 달라 질 수 있으므로 에측하기 어렵습니다. 또한 먼저 보낸 데이터를 나중에 보낸 데이터보다 늦게 받을 수 있으며, 한 개의 데이터는 여러개로 쪼개짐 없이 받을 수 있습니다.&lt;/li&gt;

&lt;/ul&gt;
&lt;/li&gt;

&lt;/ul&gt;
&lt;p&gt;이번 스터디에서는 Stream을 다뤄보도록 하겠습니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;소켓 통신 과정&lt;/h3&gt;
&lt;p&gt;자 그럼 소켓을 이용해 어떤 절차를 가지고 데이터를 주고 받는지 알아보도록 하겠습니다. (&lt;mark&gt;Stream Socket을 기&lt;/mark&gt;반으로 한 설명입니다.)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;전화기의 통신 과정&lt;/h4&gt;
&lt;p&gt;소켓은 전통적으로 전화기를 빗대어 많이 설명을 합니다. 네트워크의 통신도 전화기 통신과 마찬가지이기 때문에 유사하게 동작하는 것이죠. 일반적으로 전화기를 통해 통화를 할 때 다음과 같은 절차를 거칩니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 796px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99736A505C8F255C13&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99736A505C8F255C13&quot; width=&quot;796&quot; height=&quot;677&quot; filename=&quot;4.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;소켓의 통신 과정&lt;/h4&gt;
&lt;p&gt;소켓의 통신은 위에서 다룬 전화기의 통신 방식과 거의 동일합니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 818px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99770D4C5C8F256F1C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99770D4C5C8F256F1C&quot; width=&quot;818&quot; height=&quot;696&quot; filename=&quot;5.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;실제 코드&lt;/h4&gt;
&lt;p&gt;실제 코드에서는 다음과 같이 사용합니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 810px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/990850445C8F257A1B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F990850445C8F257A1B&quot; width=&quot;810&quot; height=&quot;687&quot; filename=&quot;6.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;소켓 통신 들여다보기&lt;/h3&gt;
&lt;h4&gt;1. server 소켓 생성과 listen&lt;/h4&gt;
&lt;p&gt;서버에서 전화를 받기 위해 전화기를 생성하고 전화번호를 192.168.1.102:80으로 부여한 후 네트워크에 연결하여 listen 상태로 만듭니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;그림&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 487px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9996E8505C8F259103&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9996E8505C8F259103&quot; width=&quot;487&quot; height=&quot;556&quot; filename=&quot;7.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;코드&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot; lang=&quot;csharp&quot;&gt;// Server 1. 전화기 생성
Socket socket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.TCP);

// Server 2. 상대방에게 연결되기 위해 전화 번호를 부여
var endpoint = new IPEndPoint (IPAddress.Parse (&quot;192.168.1.102&quot;), 80);
socket.Bind (endpoint);

// Server 3. 전화를 통신망에 케이블로 연결
socket.Listen (backlog);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;2. connect을 위한 client 소켓 생성&lt;/h4&gt;
&lt;p&gt;이제 전화를 거는 클라이언트에서 전화기를 생성합니다.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;그림&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 366px; text-align: center;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/998121505C8F259313&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F998121505C8F259313&quot; width=&quot;366&quot; height=&quot;556&quot; filename=&quot;8.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;text-align: center;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h5&gt;&lt;strong style=&quot;font-size: 24px;&quot;&gt;코드&lt;/strong&gt;&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot; lang=&quot;csharp&quot;&gt;// Client 1. 전화기 생성
Socket socket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.TCP);
var endpoint = new IPEndPoint(IPAddress.Parse(&quot;192.168.1.102&quot;), 80);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;3. client 소켓에서 server 소켓으로 메시지 전송&lt;/h4&gt;
&lt;p&gt;이제 클라이언트 전화기에서 서버 전화기로 연결 요청을 합니다.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;그림&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 820px; text-align: center;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/994CB1505C8F259316&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F994CB1505C8F259316&quot; width=&quot;820&quot; height=&quot;495&quot; filename=&quot;9.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;text-align: center;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;코드&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c#&quot; lang=&quot;c#&quot;&gt;// Client 2. 상대방에게 연결하기 
socket.Connect(endpoint);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;4. server에서 새로운 소켓 생성 후 처리&lt;/h4&gt;
&lt;p&gt;서버가 클라이언트의 요청을 받으면 통신을 위한 새로운 소켓을 생성합니다. 그리고 이 소켓은 클라이언트 소켓의 IP 주소와 포트번호를 사용합니다. 이제 TCP 연결 세션이 생성되었습니다.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;그림&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 820px; text-align: center;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99811F505C8F259213&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99811F505C8F259213&quot; width=&quot;820&quot; height=&quot;500&quot; filename=&quot;10.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;text-align: center;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;코드&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c#&quot; lang=&quot;c#&quot;&gt;// Server 4. 수화기를 들어 전화 받기
var newClient = socket.Accept();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;5. server Socket에서 client 소켓으로 메시지 전송&lt;/h4&gt;
&lt;p&gt;이제 서버와 클라이언트가 서로 소켓을 이용해 통신(읽기, 쓰기)를 합니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 820px; text-align: center;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99C89D505C8F25911D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99C89D505C8F25911D&quot; width=&quot;820&quot; height=&quot;498&quot; filename=&quot;11.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;text-align: center;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;br /&gt;&lt;/h4&gt;&lt;h4&gt;6. 소켓 Close&lt;/h4&gt;
&lt;p&gt;모든 통신이 끝나면 소켓을 종료합니다.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;그림&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 820px; text-align: center;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/995CC0505C8F259115&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F995CC0505C8F259115&quot; width=&quot;820&quot; height=&quot;498&quot; filename=&quot;12.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;text-align: center;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;코드&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c#&quot; lang=&quot;c#&quot;&gt;// 종료
socket.Close();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;다음 주제&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;오늘 배워본 TCP 프로토콜을 사용하는 소켓 통신을 각자 구현해봅시다.&amp;nbsp;&lt;a href=&quot;https://docs.microsoft.com/ko-kr/dotnet/framework/network-programming/socket-code-examples&quot;&gt;링크&lt;/a&gt;
&lt;/li&gt;

&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;</description>
      <category>Basic/C#</category>
      <author>에반황</author>
      <guid isPermaLink="true">https://itmining.tistory.com/127</guid>
      <comments>https://itmining.tistory.com/127#entry127comment</comments>
      <pubDate>Mon, 18 Mar 2019 14:02:55 +0900</pubDate>
    </item>
    <item>
      <title>python unittest assertion 종류</title>
      <link>https://itmining.tistory.com/126</link>
      <description>&lt;h2 cid=&quot;n0&quot; mdtype=&quot;heading&quot; class=&quot;md-end-block md-heading&quot; style=&quot;box-sizing: border-box; break-after: avoid-page; break-inside: avoid; font-size: 1.75em; margin-top: 1rem; margin-bottom: 1rem; position: relative; line-height: 1.225; cursor: text; padding-bottom: 0.3em; border-bottom: 1px solid rgb(238, 238, 238); white-space: pre-wrap; width: inherit; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); font-family: &amp;quot;Open Sans&amp;quot;, &amp;quot;Clear Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-size-adjust: auto;&quot;&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;md-expand&quot; style=&quot;box-sizing: border-box;&quot;&gt;python test assertion&lt;/span&gt;&lt;/h2&gt;&lt;h2 cid=&quot;n0&quot; mdtype=&quot;heading&quot; class=&quot;md-end-block md-heading&quot; style=&quot;box-sizing: border-box; break-after: avoid-page; break-inside: avoid; font-size: 1.75em; margin-top: 1rem; margin-bottom: 1rem; position: relative; line-height: 1.225; cursor: text; padding-bottom: 0.3em; border-bottom: 1px solid rgb(238, 238, 238); white-space: pre-wrap; width: inherit; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); font-family: &amp;quot;Open Sans&amp;quot;, &amp;quot;Clear Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-size-adjust: auto;&quot;&gt;&lt;p cid=&quot;n3&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.8em 0px; width: inherit; position: relative; font-size: 16px; font-weight: normal; text-size-adjust: auto;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot;md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;TestCase&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 클래스는 값을 검사하고 실패를 보고하기 위해 몇 개의 &lt;/span&gt;&lt;span md-inline=&quot;highlight&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;mark style=&quot;box-sizing: border-box;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;assert 메서드&lt;/span&gt;&lt;/mark&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;를 제공합니다. 다음 표는 보통 많이 사용되는 메서드들입니다(더 많은 assert 메서드는 표 아래를 보십시오):&lt;/span&gt;&lt;/p&gt;&lt;figure class=&quot;md-table-fig&quot; contenteditable=&quot;false&quot; cid=&quot;n4&quot; mdtype=&quot;table&quot; style=&quot;box-sizing: border-box; margin: 1.2em 0px; overflow-x: auto; max-width: calc(100% + 16px); padding: 0px; cursor: default; font-size: 16px; font-weight: normal; white-space: normal; text-size-adjust: auto;&quot;&gt;&lt;table class=&quot;md-table&quot; style=&quot;box-sizing: border-box; border-collapse: collapse; border-spacing: 0px; width: 800px; overflow: auto; break-inside: auto; white-space: pre-wrap; cursor: text; padding: 0px; word-break: initial; margin: 0px !important;&quot;&gt;&lt;thead style=&quot;box-sizing: border-box; background-color: rgb(248, 248, 248);&quot;&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n5&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px;&quot;&gt;&lt;th style=&quot;box-sizing: border-box; padding: 6px 13px; border-width: 1px 1px 0px; border-top-style: solid; border-right-style: solid; border-left-style: solid; border-top-color: rgb(223, 226, 229); border-right-color: rgb(223, 226, 229); border-left-color: rgb(223, 226, 229); text-align: left; margin: 0px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n6&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 325.046875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;메서드&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;&lt;th style=&quot;box-sizing: border-box; padding: 6px 13px; border-width: 1px 1px 0px; border-top-style: solid; border-right-style: solid; border-left-style: solid; border-top-color: rgb(223, 226, 229); border-right-color: rgb(223, 226, 229); border-left-color: rgb(223, 226, 229); text-align: left; margin: 0px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n7&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 265.984375px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;검사하는 내용&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;&lt;th style=&quot;box-sizing: border-box; padding: 6px 13px; border-width: 1px 1px 0px; border-top-style: solid; border-right-style: solid; border-left-style: solid; border-top-color: rgb(223, 226, 229); border-right-color: rgb(223, 226, 229); border-left-color: rgb(223, 226, 229); text-align: left; margin: 0px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n8&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 126.984375px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;추가된 버전&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;box-sizing: border-box;&quot;&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n9&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n10&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 325.046875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertEqual&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertEqual(a, b)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n11&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 265.984375px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;a == b&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n12&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 126.984375px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n13&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px; background-color: rgb(248, 248, 248);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n14&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 325.046875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertNotEqual&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertNotEqual(a, b)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n15&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 265.984375px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;a != b&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n16&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 126.984375px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n17&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n18&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 325.046875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertTrue&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertTrue(x)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n19&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 265.984375px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;bool(x) is True&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n20&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 126.984375px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n21&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px; background-color: rgb(248, 248, 248);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n22&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 325.046875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertFalse&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertFalse(x)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n23&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 265.984375px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;bool(x) is False&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n24&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 126.984375px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n25&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n26&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 325.046875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertIs&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertIs(a, b)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n27&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 265.984375px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;a is b&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n28&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 126.984375px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;3.1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n29&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px; background-color: rgb(248, 248, 248);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n30&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 325.046875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertIsNot&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertIsNot(a, b)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n31&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 265.984375px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;a is not b&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n32&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 126.984375px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;3.1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n33&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n34&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 325.046875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertIsNone&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertIsNone(x)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n35&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 265.984375px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;x is None&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n36&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 126.984375px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;3.1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n37&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px; background-color: rgb(248, 248, 248);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n38&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 325.046875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertIsNotNone&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertIsNotNone(x)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n39&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 265.984375px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;x is not None&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n40&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 126.984375px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;3.1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n41&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n42&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 325.046875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertIn&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertIn(a, b)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n43&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 265.984375px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;a in b&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n44&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 126.984375px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;3.1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n45&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px; background-color: rgb(248, 248, 248);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n46&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 325.046875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertNotIn&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertNotIn(a, b)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n47&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 265.984375px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;a not in b&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n48&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 126.984375px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;3.1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n49&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n50&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 325.046875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertIsInstance&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertIsInstance(a, b)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n51&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 265.984375px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;isinstance(a, b)&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n52&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 126.984375px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;3.2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n53&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px; background-color: rgb(248, 248, 248);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n54&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 325.046875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertNotIsInstance&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertNotIsInstance(a, b)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n55&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 265.984375px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;not isinstance(a, b)&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n56&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 126.984375px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;3.2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p cid=&quot;n57&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.8em 0px; width: inherit; position: relative; font-size: 16px; font-weight: normal; text-size-adjust: auto;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;모든 assert 메서드는 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 인자를 받을 수 있습니다, 만약 그것이 전달된다면 실패 시 에러 메시지로 사용됩니다(&lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.longMessage&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;longMessage&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 도 참고하십시오). &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertRaises&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertRaises()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertRaisesRegex&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertRaisesRegex()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertWarns&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertWarns()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertWarnsRegex&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertWarnsRegex()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;는 컨텍스트 관리자로서 사용될 때만 그들에게 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 키워드 인자를 전달할 수 있다는 점을 주의하십시오.&lt;/span&gt;&lt;/p&gt;&lt;ul class=&quot;ul-list&quot; cid=&quot;n58&quot; mdtype=&quot;list&quot; data-mark=&quot;-&quot; style=&quot;box-sizing: border-box; margin: 0.8em 0px; padding-left: 30px; position: relative; font-size: 16px; font-weight: normal; white-space: normal; text-size-adjust: auto;&quot;&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n59&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n60&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertEqual&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n61&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;highlight&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;mark style=&quot;box-sizing: border-box;&quot;&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;와 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;가 같은지 테스트합니다&lt;/span&gt;&lt;/mark&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;. 비교한 값이 같지 않으면 테스트는 실패할 것입니다.추가로, 만약 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;와 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;가 정확히 같은 형(type)이고 list, tuple, dict, set, frozenset, str 이거나 &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.addTypeEqualityFunc&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;addTypeEqualityFunc()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;에 등록된 서브 클래스 형 중 하나일 경우 더 유용한 기본 에러 메시지를 생성하기 위해 형-특화(type-specific) 동등성 함수가 불릴 것입니다(&lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#type-specific-methods&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;형-특화 메서드 목록&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;을 참고하십시오).버전 3.1으로 변경: 형-특화 동등성 함수가 자동으로 불리도록 추가버전 3.2으로 변경: 문자열 비교를 위해서 &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertMultiLineEqual&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertMultiLineEqual()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;를 기본 형-특화 동등성 함수에 추가&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&quot;ul-list&quot; cid=&quot;n62&quot; mdtype=&quot;list&quot; data-mark=&quot;-&quot; style=&quot;box-sizing: border-box; margin: 0.8em 0px; padding-left: 30px; position: relative; font-size: 16px; font-weight: normal; white-space: normal; text-size-adjust: auto;&quot;&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n63&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n64&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertNotEqual&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n65&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;==first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;와 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;가 같지 않은지 테스트==합니다, 비교한 값이 같으면 테스트는 실패할 것입니다.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&quot;ul-list&quot; cid=&quot;n66&quot; mdtype=&quot;list&quot; data-mark=&quot;-&quot; style=&quot;box-sizing: border-box; margin: 0.8em 0px; padding-left: 30px; position: relative; font-size: 16px; font-weight: normal; white-space: normal; text-size-adjust: auto;&quot;&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n67&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n68&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertTrue&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;expr&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n69&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n70&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertFalse&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;expr&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n71&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;highlight&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;mark style=&quot;box-sizing: border-box;&quot;&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;expr&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;이 참(또는 거짓)인지 테스트&lt;/span&gt;&lt;/mark&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;합니다.이것은 &lt;/span&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;bool(expr) is True&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;와 동등하고 &lt;/span&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;expr is True&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;와 동등하지 않다는 것에 주의하십시오(후자를 위해선 &lt;/span&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertIs(expr, True)&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;를 사용하십시오). 더 구체적인 메서드를 사용할 수 있을 때는 이 메서드를 지양해야 합니다(예, &lt;/span&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertTrue(a == b)&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 대신에 &lt;/span&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertEqual(a, b)&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;), 왜냐하면 실패의 경우에 구체적인 메서드가 더 나은 에러 메시지를 제공하기 때문입니다.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&quot;ul-list&quot; cid=&quot;n72&quot; mdtype=&quot;list&quot; data-mark=&quot;-&quot; style=&quot;box-sizing: border-box; margin: 0.8em 0px; padding-left: 30px; position: relative; font-size: 16px; font-weight: normal; white-space: normal; text-size-adjust: auto;&quot;&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n73&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n74&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertIs&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n75&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n76&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertIsNot&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n77&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;highlight&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;mark style=&quot;box-sizing: border-box;&quot;&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;와 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;가 같은 객체로 평가되는지(아닌지) 테스트&lt;/span&gt;&lt;/mark&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;합니다.버전 3.1에 추가.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&quot;ul-list&quot; cid=&quot;n78&quot; mdtype=&quot;list&quot; data-mark=&quot;-&quot; style=&quot;box-sizing: border-box; margin: 0.8em 0px; padding-left: 30px; position: relative; font-size: 16px; font-weight: normal; white-space: normal; text-size-adjust: auto;&quot;&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n79&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n80&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertIsNone&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;expr&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n81&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n82&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertIsNotNone&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;expr&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n83&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;highlight&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;mark style=&quot;box-sizing: border-box;&quot;&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;expr&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;이 &lt;/span&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;None&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 인지(아닌지) 테스트&lt;/span&gt;&lt;/mark&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;합니다.버전 3.1에 추가.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&quot;ul-list&quot; cid=&quot;n84&quot; mdtype=&quot;list&quot; data-mark=&quot;-&quot; style=&quot;box-sizing: border-box; margin: 0.8em 0px; padding-left: 30px; position: relative; font-size: 16px; font-weight: normal; white-space: normal; text-size-adjust: auto;&quot;&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n85&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n86&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertIn&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n87&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n88&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertNotIn&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n89&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;==first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;가 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt; 안에 있는지(아닌지) 테스트==합니다.버전 3.1에 추가.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&quot;ul-list&quot; cid=&quot;n90&quot; mdtype=&quot;list&quot; data-mark=&quot;-&quot; style=&quot;box-sizing: border-box; margin: 0.8em 0px; padding-left: 30px; position: relative; font-size: 16px; font-weight: normal; white-space: normal; text-size-adjust: auto;&quot;&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n91&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n92&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertIsInstance&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;obj&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;cls&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n93&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n94&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertNotIsInstance&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;obj&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;cls&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n95&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;==obj&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;가 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;cls&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/functions.html#isinstance&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;isinstance()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;가 지원하는 것처럼 클래스 또는 클래스의 튜플)의 인스턴스인지(아닌지) 테스트==합니다. 정확한 형 검사를 위해서는 &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertIs&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertIs(type(obj), cls)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;를 사용하십시오.버전 3.2에 추가.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p cid=&quot;n96&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.8em 0px; width: inherit; position: relative; font-size: 16px; font-weight: normal; text-size-adjust: auto;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;다음의 메서드를 사용하여 예외, 경고, 로그 메시지의 발생을 검사할 수 있습니다:&lt;/span&gt;&lt;/p&gt;&lt;figure class=&quot;md-table-fig&quot; contenteditable=&quot;false&quot; cid=&quot;n97&quot; mdtype=&quot;table&quot; style=&quot;box-sizing: border-box; margin: 1.2em 0px; overflow-x: auto; max-width: calc(100% + 16px); padding: 0px; cursor: default; font-size: 16px; font-weight: normal; white-space: normal; text-size-adjust: auto;&quot;&gt;&lt;table class=&quot;md-table&quot; style=&quot;box-sizing: border-box; border-collapse: collapse; border-spacing: 0px; width: 800px; overflow: auto; break-inside: auto; white-space: pre-wrap; cursor: text; padding: 0px; word-break: initial; margin: 0px !important;&quot;&gt;&lt;thead style=&quot;box-sizing: border-box; background-color: rgb(248, 248, 248);&quot;&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n98&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px;&quot;&gt;&lt;th style=&quot;box-sizing: border-box; padding: 6px 13px; border-width: 1px 1px 0px; border-top-style: solid; border-right-style: solid; border-left-style: solid; border-top-color: rgb(223, 226, 229); border-right-color: rgb(223, 226, 229); border-left-color: rgb(223, 226, 229); text-align: left; margin: 0px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n99&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 292.203125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;메서드&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;&lt;th style=&quot;box-sizing: border-box; padding: 6px 13px; border-width: 1px 1px 0px; border-top-style: solid; border-right-style: solid; border-left-style: solid; border-top-color: rgb(223, 226, 229); border-right-color: rgb(223, 226, 229); border-left-color: rgb(223, 226, 229); text-align: left; margin: 0px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n100&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 367.53125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;검사하는 내용&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;&lt;th style=&quot;box-sizing: border-box; padding: 6px 13px; border-width: 1px 1px 0px; border-top-style: solid; border-right-style: solid; border-left-style: solid; border-top-color: rgb(223, 226, 229); border-right-color: rgb(223, 226, 229); border-left-color: rgb(223, 226, 229); text-align: left; margin: 0px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n101&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 58.28125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;추가된 버전&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;box-sizing: border-box;&quot;&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n102&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n103&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 292.203125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertRaises&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertRaises(exc, fun, *args, **kwds)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n104&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 367.53125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;fun(*args, **kwds)&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;가 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;exc&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;를 발생&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n105&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 58.28125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n106&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px; background-color: rgb(248, 248, 248);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n107&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 292.203125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertRaisesRegex&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertRaisesRegex(exc, r, fun, *args,**kwds)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n108&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 367.53125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;fun(*args, **kwds)&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;가 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;exc&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;를 발생하고 메시지가 정규식 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;r&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;에 일치&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n109&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 58.28125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;3.1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n110&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n111&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 292.203125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertWarns&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertWarns(warn, fun, *args, **kwds)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n112&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 367.53125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;fun(*args, **kwds)&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;가 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;warn&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;을 발생&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n113&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 58.28125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;3.2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n114&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px; background-color: rgb(248, 248, 248);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n115&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 292.203125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertWarnsRegex&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertWarnsRegex(warn, r, fun, *args,**kwds)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n116&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 367.53125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;fun(*args, **kwds)&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;가 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;warn&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;을 발생하고 메시지가 정규식 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;r&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;에 일치&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n117&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 58.28125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;3.2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n118&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n119&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 292.203125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertLogs&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertLogs(logger, level)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n120&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 367.53125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;with&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 블록이 최소 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;level&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;로 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;logger&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;에 로그를 남김&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n121&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 58.28125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;3.4&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/figure&gt;&lt;ul class=&quot;ul-list&quot; cid=&quot;n122&quot; mdtype=&quot;list&quot; data-mark=&quot;-&quot; style=&quot;box-sizing: border-box; margin: 0.8em 0px; padding-left: 30px; position: relative; font-size: 16px; font-weight: normal; white-space: normal; text-size-adjust: auto;&quot;&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n123&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n124&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertRaises&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;exception&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;callable&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;strong&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;args*, &lt;/strong&gt;&lt;/span&gt;&lt;span md-inline=&quot;escape&quot; style=&quot;box-sizing: border-box;&quot;&gt;*&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;kwds*)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n125&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n126&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertRaises&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;exception&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, ***, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n127&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertRaises&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertRaises()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;에 전달된 &lt;/span&gt;&lt;span md-inline=&quot;highlight&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;mark style=&quot;box-sizing: border-box;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;어떤 위치 또는 키워드 인자와 함께 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;callable&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;이 호출되었을 때 예외가 발생하는지 테스트&lt;/span&gt;&lt;/mark&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;합니다. &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;exception&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;이 발생하면 테스트를 통과하고, 다른 예외가 발생하면 에러이고, 아무 예외도 발생하지 않으면 실패입니다. 여러 &lt;/span&gt;&lt;span md-inline=&quot;highlight&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;mark style=&quot;box-sizing: border-box;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;예외 모음을 잡기 위해서 예외 클래스를 포함한 튜플을 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;exception&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;으로 전달해도 좋습니다.&lt;/span&gt;&lt;/mark&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt; 만약 선택적인 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;와 함께 오직 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;exception&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt; 인자만 전달된다면, 테스트할 코드를 함수가 아닌 인라인으로 작성할 수 있도록 컨텍스트 관리자를 반환합니다:&lt;/span&gt;&lt;/p&gt;&lt;pre spellcheck=&quot;false&quot; class=&quot;md-fences md-end-block ty-contain-cm modeLoaded&quot; lang=&quot;python&quot; contenteditable=&quot;false&quot; cid=&quot;n841&quot; mdtype=&quot;fences&quot; style=&quot;box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; break-inside: avoid; white-space: normal; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 1em 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;&quot;&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&gt;&lt;span class=&quot;cm-keyword&quot; style=&quot;box-sizing: border-box; color: rgb(119, 0, 136);&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;cm-variable-2&quot; style=&quot;box-sizing: border-box; color: rgb(0, 85, 170);&quot;&gt;self&lt;/span&gt;.&lt;span class=&quot;cm-property&quot; style=&quot;box-sizing: border-box; color: rgb(0, 0, 0);&quot;&gt;assertRaises&lt;/span&gt;(&lt;span class=&quot;cm-variable&quot; style=&quot;box-sizing: border-box; color: rgb(0, 0, 0);&quot;&gt;SomeException&lt;/span&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&gt; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;cm-variable&quot; style=&quot;box-sizing: border-box; color: rgb(0, 0, 0);&quot;&gt;do_something&lt;/span&gt;()&lt;/span&gt;&lt;/pre&gt;&lt;p cid=&quot;n839&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;highlight&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;mark style=&quot;box-sizing: border-box;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;컨텍스트 관리자로 사용되면, &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertRaises&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertRaises()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;는 추가적인 키워드 인자인 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;msg&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;를 받을 수 있습니다.&lt;/span&gt;&lt;/mark&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;컨텍스트 관리자는 잡은 예외 객체를 &lt;/span&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;exception&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt; 어트리뷰트에 저장할 것입니다. 이것은 발생한 예외에 대해서 추가적인 검사를 수행하려는 경우에 유용할 수 있습니다:&lt;/span&gt;&lt;/p&gt;&lt;pre spellcheck=&quot;false&quot; class=&quot;md-fences md-end-block ty-contain-cm modeLoaded&quot; lang=&quot;python&quot; contenteditable=&quot;false&quot; cid=&quot;n847&quot; mdtype=&quot;fences&quot; style=&quot;box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; break-inside: avoid; white-space: normal; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 1em 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;&quot;&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&gt;&lt;span class=&quot;cm-keyword&quot; style=&quot;box-sizing: border-box; color: rgb(119, 0, 136);&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;cm-variable-2&quot; style=&quot;box-sizing: border-box; color: rgb(0, 85, 170);&quot;&gt;self&lt;/span&gt;.&lt;span class=&quot;cm-property&quot; style=&quot;box-sizing: border-box; color: rgb(0, 0, 0);&quot;&gt;assertRaises&lt;/span&gt;(&lt;span class=&quot;cm-variable&quot; style=&quot;box-sizing: border-box; color: rgb(0, 0, 0);&quot;&gt;SomeException&lt;/span&gt;) &lt;span class=&quot;cm-keyword&quot; style=&quot;box-sizing: border-box; color: rgb(119, 0, 136);&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;cm-variable&quot; style=&quot;box-sizing: border-box; color: rgb(0, 0, 0);&quot;&gt;cm&lt;/span&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&gt; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;cm-variable&quot; style=&quot;box-sizing: border-box; color: rgb(0, 0, 0);&quot;&gt;do_something&lt;/span&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&gt;&lt;span cm-text=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&gt;&lt;span class=&quot;cm-variable&quot; style=&quot;box-sizing: border-box; color: rgb(0, 0, 0);&quot;&gt;the_exception&lt;/span&gt; = &lt;span class=&quot;cm-variable&quot; style=&quot;box-sizing: border-box; color: rgb(0, 0, 0);&quot;&gt;cm&lt;/span&gt;.&lt;span class=&quot;cm-property&quot; style=&quot;box-sizing: border-box; color: rgb(0, 0, 0);&quot;&gt;exception&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&gt;&lt;span class=&quot;cm-variable-2&quot; style=&quot;box-sizing: border-box; color: rgb(0, 85, 170);&quot;&gt;self&lt;/span&gt;.&lt;span class=&quot;cm-property&quot; style=&quot;box-sizing: border-box; color: rgb(0, 0, 0);&quot;&gt;assertEqual&lt;/span&gt;(&lt;span class=&quot;cm-variable&quot; style=&quot;box-sizing: border-box; color: rgb(0, 0, 0);&quot;&gt;the_exception&lt;/span&gt;.&lt;span class=&quot;cm-property&quot; style=&quot;box-sizing: border-box; color: rgb(0, 0, 0);&quot;&gt;error_code&lt;/span&gt;, &lt;span class=&quot;cm-number&quot; style=&quot;box-sizing: border-box; color: rgb(17, 102, 68);&quot;&gt;3&lt;/span&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;p cid=&quot;n843&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;버전 3.1으로 변경: &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertRaises&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertRaises()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;를 컨텍스트 관리자로 사용할 수 있도록 기능 추가.버전 3.2으로 변경: &lt;/span&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;exception&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 어트리뷰트 추가.버전 3.3으로 변경: 컨텍스트 관리자로 사용될 때 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 키워드 인자 추가.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&quot;ul-list&quot; cid=&quot;n128&quot; mdtype=&quot;list&quot; data-mark=&quot;-&quot; style=&quot;box-sizing: border-box; margin: 0.8em 0px; padding-left: 30px; position: relative; font-size: 16px; font-weight: normal; white-space: normal; text-size-adjust: auto;&quot;&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n129&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n130&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertRaisesRegex&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;exception&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;regex&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;callable&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;strong&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;args*, &lt;/strong&gt;&lt;/span&gt;&lt;span md-inline=&quot;escape&quot; style=&quot;box-sizing: border-box;&quot;&gt;*&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;kwds*)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n131&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n132&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertRaisesRegex&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;exception&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;regex&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, ***, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n133&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertRaises&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertRaises()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;와 비슷하지만 발생한 예외의 문자열 표현이 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;regex&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;에 일치하는지 테스트합니다. &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;regex&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;는 정규식 객체나 &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/re.html#re.search&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;re.search()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;에 사용되기 적합한 정규식 문자열이 될 수 있습니다. 예:&lt;/span&gt;&lt;/p&gt;&lt;pre spellcheck=&quot;false&quot; class=&quot;md-fences md-end-block ty-contain-cm modeLoaded&quot; lang=&quot;python&quot; contenteditable=&quot;false&quot; cid=&quot;n860&quot; mdtype=&quot;fences&quot; style=&quot;box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; break-inside: avoid; white-space: normal; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 1em 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;&quot;&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&gt;&lt;span class=&quot;cm-variable-2&quot; style=&quot;box-sizing: border-box; color: rgb(0, 85, 170);&quot;&gt;self&lt;/span&gt;.&lt;span class=&quot;cm-property&quot; style=&quot;box-sizing: border-box; color: rgb(0, 0, 0);&quot;&gt;assertRaisesRegex&lt;/span&gt;(&lt;span class=&quot;cm-variable&quot; style=&quot;box-sizing: border-box; color: rgb(0, 0, 0);&quot;&gt;ValueError&lt;/span&gt;, &lt;span class=&quot;cm-string&quot; style=&quot;box-sizing: border-box; color: rgb(170, 17, 17);&quot;&gt;&quot;invalid literal for.*XYZ'$&quot;&lt;/span&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;cm-builtin&quot; style=&quot;box-sizing: border-box; color: rgb(51, 0, 170);&quot;&gt;int&lt;/span&gt;, &lt;span class=&quot;cm-string&quot; style=&quot;box-sizing: border-box; color: rgb(170, 17, 17);&quot;&gt;'XYZ'&lt;/span&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;p cid=&quot;n850&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;또는: &lt;/span&gt;&lt;/p&gt;&lt;pre spellcheck=&quot;false&quot; class=&quot;md-fences md-end-block ty-contain-cm modeLoaded&quot; lang=&quot;python&quot; contenteditable=&quot;false&quot; cid=&quot;n866&quot; mdtype=&quot;fences&quot; style=&quot;box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; break-inside: avoid; white-space: normal; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 1em 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;&quot;&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&gt;&lt;span class=&quot;cm-keyword&quot; style=&quot;box-sizing: border-box; color: rgb(119, 0, 136);&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;cm-variable-2&quot; style=&quot;box-sizing: border-box; color: rgb(0, 85, 170);&quot;&gt;self&lt;/span&gt;.&lt;span class=&quot;cm-property&quot; style=&quot;box-sizing: border-box; color: rgb(0, 0, 0);&quot;&gt;assertRaisesRegex&lt;/span&gt;(&lt;span class=&quot;cm-variable&quot; style=&quot;box-sizing: border-box; color: rgb(0, 0, 0);&quot;&gt;ValueError&lt;/span&gt;, &lt;span class=&quot;cm-string&quot; style=&quot;box-sizing: border-box; color: rgb(170, 17, 17);&quot;&gt;'literal'&lt;/span&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&gt; &amp;nbsp; &lt;span class=&quot;cm-builtin cm-error&quot; style=&quot;box-sizing: border-box; color: rgb(51, 0, 170);&quot;&gt;int&lt;/span&gt;(&lt;span class=&quot;cm-string&quot; style=&quot;box-sizing: border-box; color: rgb(170, 17, 17);&quot;&gt;'XYZ'&lt;/span&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;p cid=&quot;n862&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;버전 3.1에 추가: &lt;/span&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertRaisesRegexp&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 라는 이름으로.버전 3.2으로 변경: &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertRaisesRegex&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertRaisesRegex()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;으로 이름 변경.버전 3.3으로 변경: 컨텍스트 관리자로 사용될 때 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 키워드 인자 추가.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&quot;ul-list&quot; cid=&quot;n134&quot; mdtype=&quot;list&quot; data-mark=&quot;-&quot; style=&quot;box-sizing: border-box; margin: 0.8em 0px; padding-left: 30px; position: relative; font-size: 16px; font-weight: normal; white-space: normal; text-size-adjust: auto;&quot;&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n135&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n136&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertWarns&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;warning&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;callable&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;strong&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;args*, &lt;/strong&gt;&lt;/span&gt;&lt;span md-inline=&quot;escape&quot; style=&quot;box-sizing: border-box;&quot;&gt;*&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;kwds*)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n137&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n138&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertWarns&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;warning&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, ***, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n869&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertWarns&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertWarns()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;에 전달된 어떤 위치 또는 키워드 인자와 함께 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;callable&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;이 호출되었을 때 경고(warning)가 발생하는지 테스트합니다. &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;warning&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;이 발생하면 테스트를 통과하고, 그렇지 않으면 실패입니다. 예외가 발생하면 에러입니다. 여러 경고 모음을 잡기 위해서 경고 클래스를 포함한 튜플을 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;warnings&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;로 전달해도 좋습니다.&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n870&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;만약 선택적인 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;와 함께 오직 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;warning&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 인자만 전달된다면, 테스트할 코드를 함수가 아닌 인라인으로 작성할 수 있도록 컨텍스트 관리자를 반환합니다:&lt;/span&gt;&lt;/p&gt;&lt;pre spellcheck=&quot;false&quot; class=&quot;md-fences md-end-block ty-contain-cm modeLoaded&quot; lang=&quot;&quot; contenteditable=&quot;false&quot; cid=&quot;n871&quot; mdtype=&quot;fences&quot; style=&quot;box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; break-inside: avoid; white-space: normal; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 1em 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;&quot;&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&gt;with self.assertWarns(SomeWarning):&lt;/span&gt;&lt;br /&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&gt; &amp;nbsp;  do_something()&lt;/span&gt;&lt;/pre&gt;&lt;p cid=&quot;n872&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;컨텍스트 관리자로 사용되면, &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertWarns&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertWarns()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;는 추가적인 키워드 인자인 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;를 받을 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n873&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;컨텍스트 관리자는 잡은 경고 객체를 &lt;/span&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;warning&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 어트리뷰트에 저장하고, 경고를 발생한 소스코드 줄을 &lt;/span&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;filename&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;과 &lt;/span&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;lineno&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;에 저장할 것입니다. 이것은 발생한 경고에 대해서 추가적인 검사를 수행하려는 경우에 유용할 수 있습니다:&lt;/span&gt;&lt;/p&gt;&lt;pre spellcheck=&quot;false&quot; class=&quot;md-fences md-end-block ty-contain-cm modeLoaded&quot; lang=&quot;&quot; contenteditable=&quot;false&quot; cid=&quot;n874&quot; mdtype=&quot;fences&quot; style=&quot;box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; break-inside: avoid; white-space: normal; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 1em 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;&quot;&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&gt;with self.assertWarns(SomeWarning) as cm:&lt;/span&gt;&lt;br /&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&gt; &amp;nbsp;  do_something()&lt;/span&gt;&lt;br /&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&gt;&lt;span cm-text=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&gt;self.assertIn('myfile.py', cm.filename)&lt;/span&gt;&lt;br /&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&gt;self.assertEqual(320, cm.lineno)&lt;/span&gt;&lt;/pre&gt;&lt;p cid=&quot;n875&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;이 메서드는 호출될 때 적용될 경고 필터와 관계없이 작동합니다.&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n876&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;버전 3.2에 추가.&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n877&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;버전 3.3으로 변경: 컨텍스트 관리자로 사용될 때 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt; 키워드 인자 추가.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&quot;ul-list&quot; cid=&quot;n140&quot; mdtype=&quot;list&quot; data-mark=&quot;-&quot; style=&quot;box-sizing: border-box; margin: 0.8em 0px; padding-left: 30px; position: relative; font-size: 16px; font-weight: normal; white-space: normal; text-size-adjust: auto;&quot;&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n141&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n142&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertWarnsRegex&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;warning&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;regex&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;callable&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;strong&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;strong style=&quot;box-sizing: border-box;&quot;&gt;args*, &lt;/strong&gt;&lt;/span&gt;&lt;span md-inline=&quot;escape&quot; style=&quot;box-sizing: border-box;&quot;&gt;*&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;kwds*)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n143&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n144&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertWarnsRegex&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;warning&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;regex&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, ***, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n895&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertWarns&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertWarns()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;와 비슷하지만 발생한 경고의 메시지가 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;regex&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;에 일치하는지 테스트합니다. &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;regex&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;는 정규식 객체나 &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/re.html#re.search&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;re.search()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;에 사용되기 적합한 정규식 문자열이 될 수 있습니다. 예:&lt;/span&gt;&lt;/p&gt;&lt;pre spellcheck=&quot;false&quot; class=&quot;md-fences md-end-block ty-contain-cm modeLoaded&quot; lang=&quot;&quot; contenteditable=&quot;false&quot; cid=&quot;n896&quot; mdtype=&quot;fences&quot; style=&quot;box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; break-inside: avoid; white-space: normal; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 1em 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;&quot;&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&gt;self.assertWarnsRegex(DeprecationWarning,&lt;/span&gt;&lt;br /&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  r'legacy_function\(\) is deprecated',&lt;/span&gt;&lt;br /&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  legacy_function, 'XYZ')&lt;/span&gt;&lt;/pre&gt;&lt;p cid=&quot;n897&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;또는:&lt;/span&gt;&lt;/p&gt;&lt;pre spellcheck=&quot;false&quot; class=&quot;md-fences md-end-block ty-contain-cm modeLoaded&quot; lang=&quot;&quot; contenteditable=&quot;false&quot; cid=&quot;n898&quot; mdtype=&quot;fences&quot; style=&quot;box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; break-inside: avoid; white-space: normal; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 1em 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;&quot;&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&gt;with self.assertWarnsRegex(RuntimeWarning, 'unsafe frobnicating'):&lt;/span&gt;&lt;br /&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&gt; &amp;nbsp;  frobnicate('/etc/passwd')&lt;/span&gt;&lt;/pre&gt;&lt;p cid=&quot;n899&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;버전 3.2에 추가.&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n900&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;버전 3.3으로 변경: 컨텍스트 관리자로 사용될 때 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt; 키워드 인자 추가.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n927&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n928&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertLogs&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;logger=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;level=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n910&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;최소한 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;level&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;로 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;logger&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;나 그 자식들에 최소한 1개의 메시지가 기록되는지 테스트하는 컨텍스트 관리자입니다.&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n911&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;logger&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;가 주어졌다면, &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/logging.html#logging.Logger&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;logging.Logger&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 객체이거나 로거의 이름인 &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/stdtypes.html#str&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;str&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;이어야 합니다. 기본값은 모든 메시지를 잡을 루트 로거입니다.&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n912&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;level&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;이 주어졌다면, 로그 수준의 숫자 값이거나 그에 대응하는 문자열이어야 합니다(예를 들어 &lt;/span&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;&quot;ERROR&quot;&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;이거나 &lt;/span&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;logging.ERROR&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;). 기본값은 &lt;/span&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;logging.INFO&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;입니다.&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n913&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;만약 &lt;/span&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;with&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 블록 안에서 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;logger&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;와 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;level&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 조건을 만족하는 최소한 1개의 메시지가 나왔다면 테스트는 성공하고, 그렇지 않으면 실패합니다.&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n914&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;컨텍스트 관리자에 의해 반환되는 객체는 조건에 일치하는 로그 메시지를 추적하기 위한 기록 도우미입니다. 이것은 2개의 어트리뷰트를 가지고 있습니다:&lt;/span&gt;&lt;/p&gt;&lt;ul class=&quot;ul-list&quot; cid=&quot;n915&quot; mdtype=&quot;list&quot; data-mark=&quot;-&quot; style=&quot;box-sizing: border-box; margin: 0px; padding-left: 30px; position: relative;&quot;&gt;&lt;li class=&quot;md-list-item md-focus-container&quot; cid=&quot;n916&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n917&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block md-focus&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; class=&quot;md-expand&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;records&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n918&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;조건에 일치하는 메시지의 &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/logging.html#logging.LogRecord&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;logging.LogRecord&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 객체 목록.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&quot;ul-list&quot; cid=&quot;n919&quot; mdtype=&quot;list&quot; data-mark=&quot;-&quot; style=&quot;box-sizing: border-box; margin: 0px; padding-left: 30px; position: relative;&quot;&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n920&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n921&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;output&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n922&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;조건에 일치하는 메시지의 포맷 출력인 &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/stdtypes.html#str&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;str&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 객체 목록.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p cid=&quot;n923&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;예:&lt;/span&gt;&lt;/p&gt;&lt;pre spellcheck=&quot;false&quot; class=&quot;md-fences md-end-block ty-contain-cm modeLoaded&quot; lang=&quot;&quot; contenteditable=&quot;false&quot; cid=&quot;n924&quot; mdtype=&quot;fences&quot; style=&quot;box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; break-inside: avoid; white-space: normal; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 1em 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;&quot;&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&gt;with self.assertLogs('foo', level='INFO') as cm:&lt;/span&gt;&lt;br /&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&gt; &amp;nbsp; logging.getLogger('foo').info('first message')&lt;/span&gt;&lt;br /&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&gt; &amp;nbsp; logging.getLogger('foo.bar').error('second message')&lt;/span&gt;&lt;br /&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&gt;self.assertEqual(cm.output, ['INFO:foo:first message',&lt;/span&gt;&lt;br /&gt;&lt;span role=&quot;presentation&quot; style=&quot;box-sizing: border-box; padding-right: 0.1px;&quot;&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; 'ERROR:foo.bar:second message'])&lt;/span&gt;&lt;/pre&gt;&lt;p cid=&quot;n925&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;버전 3.4에 추가.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p cid=&quot;n150&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.8em 0px; width: inherit; position: relative; font-size: 16px; font-weight: normal; text-size-adjust: auto;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;더 구체적인 검사를 수행하기 위한 또 다른 메서드가 있습니다, 아래와 같이:&lt;/span&gt;&lt;/p&gt;&lt;figure class=&quot;md-table-fig&quot; contenteditable=&quot;false&quot; cid=&quot;n151&quot; mdtype=&quot;table&quot; style=&quot;box-sizing: border-box; margin: 1.2em 0px; overflow-x: auto; max-width: calc(100% + 16px); padding: 0px; cursor: default; font-size: 16px; font-weight: normal; white-space: normal; text-size-adjust: auto;&quot;&gt;&lt;table class=&quot;md-table&quot; style=&quot;box-sizing: border-box; border-collapse: collapse; border-spacing: 0px; width: 800px; overflow: auto; break-inside: auto; white-space: pre-wrap; cursor: text; padding: 0px; word-break: initial; margin: 0px !important;&quot;&gt;&lt;thead style=&quot;box-sizing: border-box; background-color: rgb(248, 248, 248);&quot;&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n152&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px;&quot;&gt;&lt;th style=&quot;box-sizing: border-box; padding: 6px 13px; border-width: 1px 1px 0px; border-top-style: solid; border-right-style: solid; border-left-style: solid; border-top-color: rgb(223, 226, 229); border-right-color: rgb(223, 226, 229); border-left-color: rgb(223, 226, 229); text-align: left; margin: 0px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n153&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 231.03125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;메서드&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;&lt;th style=&quot;box-sizing: border-box; padding: 6px 13px; border-width: 1px 1px 0px; border-top-style: solid; border-right-style: solid; border-left-style: solid; border-top-color: rgb(223, 226, 229); border-right-color: rgb(223, 226, 229); border-left-color: rgb(223, 226, 229); text-align: left; margin: 0px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n154&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 404.796875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;검사하는 내용&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;&lt;th style=&quot;box-sizing: border-box; padding: 6px 13px; border-width: 1px 1px 0px; border-top-style: solid; border-right-style: solid; border-left-style: solid; border-top-color: rgb(223, 226, 229); border-right-color: rgb(223, 226, 229); border-left-color: rgb(223, 226, 229); text-align: left; margin: 0px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n155&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 82.203125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;추가된 버전&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;box-sizing: border-box;&quot;&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n156&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n157&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 231.03125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertAlmostEqual&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertAlmostEqual(a, b)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n158&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 404.796875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;round(a-b, 7) == 0&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n159&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 82.203125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n160&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px; background-color: rgb(248, 248, 248);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n161&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 231.03125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertNotAlmostEqual&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertNotAlmostEqual(a, b)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n162&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 404.796875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;round(a-b, 7) != 0&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n163&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 82.203125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n164&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n165&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 231.03125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertGreater&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertGreater(a, b)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n166&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 404.796875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;a &amp;gt; b&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n167&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 82.203125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;3.1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n168&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px; background-color: rgb(248, 248, 248);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n169&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 231.03125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertGreaterEqual&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertGreaterEqual(a, b)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n170&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 404.796875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;a &amp;gt;= b&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n171&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 82.203125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;3.1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n172&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n173&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 231.03125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertLess&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertLess(a, b)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n174&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 404.796875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;a &amp;lt; b&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n175&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 82.203125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;3.1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n176&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px; background-color: rgb(248, 248, 248);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n177&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 231.03125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertLessEqual&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertLessEqual(a, b)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n178&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 404.796875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;a &amp;lt;= b&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n179&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 82.203125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;3.1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n180&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n181&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 231.03125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertRegex&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertRegex(s, r)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n182&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 404.796875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;r.search(s)&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n183&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 82.203125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;3.1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n184&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px; background-color: rgb(248, 248, 248);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n185&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 231.03125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertNotRegex&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertNotRegex(s, r)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n186&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 404.796875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;not r.search(s)&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n187&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 82.203125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;3.2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n188&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n189&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 231.03125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertCountEqual&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertCountEqual(a, b)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n190&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 404.796875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;순서와 상관없이 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;a&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;와 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;b&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;가 같은 개수의 같은 요소를 가졌는지&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n191&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 82.203125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;3.2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/figure&gt;&lt;ul class=&quot;ul-list&quot; cid=&quot;n192&quot; mdtype=&quot;list&quot; data-mark=&quot;-&quot; style=&quot;box-sizing: border-box; margin: 0.8em 0px; padding-left: 30px; position: relative; font-size: 16px; font-weight: normal; white-space: normal; text-size-adjust: auto;&quot;&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n193&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n194&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertAlmostEqual&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;places=7&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;delta=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n937&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n938&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertNotAlmostEqual&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;places=7&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;delta=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n939&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;와 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;가 근사하게 같은지(또는 근사하게 같지 않은지) 테스트합니다. 이는 값 차이를 계산하고, 주어진 소수 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;자릿(places)&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;수(기본값 7)로 반올림한 뒤, 0과 비교하는 것으로 이루어집니다. 이 메서드는 값을 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;유효 숫자 자릿수(significant digits)&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;가 아닌 주어진 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;소수 자릿수(decimal places)&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(즉, &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/functions.html#round&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;round()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 함수와 같이)로 반올림합니다.만약 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;places&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 대신에 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;delta&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;가 주어진다면 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;와 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;의 값 차이는 반드시 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;delta&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;보다 작거나 같아야(또는 커야) 합니다.&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;delta&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;와 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;places&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;가 동시에 주어지면 &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/exceptions.html#TypeError&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;TypeError&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;가 발생합니다.버전 3.2으로 변경: &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertAlmostEqual&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertAlmostEqual()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;은 같다고 비교되는 거의 동등한 객체를 자동으로 고려합니다. &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertNotAlmostEqual&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertNotAlmostEqual()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;은 객체가 같다고 비교되면 자동으로 실패합니다. &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;delta&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 키워드 인자를 추가.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&quot;ul-list&quot; cid=&quot;n940&quot; mdtype=&quot;list&quot; data-mark=&quot;-&quot; style=&quot;box-sizing: border-box; margin: 0.8em 0px; padding-left: 30px; position: relative; font-size: 16px; font-weight: normal; white-space: normal; text-size-adjust: auto;&quot;&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n941&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n942&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertGreater&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n943&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n944&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertGreaterEqual&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n945&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n946&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertLess&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n947&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n948&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertLessEqual&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n949&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;를 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;와 비교해서 각각 메서드 이름에 해당하는 &amp;gt;, &amp;gt;=, &amp;lt;, &amp;lt;= 인지 테스트합니다. 그렇지 않으면 테스트는 실패합니다:&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; self.assertGreaterEqual(3, 4) AssertionError: &quot;3&quot; unexpectedly not greater than or equal to &quot;4&quot;&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;버전 3.1에 추가.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&quot;ul-list&quot; cid=&quot;n950&quot; mdtype=&quot;list&quot; data-mark=&quot;-&quot; style=&quot;box-sizing: border-box; margin: 0.8em 0px; padding-left: 30px; position: relative; font-size: 16px; font-weight: normal; white-space: normal; text-size-adjust: auto;&quot;&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n951&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n952&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertRegex&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;text&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;regex&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n953&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n954&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertNotRegex&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;text&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;regex&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n955&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;regex&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 검색이 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;text&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;에 일치하는지(아닌지) 테스트합니다. 실패의 경우, 에러 메시지는 패턴과 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;text&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(또는 패턴과 예상과 달리 일치한 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;text&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;의 부분)를 포함할 것입니다. &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;regex&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;는 정규식 객체나 &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/re.html#re.search&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;re.search()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;에 사용되기 적합한 정규식 문자열이 될 수 있습니다.버전 3.1에 추가: &lt;/span&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertRegexpMatches&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 라는 이름으로.버전 3.2으로 변경: &lt;/span&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertRegexpMatches()&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 메서드가 &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertRegex&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertRegex()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;로 이름 변경되었습니다.버전 3.2에 추가: &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertNotRegex&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertNotRegex()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;.버전 3.5에 추가: &lt;/span&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertNotRegexpMatches&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;이름은 &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertNotRegex&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertNotRegex()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;의 폐지된 에일리어스입니다.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&quot;ul-list&quot; cid=&quot;n956&quot; mdtype=&quot;list&quot; data-mark=&quot;-&quot; style=&quot;box-sizing: border-box; margin: 0.8em 0px; padding-left: 30px; position: relative; font-size: 16px; font-weight: normal; white-space: normal; text-size-adjust: auto;&quot;&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n957&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n958&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertCountEqual&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n959&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 시퀀스가 순서에 상관없이 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;와 같은 요소를 포함하는지 테스트합니다. 그렇지 않은 경우, 시퀀스들의 차이를 나열한 에러 메시지가 생성됩니다.&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;와 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;를 비교할 때 중복된 요소는 무시하지 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;않습니다&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;. 두 개의 시퀀스에 각 요소가 같은 수 만큼 있는 것을 확인합니다. &lt;/span&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertEqual(Counter(list(first)), Counter(list(second)))&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;와 같지만 해시 불가능한(unhashable) 시퀀스에도 작동합니다.버전 3.2에 추가.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p cid=&quot;n960&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.8em 0px; width: inherit; position: relative; font-size: 16px; font-weight: normal; text-size-adjust: auto;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertEqual&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertEqual()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 메서드는 같은 형의 객체의 동등성 검사를 다른 형-특화 메서드에게로 보냅니다. 이러한 메서드들은 대부분의 내장 형에 대해서 이미 구현되어 있지만, &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.addTypeEqualityFunc&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;addTypeEqualityFunc()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;을 사용하여 새로운 메서드를 등록하는 것도 가능합니다:&lt;/span&gt;&lt;/p&gt;&lt;ul class=&quot;ul-list&quot; cid=&quot;n961&quot; mdtype=&quot;list&quot; data-mark=&quot;-&quot; style=&quot;box-sizing: border-box; margin: 0.8em 0px; padding-left: 30px; position: relative; font-size: 16px; font-weight: normal; white-space: normal; text-size-adjust: auto;&quot;&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n962&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n963&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;addTypeEqualityFunc&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;typeobj&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;function&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n964&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;정확히 같은 (서브 클래스가 아닌) &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;typeobj&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 형의 두 객체가 같은지 비교 검사하기 위해 &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertEqual&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertEqual()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;한테 불리는 형-특화 메서드를 등록합니다. &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;function&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;은 반드시 2개의 위치 인자를 받아야 하고 &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertEqual&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertEqual()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;이 그러한 것처럼 msg=None 키워드 인자를 세 번째로 받아야 합니다. 이것은 처음 2개의 매개변수가 같지 않은 것이 확인될 경우 &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.failureException&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;self.failureException(msg)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;을 반드시 발생시켜야 합니다 -- 에러 메시지에 유용한 정보를 제공하고 비동등성을 자세히 설명할 수 있을 것입니다.버전 3.1에 추가.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p cid=&quot;n965&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.8em 0px; width: inherit; position: relative; font-size: 16px; font-weight: normal; text-size-adjust: auto;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertEqual&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertEqual()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;에서 자동으로 사용하는 형-특화 메서드 목록은 다음 표에 정리되어 있습니다. 보통은 이 메서드를 직접 부를 필요가 없다는 것을 기억하십시오.&lt;/span&gt;&lt;/p&gt;&lt;figure class=&quot;md-table-fig&quot; contenteditable=&quot;false&quot; cid=&quot;n224&quot; mdtype=&quot;table&quot; style=&quot;box-sizing: border-box; margin: 1.2em 0px; overflow-x: auto; max-width: calc(100% + 16px); padding: 0px; cursor: default; font-size: 16px; font-weight: normal; white-space: normal; text-size-adjust: auto;&quot;&gt;&lt;table class=&quot;md-table&quot; style=&quot;box-sizing: border-box; border-collapse: collapse; border-spacing: 0px; width: 800px; overflow: auto; break-inside: auto; white-space: pre-wrap; cursor: text; padding: 0px; word-break: initial; margin: 0px !important;&quot;&gt;&lt;thead style=&quot;box-sizing: border-box; background-color: rgb(248, 248, 248);&quot;&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n225&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px;&quot;&gt;&lt;th style=&quot;box-sizing: border-box; padding: 6px 13px; border-width: 1px 1px 0px; border-top-style: solid; border-right-style: solid; border-left-style: solid; border-top-color: rgb(223, 226, 229); border-right-color: rgb(223, 226, 229); border-left-color: rgb(223, 226, 229); text-align: left; margin: 0px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n226&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 361.515625px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;메서드&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;&lt;th style=&quot;box-sizing: border-box; padding: 6px 13px; border-width: 1px 1px 0px; border-top-style: solid; border-right-style: solid; border-left-style: solid; border-top-color: rgb(223, 226, 229); border-right-color: rgb(223, 226, 229); border-left-color: rgb(223, 226, 229); text-align: left; margin: 0px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n227&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 219.078125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;을 비교하기 위해&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;&lt;th style=&quot;box-sizing: border-box; padding: 6px 13px; border-width: 1px 1px 0px; border-top-style: solid; border-right-style: solid; border-left-style: solid; border-top-color: rgb(223, 226, 229); border-right-color: rgb(223, 226, 229); border-left-color: rgb(223, 226, 229); text-align: left; margin: 0px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n228&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 137.421875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;추가된 버전&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;box-sizing: border-box;&quot;&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n229&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n230&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 361.515625px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertMultiLineEqual&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertMultiLineEqual(a, b)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n231&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 219.078125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;문자열&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n232&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 137.421875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;3.1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n233&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px; background-color: rgb(248, 248, 248);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n234&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 361.515625px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertSequenceEqual&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertSequenceEqual(a, b)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n235&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 219.078125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;시퀀스&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n236&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 137.421875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;3.1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n237&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n238&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 361.515625px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertListEqual&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertListEqual(a, b)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n239&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 219.078125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;리스트&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n240&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 137.421875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;3.1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n241&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px; background-color: rgb(248, 248, 248);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n242&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 361.515625px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertTupleEqual&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertTupleEqual(a, b)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n243&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 219.078125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;튜플&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n244&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 137.421875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;3.1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n245&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n246&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 361.515625px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertSetEqual&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertSetEqual(a, b)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n247&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 219.078125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;집합 또는 불변 집합&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n248&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 137.421875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;3.1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;md-end-block&quot; cid=&quot;n249&quot; mdtype=&quot;table_row&quot; style=&quot;box-sizing: border-box; break-inside: avoid; break-after: auto; border-top-width: 1px; border-top-style: solid; border-top-color: rgb(223, 226, 229); margin: 0px; padding: 0px; background-color: rgb(248, 248, 248);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n250&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 361.515625px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertDictEqual&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertDictEqual(a, b)&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n251&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 219.078125px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;딕셔너리&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 80px;&quot;&gt;&lt;span contenteditable=&quot;true&quot; class=&quot;td-span&quot; cid=&quot;n252&quot; mdtype=&quot;table_cell&quot; style=&quot;box-sizing: border-box; display: inline-block; min-width: 4ch; width: 137.421875px; min-height: 10px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;3.1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/figure&gt;&lt;ul class=&quot;ul-list&quot; cid=&quot;n253&quot; mdtype=&quot;list&quot; data-mark=&quot;-&quot; style=&quot;box-sizing: border-box; margin: 0.8em 0px; padding-left: 30px; position: relative; font-size: 16px; font-weight: normal; white-space: normal; text-size-adjust: auto;&quot;&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n254&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n255&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertMultiLineEqual&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n972&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;여러 줄 문자열인 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;와 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;가 같은지 테스트합니다. 같지 않을 경우 에러 메시지에 다른 부분이 강조된 두 문자열의 차이가 포함됩니다. 이 메서드는 &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertEqual&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertEqual()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;에서 문자열을 비교할 때 기본적으로 사용됩니다.버전 3.1에 추가.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&quot;ul-list&quot; cid=&quot;n973&quot; mdtype=&quot;list&quot; data-mark=&quot;-&quot; style=&quot;box-sizing: border-box; margin: 0.8em 0px; padding-left: 30px; position: relative; font-size: 16px; font-weight: normal; white-space: normal; text-size-adjust: auto;&quot;&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n974&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n975&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertSequenceEqual&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;seq_type=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n976&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;2개의 시퀀스가 같은지 테스트합니다. &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;seq_type&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;이 전달된 경우, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;와 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 둘 다 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;seq_type&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;의 인스턴스이어야 하고 그렇지 않은 경우 실패가 발생합니다. 시퀀스가 다른 경우, 에러 메시지는 2개 사이의 차이점을 보여주게 됩니다.이 메서드는 &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertEqual&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertEqual()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;에서 직접 호출되진 않지만, &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertListEqual&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertListEqual()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;와 &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertTupleEqual&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertTupleEqual()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;을 구현할 때 사용됩니다.버전 3.1에 추가.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&quot;ul-list&quot; cid=&quot;n977&quot; mdtype=&quot;list&quot; data-mark=&quot;-&quot; style=&quot;box-sizing: border-box; margin: 0.8em 0px; padding-left: 30px; position: relative; font-size: 16px; font-weight: normal; white-space: normal; text-size-adjust: auto;&quot;&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n978&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n979&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertListEqual&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n980&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n981&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertTupleEqual&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n982&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;2개의 리스트나 튜플이 같은지 테스트합니다. 만약 같지 않다면 에러 메시지는 2개 사이의 차이점만 보여주게 됩니다. 매개변수 중 하나가 잘못된 형인 경우 에러가 발생합니다. 이 메서드는 &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertEqual&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertEqual()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;에서 리스트와 튜플을 비교할 때 기본적으로 사용됩니다.버전 3.1에 추가.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&quot;ul-list&quot; cid=&quot;n983&quot; mdtype=&quot;list&quot; data-mark=&quot;-&quot; style=&quot;box-sizing: border-box; margin: 0.8em 0px; padding-left: 30px; position: relative; font-size: 16px; font-weight: normal; white-space: normal; text-size-adjust: auto;&quot;&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n984&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n985&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertSetEqual&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n986&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;2개의 집합이 같은지 테스트합니다. 같지 않은 경우 에러 메시지는 집합 사이의 차이를 나열하게 됩니다. 이 메서드는 &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertEqual&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertEqual()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;에서 집합이나 불변 집합을 비교할 때 기본적으로 사용됩니다.&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;와 &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt; 중 하나가 &lt;/span&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;set.difference()&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt; 메서드를 가지고 있지 않으면 실패합니다.버전 3.1에 추가.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&quot;ul-list&quot; cid=&quot;n987&quot; mdtype=&quot;list&quot; data-mark=&quot;-&quot; style=&quot;box-sizing: border-box; margin: 0.8em 0px 0px; padding-left: 30px; position: relative; font-size: 16px; font-weight: normal; white-space: normal; text-size-adjust: auto;&quot;&gt;&lt;li class=&quot;md-list-item&quot; cid=&quot;n988&quot; mdtype=&quot;list_item&quot; style=&quot;box-sizing: border-box; margin: 0px; position: relative;&quot;&gt;&lt;p cid=&quot;n989&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin-right: 0px; margin-bottom: 0.5rem; margin-left: 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertDictEqual&lt;/code&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;(&lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;first&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;second&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;, &lt;/span&gt;&lt;span md-inline=&quot;em&quot; class=&quot;&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;msg=None&lt;/em&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n990&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;2개의 딕셔너리가 같은지 테스트합니다. 같지 않은 경우 에러 메시지는 딕셔너리 사이의 차이를 보여주게 됩니다. 이 메서드는 &lt;/span&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.assertEqual&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;code&quot; spellcheck=&quot;false&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--monospace); border: 1px solid rgb(231, 234, 237); background-color: rgb(243, 244, 244); border-radius: 3px; padding: 0px 4px 2px; font-size: 0.9em;&quot;&gt;assertEqual()&lt;/code&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;에서 딕셔너리를 비교할 때 기본적으로 사용될 것입니다.&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n995&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.5rem 0px; white-space: pre-wrap; position: relative;&quot;&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;md-expand&quot; style=&quot;box-sizing: border-box;&quot;&gt;버전 3.1에 추가.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/h2&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Basic/Python</category>
      <author>에반황</author>
      <guid isPermaLink="true">https://itmining.tistory.com/126</guid>
      <comments>https://itmining.tistory.com/126#entry126comment</comments>
      <pubDate>Mon, 11 Feb 2019 19:14:40 +0900</pubDate>
    </item>
  </channel>
</rss>