<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>강아지의 코딩공부</title>
    <link>https://codingdog.tistory.com/</link>
    <description>.</description>
    <language>ko</language>
    <pubDate>Fri, 26 Jun 2026 05:46:20 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>코딩강아지</managingEditor>
    <image>
      <title>강아지의 코딩공부</title>
      <url>https://tistory1.daumcdn.net/tistory/3166290/attach/7168c6045ca84ae481c4f801fc5a0ee8</url>
      <link>https://codingdog.tistory.com</link>
    </image>
    <item>
      <title>postgresql trunc 함수를 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/postgresql-trunc-%ED%95%A8%EC%88%98%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;postgresql에서 trunc 함수는 무엇일까요? 0 이상의 double형에서는 소수점을 버리기 위해, 미만인 경우 올림 처리를 하기 위해 쓰게 됩니다. &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;수학적으로 즉 0 이상에서는 floor와, 미만에서는 ceil과 동일하다고 할 수 있어요.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ptr1.png&quot; data-origin-width=&quot;371&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8LPr0/btslwpTRoiO/n464XZpUIoUcKlIDhgGZg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8LPr0/btslwpTRoiO/n464XZpUIoUcKlIDhgGZg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8LPr0/btslwpTRoiO/n464XZpUIoUcKlIDhgGZg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8LPr0%2FbtslwpTRoiO%2Fn464XZpUIoUcKlIDhgGZg1%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;371&quot; height=&quot;64&quot; data-filename=&quot;ptr1.png&quot; data-origin-width=&quot;371&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;trunc(-1.23, 1)을 보겠습니다. 소수점 1째 자리까지 나타냅니다. trunc한 결과를요. -1.23은 0보다는 작으므로 ceil을 하게 됩니다. -1.3은 -1.23보다는 작고, -1.2는 -1.23보다는 크거나 같습니다. 따라서, -1.2가 출력됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ptr2.png&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;141&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2DlaN/btslDGsUjol/Poc0sKeaXe9fkwyfUIDGf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2DlaN/btslDGsUjol/Poc0sKeaXe9fkwyfUIDGf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2DlaN/btslDGsUjol/Poc0sKeaXe9fkwyfUIDGf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2DlaN%2FbtslDGsUjol%2FPoc0sKeaXe9fkwyfUIDGf1%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;386&quot; height=&quot;141&quot; data-filename=&quot;ptr2.png&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;141&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;실행 결과는 위와 같습니다. trunc의 2번째 인자에 아무것도 주지 않으면 0보다 크거나 같은 경우 floor를, 작은 경우 ceiling을 하게 되는데요. 아래 예제를 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ptr3.png&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/berEUX/btslB2Q4kgD/JOUikBXSaytmdb1wK1Xmzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/berEUX/btslB2Q4kgD/JOUikBXSaytmdb1wK1Xmzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/berEUX/btslB2Q4kgD/JOUikBXSaytmdb1wK1Xmzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FberEUX%2FbtslB2Q4kgD%2FJOUikBXSaytmdb1wK1Xmzk%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;385&quot; height=&quot;130&quot; data-filename=&quot;ptr3.png&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;130&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;select trunc(1.2)를 보겠습니다. floor를 하니까 1.2보다 작거나 같은 정수 중 제일 큰 것을 찾아야 합니다. 1인가요?&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ptr4.png&quot; data-origin-width=&quot;443&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mcnR7/btslw8ErMp3/S3YE4QkDx8bXpgX99MOnK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mcnR7/btslw8ErMp3/S3YE4QkDx8bXpgX99MOnK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mcnR7/btslw8ErMp3/S3YE4QkDx8bXpgX99MOnK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmcnR7%2Fbtslw8ErMp3%2FS3YE4QkDx8bXpgX99MOnK0%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;443&quot; height=&quot;124&quot; data-filename=&quot;ptr4.png&quot; data-origin-width=&quot;443&quot; data-origin-height=&quot;124&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;따라서 1이 출력됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;저는 이 함수를 random과 많이 쓰는 편입니다. 아래 예제를 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ptr5.png&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;76&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMiCEc/btslBQpGVv8/ZVHQhQUrY11aSWbVZ0wX60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMiCEc/btslBQpGVv8/ZVHQhQUrY11aSWbVZ0wX60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMiCEc/btslBQpGVv8/ZVHQhQUrY11aSWbVZ0wX60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMiCEc%2FbtslBQpGVv8%2FZVHQhQUrY11aSWbVZ0wX60%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;489&quot; height=&quot;76&quot; data-filename=&quot;ptr5.png&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;76&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이 예제는 generate_series를 이용해서, trunc(random() * 11)을 한 결과를 10만개를 뽑은 결과를 가지고 min값과 max값을 집계해 버립니다. 결과를 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ptr6.png&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;163&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csjZ3d/btslB2pYIFf/bdN9VXFUkJ1wZRapBBvYj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csjZ3d/btslB2pYIFf/bdN9VXFUkJ1wZRapBBvYj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csjZ3d/btslB2pYIFf/bdN9VXFUkJ1wZRapBBvYj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsjZ3d%2FbtslB2pYIFf%2FbdN9VXFUkJ1wZRapBBvYj0%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;459&quot; height=&quot;163&quot; data-filename=&quot;ptr6.png&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;163&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;0과 10이 나오네요. 만약에 0보다 크고 10보다 작은 수를 랜덤하게 n회 뽑는 것은 generate_series와 random, trunc를 이용해서 가능하다는 이야기입니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;한 가지 조심해야 할 점은 trunc의 경우 double precision이 들어가게 되면, 결과값으로 double precision이 나온다는 점입니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ptr7.png&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;58&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dyI7Qw/btslFjRxs8Q/8vBM0pg95k81QdQ8j9QaE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyI7Qw/btslFjRxs8Q/8vBM0pg95k81QdQ8j9QaE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyI7Qw/btslFjRxs8Q/8vBM0pg95k81QdQ8j9QaE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyI7Qw%2FbtslFjRxs8Q%2F8vBM0pg95k81QdQ8j9QaE0%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;433&quot; height=&quot;58&quot; data-filename=&quot;ptr7.png&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;58&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;pg_typeof 함수로 trunc(random()*10)의 type이 어떤 것인지 출력해 보겠습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ptr8.png&quot; data-origin-width=&quot;384&quot; data-origin-height=&quot;141&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFiPDs/btslCIdsAzm/4lGcckKQzevkLstKAxhD6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFiPDs/btslCIdsAzm/4lGcckKQzevkLstKAxhD6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFiPDs/btslCIdsAzm/4lGcckKQzevkLstKAxhD6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFiPDs%2FbtslCIdsAzm%2F4lGcckKQzevkLstKAxhD6k%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;384&quot; height=&quot;141&quot; data-filename=&quot;ptr8.png&quot; data-origin-width=&quot;384&quot; data-origin-height=&quot;141&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;double precision이 뜨네요. 따라서, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;정수로 처리해야 한다면 뒤에 ::integer를 붙여&lt;/u&gt;&lt;/span&gt;서, &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;형을 변환해야 할 필요&lt;/b&gt;&lt;/span&gt;가 있습니다. 여기서 한 가지 질문. 그냥 random() * 10의 결과에 ::integer를 붙여도 되지 않나요? 이런 것을 검증하기 가장 쉬운 방법은 극단적인 케이스를 넣어보는 것입니다. 10.5와 같은 경계값을 넣어봅시다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ptr9.png&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NMeuV/btslBP5pxtY/GiLvBufKVJwYfrsHio76d1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NMeuV/btslBP5pxtY/GiLvBufKVJwYfrsHio76d1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NMeuV/btslBP5pxtY/GiLvBufKVJwYfrsHio76d1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNMeuV%2FbtslBP5pxtY%2FGiLvBufKVJwYfrsHio76d1%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;370&quot; height=&quot;164&quot; data-filename=&quot;ptr9.png&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;select 10.5::integer, trunc(10.5)::integer 이 두 값을 비교해 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ptr10.png&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;123&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RwAcA/btslD0dLsp4/Hf9tJd6OqYgXCf8KzpkB00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RwAcA/btslD0dLsp4/Hf9tJd6OqYgXCf8KzpkB00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RwAcA/btslD0dLsp4/Hf9tJd6OqYgXCf8KzpkB00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRwAcA%2FbtslD0dLsp4%2FHf9tJd6OqYgXCf8KzpkB00%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;434&quot; height=&quot;123&quot; data-filename=&quot;ptr10.png&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;123&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;그랬더니 전자는 11이, 후자는 double precision 10이 나왔습니다. 고로 0보다 크거나 같은 경우, 정수값만 취하고 싶다. 그러면, trunc, floor 등을 이용해서 선처리를 해야 합니다. 그 이후에 정수형으로 바꿔야 한다. 그러면 ::integer나 ::bigint 등으로 형 변환 시켜버리면 됩니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>코딩/Sql</category>
      <category>postgres</category>
      <category>sql</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/914</guid>
      <comments>https://codingdog.tistory.com/entry/postgresql-trunc-%ED%95%A8%EC%88%98%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry914comment</comments>
      <pubDate>Tue, 27 Jun 2023 23:58:58 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 exception이 발생했을 때 retry 하는 로직을 작성해 봅시다.</title>
      <link>https://codingdog.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-exception%EC%9D%B4-%EB%B0%9C%EC%83%9D%ED%96%88%EC%9D%84-%EB%95%8C-retry-%ED%95%98%EB%8A%94-%EB%A1%9C%EC%A7%81%EC%9D%84-%EC%9E%91%EC%84%B1%ED%95%B4-%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;exception이 발생하였을 때, 재시도를 r회 하는 로직은 생각보다 많이 쓰이게 됩니다. 어떻게 하는지 간단하게 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;예제를 하나 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rty1.png&quot; data-origin-width=&quot;469&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biBa0v/btslvy2MxhV/PsMjKmUg7GnzIh2Gnztr9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biBa0v/btslvy2MxhV/PsMjKmUg7GnzIh2Gnztr9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biBa0v/btslvy2MxhV/PsMjKmUg7GnzIh2Gnztr9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiBa0v%2Fbtslvy2MxhV%2FPsMjKmUg7GnzIh2Gnztr9k%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;469&quot; height=&quot;238&quot; data-filename=&quot;rty1.png&quot; data-origin-width=&quot;469&quot; data-origin-height=&quot;238&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;위 예제는 t = 1/0을 10번 재시도 하는 예제입니다. 보시면, t = 1 / 0 부분에서 계속 ZeroDivisionError가 뜨게 됩니다. 이 때, r이 retry보다 작으면 continue를 하고, 그렇지 않으면 raise를 하게끔 하였습니다. retry는 재시도 횟수인데요. 1부터 retry회까지 카운트가 됩니다. 고로, r이 retry보다 작다면 continue문을 타고, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;retry번 이상 재시도를 했다면 raise, 그러니까 예외를 발생시켜버리게 됩니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rty2.png&quot; data-origin-width=&quot;603&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brluF5/btsltWJWGRF/KGJB5LQ2EAWG2DzMVRXwKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brluF5/btsltWJWGRF/KGJB5LQ2EAWG2DzMVRXwKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brluF5/btsltWJWGRF/KGJB5LQ2EAWG2DzMVRXwKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrluF5%2FbtsltWJWGRF%2FKGJB5LQ2EAWG2DzMVRXwKk%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;603&quot; height=&quot;328&quot; data-filename=&quot;rty2.png&quot; data-origin-width=&quot;603&quot; data-origin-height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;10번 재시도를 하고, ZeroDivisionError가 뜨게 됩니다. 저 코드 제대로 동작할까요? 10번 재시도를 해도 exception이 계속 발생하면 raise를 한다. 문제 없어 보입니다. 그런데 아래 프로그램을 실행시켜 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rty3.png&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbX4EO/btsluVwZLpc/3lGUFNycif7lsGKwVWnejK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbX4EO/btsluVwZLpc/3lGUFNycif7lsGKwVWnejK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbX4EO/btsluVwZLpc/3lGUFNycif7lsGKwVWnejK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbX4EO%2FbtsluVwZLpc%2F3lGUFNycif7lsGKwVWnejK%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;401&quot; height=&quot;240&quot; data-filename=&quot;rty3.png&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이번에는 t = 1 / 2를 수행하였습니다. 1번만에 성공하였습니다. 그런데, 이거 retry가 몇 개나 찍힐까요?&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rty4.png&quot; data-origin-width=&quot;334&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPc5Yo/btsltj6FvHe/9zKuUKRQMkEJNxbdjxH6n0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPc5Yo/btsltj6FvHe/9zKuUKRQMkEJNxbdjxH6n0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPc5Yo/btsltj6FvHe/9zKuUKRQMkEJNxbdjxH6n0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPc5Yo%2Fbtsltj6FvHe%2F9zKuUKRQMkEJNxbdjxH6n0%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;334&quot; height=&quot;264&quot; data-filename=&quot;rty4.png&quot; data-origin-width=&quot;334&quot; data-origin-height=&quot;264&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;성공하였음에도 10번이 찍히게 됩니다. 1번만에 성공하면 재시도를 하지 말아야 하는데 그렇지 못한 이유는 for loop로 계속 돌아버리고 있기 때문입니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;성공했다면, return을 하던지, 아니면 break를 걸어야 합니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rty9.png&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mcqTy/btslwpYOOsy/nWbkXEUG5BFkv7br04NB10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mcqTy/btslwpYOOsy/nWbkXEUG5BFkv7br04NB10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mcqTy/btslwpYOOsy/nWbkXEUG5BFkv7br04NB10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmcqTy%2FbtslwpYOOsy%2FnWbkXEUG5BFkv7br04NB10%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;458&quot; height=&quot;512&quot; data-filename=&quot;rty9.png&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;필요한 부분만 도식화 해서 그려보겠습니다. 10번동안 재시도 하는 로직이 바깥 for loop로 돌고 있어요. 그리고, 예외가 걸렸을 때, 재시도 횟수가 10회 이하이면 continue를 한다고 되어 있어요. 이는 for loop의 전체를 건너 뛴다는 의미입니다. 고로, 이 때에는 즉시 변수 retry가 하나 증가할 수 밖에 없습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그런데, &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;except ~ 문에 걸리지 않는 경우에도 for loop 안에 있어요.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rty10.png&quot; data-origin-width=&quot;463&quot; data-origin-height=&quot;523&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZMPWQ/btsls6TCJV8/W8fy8i88FRfqof5hFciCR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZMPWQ/btsls6TCJV8/W8fy8i88FRfqof5hFciCR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZMPWQ/btsls6TCJV8/W8fy8i88FRfqof5hFciCR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZMPWQ%2Fbtsls6TCJV8%2FW8fy8i88FRfqof5hFciCR0%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;463&quot; height=&quot;523&quot; data-filename=&quot;rty10.png&quot; data-origin-width=&quot;463&quot; data-origin-height=&quot;523&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이 경우 빨간색 화살표를 따라가게 됩니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;핵심은 재시도 loop를 탄다는 점입니다.&lt;/u&gt;&lt;/span&gt; 언제까지? retry가 10이 넘어갈 때 까지 loop를 돌아버리게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;어떻게 하면 좋을까요? 예외에 걸리지 않은 경우에 바로 break나 return을 걸어버리면 됩니다. 아래 코드를 볼게요.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rty5.png&quot; data-origin-width=&quot;367&quot; data-origin-height=&quot;261&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpKoL8/btslhdGhRMu/LdkwXIznEgMQ7WjGkU9kqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpKoL8/btslhdGhRMu/LdkwXIznEgMQ7WjGkU9kqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpKoL8/btslhdGhRMu/LdkwXIznEgMQ7WjGkU9kqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpKoL8%2FbtslhdGhRMu%2FLdkwXIznEgMQ7WjGkU9kqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;367&quot; height=&quot;261&quot; data-filename=&quot;rty5.png&quot; data-origin-width=&quot;367&quot; data-origin-height=&quot;261&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;except ~ 절에서 재시도 횟수가 retry 이하라면 contine를 걸고, 그 이상이라면 raise합니다. 예외에 걸리지 않으면 12번째 줄로 올 겁니다. 이 때에는 for loop 자체를 빠져나가야 합니다. 따라서 break를 걸어야 합니다. 이렇게 하면 어떻게 될까요? t = 1/2가 성공했기 때문에, 1번만 시도하게 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rty6.png&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVq0ir/btslvzm6zvF/lnhVmjeweidq7n35KB6dck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVq0ir/btslvzm6zvF/lnhVmjeweidq7n35KB6dck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVq0ir/btslvzm6zvF/lnhVmjeweidq7n35KB6dck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVq0ir%2Fbtslvzm6zvF%2FlnhVmjeweidq7n35KB6dck%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;385&quot; height=&quot;68&quot; data-filename=&quot;rty6.png&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;retry 1만 출력되게 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rty7.png&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BiFLC/btslt1klHWA/mwyFndIi8f4FcYZQRT9bw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BiFLC/btslt1klHWA/mwyFndIi8f4FcYZQRT9bw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BiFLC/btslt1klHWA/mwyFndIi8f4FcYZQRT9bw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBiFLC%2Fbtslt1klHWA%2FmwyFndIi8f4FcYZQRT9bw1%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;393&quot; height=&quot;260&quot; data-filename=&quot;rty7.png&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;260&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;t = 1/0을 10번 시도하는 것은 잘 될까요?&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rty8.png&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qo3Xj/btslufvSzAZ/zbEBq8p5U8YcoRFLssur4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qo3Xj/btslufvSzAZ/zbEBq8p5U8YcoRFLssur4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qo3Xj/btslufvSzAZ/zbEBq8p5U8YcoRFLssur4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqo3Xj%2FbtslufvSzAZ%2FzbEBq8p5U8YcoRFLssur4K%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;605&quot; height=&quot;327&quot; data-filename=&quot;rty8.png&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;당연하게도 잘 됨을 볼 수 있습니다. 왜냐하면, 계속 excep ZeroDivisionError에 걸리기 때문입니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rty11.png&quot; data-origin-width=&quot;554&quot; data-origin-height=&quot;515&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3DC0v/btslufiluAE/mD0bH7o1gq3Lq3KmLSwrw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3DC0v/btslufiluAE/mD0bH7o1gq3Lq3KmLSwrw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3DC0v/btslufiluAE/mD0bH7o1gq3Lq3KmLSwrw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3DC0v%2FbtslufiluAE%2FmD0bH7o1gq3Lq3KmLSwrw0%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;554&quot; height=&quot;515&quot; data-filename=&quot;rty11.png&quot; data-origin-width=&quot;554&quot; data-origin-height=&quot;515&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이를 도식화 시키면 위와 같습니다. 예외에 걸리지 않으면 성공했기 때문에 더 이상 retry를 할 이유가 없습니다. 따라서, break 문으로 재시도 loop를 빠져나오면 되는 것입니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>코딩/파이선</category>
      <category>EXCEPT</category>
      <category>Exception</category>
      <category>재시도</category>
      <category>파이썬</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/913</guid>
      <comments>https://codingdog.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-exception%EC%9D%B4-%EB%B0%9C%EC%83%9D%ED%96%88%EC%9D%84-%EB%95%8C-retry-%ED%95%98%EB%8A%94-%EB%A1%9C%EC%A7%81%EC%9D%84-%EC%9E%91%EC%84%B1%ED%95%B4-%EB%B4%85%EC%8B%9C%EB%8B%A4#entry913comment</comments>
      <pubDate>Mon, 26 Jun 2023 23:53:39 +0900</pubDate>
    </item>
    <item>
      <title>java right shift operator &amp;gt;&amp;gt;와 &amp;gt;&amp;gt;&amp;gt;에 대해 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/java-right-shift-operator-%EC%99%80-%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;java의 bit 연산자 중에 &amp;gt;&amp;gt;와 &amp;gt;&amp;gt;&amp;gt; 연산자가 있습니다. 이 둘의 차이에 대해 간단하게 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;jb1.png&quot; data-origin-width=&quot;424&quot; data-origin-height=&quot;397&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWZQkJ/btsk9Rpxy57/yBpPlmo5smEHS0kHsfoYs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWZQkJ/btsk9Rpxy57/yBpPlmo5smEHS0kHsfoYs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWZQkJ/btsk9Rpxy57/yBpPlmo5smEHS0kHsfoYs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWZQkJ%2Fbtsk9Rpxy57%2FyBpPlmo5smEHS0kHsfoYs1%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;424&quot; height=&quot;397&quot; data-filename=&quot;jb1.png&quot; data-origin-width=&quot;424&quot; data-origin-height=&quot;397&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저, 위에 2개는 -2 &amp;gt;&amp;gt; 1과 -2 &amp;gt;&amp;gt;&amp;gt; 1의 값을 출력합니다. 아래 2개는 2 &amp;gt;&amp;gt; 1과 2 &amp;gt;&amp;gt;&amp;gt; 1을 출력합니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;jb2.png&quot; data-origin-width=&quot;403&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9i1fw/btsk9PLZMqY/5vcLiiwSOJlSvKbib9QZ01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9i1fw/btsk9PLZMqY/5vcLiiwSOJlSvKbib9QZ01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9i1fw/btsk9PLZMqY/5vcLiiwSOJlSvKbib9QZ01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9i1fw%2Fbtsk9PLZMqY%2F5vcLiiwSOJlSvKbib9QZ01%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;403&quot; height=&quot;134&quot; data-filename=&quot;jb2.png&quot; data-origin-width=&quot;403&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;출력 결과를 봅시다. -1, 2147483647이 나오고, 밑에 2개는 1, 1이 나옵니다. 이게 어떻게 된 것일까요?&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저 -2의 2의 보수 표현법으로 표기해 봅시다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;jb3.png&quot; data-origin-width=&quot;307&quot; data-origin-height=&quot;103&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H52u3/btslbo7QdZG/SMW8wKSRHkhRpc79uVKRj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H52u3/btslbo7QdZG/SMW8wKSRHkhRpc79uVKRj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H52u3/btslbo7QdZG/SMW8wKSRHkhRpc79uVKRj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH52u3%2Fbtslbo7QdZG%2FSMW8wKSRHkhRpc79uVKRj1%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;307&quot; height=&quot;103&quot; data-filename=&quot;jb3.png&quot; data-origin-width=&quot;307&quot; data-origin-height=&quot;103&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;2를 2진법으로 표현하면 위 그림과 같습니다. 여기서 비트가 0인 것은 1로 바꾸고, 1인 것은 0으로 바꿔보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;jb4.png&quot; data-origin-width=&quot;366&quot; data-origin-height=&quot;105&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CFXB5/btslaSajeCw/2JxwpvHkAH4RE5TasU5Ku0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CFXB5/btslaSajeCw/2JxwpvHkAH4RE5TasU5Ku0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CFXB5/btslaSajeCw/2JxwpvHkAH4RE5TasU5Ku0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCFXB5%2FbtslaSajeCw%2F2JxwpvHkAH4RE5TasU5Ku0%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;366&quot; height=&quot;105&quot; data-filename=&quot;jb4.png&quot; data-origin-width=&quot;366&quot; data-origin-height=&quot;105&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 1...1101이 됩니다. 여기서 1을 더해보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;jb5.png&quot; data-origin-width=&quot;363&quot; data-origin-height=&quot;105&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DNeIc/btslaZNPOFS/N4ytr3PVdjikuMogkIEEJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DNeIc/btslaZNPOFS/N4ytr3PVdjikuMogkIEEJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DNeIc/btslaZNPOFS/N4ytr3PVdjikuMogkIEEJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDNeIc%2FbtslaZNPOFS%2FN4ytr3PVdjikuMogkIEEJK%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;363&quot; height=&quot;105&quot; data-filename=&quot;jb5.png&quot; data-origin-width=&quot;363&quot; data-origin-height=&quot;105&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 11..110이 됩니다. 여기에서, 부호를 결정하는 비트는 1로 표시했습니다. t가 -2인 경우, 표현 방식은 위와 같습니다. 이제, -2 &amp;gt;&amp;gt; 1과 -2 &amp;gt;&amp;gt;&amp;gt; 1의 차이를 알아봅시다. 먼저, &amp;gt;&amp;gt; 연산자는 부호도 그대로 가지고 옵니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;맨 처음의 부호에 따라서 채워지는 비트가 정해진다는 것입니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;jb14.png&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l2f89/btslauAMbTh/HboXtvh9vOzyvnFKxBloU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l2f89/btslauAMbTh/HboXtvh9vOzyvnFKxBloU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l2f89/btslauAMbTh/HboXtvh9vOzyvnFKxBloU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl2f89%2FbtslauAMbTh%2FHboXtvh9vOzyvnFKxBloU1%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;364&quot; height=&quot;216&quot; data-filename=&quot;jb14.png&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;일단 모든 비트를 오른쪽으로 하나씩 이동시켜 보겠습니다. 그러면 위 그림과 같이 되겠네요. t &amp;gt;&amp;gt; 1은 부호 비트에 따라서 좌측에 채워지는 비트가 결정됩니다. 위의 경우는 부호 비트가 1이므로, 1이 채워지게 됩니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;jb15.png&quot; data-origin-width=&quot;357&quot; data-origin-height=&quot;219&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dy1AU/btslcB6HePm/NeBQa9wNowRE3odSsOYO0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dy1AU/btslcB6HePm/NeBQa9wNowRE3odSsOYO0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dy1AU/btslcB6HePm/NeBQa9wNowRE3odSsOYO0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDy1AU%2FbtslcB6HePm%2FNeBQa9wNowRE3odSsOYO0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;357&quot; height=&quot;219&quot; data-filename=&quot;jb15.png&quot; data-origin-width=&quot;357&quot; data-origin-height=&quot;219&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 요래 채워지겠군요. 반면에 &amp;gt;&amp;gt;&amp;gt; 1은 아래와 같이 동작합니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;jb7.png&quot; data-origin-width=&quot;358&quot; data-origin-height=&quot;217&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOeZCi/btslaIZR181/K23dNuxf62o4QUsWeMWNlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOeZCi/btslaIZR181/K23dNuxf62o4QUsWeMWNlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOeZCi/btslaIZR181/K23dNuxf62o4QUsWeMWNlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOeZCi%2FbtslaIZR181%2FK23dNuxf62o4QUsWeMWNlk%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;358&quot; height=&quot;217&quot; data-filename=&quot;jb7.png&quot; data-origin-width=&quot;358&quot; data-origin-height=&quot;217&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;채워지는 비트가 0&lt;/u&gt;&lt;/span&gt;이 됩니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;앞에 붙은 게 1이냐 0이냐 상관 없이요.&lt;/b&gt;&lt;/span&gt; 그리고 32bit 자료형에서 01...1 패턴은 2147483647입니다. 맨 앞의 부호 비트에 따라서 앞에 붙어 있는 bit가 달라지는&amp;nbsp; &amp;gt;&amp;gt; 와는 다른 점이기도 합니다. t=2인 경우 t &amp;gt;&amp;gt; 1과 t &amp;gt;&amp;gt;&amp;gt; 1의 결과는 같을까요?&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;jb8.png&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wLROE/btslcCR4UAj/FH70jrwQHkmSfKH10gsZ81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wLROE/btslcCR4UAj/FH70jrwQHkmSfKH10gsZ81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wLROE/btslcCR4UAj/FH70jrwQHkmSfKH10gsZ81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwLROE%2FbtslcCR4UAj%2FFH70jrwQHkmSfKH10gsZ81%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;360&quot; height=&quot;218&quot; data-filename=&quot;jb8.png&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;218&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저 t &amp;gt;&amp;gt; 1입니다. 0...010이 오른쪽으로 1칸씩 이동합니다. 다음에, 부호를 판정하는 비트가 0이였기 때문에 나머지 부분은 0으로 채워집니다. t &amp;gt;&amp;gt;&amp;gt; 1은 어떨까요? 앞에 부호가 1이던 0이던 무조건 0으로 채워지기 때문에 결과가 같게 됩니다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;jb9.png&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;221&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOJde3/btslfewEMOu/XsJG7sAgebFSgg7XQqPVT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOJde3/btslfewEMOu/XsJG7sAgebFSgg7XQqPVT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOJde3/btslfewEMOu/XsJG7sAgebFSgg7XQqPVT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOJde3%2FbtslfewEMOu%2FXsJG7sAgebFSgg7XQqPVT1%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;459&quot; height=&quot;221&quot; data-filename=&quot;jb9.png&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;221&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이제 이 경우는 어떨까요?&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;jb11.png&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFtsVZ/btslcDQZWGD/gBm3UuCn0EITOsk8vRB3r1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFtsVZ/btslcDQZWGD/gBm3UuCn0EITOsk8vRB3r1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFtsVZ/btslcDQZWGD/gBm3UuCn0EITOsk8vRB3r1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFtsVZ%2FbtslcDQZWGD%2FgBm3UuCn0EITOsk8vRB3r1%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;474&quot; height=&quot;215&quot; data-filename=&quot;jb11.png&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;215&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;-5는 111...1011 패턴으로 채워집니다. 이걸 2칸 오른쪽으로 옮기면 위 그림과 같이 됩니다. t &amp;gt;&amp;gt; 2의 경우에는 어떻게 처리될까요? 맨 앞의 부호 비트가 1이였기 때문에, 앞에 2개가 1로 채워집니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;jb12.png&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mHRMJ/btslbxwLN5T/bn07WUNxF5Yp4LXJkIBJjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mHRMJ/btslbxwLN5T/bn07WUNxF5Yp4LXJkIBJjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mHRMJ/btslbxwLN5T/bn07WUNxF5Yp4LXJkIBJjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmHRMJ%2FbtslbxwLN5T%2Fbn07WUNxF5Yp4LXJkIBJjK%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;473&quot; height=&quot;214&quot; data-filename=&quot;jb12.png&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;214&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;11...10 패턴이네요. 0을 1로, 1을 0으로 바꾼 다음에 1을 더해 봅시다. 그러면 00...01에 1을 더했으므로, 00..010이 됩니다. 2가 되네요. 앞의 부호 비트가 1이므로 -2가 되겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;jb13.png&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0JvY2/btsk9EqmtOi/sSWPAD7NzHHrMKkKRca7YK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0JvY2/btsk9EqmtOi/sSWPAD7NzHHrMKkKRca7YK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0JvY2/btsk9EqmtOi/sSWPAD7NzHHrMKkKRca7YK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0JvY2%2Fbtsk9EqmtOi%2FsSWPAD7NzHHrMKkKRca7YK%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;471&quot; height=&quot;215&quot; data-filename=&quot;jb13.png&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;215&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;반면 t &amp;gt;&amp;gt;&amp;gt; 2는 앞에 2개를 0으로 채워버립니다. 앞의 부호 비트가 1이여도요. 00111...10은 2^30-2입니다. 1073741822가 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;jb10.png&quot; data-origin-width=&quot;427&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvmWiM/btslaZ773Xg/5yTV42CAwpxpiHdH9AQwl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvmWiM/btslaZ773Xg/5yTV42CAwpxpiHdH9AQwl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvmWiM/btslaZ773Xg/5yTV42CAwpxpiHdH9AQwl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdvmWiM%2FbtslaZ773Xg%2F5yTV42CAwpxpiHdH9AQwl1%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;427&quot; height=&quot;88&quot; data-filename=&quot;jb10.png&quot; data-origin-width=&quot;427&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;결과를 보면 위와 같습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>코딩/Java</category>
      <category>bit</category>
      <category>Java</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/912</guid>
      <comments>https://codingdog.tistory.com/entry/java-right-shift-operator-%EC%99%80-%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry912comment</comments>
      <pubDate>Sat, 24 Jun 2023 23:58:52 +0900</pubDate>
    </item>
    <item>
      <title>sqlalchemy like 연산의 %와 _를 escaping 처리해 주는 startswith, endswith, contains를 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/sqlalchemy-like-%EC%97%B0%EC%82%B0%EC%9D%98-%EC%99%80-%EB%A5%BC-escaping-%EC%B2%98%EB%A6%AC%ED%95%B4-%EC%A3%BC%EB%8A%94-startswith-endswith-contains%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; 안녕하세요. 이번 시간에는 sqlalchemy에서 like 연산자를 쓰는 방법을 알아보겠습니다. 하나 조심해야 할 것은, 당연하게도 유저의 입력값을 믿으면 안 된다인데요. 이게 무슨 소리일까 싶습니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;like의 경우 %와 _ 등으로 인해&lt;/u&gt;&lt;/span&gt; 의도치 않은 결과가 나올 수 있습니다. &lt;b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;입력값 필터링을 하지 않거나 escaping을 하지 않은 경우 문제가 발생할 수도 있다는 의미&lt;/span&gt;&lt;/b&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sq1.png&quot; data-origin-width=&quot;429&quot; data-origin-height=&quot;307&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beSqDD/btslaGmVfMR/u5UwuP3KWjkX3wC75ADha1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beSqDD/btslaGmVfMR/u5UwuP3KWjkX3wC75ADha1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beSqDD/btslaGmVfMR/u5UwuP3KWjkX3wC75ADha1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeSqDD%2FbtslaGmVfMR%2Fu5UwuP3KWjkX3wC75ADha1%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;429&quot; height=&quot;307&quot; data-filename=&quot;sq1.png&quot; data-origin-width=&quot;429&quot; data-origin-height=&quot;307&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; 먼저 실습에 사용할 데이터입니다. 테이블 A에는 title이 aa, ba, _a, %a인 것이 있습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sq3.png&quot; data-origin-width=&quot;435&quot; data-origin-height=&quot;249&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tx6Uo/btslcCKIMez/7ItUEJ6VHRZxppf2IcvWl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tx6Uo/btslcCKIMez/7ItUEJ6VHRZxppf2IcvWl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tx6Uo/btslcCKIMez/7ItUEJ6VHRZxppf2IcvWl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftx6Uo%2FbtslcCKIMez%2F7ItUEJ6VHRZxppf2IcvWl0%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;435&quot; height=&quot;249&quot; data-filename=&quot;sq3.png&quot; data-origin-width=&quot;435&quot; data-origin-height=&quot;249&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그리고 models.py에 정의된 모델 A에 대한 클래스입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sq2.png&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;219&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M1Y1C/btslb6yoBUO/2SeIQknbNxWg6H70YdbWR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M1Y1C/btslb6yoBUO/2SeIQknbNxWg6H70YdbWR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M1Y1C/btslb6yoBUO/2SeIQknbNxWg6H70YdbWR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM1Y1C%2Fbtslb6yoBUO%2F2SeIQknbNxWg6H70YdbWR0%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;711&quot; height=&quot;219&quot; data-filename=&quot;sq2.png&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;219&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;저는 like 연산자를 썼습니다. Query parameter로 들어오는 keyword에 대해, 접두어가 keyword인 title을 찾습니다. 무엇이 문제일까요? 정확히 말하면 &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;f&quot;{keyword}%&quot;가 문제&lt;/u&gt;&lt;/span&gt;입니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;입력값 필터링을 하지 않고 사용자의 입력을 믿어버리면 절대로 안 됩니다.&lt;/b&gt; &lt;/span&gt;keyword가 특정한 문자가 들어오지 않는다면 의도대로 동작이 할 겁니다. 예를 들어, keyword에 a를 넣어보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sq4.png&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;377&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vnsrK/btsla0Mdj2u/A4MEULmXlp3SbUfYGahm80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vnsrK/btsla0Mdj2u/A4MEULmXlp3SbUfYGahm80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vnsrK/btsla0Mdj2u/A4MEULmXlp3SbUfYGahm80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvnsrK%2Fbtsla0Mdj2u%2FA4MEULmXlp3SbUfYGahm80%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;650&quot; height=&quot;377&quot; data-filename=&quot;sq4.png&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;377&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; a로 시작하는 &quot;aa&quot;만 나옵니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sq5.png&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zRgCZ/btsk9QXVJ4Y/ak2NiD1igKMCTERskBCwp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zRgCZ/btsk9QXVJ4Y/ak2NiD1igKMCTERskBCwp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zRgCZ/btsk9QXVJ4Y/ak2NiD1igKMCTERskBCwp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzRgCZ%2Fbtsk9QXVJ4Y%2Fak2NiD1igKMCTERskBCwp0%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;635&quot; height=&quot;506&quot; data-filename=&quot;sq5.png&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;506&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;문제는 _a인데요. 저 경우 &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;where title like '_a%'로 rendering이 되어 버립니다.&lt;/u&gt;&lt;/span&gt; like에서 _는 어떠한 character와도 매칭됩니다. 따라서, &quot;aa&quot;, &quot;ba&quot;, &quot;_a&quot;, &quot;%a&quot; 이렇게 4개가 매치되게 됩니다. 당연하게도 %a를 넣어도 의도치 못한 결과가 나오게 됩니다. 왜 그럴까요? 2가지 이유가 있습니다. 유저 입력을 그대로 믿어버린 것. 그리고 특정한 문자가 escaping이 되지 않은 것입니다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;어떻게 해야 할까요? 접두 검색의 경우, startswith를 쓰면 됩니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;그리고 autoescape를 True로 설정하면 됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sq6.png&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4xcOL/btslcDQowT7/AckYSTkEhBOdqohN8yIQGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4xcOL/btslcDQowT7/AckYSTkEhBOdqohN8yIQGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4xcOL/btslcDQowT7/AckYSTkEhBOdqohN8yIQGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4xcOL%2FbtslcDQowT7%2FAckYSTkEhBOdqohN8yIQGk%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;586&quot; height=&quot;309&quot; data-filename=&quot;sq6.png&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;309&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이 프로그램을 보겠습니다. A.title.startswith(keyword, autoescape=True)라고 되어 있네요.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sq7.png&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WipMW/btsk8Lwj33Y/gbmyCOEIvKaMDOaIX5fGm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WipMW/btsk8Lwj33Y/gbmyCOEIvKaMDOaIX5fGm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WipMW/btsk8Lwj33Y/gbmyCOEIvKaMDOaIX5fGm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWipMW%2Fbtsk8Lwj33Y%2FgbmyCOEIvKaMDOaIX5fGm0%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;537&quot; height=&quot;368&quot; data-filename=&quot;sq7.png&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;368&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 _a로 시작하는 결과만 나옵니다. 이는 _가 어떠한 하나의 캐릭터와 매치되는 특수 문자가 아니라, 다른 것으로 랜더링 되어 버렸기 때문입니다. 그리고 %와 _가 나오는 곳에 앞에 /가 붙습니다. 즉, %와 _가 escaping 됩니다. 이는 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;a style=&quot;color: #f89009;&quot; href=&quot;https://docs.sqlalchemy.org/en/20/core/sqlelement.html#sqlalchemy.sql.expression.ColumnElement.contains.params.autoescape&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;문서&lt;/a&gt;&lt;/span&gt;에도 언급되어 있는 부분입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sq8.png&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3kmhy/btslb7jMyty/ILF54yPrTAIlyFQM2xz8ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3kmhy/btslb7jMyty/ILF54yPrTAIlyFQM2xz8ak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3kmhy/btslb7jMyty/ILF54yPrTAIlyFQM2xz8ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3kmhy%2Fbtslb7jMyty%2FILF54yPrTAIlyFQM2xz8ak%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;595&quot; height=&quot;90&quot; data-filename=&quot;sq8.png&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;쿼리를 출력해 보겠습니다. 그러면 Like :title_1 || '%' escape '/'가 나오네요. 사실 title에 그대로 %가 남아 있었으면 _a만 출력되지않았을 겁니다. 이 말은, 문서에서 언급한 대로 특정한 문자들이 LIKE 쿼리 안에서 escape가 된 상태로 render가 된다는 의미입니다. 접미 검사는 어떻게 하면 될까요?&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sq11.png&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ocx75/btslagWjRZb/WcNE7UMwerSdTlkXwKKrK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ocx75/btslagWjRZb/WcNE7UMwerSdTlkXwKKrK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ocx75/btslagWjRZb/WcNE7UMwerSdTlkXwKKrK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Focx75%2FbtslagWjRZb%2FWcNE7UMwerSdTlkXwKKrK0%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;528&quot; height=&quot;313&quot; data-filename=&quot;sq11.png&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;비슷한 원리로, endswith를 쓰면 됩니다. autoescape를 True로 startswith와 마찬가지로, LIKE 안에 들어가는 param 부분에 포함되어 있는 %와 _를 escaping 하게 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sq10.png&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;307&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wOxrm/btslaJxaCFC/WtMvpQyekxI8ETqYxiPK30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wOxrm/btslaJxaCFC/WtMvpQyekxI8ETqYxiPK30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wOxrm/btslaJxaCFC/WtMvpQyekxI8ETqYxiPK30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwOxrm%2FbtslaJxaCFC%2FWtMvpQyekxI8ETqYxiPK30%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;532&quot; height=&quot;307&quot; data-filename=&quot;sq10.png&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;307&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;어떠한 string이 포함되었는지 검사하기 위해서는 contains를 쓰면 됩니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>웹/FASTAPI</category>
      <category>contains</category>
      <category>endsWith</category>
      <category>FastAPI</category>
      <category>sqlalchemy</category>
      <category>startsWith</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/911</guid>
      <comments>https://codingdog.tistory.com/entry/sqlalchemy-like-%EC%97%B0%EC%82%B0%EC%9D%98-%EC%99%80-%EB%A5%BC-escaping-%EC%B2%98%EB%A6%AC%ED%95%B4-%EC%A3%BC%EB%8A%94-startswith-endswith-contains%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry911comment</comments>
      <pubDate>Fri, 23 Jun 2023 23:42:24 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 dataclass frozen을 이용하여 불변 객체를 흉내내 봅시다.</title>
      <link>https://codingdog.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-dataclass-frozen%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-%EB%B6%88%EB%B3%80-%EA%B0%9D%EC%B2%B4%EB%A5%BC-%ED%9D%89%EB%82%B4%EB%82%B4-%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;불변 객체는 생각보다 중요합니다. 예를 들자면, 해시에서 키를 넣을 때, 변할 수 있는 객체면 곤란해 질 수 있습니다. 왜냐하면 객체의 내용이 변하면 hash값이 변하기 때문입니다. 하지만, hash에서 탐색하기 시작하는 위치는 안 바뀌기 때문에 (재해싱을 하지 않는 이상) 이상하게 동작하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;python에서는 immutable을 흉내낼 수 있는 것이 있는데요. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;dataclasses의 frozen을 True로 설정하면 가능합니다.&lt;/u&gt;&lt;/span&gt; 간단하게 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dc1.png&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/In8XM/btskLNe2D84/BExRXh1kquRpDAbOdpHgl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/In8XM/btskLNe2D84/BExRXh1kquRpDAbOdpHgl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/In8XM/btskLNe2D84/BExRXh1kquRpDAbOdpHgl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIn8XM%2FbtskLNe2D84%2FBExRXh1kquRpDAbOdpHgl0%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;577&quot; height=&quot;332&quot; data-filename=&quot;dc1.png&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;332&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;3.7부터 추가된 dataclass를 이용해서, immutable을 흉내낼 수 있다고 하였습니다. 잠깐. immutable의 대표적인 것은 tuple이 있습니다. 반면, mutable은 list가 있습니다. list는 append 등으로 원소를 뒤에 추가할 수 있기 때문입니다. 위 문서에서 frozen이 참일 때 어떤 일이 일어나는지를 설명해 주고 있어요. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;instance가 생성된 후에 field에 값을 대입할 수 없다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;불변 흉내를 낼 수 있다는 소리입니다. 예제를 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dc2.png&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cruO1a/btskKCrsLsL/KSQi8X2vWK307bj1AaHQf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cruO1a/btskKCrsLsL/KSQi8X2vWK307bj1AaHQf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cruO1a/btskKCrsLsL/KSQi8X2vWK307bj1AaHQf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcruO1a%2FbtskKCrsLsL%2FKSQi8X2vWK307bj1AaHQf0%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;444&quot; height=&quot;154&quot; data-filename=&quot;dc2.png&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;154&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;class Obj가 있는데요. frozen이 True로 되어 있어요. 고로, x와 y는 생성이 되고 난 후에는 아예 초기화를 할 수 없습니다. 어떻게 초기화를 시킬까요?&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dc3.png&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCvvSS/btskJG8PLLM/OJsZTdKHNkHHjIF8x7md31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCvvSS/btskJG8PLLM/OJsZTdKHNkHHjIF8x7md31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCvvSS/btskJG8PLLM/OJsZTdKHNkHHjIF8x7md31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCvvSS%2FbtskJG8PLLM%2FOJsZTdKHNkHHjIF8x7md31%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;520&quot; height=&quot;86&quot; data-filename=&quot;dc3.png&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;o1 = Obj(x=3, y=3) 요래 넘겨줍니다. 그러면 생성이 되는 단계에서 x에 3을 집어넣고, y에 3을 집어넣습니다. 그리고 끝납니다. 그 이후에는 대입를 할 수 없습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dc4.png&quot; data-origin-width=&quot;429&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Cpa4g/btskJsJE2K6/lb9I9KrgK2sATZEgEuyOsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Cpa4g/btskJsJE2K6/lb9I9KrgK2sATZEgEuyOsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Cpa4g/btskJsJE2K6/lb9I9KrgK2sATZEgEuyOsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCpa4g%2FbtskJsJE2K6%2Flb9I9KrgK2sATZEgEuyOsK%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;429&quot; height=&quot;88&quot; data-filename=&quot;dc4.png&quot; data-origin-width=&quot;429&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;실행 결과는 요래 나오게 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dc5.png&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w20Aq/btskKCZiKmC/Jt5lTcH7Wlxf7SG3tfKkw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w20Aq/btskKCZiKmC/Jt5lTcH7Wlxf7SG3tfKkw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w20Aq/btskKCZiKmC/Jt5lTcH7Wlxf7SG3tfKkw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw20Aq%2FbtskKCZiKmC%2FJt5lTcH7Wlxf7SG3tfKkw0%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;386&quot; height=&quot;375&quot; data-filename=&quot;dc5.png&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;375&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;12번째 줄에 o1.x = 3이라고 입력했더니, 에러가 뜹니다. 왜? Obj object의 x가 읽기 전용이기 때문입니다. &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;o1.x = 3를 실행했을 때에는, 이미 객체 o1이 생성 되고 난 후였습니다.&lt;/u&gt;&lt;/span&gt; 그렇기 때문에, o1.x에 assign을 하는 것 자체가 되지 않습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dc6.png&quot; data-origin-width=&quot;374&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eRpPPv/btskMlJvE3f/xTGtSf3srzGhm9DIuxPBs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eRpPPv/btskMlJvE3f/xTGtSf3srzGhm9DIuxPBs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eRpPPv/btskMlJvE3f/xTGtSf3srzGhm9DIuxPBs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeRpPPv%2FbtskMlJvE3f%2FxTGtSf3srzGhm9DIuxPBs1%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;374&quot; height=&quot;284&quot; data-filename=&quot;dc6.png&quot; data-origin-width=&quot;374&quot; data-origin-height=&quot;284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면, __setattr__ 등으로 할 수 있지 않을까요? __setattr__은 속성에 값을 집어넣습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dc7.png&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciBH8s/btskMmhl466/l983cczkXFIR9zDUrookY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciBH8s/btskMmhl466/l983cczkXFIR9zDUrookY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciBH8s/btskMmhl466/l983cczkXFIR9zDUrookY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciBH8s%2FbtskMmhl466%2Fl983cczkXFIR9zDUrookY1%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;614&quot; height=&quot;160&quot; data-filename=&quot;dc7.png&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;실행을 시켜 보니, FrozenInstanceError가 나오게 됩니다. 이미 만들어진 객체의 필드에 다른 값을 assign 할 수 없다는 의미입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;조심해야 할 것은, 생성이 된 객체의 필드에 assign이 안 된다는 것입니다. 이 말은, field가 mutable인 경우에, field의 내부 값이 변경될 수도 있다는 것입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dc8.png&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBp3VU/btskLNzlTzY/fnXUgDb6KpmmxbWBHB3AcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBp3VU/btskLNzlTzY/fnXUgDb6KpmmxbWBHB3AcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBp3VU/btskLNzlTzY/fnXUgDb6KpmmxbWBHB3AcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBp3VU%2FbtskLNzlTzY%2FfnXUgDb6KpmmxbWBHB3AcK%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;389&quot; height=&quot;354&quot; data-filename=&quot;dc8.png&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;z: list라고 되어 있습니다. 리스트는 아시다 시피 불변 객체가 아닙니다. o1을 생성하는 과정에서 z가 초기화 되었습니다. list 객체로요. 그런데, assign만 안 될 뿐이지, 생성된 객체에 append를 해서 상태를 변경시킬 수 있어요. o1.z.append(&quot;3&quot;), o1.z.append(&quot;4&quot;)를 수행하는데요. o1.z가 불변 객체가 아니기 때문에, o1 안에 들어있는 list에 3과 4가 추가되게 됩니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dc9.png&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;89&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sBdXj/btskJsXbwqE/7025xciZuNpQJ1KvLbFmKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sBdXj/btskJsXbwqE/7025xciZuNpQJ1KvLbFmKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sBdXj/btskJsXbwqE/7025xciZuNpQJ1KvLbFmKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsBdXj%2FbtskJsXbwqE%2F7025xciZuNpQJ1KvLbFmKK%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;461&quot; height=&quot;89&quot; data-filename=&quot;dc9.png&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;89&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;실행 결과는 위와 같습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>코딩/파이선</category>
      <category>DataCLass</category>
      <category>Frozen</category>
      <category>불변객체</category>
      <category>파이썬</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/910</guid>
      <comments>https://codingdog.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-dataclass-frozen%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-%EB%B6%88%EB%B3%80-%EA%B0%9D%EC%B2%B4%EB%A5%BC-%ED%9D%89%EB%82%B4%EB%82%B4-%EB%B4%85%EC%8B%9C%EB%8B%A4#entry910comment</comments>
      <pubDate>Tue, 20 Jun 2023 23:57:29 +0900</pubDate>
    </item>
    <item>
      <title>python hash 함수에 대해 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/python-hash-%ED%95%A8%EC%88%98%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;python에는 hash 함수가 있습니다. 무엇을 하는 함수일까요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;hh1.png&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwMudi/btskAYPzpAM/fodWExk67X7GakYkVZNjsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwMudi/btskAYPzpAM/fodWExk67X7GakYkVZNjsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwMudi/btskAYPzpAM/fodWExk67X7GakYkVZNjsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwMudi%2FbtskAYPzpAM%2FfodWExk67X7GakYkVZNjsK%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;520&quot; height=&quot;90&quot; data-filename=&quot;hh1.png&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;간단하게 hash(1)과 hash('str')을 입력해 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;hh2.png&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;89&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RxaL5/btskrc2tNzR/qUaq9uIAOnALbxQkxMkKl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RxaL5/btskrc2tNzR/qUaq9uIAOnALbxQkxMkKl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RxaL5/btskrc2tNzR/qUaq9uIAOnALbxQkxMkKl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRxaL5%2Fbtskrc2tNzR%2FqUaq9uIAOnALbxQkxMkKl1%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;491&quot; height=&quot;89&quot; data-filename=&quot;hh2.png&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;89&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그랬더니 1과 -34797.. 이 나옵니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;객체의 hash값을 돌려주기 위해서 쓴다.&lt;/u&gt;&lt;/span&gt; 정도로 추정할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;hh11.png&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sdP1x/btskDhm1IA1/RZ9uaesy1EIg8lzQVA7Us1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sdP1x/btskDhm1IA1/RZ9uaesy1EIg8lzQVA7Us1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sdP1x/btskDhm1IA1/RZ9uaesy1EIg8lzQVA7Us1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsdP1x%2FbtskDhm1IA1%2FRZ9uaesy1EIg8lzQVA7Us1%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;382&quot; height=&quot;197&quot; data-filename=&quot;hh11.png&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이제, Obj 하나를 정의해 보겠습니다. 생성자에 인자 x를 받습니다. 그러면 Obj의 필드 x에 x의 값을 넣습니다. 이제 Obj(1)의 해시값과, 다른 객체인 Obj(1)의 해시값을 비교해 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;hh12.png&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;93&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LR6Pc/btskuXYhusa/OKIUuyzv0KIEe7WJoz1IS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LR6Pc/btskuXYhusa/OKIUuyzv0KIEe7WJoz1IS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LR6Pc/btskuXYhusa/OKIUuyzv0KIEe7WJoz1IS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLR6Pc%2FbtskuXYhusa%2FOKIUuyzv0KIEe7WJoz1IS0%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;401&quot; height=&quot;93&quot; data-filename=&quot;hh12.png&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;93&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다릅니다. 왜? __hash__가 재정의 되어 있지 않기 때문입니다. 파이썬에서는 dict, counter 등이 hash를 기반으로 동작하는데요. 키 값으로 custom한 객체를 넘겨줄 때 __hash__를 재정의 해야 할 겁니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;이 __hash__ 안에 hash 함수를 쓸 거라는 예상을 할 수 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;예제를 하나 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;hh3.png&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpuSrb/btskuPlAQLz/vJpdeJ7tKCArnWwbFefNrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpuSrb/btskuPlAQLz/vJpdeJ7tKCArnWwbFefNrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpuSrb/btskuPlAQLz/vJpdeJ7tKCArnWwbFefNrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpuSrb%2FbtskuPlAQLz%2FvJpdeJ7tKCArnWwbFefNrk%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;413&quot; height=&quot;264&quot; data-filename=&quot;hh3.png&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;264&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;__eq__랑 __hash__랑 __str__을 재정의 해 주었습니다. __eq__를 정의하면 __hash__도 재정의를 해 주는 것이 국룰입니다. &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;특히 custom하게 정의한 class의 object를 해시 기반 자료 구조의 key 값으로 쓰려는 경우.&lt;/u&gt;&lt;/span&gt; 객체가 동등하더라도, hash값이 다르면 다른 hash값을 가지기 때문에, 탐색 시작 위치가 달라져 버릴 수 있기 때문입니다. Obj의 필드는 x 하나밖에 없기 때문에, hash(self.x)를 리턴했습니다만, &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;2개의 필드에 대해서 해시값을 생성하려는 경우 tuple 등을 생각해 보는 것이 좋습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;hh4.png&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ECZao/btskuO75JD2/HBGkx2bGQouos81lhrTDr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ECZao/btskuO75JD2/HBGkx2bGQouos81lhrTDr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ECZao/btskuO75JD2/HBGkx2bGQouos81lhrTDr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FECZao%2FbtskuO75JD2%2FHBGkx2bGQouos81lhrTDr0%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;508&quot; height=&quot;86&quot; data-filename=&quot;hh4.png&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;lt에 Obj(1), Obj(1)을 넣어두었습니다. 저는, 이 lt에 있는 것을 set으로 옮겼습니다. 실행 결과가 어떻게 나올까요? 일단 __eq__랑 __hash__를 재정의 했기 때문에, Obj(1)과 뒤에 있는 Obj(1)은 중복 처리가 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;hh5.png&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;67&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oFBeE/btskCpyTvK4/R0A6nruBdbV8kK0bkPESu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oFBeE/btskCpyTvK4/R0A6nruBdbV8kK0bkPESu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oFBeE/btskCpyTvK4/R0A6nruBdbV8kK0bkPESu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoFBeE%2FbtskCpyTvK4%2FR0A6nruBdbV8kK0bkPESu0%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;417&quot; height=&quot;67&quot; data-filename=&quot;hh5.png&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;67&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;따라서 Obj: 1만 출력이 됩니다. collection의 Counter도 마찬가지일까요?&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;hh6.png&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;151&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/db5yDW/btskuXcRJFa/nwmPlBFgbAa8Kq23ovZjY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/db5yDW/btskuXcRJFa/nwmPlBFgbAa8Kq23ovZjY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/db5yDW/btskuXcRJFa/nwmPlBFgbAa8Kq23ovZjY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdb5yDW%2FbtskuXcRJFa%2FnwmPlBFgbAa8Kq23ovZjY1%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;459&quot; height=&quot;151&quot; data-filename=&quot;hh6.png&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;151&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;c[Obj(1)] += 1 이런 식으로 작성해 주면, 키 Obj(1)의 개수가 하나 증가합니다. 결과는 Obj: 1 = 2, Obj: 2 = 1이 나오게 될 것인데요. Obj가 x 값만 같으면 동일하고, hash 값도 같기 때문입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;hh7.png&quot; data-origin-width=&quot;435&quot; data-origin-height=&quot;91&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGGfPR/btskC3Cmt9l/3VjBeb9we0P8omGaBkxGKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGGfPR/btskC3Cmt9l/3VjBeb9we0P8omGaBkxGKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGGfPR/btskC3Cmt9l/3VjBeb9we0P8omGaBkxGKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGGfPR%2FbtskC3Cmt9l%2F3VjBeb9we0P8omGaBkxGKk%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;435&quot; height=&quot;91&quot; data-filename=&quot;hh7.png&quot; data-origin-width=&quot;435&quot; data-origin-height=&quot;91&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;실행 결과가 제가 예상했던 것과 그대로 나왔네요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;hh8.png&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XSmsX/btskEosIZ2b/PvBAAnCatGXZ6LLibKsNe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XSmsX/btskEosIZ2b/PvBAAnCatGXZ6LLibKsNe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XSmsX/btskEosIZ2b/PvBAAnCatGXZ6LLibKsNe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXSmsX%2FbtskEosIZ2b%2FPvBAAnCatGXZ6LLibKsNe0%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;445&quot; height=&quot;200&quot; data-filename=&quot;hh8.png&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;여기서 질문. 이 경우에는 어떨까요? 사실 hash값이 같지만, 동등하지 않는 경우는 의외로 있습니다. 키 3과 5가 같은 hash 값을 가지지만, 동등하지 않은 것과 같은 이치인데요. __eq__가 정의되지 않았으므로, 필드 값이 1이더라도, 별개의 객체인 경우 동등하지 않습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;hh9.png&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cY3pQP/btskAIlUubV/BqLgNRXdREjN2uztw1kJ50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cY3pQP/btskAIlUubV/BqLgNRXdREjN2uztw1kJ50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cY3pQP/btskAIlUubV/BqLgNRXdREjN2uztw1kJ50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcY3pQP%2FbtskAIlUubV%2FBqLgNRXdREjN2uztw1kJ50%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;458&quot; height=&quot;154&quot; data-filename=&quot;hh9.png&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;154&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;따라서, 위 코드의 경우 Obj(1), Obj(1), Obj(2)가 별개로 count가 됩니다. 한 마디로 hash가 제대로 동작하지 않는다는 것입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;hh10.png&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kHhee/btskDisHMR0/cXCrUiUEIfVmaVWzNGfWtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kHhee/btskDisHMR0/cXCrUiUEIfVmaVWzNGfWtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kHhee/btskDisHMR0/cXCrUiUEIfVmaVWzNGfWtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkHhee%2FbtskDisHMR0%2FcXCrUiUEIfVmaVWzNGfWtK%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;488&quot; height=&quot;110&quot; data-filename=&quot;hh10.png&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;110&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;실행 결과는 위와 같습니다. 키를 찾기 위한 base 위치는 같겠지만, 필드 x의 값이 같은 별개의 객체 a와 b는 다른 객체이므로, a만 존재하는 경우, b가 없다고 판단하게 됩니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>코딩/파이선</category>
      <category>hash</category>
      <category>python</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/909</guid>
      <comments>https://codingdog.tistory.com/entry/python-hash-%ED%95%A8%EC%88%98%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry909comment</comments>
      <pubDate>Mon, 19 Jun 2023 23:50:25 +0900</pubDate>
    </item>
    <item>
      <title>fastapi celery로 간단하게 특정 시간마다 task가 실행되는 schedular를 만들어 봅시다.</title>
      <link>https://codingdog.tistory.com/entry/fastapi-celery%EB%A1%9C-%EA%B0%84%EB%8B%A8%ED%95%98%EA%B2%8C-%EC%9D%BC%EC%A0%95-%EC%8B%9C%EA%B0%84%EB%A7%88%EB%8B%A4-task%EA%B0%80-%EC%8B%A4%ED%96%89%EB%90%98%EB%8A%94-schedular%EB%A5%BC-%EB%A7%8C%EB%93%A4%EC%96%B4-%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;fastapi에서 일정 주기로 뭔가를 실행시키는 방법이 없을까요? 예를 들어, 자정 12시마다 방문자 수를 초기화 한다던지, 통계 데이터를 수집해야 하는 경우가 있습니다. 이를 cron으로 돌려서 처리할 수도 있습니다만, 여간 귀찮은 것이 아닙니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;celery에는 worker 뿐만이 아니라&lt;/b&gt;&lt;/span&gt;, 스케쥴러를 등록해서 사용할 수도 있습니다. 간단하게 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fc2.png&quot; data-origin-width=&quot;347&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2QHPt/btsjctCIsWX/B2dqNgoyVc5pJuyDeTL190/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2QHPt/btsjctCIsWX/B2dqNgoyVc5pJuyDeTL190/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2QHPt/btsjctCIsWX/B2dqNgoyVc5pJuyDeTL190/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2QHPt%2FbtsjctCIsWX%2FB2dqNgoyVc5pJuyDeTL190%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;347&quot; height=&quot;287&quot; data-filename=&quot;fc2.png&quot; data-origin-width=&quot;347&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;프로젝트 구조는 위와 같습니다. core의 celery 안에 있는 base.py로 들어가 보겠습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fc3.png&quot; data-origin-width=&quot;485&quot; data-origin-height=&quot;301&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p9XSy/btsjavaHa0C/FfghKfj2kWKM4ORHvYwky1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p9XSy/btsjavaHa0C/FfghKfj2kWKM4ORHvYwky1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p9XSy/btsjavaHa0C/FfghKfj2kWKM4ORHvYwky1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp9XSy%2FbtsjavaHa0C%2FFfghKfj2kWKM4ORHvYwky1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;485&quot; height=&quot;301&quot; data-filename=&quot;fc3.png&quot; data-origin-width=&quot;485&quot; data-origin-height=&quot;301&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;코드를 보겠습니다. broker와 backend는 redis를 사용하였습니다. 고로 redis 주소를 적어주었습니다. 다음에, include에는 실행할 테스크가 있는 &quot;app.sche.sche&quot;를 적어주었습니다. 위 코드에서는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;메세지를 전송하는 주체와 수신하는 주체를 중개해 주는 역할을 redis가 하게 됩니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fc4.png&quot; data-origin-width=&quot;529&quot; data-origin-height=&quot;144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RN4oC/btsjdBtHz40/2IA9UfzCZyjmTkp8krv4KK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RN4oC/btsjdBtHz40/2IA9UfzCZyjmTkp8krv4KK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RN4oC/btsjdBtHz40/2IA9UfzCZyjmTkp8krv4KK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRN4oC%2FbtsjdBtHz40%2F2IA9UfzCZyjmTkp8krv4KK%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;529&quot; height=&quot;144&quot; data-filename=&quot;fc4.png&quot; data-origin-width=&quot;529&quot; data-origin-height=&quot;144&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다음에, &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;celery_task의 conf의 beat_schedule&lt;/b&gt;&lt;/span&gt;에는 실행할 task에 대한 정보를 적어줍니다. app.sche.sche.sche_every_minute라는 테스크를 실행하는데요. &quot;schedule&quot;에 crontab()을 넣어줍니다. crontab에 아무 인자도 들어가지 않은 경우, 매 분마다 실행되게 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fc6.png&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0e3DU/btsjaUHKKu4/iyFpASjYkGkOay1vtYQYdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0e3DU/btsjaUHKKu4/iyFpASjYkGkOay1vtYQYdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0e3DU/btsjaUHKKu4/iyFpASjYkGkOay1vtYQYdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0e3DU%2FbtsjaUHKKu4%2FiyFpASjYkGkOay1vtYQYdK%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;470&quot; height=&quot;174&quot; data-filename=&quot;fc6.png&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;174&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;매 분마다 실행시킬 task입니다. task는 &quot;doai station&quot;을 출력하는 것입니다. 여기까지 내용을 정리해 봅시다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cw2.png&quot; data-origin-width=&quot;120&quot; data-origin-height=&quot;195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cv1gL4/btsknutkDLc/VL8TWrBfYzpaep7NiPqsI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cv1gL4/btsknutkDLc/VL8TWrBfYzpaep7NiPqsI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cv1gL4/btsknutkDLc/VL8TWrBfYzpaep7NiPqsI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcv1gL4%2FbtsknutkDLc%2FVL8TWrBfYzpaep7NiPqsI0%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;120&quot; height=&quot;195&quot; data-filename=&quot;cw2.png&quot; data-origin-width=&quot;120&quot; data-origin-height=&quot;195&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;스케쥴러를 정의했는데요. 여기에 매 분마다 실행되는 sche_every_minute task를 등록해 줍니다. 이 task는 1분마다 어딘가로 전송이 될 겁니다&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cw3.png&quot; data-origin-width=&quot;290&quot; data-origin-height=&quot;191&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ecR81V/btskiSBu3mb/Rqi5uPnMKMR9vUR7Zm0JFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ecR81V/btskiSBu3mb/Rqi5uPnMKMR9vUR7Zm0JFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ecR81V/btskiSBu3mb/Rqi5uPnMKMR9vUR7Zm0JFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FecR81V%2FbtskiSBu3mb%2FRqi5uPnMKMR9vUR7Zm0JFK%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;290&quot; height=&quot;191&quot; data-filename=&quot;cw3.png&quot; data-origin-width=&quot;290&quot; data-origin-height=&quot;191&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이제, worker에게 해당 task를 전송합니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cw4.png&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QGyax/btskgqe98zV/bE4snPfuZSOvYX835sKpW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QGyax/btskgqe98zV/bE4snPfuZSOvYX835sKpW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QGyax/btskgqe98zV/bE4snPfuZSOvYX835sKpW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQGyax%2Fbtskgqe98zV%2FbE4snPfuZSOvYX835sKpW0%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;447&quot; height=&quot;190&quot; data-filename=&quot;cw4.png&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;190&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;매 분마다 요런 흐름으로 로직이 구성됩니다. 간단하게 테스트 해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fc5.png&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G1ahL/btsjbKEHKlU/KXPornWyyOHwOgT6vVZdmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G1ahL/btsjbKEHKlU/KXPornWyyOHwOgT6vVZdmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G1ahL/btsjbKEHKlU/KXPornWyyOHwOgT6vVZdmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG1ahL%2FbtsjbKEHKlU%2FKXPornWyyOHwOgT6vVZdmk%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;634&quot; height=&quot;291&quot; data-filename=&quot;fc5.png&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;291&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이제 간단하게 명령어를 입력해서 테스트 해 보겠습니다. app.core.celery.base.celery_task에 실행시킬 task들이 있습니다. 뒤에 worker -B가 붙어 있습니다. 이는 embedded beat를 사용한다는 의미입니다. 간단하게 테스트 하기 위해 embed beat를 이용합시다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fc1.png&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnDGDt/btsjdmwylfv/ZkkXsHd0k2HBdN2n21R6hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnDGDt/btsjdmwylfv/ZkkXsHd0k2HBdN2n21R6hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnDGDt/btsjdmwylfv/ZkkXsHd0k2HBdN2n21R6hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnDGDt%2Fbtsjdmwylfv%2FZkkXsHd0k2HBdN2n21R6hk%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;717&quot; height=&quot;120&quot; data-filename=&quot;fc1.png&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;1분마다 doai station이 출력되는 것을 볼 수 있어요. 다음 시간에 저 명령어에 대해서 조금 더 자세히 알아보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>웹/FASTAPI</category>
      <category>celery</category>
      <category>FastAPI</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/908</guid>
      <comments>https://codingdog.tistory.com/entry/fastapi-celery%EB%A1%9C-%EA%B0%84%EB%8B%A8%ED%95%98%EA%B2%8C-%EC%9D%BC%EC%A0%95-%EC%8B%9C%EA%B0%84%EB%A7%88%EB%8B%A4-task%EA%B0%80-%EC%8B%A4%ED%96%89%EB%90%98%EB%8A%94-schedular%EB%A5%BC-%EB%A7%8C%EB%93%A4%EC%96%B4-%EB%B4%85%EC%8B%9C%EB%8B%A4#entry908comment</comments>
      <pubDate>Sat, 17 Jun 2023 23:57:45 +0900</pubDate>
    </item>
    <item>
      <title>postgresql string_agg 함수 정렬과 중복 제거를 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/postgresql-stringagg-%ED%95%A8%EC%88%98-%EC%A0%95%EB%A0%AC%EA%B3%BC-%EC%A4%91%EB%B3%B5-%EC%A0%9C%EA%B1%B0%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;안녕하세요. 이번 시간에는 postgresql에서 쓰는 string_agg 함수에 대해 간단하게 알아보겠습니다. 그리고 정렬하는 것과 중복 제거하는 것도 같이 알아볼게요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;먼저, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;string_agg는 컬럼의 값들을 하나의 string으로 합쳐주는 역할&lt;/u&gt;&lt;/span&gt;을 합니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;입력으로 들어오는 row의 속성들을 하나의 string으로 합칠 때 쓰입니다.&lt;/b&gt;&lt;/span&gt; 이게 무슨 말인가? 예제를 하나 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sta1.png&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEg1f4/btskfrZqE4a/bFLnSQzdlwhrjrlvfakxI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEg1f4/btskfrZqE4a/bFLnSQzdlwhrjrlvfakxI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEg1f4/btskfrZqE4a/bFLnSQzdlwhrjrlvfakxI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEg1f4%2FbtskfrZqE4a%2FbFLnSQzdlwhrjrlvfakxI1%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;562&quot; height=&quot;152&quot; data-filename=&quot;sta1.png&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;temp_data를 with 절로 정의했어요. 속성 t의 값이 'a'인 것과, t의 값이 'b'인 것과, 'Z'인 것을 union한 결과를 temp_data로 정의했어요. 이제, temp_data에 있는 내용을 출력해 봅시다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sta2.png&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;143&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cq0IRa/btskha3dPuc/9hQKOdmUowvwJtqF945JJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cq0IRa/btskha3dPuc/9hQKOdmUowvwJtqF945JJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cq0IRa/btskha3dPuc/9hQKOdmUowvwJtqF945JJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcq0IRa%2Fbtskha3dPuc%2F9hQKOdmUowvwJtqF945JJ1%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;508&quot; height=&quot;143&quot; data-filename=&quot;sta2.png&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;143&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;'c', 'b', 'Z', 'b'가 나옵니다. 이제 이것을 string_agg로 합쳐 보겠습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sta3.png&quot; data-origin-width=&quot;561&quot; data-origin-height=&quot;170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUNSfy/btskhdezlCd/hf1ht2HApAnK6uBOrrwpZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUNSfy/btskhdezlCd/hf1ht2HApAnK6uBOrrwpZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUNSfy/btskhdezlCd/hf1ht2HApAnK6uBOrrwpZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUNSfy%2FbtskhdezlCd%2Fhf1ht2HApAnK6uBOrrwpZK%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;561&quot; height=&quot;170&quot; data-filename=&quot;sta3.png&quot; data-origin-width=&quot;561&quot; data-origin-height=&quot;170&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;temp_data의 t의 모든 값들을 합치는데요. 2번째 인자는 delimeter입니다. 구분자를 의미해요. 결과를 볼까요?&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sta4.png&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkQgkb/btskewmtISz/V8s2dq7EjAHKC959UPx0vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkQgkb/btskewmtISz/V8s2dq7EjAHKC959UPx0vk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkQgkb/btskewmtISz/V8s2dq7EjAHKC959UPx0vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkQgkb%2FbtskewmtISz%2FV8s2dq7EjAHKC959UPx0vk%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;519&quot; height=&quot;125&quot; data-filename=&quot;sta4.png&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;c-b-Z-b가 나옵니다. temp_data에는 레코드들의 속성 t가 'c', 'b', 'Z', 'b' 순으로 있었는데요. 이것이 aggreate가 되면서, 'c-b-Z-b'가 되어버린 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;이제, distinct와 order by를 알아봅시다. string_agg에서 input row가 들어올 때, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;중복된 것들을 제외&lt;/u&gt;&lt;/span&gt;할 수도 있습니다. 그리고 우리가 원하는 대로 ordering 또한 할 수 있습니다. 간단하게 알아볼게요.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sta5.png&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Esy95/btskgu8Iclu/nRkPVz6mo6YmEvQpKSKKK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Esy95/btskgu8Iclu/nRkPVz6mo6YmEvQpKSKKK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Esy95/btskgu8Iclu/nRkPVz6mo6YmEvQpKSKKK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEsy95%2Fbtskgu8Iclu%2FnRkPVz6mo6YmEvQpKSKKK0%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;570&quot; height=&quot;168&quot; data-filename=&quot;sta5.png&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;먼저 &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;distinct&lt;/b&gt;&lt;/span&gt;입니다. 입력 row의 속성&amp;nbsp; t는 'c', 'b', 'Z', 'b'입니다. 여기서 'b'가 2번 나왔어요. 이것을 제거해서, 'b', 'c', 'Z'만 나오게 하고 싶어요. 그러면 어떻게 하면 되느냐. 그냥 1번째 인자에, distinct t를 써 주면 됩니다. &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;속성 t에 대해서 중복을 제거하겠다는 의미입니다.&lt;/u&gt;&lt;/span&gt; 결과가 어떻게 나오는지 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sta6.png&quot; data-origin-width=&quot;476&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5f46h/btskfYo9QAQ/kbQyPSpFTKi6SCKY2ji3r0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5f46h/btskfYo9QAQ/kbQyPSpFTKi6SCKY2ji3r0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5f46h/btskfYo9QAQ/kbQyPSpFTKi6SCKY2ji3r0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5f46h%2FbtskfYo9QAQ%2FkbQyPSpFTKi6SCKY2ji3r0%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;476&quot; height=&quot;183&quot; data-filename=&quot;sta6.png&quot; data-origin-width=&quot;476&quot; data-origin-height=&quot;183&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;b-c-Z가 나옵니다. 아까 중복 처리를 해 주지 않았을 때에는 c-b-Z-b가 나오던 것과 대조적이지요. 그런데 말이지요. 어떨 땐 c가 먼저 나오기도 하고 어떨 땐 b가 먼저 나오기도 해요. 이것은 order 순서가 없기 때문에 그러해요. 결과가 어떻게 나올지 모르지요. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;이 경우, order by를 해서 ordering을 지정해 줄 수도 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sta7.png&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kCBCE/btskfcntPTK/qoFUOigkX7SoVnHLvOxA5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kCBCE/btskfcntPTK/qoFUOigkX7SoVnHLvOxA5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kCBCE/btskfcntPTK/qoFUOigkX7SoVnHLvOxA5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkCBCE%2FbtskfcntPTK%2FqoFUOigkX7SoVnHLvOxA5K%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;530&quot; height=&quot;168&quot; data-filename=&quot;sta7.png&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;2번째 인자에 '-' order by t desc가 있습니다. 이는, 들어오는 row의 속성 t 값을 내림차순으로 정렬하라는 의미입니다. 대신에 앞에 중복을 제거하는 distinct가 없으니까, b가 2번 나오겠지요?&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sta8.png&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WMPn0/btskg8R3PdQ/s3xXtOP6fKw1yKAvkxlWkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WMPn0/btskg8R3PdQ/s3xXtOP6fKw1yKAvkxlWkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WMPn0/btskg8R3PdQ/s3xXtOP6fKw1yKAvkxlWkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWMPn0%2Fbtskg8R3PdQ%2Fs3xXtOP6fKw1yKAvkxlWkK%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;416&quot; height=&quot;121&quot; data-filename=&quot;sta8.png&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;121&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;결과는 Z-c-b-b가 나옵니다. 이제 중복 제거와 정렬을 같이 적용해 봅시다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sta9.png&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8tHbZ/btskgH1sp27/sggM8kevGaNuslLGvIsaWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8tHbZ/btskgH1sp27/sggM8kevGaNuslLGvIsaWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8tHbZ/btskgH1sp27/sggM8kevGaNuslLGvIsaWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8tHbZ%2FbtskgH1sp27%2FsggM8kevGaNuslLGvIsaWk%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;556&quot; height=&quot;167&quot; data-filename=&quot;sta9.png&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;167&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;string_agg(distinct t, '-' order by t desc) 요래 입력해 보겠습니다. 그러면 이건, 입력이 들어오는 row들의 속성 t에 대해서 중복을 제거해 주면서, t값에 대해 내림차순 정렬을 합니다. 그러면 Z-c-b가 나오게 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sta10.png&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/berfYu/btskeuCdqzI/mrDbzatG0EswbPLbmYlTuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/berfYu/btskeuCdqzI/mrDbzatG0EswbPLbmYlTuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/berfYu/btskeuCdqzI/mrDbzatG0EswbPLbmYlTuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FberfYu%2FbtskeuCdqzI%2FmrDbzatG0EswbPLbmYlTuk%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;479&quot; height=&quot;144&quot; data-filename=&quot;sta10.png&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;144&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;Z-c-b가 잘 나왔음을 알 수 있습니다. 이걸 조금 더 응용한다면, 랜덤한 문자열을 뽑을 때도 유용하게 사용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>코딩/Sql</category>
      <category>postgres</category>
      <category>postgresql</category>
      <category>STRING_AGG</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/907</guid>
      <comments>https://codingdog.tistory.com/entry/postgresql-stringagg-%ED%95%A8%EC%88%98-%EC%A0%95%EB%A0%AC%EA%B3%BC-%EC%A4%91%EB%B3%B5-%EC%A0%9C%EA%B1%B0%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry907comment</comments>
      <pubDate>Fri, 16 Jun 2023 23:16:52 +0900</pubDate>
    </item>
    <item>
      <title>fastapi sub application에 대해 알아보고 app마다 다른 middleware를 적용해 봅시다.</title>
      <link>https://codingdog.tistory.com/entry/fastapi-sub-application%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B3%A0-app%EB%A7%88%EB%8B%A4-%EB%8B%A4%EB%A5%B8-middleware%EB%A5%BC-%EC%A0%81%EC%9A%A9%ED%95%B4-%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;fastapi에서는 application 안에 application을 넣을 수 있습니다. sub application이라고 칭하겠습니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;이 sub application들을 mount를 하면, 각 어플리케이션 별로 미들웨어 등을 넣을 수 있어요.&lt;/u&gt;&lt;/span&gt; 분리를 한다? &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;예를 들어, health check 어플리케이션이랑, api 어플리케이션이랑 분리할 수 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이 방법을 간단하게 알아볼 거에요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;su7.png&quot; data-origin-width=&quot;443&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byN2nH/btsjRXXdz35/ac4hoUsoCFEQmyiGFp9zB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byN2nH/btsjRXXdz35/ac4hoUsoCFEQmyiGFp9zB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byN2nH/btsjRXXdz35/ac4hoUsoCFEQmyiGFp9zB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyN2nH%2FbtsjRXXdz35%2Fac4hoUsoCFEQmyiGFp9zB1%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;443&quot; height=&quot;180&quot; data-filename=&quot;su7.png&quot; data-origin-width=&quot;443&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저 패키지 구조부터 보겠습니다. 별 다른 것은 없고요. sub 패키지 안에 sub_app_1.py와 sub_app_2.py가 있는 구조에요.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;su1.png&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;289&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EPYUl/btsjS5tVCND/qo9Uv0K31m7goRWP7Gli01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EPYUl/btsjS5tVCND/qo9Uv0K31m7goRWP7Gli01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EPYUl/btsjS5tVCND/qo9Uv0K31m7goRWP7Gli01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEPYUl%2FbtsjS5tVCND%2Fqo9Uv0K31m7goRWP7Gli01%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;493&quot; height=&quot;289&quot; data-filename=&quot;su1.png&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;289&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저 main.py를 보겠습니다. app_1과 app_2를 import 하는데요. 하나는 /sub1에, 다른 하나는 /sub2에 mount 합니다. 여기까지 어렵지 않지요? 여기까지 그림으로 그려보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;su8.png&quot; data-origin-width=&quot;383&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BljXF/btsjOoIQs1a/Ckkc5pRiGMyKsIKQKa2oSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BljXF/btsjOoIQs1a/Ckkc5pRiGMyKsIKQKa2oSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BljXF/btsjOoIQs1a/Ckkc5pRiGMyKsIKQKa2oSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBljXF%2FbtsjOoIQs1a%2FCkkc5pRiGMyKsIKQKa2oSk%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;383&quot; height=&quot;238&quot; data-filename=&quot;su8.png&quot; data-origin-width=&quot;383&quot; data-origin-height=&quot;238&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;/sub1은 어플리케이션 인스턴스 app_1에 mapping이 되고, /sub2는 어플리케이션 인스턴스 app_2에 매핑됩니다. &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;이 어플리케이션 인스턴스에는 여러 가지 설정들을 할 수 있는데요.&lt;/u&gt;&lt;/span&gt; 대표적으로&lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt; get, post와 같이 api를 추가할 수도 있고, 미들웨어를 추가할 수도 있어요.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;su2.png&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKs452/btsjNMplcCe/b076tPjYTIKX1knL88Kspk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKs452/btsjNMplcCe/b076tPjYTIKX1knL88Kspk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKs452/btsjNMplcCe/b076tPjYTIKX1knL88Kspk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKs452%2FbtsjNMplcCe%2Fb076tPjYTIKX1knL88Kspk%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;414&quot; height=&quot;224&quot; data-filename=&quot;su2.png&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;224&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저, app_1을 봅시다. app_1 = FastAPI()라고 되어 있어요. 어플리케이션 인스턴스를 선언했어요. 이 app_1은 메인 어플리케이션 객체에 mount 되어 있어서, subapp이라고 할 수 있어요. 여기에는 어떤 설정이 있나요? app_1.get(&quot;/health&quot;) 정도만 있어요. get /health 정도만 추가로 있네요. 여기까지 그림으로 그려 보겠습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;su9.png&quot; data-origin-width=&quot;396&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bymrh0/btsjR8LaQB5/tkxhk6eRfKa9jRPbCIIOAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bymrh0/btsjR8LaQB5/tkxhk6eRfKa9jRPbCIIOAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bymrh0/btsjR8LaQB5/tkxhk6eRfKa9jRPbCIIOAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbymrh0%2FbtsjR8LaQB5%2Ftkxhk6eRfKa9jRPbCIIOAk%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;396&quot; height=&quot;247&quot; data-filename=&quot;su9.png&quot; data-origin-width=&quot;396&quot; data-origin-height=&quot;247&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그렇기 때문에, get /sub1/health로 접근하면 &quot;ok&quot;가 나오게 됩니다. 이제 sub2를 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;su3.png&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBVDT6/btsjRiHib7U/p1E3kWpv2WFGUfYjoGTzKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBVDT6/btsjRiHib7U/p1E3kWpv2WFGUfYjoGTzKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBVDT6/btsjRiHib7U/p1E3kWpv2WFGUfYjoGTzKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBVDT6%2FbtsjRiHib7U%2Fp1E3kWpv2WFGUfYjoGTzKk%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;641&quot; height=&quot;269&quot; data-filename=&quot;su3.png&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;269&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;여기도 마찬가지로 어플리케이션 인스턴스를 생성하였어요. 다른 점이 하나 있다면, 미들웨어를 하나 추가했다는 것입니다. 뭔가 이상한 것을 추가한 것을 볼 수 있는데요. TrustedHostMiddleware입니다. allowed_hosts를 &quot;localhost&quot;로만 설정해 놓았음을 볼 수 있어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 이것도 그림으로 그려볼게요.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;su10.png&quot; data-origin-width=&quot;448&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mPndK/btsjKSQZsd5/esuzkjwPp5JGMx6O97Xkwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mPndK/btsjKSQZsd5/esuzkjwPp5JGMx6O97Xkwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mPndK/btsjKSQZsd5/esuzkjwPp5JGMx6O97Xkwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmPndK%2FbtsjKSQZsd5%2FesuzkjwPp5JGMx6O97Xkwk%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;448&quot; height=&quot;326&quot; data-filename=&quot;su10.png&quot; data-origin-width=&quot;448&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;요래 되었네요. 결국, app_1과 달리, app_2는 Trusted Host 미들웨어를 타게 됩니다. 여기까지 정리하면 sub app으로 어플리케이션을 분리해서 mount를 시켜 놓았습니다. 각 sub app별로 middleware를 설정하였기 때문에, 어떤 api endpoint에서는 미들웨어를 타고, 어떤 곳에서는 타지 않게 하려면 이 방법을 쓰는 방법도 나쁘지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이제, postman으로 호출을 한 번 해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;su4.png&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;293&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5wgwY/btsjPG9IDNi/6mmBgc7KFxIrhhKGmScOYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5wgwY/btsjPG9IDNi/6mmBgc7KFxIrhhKGmScOYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5wgwY/btsjPG9IDNi/6mmBgc7KFxIrhhKGmScOYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5wgwY%2FbtsjPG9IDNi%2F6mmBgc7KFxIrhhKGmScOYk%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;293&quot; data-filename=&quot;su4.png&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;293&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저, http://127.0.0.1:8000/sub/health를 호출해 보겠습니다. /sub1에 mount된 app의 경우에는 아무런 Trusted Host 미들웨어가 걸려있지 않습니다. 고로, 응답은 아래와 같이 오게 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;su5.png&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/94Vkp/btsjOpAZglv/3qHKHjOCBgBriFeiQvOTd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/94Vkp/btsjOpAZglv/3qHKHjOCBgBriFeiQvOTd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/94Vkp/btsjOpAZglv/3qHKHjOCBgBriFeiQvOTd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F94Vkp%2FbtsjOpAZglv%2F3qHKHjOCBgBriFeiQvOTd0%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;661&quot; height=&quot;137&quot; data-filename=&quot;su5.png&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;200 OK가 잘 수행되었네요.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;su6.png&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjA1sS/btsjO1NggpM/PBRzgCIpL1InT9ggddmUW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjA1sS/btsjO1NggpM/PBRzgCIpL1InT9ggddmUW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjA1sS/btsjO1NggpM/PBRzgCIpL1InT9ggddmUW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjA1sS%2FbtsjO1NggpM%2FPBRzgCIpL1InT9ggddmUW0%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;687&quot; height=&quot;412&quot; data-filename=&quot;su6.png&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;문제는 /sub2/health입니다. 127.0.0.1:8000의 경우 host가 127.0.0.1이였기 때문에, middleware에서 Invalid host header가 뜨면서, 400 에러를 떨구게 됩니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;su11.png&quot; data-origin-width=&quot;691&quot; data-origin-height=&quot;261&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pz3tN/btsjOovl6Hp/YIc39NvbJv8Kbo88R3GjE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pz3tN/btsjOovl6Hp/YIc39NvbJv8Kbo88R3GjE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pz3tN/btsjOovl6Hp/YIc39NvbJv8Kbo88R3GjE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpz3tN%2FbtsjOovl6Hp%2FYIc39NvbJv8Kbo88R3GjE0%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;691&quot; height=&quot;261&quot; data-filename=&quot;su11.png&quot; data-origin-width=&quot;691&quot; data-origin-height=&quot;261&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;대신에 GET http://localhost:8000/sub2/health 요래 호출하면 이야기가 달라집니다. 이 때에는 host가 localhost로 잡힙니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;su12.png&quot; data-origin-width=&quot;529&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QDs9O/btsjJWltYbi/h0g6kQgIaEcdUAGCkc7hc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QDs9O/btsjJWltYbi/h0g6kQgIaEcdUAGCkc7hc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QDs9O/btsjJWltYbi/h0g6kQgIaEcdUAGCkc7hc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQDs9O%2FbtsjJWltYbi%2Fh0g6kQgIaEcdUAGCkc7hc1%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;529&quot; height=&quot;146&quot; data-filename=&quot;su12.png&quot; data-origin-width=&quot;529&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이것은 허용 host 옵션에 있기 때문에, 200이 떨어지게 됩니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>웹/FASTAPI</category>
      <category>application</category>
      <category>FastAPI</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/906</guid>
      <comments>https://codingdog.tistory.com/entry/fastapi-sub-application%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B3%A0-app%EB%A7%88%EB%8B%A4-%EB%8B%A4%EB%A5%B8-middleware%EB%A5%BC-%EC%A0%81%EC%9A%A9%ED%95%B4-%EB%B4%85%EC%8B%9C%EB%8B%A4#entry906comment</comments>
      <pubDate>Tue, 13 Jun 2023 23:55:03 +0900</pubDate>
    </item>
    <item>
      <title>postgresql with 여러개 선언해서 사용하는 방법을 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/postgresql-with-%EC%97%AC%EB%9F%AC%EA%B0%9C-%EC%84%A0%EC%96%B8%ED%95%B4%EC%84%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;postgresql에서 with 절은 임시 결과를 정의할 때 유용하였습니다. 이걸 여러 개를 쓸 수 있을까요? 2023년 6월 1일부터 오늘까지 통계치를 뽑고 싶을 때 유용하게 쓰일 법한 예제를 보면서 간단하게 알아보겠습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wi1.png&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;47&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LAHb5/btsjFXK59U5/xjWd1Z6JsAAeVhNtkJpXY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LAHb5/btsjFXK59U5/xjWd1Z6JsAAeVhNtkJpXY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LAHb5/btsjFXK59U5/xjWd1Z6JsAAeVhNtkJpXY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLAHb5%2FbtsjFXK59U5%2FxjWd1Z6JsAAeVhNtkJpXY0%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;537&quot; height=&quot;47&quot; data-filename=&quot;wi1.png&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;47&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;테이블 d에는 id, s, created 필드가 있습니다. s와 created는 각각 내용과 생성된 날을 의미합니다. 어떤 레코드들이 있는지 보기 위해, select * from d; 를 입력해 보았습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wi2.png&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6iKlo/btsjFSDeI8h/a96SgbTqNB4DlQ6024tWL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6iKlo/btsjFSDeI8h/a96SgbTqNB4DlQ6024tWL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6iKlo/btsjFSDeI8h/a96SgbTqNB4DlQ6024tWL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6iKlo%2FbtsjFSDeI8h%2Fa96SgbTqNB4DlQ6024tWL0%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;478&quot; height=&quot;100&quot; data-filename=&quot;wi2.png&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;100&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그랬더니 요래 나오는군요. created의 맨 마지막 부분에 +0900이 되어 있는 것으로 보아, 서울 시간으로 되어 있는 것이 분명하군요. 이제 저는 날짜별로 몇 개의 레코드가 생성되었는지 집계하고 싶습니다. 어떻게 하면 될까요? 날짜별로 집계 하려면 group by 날짜를 하면 되겠습니다. date 함수가 이를 해결해 줍니다. 다음에, 갯수를 출력하는 것은 그냥 간단하게 count 함수로 해 주면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;중요한 것은 어느 시간대로 할 것이냐인데요. 서울 시간대로 하겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wi5.png&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cs5X7K/btsjGZuMfME/siTYbwH0eACOk8w57AeiVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cs5X7K/btsjGZuMfME/siTYbwH0eACOk8w57AeiVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cs5X7K/btsjGZuMfME/siTYbwH0eACOk8w57AeiVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcs5X7K%2FbtsjGZuMfME%2FsiTYbwH0eACOk8w57AeiVk%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;445&quot; height=&quot;86&quot; data-filename=&quot;wi5.png&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;group by date(created at time zone 'Asia/Seoul')을 입력함으로써, 서울 시간 기준 날짜별로 몇 개씩이나 생성되었는지 집계합니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wi6.png&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bC8uDa/btsjJVE0yr9/1XecCY9nT1k5nR0KcoTaK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bC8uDa/btsjJVE0yr9/1XecCY9nT1k5nR0KcoTaK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bC8uDa/btsjJVE0yr9/1XecCY9nT1k5nR0KcoTaK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbC8uDa%2FbtsjJVE0yr9%2F1XecCY9nT1k5nR0KcoTaK0%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;473&quot; height=&quot;142&quot; data-filename=&quot;wi6.png&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;결과는 위와 같습니다. 이를 date_static라는 임시 결과로 내보낼 거에요.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wi3.png&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;93&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bionzT/btsjGnpguPj/QGORIMLbv8Fac6O9muboAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bionzT/btsjGnpguPj/QGORIMLbv8Fac6O9muboAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bionzT/btsjGnpguPj/QGORIMLbv8Fac6O9muboAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbionzT%2FbtsjGnpguPj%2FQGORIMLbv8Fac6O9muboAk%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;491&quot; height=&quot;93&quot; data-filename=&quot;wi3.png&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;93&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이제, 2023년 6월 1일부터 오늘까지의 날짜를 뽑아 봅시다. postgres에는 generate_series 함수가 있어요. 위 쿼리로 2023년 6월 1일부터, 오늘 날짜인 6월 12일까지 뽑게 됩니다. temp_dd:date는 date로 형변환을 합니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wi4.png&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4MdvO/btsjBupn9Ek/bdjmKHxwJZ30eZgxT0rJm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4MdvO/btsjBupn9Ek/bdjmKHxwJZ30eZgxT0rJm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4MdvO/btsjBupn9Ek/bdjmKHxwJZ30eZgxT0rJm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4MdvO%2FbtsjBupn9Ek%2FbdjmKHxwJZ30eZgxT0rJm0%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;474&quot; height=&quot;254&quot; data-filename=&quot;wi4.png&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;254&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;실행 결과는 위와 같습니다. 이를 date_t라는 이름의 임시 결과로 내보낼 거에요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;딱 봐도 두 쿼리. 간단해 보이진 않습니다. with 절을 여러 개 선언하는 방법은 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;with name1 as (...), name2 as (...) 요래 선언하면 되는데요.&lt;/u&gt;&lt;/span&gt; &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt; (콤마)로 구분&lt;/b&gt;&lt;/span&gt;하시면 됩니다. 13번째 줄까지 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wi7.png&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;239&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPUEzU/btsjGmw5HR8/GatZkYnXcE7OHKKcvTbthk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPUEzU/btsjGmw5HR8/GatZkYnXcE7OHKKcvTbthk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPUEzU/btsjGmw5HR8/GatZkYnXcE7OHKKcvTbthk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPUEzU%2FbtsjGmw5HR8%2FGatZkYnXcE7OHKKcvTbthk%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;591&quot; height=&quot;239&quot; data-filename=&quot;wi7.png&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;239&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;보시면 &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;with date_static as q, date_t as q' 꼴&lt;/u&gt;&lt;/span&gt;로 되어 있어요. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;이는 쿼리 q의 실행 결과는 date_static이라는 임시 결과로, 또 다른 쿼리 q'의 실행 결과는 date_t라는 임시 결과로 내보내겠다는 의미입니다.&lt;/b&gt;&lt;/span&gt; date_static은 dd와 cc가 있습니다. date_static의 dd는 날짜, 그리고 cc는 날짜별로 생성된 레코드 수를 의미해요. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;당연하게도 이 임시로 선언된 date_static과 date_t는 ;가 끝나기 전까지입니다.&lt;/u&gt;&lt;/span&gt; 만약에 13번째 줄에서 ;를 선언해서 끝내버렸다고 합시다. 그 경우 &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;그 다음에 이어지는 left outer join문에서 date_t와 date_static은 사용하지 못합니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다음 date_t의 dd는 2023년 6월 1일부터 오늘 날짜인 2023년 6월 12일을 의미합니다. 우리는 2023년 6월 1일부터 오늘 날짜까지 통계 데이터를 뽑아야 하는데, date_static에는 2023년 6월 1일 이후의 날짜가 없을 수도 있단 말이지요. 따라서, date_t와 date_static을 outer join 합니다.&amp;nbsp;&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wi8.png&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJuF93/btsjJSarO4n/HFgvBK9Ukl8jK6otpwfbBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJuF93/btsjJSarO4n/HFgvBK9Ukl8jK6otpwfbBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJuF93/btsjJSarO4n/HFgvBK9Ukl8jK6otpwfbBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJuF93%2FbtsjJSarO4n%2FHFgvBK9Ukl8jK6otpwfbBk%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;538&quot; height=&quot;256&quot; data-filename=&quot;wi8.png&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 요래 나오는데요. 2023년 6월 1일, 2023년 6월 2일 등은 우측 테이블인 date_static에 없었기 때문입니다. cc가 NULL일 때 0으로 카운트 되게 하기 위해서는 postgres에서는 colaesce를 사용하면 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wi9.png&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cR0w7R/btsjGnW8pIa/BwlkDR5B9i5KQ2emPpaEG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cR0w7R/btsjGnW8pIa/BwlkDR5B9i5KQ2emPpaEG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cR0w7R/btsjGnW8pIa/BwlkDR5B9i5KQ2emPpaEG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcR0w7R%2FbtsjGnW8pIa%2FBwlkDR5B9i5KQ2emPpaEG0%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;631&quot; height=&quot;241&quot; data-filename=&quot;wi9.png&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;241&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;14번째 줄에 select date_t.dd, coalesce(date_static.cc, 0)으로 바꿔 봅시다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wi10.png&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4UcnZ/btsjEly495D/Y0c91deOurxqSgFWI7kPBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4UcnZ/btsjEly495D/Y0c91deOurxqSgFWI7kPBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4UcnZ/btsjEly495D/Y0c91deOurxqSgFWI7kPBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4UcnZ%2FbtsjEly495D%2FY0c91deOurxqSgFWI7kPBK%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;461&quot; height=&quot;254&quot; data-filename=&quot;wi10.png&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;254&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 위와 같이 변경됨을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>코딩/Sql</category>
      <category>postgres</category>
      <category>with</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/905</guid>
      <comments>https://codingdog.tistory.com/entry/postgresql-with-%EC%97%AC%EB%9F%AC%EA%B0%9C-%EC%84%A0%EC%96%B8%ED%95%B4%EC%84%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry905comment</comments>
      <pubDate>Mon, 12 Jun 2023 23:53:35 +0900</pubDate>
    </item>
    <item>
      <title>fastapi pydantic 필드 단위로 동작하는 validator를 간단하게 알아봅시다</title>
      <link>https://codingdog.tistory.com/entry/fastapi-pydantic-%ED%95%84%EB%93%9C-%EB%8B%A8%EC%9C%84%EB%A1%9C-%EB%8F%99%EC%9E%91%ED%95%98%EB%8A%94-validator%EB%A5%BC-%EA%B0%84%EB%8B%A8%ED%95%98%EA%B2%8C-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;안녕하세요. 이번 시간에는 field 단위로 동작하는 validator에 대해 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저 아래 프로그램을 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;vt1.png&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OhWaP/btsjkajIexA/bH2aA0CZJU0zmJBRjkNK00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OhWaP/btsjkajIexA/bH2aA0CZJU0zmJBRjkNK00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OhWaP/btsjkajIexA/bH2aA0CZJU0zmJBRjkNK00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOhWaP%2FbtsjkajIexA%2FbH2aA0CZJU0zmJBRjkNK00%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;559&quot; height=&quot;299&quot; data-filename=&quot;vt1.png&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;299&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;&amp;nbsp;x: int = Field(gt=5)라고 되어 있습니다. pydantic의 Field인데요. gt는 greater than의 약자입니다. 즉, 5보다 커야 된다는 조건이 있어야 합니다. 9번째 줄에는 custom validator를 작성하였는데요. &quot;x&quot;는 필드명을 의미합니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;필드명 x에 대한 커스텀 벨리데이터 함수는 check_x를 의미해요.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;1번째 인자는 cls, 2번째 인자는 v인데요. v는 실제로 check_x에 들어온 필드 x의 값을 의미합니다. 보통 이 v값을 검증해서, 조건에 맞지 않으면 ValueError를 떨어트리게 됩니다. pre=True라고 되어 있는데요. 어떻게 실행되는지 보겠습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;vt2.png&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;319&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtGTH8/btsjlYbuSYA/5SfK6DkhvXr1Km9rVkr7F1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtGTH8/btsjlYbuSYA/5SfK6DkhvXr1Km9rVkr7F1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtGTH8/btsjlYbuSYA/5SfK6DkhvXr1Km9rVkr7F1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtGTH8%2FbtsjlYbuSYA%2F5SfK6DkhvXr1Km9rVkr7F1%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;743&quot; height=&quot;319&quot; data-filename=&quot;vt2.png&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;319&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;x에 -6을, y에 0을 넘겨주었습니다. 그러면, pre=True이므로 check_x가 실행됩니다. 들어온 v의 값이 10보다는 작았으므로, -v 값인 6이 리턴됩니다. 그 다음에 Field(ge=5) Validator로 넘어가는데요. 6은 5보다 크므로 참이 리턴됩니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;vt7.png&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;279&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czMVDK/btsjlWq7P9y/22CFb7HJlTdpKbaoiv6xWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czMVDK/btsjlWq7P9y/22CFb7HJlTdpKbaoiv6xWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czMVDK/btsjlWq7P9y/22CFb7HJlTdpKbaoiv6xWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczMVDK%2FbtsjlWq7P9y%2F22CFb7HJlTdpKbaoiv6xWk%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;470&quot; height=&quot;279&quot; data-filename=&quot;vt7.png&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;279&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;post /res가 호출되면, 그대로 res_request.x와 res_request.y를 돌려주게 되는데요. validation을 하는 과정에서, res_request.x의 값에 -1이 곱해집니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;vt3.png&quot; data-origin-width=&quot;561&quot; data-origin-height=&quot;151&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oM5TJ/btsjk53hYYU/DwTqsDbKntcqLtLtiPvML1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oM5TJ/btsjk53hYYU/DwTqsDbKntcqLtLtiPvML1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oM5TJ/btsjk53hYYU/DwTqsDbKntcqLtLtiPvML1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoM5TJ%2Fbtsjk53hYYU%2FDwTqsDbKntcqLtLtiPvML1%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;561&quot; height=&quot;151&quot; data-filename=&quot;vt3.png&quot; data-origin-width=&quot;561&quot; data-origin-height=&quot;151&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;결과는 x가 6, y가 0이 나오게 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;vt4.png&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CCpcW/btsjj8M2K4a/nLpZpkliKJZLKIG0ie48UK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CCpcW/btsjj8M2K4a/nLpZpkliKJZLKIG0ie48UK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CCpcW/btsjj8M2K4a/nLpZpkliKJZLKIG0ie48UK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCCpcW%2Fbtsjj8M2K4a%2FnLpZpkliKJZLKIG0ie48UK%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;544&quot; height=&quot;298&quot; data-filename=&quot;vt4.png&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;298&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;반대로 이 경우에는 어떨까요? Field(gt=5) 먼저 수행되게 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;vt5.png&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brmf1Z/btsjkE5W1Ih/TfvBkjopYLkawuRK7Wl4T1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brmf1Z/btsjkE5W1Ih/TfvBkjopYLkawuRK7Wl4T1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brmf1Z/btsjkE5W1Ih/TfvBkjopYLkawuRK7Wl4T1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbrmf1Z%2FbtsjkE5W1Ih%2FTfvBkjopYLkawuRK7Wl4T1%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;736&quot; height=&quot;246&quot; data-filename=&quot;vt5.png&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다시 post /res에 요청을 요래 날려보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;vt6.png&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;343&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6QP8Q/btsjlmDCnHh/LZ47qtyOS5iP8o4jGshzRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6QP8Q/btsjlmDCnHh/LZ47qtyOS5iP8o4jGshzRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6QP8Q/btsjlmDCnHh/LZ47qtyOS5iP8o4jGshzRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6QP8Q%2FbtsjlmDCnHh%2FLZ47qtyOS5iP8o4jGshzRK%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;564&quot; height=&quot;343&quot; data-filename=&quot;vt6.png&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;343&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 아까와 다르게 not_gt 에러가 뜨면서 422가 떨어짐을 알 수 있어요. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;int는 gt, ge, lt, le 등을 상당히 많이 쓰니 알아두면 좋습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;vt8.png&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnBZCW/btsjlZVMZoT/UyknAEeKzKPv2KO64gnaIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnBZCW/btsjlZVMZoT/UyknAEeKzKPv2KO64gnaIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnBZCW/btsjlZVMZoT/UyknAEeKzKPv2KO64gnaIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnBZCW%2FbtsjlZVMZoT%2FUyknAEeKzKPv2KO64gnaIk%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;434&quot; height=&quot;142&quot; data-filename=&quot;vt8.png&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;문자열의 경우도 검증을 많이 합니다. 이 중에서 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;제가 자주 쓰는 regex만 알아보겠습니다.&lt;/u&gt;&lt;/span&gt; regex는 패턴에 맞지 않으면 실패하게 됩니다. 예를 들어, ResRequest schema의 x는 str이고, &quot;^[0-9a-zA-Z]{1,5}$&quot;만 허용한다고 해 보겠습니다. 이것은 대소문자나 숫자로만 이루어진 길이 1에서 5 사이의 문자열만 허용한다는 의미입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;vt9.png&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPS82o/btsjjadxisd/ggA9QLKbRm0oGpUmbsoTZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPS82o/btsjjadxisd/ggA9QLKbRm0oGpUmbsoTZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPS82o/btsjjadxisd/ggA9QLKbRm0oGpUmbsoTZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPS82o%2Fbtsjjadxisd%2FggA9QLKbRm0oGpUmbsoTZK%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;341&quot; height=&quot;280&quot; data-filename=&quot;vt9.png&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;post /res 요청이 날라왔을 때 불리는 메서드는 위와 같습니다. 이제 post /res 요청을 날려보겠습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;vt10.png&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bq1zji/btsjkFX6HUw/tVvkevMKcWjIjIJCdUvlS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bq1zji/btsjkFX6HUw/tVvkevMKcWjIjIJCdUvlS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bq1zji/btsjkFX6HUw/tVvkevMKcWjIjIJCdUvlS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbq1zji%2FbtsjkFX6HUw%2FtVvkevMKcWjIjIJCdUvlS1%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;717&quot; height=&quot;225&quot; data-filename=&quot;vt10.png&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;문자열 &quot;12-45&quot;를 보내보겠습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;vt11.png&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xCV48/btsjlXjiJjl/E08pvBK3zKvZoUIaML0ZGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xCV48/btsjlXjiJjl/E08pvBK3zKvZoUIaML0ZGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xCV48/btsjlXjiJjl/E08pvBK3zKvZoUIaML0ZGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxCV48%2FbtsjlXjiJjl%2FE08pvBK3zKvZoUIaML0ZGk%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;575&quot; height=&quot;345&quot; data-filename=&quot;vt11.png&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;그러면, 정규식에 맞지 않기 때문에, 422가 떨어지게 됩니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>웹/FASTAPI</category>
      <category>FastAPI</category>
      <category>pydantic</category>
      <category>Validation</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/904</guid>
      <comments>https://codingdog.tistory.com/entry/fastapi-pydantic-%ED%95%84%EB%93%9C-%EB%8B%A8%EC%9C%84%EB%A1%9C-%EB%8F%99%EC%9E%91%ED%95%98%EB%8A%94-validator%EB%A5%BC-%EA%B0%84%EB%8B%A8%ED%95%98%EA%B2%8C-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry904comment</comments>
      <pubDate>Fri, 9 Jun 2023 23:47:11 +0900</pubDate>
    </item>
    <item>
      <title>fastapi pydantic root validator를 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/fastapi-pydantic-root-validator%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;fastapi의 pydantic에는 validator가 있습니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;이 중에는 전체 schema에 대해 검증을 하는 root_validator가 있습니다.&lt;/u&gt;&lt;/span&gt; 쉽게 이야기 하면, &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;필드 값들의 조합이 맞는지 검증하기 위해 주로 쓰입니다.&lt;/b&gt;&lt;/span&gt; 대표적인 예로 비밀번호 재설정의 경우, 필드 2개가 있을 겁니다. 보통, newPassword, checkNewPassword로 할 텐데요. 이 두 개가 같아야 하는 검증 조건을 추가해야 할 때 쓰여요. &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;두 개의 필드 값을 비교하고 있잖아요?&lt;/u&gt;&lt;/span&gt; 예제를 통해 어떻게 쓰는지 간단하게 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rov1.png&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/se4cz/btsiQkzE5WJ/22Wb8omxX55EGJkd295qmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/se4cz/btsiQkzE5WJ/22Wb8omxX55EGJkd295qmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/se4cz/btsiQkzE5WJ/22Wb8omxX55EGJkd295qmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fse4cz%2FbtsiQkzE5WJ%2F22Wb8omxX55EGJkd295qmK%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;475&quot; height=&quot;282&quot; data-filename=&quot;rov1.png&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;282&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저 router입니다. ResRequest 스키마를 받아서 처리를 해 주는 post /res가 있습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rov2.png&quot; data-origin-width=&quot;427&quot; data-origin-height=&quot;279&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br1MlZ/btsiOK6Ewsd/eTMsXOm1dSjTSu3Je2KPUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br1MlZ/btsiOK6Ewsd/eTMsXOm1dSjTSu3Je2KPUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br1MlZ/btsiOK6Ewsd/eTMsXOm1dSjTSu3Je2KPUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr1MlZ%2FbtsiOK6Ewsd%2FeTMsXOm1dSjTSu3Je2KPUk%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;427&quot; height=&quot;279&quot; data-filename=&quot;rov2.png&quot; data-origin-width=&quot;427&quot; data-origin-height=&quot;279&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;schema.py에 있는 ResRequest입니다. 정수를 받는 x와 y가 있습니다. check_x는 필드 x의 값을 체크한 다음에 값을 리턴해 줍니다. 여기에서는 -1을 곱해서 리턴해 주었습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rov3.png&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d5WQu0/btsiQ6HWRqF/F7cLJEqWgTZ0ZuZKmoyork/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d5WQu0/btsiQ6HWRqF/F7cLJEqWgTZ0ZuZKmoyork/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d5WQu0/btsiQ6HWRqF/F7cLJEqWgTZ0ZuZKmoyork/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd5WQu0%2FbtsiQ6HWRqF%2FF7cLJEqWgTZ0ZuZKmoyork%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;562&quot; height=&quot;135&quot; data-filename=&quot;rov3.png&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;135&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다음에 @root_validator입니다. cls와 values를 받습니다. 그리고 pre=True라고 되어 있습니다. 아까 validator(&quot;x&quot;)는 pre 옵션이 붙어 있지 않았는데 무엇을 의미할까요? 이는, root validator가 res_request_validator x를 validation 하는 함수보다 먼저 수행된다는 것을 의미합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;values.get(&quot;x&quot;), values.get(&quot;y&quot;)로 실제 필드 이름이 x와 y에 들어있는 값을 얻어올 수 있습니다. 저는 이 두 필드값을 가지고 검증을 하였는데요. x + y가 0보다 작으면 ValueError를 떨어트렸습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rov4.png&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;301&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qxVKY/btsiOKFCiI4/ctw3lCfU9lqYWQJPwZ4f8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qxVKY/btsiOKFCiI4/ctw3lCfU9lqYWQJPwZ4f8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qxVKY/btsiOKFCiI4/ctw3lCfU9lqYWQJPwZ4f8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqxVKY%2FbtsiOKFCiI4%2Fctw3lCfU9lqYWQJPwZ4f8k%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;697&quot; height=&quot;301&quot; data-filename=&quot;rov4.png&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;301&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이제 /res에 필드 x의 값 -20, y의 값을 3으로 하고 보내봅시다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rov5.png&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WYscg/btsiOH95uzg/R8QH2FcgONXs7io5sEx4u0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WYscg/btsiOH95uzg/R8QH2FcgONXs7io5sEx4u0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WYscg/btsiOH95uzg/R8QH2FcgONXs7io5sEx4u0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWYscg%2FbtsiOH95uzg%2FR8QH2FcgONXs7io5sEx4u0%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;526&quot; height=&quot;299&quot; data-filename=&quot;rov5.png&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;299&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그랬더니 422가 나오면서 x + y가 0보다 크거나 같아야 한다고 뜹니다. 왜냐하면 x와 y값을 더하면 -17 &amp;lt; 0이기 때문입니다. 0보다 크거나 같다는 조건을 만족하지 않습니다. 당연하게도 check_x 함수를 타지 않았습니다. 왜냐하면 먼저 root_validator가 나와버렸기 때문입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rov6.png&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkS4Nw/btsiQ68ZKI8/sK6NdsjlMl0kkKV597txE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkS4Nw/btsiQ68ZKI8/sK6NdsjlMl0kkKV597txE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkS4Nw/btsiQ68ZKI8/sK6NdsjlMl0kkKV597txE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkS4Nw%2FbtsiQ68ZKI8%2FsK6NdsjlMl0kkKV597txE0%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;695&quot; height=&quot;314&quot; data-filename=&quot;rov6.png&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이제 x에 -3, y에 3을 넘겨봅시다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rov7.png&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P5fxw/btsiU52XszE/aupQHAmb1JqvGlEWwNKzLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P5fxw/btsiU52XszE/aupQHAmb1JqvGlEWwNKzLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P5fxw/btsiU52XszE/aupQHAmb1JqvGlEWwNKzLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP5fxw%2FbtsiU52XszE%2FaupQHAmb1JqvGlEWwNKzLK%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;524&quot; height=&quot;160&quot; data-filename=&quot;rov7.png&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 위와 같은 결과가 response로 날라오게 됩니다. 이건 왜일까요? root_validator가 통과하고, 필드 x에 대한 validator가 실행되었기 때문입니다. check_x는 x를 -x로 바꿔주는 것이기 때문에, request로 날라온 x 값에 -1을 곰한 3이 response로 나오게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;여기까지 정리. root_validator는 schema의 여러 필드를 한꺼번에 검증하기 위해 사용한다. 예를 들자면 필드 x와 y의 값으로 검증을 해야 할 때. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;혹은 조합이 맞는지 틀린지 검증할 때 많이 사용합니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rov8.png&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;283&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmlCiy/btsiQkzE5WU/1uUOBKjAM0Gpb70l5OfLE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmlCiy/btsiQkzE5WU/1uUOBKjAM0Gpb70l5OfLE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmlCiy/btsiQkzE5WU/1uUOBKjAM0Gpb70l5OfLE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmlCiy%2FbtsiQkzE5WU%2F1uUOBKjAM0Gpb70l5OfLE0%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;430&quot; height=&quot;283&quot; data-filename=&quot;rov8.png&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;283&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;check_x의 validator에 pre=True를 넣어주었습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rov9.png&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dMlEM2/btsiOhX1bZE/xdujOolOP7x1MRGlFOFACK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dMlEM2/btsiOhX1bZE/xdujOolOP7x1MRGlFOFACK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dMlEM2/btsiOhX1bZE/xdujOolOP7x1MRGlFOFACK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdMlEM2%2FbtsiOhX1bZE%2FxdujOolOP7x1MRGlFOFACK%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;584&quot; height=&quot;135&quot; data-filename=&quot;rov9.png&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;135&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다음에 root_validator는 pre 옵션을 넣어주지 않았습니다. 이 경우, check_x 다음에 res_request_validator 순으로 수행됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rov10.png&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XVKD8/btsiWR4vITa/tWy5c6BiBKxKQMS1zMcLr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XVKD8/btsiWR4vITa/tWy5c6BiBKxKQMS1zMcLr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XVKD8/btsiWR4vITa/tWy5c6BiBKxKQMS1zMcLr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXVKD8%2FbtsiWR4vITa%2FtWy5c6BiBKxKQMS1zMcLr1%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;302&quot; data-filename=&quot;rov10.png&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;302&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;이제 요청을 요래 다시 날려보겠습니다. 그러면, check_x에 의해 x가 20이 됩니다. 이 상태에서 root_validator가 수행됩니다. x와 y 값의 합은 20에 3을 더한 23입니다. 이는 0보다는 큰 수치입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rov11.png&quot; data-origin-width=&quot;529&quot; data-origin-height=&quot;161&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QDbQn/btsiJ8m4ZfT/WsmiF4KjGJJ5MQgSk1SI91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QDbQn/btsiJ8m4ZfT/WsmiF4KjGJJ5MQgSk1SI91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QDbQn/btsiJ8m4ZfT/WsmiF4KjGJJ5MQgSk1SI91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQDbQn%2FbtsiJ8m4ZfT%2FWsmiF4KjGJJ5MQgSk1SI91%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;529&quot; height=&quot;161&quot; data-filename=&quot;rov11.png&quot; data-origin-width=&quot;529&quot; data-origin-height=&quot;161&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;따라서 아까와는 다르게 에러 없이 수행되었음을 볼 수 있습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>웹/FASTAPI</category>
      <category>FastAPI</category>
      <category>validator</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/903</guid>
      <comments>https://codingdog.tistory.com/entry/fastapi-pydantic-root-validator%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry903comment</comments>
      <pubDate>Tue, 6 Jun 2023 23:46:13 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 한 줄을 입력받을 때 쓰는 input 함수에 대해서 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%95%9C-%EC%A4%84%EC%9D%84-%EC%9E%85%EB%A0%A5%EB%B0%9B%EC%9D%84-%EB%95%8C-%EC%93%B0%EB%8A%94-input-%ED%95%A8%EC%88%98%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;파이썬에는 한 줄을 입력받기 위한 함수로 sys.stdin의 readline만 있는 것이 아닙니다. 기본적으로 input()이라는 built in 함수를 제공합니다. 저 함수가 무엇인지 간단하게 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;in1.png&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;73&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfhKi0/btsiJ8kZJwD/YyJeilMXH8IXhd9U4j1jE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfhKi0/btsiJ8kZJwD/YyJeilMXH8IXhd9U4j1jE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfhKi0/btsiJ8kZJwD/YyJeilMXH8IXhd9U4j1jE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfhKi0%2FbtsiJ8kZJwD%2FYyJeilMXH8IXhd9U4j1jE1%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;413&quot; height=&quot;73&quot; data-filename=&quot;in1.png&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;73&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저 1.txt에는 위와 같은 내용이 있습니다. 1 abcde, 그리고 2. 이렇게 2개의 줄이 있습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;in2.png&quot; data-origin-width=&quot;345&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ck1qEH/btsivf6VDUa/JgjtT3ZyTdMwrnRtPsamY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ck1qEH/btsivf6VDUa/JgjtT3ZyTdMwrnRtPsamY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ck1qEH/btsivf6VDUa/JgjtT3ZyTdMwrnRtPsamY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fck1qEH%2Fbtsivf6VDUa%2FJgjtT3ZyTdMwrnRtPsamY0%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;345&quot; height=&quot;250&quot; data-filename=&quot;in2.png&quot; data-origin-width=&quot;345&quot; data-origin-height=&quot;250&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;input 함수를 읽어봅시다. standard input (stdin)으로부터 string을 읽는다고 되어 있습니다. 그리고 개행 문자는 strip 된다고 되어 있습니다.&amp;nbsp;&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;in3.png&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;67&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XnDpI/btsiJzQtCay/RDRNSxK42HYLV4sNTQKWCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XnDpI/btsiJzQtCay/RDRNSxK42HYLV4sNTQKWCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XnDpI/btsiJzQtCay/RDRNSxK42HYLV4sNTQKWCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXnDpI%2FbtsiJzQtCay%2FRDRNSxK42HYLV4sNTQKWCK%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;349&quot; height=&quot;67&quot; data-filename=&quot;in3.png&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;67&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;예제를 하나 보겠습니다. for loop로 5번 루프를 돌립니다. 각 loop마다 input()을 호출하고, 받은 문자열을 출력합니다. 입력을 1.txt에서 받아보겠습니다. 윈도우 powershell에서는 아직 redirection이 지원되지는 않기 때문에, type 명령어와 |를 써야 합니다. type으로 파일의 내용을 출력하고, 파이프로 python main.py에 type의 결과값을 python ~의 입력값으로 넘기는 식입니다. &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;a style=&quot;color: #f89009;&quot; href=&quot;https://codingdog.tistory.com/entry/window-type-%EB%AA%85%EB%A0%B9%EC%96%B4%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4%EC%84%9C-redirection-%EC%B2%98%EB%A6%AC%EB%A5%BC-%ED%95%B4-%EB%B4%85%EC%8B%9C%EB%8B%A4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;&lt;/span&gt;에 설명을 간단하게 해 놓았으니 참고해 보시면 좋겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;물론 git bash를 설치하면 그런 거 없이 그냥 redirect 문자를 쓰시면 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;in4.png&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LafsA/btsiyV7UcBW/FlnbaGIrs34lFlItIHlxbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LafsA/btsiyV7UcBW/FlnbaGIrs34lFlItIHlxbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LafsA/btsiyV7UcBW/FlnbaGIrs34lFlItIHlxbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLafsA%2FbtsiyV7UcBW%2FFlnbaGIrs34lFlItIHlxbK%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;620&quot; height=&quot;207&quot; data-filename=&quot;in4.png&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;207&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;결과가 어떻게 나올까요? 1번째 줄에 1 abcde, 2번째 줄에 2가 출력됩니다. 그리고, EOFError가 나옵니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;in5.png&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Rn6R0/btsiuK0oUzo/9cCx3adVs8n4c2KsGSjGZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Rn6R0/btsiuK0oUzo/9cCx3adVs8n4c2KsGSjGZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Rn6R0/btsiuK0oUzo/9cCx3adVs8n4c2KsGSjGZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRn6R0%2FbtsiuK0oUzo%2F9cCx3adVs8n4c2KsGSjGZ0%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;350&quot; height=&quot;132&quot; data-filename=&quot;in5.png&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;132&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그렇기 때문에, try except로 input() 을 호출하는 부분을 감싸주어야 합니다. 파일의 끝을 만나서 더 이상 입력을 받을 수 없는 경우 EOFError를 발생시키기 때문입니다. EOFError에 걸렸을 때, while loop를 빠져나가기 위해 break를 걸었음을 볼 수 있습니다. 이제 다시, 실행시켜 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;in6.png&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCidVv/btsitUibmoP/0QPkyEkRY3M9X4jvbbwkvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCidVv/btsitUibmoP/0QPkyEkRY3M9X4jvbbwkvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCidVv/btsitUibmoP/0QPkyEkRY3M9X4jvbbwkvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCidVv%2FbtsitUibmoP%2F0QPkyEkRY3M9X4jvbbwkvK%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;622&quot; height=&quot;94&quot; data-filename=&quot;in6.png&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;94&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt; 1 abcde, 2가 정확하게 출력되고 종료되었음을 알 수 있습니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;정리하면 input 함수는 한 줄을 입력받는 함수&lt;/u&gt;&lt;/span&gt;인데, &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;파일의 끝을 만나면 EOFError 에러를 발생시킵니다.&lt;/b&gt;&lt;/span&gt; 고로, &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;파일의 끝을 판단할 때 EOFError를 catch&lt;/u&gt;&lt;/span&gt; 하면 됩니다. sys.stdin의 readline보다는 느리기 때문에 빠른 입출력이 필요한 경우,&amp;nbsp; 이 함수 대신 sys.stdin의 readline을 사용하는 것을 권장합니다. &lt;s&gt;제가 출제한 모의 코딩테스트에 유독 그런 것이 많을 겁니다.&lt;/s&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;in7.png&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJrlZX/btsiuJHaBNt/rTJie38TEMsMGzjvRvlPk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJrlZX/btsiuJHaBNt/rTJie38TEMsMGzjvRvlPk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJrlZX/btsiuJHaBNt/rTJie38TEMsMGzjvRvlPk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJrlZX%2FbtsiuJHaBNt%2FrTJie38TEMsMGzjvRvlPk0%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;368&quot; height=&quot;74&quot; data-filename=&quot;in7.png&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이제 예제 하나만 더 보겠습니다. 1.txt에 있는 2개의 수가 있습니다. 이 둘을 입력받아서 더한 값을 출력하려고 합니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;in8.png&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzyoWy/btsiBMCSPT4/qQIzKJKn6bZbuF5jZ4SUa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzyoWy/btsiBMCSPT4/qQIzKJKn6bZbuF5jZ4SUa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzyoWy/btsiBMCSPT4/qQIzKJKn6bZbuF5jZ4SUa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzyoWy%2FbtsiBMCSPT4%2FqQIzKJKn6bZbuF5jZ4SUa0%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;378&quot; height=&quot;66&quot; data-filename=&quot;in8.png&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;66&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이럴 때, split() 함수와 map 함수를 이용하면 됩니다. 먼저, split()로 white 문자를 기준으로 토큰을 분리합니다. 그러면, [&quot;3&quot;, &quot;5&quot;]가 될 겁니다. 이제, 이 원소들에 int 함수를 apply 합니다. 이제 &quot;3&quot;, &quot;5&quot;가 3, 5가 됩니다. 적용된 결과를 소모시키면 됩니다. n과 m은 각각 3과 5를 가리킵니다. map 함수에 대해 간단하게 원리를 보려면&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;이&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;a style=&quot;color: #f89009;&quot; href=&quot;https://codingdog.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-itertools-starmap-%ED%95%A8%EC%88%98-%EB%B0%B1%EC%A4%80-15649%EB%B2%88%EC%9D%84-%ED%92%80-%EB%95%8C-%EC%9C%A0%EC%9A%A9%ED%95%98%EA%B2%8C-%EC%82%AC%EC%9A%A9%EB%90%9C%EB%8B%A4&quot;&gt;링크&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;를 참조하시면 좋겠습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이제 ans에 n과 m을 더한 값을 넣고 값 ans를 출력합니다.&amp;nbsp;&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;in9.png&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pz1Mh/btsizd1NlhL/atqaEBzteB8hwwBO2KvPm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pz1Mh/btsizd1NlhL/atqaEBzteB8hwwBO2KvPm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pz1Mh/btsizd1NlhL/atqaEBzteB8hwwBO2KvPm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpz1Mh%2Fbtsizd1NlhL%2FatqaEBzteB8hwwBO2KvPm1%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;627&quot; height=&quot;66&quot; data-filename=&quot;in9.png&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;66&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;&amp;nbsp;결과는 8이 나옵니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>코딩/파이선</category>
      <category>input</category>
      <category>파이썬</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/902</guid>
      <comments>https://codingdog.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%95%9C-%EC%A4%84%EC%9D%84-%EC%9E%85%EB%A0%A5%EB%B0%9B%EC%9D%84-%EB%95%8C-%EC%93%B0%EB%8A%94-input-%ED%95%A8%EC%88%98%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry902comment</comments>
      <pubDate>Mon, 5 Jun 2023 00:57:30 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 sys.stdin에 있는 readline 함수로 여러 줄 입력을 받아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-sysstdin%EC%97%90-%EC%9E%88%EB%8A%94-readline-%ED%95%A8%EC%88%98%EB%A1%9C-%EC%97%AC%EB%9F%AC-%EC%A4%84-%EC%9E%85%EB%A0%A5%EC%9D%84-%EB%B0%9B%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;파이썬에는 문자열을 입력받는 방법이 몇 가지 있습니다. 백준에서는 sys.stdin에 있는 readline을 많이 쓰는데요. 간단하게 알아보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저 python의 sys.stdin에 있는 readline은 한 줄씩 입력을 받는데요. 아무 것도 없는 경우에 빈 배열을 돌려줍니다. 만약에 한 줄에 아무 것도 없고 개행만 있는 경우에는, 개행이 있기 때문에 이야기가 달라집니다. 예제를 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rl1.png&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KLa24/btsizd1kxsy/a9BaEQqJTQBTKPDkRnib80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KLa24/btsizd1kxsy/a9BaEQqJTQBTKPDkRnib80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KLa24/btsizd1kxsy/a9BaEQqJTQBTKPDkRnib80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKLa24%2Fbtsizd1kxsy%2Fa9BaEQqJTQBTKPDkRnib80%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;372&quot; height=&quot;112&quot; data-filename=&quot;rl1.png&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;&amp;nbsp;우리는 빈 배열이 리턴되면, 루프에서 빠져나가야 한다는 것을 알고 있습니다. while True: 로 계속 입력을 받습니다. 그런데 if not s: 이면 break를 겁니다. 배열의 경우 빈 배열일 때 해당 조건이 참이 되므로, 이 프로그램은 맞게 실행되는 것처럼 보입니다. 대부분의 백준 문제의 경우 요래 해도 별 상관은 없습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rl2.png&quot; data-origin-width=&quot;366&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLZflx/btsiuBBVLob/KUVPLz8mnC9zpo5hgckOg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLZflx/btsiuBBVLob/KUVPLz8mnC9zpo5hgckOg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLZflx/btsiuBBVLob/KUVPLz8mnC9zpo5hgckOg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLZflx%2FbtsiuBBVLob%2FKUVPLz8mnC9zpo5hgckOg0%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;366&quot; height=&quot;175&quot; data-filename=&quot;rl2.png&quot; data-origin-width=&quot;366&quot; data-origin-height=&quot;175&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;1.txt는 위와 같습니다. 중간에 안 보이는 문자들이 들어가 있는 줄들이 있는데요. 하나는 그냥 빈 문자열이고, 다른 하나는 탭 문자만 들어갔습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rl6.png&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;79&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVgJW9/btsis8HwP5v/AQYEJxzMV47beqgSUfkWWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVgJW9/btsis8HwP5v/AQYEJxzMV47beqgSUfkWWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVgJW9/btsis8HwP5v/AQYEJxzMV47beqgSUfkWWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVgJW9%2Fbtsis8HwP5v%2FAQYEJxzMV47beqgSUfkWWK%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;572&quot; height=&quot;79&quot; data-filename=&quot;rl6.png&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;79&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;xxd로 보면 위와 같습니다. 0a가 개행인 부분이고요. 09는 탭 문자를 의미합니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rl3.png&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4FTzK/btsiu02yYwi/eNniiK569Yo0YZt8uQt5Y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4FTzK/btsiu02yYwi/eNniiK569Yo0YZt8uQt5Y0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4FTzK/btsiu02yYwi/eNniiK569Yo0YZt8uQt5Y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4FTzK%2Fbtsiu02yYwi%2FeNniiK569Yo0YZt8uQt5Y0%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;425&quot; height=&quot;117&quot; data-filename=&quot;rl3.png&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;결과는 a, b, c, d만 입력받았습니다. 왜냐하면, sys.stdin.readline().strip() 때문에, 양 끝의 개행, 탭 등이 제거되었기 때문입니다. 아무런 인자가 제공되지 않았으므로 화이트 문자들이 제거되었고, 개행과 탭은 화이트 문자에 속합니다. 고로, 5번째 줄을 입력받고 함수 strip으로 처리했을 때 빈 문자열이 나올 수 밖에 없을 겁니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rl4.png&quot; data-origin-width=&quot;358&quot; data-origin-height=&quot;127&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cerLgg/btsis1nP19U/0PVtH4zYQC0bb9XuirgkHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cerLgg/btsis1nP19U/0PVtH4zYQC0bb9XuirgkHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cerLgg/btsis1nP19U/0PVtH4zYQC0bb9XuirgkHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcerLgg%2Fbtsis1nP19U%2F0PVtH4zYQC0bb9XuirgkHK%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;358&quot; height=&quot;127&quot; data-filename=&quot;rl4.png&quot; data-origin-width=&quot;358&quot; data-origin-height=&quot;127&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt; 어떻게 고치면 될까요? 먼저 sys.stdin.readline()을 먼저 받습니다. 이 결과를 가지고 검사를 하면 됩니다. 만약에 파일의 끝이여서 더 이상 받을 수 없는 경우, if not (s := input()): 에 의해 break가 걸립니다. :=를 왈러스 연산자라 하는데요. 해당 연산자에 대한 간단한 설명은 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;a style=&quot;color: #f89009;&quot; href=&quot;https://codingdog.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%99%88%EB%9F%AC%EC%8A%A4-%EC%97%B0%EC%82%B0%EC%9E%90%EC%97%90-%EB%8C%80%ED%95%B4-%EA%B0%84%EB%8B%A8%ED%95%98%EA%B2%8C-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;&lt;/span&gt; 글을 참고하시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;[관련글]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #6164c6; font-family: 'Noto Sans Light';&quot;&gt;&lt;a style=&quot;color: #6164c6;&quot; href=&quot;https://codingdog.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%99%88%EB%9F%AC%EC%8A%A4-%EC%97%B0%EC%82%B0%EC%9E%90%EC%97%90-%EB%8C%80%ED%95%B4-%EA%B0%84%EB%8B%A8%ED%95%98%EA%B2%8C-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;파이썬 왈러스 연산자에 대해 간단하게 알아봅시다.&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rl5.png&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Mow0J/btsisQz7q1G/3zoHQhKvRu0NLCkAT0GoC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Mow0J/btsisQz7q1G/3zoHQhKvRu0NLCkAT0GoC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Mow0J/btsisQz7q1G/3zoHQhKvRu0NLCkAT0GoC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMow0J%2FbtsisQz7q1G%2F3zoHQhKvRu0NLCkAT0GoC0%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;418&quot; height=&quot;164&quot; data-filename=&quot;rl5.png&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다시 실행시켜 보니, 이번에는 의도한 대로 제대로 받았음을 알 수 있습니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;정리하면 sys.stdin.readline()으로 입력을 계속 받습니다.&lt;/u&gt;&lt;/span&gt; &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;만약에 리턴 값이 빈 문자열이라면 반복문을 빠져나오게&lt;/b&gt; &lt;/span&gt;하면 됩니다. 그런데 7번째 줄에 s = s.strip()이 들어갔습니다. 이는 왜 그럴까요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rl7.png&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqAYsm/btsivP0K6w8/7OZnUgdDYkkPXbDubkqsgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqAYsm/btsivP0K6w8/7OZnUgdDYkkPXbDubkqsgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqAYsm/btsivP0K6w8/7OZnUgdDYkkPXbDubkqsgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqAYsm%2FbtsivP0K6w8%2F7OZnUgdDYkkPXbDubkqsgK%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;386&quot; height=&quot;130&quot; data-filename=&quot;rl7.png&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;130&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;&amp;nbsp;문자열에 저장되어 있는 문자들을 수로 변환시켜서 출력해 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rl8.png&quot; data-origin-width=&quot;415&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pyB4t/btsit0PzZhH/4CQmLNFYCCCMXyM5AuWGt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pyB4t/btsit0PzZhH/4CQmLNFYCCCMXyM5AuWGt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pyB4t/btsit0PzZhH/4CQmLNFYCCCMXyM5AuWGt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpyB4t%2Fbtsit0PzZhH%2F4CQmLNFYCCCMXyM5AuWGt0%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;415&quot; height=&quot;165&quot; data-filename=&quot;rl8.png&quot; data-origin-width=&quot;415&quot; data-origin-height=&quot;165&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 요래 되는데요. 10은 개행을, 9는 탭을 의미합니다. 불필요한 개행이 붙었기 때문에 strip() 처리를 하지 않으면 개행이 한 번 더 출력되는 상황이 벌어지게 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rl9.png&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OM6KO/btsit09P11o/vAFHkk9ix14Pk5GmzoZB60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OM6KO/btsit09P11o/vAFHkk9ix14Pk5GmzoZB60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OM6KO/btsit09P11o/vAFHkk9ix14Pk5GmzoZB60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOM6KO%2Fbtsit09P11o%2FvAFHkk9ix14Pk5GmzoZB60%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;344&quot; height=&quot;129&quot; data-filename=&quot;rl9.png&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;129&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;s.strip()의 경우에는 어떨까요?&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rl10.png&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Fs1AF/btsitGwZstb/bhb5HV1zgxhurdff17CcYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Fs1AF/btsitGwZstb/bhb5HV1zgxhurdff17CcYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Fs1AF/btsitGwZstb/bhb5HV1zgxhurdff17CcYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFs1AF%2FbtsitGwZstb%2Fbhb5HV1zgxhurdff17CcYk%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;421&quot; height=&quot;164&quot; data-filename=&quot;rl10.png&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;이 경우 10, 9와 같은 양 끝에 붙은 white 문자들이 제거되게 됩니다.&lt;/u&gt;&lt;/span&gt; 만약에 개행 문자인 '\n'만 제거하려면 strip()에 인자를 넣어 버리면 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rf13.png&quot; data-origin-width=&quot;376&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rCOCY/btsiuMpUddQ/ammzavAKmtp3JImeKrfiqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rCOCY/btsiuMpUddQ/ammzavAKmtp3JImeKrfiqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rCOCY/btsiuMpUddQ/ammzavAKmtp3JImeKrfiqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrCOCY%2FbtsiuMpUddQ%2FammzavAKmtp3JImeKrfiqK%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;376&quot; height=&quot;129&quot; data-filename=&quot;rf13.png&quot; data-origin-width=&quot;376&quot; data-origin-height=&quot;129&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;s.strip('\n')은 양 끝에 붙은 '\n'을 제거해 줍니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rl12.png&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAC8Jg/btsizcVFGzu/nuV9YzxoaQx2X2e5LeXyDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAC8Jg/btsizcVFGzu/nuV9YzxoaQx2X2e5LeXyDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAC8Jg/btsizcVFGzu/nuV9YzxoaQx2X2e5LeXyDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAC8Jg%2FbtsizcVFGzu%2FnuV9YzxoaQx2X2e5LeXyDk%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;418&quot; height=&quot;162&quot; data-filename=&quot;rl12.png&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다시 실행시켜 보면, 아까와는 다르게 10, 즉 양 끝에 붙은 개행문자만 제거되었음을 볼 수 있습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>코딩/파이선</category>
      <category>python</category>
      <category>readline</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/901</guid>
      <comments>https://codingdog.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-sysstdin%EC%97%90-%EC%9E%88%EB%8A%94-readline-%ED%95%A8%EC%88%98%EB%A1%9C-%EC%97%AC%EB%9F%AC-%EC%A4%84-%EC%9E%85%EB%A0%A5%EC%9D%84-%EB%B0%9B%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry901comment</comments>
      <pubDate>Sat, 3 Jun 2023 23:57:23 +0900</pubDate>
    </item>
    <item>
      <title>fastapi alembic revision 명령어를 쓸 때 마이그레이션 버전을 커스텀하게 생성해 봅시다.</title>
      <link>https://codingdog.tistory.com/entry/fastapi-alembic-revision-%EC%BB%A4%EC%8A%A4%ED%85%80%ED%95%98%EA%B2%8C-%EC%83%9D%EC%84%B1%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;alembic으로 migration을 하다 보면 이상한 코드가 먼저 나옴을 알 수 있습니다. 마이그레이션 파일을 관리할 때 먼저 생성된 파일이 위에 오면 편할 겁니다. 어떻게 하면 좋을까요? 예를 들어, 0001_xxx, 0002_xxx 순으로 오게 하고 싶다면요? 그렇게 하면 버전 관리가 보다 편해질 겁니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mi2.png&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjMakZ/btsibeUE9al/rBsJU4eTOTHpEpUIX28q00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjMakZ/btsibeUE9al/rBsJU4eTOTHpEpUIX28q00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjMakZ/btsibeUE9al/rBsJU4eTOTHpEpUIX28q00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjMakZ%2FbtsibeUE9al%2FrBsJU4eTOTHpEpUIX28q00%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;723&quot; height=&quot;68&quot; data-filename=&quot;mi2.png&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;alembic revision --autogenerate -m &quot;init_script&quot;를 쳐 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mi1.png&quot; data-origin-width=&quot;373&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VWNkB/btsibpPrhfL/W6roMsNsSgms1kfNaEdiF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VWNkB/btsibpPrhfL/W6roMsNsSgms1kfNaEdiF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VWNkB/btsibpPrhfL/W6roMsNsSgms1kfNaEdiF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVWNkB%2FbtsibpPrhfL%2FW6roMsNsSgms1kfNaEdiF0%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;373&quot; height=&quot;266&quot; data-filename=&quot;mi1.png&quot; data-origin-width=&quot;373&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 앞에 fbe53.. 이 생성됨을 볼 수 있습니다. 랜덤하게 생성된 문자열이기 때문에 보기가 영 편하지 않습니다. &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;a style=&quot;color: #f89009;&quot; href=&quot;https://alembic.sqlalchemy.org/en/latest/api/runtime.html#alembic.runtime.environment.EnvironmentContext.configure.params.process_revision_directives&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;문서&lt;/a&gt;&lt;/span&gt;를 보면, context의 configure의 process_revision_directives는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;&quot;revision&quot; --autogenerate 옵션일 때 트리거가 된다고 합니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mi9.png&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;229&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zzlac/btsibpu7N5A/UvkOxobCIhqb2fKnK4ARUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zzlac/btsibpu7N5A/UvkOxobCIhqb2fKnK4ARUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zzlac/btsibpu7N5A/UvkOxobCIhqb2fKnK4ARUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzzlac%2Fbtsibpu7N5A%2FUvkOxobCIhqb2fKnK4ARUK%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;620&quot; height=&quot;229&quot; data-filename=&quot;mi9.png&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;229&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그 전에 ScriptDirectory에 대한 설명을 봅시다. 이것은 current revision을 얻어오기에 매우 유용하다고 설명이 되어 있습니다. 위와 같이 얻어온다고 되어 있습니다. 이를 응용하면 아래 코드와 같이 작성하실 수 있습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mi3.png&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;209&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rRkmy/btsidWeo8z4/4NliFOdvjbZ6Xy9hKs0fA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rRkmy/btsidWeo8z4/4NliFOdvjbZ6Xy9hKs0fA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rRkmy/btsidWeo8z4/4NliFOdvjbZ6Xy9hKs0fA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrRkmy%2FbtsidWeo8z4%2F4NliFOdvjbZ6Xy9hKs0fA0%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;697&quot; height=&quot;209&quot; data-filename=&quot;mi3.png&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;209&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;요러한데요. 간단하게 소개만 하겠습니다. context와 directives가 중요합니다. context는 현재 head의 버전을 가지고 오기 위함입니다. 42번째 줄에 head_revision이라고 가져옴을 볼 수 있습니다. 다음에, new_rev_id를 생성하는데요. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;head_revision이 없는 경우는 아직 마이그레이션 파일이 아무것도 없는 경우입니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;고로, 이 경우에는 1번을 표기해야 합니다. 그렇지 않으면 000x_{uuid}꼴이라면 앞에 4자리만 가져오면 되겠지요. 44번째 줄에 보면, int(head_revision[:4])를 볼 수 있는데요. 이는 앞에 수 4개만 끊어오는 것입니다. 다음 45번째 줄은 migration_script의 rev_id에 무언가를 집어넣는 것입니다. 버전 번호에 uuid4를 추가함을 볼 수 있습니다. 이는, alembic에서는 앞에 revision으로 head 등을 판별하기 때문입니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mi10.png&quot; data-origin-width=&quot;290&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgMPdj/btsib09IaLU/rYtwSdDfoOGkpDoO43lP7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgMPdj/btsib09IaLU/rYtwSdDfoOGkpDoO43lP7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgMPdj/btsib09IaLU/rYtwSdDfoOGkpDoO43lP7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgMPdj%2Fbtsib09IaLU%2FrYtwSdDfoOGkpDoO43lP7k%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;290&quot; height=&quot;222&quot; data-filename=&quot;mi10.png&quot; data-origin-width=&quot;290&quot; data-origin-height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이 rev_id는 겹치지 않게 구분짓는 게 중요합니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;저는 뒤에 uuid가 오게 하였습니다.&lt;/u&gt;&lt;/span&gt; 이제 남은 것은 migration_script.rev_id 부분입니다. 이는 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;a style=&quot;color: #f89009;&quot; href=&quot;https://alembic.sqlalchemy.org/en/latest/api/autogenerate.html#customizing-revision-generation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;문서&lt;/a&gt;&lt;/span&gt;의 마지막 부분을 보면 대략적으로 유추할 수 있습니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;autogenerate를 할 때 이 부분의 속성들을 건드리면 새로운 버전의 파일을 생성할 때 넘겨지는 파라미터 등을 변경할 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이로 미루어 보았을 때, 45번째 줄이 하는 것은 revision_id를 제가 원하는 이름인 000x_{uuid4}로 변경한다고 유추할 수 있습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mi4.png&quot; data-origin-width=&quot;567&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TQ47c/btsibvIDkDE/e7x2nSXWd9OVuPxESbs1Rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TQ47c/btsibvIDkDE/e7x2nSXWd9OVuPxESbs1Rk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TQ47c/btsibvIDkDE/e7x2nSXWd9OVuPxESbs1Rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTQ47c%2FbtsibvIDkDE%2Fe7x2nSXWd9OVuPxESbs1Rk%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;567&quot; height=&quot;461&quot; data-filename=&quot;mi4.png&quot; data-origin-width=&quot;567&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다음에 run_migrations_offline의 process_revision_directives에 gen_revision을 추가해 줍니다. 이 함수는 제가 revision을 --autogenerate 하였을 때, 호출되는 함수입니다. 이 함수를 통해, 리비전이 custom하게 생성됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mi5.png&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bndU0D/btsiaETEgX3/TGdY8Uaj9YNsEhMvZUAtDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bndU0D/btsiaETEgX3/TGdY8Uaj9YNsEhMvZUAtDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bndU0D/btsiaETEgX3/TGdY8Uaj9YNsEhMvZUAtDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbndU0D%2FbtsiaETEgX3%2FTGdY8Uaj9YNsEhMvZUAtDk%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;499&quot; height=&quot;476&quot; data-filename=&quot;mi5.png&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;run_migration_online도 수정합니다. context.configure 부분을 수정하시면 됩니다. 이제, alembic revision --autogenerate -m &quot;message&quot;로 마이그레이션 파일을 생성하겠습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mi11.png&quot; data-origin-width=&quot;339&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ac5OJ/btsielFfUkf/PoL4Dt8p3SASDpmYvzlpCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ac5OJ/btsielFfUkf/PoL4Dt8p3SASDpmYvzlpCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ac5OJ/btsielFfUkf/PoL4Dt8p3SASDpmYvzlpCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAc5OJ%2FbtsielFfUkf%2FPoL4Dt8p3SASDpmYvzlpCK%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;339&quot; height=&quot;109&quot; data-filename=&quot;mi11.png&quot; data-origin-width=&quot;339&quot; data-origin-height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 요런 파일이 하나 생성됩니다. 0001_938e.. 이 부분입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mi7.png&quot; data-origin-width=&quot;353&quot; data-origin-height=&quot;127&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8ALu7/btsicjBbkXr/vtqtX7dZb7ajNyva9uHNyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8ALu7/btsicjBbkXr/vtqtX7dZb7ajNyva9uHNyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8ALu7/btsicjBbkXr/vtqtX7dZb7ajNyva9uHNyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8ALu7%2FbtsicjBbkXr%2FvtqtX7dZb7ajNyva9uHNyk%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;353&quot; height=&quot;127&quot; data-filename=&quot;mi7.png&quot; data-origin-width=&quot;353&quot; data-origin-height=&quot;127&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이제 alembic_version 테이블을 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mi8.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/560ir/btsib0IBHvF/FfsBjdfzKfzfwGDjC9svX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/560ir/btsib0IBHvF/FfsBjdfzKfzfwGDjC9svX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/560ir/btsib0IBHvF/FfsBjdfzKfzfwGDjC9svX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F560ir%2Fbtsib0IBHvF%2FFfsBjdfzKfzfwGDjC9svX0%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;400&quot; height=&quot;121&quot; data-filename=&quot;mi8.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;121&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 version_num이 0001_938e379a0cb5로 생성되었음을 볼 수 있습니다. 이게 revision id인 셈입니다. 당연하게도, 해당 방법은 revision --autogenerate 명령을 쓸 때에만 적용되기 때문에, merge를 할 때에는 적용되지 않습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mi12.png&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;103&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d3VOVv/btsiahj7ujH/PwnGrvmYpkl9CODUyaN7oK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d3VOVv/btsiahj7ujH/PwnGrvmYpkl9CODUyaN7oK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d3VOVv/btsiahj7ujH/PwnGrvmYpkl9CODUyaN7oK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd3VOVv%2Fbtsiahj7ujH%2FPwnGrvmYpkl9CODUyaN7oK%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;701&quot; height=&quot;103&quot; data-filename=&quot;mi12.png&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;103&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;굳이 수동으로 하려면, merge heads를 할 때 --rev-id 옵션을 주면 revision id를 커스텀하게 줄 수 있으니 이를 이용하면 되겠습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>웹/FASTAPI</category>
      <category>alembic</category>
      <category>FastAPI</category>
      <category>Revision</category>
      <category>rev_id</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/900</guid>
      <comments>https://codingdog.tistory.com/entry/fastapi-alembic-revision-%EC%BB%A4%EC%8A%A4%ED%85%80%ED%95%98%EA%B2%8C-%EC%83%9D%EC%84%B1%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry900comment</comments>
      <pubDate>Wed, 31 May 2023 23:59:29 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 ordereddict move_to_end에 대해 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-ordereddict-movetoend%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;파이썬의 orderedDict에 대해 조금 더 알아봅시다. 이전에 이 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;a style=&quot;color: #f89009;&quot; href=&quot;https://codingdog.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-ordereddict-popitem%EC%9C%BC%EB%A1%9C-%EB%94%95%EC%85%94%EB%84%88%EB%A6%AC%EC%9D%98-%EC%B2%AB-%EB%B2%88%EC%A7%B8-%EA%B0%92%EA%B3%BC-%EB%A7%88%EC%A7%80%EB%A7%89-%EA%B0%92%EC%9D%84-%EC%96%BB%EC%96%B4%EC%98%A4%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;글&lt;/a&gt;&lt;/span&gt;에서 popitem에 대해 간략하게만 설명드리고 넘어갔습니다. 여기 조금 더 심화된 내용을 학습해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;OrderedDict의 경우, 들어온 순서가 유지되는 딕셔너리입니다. 고로 lru와 같은 것과 잘 맞는다고 했습니다. 예제 하나를 볼 건데요. 자세히 분석해 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;od1.png&quot; data-origin-width=&quot;396&quot; data-origin-height=&quot;127&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EExcO/btshKRk0VKk/kn9YA3Rix7OZe5l58qzRzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EExcO/btshKRk0VKk/kn9YA3Rix7OZe5l58qzRzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EExcO/btshKRk0VKk/kn9YA3Rix7OZe5l58qzRzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEExcO%2FbtshKRk0VKk%2Fkn9YA3Rix7OZe5l58qzRzk%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;396&quot; height=&quot;127&quot; data-filename=&quot;od1.png&quot; data-origin-width=&quot;396&quot; data-origin-height=&quot;127&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저, OrderedDict 객체를 하나 선언할 거에요. 그리고 &quot;a&quot;, &quot;b&quot;, &quot;c&quot; 순서대로 넣었습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;od2.png&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;42&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vsvPm/btshPphtB2o/iICKI1ch2OPewegkjUlOU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vsvPm/btshPphtB2o/iICKI1ch2OPewegkjUlOU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vsvPm/btshPphtB2o/iICKI1ch2OPewegkjUlOU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvsvPm%2FbtshPphtB2o%2FiICKI1ch2OPewegkjUlOU1%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;349&quot; height=&quot;42&quot; data-filename=&quot;od2.png&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;42&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다음에 lru를 출력하고, 가장 첫 번째 원소를 출력할 거에요.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;od4.png&quot; data-origin-width=&quot;431&quot; data-origin-height=&quot;42&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/esaIUC/btshPpPiv9W/ZlNBfeqpJb3QbcUKUMa7h0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/esaIUC/btshPpPiv9W/ZlNBfeqpJb3QbcUKUMa7h0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/esaIUC/btshPpPiv9W/ZlNBfeqpJb3QbcUKUMa7h0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FesaIUC%2FbtshPpPiv9W%2FZlNBfeqpJb3QbcUKUMa7h0%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;431&quot; height=&quot;42&quot; data-filename=&quot;od4.png&quot; data-origin-width=&quot;431&quot; data-origin-height=&quot;42&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 출력 결과가 이렇게 나와요. 이것에 대해서 먼저 해석해 보겠습니다. 들어온 순서를 유지하는 것이 OrderedDict이라고 했어요. 고로, 이 때 그림은 아래와 같이 그려집니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;od6.png&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bp7dcg/btshPpBL7Fq/67XczUS5kPekQepKKGVhzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bp7dcg/btshPpBL7Fq/67XczUS5kPekQepKKGVhzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bp7dcg/btshPpBL7Fq/67XczUS5kPekQepKKGVhzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbp7dcg%2FbtshPpBL7Fq%2F67XczUS5kPekQepKKGVhzk%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;392&quot; height=&quot;152&quot; data-filename=&quot;od6.png&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;여기까지는 대강 이해되시리라 믿습니다. next(iter(lru)) 이 부분은 무엇일까요? 일단, lru 역시 순회 가능한 무언가이기 때문에 이터레이터가 있습니다. 순방향 이터레이터는 처음부터 끝까지 탐색하는 것이고, 역방향은 역순으로 탐색하는 것입니다. next(iter)는 현재 이터레이터가 가리키는 원소를 리턴하게 되는데요.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;od7.png&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;155&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beId5K/btshAwo6GsS/xsE37muIM0tqBxnNbEK6Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beId5K/btshAwo6GsS/xsE37muIM0tqBxnNbEK6Xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beId5K/btshAwo6GsS/xsE37muIM0tqBxnNbEK6Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeId5K%2FbtshAwo6GsS%2FxsE37muIM0tqBxnNbEK6Xk%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;444&quot; height=&quot;155&quot; data-filename=&quot;od7.png&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;155&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;처음 녀석인 &quot;a&quot;를 가리키므로 a를 돌려줍니다. 만약에 또 다시 next를 호출하면, b, c 순으로 순회가 이루어질 겁니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;od3.png&quot; data-origin-width=&quot;371&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXC3NJ/btshE1oc0Fv/jSifb0h9ODMzUxW62kK0W0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXC3NJ/btshE1oc0Fv/jSifb0h9ODMzUxW62kK0W0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXC3NJ/btshE1oc0Fv/jSifb0h9ODMzUxW62kK0W0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXC3NJ%2FbtshE1oc0Fv%2FjSifb0h9ODMzUxW62kK0W0%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;371&quot; height=&quot;106&quot; data-filename=&quot;od3.png&quot; data-origin-width=&quot;371&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;lru.move_to_end(&quot;a&quot;)가 있는데요. 오늘의 핵심입니다. 이것이 대체 무엇인가? &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;특정 키 값을 맨 마지막으로 보내버립니다.&lt;/u&gt;&lt;/span&gt; &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;즉, &quot;a&quot;가 제일 마지막에 추가된 것처럼 해 버린다는 의미입니다.&lt;/b&gt;&lt;/span&gt; LRU에서는 더 이상 캐시에 저장할 수 없을 때 가장 오래 전에 접근한 것을 제거해 버립니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;키가 없으면 KeyError를 떨구기 때문에, lru를 구현한 경우, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;이미 있는 키에 access 하는 용도로 쓰이게 됩니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;od8.png&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;155&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EosQZ/btshE0bMGNn/SsxY5Orm6IF7p12dxglAv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EosQZ/btshE0bMGNn/SsxY5Orm6IF7p12dxglAv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EosQZ/btshE0bMGNn/SsxY5Orm6IF7p12dxglAv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEosQZ%2FbtshE0bMGNn%2FSsxY5Orm6IF7p12dxglAv0%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;390&quot; height=&quot;155&quot; data-filename=&quot;od8.png&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;155&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;move_to_end(&quot;a&quot;)를 하면 어떤 일이 일어나는가? a를 맨 뒤로 보낸다고 했지요? 그러면, a를 제거한 다음에 가장 마지막 위치에 보내버립니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;od9.png&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;149&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7r6Ja/btshYcVZaX0/6I9VfJkhEzNCRZIM67JQZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7r6Ja/btshYcVZaX0/6I9VfJkhEzNCRZIM67JQZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7r6Ja/btshYcVZaX0/6I9VfJkhEzNCRZIM67JQZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7r6Ja%2FbtshYcVZaX0%2F6I9VfJkhEzNCRZIM67JQZK%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;392&quot; height=&quot;149&quot; data-filename=&quot;od9.png&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;149&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;요렇게요. 이 작업을 매우 빠르게 끝낼 수 있어요. 왜냐? 키 &quot;a&quot;가 있는 위치를 hash로 빠르게 찾을 수 있습니다. 그리고, 위치만 알면 List는 원소를 제거하고 추가하는 연산을 매우 빠르게 끝내버릴 수 있습니다. lru 효율적으로 구현 뚝딱 했습니다. 이 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;a style=&quot;color: #f89009;&quot; href=&quot;https://www.acmicpc.net/problem/27882&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;문제&lt;/a&gt;&lt;/span&gt; 풀 수 있겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;od10.png&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;161&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bf3h17/btshCftwzzQ/VmkooX6IeOY4FpGzgZwsA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bf3h17/btshCftwzzQ/VmkooX6IeOY4FpGzgZwsA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bf3h17/btshCftwzzQ/VmkooX6IeOY4FpGzgZwsA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbf3h17%2FbtshCftwzzQ%2FVmkooX6IeOY4FpGzgZwsA0%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;421&quot; height=&quot;161&quot; data-filename=&quot;od10.png&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;161&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이제 next(iter(lru))와 next(reversed(lru))의 결과값은 예측할 수 있습니다. 전자는 b이고, 후자는 a입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;od5.png&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;67&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A25kR/btshKQGsdH7/CkNcZ7kQLsG9Cnxkl3Qc6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A25kR/btshKQGsdH7/CkNcZ7kQLsG9Cnxkl3Qc6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A25kR/btshKQGsdH7/CkNcZ7kQLsG9Cnxkl3Qc6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA25kR%2FbtshKQGsdH7%2FCkNcZ7kQLsG9Cnxkl3Qc6k%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;445&quot; height=&quot;67&quot; data-filename=&quot;od5.png&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;67&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;요기까지도 별로 어렵지 않습니다. 이제 popitem의 last 인자는 무엇을 의미할까요? 어느 것의 last일까요?&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;od11.png&quot; data-origin-width=&quot;347&quot; data-origin-height=&quot;195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWKJhj/btshBmzEBuO/QGaPKTvtRdI7ibywo3Chx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWKJhj/btshBmzEBuO/QGaPKTvtRdI7ibywo3Chx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWKJhj/btshBmzEBuO/QGaPKTvtRdI7ibywo3Chx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWKJhj%2FbtshBmzEBuO%2FQGaPKTvtRdI7ibywo3Chx1%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;347&quot; height=&quot;195&quot; data-filename=&quot;od11.png&quot; data-origin-width=&quot;347&quot; data-origin-height=&quot;195&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;7번째 줄까지 수행하면, b, c, a 순으로 오래된 순입니다. 고로 b가 먼저 올 겁니다. last가 False라는 의미는 맨 처음의 원소인 'b'가 제거된다는 것입니다. 즉, 가장 오랫동안 접근하지 않은 원소가 제거되는 것과 동일합니다. 8번째 줄이 수행된 후 상태는 아래와 같이 변합니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;od13.png&quot; data-origin-width=&quot;261&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKoxR7/btshPpod3hV/rKnOtyhVE8ivVsMxIlyJHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKoxR7/btshPpod3hV/rKnOtyhVE8ivVsMxIlyJHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKoxR7/btshPpod3hV/rKnOtyhVE8ivVsMxIlyJHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKoxR7%2FbtshPpod3hV%2FrKnOtyhVE8ivVsMxIlyJHk%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;261&quot; height=&quot;148&quot; data-filename=&quot;od13.png&quot; data-origin-width=&quot;261&quot; data-origin-height=&quot;148&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이제 lru.popitem(last=True)를 호출합니다. last는 위 그림에서 &quot;a&quot;입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;od12.png&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;89&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GhK5L/btshCbEvBWl/2uPeaByYlvuE0x7RxiZ9jK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GhK5L/btshCbEvBWl/2uPeaByYlvuE0x7RxiZ9jK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GhK5L/btshCbEvBWl/2uPeaByYlvuE0x7RxiZ9jK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGhK5L%2FbtshCbEvBWl%2F2uPeaByYlvuE0x7RxiZ9jK%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;322&quot; height=&quot;89&quot; data-filename=&quot;od12.png&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;89&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;따라서 &quot;a&quot;가 제거되게 됩니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>레퍼런스/예제</category>
      <category>move_to_end</category>
      <category>OrderedDict</category>
      <category>파이썬</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/899</guid>
      <comments>https://codingdog.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-ordereddict-movetoend%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry899comment</comments>
      <pubDate>Mon, 29 May 2023 23:59:42 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 passwd 명령어를 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-passwd-%EB%AA%85%EB%A0%B9%EC%96%B4%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;안녕하세요. 이번 시간에는 리눅스 passwd 명령어를 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pa1.png&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btS09h/btshBju8iei/jK9ZPkJIJVUEH0wm5UCm30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btS09h/btshBju8iei/jK9ZPkJIJVUEH0wm5UCm30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btS09h/btshBju8iei/jK9ZPkJIJVUEH0wm5UCm30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtS09h%2FbtshBju8iei%2FjK9ZPkJIJVUEH0wm5UCm30%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;422&quot; height=&quot;74&quot; data-filename=&quot;pa1.png&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;먼저 cho2 유저를 추가합니다. useradd -m cho2를 입력하면 cho2의 홈 디렉토리도 같이 생성합니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pa4.png&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbQ5R9/btshArgtJ9b/VbnfTn6S0B7ja2V9wEmG0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbQ5R9/btshArgtJ9b/VbnfTn6S0B7ja2V9wEmG0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbQ5R9/btshArgtJ9b/VbnfTn6S0B7ja2V9wEmG0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbQ5R9%2FbtshArgtJ9b%2FVbnfTn6S0B7ja2V9wEmG0K%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;370&quot; height=&quot;88&quot; data-filename=&quot;pa4.png&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;passwd 명령어는 유저의 패스워드를 변경하는 명령어&lt;/u&gt;&lt;/span&gt;입니다. root의 비밀번호를 설정할 때에는 passwd만 입력하고 비밀번호를 재설정하면 됩니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;생각보다 리눅스 초기 설정할 때 많이 쓰이게 되니 알아두면 좋습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pa2.png&quot; data-origin-width=&quot;419&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O50ls/btshy5EUTeO/vhhKKHo6v6IfP3cqdU6MT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O50ls/btshy5EUTeO/vhhKKHo6v6IfP3cqdU6MT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O50ls/btshy5EUTeO/vhhKKHo6v6IfP3cqdU6MT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO50ls%2Fbtshy5EUTeO%2FvhhKKHo6v6IfP3cqdU6MT1%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;419&quot; height=&quot;98&quot; data-filename=&quot;pa2.png&quot; data-origin-width=&quot;419&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;cho2의 암호를 설정해 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pa3.png&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;93&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bN77yK/btshA5qruoM/fRdR8jyMgE5uZNetRj2SUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bN77yK/btshA5qruoM/fRdR8jyMgE5uZNetRj2SUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bN77yK/btshA5qruoM/fRdR8jyMgE5uZNetRj2SUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbN77yK%2FbtshA5qruoM%2FfRdR8jyMgE5uZNetRj2SUK%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;393&quot; height=&quot;93&quot; data-filename=&quot;pa3.png&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;93&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;다음에 su cho2를 입력합니다. 암호를 입력하면, 다른 쉘이 하나 뜨게 됩니다. whoami를 입력하면, 현재 접속하고 있는 유저를 알려주는데요. cho2라고 되어 있습니다. cho2로 로그인을 성공했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;여기서 끝나면 뭔가 섭섭할 거 같으니, 다른 작업을 해 보겠습니다. 계정 비활성화, 잠금을 하는 방법도 같이 알아봅시다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pa5.png&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HwZKs/btshBkgwShK/eVpy8gZn20KUHSx7kl1R21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HwZKs/btshBkgwShK/eVpy8gZn20KUHSx7kl1R21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HwZKs/btshBkgwShK/eVpy8gZn20KUHSx7kl1R21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHwZKs%2FbtshBkgwShK%2FeVpy8gZn20KUHSx7kl1R21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;793&quot; height=&quot;129&quot; data-filename=&quot;pa5.png&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;129&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;passwd의 -l은 패스워드를 lock 합니다. 패스워드 인증 방식을 쓰지 못하게 만듭니다. 이 옵션은 단순하게 패스워드를 못 쓰게 만드는 것일 뿐입니다. 인증 방법은 패스워드 말고도 많습니다. ssh 키와 같은 것으로도 인증할 수 있어요. 이런 것까지 막지는 못해요. note는 이를 의미합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;한 번 실습해 봅시다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pa6.png&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cD3Q77/btshAwBKBsL/mXhgjRQKD6TP9LK4EFbebK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cD3Q77/btshAwBKBsL/mXhgjRQKD6TP9LK4EFbebK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cD3Q77/btshAwBKBsL/mXhgjRQKD6TP9LK4EFbebK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcD3Q77%2FbtshAwBKBsL%2FmXhgjRQKD6TP9LK4EFbebK%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;440&quot; height=&quot;87&quot; data-filename=&quot;pa6.png&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;87&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;passwd -l cho2를 입력해 보겠습니다. 그러면, password changed.가 뜨는데요.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pa7.png&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7ggRV/btshzDBn3CS/DyaC3wSF1kCpRsFw0GTX91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7ggRV/btshzDBn3CS/DyaC3wSF1kCpRsFw0GTX91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7ggRV/btshzDBn3CS/DyaC3wSF1kCpRsFw0GTX91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7ggRV%2FbtshzDBn3CS%2FDyaC3wSF1kCpRsFw0GTX91%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;494&quot; height=&quot;90&quot; data-filename=&quot;pa7.png&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;패스워드의 맨 앞에 !가 붙어있음을 볼 수 있습니다. 이는 패스워드를 쓰지 못한다는 것을 의미합니다. 다시 su cho2를 입력해서 인증을 시도해 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pa8.png&quot; data-origin-width=&quot;391&quot; data-origin-height=&quot;110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0rm6G/btshCdamzku/NGolawYk4AxXJV8Vx8ROnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0rm6G/btshCdamzku/NGolawYk4AxXJV8Vx8ROnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0rm6G/btshCdamzku/NGolawYk4AxXJV8Vx8ROnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0rm6G%2FbtshCdamzku%2FNGolawYk4AxXJV8Vx8ROnk%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;391&quot; height=&quot;110&quot; data-filename=&quot;pa8.png&quot; data-origin-width=&quot;391&quot; data-origin-height=&quot;110&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;암호를 올바르게 입력해도 되지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;그런데 암호 말고도 인증할 방법은 많다고 했습니다. 대표적으로 ssh에 이용하는 private key입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pa9.png&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nkRFZ/btshzDg295J/PXWM9hvkMXh79FJwjVBBv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nkRFZ/btshzDg295J/PXWM9hvkMXh79FJwjVBBv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nkRFZ/btshzDg295J/PXWM9hvkMXh79FJwjVBBv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnkRFZ%2FbtshzDg295J%2FPXWM9hvkMXh79FJwjVBBv1%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;689&quot; height=&quot;374&quot; data-filename=&quot;pa9.png&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;이것을 이용해서 cho2 계정에 ssh로 접속해 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pa10.png&quot; data-origin-width=&quot;581&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MVNfv/btshzYr5fOu/CXe6gEKmKmn8kLDvQznUy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MVNfv/btshzYr5fOu/CXe6gEKmKmn8kLDvQznUy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MVNfv/btshzYr5fOu/CXe6gEKmKmn8kLDvQznUy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMVNfv%2FbtshzYr5fOu%2FCXe6gEKmKmn8kLDvQznUy0%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;581&quot; height=&quot;90&quot; data-filename=&quot;pa10.png&quot; data-origin-width=&quot;581&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;접속이 됩니다. 이는 password로 인증을 하지 않았기 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pa11.png&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;75&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIaMTd/btshE1ANGPd/QpwhKYd1v7T7jkHtret9uK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIaMTd/btshE1ANGPd/QpwhKYd1v7T7jkHtret9uK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIaMTd/btshE1ANGPd/QpwhKYd1v7T7jkHtret9uK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIaMTd%2FbtshE1ANGPd%2FQpwhKYd1v7T7jkHtret9uK%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;534&quot; height=&quot;75&quot; data-filename=&quot;pa11.png&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;75&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;진짜로 유저를 deactivate를 시키려면 usermod를 이용해야 합니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;usermod cho2 --expiredate 1을 입력&lt;/u&gt;&lt;/span&gt;해 보겠습니다. 이는 만료일이 1970년 x월 x일이라는 의미입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pa12.png&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;83&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C2qmd/btshA0WSto5/gcSHS6RwTfhTSqv1dqoZR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C2qmd/btshA0WSto5/gcSHS6RwTfhTSqv1dqoZR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C2qmd/btshA0WSto5/gcSHS6RwTfhTSqv1dqoZR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC2qmd%2FbtshA0WSto5%2FgcSHS6RwTfhTSqv1dqoZR1%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;489&quot; height=&quot;83&quot; data-filename=&quot;pa12.png&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;83&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;이 명령을 적용한 후에 다시 su cho2로 로그인을 시도해 보겠습니다. 그러면, cho2의 계정이 만료되었다고 뜨면서 관리자에게 문의하라는 에러가 뜨게 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pa12.png&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;83&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yTvJk/btshzAq93kW/S6P9QV3cKSYExbuWMiytkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yTvJk/btshzAq93kW/S6P9QV3cKSYExbuWMiytkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yTvJk/btshzAq93kW/S6P9QV3cKSYExbuWMiytkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyTvJk%2FbtshzAq93kW%2FS6P9QV3cKSYExbuWMiytkk%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;645&quot; height=&quot;83&quot; data-filename=&quot;pa12.png&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;83&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;shadow 파일을 보면, 마지막 필드에 1이라고 쓰여져 있음을 볼 수 있습니다. 이는, 계정이 만료된 date를 의미합니다. 1970년 1월 1일부터의 날을 의미하니 --expiredate 1의 의미는 1970년 어느 날에 만료가 되었다는 의미입니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;계정을 expire, 즉 비활성화 시키는 것만으로도 못 쓰게 만들 수 있다. 정도만 알아두셔도 되겠습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>OS/리눅스</category>
      <category>passwd</category>
      <category>리눅스</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/898</guid>
      <comments>https://codingdog.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-passwd-%EB%AA%85%EB%A0%B9%EC%96%B4%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry898comment</comments>
      <pubDate>Sat, 27 May 2023 23:56:51 +0900</pubDate>
    </item>
    <item>
      <title>java arrays fill 메소드와 setAll 메소드의 차이점을 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/java-arrays-fill-%EB%A9%94%EC%86%8C%EB%93%9C%EC%99%80-setAll-%EB%A9%94%EC%86%8C%EB%93%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; java의 Array에는 배열의 모든 원소를 특정한 값으로 초기화 하기 위한 메서드가 있습니다. fill과 setAll이라는 메소드입니다. 간단하게 차이점을 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ss4.png&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;231&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yASzq/btshyt0edWI/6fdoVeq76ZfqDtjE8PGFw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yASzq/btshyt0edWI/6fdoVeq76ZfqDtjE8PGFw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yASzq/btshyt0edWI/6fdoVeq76ZfqDtjE8PGFw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyASzq%2Fbtshyt0edWI%2F6fdoVeq76ZfqDtjE8PGFw1%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;312&quot; height=&quot;231&quot; data-filename=&quot;ss4.png&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;231&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저 fill입니다. specified int value. specified value. &lt;b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;특정한 값으로 모든 원소를 초기화&lt;/span&gt;&lt;/b&gt; 합니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;예를 들어 배열 내의 원소를 모두 5로 초기화 시키거나 할 때 쓸 법 합니다.&lt;/u&gt;&lt;/span&gt; 이 메서드는 int형 배열 뿐만이 아니라, long, char, ... 등의 배열을 받기도 합니다. 오버로딩 되어있다고 보면 됩니다. 이 블로그에서는 int형 배열만 다룹니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;예제를 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ss5.png&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;219&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EHs07/btshzC2Vr1P/6vAyQg2DzOMAPGrynpRzP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EHs07/btshzC2Vr1P/6vAyQg2DzOMAPGrynpRzP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EHs07/btshzC2Vr1P/6vAyQg2DzOMAPGrynpRzP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEHs07%2FbtshzC2Vr1P%2F6vAyQg2DzOMAPGrynpRzP1%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;461&quot; height=&quot;219&quot; data-filename=&quot;ss5.png&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;219&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;단순하게 Arrays.fill(a, 5);를 호출합니다. 그러면 10개의 원소를 저장하는 배열의 원소들이 모두 5로 초기화 됨을 볼 수 있습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ss6.png&quot; data-origin-width=&quot;356&quot; data-origin-height=&quot;265&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFW543/btshAAwJjwR/T4MBC5yOFJp2bG9KS3w5ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFW543/btshAAwJjwR/T4MBC5yOFJp2bG9KS3w5ak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFW543/btshAAwJjwR/T4MBC5yOFJp2bG9KS3w5ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFW543%2FbtshAAwJjwR%2FT4MBC5yOFJp2bG9KS3w5ak%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;356&quot; height=&quot;265&quot; data-filename=&quot;ss6.png&quot; data-origin-width=&quot;356&quot; data-origin-height=&quot;265&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;실행 결과는 위와 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ss1.png&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EakBJ/btshz12t5QJ/S0RKAD0Xstt5R0K8BiXRI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EakBJ/btshz12t5QJ/S0RKAD0Xstt5R0K8BiXRI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EakBJ/btshz12t5QJ/S0RKAD0Xstt5R0K8BiXRI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEakBJ%2Fbtshz12t5QJ%2FS0RKAD0Xstt5R0K8BiXRI0%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;506&quot; height=&quot;402&quot; data-filename=&quot;ss1.png&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;setAll은 array와 generator를 받습니다. generator는 하나의 함수입니다. 인덱스에 대해 받아들일. 그리고, 해당 위치에 대해서 바라는 값을 생산합니다. 이게 무슨 이야기인가? 배열은 위치가 있습니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;인풋은 위치, 아웃풋은 위치가 들어오면 뽑아내는 값을 의미합니다. 적용되는 함수에 의해서. 다시 정리해 보겠습니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;function(위치)를 정의하는 generator이다. function(x)는 x번째 위치에 대해 적용될 값이다. 고로, f(x) = 5이면 배열 내의 모든 값을 5로 초기화 하는 것과 동치일 겁니다. 예제를 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ss7.png&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kB3ye/btshA5iWaNM/FcMtPiNMKWCzkOVkPthpkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kB3ye/btshA5iWaNM/FcMtPiNMKWCzkOVkPthpkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kB3ye/btshA5iWaNM/FcMtPiNMKWCzkOVkPthpkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkB3ye%2FbtshA5iWaNM%2FFcMtPiNMKWCzkOVkPthpkk%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;440&quot; height=&quot;215&quot; data-filename=&quot;ss7.png&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;215&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;Arrays.setAll(a, x -&amp;gt; 5); 랍니다. x는 위치를 의미합니다. 모든 위치에 대해서 output이 5입니다. 그러면 값이 어떻게 나올까요? 0번째 위치도 5로, 1번째 위치도 5로, ... , 마지막 위치도 5로 초기화 합니다. 즉, 모든 원소를 5로 초기화 합니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ss8.png&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2VL0I/btshA0Wg5bM/08y7iFgJKCW7lXa7WJRCC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2VL0I/btshA0Wg5bM/08y7iFgJKCW7lXa7WJRCC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2VL0I/btshA0Wg5bM/08y7iFgJKCW7lXa7WJRCC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2VL0I%2FbtshA0Wg5bM%2F08y7iFgJKCW7lXa7WJRCC0%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;312&quot; height=&quot;263&quot; data-filename=&quot;ss8.png&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;실행 결과는 위와 같습니다. 이러면 Arrays.fill과 별 차이가 없어 보입니다? 그런데 하나 다른점은 x번째 위치에 적용될 값을 function으로 적용할 수 있다는 점입니다. 예를 들어, i번째 위치의 값은 2*i로 적용한다고 해 보겠습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ss2.png&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;219&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3jqzg/btshzDHuQ4e/n3APF4o892vf1Uptwb2Rk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3jqzg/btshzDHuQ4e/n3APF4o892vf1Uptwb2Rk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3jqzg/btshzDHuQ4e/n3APF4o892vf1Uptwb2Rk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3jqzg%2FbtshzDHuQ4e%2Fn3APF4o892vf1Uptwb2Rk0%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;515&quot; height=&quot;219&quot; data-filename=&quot;ss2.png&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;219&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면, 위와 같이 적용할 수 있습니다. setAll의 2번째 인자에 index -&amp;gt; 2 * index를 넣었음을 알 수 있습니다. 이는 index번째 위치에 있는 값은 2 * index를 적용하라는 의미입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ss3.png&quot; data-origin-width=&quot;329&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2bNXF/btshyzMIQS3/7gE3ubroUaolS44R04TYh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2bNXF/btshyzMIQS3/7gE3ubroUaolS44R04TYh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2bNXF/btshyzMIQS3/7gE3ubroUaolS44R04TYh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2bNXF%2FbtshyzMIQS3%2F7gE3ubroUaolS44R04TYh1%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;329&quot; height=&quot;267&quot; data-filename=&quot;ss3.png&quot; data-origin-width=&quot;329&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;실행 결과는 위와 같습니다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;또 다른 차이점은 없을까요? Object 배열을 생각해 봅시다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ss11.png&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IxCGj/btshyVWferm/o7wztf6DKID9Rv3MqFcKy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IxCGj/btshyVWferm/o7wztf6DKID9Rv3MqFcKy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IxCGj/btshyVWferm/o7wztf6DKID9Rv3MqFcKy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIxCGj%2FbtshyVWferm%2Fo7wztf6DKID9Rv3MqFcKy0%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;540&quot; height=&quot;226&quot; data-filename=&quot;ss11.png&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;x -&amp;gt; new Obj(3)을 generator로 넘겨주었습니다. 이 Obj는 x라는 필드만 가집니다. 그리고 0번째 원소의 필드 x를 10으로 바꾸었습니다. 결과는 어떻게 나올까요?&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ss12.png&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVE0dS/btshBkfVLIg/7offtVw38GUTUK35kHnMok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVE0dS/btshBkfVLIg/7offtVw38GUTUK35kHnMok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVE0dS/btshBkfVLIg/7offtVw38GUTUK35kHnMok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVE0dS%2FbtshBkfVLIg%2F7offtVw38GUTUK35kHnMok%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;393&quot; height=&quot;266&quot; data-filename=&quot;ss12.png&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;Obj의 toString은 필드 x값만을 뽑는 것입니다. 결과를 보니까, 0번째 원소만 10으로 바뀌었음을 볼 수 있습니다. 이로 미루어 보았을 때, &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;setAll은 루프를 돌면서 generator의 평가식을 수행함을 볼 수 있습니다.&lt;/u&gt;&lt;/span&gt; 그렇기 때문에, new Obj(3);을 10번 호출하게 됩니다. 고로 필드 x의 값이 3인 오브젝트가 10개가 생성되게 됩니다. 별개의 object이므로, 한 개의 필드만 10으로 바꾸어도, 나머지는 영향을 미치지 않습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ss9.png&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;217&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxxRKM/btshzmeX9YG/KnlGUUod1ZpKGSzTaci5L1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxxRKM/btshzmeX9YG/KnlGUUod1ZpKGSzTaci5L1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxxRKM/btshzmeX9YG/KnlGUUod1ZpKGSzTaci5L1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxxRKM%2FbtshzmeX9YG%2FKnlGUUod1ZpKGSzTaci5L1%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;495&quot; height=&quot;217&quot; data-filename=&quot;ss9.png&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;217&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;반면, fill은 이야기가 다릅니다. 결과가 어떻게 나올까요?&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ss10.png&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXx8tG/btshyMyt5Mh/qKjrrYkyay1QkzftjMKpq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXx8tG/btshyMyt5Mh/qKjrrYkyay1QkzftjMKpq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXx8tG/btshyMyt5Mh/qKjrrYkyay1QkzftjMKpq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXx8tG%2FbtshyMyt5Mh%2FqKjrrYkyay1QkzftjMKpq0%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;410&quot; height=&quot;270&quot; data-filename=&quot;ss10.png&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;모두 10이 나왔습니다. 객체의 참조값이 인자로 들어갑니다. 고로, 0번째 원소부터 9번째 원소까지 같은 객체의 참조값이 들어갑니다. 얕은 복사가 되어버리는 셈입니다. 이 차이점도 염두에 두면 좋겠습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>레퍼런스/예제</category>
      <category>fill</category>
      <category>Java</category>
      <category>setall</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/897</guid>
      <comments>https://codingdog.tistory.com/entry/java-arrays-fill-%EB%A9%94%EC%86%8C%EB%93%9C%EC%99%80-setAll-%EB%A9%94%EC%86%8C%EB%93%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry897comment</comments>
      <pubDate>Fri, 26 May 2023 21:25:04 +0900</pubDate>
    </item>
    <item>
      <title>postgresql 어제 날짜 내일 날짜 구하는 방법을 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/postgresql-%EC%96%B4%EC%A0%9C-%EB%82%A0%EC%A7%9C-%EB%82%B4%EC%9D%BC-%EB%82%A0%EC%A7%9C-%EA%B5%AC%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;postgresql에서 어제 날짜와 내일 날짜를 구하는 방법을 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ye1.png&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HR5Li/btshkxNpYw1/gPtLM1ACKK6uLAuvGDIB80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HR5Li/btshkxNpYw1/gPtLM1ACKK6uLAuvGDIB80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HR5Li/btshkxNpYw1/gPtLM1ACKK6uLAuvGDIB80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHR5Li%2FbtshkxNpYw1%2FgPtLM1ACKK6uLAuvGDIB80%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;434&quot; height=&quot;98&quot; data-filename=&quot;ye1.png&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;현재 시간을 구하는 함수는 now()입니다. &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;여기서 '1 days'::interval을 뺀 값&lt;/u&gt;&lt;/span&gt;을 yesterday로 명명하였습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ye2.png&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;103&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rC6ev/btshiFFH9hD/O5unciHDIVmN93Sov9c7K1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rC6ev/btshiFFH9hD/O5unciHDIVmN93Sov9c7K1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rC6ev/btshiFFH9hD/O5unciHDIVmN93Sov9c7K1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrC6ev%2FbtshiFFH9hD%2FO5unciHDIVmN93Sov9c7K1%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;481&quot; height=&quot;103&quot; data-filename=&quot;ye2.png&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;103&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;결과를 볼까요? 그랬더니, 2023년 5월 23일 22시 24분 16.752초 +0900이 나옵니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ye3.png&quot; data-origin-width=&quot;394&quot; data-origin-height=&quot;99&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6c0No/btshkNQb2MO/mXpp6tdGs7qmIQGjkLVB7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6c0No/btshkNQb2MO/mXpp6tdGs7qmIQGjkLVB7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6c0No/btshkNQb2MO/mXpp6tdGs7qmIQGjkLVB7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6c0No%2FbtshkNQb2MO%2FmXpp6tdGs7qmIQGjkLVB7K%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;394&quot; height=&quot;99&quot; data-filename=&quot;ye3.png&quot; data-origin-width=&quot;394&quot; data-origin-height=&quot;99&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;now() 리턴값의 type을 pg_typeof라는 함수로 할 수 있습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ye4.png&quot; data-origin-width=&quot;377&quot; data-origin-height=&quot;123&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dggzL6/btshhEOcohs/daGqbxsu0NbGoKvxt9C4bK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dggzL6/btshhEOcohs/daGqbxsu0NbGoKvxt9C4bK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dggzL6/btshhEOcohs/daGqbxsu0NbGoKvxt9C4bK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdggzL6%2FbtshhEOcohs%2FdaGqbxsu0NbGoKvxt9C4bK%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;377&quot; height=&quot;123&quot; data-filename=&quot;ye4.png&quot; data-origin-width=&quot;377&quot; data-origin-height=&quot;123&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;timestamp with time zone이라고 되어 있습니다. 즉 timezone입니다. 이 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;a style=&quot;color: #f89009;&quot; href=&quot;https://www.postgresql.org/docs/current/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;문서&lt;/a&gt;&lt;/span&gt;에서 table 9.32는 Date와 Time을 연산할 때 어떤 결과가 나오지에 대해서 설명합니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;timestamp와 interval을 더하면 timestamp가 나오게 됩니다.&lt;/u&gt;&lt;/span&gt; now()에 '1 days'::interval을 빼 버렸는데요. 이 경우, 1일 이전의 timestamp가 나오게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;여기까지 별로 어렵지 않지요? 다음으로 넘어갑시다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;남은 과제는 어떻게 timestamp를 YYYY-MM-DD 꼴로 바꾸냐는 것입니다. 이것 역시 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;a style=&quot;color: #f89009;&quot; href=&quot;https://www.postgresql.org/docs/current/functions-formatting.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;문서&lt;/a&gt;&lt;/span&gt;를 보면 쉽게 파악할 수 있습니다. to_char라는 함수로 timestamp와 string format을 주면 형식에 맞게 문자열로 변환해 버리게 됩니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ye5.png&quot; data-origin-width=&quot;441&quot; data-origin-height=&quot;46&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cm6Y2u/btshh89rT5w/E0Ax50EPAO6Lsegng1lbb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cm6Y2u/btshh89rT5w/E0Ax50EPAO6Lsegng1lbb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cm6Y2u/btshh89rT5w/E0Ax50EPAO6Lsegng1lbb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcm6Y2u%2Fbtshh89rT5w%2FE0Ax50EPAO6Lsegng1lbb1%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;441&quot; height=&quot;46&quot; data-filename=&quot;ye5.png&quot; data-origin-width=&quot;441&quot; data-origin-height=&quot;46&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;현재 시각에서 1 days를 빼 버렸기 때문에 어제 날짜인 2023년 5월 23일이 나옵니다. 이를 YYYY-MM-DD 형식으로 바꾸려고 합니다. 4자리 년도, 2자리 월, 2자리 일 형식입니다. 고로 위와 같이 작성하시면 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ye6.png&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BrZ57/btshijJxzxN/zKIQGKDEmOwNtHifiTjtQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BrZ57/btshijJxzxN/zKIQGKDEmOwNtHifiTjtQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BrZ57/btshijJxzxN/zKIQGKDEmOwNtHifiTjtQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBrZ57%2FbtshijJxzxN%2FzKIQGKDEmOwNtHifiTjtQk%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;385&quot; height=&quot;142&quot; data-filename=&quot;ye6.png&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;2023-05-23. 의도하던 결과가 나왔습니다. 고로 하루 전 날짜를 구한다면 to_char(now() - '1 days'::interval, 'YYYY-MM-DD') 로 해 주면 되겠군요. 내일 날짜는 어떻게 구할까요?&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ye13.png&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfwUyc/btshhF0IKQ2/fYwOjtshmxhMXyiyioq6HK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfwUyc/btshhF0IKQ2/fYwOjtshmxhMXyiyioq6HK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfwUyc/btshhF0IKQ2/fYwOjtshmxhMXyiyioq6HK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfwUyc%2FbtshhF0IKQ2%2FfYwOjtshmxhMXyiyioq6HK%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;504&quot; height=&quot;97&quot; data-filename=&quot;ye13.png&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;97&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그냥 now()에 '1 days'::interval만 더하면 됩니다. 그러면 하루 지난 시각을 표시하게 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ye14.png&quot; data-origin-width=&quot;347&quot; data-origin-height=&quot;144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbU75F/btsheEHM3bj/kaTsVZNInUijk2Pdepz500/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbU75F/btsheEHM3bj/kaTsVZNInUijk2Pdepz500/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbU75F/btsheEHM3bj/kaTsVZNInUijk2Pdepz500/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbU75F%2FbtsheEHM3bj%2FkaTsVZNInUijk2Pdepz500%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;347&quot; height=&quot;144&quot; data-filename=&quot;ye14.png&quot; data-origin-width=&quot;347&quot; data-origin-height=&quot;144&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;2023년 5월 25일이 나오네요. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;요약하면 현재 timestamp에 '1 days'::interval을 더하면 내일, 빼면 어제를 구할 수 있습니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ye11.png&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oTGov/btshiEGNhzF/AXK1KPn3X9X9ylg8kk7jm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oTGov/btshiEGNhzF/AXK1KPn3X9X9ylg8kk7jm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oTGov/btshiEGNhzF/AXK1KPn3X9X9ylg8kk7jm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoTGov%2FbtshiEGNhzF%2FAXK1KPn3X9X9ylg8kk7jm0%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;438&quot; height=&quot;97&quot; data-filename=&quot;ye11.png&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;97&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;1주일 후의 날짜를 구할 수도 있을까요? 당연합니다. interval은 week 또한 표현할 수 있습니다. 뒤에 W, 혹은 Weeks를 붙이면 됩니다. 예를 들어 '2W'는 2주를 의미합니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;이것 말고도, interval에는 몇 년을 뜻하는 'Y', 몇 달을 뜻하는 'M', 몇 시간을 뜻하는 'H', 몇 분을 뜻하는 'M', 몇 초를 뜻하는 'S'가 있어요.&lt;/b&gt;&lt;/span&gt; 해당 쿼리는 현재 시각으로부터 1주 뒤 시각을 구하는 것입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ye12.png&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRjs4a/btshi7Psxda/5LDBv7yYyTHiCc4nvjuTr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRjs4a/btshi7Psxda/5LDBv7yYyTHiCc4nvjuTr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRjs4a/btshi7Psxda/5LDBv7yYyTHiCc4nvjuTr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRjs4a%2Fbtshi7Psxda%2F5LDBv7yYyTHiCc4nvjuTr0%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;452&quot; height=&quot;164&quot; data-filename=&quot;ye12.png&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;고로, w_after에는 7일이 지난 시각이 표시되게 됩니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>코딩/Sql</category>
      <category>interval</category>
      <category>postgresql</category>
      <category>timestamp</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/896</guid>
      <comments>https://codingdog.tistory.com/entry/postgresql-%EC%96%B4%EC%A0%9C-%EB%82%A0%EC%A7%9C-%EB%82%B4%EC%9D%BC-%EB%82%A0%EC%A7%9C-%EA%B5%AC%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry896comment</comments>
      <pubDate>Wed, 24 May 2023 23:21:57 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 enum의 원소를 random하게 가져오는 방법을 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-enum%EC%9D%98-%EC%9B%90%EC%86%8C%EB%A5%BC-random%ED%95%98%EA%B2%8C-%EA%B0%80%EC%A0%B8%EC%98%A4%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;파이썬에서 enum의 원소를 random하게 가져오는 방법을 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;er1.png&quot; data-origin-width=&quot;297&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CKdk3/btsgYi5qpv9/DH0W0KB3ya5xFAslpGeeKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CKdk3/btsgYi5qpv9/DH0W0KB3ya5xFAslpGeeKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CKdk3/btsgYi5qpv9/DH0W0KB3ya5xFAslpGeeKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCKdk3%2FbtsgYi5qpv9%2FDH0W0KB3ya5xFAslpGeeKk%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;297&quot; height=&quot;220&quot; data-filename=&quot;er1.png&quot; data-origin-width=&quot;297&quot; data-origin-height=&quot;220&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저, Enum을 상속받은 A 클래스를 보겠습니다. 이름이 A이고 값이 1인 것, 이름이 B이고 값이 3인 것, 이름이 C이고 값이 5인 것, 이름이 D이고 값이 7인 것이 있습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;er6.png&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nBbYW/btsgYi5qruP/Ef4SCUHhKurL6OKkcTM780/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nBbYW/btsgYi5qruP/Ef4SCUHhKurL6OKkcTM780/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nBbYW/btsgYi5qruP/Ef4SCUHhKurL6OKkcTM780/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnBbYW%2FbtsgYi5qruP%2FEf4SCUHhKurL6OKkcTM780%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;417&quot; height=&quot;137&quot; data-filename=&quot;er6.png&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;랜덤하게 뽑을 것이므로, choice와 같은 것이 필요한 것은 자명해 보입니다. 그런데 이것은 sequence가 필요하다고 뜹니다. 시퀀스의 대표적인 것은 list이니, &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;enum의 데이터를 list로 변환해야겠네요.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;er2.png&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qKPCW/btsg0WHw440/3z2ibsK9QGFoXnEiUgqBkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qKPCW/btsg0WHw440/3z2ibsK9QGFoXnEiUgqBkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qKPCW/btsg0WHw440/3z2ibsK9QGFoXnEiUgqBkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqKPCW%2Fbtsg0WHw440%2F3z2ibsK9QGFoXnEiUgqBkk%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;413&quot; height=&quot;68&quot; data-filename=&quot;er2.png&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;&lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;rd.choice(list(A))를 해 주면&lt;/b&gt;&lt;/span&gt;, A에 있는 item 중에 랜덤하게 하나를 뽑습니다. 이게 다입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;er5.png&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgpdZw/btsgTjQ5YYg/XFDYCCz3SbkqdWBQwYPVhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgpdZw/btsgTjQ5YYg/XFDYCCz3SbkqdWBQwYPVhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgpdZw/btsgTjQ5YYg/XFDYCCz3SbkqdWBQwYPVhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgpdZw%2FbtsgTjQ5YYg%2FXFDYCCz3SbkqdWBQwYPVhK%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;438&quot; height=&quot;68&quot; data-filename=&quot;er5.png&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;실행 결과는 A.a, A.b, A.c, A.d 중에 하나가 나옵니다. &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;즉, list(enum_class_name)은, enum class인 enum_class_name에 있는 원소들을 리스트로 변환해 줍니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;er7.png&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7gM3u/btsg1cJ9Fw6/TLTlKsJBjOn70suBLNkGS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7gM3u/btsg1cJ9Fw6/TLTlKsJBjOn70suBLNkGS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7gM3u/btsg1cJ9Fw6/TLTlKsJBjOn70suBLNkGS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7gM3u%2Fbtsg1cJ9Fw6%2FTLTlKsJBjOn70suBLNkGS0%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;467&quot; height=&quot;136&quot; data-filename=&quot;er7.png&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;136&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;코드가 어떻게 실행되나 보겠습니다. Enum에서 metaclass는 EnumType임을 알 수 있습니다. 이 클래스 안에 무엇이 있을까요?&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;er8.png&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsXJGG/btsg0nMflF6/HHqpeKCkjKc5yRnJirEHK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsXJGG/btsg0nMflF6/HHqpeKCkjKc5yRnJirEHK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsXJGG/btsg0nMflF6/HHqpeKCkjKc5yRnJirEHK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsXJGG%2Fbtsg0nMflF6%2FHHqpeKCkjKc5yRnJirEHK1%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;666&quot; height=&quot;138&quot; data-filename=&quot;er8.png&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;138&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;놀랍게도 __iter__ 이라는 함수에서 멈추게 됩니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;__iter__는 이터레이터를 반환해 주는 함수&lt;/b&gt;&lt;/span&gt;인데요. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;member_names_를 돌면서, _member_map_에 있는 것들을 꺼내옴을 알 수 있습니다.&lt;/u&gt;&lt;/span&gt; 소괄호로 묶여져 있는 것은 generator를 리턴함을 의미합니다. 결국, enum에 선언된 아이템들을 모두 가져오는 무언가를 generator로 감싼 형태가 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;er9.png&quot; data-origin-width=&quot;403&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baXLEO/btsg2knE6Q0/G7l1Pc1rI4z110WSBKbKV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baXLEO/btsg2knE6Q0/G7l1Pc1rI4z110WSBKbKV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baXLEO/btsg2knE6Q0/G7l1Pc1rI4z110WSBKbKV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaXLEO%2Fbtsg2knE6Q0%2FG7l1Pc1rI4z110WSBKbKV1%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;403&quot; height=&quot;129&quot; data-filename=&quot;er9.png&quot; data-origin-width=&quot;403&quot; data-origin-height=&quot;129&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; 이제 이 generator를 list의 생성자의 인자로 넘기면, 멤버들을 모두 가지고 있는 list를 리턴하게 됩니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;er10.png&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;519&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvwYkH/btsg3WmikAi/bZa4arRDsxxBfslKI6gEB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvwYkH/btsg3WmikAi/bZa4arRDsxxBfslKI6gEB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvwYkH/btsg3WmikAi/bZa4arRDsxxBfslKI6gEB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdvwYkH%2Fbtsg3WmikAi%2FbZa4arRDsxxBfslKI6gEB0%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;225&quot; height=&quot;519&quot; data-filename=&quot;er10.png&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;519&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;정리하면, list(A)에서 넘겨지는 타입은 generator입니다. 한 번 next가 불릴 때 마다, A, B, C, D를 가리키는 generator가 나오게 됩니다. 중간에 metaclass의 __iter__가 호출되는 것을 보면 알 수 있습니다. generator를 list의 생성자로 넘기게 되면, 리스트가 초기화 되는 과정에서 내부에서 리턴된 generator의 원소들이 소모되게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;고로, list(A)를 했다면 아래와 같이 나옵니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;er11.png&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;517&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zABKs/btsgQqQAXxQ/W2ELmvSuKt69pAq9Gkpu20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zABKs/btsgQqQAXxQ/W2ELmvSuKt69pAq9Gkpu20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zABKs/btsgQqQAXxQ/W2ELmvSuKt69pAq9Gkpu20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzABKs%2FbtsgQqQAXxQ%2FW2ELmvSuKt69pAq9Gkpu20%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;422&quot; height=&quot;517&quot; data-filename=&quot;er11.png&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;517&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;이제, 구축된 리스트를 바탕으로 choice를 돌리면, 4개의 enum 원소 중에 하나가 뽑히게 됩니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;er12.png&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oLVID/btsg0NDTHJk/42A4yFzlWIuBM6UxsR48X0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oLVID/btsg0NDTHJk/42A4yFzlWIuBM6UxsR48X0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oLVID/btsg0NDTHJk/42A4yFzlWIuBM6UxsR48X0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoLVID%2Fbtsg0NDTHJk%2F42A4yFzlWIuBM6UxsR48X0%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;751&quot; height=&quot;135&quot; data-filename=&quot;er12.png&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;135&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;여담으로 reversed(A)도 있습니다. 이 경우, 거꾸로 나오게 됩니다. enum의 원소 중에 랜덤하게 뽑는다는 문제와는 상관은 없습니다만, 알아두면 좋을 듯 싶습니다. 정리하면 Enum을 상속받은 A가 있을 때, list(A)는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;A의 원소들을 모두 가져오는 generator를 넘깁니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;결국 list(A)는 A의 원소들을 모두 가지고 있을 겁니다. 이제 우리는 이 리스트에서 random하게 하나 뽑기만 하면 됩니다. 제너레이터에 대한 조금 더 자세한 설명은 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;a style=&quot;color: #f89009;&quot; href=&quot;https://codingdog.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-generator%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%8B%A4%ED%96%89-%EC%9C%84%EC%B9%98%EB%A5%BC-%EA%B8%B0%EC%96%B5%ED%95%98%EA%B3%A0-%EC%9E%88%EC%9D%84%EA%B9%8C%EC%9A%94&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;&lt;/span&gt;를 보셔도 되겠습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>코딩/파이선</category>
      <category>Enum</category>
      <category>random</category>
      <category>파이썬</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/895</guid>
      <comments>https://codingdog.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-enum%EC%9D%98-%EC%9B%90%EC%86%8C%EB%A5%BC-random%ED%95%98%EA%B2%8C-%EA%B0%80%EC%A0%B8%EC%98%A4%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry895comment</comments>
      <pubDate>Mon, 22 May 2023 23:58:30 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 pillow crop 함수를 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-pillow-crop-%ED%95%A8%EC%88%98%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;pillow의 crop 함수를 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cr1.png&quot; data-origin-width=&quot;453&quot; data-origin-height=&quot;283&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxV503/btsgKpoUcJP/ODgOn3VqOlgkPzxIzC8NR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxV503/btsgKpoUcJP/ODgOn3VqOlgkPzxIzC8NR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxV503/btsgKpoUcJP/ODgOn3VqOlgkPzxIzC8NR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxV503%2FbtsgKpoUcJP%2FODgOn3VqOlgkPzxIzC8NR0%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;453&quot; height=&quot;283&quot; data-filename=&quot;cr1.png&quot; data-origin-width=&quot;453&quot; data-origin-height=&quot;283&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;crop 함수는 4개의 정수로 이루어진 box 정보를 넘깁니다. 각각 제일 왼쪽, 제일 위, 제일 오른쪽, 제일 아래의 좌표를 넘깁니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;이렇게 이루어진 직사각형으로 이미지를 잘라버립니다.&lt;/u&gt;&lt;/span&gt; 알기 쉽게 그림을 하나 그려보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cr9.png&quot; data-origin-width=&quot;399&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cC8miB/btsgEeCiI03/GqU1BkEEKeEFi6e4HgU8vK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cC8miB/btsgEeCiI03/GqU1BkEEKeEFi6e4HgU8vK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cC8miB/btsgEeCiI03/GqU1BkEEKeEFi6e4HgU8vK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcC8miB%2FbtsgEeCiI03%2FGqU1BkEEKeEFi6e4HgU8vK%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;399&quot; height=&quot;350&quot; data-filename=&quot;cr9.png&quot; data-origin-width=&quot;399&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;사진에서 (0, 0)은 맨 왼쪽 위 좌표를 가리킵니다. 오른쪽으로 갈수록 x 좌표가 증가하고요. 아래쪽으로 내려갈수록 y 좌표값이 증가한다고 생각하는 것이 편합니다. 이를 그림으로 나타내면 위와 같습니다. 따라서, (2, 1)은 위 그림과 같습니다. box에 (2, 1, 3, 3)을 넘기면, 아래와 같은 일이 일어납니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cr10.png&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0TQma/btsgGk9ez1d/A1CV3y4Ky3ooEslvh19Qlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0TQma/btsgGk9ez1d/A1CV3y4Ky3ooEslvh19Qlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0TQma/btsgGk9ez1d/A1CV3y4Ky3ooEslvh19Qlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0TQma%2FbtsgGk9ez1d%2FA1CV3y4Ky3ooEslvh19Qlk%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;409&quot; height=&quot;375&quot; data-filename=&quot;cr10.png&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;375&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;왼쪽 좌표가 2, 맨 위의 좌표가 1, 오른쪽 좌표가 3, 맨 아래의 좌표가 3입니다. 이를 그림으로 나타내면 노란색 영역이 됩니다. &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;이 영역으로 잘라지게 됩니다. 하늘색으로 칠해지는 부분은 버려지는 셈입니다.&lt;/u&gt;&lt;/span&gt; 즉, 리턴이 될 때는 노란색 영역만 나오게 되는 것입니다. 이제 실습을 하나 해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cr3.png&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lxEX9/btsgG6iVVWV/s5wiSmwnqVh18ubt3q0T00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lxEX9/btsgG6iVVWV/s5wiSmwnqVh18ubt3q0T00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lxEX9/btsgG6iVVWV/s5wiSmwnqVh18ubt3q0T00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlxEX9%2FbtsgG6iVVWV%2Fs5wiSmwnqVh18ubt3q0T00%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;689&quot; height=&quot;510&quot; data-filename=&quot;cr3.png&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;510&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저 gif_ex.gif입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cr2.png&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;115&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lz5Mh/btsgGip3Zox/3D6TpRxHQYHSmP6ruImA10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lz5Mh/btsgGip3Zox/3D6TpRxHQYHSmP6ruImA10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lz5Mh/btsgGip3Zox/3D6TpRxHQYHSmP6ruImA10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flz5Mh%2FbtsgGip3Zox%2F3D6TpRxHQYHSmP6ruImA10%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;409&quot; height=&quot;115&quot; data-filename=&quot;cr2.png&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;115&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;img.crop으로 이미지를 자르는데요. box의 정보로 (300, 300, 900, 900)을 넘겨주었습니다. 좌상단 좌표가 (300, 300)이고 우하단 좌표가 (900, 900)인 직사각형으로 잘라진 이미지를 돌려주라는 것입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cr4.png&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uLzD0/btsgGmFZMTk/ZUbQNQshfk9aVo35BhwRdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uLzD0/btsgGmFZMTk/ZUbQNQshfk9aVo35BhwRdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uLzD0/btsgGmFZMTk/ZUbQNQshfk9aVo35BhwRdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuLzD0%2FbtsgGmFZMTk%2FZUbQNQshfk9aVo35BhwRdk%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;597&quot; height=&quot;508&quot; data-filename=&quot;cr4.png&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;결과를 보니 요래 나오네요. 윈도우 그림판 프로그램으로 정말 이 결과가 맞는지 검증해 보겠습니다. 보기에서 격자와 눈금자를 모두 보게 설정합니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cr5.png&quot; data-origin-width=&quot;394&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d18V17/btsgDM6Le0y/rlKix2SAKLkFiJ7kEQcAhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d18V17/btsgDM6Le0y/rlKix2SAKLkFiJ7kEQcAhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d18V17/btsgDM6Le0y/rlKix2SAKLkFiJ7kEQcAhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd18V17%2FbtsgDM6Le0y%2FrlKix2SAKLkFiJ7kEQcAhk%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;394&quot; height=&quot;335&quot; data-filename=&quot;cr5.png&quot; data-origin-width=&quot;394&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그리고 (300, 300)을 왼쪽 위 좌표로 (900, 900)을 오른쪽 아래 좌표하는 직사각형을 그려보았습니다. 동일한 영역을 그렸음을 알 수 있습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cr7.png&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRZkZc/btsgChT2kzd/7F3Sk6gptZWECrKpSPoUqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRZkZc/btsgChT2kzd/7F3Sk6gptZWECrKpSPoUqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRZkZc/btsgChT2kzd/7F3Sk6gptZWECrKpSPoUqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRZkZc%2FbtsgChT2kzd%2F7F3Sk6gptZWECrKpSPoUqk%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;422&quot; height=&quot;117&quot; data-filename=&quot;cr7.png&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이제, (1500, 2000, 3500, 2500)을 box 정보로 넘기면 어떻게 될까요? 왼쪽 위 좌표가 (1500, 2000)이고 오른쪽 아래 좌표가 (3500, 2500)인 직사각형으로 잘린 이미지가 나타납니다. 결과부터 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cr8.png&quot; data-origin-width=&quot;691&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfgtao/btsgCkiVxKk/ZcKsgiEazB2rLo0K9415Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfgtao/btsgCkiVxKk/ZcKsgiEazB2rLo0K9415Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfgtao/btsgCkiVxKk/ZcKsgiEazB2rLo0K9415Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbfgtao%2FbtsgCkiVxKk%2FZcKsgiEazB2rLo0K9415Kk%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;691&quot; height=&quot;375&quot; data-filename=&quot;cr8.png&quot; data-origin-width=&quot;691&quot; data-origin-height=&quot;375&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;노트북 키보드 부분이 일부 나와 있음을 볼 수 있습니다. 가로 2000픽셀, 세로 500 픽셀이 나왔습니다. 맞게 나온 것 같습니다만, 그림판으로 검증해 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cr6.png&quot; data-origin-width=&quot;521&quot; data-origin-height=&quot;455&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/opBJN/btsgClPFqrB/5ZVUsIM60tOwIe1TF9PEpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/opBJN/btsgClPFqrB/5ZVUsIM60tOwIe1TF9PEpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/opBJN/btsgClPFqrB/5ZVUsIM60tOwIe1TF9PEpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FopBJN%2FbtsgClPFqrB%2F5ZVUsIM60tOwIe1TF9PEpK%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;521&quot; height=&quot;455&quot; data-filename=&quot;cr6.png&quot; data-origin-width=&quot;521&quot; data-origin-height=&quot;455&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;제가 표시한 직사각형 영역은 위 상단이 (1500, 2000)이고 오른쪽 하단이 (3500, 2500)입니다. 정확하게 키보드의 일부분만 나오므로, 맞게 나옴을 볼 수 있습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>중급 레퍼런스/이미지</category>
      <category>Crop</category>
      <category>Pillow</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/894</guid>
      <comments>https://codingdog.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-pillow-crop-%ED%95%A8%EC%88%98%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry894comment</comments>
      <pubDate>Sat, 20 May 2023 23:39:17 +0900</pubDate>
    </item>
    <item>
      <title>pillow resize 함수를 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/pillow-resize-%ED%95%A8%EC%88%98%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;pillow에서 thumbnail 함수를 열어보면, 안에서 resize 함수를 호출함을 볼 수 있습니다. &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;a style=&quot;color: #f89009;&quot; href=&quot;https://codingdog.tistory.com/entry/pillow-thumbnail-%ED%95%A8%EC%88%98%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;이 글&lt;/a&gt;&lt;/span&gt;에서는 대략적으로 언급만 하고 넘어갔습니다. 오늘은 resize를 알아보겠습니다.&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;[관련글]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f89009; font-family: 'Noto Sans Light';&quot;&gt;&lt;a style=&quot;color: #f89009;&quot; href=&quot;https://codingdog.tistory.com/entry/pillow-thumbnail-%ED%95%A8%EC%88%98%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;python pillow resize 함수를 알아봅시다.&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이미지 하나를 열어보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;res1.png&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bm0ZoS/btsglQOGpBF/mz6WenTHwQ5mu3TOoIruF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm0ZoS/btsglQOGpBF/mz6WenTHwQ5mu3TOoIruF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm0ZoS/btsglQOGpBF/mz6WenTHwQ5mu3TOoIruF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbm0ZoS%2FbtsglQOGpBF%2Fmz6WenTHwQ5mu3TOoIruF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;446&quot; height=&quot;445&quot; data-filename=&quot;res1.png&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;288 x 288px인 이미지입니다. 저는 윈도우 11의 그림판을 실행하였습니다. 크기 조정 및 기울이기가 있습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;res2.png&quot; data-origin-width=&quot;288&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nB6jl/btsgkienyJE/XWNWWkdxBQ2GFHv5iduNFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nB6jl/btsgkienyJE/XWNWWkdxBQ2GFHv5iduNFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nB6jl/btsgkienyJE/XWNWWkdxBQ2GFHv5iduNFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnB6jl%2FbtsgkienyJE%2FXWNWWkdxBQ2GFHv5iduNFk%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;288&quot; height=&quot;413&quot; data-filename=&quot;res2.png&quot; data-origin-width=&quot;288&quot; data-origin-height=&quot;413&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;가로와 세로 사이에 있는 링크 버튼을 활성화 시켜 보겠습니다. 그러면 가로 크기와 세로 크기의 비율이 일정하게 유지됩니다. 가로를 144 픽셀로 바꾸면, 세로도 자연스레 144로 바뀝니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;res3.png&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YMItZ/btsgmKtRQ0v/opoPivaR7jzT1dpJTdE4Q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YMItZ/btsgmKtRQ0v/opoPivaR7jzT1dpJTdE4Q0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YMItZ/btsgmKtRQ0v/opoPivaR7jzT1dpJTdE4Q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYMItZ%2FbtsgmKtRQ0v%2FopoPivaR7jzT1dpJTdE4Q0%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;454&quot; height=&quot;454&quot; data-filename=&quot;res3.png&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;일정한 비율로 줄어들었습니다. thumbnail과 동일하다고 할 수 있어요. 다른 점은 thumbnail은 사진의 원본 크기보다 크게 조정되지 않는다는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;res4.png&quot; data-origin-width=&quot;281&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7vSMs/btsgluE6N5A/NpGSI3yOAj3PQ5qizqcmWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7vSMs/btsgluE6N5A/NpGSI3yOAj3PQ5qizqcmWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7vSMs/btsgluE6N5A/NpGSI3yOAj3PQ5qizqcmWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7vSMs%2FbtsgluE6N5A%2FNpGSI3yOAj3PQ5qizqcmWk%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;281&quot; height=&quot;382&quot; data-filename=&quot;res4.png&quot; data-origin-width=&quot;281&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;링크 버튼을 비활성화 시킨 상태로 조정해 보겠습니다. 원래 288 x 288 px이였습니다만, 288 x 144px로 조정해 보겠습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;res5.png&quot; data-origin-width=&quot;463&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vcqas/btsgl5LPEcQ/NILPQrJ5tY9bFGL43v9tK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vcqas/btsgl5LPEcQ/NILPQrJ5tY9bFGL43v9tK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vcqas/btsgl5LPEcQ/NILPQrJ5tY9bFGL43v9tK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvcqas%2Fbtsgl5LPEcQ%2FNILPQrJ5tY9bFGL43v9tK0%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;463&quot; height=&quot;447&quot; data-filename=&quot;res5.png&quot; data-origin-width=&quot;463&quot; data-origin-height=&quot;447&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 가로만 2배로 늘려진 사진으로 되었음을 알 수 있습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;res6.png&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWF3PZ/btsgjlvG8GC/YKeUPkPWU3hLe8cHiovd81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWF3PZ/btsgjlvG8GC/YKeUPkPWU3hLe8cHiovd81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWF3PZ/btsgjlvG8GC/YKeUPkPWU3hLe8cHiovd81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWF3PZ%2FbtsgjlvG8GC%2FYKeUPkPWU3hLe8cHiovd81%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;413&quot; height=&quot;446&quot; data-filename=&quot;res6.png&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;가로 288, 세로 440으로 조정해 보겠습니다. 그러면 세로만 약 1.5배 늘려진 사진이 됨을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;res10.png&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;509&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMVHlB/btsgkZL9KgZ/waPcbYL65K8ZEFDbIY8xbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMVHlB/btsgkZL9KgZ/waPcbYL65K8ZEFDbIY8xbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMVHlB/btsgkZL9KgZ/waPcbYL65K8ZEFDbIY8xbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMVHlB%2FbtsgkZL9KgZ%2FwaPcbYL65K8ZEFDbIY8xbk%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;695&quot; height=&quot;509&quot; data-filename=&quot;res10.png&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;509&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;pillow의 resize는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;요청한 size로 사진을 늘리거나 줄입니다.&lt;/u&gt;&lt;/span&gt; 원본 사진은 7724x5148의 jpeg 파일입니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;res7.png&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgiiy7/btsgiBrLQrV/0eyLAcloXXAccgEaoJFqB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgiiy7/btsgiBrLQrV/0eyLAcloXXAccgEaoJFqB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgiiy7/btsgiBrLQrV/0eyLAcloXXAccgEaoJFqB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbgiiy7%2FbtsgiBrLQrV%2F0eyLAcloXXAccgEaoJFqB0%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;408&quot; height=&quot;112&quot; data-filename=&quot;res7.png&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;&amp;nbsp;9000 by 3000으로 resize를 시켜보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;res8.png&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhXm2h/btsgniYcgnT/e5KXhhJtzwircAFhGmVCc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhXm2h/btsgniYcgnT/e5KXhhJtzwircAFhGmVCc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhXm2h/btsgniYcgnT/e5KXhhJtzwircAFhGmVCc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhXm2h%2FbtsgniYcgnT%2Fe5KXhhJtzwircAFhGmVCc1%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;697&quot; height=&quot;399&quot; data-filename=&quot;res8.png&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;399&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;그랬더니, 가로로 길쭉한 사진으로 변환되었음을 볼 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;res9.png&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxctxH/btsgk0Eh72x/PSqkkBcRah73CnxRzRiw41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxctxH/btsgk0Eh72x/PSqkkBcRah73CnxRzRiw41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxctxH/btsgk0Eh72x/PSqkkBcRah73CnxRzRiw41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxctxH%2Fbtsgk0Eh72x%2FPSqkkBcRah73CnxRzRiw41%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;601&quot; height=&quot;508&quot; data-filename=&quot;res9.png&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;600 by 3000으로 변환시킨 경우에는 위와 같은 사진이 나왔음을 알 수 있습니다. 즉, 원래 사진에서 가로 크기를 a배율로, 세로 크기를 b배율로 조정하였습니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;그럴 때, 원래 사진에서 (x, y)에 있었던 점은 새롭게 resize된 사진에서는 (ax, by)의 위치에 있다고 생각하시면 됩니다.&lt;/u&gt;&lt;/span&gt; 예를 들어, 900 by 900 사진을 900 by 300으로 resize를 했다고 가정해 보겠습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;res11.png&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ryBWO/btsglRNALCT/tstUkvTQymbAqyIdNgbVn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ryBWO/btsglRNALCT/tstUkvTQymbAqyIdNgbVn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ryBWO/btsglRNALCT/tstUkvTQymbAqyIdNgbVn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FryBWO%2FbtsglRNALCT%2FtstUkvTQymbAqyIdNgbVn1%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;605&quot; height=&quot;317&quot; data-filename=&quot;res11.png&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;그러면 가로 배율은 1비율, 세로 배율은 1/3이 되었습니다. 따라서 원래 (300, 600)에 있었던 점은 새롭게 resize된 사진에서 (300, 600/3)의 위치에 있습니다. pillow의 thumbnail의 내부에서도 resize를 호출합니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;다른 점은 resize를 호출하기 전에 비율을 맞추는 전처리를 합니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>중급 레퍼런스/이미지</category>
      <category>Pillow</category>
      <category>resize</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/893</guid>
      <comments>https://codingdog.tistory.com/entry/pillow-resize-%ED%95%A8%EC%88%98%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry893comment</comments>
      <pubDate>Thu, 18 May 2023 07:15:15 +0900</pubDate>
    </item>
    <item>
      <title>python 날짜를 주차로 바꾸는 방법을 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/python-%EB%82%A0%EC%A7%9C%EB%A5%BC-%EC%A3%BC%EC%B0%A8%EB%A1%9C-%EB%B0%94%EA%BE%B8%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;datetime의 날짜가 몇 번째 주에 속하는지 출력하려고 합니다. 이 때 잘못 적용하면 의도치 않는 결과가 나타날 수 있습니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;특히, 1월 새해 근처에 있는 코너 케이스로 테스트를 해 보셔야&lt;/u&gt;&lt;/span&gt; 어떤 주에 속하는지 정확하게 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sft1.png&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zoAV0/btsf6C45vLd/NwHNP7TdIgsvYYSp5PSGd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zoAV0/btsf6C45vLd/NwHNP7TdIgsvYYSp5PSGd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zoAV0/btsf6C45vLd/NwHNP7TdIgsvYYSp5PSGd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzoAV0%2Fbtsf6C45vLd%2FNwHNP7TdIgsvYYSp5PSGd0%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;461&quot; height=&quot;177&quot; data-filename=&quot;sft1.png&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;177&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저 2020년 12월 25일부터 14일 동안 년도와 몇 번째 주차인지 뽑는 프로그램을 만들어 보겠습니다. strftime으로 datetime을 문자열로 변환하는데요. 변환 문자열이 '%Y-%W'임을 알 수 있습니다. 년도와 주차가 뽑히게 되는데요. iso 8601 형식이 아닙니다. 어떻게 뽑히는지 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sft2.png&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eQCqfA/btsf58pGQWU/s26XNYk8i9XxrNXQUTjqH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eQCqfA/btsf58pGQWU/s26XNYk8i9XxrNXQUTjqH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eQCqfA/btsf58pGQWU/s26XNYk8i9XxrNXQUTjqH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeQCqfA%2Fbtsf58pGQWU%2Fs26XNYk8i9XxrNXQUTjqH1%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;386&quot; height=&quot;243&quot; data-filename=&quot;sft2.png&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;243&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;2020년 12월 28일이 2020년 52번째 주차로 뽑힙니다. 그리고 2021년 1월 1일이 2021년 0번째 주차, 1월 4일이 1번째 주차로 뽑히게 되는데요. 2020년 12월 근처의 달력을 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sft3.png&quot; data-origin-width=&quot;323&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbzQvE/btsf6CYi7v6/e7HLe6Ycy1nKvTSR1inX00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbzQvE/btsf6CYi7v6/e7HLe6Ycy1nKvTSR1inX00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbzQvE/btsf6CYi7v6/e7HLe6Ycy1nKvTSR1inX00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbzQvE%2Fbtsf6CYi7v6%2Fe7HLe6Ycy1nKvTSR1inX00%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;323&quot; height=&quot;335&quot; data-filename=&quot;sft3.png&quot; data-origin-width=&quot;323&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;2020년 12월 28일은 월요일입니다. 그래서 주차가 바뀝니다. 다음에 2021년 1월 1일에 주차가 또 바뀌었음을 알 수 있는데요. 이는 2020년에서 2021년으로 바뀌었기 때문입니다. 다음에 2021년 1월 4일은 월요일입니다. 따라서, 2021년 1월 4일은 주차가 또 바뀝니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;즉, strftime에서 %Y-%W를 입력하면, 연도가 바뀔 때와 월요일이 되었을 때 주차가 바뀌게 됩니다. 그렇기 때문에 1월 1일이 월요일이 아닌 경우 의도치 않은 결과가 나올 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이를 해결하기 위해서는 &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;Week와 Year를 ISO year, week로 바꾸어야 합니다.&lt;/b&gt;&lt;/span&gt; ISO year는 %G, ISO week는 %V입니다. 이는 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;a style=&quot;color: #f89009;&quot; href=&quot;https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;문서&lt;/a&gt;&lt;/span&gt;를 보면 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sft4.png&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;179&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byoF8X/btsf5fI6Ge3/O9VecxPLokrZSGhpnBXBGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byoF8X/btsf5fI6Ge3/O9VecxPLokrZSGhpnBXBGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byoF8X/btsf5fI6Ge3/O9VecxPLokrZSGhpnBXBGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyoF8X%2Fbtsf5fI6Ge3%2FO9VecxPLokrZSGhpnBXBGk%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;470&quot; height=&quot;179&quot; data-filename=&quot;sft4.png&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;179&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다시 2020년 12월 25일부터 14일동안 iso 형식의 year와 week를 뽑아보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sft5.png&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q5O8k/btsgbIKMJ6A/1v6us5amKUkjFwvdxbuOP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q5O8k/btsgbIKMJ6A/1v6us5amKUkjFwvdxbuOP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q5O8k/btsgbIKMJ6A/1v6us5amKUkjFwvdxbuOP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq5O8k%2FbtsgbIKMJ6A%2F1v6us5amKUkjFwvdxbuOP1%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;433&quot; height=&quot;263&quot; data-filename=&quot;sft5.png&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 아까와는 다르게, 2021년 1월 4일, 2020년 12월 28일에 주차가 바뀜을 알 수 있습니다. week가 시작하는 월요일을 기준으로 주의 번호가 변하게 됩니다. 2020-53이 1월 1일이 되었다고 바뀌지 않는 것을 보면 알 수 있습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sft6.png&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;179&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l5BgO/btsgewbhmxw/I7G0e9PoXfhOWVnPZjQnkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l5BgO/btsgewbhmxw/I7G0e9PoXfhOWVnPZjQnkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l5BgO/btsgewbhmxw/I7G0e9PoXfhOWVnPZjQnkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl5BgO%2Fbtsgewbhmxw%2FI7G0e9PoXfhOWVnPZjQnkK%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;489&quot; height=&quot;179&quot; data-filename=&quot;sft6.png&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;179&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt; 2022년에서 2023년으로 변하는 데이터의 경우에도 제대로 작동할까요?&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sft8.png&quot; data-origin-width=&quot;321&quot; data-origin-height=&quot;341&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1dQrU/btsgcroeNhM/W7qYEUNsWnDCyViqtnpFa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1dQrU/btsgcroeNhM/W7qYEUNsWnDCyViqtnpFa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1dQrU/btsgcroeNhM/W7qYEUNsWnDCyViqtnpFa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1dQrU%2FbtsgcroeNhM%2FW7qYEUNsWnDCyViqtnpFa1%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;321&quot; height=&quot;341&quot; data-filename=&quot;sft8.png&quot; data-origin-width=&quot;321&quot; data-origin-height=&quot;341&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;2022년 12월 26일에 월요일이 되었습니다. 그리고, 2023년 1월 2일에 월요일이 됩니다. 따라서, 주차를 정확하게 구했다면, 2022년 12월 26일의 week와 2023년 1월 1일의 week가 같아야 합니다. 정말 그런지 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sft7.png&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RrDyT/btsgbHZoYsl/FhwLWMkkRgwpzbHosflzXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RrDyT/btsgbHZoYsl/FhwLWMkkRgwpzbHosflzXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RrDyT/btsgbHZoYsl/FhwLWMkkRgwpzbHosflzXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRrDyT%2FbtsgbHZoYsl%2FFhwLWMkkRgwpzbHosflzXk%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;493&quot; height=&quot;242&quot; data-filename=&quot;sft7.png&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;2022-52로 같음을 알 수 있습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sft9.png&quot; data-origin-width=&quot;448&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kQzsq/btsgcpDSVPf/mNkHG1rfFh8Vp8U5lG3CIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kQzsq/btsgcpDSVPf/mNkHG1rfFh8Vp8U5lG3CIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kQzsq/btsgcpDSVPf/mNkHG1rfFh8Vp8U5lG3CIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkQzsq%2FbtsgcpDSVPf%2FmNkHG1rfFh8Vp8U5lG3CIK%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;448&quot; height=&quot;275&quot; data-filename=&quot;sft9.png&quot; data-origin-width=&quot;448&quot; data-origin-height=&quot;275&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;isocalendar를 써도 동일한 결과를 얻을 수 있습니다.&lt;/u&gt;&lt;/span&gt; 이것은 iso year, week, day를 튜플 형태로 리턴하게 되는데요. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;맨 먼저 나오는 것이 year, 두 번째로 나오는 것이 week, 마지막으로 나오는 것이 day입니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sft10.png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caOFCe/btsgcrBLZpI/XKiL1FiUlnFeBDAHJaTeUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caOFCe/btsgcrBLZpI/XKiL1FiUlnFeBDAHJaTeUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caOFCe/btsgcrBLZpI/XKiL1FiUlnFeBDAHJaTeUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaOFCe%2FbtsgcrBLZpI%2FXKiL1FiUlnFeBDAHJaTeUK%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;500&quot; height=&quot;183&quot; data-filename=&quot;sft10.png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;183&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;사용법은 어렵지 않습니다. datetime의 datetime 객체 dt가 있다면, dt.isocalendar()를 호출해 주면 iso year, week, day가 있는 튜플이 나오게 됩니다. 이 정보를 그대로 쓰면 됩니다. 프로그램의 실행 결과는 아래와 같습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sft11.png&quot; data-origin-width=&quot;298&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9UbIP/btsgdBKDub6/2qaWNjWuxsDWW1DEkZpD31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9UbIP/btsgdBKDub6/2qaWNjWuxsDWW1DEkZpD31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9UbIP/btsgdBKDub6/2qaWNjWuxsDWW1DEkZpD31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9UbIP%2FbtsgdBKDub6%2F2qaWNjWuxsDWW1DEkZpD31%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;298&quot; height=&quot;175&quot; data-filename=&quot;sft11.png&quot; data-origin-width=&quot;298&quot; data-origin-height=&quot;175&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;2022년 12월 31일과 2023년 1월 1일이 같은 주차로 묶였음을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>레퍼런스/예제</category>
      <category>ISO</category>
      <category>python</category>
      <category>WEEK</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/892</guid>
      <comments>https://codingdog.tistory.com/entry/python-%EB%82%A0%EC%A7%9C%EB%A5%BC-%EC%A3%BC%EC%B0%A8%EB%A1%9C-%EB%B0%94%EA%BE%B8%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry892comment</comments>
      <pubDate>Wed, 17 May 2023 01:02:33 +0900</pubDate>
    </item>
    <item>
      <title>pillow thumbnail 함수에 대해 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/pillow-thumbnail-%ED%95%A8%EC%88%98%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;안녕하세요. 이번 시간에는 Pillow의 thumbnail 함수에 대해서 알아보겠습니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;말 그대로 큰 이미지의 썸네일을 보여주는 것이므로, 같은 비율로 축소한 그림을 보여줄 거라는 것을 알 수 있습니다.&lt;/b&gt;&lt;/span&gt; 보통 size 인자를 많이 쓸 것이니, 이 부분만 간단하게 보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;th1.png&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vRUCl/btsf3qihMd4/oDkHNfxcbCuXUlIFr8Swa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vRUCl/btsf3qihMd4/oDkHNfxcbCuXUlIFr8Swa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vRUCl/btsf3qihMd4/oDkHNfxcbCuXUlIFr8Swa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvRUCl%2Fbtsf3qihMd4%2FoDkHNfxcbCuXUlIFr8Swa0%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;478&quot; height=&quot;412&quot; data-filename=&quot;th1.png&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;먼저, thumbnail은 이미지를 썸네일로 만듭니다. 해당 메소드는 주어진 크기보다 더 크게 사진을 만들지 않습니다. 예제 이미지 몇 개로 실험해 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;th3.png&quot; data-origin-width=&quot;593&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxjJoo/btsf6FlqSAs/xs95moGZnnBN0JVnxSd0Wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxjJoo/btsf6FlqSAs/xs95moGZnnBN0JVnxSd0Wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxjJoo/btsf6FlqSAs/xs95moGZnnBN0JVnxSd0Wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxjJoo%2Fbtsf6FlqSAs%2Fxs95moGZnnBN0JVnxSd0Wk%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;593&quot; height=&quot;444&quot; data-filename=&quot;th3.png&quot; data-origin-width=&quot;593&quot; data-origin-height=&quot;444&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;먼저 test.jpeg입니다. &lt;span style=&quot;text-align: start;&quot;&gt;이 파일은 7724 x 5148 jpeg 형식의 10.5메가짜리 파일입니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;th2.png&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beoWIS/btsf2KuBVjG/oQpNdKztKvk8sbmPa4lN1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beoWIS/btsf2KuBVjG/oQpNdKztKvk8sbmPa4lN1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beoWIS/btsf2KuBVjG/oQpNdKztKvk8sbmPa4lN1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeoWIS%2Fbtsf2KuBVjG%2FoQpNdKztKvk8sbmPa4lN1K%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;408&quot; height=&quot;137&quot; data-filename=&quot;th2.png&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;먼저, test.jpg입니다. 이미지를 연 다음에, thumbnail의 size 인자에 (256, 256)으로 넘겼습니다. 썸네일화 시킨 결과를 test_0.jpeg로 저장하였습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;th4.png&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;343&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDDZoJ/btsf4gzIn6B/hHpQFWruz4eH4MlSN6hqjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDDZoJ/btsf4gzIn6B/hHpQFWruz4eH4MlSN6hqjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDDZoJ/btsf4gzIn6B/hHpQFWruz4eH4MlSN6hqjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDDZoJ%2Fbtsf4gzIn6B%2FhHpQFWruz4eH4MlSN6hqjk%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;595&quot; height=&quot;343&quot; data-filename=&quot;th4.png&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;343&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;그랬더니, 256x171 jpeg 파일로 변환되었습니다. 원본 대비 가로와 세로 픽셀이 1/30으로 줄어들었습니다. 어떻게 된 것인가? 5148을 256으로 줄이면, 같은 비율로 줄였을 때, 가로가 256보다는 큽니다. 따라서, 가로를 256으로 줄이게 됩니다. 7724를 256으로 나누면 30.1이 나옵니다. 비슷한 비율로 5148을 줄이면 171이 나오게 됩니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;th5.png&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9arxV/btsfWWJz5UJ/HxASrsk34GvzLgxHf7YCN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9arxV/btsfWWJz5UJ/HxASrsk34GvzLgxHf7YCN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9arxV/btsfWWJz5UJ/HxASrsk34GvzLgxHf7YCN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9arxV%2FbtsfWWJz5UJ%2FHxASrsk34GvzLgxHf7YCN0%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;409&quot; height=&quot;136&quot; data-filename=&quot;th5.png&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;136&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;이 경우에는 어떨까요? size를 가로는 256을 안 넘어가게, 세로는 128을 안 넘어가게 조정을 합니다. 가로 7724를 256으로 줄였습니다. 같은 비율로 세로를 줄이면 171이 나옵니다. 이는 128보다 큽니다. 따라서, 5148을 128로 줄입니다. 같은 비율로 가로를 줄이면 192가 나오게 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;th6.png&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBDLkR/btsf59fQGqF/DwN4EQdMbUvNY0q9pMKlJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBDLkR/btsf59fQGqF/DwN4EQdMbUvNY0q9pMKlJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBDLkR/btsf59fQGqF/DwN4EQdMbUvNY0q9pMKlJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBDLkR%2Fbtsf59fQGqF%2FDwN4EQdMbUvNY0q9pMKlJ1%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;597&quot; height=&quot;294&quot; data-filename=&quot;th6.png&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;294&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;따라서 가로는 192, 세로는 128인 jpeg 파일이 나오게 됩니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;th7.png&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0fUQp/btsfWWW7Cp3/fGrck99KJUsPgzpfe8WQz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0fUQp/btsfWWW7Cp3/fGrck99KJUsPgzpfe8WQz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0fUQp/btsfWWW7Cp3/fGrck99KJUsPgzpfe8WQz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0fUQp%2FbtsfWWW7Cp3%2FfGrck99KJUsPgzpfe8WQz1%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;693&quot; height=&quot;264&quot; data-filename=&quot;th7.png&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;264&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;5760x3840 gif 파일을 (256,128)로 썸네일화 시켜 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;th8.png&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;283&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yHBVa/btsf2nNdcdO/MFG4xnN2Anla0G3wk6N8Dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yHBVa/btsf2nNdcdO/MFG4xnN2Anla0G3wk6N8Dk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yHBVa/btsf2nNdcdO/MFG4xnN2Anla0G3wk6N8Dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyHBVa%2Fbtsf2nNdcdO%2FMFG4xnN2Anla0G3wk6N8Dk%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;587&quot; height=&quot;283&quot; data-filename=&quot;th8.png&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;283&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;그러면 192x128로 썸네일화가 되는 것을 볼 수 있습니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;거의 같은 비율로 줄이고&lt;/u&gt;&lt;/span&gt;, &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;주어진 가로, 세로 size가 안 넘어가게끔 조정하고 있음을 알 수 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;th9.png&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;205&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Oug6o/btsf42OO5dG/Yew72sqIXMWe6knRkyoChK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Oug6o/btsf42OO5dG/Yew72sqIXMWe6knRkyoChK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Oug6o/btsf42OO5dG/Yew72sqIXMWe6knRkyoChK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOug6o%2Fbtsf42OO5dG%2FYew72sqIXMWe6knRkyoChK%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;751&quot; height=&quot;205&quot; data-filename=&quot;th9.png&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;205&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;어떻게 동작하는지 간단하게 보도록 합시다. aspect는 x/y를 의미합니다. 저는 가로가 5760, 세로가 3840인 사진을 넘겼으므로, 이 값은 5760 / 3840인 1.5가 됩니다. 그런데 제가 요구한 값인 (256, 128)은 2이므로, 1.5보다는 크거나 같습니다. 따라서, 5760에 3840/128 = 30을 나눠야 합니다. 5760에서 30을 나누면 192가 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;th10.png&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;131&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYUyV1/btsf4diGsJT/bH2Ye6jSkpEnBllG3uM2RK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYUyV1/btsf4diGsJT/bH2Ye6jSkpEnBllG3uM2RK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYUyV1/btsf4diGsJT/bH2Ye6jSkpEnBllG3uM2RK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYUyV1%2Fbtsf4diGsJT%2FbH2Ye6jSkpEnBllG3uM2RK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;131&quot; data-filename=&quot;th10.png&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;131&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;새로운 x와 y의 값은 192, 128임을 알 수 있어요.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;th11.png&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xt8DC/btsf3hlqJ5o/KepJ80uYeNkM86GdPrNTdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xt8DC/btsf3hlqJ5o/KepJ80uYeNkM86GdPrNTdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xt8DC/btsf3hlqJ5o/KepJ80uYeNkM86GdPrNTdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxt8DC%2Fbtsf3hlqJ5o%2FKepJ80uYeNkM86GdPrNTdK%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;729&quot; height=&quot;135&quot; data-filename=&quot;th11.png&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;135&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;내부에서 resize를 호출합니다. 이 때 resize는 가로와 세로의 비율이 유지된 size를 넘겨받게 됩니다. 정리하면, pillow의 thumbnail은 2가지 일을 수행합니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;같은 비율로 축소하는데&lt;/u&gt;&lt;/span&gt;, &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;주어진 가로와 세로 size보다 크지 않게 축소합니다.&lt;/b&gt;&lt;/span&gt; 예를 들어, 1000 by 1000짜리 이미지가 주어졌고, &lt;span style=&quot;background-color: #c1bef9;&quot;&gt;&lt;u&gt;thumbnail의 size가 (10, 20)으로 주어진다면&lt;/u&gt;&lt;/span&gt;, 20 by 20으로 축소하는 게 아니라 &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;10 by 10으로 축소&lt;/b&gt;&lt;/span&gt;합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>중급 레퍼런스/이미지</category>
      <category>Pillow</category>
      <category>thumbnail</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/891</guid>
      <comments>https://codingdog.tistory.com/entry/pillow-thumbnail-%ED%95%A8%EC%88%98%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry891comment</comments>
      <pubDate>Tue, 16 May 2023 00:14:17 +0900</pubDate>
    </item>
    <item>
      <title>postgresql materialized view와 view의 차이가 무엇인지 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/postgresql-materialized-view%EC%99%80-view%EC%9D%98-%EC%B0%A8%EC%9D%B4%EA%B0%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EC%A7%80-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;postgresql에는 materialized view가 있습니다. 간단하게 실습하면서 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;maa1.png&quot; data-origin-width=&quot;429&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7wdbb/btsfdXBRbHh/XfMjd4kxUqnzsS0uPD6Cp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7wdbb/btsfdXBRbHh/XfMjd4kxUqnzsS0uPD6Cp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7wdbb/btsfdXBRbHh/XfMjd4kxUqnzsS0uPD6Cp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7wdbb%2FbtsfdXBRbHh%2FXfMjd4kxUqnzsS0uPD6Cp1%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;429&quot; height=&quot;98&quot; data-filename=&quot;maa1.png&quot; data-origin-width=&quot;429&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저, materialized view는 아래와 같이 생성합니다. create materialized view ~ as ~. 위 문장은, m_a라는 이름의 view를 생성하는데요. select * from a가 들어왔습니다. 테이블 a의 내용을 모두 출력하는 쿼리에 대한 뷰를 만듭니다. 그러면 view와 같은 것이 아니냐? 라는 질문을 하실 수 있는데요. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;쿼리의 결과가 사용된다는 점은 같습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그런데, 차이가 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;maa2.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bp7G4L/btsfjJbv737/VccoLTiVbTslbA07t504q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bp7G4L/btsfjJbv737/VccoLTiVbTslbA07t504q0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bp7G4L/btsfjJbv737/VccoLTiVbTslbA07t504q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbp7G4L%2FbtsfjJbv737%2FVccoLTiVbTslbA07t504q0%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;400&quot; height=&quot;198&quot; data-filename=&quot;maa2.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저, 테이블 a에 들어있는 내용입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;maa3.png&quot; data-origin-width=&quot;453&quot; data-origin-height=&quot;144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJn0fF/btsftJCdOnB/xufzsO8ayOzKk6BK2gdDk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJn0fF/btsftJCdOnB/xufzsO8ayOzKk6BK2gdDk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJn0fF/btsftJCdOnB/xufzsO8ayOzKk6BK2gdDk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJn0fF%2FbtsftJCdOnB%2FxufzsO8ayOzKk6BK2gdDk0%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;453&quot; height=&quot;144&quot; data-filename=&quot;maa3.png&quot; data-origin-width=&quot;453&quot; data-origin-height=&quot;144&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이 테이블에 위 2개의 레코드를 추가해 보겠습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;maa12.png&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Iwnpg/btsfCsGPS5S/8tc2AmP8I8lbxGI176byj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Iwnpg/btsfCsGPS5S/8tc2AmP8I8lbxGI176byj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Iwnpg/btsfCsGPS5S/8tc2AmP8I8lbxGI176byj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIwnpg%2FbtsfCsGPS5S%2F8tc2AmP8I8lbxGI176byj0%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;475&quot; height=&quot;98&quot; data-filename=&quot;maa12.png&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그리고, view 하나를 생성해 보겠습니다. 이 view는 a의 전체 내용을 출력하는 쿼리를 참조합니다. 무슨 이야기냐면, 이 상태에서, 우리가 select * from v_a; 라는 쿼리를 수행하면, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;v_a라는 view가 a 테이블에 있는 전체 내용을 출력하는 쿼리를 참조하니까, 해당 쿼리를 수행합니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;maa13.png&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KpMMY/btsfbyWXNu6/OkwHhgU7KCR2KBO3HiVkrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KpMMY/btsfbyWXNu6/OkwHhgU7KCR2KBO3HiVkrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KpMMY/btsfbyWXNu6/OkwHhgU7KCR2KBO3HiVkrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKpMMY%2FbtsfbyWXNu6%2FOkwHhgU7KCR2KBO3HiVkrk%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;495&quot; height=&quot;152&quot; data-filename=&quot;maa13.png&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 요래 됩니다. 이 view는 민감한 정보를 다른 유저가 못 보게 할 때에도 쓰인다고 관련 글에서 언급한 적이 있었습니다. 예를 들어, 책의 이름과 저자와 이메일이 있는 테이블이 있다고 해 봅시다. 이 중에서 이메일은 민감 정보이니, reader 권한만 가지는 유저는 못 읽게 할 수 있을 겁니다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이럴 때, select name, author from book; 이라는 쿼리를 참조하는 view를 하나 만들어서, 해당 view에 읽기 권한을 주면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;[관련글]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f89009; font-family: 'Noto Sans Light';&quot;&gt;&lt;a style=&quot;color: #f89009;&quot; href=&quot;https://codingdog.tistory.com/entry/postgresql-view%EB%A5%BC-%EC%83%9D%EC%84%B1%ED%95%B4%EC%84%9C-column-%EA%B6%8C%ED%95%9C%EC%9D%84-%EC%A4%98-%EB%B4%85%EC%8B%9C%EB%8B%A4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;view를 생성해서 column 권한을 주는 방법을 알아봅시다.&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;maa15.png&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEIJrT/btsfe7RxYn3/tOH3pKUaeboawX6szXd6Ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEIJrT/btsfe7RxYn3/tOH3pKUaeboawX6szXd6Ek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEIJrT/btsfe7RxYn3/tOH3pKUaeboawX6szXd6Ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEIJrT%2Fbtsfe7RxYn3%2FtOH3pKUaeboawX6szXd6Ek%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;401&quot; height=&quot;170&quot; data-filename=&quot;maa15.png&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;170&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;select * from m_a;를 해 봅시다. 아무 것도 나오지 않음을 볼 수 있어요. 제가 m_a라는 실체화된 뷰를 하나 생성했습니다. 그리고 나서, 테이블 a에 레코드 2개를 추가했습니다. 그럼에도 반영이 안 된 것은 &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;어딘가에 materialized view의 결과를 저장하고 있었는데, 새로운 결과가 어딘가에 반영이 되지 않았기 때문입니다.&lt;/u&gt;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 어떻게 해야 할까요? refresh 명령을 이용하면 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;maa6.png&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SrqZf/btsfjJCAvfp/GT6KbYKh6yc34UKquMr3zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SrqZf/btsfjJCAvfp/GT6KbYKh6yc34UKquMr3zk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SrqZf/btsfjJCAvfp/GT6KbYKh6yc34UKquMr3zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSrqZf%2FbtsfjJCAvfp%2FGT6KbYKh6yc34UKquMr3zk%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;416&quot; height=&quot;98&quot; data-filename=&quot;maa6.png&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;&amp;nbsp;refresh materialized view m_a;를 입력해 봅시다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;maa7.png&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eckbas/btsfaL3jXxg/S5SztsML3jXjlpFr8eheb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eckbas/btsfaL3jXxg/S5SztsML3jXjlpFr8eheb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eckbas/btsfaL3jXxg/S5SztsML3jXjlpFr8eheb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feckbas%2FbtsfaL3jXxg%2FS5SztsML3jXjlpFr8eheb0%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;434&quot; height=&quot;98&quot; data-filename=&quot;maa7.png&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다음에, select * from m_a; 를 입력해 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;maa8.png&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oJFYB/btsftJa7XQP/LPDT9SQh9NkVybh0VzUaH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oJFYB/btsftJa7XQP/LPDT9SQh9NkVybh0VzUaH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oJFYB/btsftJa7XQP/LPDT9SQh9NkVybh0VzUaH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoJFYB%2FbtsftJa7XQP%2FLPDT9SQh9NkVybh0VzUaH0%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;451&quot; height=&quot;104&quot; data-filename=&quot;maa8.png&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 데이터 2개가 새로 생성되었음을 볼 수 있습니다. 정리하면, &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;view와는 다른 점은 결과 데이터를 저장하고 있는 무언가가 있다는 것입니다.&lt;/u&gt;&lt;/span&gt; refresh를 해야, 새로운 결과가 업데이트 된다는 것입니다. 쉽게 말하면 create materialzed view v_a as select * from a; 라는 것으로 뷰를 생성했다 해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 이 시점에서, 테이블 a를 조회했을 때의 결과를 v_a가 가지고 있습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;maa18.png&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTvXQY/btsfpeibmuA/0nEAK1SNQ2bzAMUJAnkvoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTvXQY/btsfpeibmuA/0nEAK1SNQ2bzAMUJAnkvoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTvXQY/btsfpeibmuA/0nEAK1SNQ2bzAMUJAnkvoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTvXQY%2FbtsfpeibmuA%2F0nEAK1SNQ2bzAMUJAnkvoK%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;333&quot; height=&quot;162&quot; data-filename=&quot;maa18.png&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;별개의 공간에 가지고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;maa19.png&quot; data-origin-width=&quot;337&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dZklml/btsfeieIaRl/wm2njYFVH1pghSTOcqkilK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dZklml/btsfeieIaRl/wm2njYFVH1pghSTOcqkilK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dZklml/btsfeieIaRl/wm2njYFVH1pghSTOcqkilK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdZklml%2FbtsfeieIaRl%2Fwm2njYFVH1pghSTOcqkilK%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;337&quot; height=&quot;208&quot; data-filename=&quot;maa19.png&quot; data-origin-width=&quot;337&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;따라서 a라는 테이블에 c라는 레코드가 추가되어도, m_a에는 아무런 영향이 없습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;maa17.png&quot; data-origin-width=&quot;405&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y19cq/btsffvdMSHc/hDMuPeKPrPMvt8PbhrncZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y19cq/btsffvdMSHc/hDMuPeKPrPMvt8PbhrncZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y19cq/btsffvdMSHc/hDMuPeKPrPMvt8PbhrncZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY19cq%2FbtsffvdMSHc%2FhDMuPeKPrPMvt8PbhrncZk%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;405&quot; height=&quot;310&quot; data-filename=&quot;maa17.png&quot; data-origin-width=&quot;405&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;하나 놓치면 안 되는 것이 있습니다. matrialized view는 인덱스를 선언할 수 있습니다. 인덱스를 걸 수 있기 때문에, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;효율적인 = 연산이나 &amp;lt; 연산이 필요할 때 보다 효율적인 결과를 낼 수 있을 겁니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>코딩/Sql</category>
      <category>postgresql</category>
      <category>View</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/890</guid>
      <comments>https://codingdog.tistory.com/entry/postgresql-materialized-view%EC%99%80-view%EC%9D%98-%EC%B0%A8%EC%9D%B4%EA%B0%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EC%A7%80-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry890comment</comments>
      <pubDate>Sat, 13 May 2023 23:59:34 +0900</pubDate>
    </item>
    <item>
      <title>java equals vs compareto의 차이점을 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/java-equals-vs-compareto%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;java에는 equals랑 compareTo가 있습니다. 이 둘을 언제 쓰는지, 차이점을 간단하게 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ev1.png&quot; data-origin-width=&quot;453&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLVC7p/btsffvRM6Pb/OqnLkkU25eCGDN8u2NKHN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLVC7p/btsffvRM6Pb/OqnLkkU25eCGDN8u2NKHN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLVC7p/btsffvRM6Pb/OqnLkkU25eCGDN8u2NKHN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLVC7p%2FbtsffvRM6Pb%2FOqnLkkU25eCGDN8u2NKHN0%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;453&quot; height=&quot;194&quot; data-filename=&quot;ev1.png&quot; data-origin-width=&quot;453&quot; data-origin-height=&quot;194&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;먼저&amp;nbsp; compareTo는 비교를 하기 위해 쓰입니다. 순서를 정하기 위해서. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;뒤에 for order가 붙은 것&lt;/b&gt;&lt;/span&gt;을 보면 알 수 있습니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;당연하게도, comparator의 compare도 같은 용도로 쓰입니다.&lt;/u&gt;&lt;/span&gt; Compares object for order. 위에서 말한 순서는 무엇일까요? 랭킹을 정한다고 생각해 봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;이름과 점수로 이루어진 object가 있습니다. 우리는 점수별로 순서를 정하려고 합니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ev2.png&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;221&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nh8ID/btsfdroVq64/o18fAO3swcaqBVSsB3Df3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nh8ID/btsfdroVq64/o18fAO3swcaqBVSsB3Df3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nh8ID/btsfdroVq64/o18fAO3swcaqBVSsB3Df3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNh8ID%2FbtsfdroVq64%2Fo18fAO3swcaqBVSsB3Df3k%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;426&quot; height=&quot;221&quot; data-filename=&quot;ev2.png&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;221&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;Obj 클래스는 이 상황에서 학생에 대한 데이터를 저장할 거에요. score와 name이 있는데요. 각각 받은 점수와 이름을 저장하고 있습니다. compareTo는 아래와 같이 오버라이딩을 하면 될 거에요.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ev3.png&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7weES/btse94BFhqm/y6HEs5JdlVk4WdmrGduP8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7weES/btse94BFhqm/y6HEs5JdlVk4WdmrGduP8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7weES/btse94BFhqm/y6HEs5JdlVk4WdmrGduP8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7weES%2Fbtse94BFhqm%2Fy6HEs5JdlVk4WdmrGduP8k%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;608&quot; height=&quot;64&quot; data-filename=&quot;ev3.png&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;해당 학생의 score와 다른 학생의 score를 비교했을 때, 해당 학생이 더 점수가 크다면 음수 값을 리턴해서 앞의 순서에 오게 한다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ev7.png&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;307&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xNxmV/btsfe7XMhlL/J4lg7k3erHKZJrzZfv6SXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xNxmV/btsfe7XMhlL/J4lg7k3erHKZJrzZfv6SXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xNxmV/btsfe7XMhlL/J4lg7k3erHKZJrzZfv6SXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxNxmV%2Fbtsfe7XMhlL%2FJ4lg7k3erHKZJrzZfv6SXk%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;467&quot; height=&quot;307&quot; data-filename=&quot;ev7.png&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;307&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;이제 TreeMap에 점수가 5이고 이름이 A인 사람, 점수가 3이고 이름이 B인 사람, 점수가 2이고 이름이 C인 사람을 넣어 보겠습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ev8.png&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diARaF/btsfgikrW8T/6bCXeZqTYK7IXXkFS7PU10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diARaF/btsfgikrW8T/6bCXeZqTYK7IXXkFS7PU10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diARaF/btsfgikrW8T/6bCXeZqTYK7IXXkFS7PU10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiARaF%2FbtsfgikrW8T%2F6bCXeZqTYK7IXXkFS7PU10%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;370&quot; height=&quot;68&quot; data-filename=&quot;ev8.png&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;그러면, 점수가 5인 학생이 가장 앞에 왔음을 볼 수 있어요.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ev6.png&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEcXo2/btsfdX868a8/PAthWy5knwzx49If4SSc4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEcXo2/btsfdX868a8/PAthWy5knwzx49If4SSc4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEcXo2/btsfdX868a8/PAthWy5knwzx49If4SSc4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEcXo2%2FbtsfdX868a8%2FPAthWy5knwzx49If4SSc4k%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;250&quot; height=&quot;168&quot; data-filename=&quot;ev6.png&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;즉, score가 5인 사람과 3인 사람을 비교했을 때, 순서를 정하는 기준을 compareTo로 하는 것입니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;노란색 객체가 파란색 객체보다 order가 앞에 와야 한다면 음수 값을, 뒤에 와야 한다면 0보다 큰 값을 돌려주면 됩니다.&lt;/u&gt;&lt;/span&gt; 만약에 같으면? 0을 리턴하면 됩니다.&amp;nbsp;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ev9.png&quot; data-origin-width=&quot;455&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Pfxvr/btse94aCB3r/P8KIdYd8UjL0253tnP1UP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Pfxvr/btse94aCB3r/P8KIdYd8UjL0253tnP1UP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Pfxvr/btse94aCB3r/P8KIdYd8UjL0253tnP1UP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPfxvr%2Fbtse94aCB3r%2FP8KIdYd8UjL0253tnP1UP1%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;455&quot; height=&quot;308&quot; data-filename=&quot;ev9.png&quot; data-origin-width=&quot;455&quot; data-origin-height=&quot;308&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;이름이 A인 학생과 B인 학생, 그리고 C인 학생이 있어요. 점수가 모두 같으므로, 이들 각각은 compareTo의 리턴 값이 0입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ev11.png&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;161&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEeYvh/btsfcOknWQJ/5Bfg48YbKAIQfrTCMG8a5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEeYvh/btsfcOknWQJ/5Bfg48YbKAIQfrTCMG8a5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEeYvh/btsfcOknWQJ/5Bfg48YbKAIQfrTCMG8a5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEeYvh%2FbtsfcOknWQJ%2F5Bfg48YbKAIQfrTCMG8a5K%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;368&quot; height=&quot;161&quot; data-filename=&quot;ev11.png&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;161&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;굳이 그림으로 그리자면 이런 상황입니다. 고로 stable sort가 아니라면, 이 셋은 어떤 순서로 와도 상관이 없게 되어 버립니다만, 오브젝트의 list는 tim sort를 씁니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ev10.png&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;71&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTaZWd/btse92cNUIL/ZKeqhbKqGsNMuRjeblBDZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTaZWd/btse92cNUIL/ZKeqhbKqGsNMuRjeblBDZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTaZWd/btse92cNUIL/ZKeqhbKqGsNMuRjeblBDZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTaZWd%2Fbtse92cNUIL%2FZKeqhbKqGsNMuRjeblBDZ0%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;393&quot; height=&quot;71&quot; data-filename=&quot;ev10.png&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;71&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;순서는 유지됩니다. 어찌 되었던 순서를 정하는 기준을 compareTo를 오버라이딩 할 수 있어요. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;compareTo가 0이라는 의미는, 앞에 오나 뒤에 오나 별 상관이 없다.&lt;/b&gt;&lt;/span&gt; 정도로 해석해도 됩니다. &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;정렬하는 경우, stable sort인 경우 들어온 순서대로, unstable인 경우 rank가 같으면 아무렇게나 정렬될 겁니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;여기서 질문. a.compareTo(b), 혹은 comparator.compare(a, b)의 리턴값이 0이기 때문에 두 객체는 논리적으로 동등할까요? 물론 완전히 같은 객체를 비교한다면 0이 나올 순 있습니다. 그런데 위에서도 보았다 시피 동점자가 여러 명 있는 경우, 각각의 학생들은 동등하다고 볼 수 없습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ev12.png&quot; data-origin-width=&quot;384&quot; data-origin-height=&quot;201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3Nd0v/btsfdaATh8L/8Q89QDcSdvCCO8RI86knwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3Nd0v/btsfdaATh8L/8Q89QDcSdvCCO8RI86knwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3Nd0v/btsfdaATh8L/8Q89QDcSdvCCO8RI86knwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3Nd0v%2FbtsfdaATh8L%2F8Q89QDcSdvCCO8RI86knwk%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;384&quot; height=&quot;201&quot; data-filename=&quot;ev12.png&quot; data-origin-width=&quot;384&quot; data-origin-height=&quot;201&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;단지, 5점을 맞은 학생들과 4점을 맞은 학생들의 순서를 정하기 위해 compareTo와 같은 것을 쓴 것 뿐이였습니다. 다시 말하지만 순서를 정하는 기준이 점수라고 합시다. 두 객체를 compare로 비교했을 때 0이 나왔다는 의미는, 동점자였다는 의미입니다. 비교한 결과가 0이라고 해도, 같은 학생이 아닐 수도 있습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ev13.png&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;217&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yCfxV/btsfclWXGyf/UMSf4m3ISjglwlwBbo5WQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yCfxV/btsfclWXGyf/UMSf4m3ISjglwlwBbo5WQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yCfxV/btsfclWXGyf/UMSf4m3ISjglwlwBbo5WQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyCfxV%2FbtsfclWXGyf%2FUMSf4m3ISjglwlwBbo5WQK%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;369&quot; height=&quot;217&quot; data-filename=&quot;ev13.png&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;217&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;만약에 학교에 같은 이름을 가진 둘 이상의 학생이 없다고 해 보겠습니다. 그러면, 이름이 같으면 같은 학생이고, 그렇지 않으면 다른 학생이라고 할 수 있겠습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ev14.png&quot; data-origin-width=&quot;557&quot; data-origin-height=&quot;151&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjxujM/btsfaISGvGO/bTxNoeXMh4snaEb9AXEtB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjxujM/btsfaISGvGO/bTxNoeXMh4snaEb9AXEtB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjxujM/btsfaISGvGO/bTxNoeXMh4snaEb9AXEtB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjxujM%2FbtsfaISGvGO%2FbTxNoeXMh4snaEb9AXEtB0%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;557&quot; height=&quot;151&quot; data-filename=&quot;ev14.png&quot; data-origin-width=&quot;557&quot; data-origin-height=&quot;151&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;그렇다면, equals를 위와 같이 override 할 수 있습니다. 단순히 name만 같으면 같은 학생이다. 라고 판별해 버리면 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ev15.png&quot; data-origin-width=&quot;463&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nQHUs/btsfeBxYh46/yzXBs8Wp8QKecxTxdvsfL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nQHUs/btsfeBxYh46/yzXBs8Wp8QKecxTxdvsfL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nQHUs/btsfeBxYh46/yzXBs8Wp8QKecxTxdvsfL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnQHUs%2FbtsfeBxYh46%2FyzXBs8Wp8QKecxTxdvsfL0%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;463&quot; height=&quot;263&quot; data-filename=&quot;ev15.png&quot; data-origin-width=&quot;463&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;학생 s1에 대한 데이터가 있습니다. 점수가 5이고, 이름이 &quot;A&quot;라는군요. 학생 s2는 점수가 5이고, 이름이 &quot;B&quot;입니다. 이 둘을 비교했을 때에는 0이 나옵니다. 그런데, 같은 학생은 아닙니다. 왜? 이름이 다르기 때문입니다. 단지, 동점자여서 비교 함수의 리턴 결과가 0이 나왔을 뿐입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;s1과 s3은 어떤가요? 이름까지 같습니다. equals에서 이름이 같으면 동일한 학생으로 본다고 했습니다. 고로 3번째는 true가 나옵니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ev16.png&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIbayI/btsfbyhPWxH/Q4sRlPQrYPk2KJGi36mxP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIbayI/btsfbyhPWxH/Q4sRlPQrYPk2KJGi36mxP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIbayI/btsfbyhPWxH/Q4sRlPQrYPk2KJGi36mxP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIbayI%2FbtsfbyhPWxH%2FQ4sRlPQrYPk2KJGi36mxP1%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;322&quot; height=&quot;112&quot; data-filename=&quot;ev16.png&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;쉽게 정리하면, &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;순위를 정하기 위해 기준을 정하는 함수가 compareTo와 compare 같은 비교 함수&lt;/b&gt;&lt;/span&gt;입니다. 두 객체를 이 메서드들로 비교했을 때 0이 나왔다고 논리적으로 동일한 객체가 아닙니다. 왜? 동점자 (동순위 사람)이 있을 수 있기 때문입니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;논리적으로 같은지를 판정하는 함수가 equals라고 할 수 있겠습니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>코딩/Java</category>
      <category>compareTo</category>
      <category>equals</category>
      <category>Java</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/889</guid>
      <comments>https://codingdog.tistory.com/entry/java-equals-vs-compareto%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry889comment</comments>
      <pubDate>Fri, 12 May 2023 23:56:18 +0900</pubDate>
    </item>
    <item>
      <title>java treemap compareto나 compare만 구현했을 때 제대로 동작할까요?</title>
      <link>https://codingdog.tistory.com/entry/java-treemap-compareto%EB%82%98-compare%EB%A7%8C-%EA%B5%AC%ED%98%84%ED%96%88%EC%9D%84-%EB%95%8C-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%8F%99%EC%9E%91%ED%95%A0%EA%B9%8C%EC%9A%94</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;자바에는 TreeMap이 있습니다. 키 오브젝트가 Obj의 인스턴스라고 해 봅시다. Obj 클래스에서 equals를 override 하지 않고 compareTo를 비교하거나, Obj를 비교하는 방법인 comparator만 생성자로 넘기면 어떻게 될까요? 그래도 잘 동작할까요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;우리가 걱정하는 부분은 equals입니다. equals는 두 객체의 동등성을 비교합니다. 이 메서드가 어디에서 쓰이는지 TreeMap 내부에서 한 번 찾아보도록 합시다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cpt5.png&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGZ4t5/btseCEctHAo/e0knSv2bT67zvFlbr1JQ9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGZ4t5/btseCEctHAo/e0knSv2bT67zvFlbr1JQ9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGZ4t5/btseCEctHAo/e0knSv2bT67zvFlbr1JQ9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGZ4t5%2FbtseCEctHAo%2Fe0knSv2bT67zvFlbr1JQ9k%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;639&quot; height=&quot;106&quot; data-filename=&quot;cpt5.png&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt; putAll에 등장합니다. Objects.equals이네요. comparator를 넘기는 것으로 보아서는, 비교하는 객체를 넘기는 것으로 보입니다. 따라서, 키 값과는 아무런 연관이 없습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cpt6.png&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tdJoM/btseH0yw7rd/ONHMsQbkPKJr0SiK7YILPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tdJoM/btseH0yw7rd/ONHMsQbkPKJr0SiK7YILPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tdJoM/btseH0yw7rd/ONHMsQbkPKJr0SiK7YILPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtdJoM%2FbtseH0yw7rd%2FONHMsQbkPKJr0SiK7YILPK%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;577&quot; height=&quot;134&quot; data-filename=&quot;cpt6.png&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;다음 replace 입니다. 이 부분도 잘 보면, value에 대해서만 equals를 보고 있음을 알 수 있어요.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cpt7.png&quot; data-origin-width=&quot;567&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDMIUo/btseG666jMs/LkWOTXHU1n8opkNgxbLkuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDMIUo/btseG666jMs/LkWOTXHU1n8opkNgxbLkuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDMIUo/btseG666jMs/LkWOTXHU1n8opkNgxbLkuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDMIUo%2FbtseG666jMs%2FLkWOTXHU1n8opkNgxbLkuk%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;567&quot; height=&quot;116&quot; data-filename=&quot;cpt7.png&quot; data-origin-width=&quot;567&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;valEquals 함수 안에서도 equals가 쓰이는데요. 이 메서드는 Entry 내에서 쓰입니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;키 값에 대해서는 equals가 있으나 없으나 별 문제 없이 동작할 거 같은데요.&lt;/u&gt;&lt;/span&gt; put과 getEntry를 보겠습니다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cpt1.png&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vlHWX/btseGbnFKSK/gJBiw77X0KiTkHNqSk3GDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vlHWX/btseGbnFKSK/gJBiw77X0KiTkHNqSk3GDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vlHWX/btseGbnFKSK/gJBiw77X0KiTkHNqSk3GDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvlHWX%2FbtseGbnFKSK%2FgJBiw77X0KiTkHNqSk3GDK%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;564&quot; height=&quot;243&quot; data-filename=&quot;cpt1.png&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;243&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;먼저 put입니다. 원소를 추가할 때 이 메서드가 호출되게 됩니다. 해당 부분은 comparator가 있는지 없는지를 검사합니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cpt2.png&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;489&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v4ubx/btseKfWgYQn/mJD3rHGjq4onydzNkjVVEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v4ubx/btseKfWgYQn/mJD3rHGjq4onydzNkjVVEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v4ubx/btseKfWgYQn/mJD3rHGjq4onydzNkjVVEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv4ubx%2FbtseKfWgYQn%2FmJD3rHGjq4onydzNkjVVEk%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;619&quot; height=&quot;489&quot; data-filename=&quot;cpt2.png&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;489&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;만약에 compareTo를 오버라이딩 했고, comparator를 넘기지 않았다면 812번째 줄이 수행되게 됩니다. k.compareTo의 결과값을 가지고 무언가를 수행함을 볼 수 있습니다. 여기서, cmp가 0일 때 oldValue를 바로 리턴해 버리는 것을 볼 수 있습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cpt9.png&quot; data-origin-width=&quot;303&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVZyoZ/btseHlbVOjH/3nOZ9vS7P9nwcdBoVuSQe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVZyoZ/btseHlbVOjH/3nOZ9vS7P9nwcdBoVuSQe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVZyoZ/btseHlbVOjH/3nOZ9vS7P9nwcdBoVuSQe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVZyoZ%2FbtseHlbVOjH%2F3nOZ9vS7P9nwcdBoVuSQe0%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;303&quot; height=&quot;240&quot; data-filename=&quot;cpt9.png&quot; data-origin-width=&quot;303&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;&lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;만약에 현재 보고 있는 루트보다 넣을 키가 더 작다면 왼쪽 자식으로, 그렇지 않다면 오른쪽 자식으로 이동합니다.&lt;/b&gt;&lt;/span&gt; rb tree도 기본적으로는 &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;key 값의 대소를 기반으로 왼쪽으로 갈지, 오른쪽으로 갈지, 탐색을 끝낼 지를 판정합니다.&lt;/u&gt;&lt;/span&gt; 고로 해당 로직이 그대로 쓰이게 됩니다. 단지 rotate 연산이 추가로 있을 뿐입니다. 고로 순서가 같은 키가 중복해서 들어오는 걱정은 compareTo로 해결이 가능합니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cpt3.png&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjd189/btseHmaPeHz/RfBvKunKC3EwKOj7RHHYCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjd189/btseHmaPeHz/RfBvKunKC3EwKOj7RHHYCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjd189/btseHmaPeHz/RfBvKunKC3EwKOj7RHHYCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcjd189%2FbtseHmaPeHz%2FRfBvKunKC3EwKOj7RHHYCk%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;641&quot; height=&quot;177&quot; data-filename=&quot;cpt3.png&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;177&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;다음에 getEntry입니다. remove라던지 contains와 같이 TreeMap을 쓸 때 사용하는 주요 메서드의 경우, getEntry를 먼저 호출하게끔 되어 있습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cpt4.png&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d6kv03/btseKf9NbZ5/FlGl5rhVjkfPpGQbxlgZP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d6kv03/btseKf9NbZ5/FlGl5rhVjkfPpGQbxlgZP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d6kv03/btseKf9NbZ5/FlGl5rhVjkfPpGQbxlgZP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd6kv03%2FbtseKf9NbZ5%2FFlGl5rhVjkfPpGQbxlgZP1%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;418&quot; height=&quot;241&quot; data-filename=&quot;cpt4.png&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;241&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;여기서도 cmp의 값을 기준으로 왼쪽으로 가고, 오른쪽으로 가는 것을 반복함을 볼 수 있습니다. 당연하게도 cmp가 0인 경우, 그냥 해당 위치를 리턴해 버립니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;즉, key 값은 compare 기반으로 동작합니다.&lt;/u&gt;&lt;/span&gt; 따라서, &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;키로 이용될 것은 compareTo를 overriding 하거나, 키를 compare하는 비교 클래스를 생성자의 인자로 넣어버리면 됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;두 키의 순서가 같다는 것은 어떻게 알 수 나요? compare을 한 결과가 0인 것으로 알 수 있습니다. 굳이 왜 equals를 안 쓸까요? tree는 루트에 있는 값과 키 값을 비교 (ordering)을 해서 키 값이 작으면 왼쪽, 크면 오른쪽으로 가는 식으로 동작합니다. &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;비교가 필요한데, 동일한지에 대해서만 판정하면 될까요?&lt;/u&gt;&lt;/span&gt; 아닙니다. 고로 비교 연산이 적합합니다. hash 계열은 equals랑 hashCode 둘 다 필요한데요. 이는 키 값을 탐색하는 방식이 다르기 때문입니다. hash 계열은 아래와 같이 동작합니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cpt13.png&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/njWl3/btseCEQ6lSA/A1D1xkz7PsZ2LB3hSQEbAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/njWl3/btseCEQ6lSA/A1D1xkz7PsZ2LB3hSQEbAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/njWl3/btseCEQ6lSA/A1D1xkz7PsZ2LB3hSQEbAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnjWl3%2FbtseCEQ6lSA%2FA1D1xkz7PsZ2LB3hSQEbAK%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;465&quot; height=&quot;222&quot; data-filename=&quot;cpt13.png&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt; hashCode로 버킷값을 찾습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cpt14.png&quot; data-origin-width=&quot;469&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEniVl/btseGYau1uU/8BVphK8zAIpKxDZgmZr5v0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEniVl/btseGYau1uU/8BVphK8zAIpKxDZgmZr5v0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEniVl/btseGYau1uU/8BVphK8zAIpKxDZgmZr5v0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEniVl%2FbtseGYau1uU%2F8BVphK8zAIpKxDZgmZr5v0%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;469&quot; height=&quot;224&quot; data-filename=&quot;cpt14.png&quot; data-origin-width=&quot;469&quot; data-origin-height=&quot;224&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;버킷에 물려 있는 키들을 보면서 정말 같은지 동등성을 확인합니다. 물론 compareTo로 비교해서 0이면 같다고 판정하는 방법이 있을 겁니다. 그렇게 쓸 수는 있는데 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;어색한 용법입니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;그런데, value의 경우 이야기가 달라집니다. 몇 가지 기능이 의도하지 않는 방향으로 동작해 버릴 수 있습니다. 대표적으로 replace 입니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cpt10.png&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eLudfs/btseGM2afn2/kZjp3YhGDiU0sHnN4MRzMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eLudfs/btseGM2afn2/kZjp3YhGDiU0sHnN4MRzMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eLudfs/btseGM2afn2/kZjp3YhGDiU0sHnN4MRzMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeLudfs%2FbtseGM2afn2%2FkZjp3YhGDiU0sHnN4MRzMK%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;591&quot; height=&quot;309&quot; data-filename=&quot;cpt10.png&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;309&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;Obj는 compareTo만 오버라이딩 되어 있습니다. replace(key, v1, v2)는 key에 대응되는 값이 v1이면 v2로 교체합니다. 이 메서드는 제대로 수행될까요?&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cpt11.png&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/riuQn/btseF8xV3E9/Uqn1qVkhJtvkb1DnS9ZNs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/riuQn/btseF8xV3E9/Uqn1qVkhJtvkb1DnS9ZNs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/riuQn/btseF8xV3E9/Uqn1qVkhJtvkb1DnS9ZNs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FriuQn%2FbtseF8xV3E9%2FUqn1qVkhJtvkb1DnS9ZNs0%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;322&quot; height=&quot;68&quot; data-filename=&quot;cpt11.png&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;아닙니다. 이 메서드는 내부적으로 value 값을 비교할 때 equals를 사용하기 때문입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cpt12.png&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WyPLV/btseKb7qzD3/jzJLaUxbmwcwkBoWFOFKv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WyPLV/btseKb7qzD3/jzJLaUxbmwcwkBoWFOFKv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WyPLV/btseKb7qzD3/jzJLaUxbmwcwkBoWFOFKv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWyPLV%2FbtseKb7qzD3%2FjzJLaUxbmwcwkBoWFOFKv0%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;577&quot; height=&quot;187&quot; data-filename=&quot;cpt12.png&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;187&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;curValue와 oldValue를 Objects.equals의 인자로 넘기는 것을 보면 알 수 있습니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;정리하면, TreeMap은 키 값의 순서를 가지고 동작하는 자료구조입니다.&lt;/u&gt;&lt;/span&gt; 따라서, compare 클래스를 넣거나 compareTo를 override 하면 동작합니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;value의 경우 equals가 구현되어있지 않으면 동작하지 않는 기능이 있다는 것 정도만 알아가시면 됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>자료알고/자료구조</category>
      <category>Java</category>
      <category>Treemap</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/888</guid>
      <comments>https://codingdog.tistory.com/entry/java-treemap-compareto%EB%82%98-compare%EB%A7%8C-%EA%B5%AC%ED%98%84%ED%96%88%EC%9D%84-%EB%95%8C-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%8F%99%EC%9E%91%ED%95%A0%EA%B9%8C%EC%9A%94#entry888comment</comments>
      <pubDate>Thu, 11 May 2023 00:14:45 +0900</pubDate>
    </item>
    <item>
      <title>java stream maptoobj 함수에 대해 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/java-stream-maptoobj-%ED%95%A8%EC%88%98%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;java stream에서 maptoobj 함수는 중간 연산이라 되어 있습니다. 길이 n짜리 배열을 obj object n개로 채우려고 합니다. obj 클래스에는 int 자료형만 하나 있고, 우리는 이 n개의 obj가 깊은 복사가 되어야 해요. 이걸 stream을 써서 할 때, &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;Intstream의 range 메서드와, maptoObj를 사용하면 손쉽게 처리할 수 있습니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mo3.png&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btvvRB/btsezC5u4ZR/niZRc7x2ca5M771c8nSuG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btvvRB/btsezC5u4ZR/niZRc7x2ca5M771c8nSuG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btvvRB/btsezC5u4ZR/niZRc7x2ca5M771c8nSuG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtvvRB%2FbtsezC5u4ZR%2FniZRc7x2ca5M771c8nSuG0%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;422&quot; height=&quot;262&quot; data-filename=&quot;mo3.png&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;mapToObj 메서드를 봅시다. Intstream 뿐만이 아니라, Longstream과 DoubleStream에도 있습니다. 설명을 보면, 스트림으로부터 해당 함수를 적용한 객체 값들의 stream을 반환한다고 되어 있어요. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;즉 입력 스트림으로부터 무언가를 받아서, 새로운 결과 가지고 있는 스트림으로 변환합니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;n개의 크기를 가진 리스트에 깊은 복사한 Obj 오브젝트 n개를 채워야 한다고 해 볼게요. 그러면 단순하게 List를 새로 생성해서 Obj 객체를 추가해도 됩니다. 그런데, 조금 더 생각해 보면 아래와 같은 로직을 생각할 수 있습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mo5.png&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgkfzb/btsex3Q37pB/XRlA1wReqQYk9qFXYmWVD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgkfzb/btsex3Q37pB/XRlA1wReqQYk9qFXYmWVD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgkfzb/btsex3Q37pB/XRlA1wReqQYk9qFXYmWVD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbgkfzb%2Fbtsex3Q37pB%2FXRlA1wReqQYk9qFXYmWVD0%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;504&quot; height=&quot;186&quot; data-filename=&quot;mo5.png&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;1부터 5까지 있는 stream이 있어요. 이것을 아래와 같이 변환시키면 어떨까요?&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mo6.png&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;539&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqGZnN/btseAdEAjT5/Zx7JE7r63BpmLeftkkKeT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqGZnN/btseAdEAjT5/Zx7JE7r63BpmLeftkkKeT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqGZnN/btseAdEAjT5/Zx7JE7r63BpmLeftkkKeT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqGZnN%2FbtseAdEAjT5%2FZx7JE7r63BpmLeftkkKeT0%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;507&quot; height=&quot;539&quot; data-filename=&quot;mo6.png&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;539&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;하나의 원소가 새로운 new Obj(3)으로 바뀌는 것입니다. mapToXXX류가 이러한 역할을 수행합니다. 이 경우 IntStream의 원소들을 다른 obj로 변환시키는 apply 작업을 수행했습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mo7.png&quot; data-origin-width=&quot;503&quot; data-origin-height=&quot;560&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/msCRj/btsezEhWJNH/xlrM6y6Pz6koOcG7xk1TN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/msCRj/btsezEhWJNH/xlrM6y6Pz6koOcG7xk1TN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/msCRj/btsezEhWJNH/xlrM6y6Pz6koOcG7xk1TN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmsCRj%2FbtsezEhWJNH%2FxlrM6y6Pz6koOcG7xk1TN0%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;503&quot; height=&quot;560&quot; data-filename=&quot;mo7.png&quot; data-origin-width=&quot;503&quot; data-origin-height=&quot;560&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그림으로 그리면 이런 상황인 셈입니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;즉, mapToXXX는 스트림의 요소들을 다른 요소로 바꾼 새로운 스트림을 돌려줍니다.&lt;/b&gt;&lt;/span&gt; 위 그림에서는 x를 new Obj(3)으로 바꾸었습니다. 따라서, 1 2 3 4 5로 이루어져 있던 것을 new Obj(3), ... , new Obj(3)으로 대체하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이제 문제 상황을 다시 봅시다. 저는 객체 Obj n개가 채워진 ArrayList를 원합니다. 객체 n개는 깊은 복사가 되어야 하고요. 객체 Obj는 int 필드 하나만 주어져 있습니다. n = 4라고 해 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mo1.png&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dUAlu8/btsezM1xGNO/lNwcMuL5lP7pEIyNGCO730/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dUAlu8/btsezM1xGNO/lNwcMuL5lP7pEIyNGCO730/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dUAlu8/btsezM1xGNO/lNwcMuL5lP7pEIyNGCO730/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdUAlu8%2FbtsezM1xGNO%2FlNwcMuL5lP7pEIyNGCO730%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;490&quot; height=&quot;327&quot; data-filename=&quot;mo1.png&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;당연하게도, setter가 있기 때문에, 불변 객체가 아닙니다. 어떻게 하면 될까요? 로직부터 설계해 봅시다. 일단, 이전에 배웠던 range는 1부터 n까지의 순서를 가지는 stream을 생성합니다. 고로, IntStream.range(1, 5)를 먼저 수행합니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mo8.png&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;189&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bioC3u/btsey42hjt4/C6IRt60jmwckezQF8P1Wzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bioC3u/btsey42hjt4/C6IRt60jmwckezQF8P1Wzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bioC3u/btsey42hjt4/C6IRt60jmwckezQF8P1Wzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbioC3u%2Fbtsey42hjt4%2FC6IRt60jmwckezQF8P1Wzk%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;234&quot; height=&quot;189&quot; data-filename=&quot;mo8.png&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;189&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다음에, 해당 stream을 토대로 Obj로 이루어진 스트림을 새로 생성합니다. mapToObj로요.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mo10.png&quot; data-origin-width=&quot;232&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qKyg7/btsey33mkzv/n5uAZCeyl2pE8EyhXNEAY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qKyg7/btsey33mkzv/n5uAZCeyl2pE8EyhXNEAY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qKyg7/btsey33mkzv/n5uAZCeyl2pE8EyhXNEAY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqKyg7%2Fbtsey33mkzv%2Fn5uAZCeyl2pE8EyhXNEAY1%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;232&quot; height=&quot;280&quot; data-filename=&quot;mo10.png&quot; data-origin-width=&quot;232&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면, 1부터 5까지 순서로 이루어진 Stream이 new Obj(3)으로 이루어진 4개의 객체로 이루어 집니다. 참고로 각 원소별로 apply가 별개로 동작하므로 매번 새로운 객체가 생기게 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mo11.png&quot; data-origin-width=&quot;230&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/07Fjl/btseAT6T9OV/kc9LfcupnkqRLlCygCE9z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/07Fjl/btseAT6T9OV/kc9LfcupnkqRLlCygCE9z1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/07Fjl/btseAT6T9OV/kc9LfcupnkqRLlCygCE9z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F07Fjl%2FbtseAT6T9OV%2Fkc9LfcupnkqRLlCygCE9z1%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;230&quot; height=&quot;374&quot; data-filename=&quot;mo11.png&quot; data-origin-width=&quot;230&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;toList로 Stream을 List로 변환합니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mo2.png&quot; data-origin-width=&quot;543&quot; data-origin-height=&quot;221&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjjl04/btseywSxSEC/wM6V1vCBo5wQFC6p86bw8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjjl04/btseywSxSEC/wM6V1vCBo5wQFC6p86bw8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjjl04/btseywSxSEC/wM6V1vCBo5wQFC6p86bw8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbjjl04%2FbtseywSxSEC%2FwM6V1vCBo5wQFC6p86bw8K%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;543&quot; height=&quot;221&quot; data-filename=&quot;mo2.png&quot; data-origin-width=&quot;543&quot; data-origin-height=&quot;221&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;최종 코드는 20 ~ 21번째 줄에 나와 있습니다. 23번째 줄에 list의 0번째 원소의 x 값을 2로 바꾸어 봅시다. 만약에 저 객체들이 모두 얕은 복사가 되었다면, 모두 2가 출력되었을 겁니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mo4.png&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;65&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eCOM6m/btsezCEq0KT/PBTufxhDesgna2Z8rnLVM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eCOM6m/btsezCEq0KT/PBTufxhDesgna2Z8rnLVM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eCOM6m/btsezCEq0KT/PBTufxhDesgna2Z8rnLVM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeCOM6m%2FbtsezCEq0KT%2FPBTufxhDesgna2Z8rnLVM1%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;437&quot; height=&quot;65&quot; data-filename=&quot;mo4.png&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;65&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그런데 3이 출력되었습니다. 이유는 toList가 호출될 때 mapToObj에 있는 apply인 x -&amp;gt; new Obj(3)가 실행되기 때문입니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;각각의 element에 대해 적용되기 때문에 별개의 새로운 오브젝트 Obj가 생성됩니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>레퍼런스/예제</category>
      <category>Java</category>
      <category>maptoobj</category>
      <category>Stream</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/887</guid>
      <comments>https://codingdog.tistory.com/entry/java-stream-maptoobj-%ED%95%A8%EC%88%98%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry887comment</comments>
      <pubDate>Tue, 9 May 2023 23:57:19 +0900</pubDate>
    </item>
    <item>
      <title>git 상대 참조와 ^, ~에 대해 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/git-%EC%83%81%EB%8C%80-%EC%B0%B8%EC%A1%B0%EC%99%80-%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;git에서는 ~와 ^와 같은 것들이 있습니다. 그리고 상대 참조도 있어요. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;특정 커밋을 기준으로 참조한다는 의미입니다.&lt;/b&gt;&lt;/span&gt; 이들을 간단하게 알아보고 ~와 ^의 차이도 같이 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;실습을 할 git graph는 아래와 같이 되어 있습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rf1.png&quot; data-origin-width=&quot;455&quot; data-origin-height=&quot;229&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo5gJd/btsd1i1mduz/LRTyjDg0qCHVmyfYJHk4t1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo5gJd/btsd1i1mduz/LRTyjDg0qCHVmyfYJHk4t1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo5gJd/btsd1i1mduz/LRTyjDg0qCHVmyfYJHk4t1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo5gJd%2Fbtsd1i1mduz%2FLRTyjDg0qCHVmyfYJHk4t1%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;455&quot; height=&quot;229&quot; data-filename=&quot;rf1.png&quot; data-origin-width=&quot;455&quot; data-origin-height=&quot;229&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;뭔가 복잡해 보이는데요. 천천히 따라가 봅시다. HEAD는 커밋 e4621faa를 가리키고 있어요.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rf3.png&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;58&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JdwZn/btsd0nISat1/oZ0X6qmJSBFttyd1TKdNA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JdwZn/btsd0nISat1/oZ0X6qmJSBFttyd1TKdNA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JdwZn/btsd0nISat1/oZ0X6qmJSBFttyd1TKdNA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJdwZn%2Fbtsd0nISat1%2FoZ0X6qmJSBFttyd1TKdNA1%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;450&quot; height=&quot;58&quot; data-filename=&quot;rf3.png&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;58&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;~n은 기준이 되는 커밋으로부터, first parent로 가는 연산을 n번 하는 것&lt;/u&gt;&lt;/span&gt;입니다. 이게 무슨 말인가? HEAD는 e4621faa라고 했습니다. 해당 커밋으로부터 --first-parent들을 뽑아 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rf2.png&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cO4DlK/btsdZPS8Hes/vt0s5pUyu82KdbzCB2GCn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cO4DlK/btsdZPS8Hes/vt0s5pUyu82KdbzCB2GCn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cO4DlK/btsdZPS8Hes/vt0s5pUyu82KdbzCB2GCn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcO4DlK%2FbtsdZPS8Hes%2Fvt0s5pUyu82KdbzCB2GCn0%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;478&quot; height=&quot;345&quot; data-filename=&quot;rf2.png&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;e4621.., 15a595.., 431c9.. 이 순서대로 나와 있어요. 여기서 주목해야 할 점은 e4621.. 커밋의 부모는 1개가 아니라 2개입니다. 하나는 15a595.. 이고 다른 하나는 b6c69.. 이거였습니다. 이를 그림으로 표현해 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rf4.png&quot; data-origin-width=&quot;260&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bavlTU/btsdZ4ibf2y/xG9uinsmf3PTWJ4pHGrk8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bavlTU/btsdZ4ibf2y/xG9uinsmf3PTWJ4pHGrk8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bavlTU/btsdZ4ibf2y/xG9uinsmf3PTWJ4pHGrk8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbavlTU%2FbtsdZ4ibf2y%2FxG9uinsmf3PTWJ4pHGrk8K%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;260&quot; height=&quot;241&quot; data-filename=&quot;rf4.png&quot; data-origin-width=&quot;260&quot; data-origin-height=&quot;241&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;현재 HEAD가 가리키고 있는 커밋의 부모들을 표현해 보았습니다. 검은 실선으로 되어 있는 것은 1번째 부모인 15a59를 의미합니다. 다음에, 빨간색 점선으로 되어 있는 것은 e4621의 2번째 부모를 의미합니다. e4621로부터 1번째 부모로 1번 이동하면, 15a59가 됩니다. 이게 HEAD~1인 셈입니다. 기준이 되는 커밋이 어떤 것이였나요? HEAD였습니다. 그리고 이것은 HEAD^와도 같습니다. 즉, 현재 커밋으로부터 1번째 부모는 HEAD^인 셈입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rf5.png&quot; data-origin-width=&quot;273&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EPRxr/btsdZ0f634p/xhSqkmXc2PeZRSjKk8zOO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EPRxr/btsdZ0f634p/xhSqkmXc2PeZRSjKk8zOO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EPRxr/btsdZ0f634p/xhSqkmXc2PeZRSjKk8zOO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEPRxr%2FbtsdZ0f634p%2FxhSqkmXc2PeZRSjKk8zOO1%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;273&quot; height=&quot;382&quot; data-filename=&quot;rf5.png&quot; data-origin-width=&quot;273&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 HEAD~2는 어떻게 해석하면 될까요? HEAD의 1번째 부모의 1번째 부모를 의미합니다. HEAD는 e4621이였습니다. 이것의 1번째 부모는 15a59였습니다. 이 커밋의 1번째 부모는 431c9였습니다. 따라서, HEAD~2는 431c9가 됩니다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 ^{n}은 무엇을 의미할까요? 이는 기준 커밋의 n번째 부모를 의미합니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;대표적으로 머지가 된 경우, 부모가 여러 개일 수 있는데, 부모가 여러 개 나올 수 있습니다.&lt;/u&gt;&lt;/span&gt; 부모 여러 개 중에 하나로 이동하기 위해서는 필요하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rf6.png&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;56&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ll9jp/btsd1if2Nvm/59OYP6Q2CPQC4Y56WbHtYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ll9jp/btsd1if2Nvm/59OYP6Q2CPQC4Y56WbHtYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ll9jp/btsd1if2Nvm/59OYP6Q2CPQC4Y56WbHtYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fll9jp%2Fbtsd1if2Nvm%2F59OYP6Q2CPQC4Y56WbHtYK%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;417&quot; height=&quot;56&quot; data-filename=&quot;rf6.png&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;56&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;git rev-parse HEAD^2를 입력했더니, b6c69..가 나왔습니다. 이 말은, e4621..의 2번째 부모가 b6c69.. 라는 의미입니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rf7.png&quot; data-origin-width=&quot;264&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lxWBB/btsdZ0AmXmJ/lWYOdSMxh290oRmFurj6a1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lxWBB/btsdZ0AmXmJ/lWYOdSMxh290oRmFurj6a1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lxWBB/btsdZ0AmXmJ/lWYOdSMxh290oRmFurj6a1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlxWBB%2FbtsdZ0AmXmJ%2FlWYOdSMxh290oRmFurj6a1%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;264&quot; height=&quot;378&quot; data-filename=&quot;rf7.png&quot; data-origin-width=&quot;264&quot; data-origin-height=&quot;378&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그림으로 도식화 시키면 위와 같이 됩니다. 여기서 질문. HEAD^2^2는 무엇을 의미할까요? HEAD의 2번째 부모의 2번째 부모를 의미합니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rf8.png&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLJVri/btsd4ec0t1m/WL2WDbtXWywK261byoOQTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLJVri/btsd4ec0t1m/WL2WDbtXWywK261byoOQTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLJVri/btsd4ec0t1m/WL2WDbtXWywK261byoOQTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLJVri%2Fbtsd4ec0t1m%2FWL2WDbtXWywK261byoOQTK%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;389&quot; height=&quot;106&quot; data-filename=&quot;rf8.png&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;HEAD의 2번째 부모는 b6c69.. 였으니, 이 커밋의 2번째 부모를 찾으면 됩니다. git rev-parse b6c6994^2를 해 보니, 97d30..이 나오는군요.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rf9.png&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;371&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G22Ad/btsd0RQsPwH/wY7zqY2qPHrLsdvHT44P0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G22Ad/btsd0RQsPwH/wY7zqY2qPHrLsdvHT44P0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G22Ad/btsd0RQsPwH/wY7zqY2qPHrLsdvHT44P0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG22Ad%2Fbtsd0RQsPwH%2FwY7zqY2qPHrLsdvHT44P0K%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;408&quot; height=&quot;371&quot; data-filename=&quot;rf9.png&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;371&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;b6c69..의 부모도 2개밖에 없고, b6c69..의 2번째 부모가 97d30.. 이니 1번째 부모는 50791이 됩니다. HEAD는 e4621 커밋입니다. 그리고, HEAD^2^2는 HEAD의 2번째 부모의 2번째 부모입니다. 위 그림에서는 빨간색 화살표만 따라가면 나옵니다. 따라서, 커밋 HEAD^2^2는 97d30..이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 HEAD^2^2~1은 어떤 커밋이 될까요?&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rf10.png&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;70&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dekRcF/btsd9LOYHWn/yd0qIQ8xRtOvXpncFjVvRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dekRcF/btsd9LOYHWn/yd0qIQ8xRtOvXpncFjVvRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dekRcF/btsd9LOYHWn/yd0qIQ8xRtOvXpncFjVvRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdekRcF%2Fbtsd9LOYHWn%2Fyd0qIQ8xRtOvXpncFjVvRK%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;522&quot; height=&quot;70&quot; data-filename=&quot;rf10.png&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;70&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다시 커밋 그림을 봅시다. HEAD^2^2가 97d30.. 이라고 했습니다. ~1은 기준 커밋으로부터 1번째 부모로 1번 이동하라는 의미입니다. 1번째 부모로 이동해 볼까요?&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rf11.png&quot; data-origin-width=&quot;415&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ca4R9P/btsd5Zs7NK3/KFGaMFXiEaUDuxTi7G1VKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ca4R9P/btsd5Zs7NK3/KFGaMFXiEaUDuxTi7G1VKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ca4R9P/btsd5Zs7NK3/KFGaMFXiEaUDuxTi7G1VKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fca4R9P%2Fbtsd5Zs7NK3%2FKFGaMFXiEaUDuxTi7G1VKK%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;415&quot; height=&quot;492&quot; data-filename=&quot;rf11.png&quot; data-origin-width=&quot;415&quot; data-origin-height=&quot;492&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;431c9로부터 뻗어나왔습니다. 따라서 431c9가 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rf12.png&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;61&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lFsLP/btsdZOUgib8/Q8kceJYN7DkBZkrAsiHJzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lFsLP/btsdZOUgib8/Q8kceJYN7DkBZkrAsiHJzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lFsLP/btsdZOUgib8/Q8kceJYN7DkBZkrAsiHJzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlFsLP%2FbtsdZOUgib8%2FQ8kceJYN7DkBZkrAsiHJzk%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;465&quot; height=&quot;61&quot; data-filename=&quot;rf12.png&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;61&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;즉, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;~n은 기준 커밋으로부터 1번째 부모로 n번 이동하라는 말이고&lt;/u&gt;&lt;/span&gt;, &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;^{n}은 기준 커밋으로부터 n번째 부모로 이동하라는 의미가 되겠습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>GIT</category>
      <category>Git</category>
      <category>상대참조</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/886</guid>
      <comments>https://codingdog.tistory.com/entry/git-%EC%83%81%EB%8C%80-%EC%B0%B8%EC%A1%B0%EC%99%80-%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry886comment</comments>
      <pubDate>Sat, 6 May 2023 23:59:08 +0900</pubDate>
    </item>
    <item>
      <title>git rev-parse 명령어로 현재 커밋 hash를 확인해 봅시다.</title>
      <link>https://codingdog.tistory.com/entry/git-rev-parse-%EB%AA%85%EB%A0%B9%EC%96%B4%EB%A1%9C-%ED%98%84%EC%9E%AC-%EC%BB%A4%EB%B0%8B-hash%EB%A5%BC-%ED%99%95%EC%9D%B8%ED%95%B4-%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;git에는 rev-parse라는 명령어&lt;/u&gt;&lt;/span&gt;가 있습니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;이 명령어로 현재 커밋의 hash라던지, 특정 커밋의 hash 등을 얻어올 수 있습니다.&lt;/b&gt;&lt;/span&gt; 예를 들자면, 현재 브랜치의 커밋에서 5개 전에 있는 commit의 hash라던지, 다른 branch의 head에서 5개 전의 커밋 hash 등도 얻어올 수 있습니다. 상대 참조의 개념을 이용하면 이런 것들은 어렵지 않게 할 수 있습니다. 이건 보너스로 실습하면서 알아봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rp1.png&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;211&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgPCXi/btsd6ufawBu/dA7dhLs1uSKkBK121A1CeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgPCXi/btsd6ufawBu/dA7dhLs1uSKkBK121A1CeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgPCXi/btsd6ufawBu/dA7dhLs1uSKkBK121A1CeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgPCXi%2Fbtsd6ufawBu%2FdA7dhLs1uSKkBK121A1CeK%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;661&quot; height=&quot;211&quot; data-filename=&quot;rp1.png&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;211&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;git graph는 위와 같습니다. 현재 브랜치의 head의 커밋 hash을 얻어오고 싶습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rp2.png&quot; data-origin-width=&quot;427&quot; data-origin-height=&quot;115&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuTOuU/btsdZqMAKtm/NWfYieQPyRX6aUEIgvS3GK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuTOuU/btsdZqMAKtm/NWfYieQPyRX6aUEIgvS3GK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuTOuU/btsdZqMAKtm/NWfYieQPyRX6aUEIgvS3GK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuTOuU%2FbtsdZqMAKtm%2FNWfYieQPyRX6aUEIgvS3GK%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;427&quot; height=&quot;115&quot; data-filename=&quot;rp2.png&quot; data-origin-width=&quot;427&quot; data-origin-height=&quot;115&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;그러면 단순히 &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;git rev-parse HEAD&lt;/u&gt;&lt;/span&gt; 이렇게 입력해 주시면 됩니다. &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;현재 제 커밋은 cef083c.. 임을 볼 수 있어요.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rp3.png&quot; data-origin-width=&quot;583&quot; data-origin-height=&quot;301&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rSBme/btsdZzQbcbY/mGDowKMcpEA7GzEI4MzPd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rSBme/btsdZzQbcbY/mGDowKMcpEA7GzEI4MzPd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rSBme/btsdZzQbcbY/mGDowKMcpEA7GzEI4MzPd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrSBme%2FbtsdZzQbcbY%2FmGDowKMcpEA7GzEI4MzPd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;583&quot; height=&quot;301&quot; data-filename=&quot;rp3.png&quot; data-origin-width=&quot;583&quot; data-origin-height=&quot;301&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;해당 커밋에서, main.txt가 최초로 추가되었습니다. 현재 제 작업 디렉토리에 main.txt가 있음을 봐야 겠네요.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rp4.png&quot; data-origin-width=&quot;358&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eoDgZM/btsd3eYehrE/hZZAk5bEBO3FYDoykyUq80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eoDgZM/btsd3eYehrE/hZZAk5bEBO3FYDoykyUq80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eoDgZM/btsd3eYehrE/hZZAk5bEBO3FYDoykyUq80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeoDgZM%2Fbtsd3eYehrE%2FhZZAk5bEBO3FYDoykyUq80%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;358&quot; height=&quot;264&quot; data-filename=&quot;rp4.png&quot; data-origin-width=&quot;358&quot; data-origin-height=&quot;264&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;있으니까 문제가 없네요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rp5.png&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crR4Zp/btsd3ew8lDf/RJxTgAO30BaQcp9k71J97k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crR4Zp/btsd3ew8lDf/RJxTgAO30BaQcp9k71J97k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crR4Zp/btsd3ew8lDf/RJxTgAO30BaQcp9k71J97k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrR4Zp%2Fbtsd3ew8lDf%2FRJxTgAO30BaQcp9k71J97k%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;530&quot; height=&quot;135&quot; data-filename=&quot;rp5.png&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;135&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;제가 많이 하는 git reset HEAD^에서 HEAD^는 어떤 커밋을 의미할까요? git rev-parse HEAD^를 입력해 보겠습니다. 그러면, 6abb가 나오게 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rp6.png&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mDX8x/btsd1izPg3f/tZYkqZj1zqDyXNKHHz5XQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mDX8x/btsd1izPg3f/tZYkqZj1zqDyXNKHHz5XQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mDX8x/btsd1izPg3f/tZYkqZj1zqDyXNKHHz5XQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmDX8x%2Fbtsd1izPg3f%2FtZYkqZj1zqDyXNKHHz5XQ1%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;659&quot; height=&quot;326&quot; data-filename=&quot;rp6.png&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;Merge branch 'test3'이 있었고, 해당 커밋 다음이 cef08.. 입니다. cef08..은 현재 HEAD가 가리키고 있는 커밋이니, 이전 커밋임을 알 수 있습니다. git graph로도 알 수 있는 사실이지만, cef08..의 부모 커밋은 6abb4.. 입니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rp9.png&quot; data-origin-width=&quot;140&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QeLMp/btsd4ecC2Uj/pJKAZrdE9fDtF0AZrzKLwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QeLMp/btsd4ecC2Uj/pJKAZrdE9fDtF0AZrzKLwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QeLMp/btsd4ecC2Uj/pJKAZrdE9fDtF0AZrzKLwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQeLMp%2Fbtsd4ecC2Uj%2FpJKAZrdE9fDtF0AZrzKLwK%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;140&quot; height=&quot;290&quot; data-filename=&quot;rp9.png&quot; data-origin-width=&quot;140&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;cef0 입장에서 보면 1번째 부모는 6abb인 셈입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rp7.png&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;115&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwMd2A/btsd1h1WBqV/1qQiTjfLkYGOZbPOKrMW30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwMd2A/btsd1h1WBqV/1qQiTjfLkYGOZbPOKrMW30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwMd2A/btsd1h1WBqV/1qQiTjfLkYGOZbPOKrMW30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwMd2A%2Fbtsd1h1WBqV%2F1qQiTjfLkYGOZbPOKrMW30%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;611&quot; height=&quot;115&quot; data-filename=&quot;rp7.png&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;115&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;그런데, git rev-parse HEAD^2를 하면 어떤가요? 이는 HEAD의 2번째 부모를 의미합니다. 그림으로 그리면 어떤 상황인가? 이런 상황입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rp10.png&quot; data-origin-width=&quot;175&quot; data-origin-height=&quot;299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qH98g/btsd0vsFJSI/ePTqyev7PGvOIKZIp7Qup0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qH98g/btsd0vsFJSI/ePTqyev7PGvOIKZIp7Qup0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qH98g/btsd0vsFJSI/ePTqyev7PGvOIKZIp7Qup0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqH98g%2Fbtsd0vsFJSI%2FePTqyev7PGvOIKZIp7Qup0%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;175&quot; height=&quot;299&quot; data-filename=&quot;rp10.png&quot; data-origin-width=&quot;175&quot; data-origin-height=&quot;299&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;빨간 점선을 따라가게 되는데, 커밋이 없는 상황입니다. unknown이니 에러를 뱉겠군요.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rp8.png&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IiIw8/btsd4F2jSSy/ZDEluHq36Hd9AOI0SGvyL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IiIw8/btsd4F2jSSy/ZDEluHq36Hd9AOI0SGvyL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IiIw8/btsd4F2jSSy/ZDEluHq36Hd9AOI0SGvyL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIiIw8%2Fbtsd4F2jSSy%2FZDEluHq36Hd9AOI0SGvyL1%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;497&quot; height=&quot;109&quot; data-filename=&quot;rp8.png&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;이제 git rev-parse HEAD~2를 입력해 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rp11.png&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r3CAJ/btsd5Ygi4IZ/3wWz4YJqP8DscTgkII0IZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r3CAJ/btsd5Ygi4IZ/3wWz4YJqP8DscTgkII0IZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r3CAJ/btsd5Ygi4IZ/3wWz4YJqP8DscTgkII0IZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr3CAJ%2Fbtsd5Ygi4IZ%2F3wWz4YJqP8DscTgkII0IZ0%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;477&quot; height=&quot;108&quot; data-filename=&quot;rp11.png&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;HEAD~2는 현재 HEAD로부터 부모의 부모 커밋을 의미합니다. 그런데 깃 그래프를 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rp12.png&quot; data-origin-width=&quot;727&quot; data-origin-height=&quot;189&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rff7b/btsdZ43bPgp/Whvbd3embMF1WQCOW6pUP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rff7b/btsdZ43bPgp/Whvbd3embMF1WQCOW6pUP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rff7b/btsdZ43bPgp/Whvbd3embMF1WQCOW6pUP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frff7b%2FbtsdZ43bPgp%2FWhvbd3embMF1WQCOW6pUP0%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;727&quot; height=&quot;189&quot; data-filename=&quot;rp12.png&quot; data-origin-width=&quot;727&quot; data-origin-height=&quot;189&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;HEAD로부터 1개 전 커밋이 6abb..인데, 2개 전 커밋은 b6c..가 될 수도 있고, 15a5..가 될 수 있는 상황입니다. 그림으로 그리면 이런 상황입니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rp14.png&quot; data-origin-width=&quot;292&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Pu2ch/btsd6sPcrSd/BpAmm1pfD98wxUq5yUtxJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Pu2ch/btsd6sPcrSd/BpAmm1pfD98wxUq5yUtxJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Pu2ch/btsd6sPcrSd/BpAmm1pfD98wxUq5yUtxJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPu2ch%2Fbtsd6sPcrSd%2FBpAmm1pfD98wxUq5yUtxJK%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;292&quot; height=&quot;446&quot; data-filename=&quot;rp14.png&quot; data-origin-width=&quot;292&quot; data-origin-height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;6abb..의 first parent는 어느 쪽일까요? git log 6abb.. --first-parent로 1번째 parent만 찾아보겠습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rp15.png&quot; data-origin-width=&quot;453&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cs7t6h/btsd0SBogBP/kuAVtd7tlsdKEVB3E8IC0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cs7t6h/btsd0SBogBP/kuAVtd7tlsdKEVB3E8IC0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cs7t6h/btsd0SBogBP/kuAVtd7tlsdKEVB3E8IC0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcs7t6h%2Fbtsd0SBogBP%2FkuAVtd7tlsdKEVB3E8IC0K%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;453&quot; height=&quot;266&quot; data-filename=&quot;rp15.png&quot; data-origin-width=&quot;453&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;b6c6.. 이네요. 이는 git log 명령어에 --first-parent 옵션을 주면 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>GIT</category>
      <category>Git</category>
      <category>rev-parse</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/885</guid>
      <comments>https://codingdog.tistory.com/entry/git-rev-parse-%EB%AA%85%EB%A0%B9%EC%96%B4%EB%A1%9C-%ED%98%84%EC%9E%AC-%EC%BB%A4%EB%B0%8B-hash%EB%A5%BC-%ED%99%95%EC%9D%B8%ED%95%B4-%EB%B4%85%EC%8B%9C%EB%8B%A4#entry885comment</comments>
      <pubDate>Fri, 5 May 2023 23:53:36 +0900</pubDate>
    </item>
    <item>
      <title>pillow transpose 함수와 mode에 대해 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/pillow-transpose-%ED%95%A8%EC%88%98%EC%99%80-mode%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;pillow의 transpose는 이미지를 선이나 점을 기준으로 &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;뒤집을 때에도 쓰이고, 회전시킬 때에도 쓰입니다.&lt;/b&gt;&lt;/span&gt; 간단하게 실습해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tp2.png&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;513&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A2PwF/btsdO2rg4bf/jpP2dZBRnR5iQxlX4tMItK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A2PwF/btsdO2rg4bf/jpP2dZBRnR5iQxlX4tMItK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A2PwF/btsdO2rg4bf/jpP2dZBRnR5iQxlX4tMItK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA2PwF%2FbtsdO2rg4bf%2FjpP2dZBRnR5iQxlX4tMItK%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;559&quot; height=&quot;513&quot; data-filename=&quot;tp2.png&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;513&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저 원본 이미지는 LEFT입니다. transpose 함수는 리터럴 0부터 6까지를 넘기게 됩니다. 이들 각각은 회전시키거나, 뒤집을 방법을 의미해요.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tp1.png&quot; data-origin-width=&quot;405&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2DiQo/btsdPekFgli/KOz6UrWqQtEig8p6JD6z40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2DiQo/btsdPekFgli/KOz6UrWqQtEig8p6JD6z40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2DiQo/btsdPekFgli/KOz6UrWqQtEig8p6JD6z40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2DiQo%2FbtsdPekFgli%2FKOz6UrWqQtEig8p6JD6z40%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;405&quot; height=&quot;138&quot; data-filename=&quot;tp1.png&quot; data-origin-width=&quot;405&quot; data-origin-height=&quot;138&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;left.jpeg를 엽니다. 다음에 img.transpose(0)을 한 다음에, save를 합니다. 그러면, 0번 방법으로 뒤집거나 회전시키게 됩니다. 0번 방법은 무엇일까요?&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tp3.png&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;509&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lMKsa/btsdQLWg7Ce/uX12jYopmKKE9UEo5akfCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lMKsa/btsdQLWg7Ce/uX12jYopmKKE9UEo5akfCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lMKsa/btsdQLWg7Ce/uX12jYopmKKE9UEo5akfCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlMKsa%2FbtsdQLWg7Ce%2FuX12jYopmKKE9UEo5akfCk%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;551&quot; height=&quot;509&quot; data-filename=&quot;tp3.png&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;509&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;기존 이미지에서 무엇이 바뀌었나요? 좌우 대칭이 되어 버렸습니다. FLIP_LEFT_RIGHT입니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;기존 LEFT 그림에서 L 앞에 세로선을 기준으로 뒤집었다고 생각하시면 되겠습니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tp4.png&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;507&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3noDy/btsdPA8NP7v/7vs2jiZcmbEfd3wcA1EN6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3noDy/btsdPA8NP7v/7vs2jiZcmbEfd3wcA1EN6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3noDy/btsdPA8NP7v/7vs2jiZcmbEfd3wcA1EN6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3noDy%2FbtsdPA8NP7v%2F7vs2jiZcmbEfd3wcA1EN6k%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;549&quot; height=&quot;507&quot; data-filename=&quot;tp4.png&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;507&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다음 1번은 어떤가요? 상하가 뒤집혀 버렸습니다. LEFT 밑에 가로선을 기준으로 뒤집어 버린 것입니다. FILP_TOP_BOTTOM인 셈입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다음 2, 3, 4번은 이미지를 회전하는 것입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tp6.png&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oGvsi/btsdRjLZuPa/HWuGVfz22ipBFYY0ULB36k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oGvsi/btsdRjLZuPa/HWuGVfz22ipBFYY0ULB36k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oGvsi/btsdRjLZuPa/HWuGVfz22ipBFYY0ULB36k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoGvsi%2FbtsdRjLZuPa%2FHWuGVfz22ipBFYY0ULB36k%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;849&quot; height=&quot;382&quot; data-filename=&quot;tp6.png&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;left_2입니다. 2번 방법입니다. 기존 이미지에서 윈도우 뷰어 프로그램을 이용해서 시계 방향으로 90도 3번 회전시켰습니다. 공식 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;a style=&quot;color: #f89009;&quot; href=&quot;https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Transpose&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;문서&lt;/a&gt;&lt;/span&gt;에서는 ROTATE_90인데요. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;원본 사진을 반시계 방향으로 90도 회전시킨 것을 의미합니다.&amp;nbsp;&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tp7.png&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDYqCE/btsdOuBTd2J/81NmGXdychkaMRnADINtBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDYqCE/btsdOuBTd2J/81NmGXdychkaMRnADINtBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDYqCE/btsdOuBTd2J/81NmGXdychkaMRnADINtBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDYqCE%2FbtsdOuBTd2J%2F81NmGXdychkaMRnADINtBK%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;454&quot; height=&quot;330&quot; data-filename=&quot;tp7.png&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;330&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그러면 ROTATE_180은 무엇을 의미할까요? 원본 사진을 180도 회전시킨 것입니다. &lt;/span&gt;고로 위 사진과 같이 됩니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tp5.png&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;582&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dL3rYh/btsdPuuhU4X/yeiDYgCQEdrKgfjGrI5s4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dL3rYh/btsdPuuhU4X/yeiDYgCQEdrKgfjGrI5s4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dL3rYh/btsdPuuhU4X/yeiDYgCQEdrKgfjGrI5s4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdL3rYh%2FbtsdPuuhU4X%2FyeiDYgCQEdrKgfjGrI5s4K%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;730&quot; height=&quot;582&quot; data-filename=&quot;tp5.png&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;582&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;4번 방법은 원본 사진을 반시계 방향으로 270도 회전시킨 것입니다. 이 말은 시계 방향으로 90도 회전시킨 것과 같습니다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;5번과 6번은 각각 TRANSPOSE와 TRANSVERSE입니다. 이 둘은 또 무엇인가? &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;먼저 TRANSPOSE는 (x, y)였던 것이 (y, x)로 변환이 일어나는 것입니다.&lt;/u&gt;&lt;/span&gt; (1, 2)와 (2, 1), 그리고 (-3, 2)와 (2, -3)은 y=x축 대칭입니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tp8.png&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXbcVI/btsdOz3TtiM/67OeOLBfuwWhtZPza80Tw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXbcVI/btsdOz3TtiM/67OeOLBfuwWhtZPza80Tw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXbcVI/btsdOz3TtiM/67OeOLBfuwWhtZPza80Tw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXbcVI%2FbtsdOz3TtiM%2F67OeOLBfuwWhtZPza80Tw0%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;436&quot; height=&quot;241&quot; data-filename=&quot;tp8.png&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;241&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;간단하게 L자 그림을 그려 보겠습니다. y=x는 1번, 4번 영역을 지나가고 있어요. 따라서 2번 영역과 y=x 대칭인 것은 3번입니다. 따라서 L을 TRANSPOSE 시키면 ㄱ이 되게 됩니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tp9.png&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMGZ6Q/btsdQekaJti/IJdGBjcL3YhQKB8LYOHRW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMGZ6Q/btsdQekaJti/IJdGBjcL3YhQKB8LYOHRW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMGZ6Q/btsdQekaJti/IJdGBjcL3YhQKB8LYOHRW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMGZ6Q%2FbtsdQekaJti%2FIJdGBjcL3YhQKB8LYOHRW0%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;385&quot; height=&quot;215&quot; data-filename=&quot;tp9.png&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;215&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다음에, L...을 y=x축 대칭을 시켜 봅시다. 그러면 1행에 ㄱ, 2행에 . , ... 요런 패턴으로 나오게 됩니다. 대칭 축을 그리면 아래와 같습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tp12.png&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baF660/btsdPd0lY9f/BRR8IEMzZDvjeI7tBvVY6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baF660/btsdPd0lY9f/BRR8IEMzZDvjeI7tBvVY6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baF660/btsdPd0lY9f/BRR8IEMzZDvjeI7tBvVY6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaF660%2FbtsdPd0lY9f%2FBRR8IEMzZDvjeI7tBvVY6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;487&quot; height=&quot;514&quot; data-filename=&quot;tp12.png&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;이해가 가실려나요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tp10.png&quot; data-origin-width=&quot;357&quot; data-origin-height=&quot;377&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SQdcI/btsdPKKqyih/pk6bWSvUaLdq2erUneu7Q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SQdcI/btsdPKKqyih/pk6bWSvUaLdq2erUneu7Q0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SQdcI/btsdPKKqyih/pk6bWSvUaLdq2erUneu7Q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSQdcI%2FbtsdPKKqyih%2Fpk6bWSvUaLdq2erUneu7Q0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;357&quot; height=&quot;377&quot; data-filename=&quot;tp10.png&quot; data-origin-width=&quot;357&quot; data-origin-height=&quot;377&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;따라서 이런 그림이 나오게 됩니다. 그런데, 이것을 조금 더 쉽게 이해하는 방법이 있습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tp11.png&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K2B1M/btsdPNUG0VC/kUskR3gM8r8ceuQ96UPYwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K2B1M/btsdPNUG0VC/kUskR3gM8r8ceuQ96UPYwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K2B1M/btsdPNUG0VC/kUskR3gM8r8ceuQ96UPYwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK2B1M%2FbtsdPNUG0VC%2FkUskR3gM8r8ceuQ96UPYwk%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;661&quot; height=&quot;472&quot; data-filename=&quot;tp11.png&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;왼쪽 그림은 LEFT 그림을 좌우로 filp 한 것입니다. 오른쪽 그림은 좌우로 filp한 그림을 반시계 방향으로 90도 회전시킨 것입니다. 오른쪽 그림과 5번 모드가 정확하게 일치함을 볼 수 있어요.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tp13.png&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpXJYH/btsdPJLwYB4/rN0Cxg4YlZrWL2vyiKjeN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpXJYH/btsdPJLwYB4/rN0Cxg4YlZrWL2vyiKjeN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpXJYH/btsdPJLwYB4/rN0Cxg4YlZrWL2vyiKjeN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpXJYH%2FbtsdPJLwYB4%2FrN0Cxg4YlZrWL2vyiKjeN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;487&quot; height=&quot;514&quot; data-filename=&quot;tp13.png&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;6번 모드는 TRANSVERSE 모드입니다. 이 모드는 아래 선을 기준으로 대칭이동 시킨 것입니다. 그러면 아래와 같이 나올 겁니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tp14.png&quot; data-origin-width=&quot;391&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jpu1r/btsdNvncRRz/wFQLYaetLUpl1KQEKUYue0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jpu1r/btsdNvncRRz/wFQLYaetLUpl1KQEKUYue0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jpu1r/btsdNvncRRz/wFQLYaetLUpl1KQEKUYue0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJpu1r%2FbtsdNvncRRz%2FwFQLYaetLUpl1KQEKUYue0%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;391&quot; height=&quot;375&quot; data-filename=&quot;tp14.png&quot; data-origin-width=&quot;391&quot; data-origin-height=&quot;375&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이것도 직관적으로 이해하기 쉽지 않네요. 좌우로 filp한 이미지를 90도 시계 방향으로 돌려 보겠습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tp15.png&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/etiZ6Z/btsdOCGhKTZ/hCdEsoWsbJEeUujKqd2QVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/etiZ6Z/btsdOCGhKTZ/hCdEsoWsbJEeUujKqd2QVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/etiZ6Z/btsdOCGhKTZ/hCdEsoWsbJEeUujKqd2QVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FetiZ6Z%2FbtsdOCGhKTZ%2FhCdEsoWsbJEeUujKqd2QVK%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;835&quot; height=&quot;452&quot; data-filename=&quot;tp15.png&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;452&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;좌측이 좌우로 filp 된 것이고, 우측이 좌우로 filp 된 것을 90도 시계 방향으로 회전시킨 것입니다. 정확히 6번 모드와 똑같이 나옴을 볼 수 있습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tp16.png&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;337&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0zQav/btsdRi7peEe/5lWMB0zAKPuua2hvxXjjTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0zQav/btsdRi7peEe/5lWMB0zAKPuua2hvxXjjTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0zQav/btsdRi7peEe/5lWMB0zAKPuua2hvxXjjTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0zQav%2FbtsdRi7peEe%2F5lWMB0zAKPuua2hvxXjjTk%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;657&quot; height=&quot;337&quot; data-filename=&quot;tp16.png&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;337&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;mode와 filp, 대칭 관계를 정리하면 위와 같습니다. 여기서 5번은 TRANSPOSE를, 6번은 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;TRANSVERSE를 의미합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>중급 레퍼런스/이미지</category>
      <category>Mode</category>
      <category>Pillow</category>
      <category>transpose</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/884</guid>
      <comments>https://codingdog.tistory.com/entry/pillow-transpose-%ED%95%A8%EC%88%98%EC%99%80-mode%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry884comment</comments>
      <pubDate>Thu, 4 May 2023 00:37:01 +0900</pubDate>
    </item>
    <item>
      <title>pillow exif_transpose 함수로 이미지를 돌려놓아 봅시다.</title>
      <link>https://codingdog.tistory.com/entry/pillow-exiftranspose-%ED%95%A8%EC%88%98%EB%A1%9C-%EC%9D%B4%EB%AF%B8%EC%A7%80%EB%A5%BC-%EB%8F%8C%EB%A0%A4%EB%86%93%EC%95%84-%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;안녕하세요. exif 때문에 이미지가 이상하게 돌아가는 경우가 있습니다. 이 때 (회전 정보가 있는) exif 정보를 제거하는 방법을 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저, 실습에 사용될 이미지는 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;a style=&quot;color: #f89009;&quot; href=&quot;https://www.galloway.me.uk/2012/01/uiimageorientation-exif-orientation-sample-images/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;&lt;/span&gt;에서 구할 수 있습니다. 제 pycharm에서 down-mirrored.jpg를 열어보겠습니다. down-mirrored.jpg입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pl1.png&quot; data-origin-width=&quot;523&quot; data-origin-height=&quot;521&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IWMaG/btsdIqSbJPA/wHqYkOJsF2XblJho2DLdY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IWMaG/btsdIqSbJPA/wHqYkOJsF2XblJho2DLdY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IWMaG/btsdIqSbJPA/wHqYkOJsF2XblJho2DLdY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIWMaG%2FbtsdIqSbJPA%2FwHqYkOJsF2XblJho2DLdY0%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;523&quot; height=&quot;521&quot; data-filename=&quot;pl1.png&quot; data-origin-width=&quot;523&quot; data-origin-height=&quot;521&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;아래쪽으로 뒤집어진 모양을 하고 있습니다. 원래 모양은 DOWN이 위로 오고, 다음 줄에 MIRRORED가 돠야 합니다. 회전 정보가 어딘가에 들어가 있음을 알 수 있어요.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pl5.png&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L7zpn/btsdG9i6PV9/0mKR2Bg60rVWXKKRhSkTpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L7zpn/btsdG9i6PV9/0mKR2Bg60rVWXKKRhSkTpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L7zpn/btsdG9i6PV9/0mKR2Bg60rVWXKKRhSkTpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL7zpn%2FbtsdG9i6PV9%2F0mKR2Bg60rVWXKKRhSkTpK%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;556&quot; height=&quot;159&quot; data-filename=&quot;pl5.png&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;159&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;우리는 간단하게 이미지를 열고, exif_transpose 함수를 사용해 봅시다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pl4.png&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;231&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chYHc5/btsdHPxSymK/ERzujse4ibuB3kXxz6YxA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chYHc5/btsdHPxSymK/ERzujse4ibuB3kXxz6YxA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chYHc5/btsdHPxSymK/ERzujse4ibuB3kXxz6YxA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchYHc5%2FbtsdHPxSymK%2FERzujse4ibuB3kXxz6YxA0%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;325&quot; height=&quot;231&quot; data-filename=&quot;pl4.png&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;231&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이 함수의 설명을 보면, EXIF orientation tag가 있다면, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;그 정보를 바탕으로 변환된 새로운 사진을 돌려주고, 원래 정보는 제거해 버립니다.&lt;/u&gt;&lt;/span&gt; 이 함수의 내부를 잠깐 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pl3.png&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oVlr7/btsdGQD7GVT/BMni0IJ3EN4NJhQhG7glOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oVlr7/btsdGQD7GVT/BMni0IJ3EN4NJhQhG7glOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oVlr7/btsdGQD7GVT/BMni0IJ3EN4NJhQhG7glOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoVlr7%2FbtsdGQD7GVT%2FBMni0IJ3EN4NJhQhG7glOK%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;717&quot; height=&quot;267&quot; data-filename=&quot;pl3.png&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;보시면, image.getexif() 함수에서 exif 정보를 얻어옵니다. 296, 282, 531, 274, 283과 같은 이상한 수들이 있어요. 이 수들에 대한 정보는 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;a style=&quot;color: #f89009;&quot; href=&quot;https://exiv2.org/tags.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;&lt;/span&gt;에서 얻을 수 있습니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;이 중 274는 행과 열로 표시되는 이미지 방향&lt;/b&gt;&lt;/span&gt;이라는 것을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pl13.png&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ye7mA/btsdIISPdhj/M6jrtkK69wFY5kE9z9TiNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ye7mA/btsdIISPdhj/M6jrtkK69wFY5kE9z9TiNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ye7mA/btsdIISPdhj/M6jrtkK69wFY5kE9z9TiNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fye7mA%2FbtsdIISPdhj%2FM6jrtkK69wFY5kE9z9TiNk%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;499&quot; height=&quot;109&quot; data-filename=&quot;pl13.png&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이를 바탕으로 transpose 함수를 호출해서, 새로운 이미지를 만듭니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pl6.png&quot; data-origin-width=&quot;505&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w3YPX/btsdGP6gnhL/LWb9Mp3TgPm8KKUudCCBV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w3YPX/btsdGP6gnhL/LWb9Mp3TgPm8KKUudCCBV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w3YPX/btsdGP6gnhL/LWb9Mp3TgPm8KKUudCCBV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw3YPX%2FbtsdGP6gnhL%2FLWb9Mp3TgPm8KKUudCCBV0%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;505&quot; height=&quot;428&quot; data-filename=&quot;pl6.png&quot; data-origin-width=&quot;505&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt; 결과는 DOWN MIRRORED로 제대로 보임을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pl14.png&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk2ECE/btsdIrp0POC/nGZwXBkuIiUQqGQ107Nqq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk2ECE/btsdIrp0POC/nGZwXBkuIiUQqGQ107Nqq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk2ECE/btsdIrp0POC/nGZwXBkuIiUQqGQ107Nqq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk2ECE%2FbtsdIrp0POC%2FnGZwXBkuIiUQqGQ107Nqq0%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;462&quot; height=&quot;418&quot; data-filename=&quot;pl14.png&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;418&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이번에는 다른 이미지입니다. 좌우로 뒤집힌 모양을 하고 있어요.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pl7.png&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;265&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wuOiK/btsdIHfkrv8/FOGKDtu10dtfiJwdbOUwpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wuOiK/btsdIHfkrv8/FOGKDtu10dtfiJwdbOUwpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wuOiK/btsdIHfkrv8/FOGKDtu10dtfiJwdbOUwpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwuOiK%2FbtsdIHfkrv8%2FFOGKDtu10dtfiJwdbOUwpk%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;601&quot; height=&quot;265&quot; data-filename=&quot;pl7.png&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;265&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;exif 정보에는 어떤 것이 담겨 있을까요? orientation이 2임을 주목해 주세요. FLIP_LEFT_RIGHT인데요. 좌우가 바뀐 모양임을 의미합니다. exif_transpose 함수로 exif에 들어있는 orientation 정보를 바탕으로 회전을 시킵니다. 그리고, exif 정보를 제거해 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pl8.png&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJ5jXh/btsdG5AYiDR/T8l1NIp0ZAZVUUxckxdY91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJ5jXh/btsdG5AYiDR/T8l1NIp0ZAZVUUxckxdY91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJ5jXh/btsdG5AYiDR/T8l1NIp0ZAZVUUxckxdY91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJ5jXh%2FbtsdG5AYiDR%2FT8l1NIp0ZAZVUUxckxdY91%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;549&quot; height=&quot;160&quot; data-filename=&quot;pl8.png&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt; up-mirrored.jpg를 연 다음에, exif_transpose를 호출한 다음에 img.save를 합니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pl9.png&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dRhwxj/btsdGIF1UC8/zILbunusNGvEvxJsfV6RN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dRhwxj/btsdGIF1UC8/zILbunusNGvEvxJsfV6RN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dRhwxj/btsdGIF1UC8/zILbunusNGvEvxJsfV6RN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdRhwxj%2FbtsdGIF1UC8%2FzILbunusNGvEvxJsfV6RN0%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;489&quot; height=&quot;308&quot; data-filename=&quot;pl9.png&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;308&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 좌우로 뒤집힌 사진이 원래대로 돌아옴을 볼 수 있습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>중급 레퍼런스/이미지</category>
      <category>EXIF</category>
      <category>Pillow</category>
      <category>transpose</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/883</guid>
      <comments>https://codingdog.tistory.com/entry/pillow-exiftranspose-%ED%95%A8%EC%88%98%EB%A1%9C-%EC%9D%B4%EB%AF%B8%EC%A7%80%EB%A5%BC-%EB%8F%8C%EB%A0%A4%EB%86%93%EC%95%84-%EB%B4%85%EC%8B%9C%EB%8B%A4#entry883comment</comments>
      <pubDate>Tue, 2 May 2023 23:28:50 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 tempfile의 임시 디렉터리 위치와 바꾸는 방법을 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-tempfile%EC%9D%98-%EC%9E%84%EC%8B%9C-%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC-%EC%9C%84%EC%B9%98%EC%99%80-%EB%B0%94%EA%BE%B8%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;파이썬의 fastapi에서 Uploadfile은 파일이 엄청나게 클 때 어떻게 관리할까요? 10기가 정도 된다고 했을 때요. UploadFile의 file이 SpooledTemporaryFile을 사용한다고 하였습니다. 파일이 매우 클 때에는 디스크의 임시 파일이 저장되는 위치에 저장하게 됩니 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;이 글에서는 fastapi에 대해서는 다루지 않습니다. 다만, fastapi가 매우 큰 파일에 대해서 어떻게 다루고 있고, 이를 보기 위해서 임시 파일이 저장되는 위치와, 임시 파일이 저장되는 경로를 바꾸는 방법 정도만 가이드 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tm1.png&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caOzeJ/btsddUUYMdT/ky2ZZkppbAZkWr86wmpnKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caOzeJ/btsddUUYMdT/ky2ZZkppbAZkWr86wmpnKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caOzeJ/btsddUUYMdT/ky2ZZkppbAZkWr86wmpnKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaOzeJ%2FbtsddUUYMdT%2Fky2ZZkppbAZkWr86wmpnKk%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;364&quot; height=&quot;84&quot; data-filename=&quot;tm1.png&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저, tempfile은 임시 파일을 의미합니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;gettempdir()은 임시 파일이 저장되는 위치를 가지고 옵니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tm2.png&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;69&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c00WrW/btsddThvH5e/H0p3K3YcfBiG3Pjt4MsN21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c00WrW/btsddThvH5e/H0p3K3YcfBiG3Pjt4MsN21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c00WrW/btsddThvH5e/H0p3K3YcfBiG3Pjt4MsN21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc00WrW%2FbtsddThvH5e%2FH0p3K3YcfBiG3Pjt4MsN21%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;402&quot; height=&quot;69&quot; data-filename=&quot;tm2.png&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;69&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;Users의 chokw의 AppData의 Local의 Temp에 있네요. 이 위치에 들어가 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tm3.png&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEhV8W/btsdeYvMzUd/hIksRjg702zRDb5Nd5Pg2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEhV8W/btsdeYvMzUd/hIksRjg702zRDb5Nd5Pg2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEhV8W/btsdeYvMzUd/hIksRjg702zRDb5Nd5Pg2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEhV8W%2FbtsdeYvMzUd%2FhIksRjg702zRDb5Nd5Pg2k%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;623&quot; height=&quot;451&quot; data-filename=&quot;tm3.png&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;451&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면, 이상한 폴더들과 파일들이 잔뜩 있음을 알 수 있어요. 이제 8기가 정도 되는 큰 파일을 업로드 해 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tm4.png&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0WQCo/btsdlrYi1lt/uaWqhKe66OGJDIO0k4VwH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0WQCo/btsdlrYi1lt/uaWqhKe66OGJDIO0k4VwH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0WQCo/btsdlrYi1lt/uaWqhKe66OGJDIO0k4VwH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0WQCo%2FbtsdlrYi1lt%2FuaWqhKe66OGJDIO0k4VwH1%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;798&quot; height=&quot;468&quot; data-filename=&quot;tm4.png&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;468&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;docs에 접속해서, 큰 파일 하나를 올려봅시다. 그리고 임시 파일에 새로 올라오는 파일의 속성을 보도록 하겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tm5.png&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8jSAF/btsdhAnPyRK/XJFzul6kZEmEOYKQFeUK5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8jSAF/btsdhAnPyRK/XJFzul6kZEmEOYKQFeUK5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8jSAF/btsdhAnPyRK/XJFzul6kZEmEOYKQFeUK5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8jSAF%2FbtsdhAnPyRK%2FXJFzul6kZEmEOYKQFeUK5K%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;410&quot; height=&quot;306&quot; data-filename=&quot;tm5.png&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;tmp66r8xk6b라는 파일이 올라왔음을 알 수 있어요. 1.26기가나 되네요. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;이를 메모리에 올릴 수 없다면 디스크에 올려놓고 조금씩 불러오는 전략을 쓴다는 것을 간파할 수 있어요.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;fastapi의 main.py를 봅시다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;tempfile을 import 한 뒤에, tempfile.tempdir을 &quot;tmp&quot;로 바꿔보겠습니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tm10.png&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d2jhnd/btsdi2EsmYM/f0tYVzWTgiJcRQhMqZk45k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d2jhnd/btsdi2EsmYM/f0tYVzWTgiJcRQhMqZk45k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2jhnd/btsdi2EsmYM/f0tYVzWTgiJcRQhMqZk45k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2jhnd%2Fbtsdi2EsmYM%2Ff0tYVzWTgiJcRQhMqZk45k%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;628&quot; height=&quot;174&quot; data-filename=&quot;tm10.png&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;174&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;대충 요래 바꿉니다. 그러면 어떤 일이 일어날까요? 큰 파일을 업로드 할 때 임시 파일이 있는 경로가 아니라, 제가 설정한 프로젝트 루트 경로의 tmp 경로에 올라가게 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tm9.png&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbQOHL/btsdi3pQFvf/NRy5zLT1gAQuN62U9A5JN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbQOHL/btsdi3pQFvf/NRy5zLT1gAQuN62U9A5JN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbQOHL/btsdi3pQFvf/NRy5zLT1gAQuN62U9A5JN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbQOHL%2Fbtsdi3pQFvf%2FNRy5zLT1gAQuN62U9A5JN1%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;633&quot; height=&quot;112&quot; data-filename=&quot;tm9.png&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;tmp7tduibwa라는 이름으로 올라갔음을 볼 수 있어요. 여기서 정리하면, 임시 파일이 올라가는 경로를 바꾸려면, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;tempfile을 import 한 다음에, tempfile.tempdir을 원하는 경로로 바꿔버리면 됩니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tm11.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OTGJ2/btsdhyp3NhL/gS3tpvXZBqdIhawNCHKIo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OTGJ2/btsdhyp3NhL/gS3tpvXZBqdIhawNCHKIo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OTGJ2/btsdhyp3NhL/gS3tpvXZBqdIhawNCHKIo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOTGJ2%2Fbtsdhyp3NhL%2FgS3tpvXZBqdIhawNCHKIo0%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;600&quot; height=&quot;170&quot; data-filename=&quot;tm11.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;170&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;반면에, gh5.pdf는 작은 파일입니다. 205k밖에 되지 않습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tm12.png&quot; data-origin-width=&quot;617&quot; data-origin-height=&quot;143&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PLKrL/btsdgUfEUf1/oo0FjZKqrvpv7WsAkar0nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PLKrL/btsdgUfEUf1/oo0FjZKqrvpv7WsAkar0nk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PLKrL/btsdgUfEUf1/oo0FjZKqrvpv7WsAkar0nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPLKrL%2FbtsdgUfEUf1%2Foo0FjZKqrvpv7WsAkar0nk%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;617&quot; height=&quot;143&quot; data-filename=&quot;tm12.png&quot; data-origin-width=&quot;617&quot; data-origin-height=&quot;143&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이 경우, 파일이 올라오지 않음을 볼 수 있어요. 이로 미루어 보았을 때, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;SpooledTemporaryFile은 파일의 크기가 작을 때에는 따로 임시 파일을 만들지 않고 메모리에서 관리한다는 것을 알 수 있어요. 그렇지 않으면 아래와 같이 관리한다는 것을 알 수 있어요.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tm13.png&quot; data-origin-width=&quot;197&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLsmWc/btsdee6NCUH/jHa3kOTu1OYurB54XBAKY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLsmWc/btsdee6NCUH/jHa3kOTu1OYurB54XBAKY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLsmWc/btsdee6NCUH/jHa3kOTu1OYurB54XBAKY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLsmWc%2Fbtsdee6NCUH%2FjHa3kOTu1OYurB54XBAKY0%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;197&quot; height=&quot;225&quot; data-filename=&quot;tm13.png&quot; data-origin-width=&quot;197&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;임시 파일을 저장한다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tm14.png&quot; data-origin-width=&quot;405&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNtbEY/btsdtGUOYpL/74NtfAAvE6SmFmkkECtGMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNtbEY/btsdtGUOYpL/74NtfAAvE6SmFmkkECtGMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNtbEY/btsdtGUOYpL/74NtfAAvE6SmFmkkECtGMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNtbEY%2FbtsdtGUOYpL%2F74NtfAAvE6SmFmkkECtGMK%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;405&quot; height=&quot;225&quot; data-filename=&quot;tm14.png&quot; data-origin-width=&quot;405&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;몇 바이트의 크기만큼 읽어와서 메모리에 로드한다. 생각보다 이 방식은 자주 보이니 알아두시면 좋을 지도 모르겠네요.&lt;/span&gt;&lt;/p&gt;</description>
      <category>코딩/파이선</category>
      <category>tempfile</category>
      <category>파이썬</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/882</guid>
      <comments>https://codingdog.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-tempfile%EC%9D%98-%EC%9E%84%EC%8B%9C-%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC-%EC%9C%84%EC%B9%98%EC%99%80-%EB%B0%94%EA%BE%B8%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry882comment</comments>
      <pubDate>Sun, 30 Apr 2023 23:57:04 +0900</pubDate>
    </item>
    <item>
      <title>fastapi 파일 사이즈 제한을 검사하는 방법을 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/fastapi-%ED%8C%8C%EC%9D%BC-%EC%82%AC%EC%9D%B4%EC%A6%88-%EC%A0%9C%ED%95%9C%EC%9D%84-%EA%B2%80%EC%82%AC%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;fastapi에서 UploadFile을 이용하여 파일을 올리고 제한 검사를 서버단에서 하는 방법을 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;stt3.png&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;151&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwXp87/btsddtityTd/2HYOpOyOJ8pLyGuDnlkpq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwXp87/btsddtityTd/2HYOpOyOJ8pLyGuDnlkpq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwXp87/btsddtityTd/2HYOpOyOJ8pLyGuDnlkpq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwXp87%2FbtsddtityTd%2F2HYOpOyOJ8pLyGuDnlkpq1%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;747&quot; height=&quot;151&quot; data-filename=&quot;stt3.png&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;151&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저 로컬에 파일을 올릴 것이므로 app.mount로 미디어 경로도 같이 설정해 줍니다. 참고로 요래 설정하면, 루트 프로젝트에 media 디렉토리가 있어야 동작합니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;stt4.png&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciYVgh/btsddGvmAst/ZpfrCttSnQlDlqNM6AdJp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciYVgh/btsddGvmAst/ZpfrCttSnQlDlqNM6AdJp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciYVgh/btsddGvmAst/ZpfrCttSnQlDlqNM6AdJp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciYVgh%2FbtsddGvmAst%2FZpfrCttSnQlDlqNM6AdJp0%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;776&quot; height=&quot;202&quot; data-filename=&quot;stt4.png&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;202&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다음에 upload_file 함수입니다. file의 size 체크를 해서 2메가가 넘어가는 파일은 거부합니다. 그러기 위해, await file.read()를 호출한 다음에, content의 길이가 2메가가 넘는 경우 거부를 합니다. 그렇지 않으면, path 위치에 content를 씁니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;stt5.png&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLTnsU/btsdd0txY3u/Q8Djxte6kHpNsEnj14IJpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLTnsU/btsdd0txY3u/Q8Djxte6kHpNsEnj14IJpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLTnsU/btsdd0txY3u/Q8Djxte6kHpNsEnj14IJpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLTnsU%2Fbtsdd0txY3u%2FQ8Djxte6kHpNsEnj14IJpk%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;608&quot; height=&quot;134&quot; data-filename=&quot;stt5.png&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다음에, get_user 함수입니다. 함수 이름이 이상한 거 같은 건 넘어갑시다. /upload를 부르면 2메가 이하인 파일을 업로드 하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;프로그램은 제대로 잘 동작할 겁니다. 문제는, 3기가가 넘는 파일을 올릴 때입니다. content의 길이가 2메가가 넘기 때문에 거부가 됩니다만, 문제는 메모리가 치솟아 버린다는 것입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sf1.png&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O679L/btsdlKCWzRq/59E6G5obLBVmpW0UkzfZz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O679L/btsdlKCWzRq/59E6G5obLBVmpW0UkzfZz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O679L/btsdlKCWzRq/59E6G5obLBVmpW0UkzfZz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO679L%2FbtsdlKCWzRq%2F59E6G5obLBVmpW0UkzfZz0%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;623&quot; height=&quot;139&quot; data-filename=&quot;sf1.png&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;139&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt; 실제로, 작업 관리자 창에서 확인해 보면, python이 3695.7메가까지 올라가는 것을 확인할 수 있습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sf2.png&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6y3Fd/btsdlrpR826/fXrmWmV8uYxPZuPLFVWUGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6y3Fd/btsdlrpR826/fXrmWmV8uYxPZuPLFVWUGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6y3Fd/btsdlrpR826/fXrmWmV8uYxPZuPLFVWUGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6y3Fd%2FbtsdlrpR826%2FfXrmWmV8uYxPZuPLFVWUGK%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;454&quot; height=&quot;411&quot; data-filename=&quot;sf2.png&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;411&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;메모리를 봅시다. 상당히 급격한 변화가 있었는데요. 이는 제가 중간에 프로그램을 종료해 버렸기 때문입니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;3기가에 비해서 2메가는 매우 작습니다.&lt;/b&gt;&lt;/span&gt; 그런데 왜 3기가가 넘는 메모리가 사용되었을까요? &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;비밀은 content = await file.read()에 있습니다.&lt;/u&gt;&lt;/span&gt; 파일의 전체 내용을 가지고 온 다음에, 크기를 검사하다 보니 벌어진 사단입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 어떻게 해야 할까요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;서버단에서 처리하는 방법은 &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;chunk 단위로 읽어버리는 것&lt;/b&gt;&lt;/span&gt;입니다&lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;. file.file의 정체는 SpooledTemporaryFile입니다.&lt;/u&gt;&lt;/span&gt; 이를 조금씩 읽어들입니다. 이 과정에서 읽은 누적 크기가 제한을 넘어가게 되면 에러를 뱉어버리면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;stt6.png&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;171&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xnC5B/btsdgTmVnU3/YWT1s0si52l8xqkHcGUv7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xnC5B/btsdgTmVnU3/YWT1s0si52l8xqkHcGUv7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xnC5B/btsdgTmVnU3/YWT1s0si52l8xqkHcGUv7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxnC5B%2FbtsdgTmVnU3%2FYWT1s0si52l8xqkHcGUv7k%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;767&quot; height=&quot;171&quot; data-filename=&quot;stt6.png&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;171&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;해당 코드는 위와 같습니다. real은 0입니다. 그리고, 파일을 읽어낼 때 마다, chunk의 크기를 더합니다. 크기는 파일의 끝까지 갈 때 까지 계속 누적이 되므로, 2메가가 넘어가면 중간에 에러가 나오게 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;stt7.png&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvFQYj/btsdlJD2nrn/lElXezeOcOp5nJ8mKF1ohk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvFQYj/btsdlJD2nrn/lElXezeOcOp5nJ8mKF1ohk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvFQYj/btsdlJD2nrn/lElXezeOcOp5nJ8mKF1ohk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdvFQYj%2FbtsdlJD2nrn%2FlElXezeOcOp5nJ8mKF1ohk%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;389&quot; height=&quot;100&quot; data-filename=&quot;stt7.png&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;100&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다음에, 22번째 줄 file.seek(0)이 중요합니다. 이것은 파일의 맨 처음으로 가는 것입니다. 이것이 왜 필요할까요? file.file을 돌면서 chunk를 읽어버릴 때 마다 파일을 계속 읽어버리기 때문입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;stt9.png&quot; data-origin-width=&quot;337&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dAXYEh/btsdlLolK7n/LR5Ez3ujUJxJB8UGqWgxNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dAXYEh/btsdlLolK7n/LR5Ez3ujUJxJB8UGqWgxNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dAXYEh/btsdlLolK7n/LR5Ez3ujUJxJB8UGqWgxNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdAXYEh%2FbtsdlLolK7n%2FLR5Ez3ujUJxJB8UGqWgxNk%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;337&quot; height=&quot;152&quot; data-filename=&quot;stt9.png&quot; data-origin-width=&quot;337&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;예를 들어 이 상태에서 일정 부분만큼 파일을 읽었다고 해 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;stt10.png&quot; data-origin-width=&quot;321&quot; data-origin-height=&quot;149&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGfIAI/btsdeI0g1SL/N337AkoSvObkrco60iEkeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGfIAI/btsdeI0g1SL/N337AkoSvObkrco60iEkeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGfIAI/btsdeI0g1SL/N337AkoSvObkrco60iEkeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGfIAI%2FbtsdeI0g1SL%2FN337AkoSvObkrco60iEkeK%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;321&quot; height=&quot;149&quot; data-filename=&quot;stt10.png&quot; data-origin-width=&quot;321&quot; data-origin-height=&quot;149&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;회색 부분만큼만큼 읽었기 때문에, 다음에 await file.read()를 하면 노란색 부분밖에 읽지 않습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;stt11.png&quot; data-origin-width=&quot;330&quot; data-origin-height=&quot;155&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFCl2y/btsdi3piRYZ/jtSlYyZxRZhF7DBZwIfbm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFCl2y/btsdi3piRYZ/jtSlYyZxRZhF7DBZwIfbm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFCl2y/btsdi3piRYZ/jtSlYyZxRZhF7DBZwIfbm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFCl2y%2Fbtsdi3piRYZ%2FjtSlYyZxRZhF7DBZwIfbm0%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;330&quot; height=&quot;155&quot; data-filename=&quot;stt11.png&quot; data-origin-width=&quot;330&quot; data-origin-height=&quot;155&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; 처음 부분으로 이동하게 되면 온전히 전체 파일을 읽게 되기 때문에, 정상적으로 수행됩니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;stt8.png&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;219&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vqU67/btsddTgVri7/oM51xPOEtVeFWtHNXa2ox0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vqU67/btsddTgVri7/oM51xPOEtVeFWtHNXa2ox0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vqU67/btsddTgVri7/oM51xPOEtVeFWtHNXa2ox0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvqU67%2FbtsddTgVri7%2FoM51xPOEtVeFWtHNXa2ox0%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;551&quot; height=&quot;219&quot; data-filename=&quot;stt8.png&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;219&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;메모리 또한 급격하게 늘어났다가 줄어들지 않음을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>웹/FASTAPI</category>
      <category>FastAPI</category>
      <category>파일</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/881</guid>
      <comments>https://codingdog.tistory.com/entry/fastapi-%ED%8C%8C%EC%9D%BC-%EC%82%AC%EC%9D%B4%EC%A6%88-%EC%A0%9C%ED%95%9C%EC%9D%84-%EA%B2%80%EC%82%AC%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry881comment</comments>
      <pubDate>Sat, 29 Apr 2023 23:01:56 +0900</pubDate>
    </item>
    <item>
      <title>fastapi background tasks를 간단하게 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/fastapi-background-tasks%EB%A5%BC-%EA%B0%84%EB%8B%A8%ED%95%98%EA%B2%8C-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;fastapi에서 backgroundtask는 다소 무거운 작업을 back ground로 돌릴 때 씁니다. 예를 들자면 이메일을 보내는 시간은 다소 깁니다. 그래서, &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;그냥 task에 등록만 해서 background에서 돌고 있는 무언가가 처리하게 하고&lt;/b&gt;&lt;/span&gt;, 204 response를 떨어트리는 식으로 쓰게 됩니다. &lt;/span&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;매우 무거운 작업은 다른 방식을 고려하는 편이 좋습니다.&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bg3.png&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cze8xo/btsczL5J380/UwYuKif3hW1KVatXYMVzH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cze8xo/btsczL5J380/UwYuKif3hW1KVatXYMVzH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cze8xo/btsczL5J380/UwYuKif3hW1KVatXYMVzH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcze8xo%2FbtsczL5J380%2FUwYuKif3hW1KVatXYMVzH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;397&quot; height=&quot;110&quot; data-filename=&quot;bg3.png&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;110&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;main.py 입니다. 천천히 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bg4.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCaKEC/btscHMhSQ7a/jLOKmOgPM5az1Wo888kkP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCaKEC/btscHMhSQ7a/jLOKmOgPM5az1Wo888kkP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCaKEC/btscHMhSQ7a/jLOKmOgPM5az1Wo888kkP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCaKEC%2FbtscHMhSQ7a%2FjLOKmOgPM5az1Wo888kkP1%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;600&quot; height=&quot;112&quot; data-filename=&quot;bg4.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;write_notification입니다. 다른 건 없고요. ti초동안 sleep를 하게 됩니다. 중간에, 프로세스의 id와 thread id를 찍습니다. 이는 background task가 실행될 때 마다 어떤 것이 달라지는지 trace 하기 위함입니다. async def가 아니라, 그냥 def로 호출하였는데요. 왜 그렇게 호출하였는지는 밑에서 후술하겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bg5.png&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drWXzm/btsczKeExeE/hIkahlL4UG0kkZ2hxxokbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drWXzm/btsczKeExeE/hIkahlL4UG0kkZ2hxxokbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drWXzm/btsczKeExeE/hIkahlL4UG0kkZ2hxxokbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrWXzm%2FbtsczKeExeE%2FhIkahlL4UG0kkZ2hxxokbk%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;515&quot; height=&quot;174&quot; data-filename=&quot;bg5.png&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;174&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다음에 get_user입니다. GET /c/{ti}로 호출할 수 있습니다. /docs로 들어가서 swagger로 해당 api를 동시에 여러번 호출해 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bg6.png&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;127&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XGFxl/btscGTWdNg4/lj9odWu7iFr9SRTKuvEza0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XGFxl/btscGTWdNg4/lj9odWu7iFr9SRTKuvEza0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XGFxl/btscGTWdNg4/lj9odWu7iFr9SRTKuvEza0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXGFxl%2FbtscGTWdNg4%2Flj9odWu7iFr9SRTKuvEza0%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;494&quot; height=&quot;127&quot; data-filename=&quot;bg6.png&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;127&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;end에 떨어지는 부분을 주목해 주세요. 뒤에 숫자가 다릅니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;이 말인 즉슨, thread id가 모두 다르다는 것입니다.&lt;/u&gt;&lt;/span&gt; 이를 그림으로 그려보면 아래와 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bg7.png&quot; data-origin-width=&quot;242&quot; data-origin-height=&quot;347&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J08rr/btscyHJe01Z/cecOWP3QiDNGpcs5kxp54k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J08rr/btscyHJe01Z/cecOWP3QiDNGpcs5kxp54k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J08rr/btscyHJe01Z/cecOWP3QiDNGpcs5kxp54k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ08rr%2FbtscyHJe01Z%2FcecOWP3QiDNGpcs5kxp54k%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;242&quot; height=&quot;347&quot; data-filename=&quot;bg7.png&quot; data-origin-width=&quot;242&quot; data-origin-height=&quot;347&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;write_notification 함수는 background_task로 돌았는데, 같은 프로세스에 있는 별개의 thread에서 돌았다. async로 설정하면 어떻게 되는지는 잘 실험해 보실 것이라 믿습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bg1.png&quot; data-origin-width=&quot;761&quot; data-origin-height=&quot;285&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHXo5Z/btscCCtX0XH/hrLpZxSdHvUHUoLAirN8pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHXo5Z/btscCCtX0XH/hrLpZxSdHvUHUoLAirN8pk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHXo5Z/btscCCtX0XH/hrLpZxSdHvUHUoLAirN8pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHXo5Z%2FbtscCCtX0XH%2FhrLpZxSdHvUHUoLAirN8pk%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;761&quot; height=&quot;285&quot; data-filename=&quot;bg1.png&quot; data-origin-width=&quot;761&quot; data-origin-height=&quot;285&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;간단하게 BackgroundTasks와 BackgroundTask 부분을 보겠습니다. BackgroundTasks는 list를 하나 들고 있습니다. 이는, task를 모아놓는 역할을 합니다. 다음에, __call__ 함수에서, &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;self.tasks를 모두 돌면서 await task()를 하게 됩니다. 이 과정에서 어떤 부분이 호출될까요?&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bg2.png&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxRh7W/btscHeFHI8o/f6rQkpgmwZYK0NhKxyiZT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxRh7W/btscHeFHI8o/f6rQkpgmwZYK0NhKxyiZT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxRh7W/btscHeFHI8o/f6rQkpgmwZYK0NhKxyiZT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxRh7W%2FbtscHeFHI8o%2Ff6rQkpgmwZYK0NhKxyiZT0%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;651&quot; height=&quot;110&quot; data-filename=&quot;bg2.png&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;110&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이 함수가 호출됩니다. async가 아니면, &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;run_in_threadpool. 즉 쓰레드 풀 안에서 task&lt;/u&gt;&lt;/span&gt;를 돌려버립니다.&amp;nbsp;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bg8.png&quot; data-origin-width=&quot;383&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5Medc/btscGUOltss/imyEMXUBqcDr9DcGIubVW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5Medc/btscGUOltss/imyEMXUBqcDr9DcGIubVW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5Medc/btscGUOltss/imyEMXUBqcDr9DcGIubVW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5Medc%2FbtscGUOltss%2FimyEMXUBqcDr9DcGIubVW0%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;383&quot; height=&quot;300&quot; data-filename=&quot;bg8.png&quot; data-origin-width=&quot;383&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;그림을 그리면 이런 모습입니다. 저는 아무런 옵션도 주지 않았으니, 들어온 순서대로 task가 실행되게 됩니다. 한 쓰레드에 1번, 2번 task가 들어온 경우, 1번이 실행된 후에 2번이 실행됩니다. 이 말인 즉슨, task 1이 실행되다가 예외가 발생해 버린 경우, task 2는 실행되지 못한다는 의미입니다. 정말 그럴까요?&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bg12.png&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d3GGSu/btscCA3WOkI/hT1TzIGZKkD4QyhnYk2DuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d3GGSu/btscCA3WOkI/hT1TzIGZKkD4QyhnYk2DuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d3GGSu/btscCA3WOkI/hT1TzIGZKkD4QyhnYk2DuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd3GGSu%2FbtscCA3WOkI%2FhT1TzIGZKkD4QyhnYk2DuK%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;382&quot; height=&quot;154&quot; data-filename=&quot;bg12.png&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;154&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;task 2개는 위와 같습니다. write_notification은 Exception을 떨어트립니다. 다음에 notification 2는 ti를 출력합니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bg10.png&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t5T3i/btscIH1HAb7/1IZ8Lkox3DVKsA9bLOUdW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t5T3i/btscIH1HAb7/1IZ8Lkox3DVKsA9bLOUdW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t5T3i/btscIH1HAb7/1IZ8Lkox3DVKsA9bLOUdW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft5T3i%2FbtscIH1HAb7%2F1IZ8Lkox3DVKsA9bLOUdW0%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;528&quot; height=&quot;198&quot; data-filename=&quot;bg10.png&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;write_notification task를 등록한 다음에, write_notification_2를 등록하였습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bg11.png&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;95&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEtU93/btscHNnzUQD/d1FbHez0hU5JUV05xYCFE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEtU93/btscHNnzUQD/d1FbHez0hU5JUV05xYCFE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEtU93/btscHNnzUQD/d1FbHez0hU5JUV05xYCFE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEtU93%2FbtscHNnzUQD%2Fd1FbHez0hU5JUV05xYCFE0%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;732&quot; height=&quot;95&quot; data-filename=&quot;bg11.png&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;95&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;실행 결과를 볼까요? Exception이 떨어지고 그 다음 ti를 출력하는 task는 실행되지 않았음을 알 수 있습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bg13.png&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGR68t/btscKmCPOry/M683APyKL90u3nExKShRXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGR68t/btscKmCPOry/M683APyKL90u3nExKShRXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGR68t/btscKmCPOry/M683APyKL90u3nExKShRXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGR68t%2FbtscKmCPOry%2FM683APyKL90u3nExKShRXk%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;379&quot; height=&quot;148&quot; data-filename=&quot;bg13.png&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;148&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>웹/FASTAPI</category>
      <category>Background</category>
      <category>FastAPI</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/880</guid>
      <comments>https://codingdog.tistory.com/entry/fastapi-background-tasks%EB%A5%BC-%EA%B0%84%EB%8B%A8%ED%95%98%EA%B2%8C-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry880comment</comments>
      <pubDate>Tue, 25 Apr 2023 23:58:52 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 잡거나 무시될 수 없는 signal에 대해 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%AC%B4%EC%8B%9C%EB%90%A0-%EC%88%98-%EC%97%86%EB%8A%94-signal%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;리눅스 시스템 프로그래밍이나, 혹은 c언어 시간에 signal은 잠깐 접해볼 기회가 있을 겁니다. 이 글에서는 signal 함수를 쓰고 있습니다만, &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;실습으로만 쓰고 있다는 점&lt;/b&gt;&lt;/span&gt; 참고 부탁드립니다. sigaction 쓰세요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;signal이 들어오면 처리하는 방법은 몇 가지가 있습니다. 그냥 아무 로직도 태우지 않거나, 무시하거나, 혹은 해당 시그널이 발생했을 때 잡아서 특정 루틴을 수행하던지. 그런데, 이 중 몇 가지 예외가 있는데요. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;무시하거나 잡을 수 없는 signal이 두 개 있어요. SIGKILL과 SIGSTOP.&lt;/b&gt;&lt;/span&gt; 이 둘을 간단하게 보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;snn1.png&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dihnV6/btsbXKkYUiW/XKiuAHRSWXH95beZIU2QY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dihnV6/btsbXKkYUiW/XKiuAHRSWXH95beZIU2QY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dihnV6/btsbXKkYUiW/XKiuAHRSWXH95beZIU2QY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdihnV6%2FbtsbXKkYUiW%2FXKiuAHRSWXH95beZIU2QY1%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;518&quot; height=&quot;114&quot; data-filename=&quot;snn1.png&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;먼저, SIGINT, SIGKILL, SIGSTOP, SIGTSTP 이렇게 4개의 signal 번호를 얻어봅시다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;snn2.png&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r5XbL/btsbSEl5jLB/doZ3Kq45kglKBzBh0MH9mK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r5XbL/btsbSEl5jLB/doZ3Kq45kglKBzBh0MH9mK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r5XbL/btsbSEl5jLB/doZ3Kq45kglKBzBh0MH9mK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr5XbL%2FbtsbSEl5jLB%2FdoZ3Kq45kglKBzBh0MH9mK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;362&quot; height=&quot;68&quot; data-filename=&quot;snn2.png&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;제 시스템에서는 2, 9, 19, 20번입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;snn3.png&quot; data-origin-width=&quot;363&quot; data-origin-height=&quot;221&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/reh9L/btsbXKkYUiN/CotacOZifa4qul9DQp10Uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/reh9L/btsbXKkYUiN/CotacOZifa4qul9DQp10Uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/reh9L/btsbXKkYUiN/CotacOZifa4qul9DQp10Uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Freh9L%2FbtsbXKkYUiN%2FCotacOZifa4qul9DQp10Uk%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;363&quot; height=&quot;221&quot; data-filename=&quot;snn3.png&quot; data-origin-width=&quot;363&quot; data-origin-height=&quot;221&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;signal 함수로, 특정 시그널이 발생했을 때 잡을 수 있습니다. signal의 2번째 인자는 해당 시그널이 발생했을 때, 어떤 루틴을 수행할 것인지에 대해 정의를 합니다. 여기에서는 그냥 signal만 찍고 있음을 알 수 있습니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;저는 SIGINT, SIGKILL, SIGSTOP 시그널을 수신했을 때, sig_hand를 호출하게끔 하였습니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;snn4.png&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;47&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXWItD/btsb2TvaB1o/kyDdhmFTbBqQ3wLJTpmqgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXWItD/btsb2TvaB1o/kyDdhmFTbBqQ3wLJTpmqgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXWItD/btsb2TvaB1o/kyDdhmFTbBqQ3wLJTpmqgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXWItD%2Fbtsb2TvaB1o%2FkyDdhmFTbBqQ3wLJTpmqgK%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;599&quot; height=&quot;47&quot; data-filename=&quot;snn4.png&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;47&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;이제 test3을 실행시켜 보겠습니다. 그리고 ps -aux로 test3이 돌고 있는 프로세스의 pid 6676을 얻어올 수 있었습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;snn5.png&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O9B54/btsbT113WGk/cw0Eo4qoKnJA4bQcXy9sP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O9B54/btsbT113WGk/cw0Eo4qoKnJA4bQcXy9sP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O9B54/btsbT113WGk/cw0Eo4qoKnJA4bQcXy9sP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO9B54%2FbtsbT113WGk%2Fcw0Eo4qoKnJA4bQcXy9sP1%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;421&quot; height=&quot;72&quot; data-filename=&quot;snn5.png&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;72&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;2번 시그널을 날려 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;snn6.png&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mTdws/btsbVeGCp1G/Vce7LEH3LJ1OrKkKNVJkFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mTdws/btsbVeGCp1G/Vce7LEH3LJ1OrKkKNVJkFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mTdws/btsbVeGCp1G/Vce7LEH3LJ1OrKkKNVJkFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmTdws%2FbtsbVeGCp1G%2FVce7LEH3LJ1OrKkKNVJkFK%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;361&quot; height=&quot;84&quot; data-filename=&quot;snn6.png&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;그랬더니 test3을 실행시킨 프로세스에서 2가 출력됩니다. 제 시스템에서 SIGINT는 2번이고, SIGINT 시그널을 잡았기 때문에 핸들러가 수행된 셈입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;snn7.png&quot; data-origin-width=&quot;396&quot; data-origin-height=&quot;85&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mi5DL/btscjkS2zBh/eM67wgk7j5hDnvb2Hoylk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mi5DL/btscjkS2zBh/eM67wgk7j5hDnvb2Hoylk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mi5DL/btscjkS2zBh/eM67wgk7j5hDnvb2Hoylk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmi5DL%2FbtscjkS2zBh%2FeM67wgk7j5hDnvb2Hoylk1%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;396&quot; height=&quot;85&quot; data-filename=&quot;snn7.png&quot; data-origin-width=&quot;396&quot; data-origin-height=&quot;85&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;이제 9번 시그널을 보내보겠습니다. 어떻게 될까요?&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;snn8.png&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;95&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctUfjl/btscfC0ATZF/at2uOdEkKVyM8qufPYErnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctUfjl/btscfC0ATZF/at2uOdEkKVyM8qufPYErnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctUfjl/btscfC0ATZF/at2uOdEkKVyM8qufPYErnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctUfjl%2FbtscfC0ATZF%2Fat2uOdEkKVyM8qufPYErnK%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;382&quot; height=&quot;95&quot; data-filename=&quot;snn8.png&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;95&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;9가 출력될 줄 알았는데, 그대로 종료되어 버립니다. 이는, 9번은 잡거나 무시될 수 없는 신호 중 하나이기 때문입니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;snn11.png&quot; data-origin-width=&quot;387&quot; data-origin-height=&quot;76&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXGGq4/btsbXI1ONeC/kGzhFkscA7xz1qqZzSpW30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXGGq4/btsbXI1ONeC/kGzhFkscA7xz1qqZzSpW30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXGGq4/btsbXI1ONeC/kGzhFkscA7xz1qqZzSpW30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXGGq4%2FbtsbXI1ONeC%2FkGzhFkscA7xz1qqZzSpW30%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;387&quot; height=&quot;76&quot; data-filename=&quot;snn11.png&quot; data-origin-width=&quot;387&quot; data-origin-height=&quot;76&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;19번 SIGSTOP을 날려 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;snn12.png&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baZGvy/btsb6Zu40h2/PPCmuwY2jYoXrRBHehSBj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baZGvy/btsb6Zu40h2/PPCmuwY2jYoXrRBHehSBj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baZGvy/btsb6Zu40h2/PPCmuwY2jYoXrRBHehSBj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaZGvy%2Fbtsb6Zu40h2%2FPPCmuwY2jYoXrRBHehSBj0%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;413&quot; height=&quot;87&quot; data-filename=&quot;snn12.png&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;87&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;제가 SIGSTOP을 잡는다고 핸들러에 등록했음에도 불구하고 19가 출력되지 않고, suspended가 출력되었음을 알 수 있습니다. 추가로 비슷한 시그널 중에 SIGTSTP가 있습니다. 이것도 시그널을 보내면 suspend가 되게 하긴 합니다만 무슨 차이가 있을까요?&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;snn15.png&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDildS/btsb2UARjHC/6nT9jyRtoAcbaSY5aJr2P0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDildS/btsb2UARjHC/6nT9jyRtoAcbaSY5aJr2P0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDildS/btsb2UARjHC/6nT9jyRtoAcbaSY5aJr2P0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDildS%2Fbtsb2UARjHC%2F6nT9jyRtoAcbaSY5aJr2P0%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;333&quot; height=&quot;234&quot; data-filename=&quot;snn15.png&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;234&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;SIGTSTP를 잡아보았습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;snn16.png&quot; data-origin-width=&quot;348&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ehkAil/btsbSE7qoQ9/KaPqVNrLIVmtMbUtXuKxp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ehkAil/btsbSE7qoQ9/KaPqVNrLIVmtMbUtXuKxp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ehkAil/btsbSE7qoQ9/KaPqVNrLIVmtMbUtXuKxp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FehkAil%2FbtsbSE7qoQ9%2FKaPqVNrLIVmtMbUtXuKxp0%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;348&quot; height=&quot;109&quot; data-filename=&quot;snn16.png&quot; data-origin-width=&quot;348&quot; data-origin-height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;test3을 실행시키고, ctrl+Z를 눌러보겠습니다. 그러면, 20이 계속 출력됨을 볼 수 있어요. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;SIGSTOP과 다르게 잡아버릴 수 있는 시그널입니다.&lt;/u&gt;&lt;/span&gt; fg에서 bg로 바꾸는 방법 중에 ctrl+Z를 누른 다음에 bg %N을 하라고 했었는데요. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;제 리눅스 운영체제에서는, SIGTSTP를 발생시키고 bg %N을 입력하라는 말이였던 셈입니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>OS/리눅스</category>
      <category>signal</category>
      <category>리눅스</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/879</guid>
      <comments>https://codingdog.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%AC%B4%EC%8B%9C%EB%90%A0-%EC%88%98-%EC%97%86%EB%8A%94-signal%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry879comment</comments>
      <pubDate>Sun, 23 Apr 2023 23:59:17 +0900</pubDate>
    </item>
    <item>
      <title>git rebase 명령어를 쓸 때 쓸 수 있는 --onto 옵션에 대해 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/git-rebase-%EB%AA%85%EB%A0%B9%EC%96%B4%EB%A5%BC-%EC%93%B8-%EB%95%8C-%EC%93%B8-%EC%88%98-%EC%9E%88%EB%8A%94-onto-%EC%98%B5%EC%85%98%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;안녕하세요. 이번 시간에는 git rebase를 할 때 쓸 수 있는 --onto 옵션에 대해 배워보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ro9.png&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mh2EF/btsbBP8tEIz/VyKrrhBknePMDuPeEWuodK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mh2EF/btsbBP8tEIz/VyKrrhBknePMDuPeEWuodK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mh2EF/btsbBP8tEIz/VyKrrhBknePMDuPeEWuodK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmh2EF%2FbtsbBP8tEIz%2FVyKrrhBknePMDuPeEWuodK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;596&quot; height=&quot;240&quot; data-filename=&quot;ro9.png&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;현재 깃 branch가 다음과 같다고 해 보겠습니다. 2.txt add 라는 커밋에서부터 test 브랜치가 분기했습니다. 그런데, test bug.. 가 있어요. test 브랜치에 실수로 bug가 많은 커밋을 push해 버렸습니다. 이 commit으로부터 test2가 분기했습니다. test2는 1.txt에 무언가를 append 한 모양입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;master에는 2.txt에 무언가를 추가했습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ro2.png&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPq6EK/btsbA5DGlzv/eMkaIq9svQRAspeh8HaMx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPq6EK/btsbA5DGlzv/eMkaIq9svQRAspeh8HaMx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPq6EK/btsbA5DGlzv/eMkaIq9svQRAspeh8HaMx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPq6EK%2FbtsbA5DGlzv%2FeMkaIq9svQRAspeh8HaMx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;112&quot; data-filename=&quot;ro2.png&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;test bug.. 입니다. 3.txt에 It is bug feature라는 것이 추가되었습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ro3.png&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btdC5m/btsbBT3X2g6/kiSHphAPpnET0koFSDVkLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btdC5m/btsbBT3X2g6/kiSHphAPpnET0koFSDVkLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btdC5m/btsbBT3X2g6/kiSHphAPpnET0koFSDVkLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtdC5m%2FbtsbBT3X2g6%2FkiSHphAPpnET0koFSDVkLK%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;507&quot; height=&quot;154&quot; data-filename=&quot;ro3.png&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;154&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다음에 1.txt에 무언가를 추가한 커밋입니다. test2에 붙어 있었습니다. 4와 5가 추가되었습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ro8.png&quot; data-origin-width=&quot;539&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D9i8Z/btsbDu3Mukp/sA48j4pixHW1BDjfWjoU7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D9i8Z/btsbDu3Mukp/sA48j4pixHW1BDjfWjoU7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D9i8Z/btsbDu3Mukp/sA48j4pixHW1BDjfWjoU7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD9i8Z%2FbtsbDu3Mukp%2FsA48j4pixHW1BDjfWjoU7K%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;539&quot; height=&quot;150&quot; data-filename=&quot;ro8.png&quot; data-origin-width=&quot;539&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다음에, master에 2.txt에 append를 한 커밋입니다. 4, 5가 추가되었습니다. git rebase master test2 명령어를 입력해 보겠습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ro14.png&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBRncu/btsbAs0tPee/icJfsL9sof6aNynLWuDmb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBRncu/btsbAs0tPee/icJfsL9sof6aNynLWuDmb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBRncu/btsbAs0tPee/icJfsL9sof6aNynLWuDmb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBRncu%2FbtsbAs0tPee%2FicJfsL9sof6aNynLWuDmb0%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;479&quot; height=&quot;196&quot; data-filename=&quot;ro14.png&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 깃 그래프가 요래 그려집니다. 이 상황을 그림으로 그려보면 아래와 같습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ro15.png&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nMnhg/btsbBUogBVK/kH8b1oKrFc7Ad1A3FUqKmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nMnhg/btsbBUogBVK/kH8b1oKrFc7Ad1A3FUqKmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nMnhg/btsbBUogBVK/kH8b1oKrFc7Ad1A3FUqKmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnMnhg%2FbtsbBUogBVK%2FkH8b1oKrFc7Ad1A3FUqKmk%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;532&quot; height=&quot;406&quot; data-filename=&quot;ro15.png&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;원래 요래 된 상태였습니다. git rebase master test2를 하면, master의 head 뒤에 test2의 커밋들이 붙어버립니다. 여기까지는 알겠는데요. 어떤 커밋들이 붙을까요? reflog로 확인해 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ro17.png&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BuhTF/btsbANccy4H/rPt9roTJIgvFr6d6OAALh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BuhTF/btsbANccy4H/rPt9roTJIgvFr6d6OAALh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BuhTF/btsbANccy4H/rPt9roTJIgvFr6d6OAALh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBuhTF%2FbtsbANccy4H%2FrPt9roTJIgvFr6d6OAALh0%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;584&quot; height=&quot;86&quot; data-filename=&quot;ro17.png&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;&amp;nbsp;pick test bug..와 pick append 1.txt가 보이네요. pick이 된 커밋들은, 회색으로 표시해 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ro18.png&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4TNWN/btsbChcA7n1/Mkhofb1fZRyQ6m0y0tA0V1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4TNWN/btsbChcA7n1/Mkhofb1fZRyQ6m0y0tA0V1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4TNWN/btsbChcA7n1/Mkhofb1fZRyQ6m0y0tA0V1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4TNWN%2FbtsbChcA7n1%2FMkhofb1fZRyQ6m0y0tA0V1%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;537&quot; height=&quot;422&quot; data-filename=&quot;ro18.png&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;회색 부분이 master의 head 뒤에 붙어버린 것입니다. 이는 분기가 된 2.txt add로부터 master의 변경 사항과 회색으로 칠한 부분의 변경 사항이 같지 않기 때문입니다. test bug..와 append 1.txt가 같이 끌려 나와서 아래와 같이 커밋이 생성될 수 밖에 없을 겁니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ro19.png&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;599&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c04pdm/btsbI17mcFO/5UGRHIQRh2LpgKfKkcUDm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c04pdm/btsbI17mcFO/5UGRHIQRh2LpgKfKkcUDm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c04pdm/btsbI17mcFO/5UGRHIQRh2LpgKfKkcUDm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc04pdm%2FbtsbI17mcFO%2F5UGRHIQRh2LpgKfKkcUDm1%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;478&quot; height=&quot;599&quot; data-filename=&quot;ro19.png&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;599&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;중요한 것은 test bug.. 까지 그대로 들어갔다는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다시 이 상황으로 돌아오겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ro20.png&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;179&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSwSm3/btsbBbRub2h/K4lkVX6rOYORqcNQYfS7Fk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSwSm3/btsbBbRub2h/K4lkVX6rOYORqcNQYfS7Fk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSwSm3/btsbBbRub2h/K4lkVX6rOYORqcNQYfS7Fk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSwSm3%2FbtsbBbRub2h%2FK4lkVX6rOYORqcNQYfS7Fk%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;598&quot; height=&quot;179&quot; data-filename=&quot;ro20.png&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;179&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;우리는 test bug..를 빼고 단순하게 test2만의 변경 사항을 master의 뒤에 붙일 수 없을까요? 현재는 test 뒤에 붙은 상태입니다만, 이를 master로 옮기고 싶습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ro10.png&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhrrYs/btsbI35aG1O/40L1HqftyuK5MPkV8DEzHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhrrYs/btsbI35aG1O/40L1HqftyuK5MPkV8DEzHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhrrYs/btsbI35aG1O/40L1HqftyuK5MPkV8DEzHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhrrYs%2FbtsbI35aG1O%2F40L1HqftyuK5MPkV8DEzHk%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;458&quot; height=&quot;107&quot; data-filename=&quot;ro10.png&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;107&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그럴려면 git rebase --onto master test test2를 입력하시면 됩니다. 이렇게 하면 어떻게 될까요?&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ro21.png&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bC3HTc/btsbDEyvlz6/o0hFQdgoR8bHn9XgF75VA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bC3HTc/btsbDEyvlz6/o0hFQdgoR8bHn9XgF75VA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bC3HTc/btsbDEyvlz6/o0hFQdgoR8bHn9XgF75VA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbC3HTc%2FbtsbDEyvlz6%2Fo0hFQdgoR8bHn9XgF75VA0%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;486&quot; height=&quot;444&quot; data-filename=&quot;ro21.png&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;444&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;파란색으로 칠한 부분만 master의 뒤에 붙게 됩니다. 즉 주황색으로 칠해진 test의 커밋은 master의 뒤에 붙지 않습니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;test로부터 뻗어나온 test2의 커밋들이 붙게 됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ro11.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A7709/btsbEnpHCGz/iAkhZsAeaN8nwZQVmn45Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A7709/btsbEnpHCGz/iAkhZsAeaN8nwZQVmn45Xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A7709/btsbEnpHCGz/iAkhZsAeaN8nwZQVmn45Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA7709%2FbtsbEnpHCGz%2FiAkhZsAeaN8nwZQVmn45Xk%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;600&quot; height=&quot;175&quot; data-filename=&quot;ro11.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;175&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;즉, test2가 더 이상 test에 의존적이지 않게 됩니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ro22.png&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;193&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRtp3L/btsbHjG5PuH/TidiKBkod3E8MCKqP2Gq2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRtp3L/btsbHjG5PuH/TidiKBkod3E8MCKqP2Gq2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRtp3L/btsbHjG5PuH/TidiKBkod3E8MCKqP2Gq2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRtp3L%2FbtsbHjG5PuH%2FTidiKBkod3E8MCKqP2Gq2k%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;444&quot; height=&quot;193&quot; data-filename=&quot;ro22.png&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;193&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;예제를 하나 더 드리겠습니다. 깃 그래프가 요래 됩니다. 2.txt add로부터 master와 test가 뻗어나옵니다. 다음에 test로부터 test2가 뻗어나오고, test2로부터 test3이 뻗어나옵니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ro23.png&quot; data-origin-width=&quot;441&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CFXMZ/btsbBcpiReZ/ZOOrEMJAF3HuiSdp9efWl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CFXMZ/btsbBcpiReZ/ZOOrEMJAF3HuiSdp9efWl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CFXMZ/btsbBcpiReZ/ZOOrEMJAF3HuiSdp9efWl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCFXMZ%2FbtsbBcpiReZ%2FZOOrEMJAF3HuiSdp9efWl1%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;441&quot; height=&quot;117&quot; data-filename=&quot;ro23.png&quot; data-origin-width=&quot;441&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이제 git rebase --onto master test test3을 입력하였습니다. 결과는 어떻게 나올까요? 일단, master의 뒤에 붙는 것은 맞습니다. 어느 커밋을 pick 하는지가 문제입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ro25.png&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;566&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xpetM/btsbCio0inA/YUWKOKa3Gdz0HPTjfHSVek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xpetM/btsbCio0inA/YUWKOKa3Gdz0HPTjfHSVek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xpetM/btsbCio0inA/YUWKOKa3Gdz0HPTjfHSVek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxpetM%2FbtsbCio0inA%2FYUWKOKa3Gdz0HPTjfHSVek%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;665&quot; height=&quot;566&quot; data-filename=&quot;ro25.png&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;566&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;커밋은 이렇습니다. 일단, test3은 test2로부터 뻗어나왔고, test2는 test로부터 뻗어나왔기 때문에, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;test3은 test로부터 뻗어나왔습니다.&lt;/u&gt;&lt;/span&gt; 고로, &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;test로부터 뻗어나온&lt;/b&gt;&lt;/span&gt; &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;군청색과 보라색의 커밋이 master 뒤에 붙게 됩니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ro24.png&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;219&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCD8xm/btsbFgDXqVm/0x9GSSK2AFk5zVutPKZ2Hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCD8xm/btsbFgDXqVm/0x9GSSK2AFk5zVutPKZ2Hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCD8xm/btsbFgDXqVm/0x9GSSK2AFk5zVutPKZ2Hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCD8xm%2FbtsbFgDXqVm%2F0x9GSSK2AFk5zVutPKZ2Hk%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;438&quot; height=&quot;219&quot; data-filename=&quot;ro24.png&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;219&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;정말 그런지 볼까요? master 뒤에 append 1.txt와 add 4.txt가 붙었음을 볼 수 있습니다. 즉, git rebase --onto A B C인 경우, &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;A 뒤에 B로부터 뻗어나온 C의 커밋들이 붙게 됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>GIT</category>
      <category>Git</category>
      <category>onto</category>
      <category>rebase</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/878</guid>
      <comments>https://codingdog.tistory.com/entry/git-rebase-%EB%AA%85%EB%A0%B9%EC%96%B4%EB%A5%BC-%EC%93%B8-%EB%95%8C-%EC%93%B8-%EC%88%98-%EC%9E%88%EB%8A%94-onto-%EC%98%B5%EC%85%98%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry878comment</comments>
      <pubDate>Fri, 21 Apr 2023 08:00:14 +0900</pubDate>
    </item>
    <item>
      <title>git rebase 명령어에 대해 간단하게 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/git-rebase-%EB%AA%85%EB%A0%B9%EC%96%B4%EC%97%90-%EB%8C%80%ED%95%B4-%EA%B0%84%EB%8B%A8%ED%95%98%EA%B2%8C-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt; 안녕하세요. 이번 시간에는 기준을 재지정 할 때 쓰일 수 있는 git rebase에 대해 간단하게 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mr4.png&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WiNIO/btsbkFZUHIy/6U8v0ZbKeNKEHaeu3EwQek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WiNIO/btsbkFZUHIy/6U8v0ZbKeNKEHaeu3EwQek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WiNIO/btsbkFZUHIy/6U8v0ZbKeNKEHaeu3EwQek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWiNIO%2FbtsbkFZUHIy%2F6U8v0ZbKeNKEHaeu3EwQek%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;786&quot; height=&quot;137&quot; data-filename=&quot;mr4.png&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333; text-align: start;&quot;&gt; &amp;nbsp;먼저 test branch에는 227fdfa3과 185dfc5c 이 두 브랜치가 쌓여 있습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mr2.png&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqGDWK/btsboXxQnnn/SZRZyGaMu06N5j5bXRzt0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqGDWK/btsboXxQnnn/SZRZyGaMu06N5j5bXRzt0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqGDWK/btsboXxQnnn/SZRZyGaMu06N5j5bXRzt0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqGDWK%2FbtsboXxQnnn%2FSZRZyGaMu06N5j5bXRzt0k%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;570&quot; height=&quot;112&quot; data-filename=&quot;mr2.png&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;227fd..는 1.txt에 1, 2, 3이 추가된 것입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mr3.png&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S5Fjc/btsbmXZvX2r/wDLiaVznwgcq1FNl1tdxq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S5Fjc/btsbmXZvX2r/wDLiaVznwgcq1FNl1tdxq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S5Fjc/btsbmXZvX2r/wDLiaVznwgcq1FNl1tdxq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS5Fjc%2FbtsbmXZvX2r%2FwDLiaVznwgcq1FNl1tdxq1%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;510&quot; height=&quot;94&quot; data-filename=&quot;mr3.png&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;94&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;185df...는 2.txt에 1, 2, 3이 추가된 것입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mr5.png&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;95&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cONZs0/btsbjjJl4oK/bjGN9C9uqtoGMqZYPbkkp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cONZs0/btsbjjJl4oK/bjGN9C9uqtoGMqZYPbkkp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cONZs0/btsbjjJl4oK/bjGN9C9uqtoGMqZYPbkkp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcONZs0%2FbtsbjjJl4oK%2FbjGN9C9uqtoGMqZYPbkkp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;95&quot; data-filename=&quot;mr5.png&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;95&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다음에 master 브랜치에 있는 d2bc7e9a는 1, 3이 3.txt에 추가된 것입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mr6.png&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;61&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cT8mhr/btsbqsEpfuO/uzwIpadTsIKpzXLgOMlTy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cT8mhr/btsbqsEpfuO/uzwIpadTsIKpzXLgOMlTy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cT8mhr/btsbqsEpfuO/uzwIpadTsIKpzXLgOMlTy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcT8mhr%2FbtsbqsEpfuO%2FuzwIpadTsIKpzXLgOMlTy1%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;599&quot; height=&quot;61&quot; data-filename=&quot;mr6.png&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;61&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;git rebase test를 입력해 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mr7.png&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjEO8q/btsboZiaQke/Vq2inHo1jxRwH4R6Z7NfQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjEO8q/btsboZiaQke/Vq2inHo1jxRwH4R6Z7NfQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjEO8q/btsboZiaQke/Vq2inHo1jxRwH4R6Z7NfQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjEO8q%2FbtsboZiaQke%2FVq2inHo1jxRwH4R6Z7NfQk%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;789&quot; height=&quot;204&quot; data-filename=&quot;mr7.png&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그랬더니, 요래 바뀌어 버렸습니다. 어떻게 수행된 것일까요? master인 상태에서 git rebase test를 입력하였습니다. &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;a style=&quot;color: #f89009;&quot; href=&quot;https://git-scm.com/docs/git-rebase&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;문서&lt;/a&gt;&lt;/span&gt;를 보면, &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;현재 branch가 topic인 경우, git rebase master와 git rebase master topic이 동일하게 수행된다고 되어 있습니다.&lt;/b&gt;&lt;/span&gt;&amp;nbsp; 지금 제 current branch는 master였고, 저는 git rebase test를 했습니다. 따라서, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;현재 branch가 master였던 제 상황에서 git rebase test와 git rebase test master는 동일한 일을 수행합니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;어떻게 수행되는가? 위 그림을 보면, test의 head에 3.txt add라는 커밋이 쌓인 것에다가 master의 3.txt add 커밋이 다시 쌓였음을 알 수 있습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mr12.png&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8WdC4/btsbqrZQdBo/Pr71mmMigB7XX1M6Pvyrkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8WdC4/btsbqrZQdBo/Pr71mmMigB7XX1M6Pvyrkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8WdC4/btsbqrZQdBo/Pr71mmMigB7XX1M6Pvyrkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8WdC4%2FbtsbqrZQdBo%2FPr71mmMigB7XX1M6Pvyrkk%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;388&quot; height=&quot;422&quot; data-filename=&quot;mr12.png&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그림으로 그리자면 원래는 이런 상황이였습니다. 중간에 튀어 나온 3.txt add가 있습니다. master에만 적용된 것입니다. 이 상황이였는데, 아래와 같은 상황이 되어버린 셈입니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mr13.png&quot; data-origin-width=&quot;380&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXOE6J/btsblpWQFXz/jBwfoI29PQKf1Rhhn2DVzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXOE6J/btsblpWQFXz/jBwfoI29PQKf1Rhhn2DVzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXOE6J/btsblpWQFXz/jBwfoI29PQKf1Rhhn2DVzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXOE6J%2FbtsblpWQFXz%2FjBwfoI29PQKf1Rhhn2DVzk%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;380&quot; height=&quot;559&quot; data-filename=&quot;mr13.png&quot; data-origin-width=&quot;380&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;master의 3.txt add가 붙는 기준점이 2.txt add 커밋으로 변경되었습니다. test의 HEAD과 같습니다. 즉 test의 HEAD 다음에 3.txt add가 붙어버렸습니다. 기준점이 2.txt add이기 때문입니다. 그 다음에 3.txt add 커밋이 붙고 해당 커밋을 master가 가르킵니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mr4.png&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bswfNO/btsbkFlnThO/bA5PRWSL2fnuWo1ZNcVjYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bswfNO/btsbkFlnThO/bA5PRWSL2fnuWo1ZNcVjYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bswfNO/btsbkFlnThO/bA5PRWSL2fnuWo1ZNcVjYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbswfNO%2FbtsbkFlnThO%2FbA5PRWSL2fnuWo1ZNcVjYK%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;786&quot; height=&quot;137&quot; data-filename=&quot;mr4.png&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다시 이 상황으로 돌아옵시다. 위 그림과 같은 상황에서, git rebase master test 명령을 입력했다면 어떻게 되었을까요?&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mr8.png&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bABwTv/btsbmcicCFC/wAiJ12Von3catgRI1JKSJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bABwTv/btsbmcicCFC/wAiJ12Von3catgRI1JKSJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bABwTv/btsbmcicCFC/wAiJ12Von3catgRI1JKSJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbABwTv%2FbtsbmcicCFC%2FwAiJ12Von3catgRI1JKSJk%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;452&quot; height=&quot;117&quot; data-filename=&quot;mr8.png&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;한 번 입력해 봅시다. 그러면 updated refs/heads/test 메세지가 뜹니다. 이 경우, master의 head가 기준점이 되고, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;그 기준점으로부터 1.txt add와 2.txt add가 붙습니다.&lt;/u&gt;&lt;/span&gt; 그 다음에, 마지막 커밋인 2.txt add에 test가 붙습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mr15.png&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t5Fc0/btsbn5wcmkj/3c3DX9uqKcm6k1buXPdxak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t5Fc0/btsbn5wcmkj/3c3DX9uqKcm6k1buXPdxak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t5Fc0/btsbn5wcmkj/3c3DX9uqKcm6k1buXPdxak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft5Fc0%2Fbtsbn5wcmkj%2F3c3DX9uqKcm6k1buXPdxak%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;335&quot; height=&quot;558&quot; data-filename=&quot;mr15.png&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;558&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;그림으로 그리면 이런 상황이 되겠습니다. 정말 그렇게 변했는지 커밋 그래프를 확인해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mr9.png&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb63RO/btsbmgrvhys/6tgbUA7110MNkAQPmGwwf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb63RO/btsbmgrvhys/6tgbUA7110MNkAQPmGwwf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb63RO/btsbmgrvhys/6tgbUA7110MNkAQPmGwwf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb63RO%2Fbtsbmgrvhys%2F6tgbUA7110MNkAQPmGwwf0%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;693&quot; height=&quot;140&quot; data-filename=&quot;mr9.png&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;140&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;master는 3.txt add까지 반영되어 있고, 다음 1.txt add와 2.txt add는 test에서 추가로 쌓인 커밋들이네요. git checkout test를 실행해서 3.txt가 잘 있나 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mr10.png&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buoSHc/btsboZJe9vo/kKEzhYI1lwaVVhUbPdGIVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buoSHc/btsboZJe9vo/kKEzhYI1lwaVVhUbPdGIVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buoSHc/btsboZJe9vo/kKEzhYI1lwaVVhUbPdGIVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuoSHc%2FbtsboZJe9vo%2FkKEzhYI1lwaVVhUbPdGIVk%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;757&quot; height=&quot;246&quot; data-filename=&quot;mr10.png&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;1, 3이 적혀있는 3.txt가 잘 있음을 확인할 수 있습니다. 이는 test의 기준점이 main commit이 아니라,&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt; master의 3.txt add였기 때문이 가능합니다.&lt;/u&gt;&lt;/span&gt; 해당 커밋이 1, 3이 적혀져 있는 3.txt가 추가되는 것이기 때문입니다. 다음 시간에 -onto 옵션을 알아보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>GIT</category>
      <category>Git</category>
      <category>rebase</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/877</guid>
      <comments>https://codingdog.tistory.com/entry/git-rebase-%EB%AA%85%EB%A0%B9%EC%96%B4%EC%97%90-%EB%8C%80%ED%95%B4-%EA%B0%84%EB%8B%A8%ED%95%98%EA%B2%8C-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry877comment</comments>
      <pubDate>Thu, 20 Apr 2023 00:35:14 +0900</pubDate>
    </item>
    <item>
      <title>filezilla 로 파일 업로드 다운로드 하는 방법을 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/filezilla-%EB%A1%9C-%ED%8C%8C%EC%9D%BC-%EC%97%85%EB%A1%9C%EB%93%9C-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;안녕하세요. 이번 시간에는 filezilla를 이용해서 파일을 업로드 하고 다운로드 하는 방법을 알아보겠습니다.&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;저는 ssh에 접속하기 위해서 mobaxterm을 많이 쓰는 편입니다. 이것은 sftp도 제공되기 때문에, 라이센스 문제만 없다면 써도 무난합니다. 그렇지 않은 경우 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;생각보다 유용하게 써먹을 수 있어서 공유해 보겠습니다.&lt;/u&gt;&lt;/span&gt; 파일 - 사이트 관리자를 눌러보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fz3.png&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cI9NoB/btsaSjvg5xv/JHkkjbFUM19fo0vT2bJPb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cI9NoB/btsaSjvg5xv/JHkkjbFUM19fo0vT2bJPb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cI9NoB/btsaSjvg5xv/JHkkjbFUM19fo0vT2bJPb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcI9NoB%2FbtsaSjvg5xv%2FJHkkjbFUM19fo0vT2bJPb1%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;382&quot; height=&quot;246&quot; data-filename=&quot;fz3.png&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저, 프로토콜은 SFTP를 선택합니다. ftp와 다른 점은 &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;Secure가 붙어서 암호화 되어 전송&lt;/b&gt;&lt;/span&gt;된다는 것입니다. 그 말인 즉슨, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;평문으로 전송하지 않고 암호화 해서 전송한다는 의미가 되겠습니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fz4.png&quot; data-origin-width=&quot;769&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GcNTq/btsaVdugMGY/74R9ujd7LK9lxXeprvsY70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GcNTq/btsaVdugMGY/74R9ujd7LK9lxXeprvsY70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GcNTq/btsaVdugMGY/74R9ujd7LK9lxXeprvsY70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGcNTq%2FbtsaVdugMGY%2F74R9ujd7LK9lxXeprvsY70%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;769&quot; height=&quot;468&quot; data-filename=&quot;fz4.png&quot; data-origin-width=&quot;769&quot; data-origin-height=&quot;468&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; 다음, 호스트는 ip 주소를 적습니다. ec2로 접속하려면 ec2 접속 사이트를 적어주면 됩니다. 다음, 로그온 유형입니다.&amp;nbsp;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fz13.png&quot; data-origin-width=&quot;375&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MbdQ0/btsaUllCS0H/w1hjBBiU7rMc8i1hSj6cKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MbdQ0/btsaUllCS0H/w1hjBBiU7rMc8i1hSj6cKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MbdQ0/btsaUllCS0H/w1hjBBiU7rMc8i1hSj6cKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMbdQ0%2FbtsaUllCS0H%2Fw1hjBBiU7rMc8i1hSj6cKK%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;375&quot; height=&quot;162&quot; data-filename=&quot;fz13.png&quot; data-origin-width=&quot;375&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;저는 비밀번호로 제 집에 있는 서버에 접속할 것이므로, 비밀번호 묻기를 선택하겠습니다. 키 파일이 있는 경우 키 파일을 선택해 준 다음에 키 파일을 넣어주시면 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fz5.png&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wEXT5/btsaw6RCeuV/JMdEqt5evlgYyOgAvey7y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wEXT5/btsaw6RCeuV/JMdEqt5evlgYyOgAvey7y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wEXT5/btsaw6RCeuV/JMdEqt5evlgYyOgAvey7y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwEXT5%2Fbtsaw6RCeuV%2FJMdEqt5evlgYyOgAvey7y1%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;566&quot; height=&quot;305&quot; data-filename=&quot;fz5.png&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;305&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;저는 비밀번호로 접속하려고 합니다. 제 서버의 ip 주소를 보기 위해 ifconfig 명령어를 입력해 주었습니다. 172.30.1.3이니까 이 주소를 그대로 쓰면 되겠네요. 이렇게 사이트를 만들고 나면 아래와 같이 접속하면 됩니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fz17.png&quot; data-origin-width=&quot;373&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sVMDA/btsaVdHNAPs/xpIs3UAqlTACcnxoKA5dN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sVMDA/btsaVdHNAPs/xpIs3UAqlTACcnxoKA5dN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sVMDA/btsaVdHNAPs/xpIs3UAqlTACcnxoKA5dN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsVMDA%2FbtsaVdHNAPs%2FxpIs3UAqlTACcnxoKA5dN0%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;373&quot; height=&quot;177&quot; data-filename=&quot;fz17.png&quot; data-origin-width=&quot;373&quot; data-origin-height=&quot;177&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;서버 3개 있는 아이콘 밑에 드랍 다운 버튼을 누르시면 사이트가 있습니다. 여기서, &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;접속할 사이트를 선택&lt;/b&gt;&lt;/span&gt;하시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fz16.png&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRusZV/btsaSjBZsiS/Jbd1L0UFy7nv3kOfDt6lvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRusZV/btsaSjBZsiS/Jbd1L0UFy7nv3kOfDt6lvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRusZV/btsaSjBZsiS/Jbd1L0UFy7nv3kOfDt6lvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRusZV%2FbtsaSjBZsiS%2FJbd1L0UFy7nv3kOfDt6lvK%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;776&quot; height=&quot;182&quot; data-filename=&quot;fz16.png&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;182&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;물론 빠른 연결을 할 수도 있습니다. 비밀번호를 입력해서 sftp로 연결한다면, sftp://ip 주소와 사용자명, 비밀번호를 입력해서 연결하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;인증 정보가 올바르다면 로컬 사이트와 함께, 오른쪽 탭에는 리모트 사이트가 뜨게 됩니다. 리모트는 원격이라는 뜻입니다. 제 입장에서는 파일을 올리고 다운로드 받는 서버를 의미합니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fz14.png&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AR2gI/btsaPHp66vw/WP0rVyNfRdWdS6e1Q0DHnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AR2gI/btsaPHp66vw/WP0rVyNfRdWdS6e1Q0DHnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AR2gI/btsaPHp66vw/WP0rVyNfRdWdS6e1Q0DHnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAR2gI%2FbtsaPHp66vw%2FWP0rVyNfRdWdS6e1Q0DHnK%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;401&quot; height=&quot;270&quot; data-filename=&quot;fz14.png&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;리모트 사이트 옆에 있는 /ftpuser_home은 현재 내가 원격의 ftpuser_home 디렉토리를 보고 있다는 의미입니다. 여기에 파일 하나를 올려보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fz7.png&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;213&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkvh1e/btsaShjQymu/LkZkQ2sFM6ZFuR0LaFkX3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkvh1e/btsaShjQymu/LkZkQ2sFM6ZFuR0LaFkX3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkvh1e/btsaShjQymu/LkZkQ2sFM6ZFuR0LaFkX3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdkvh1e%2FbtsaShjQymu%2FLkZkQ2sFM6ZFuR0LaFkX3k%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;489&quot; height=&quot;213&quot; data-filename=&quot;fz7.png&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;213&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;gh_hide.jpg를 우클릭 한 다음, 업로드(U)를 눌러보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fz8.png&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRmuNW/btsaSSRF2gS/iWPjSol62xdJn5kMaB4TzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRmuNW/btsaSSRF2gS/iWPjSol62xdJn5kMaB4TzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRmuNW/btsaSSRF2gS/iWPjSol62xdJn5kMaB4TzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRmuNW%2FbtsaSSRF2gS%2FiWPjSol62xdJn5kMaB4TzK%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;584&quot; height=&quot;291&quot; data-filename=&quot;fz8.png&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;291&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;ftpuser_home에 gh_hide.jpg가 올라갔음을 볼 수 있습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fz9.png&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6Ldvi/btsaRN4iLHU/wf1KwO7HotuvRUmfzuIQw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6Ldvi/btsaRN4iLHU/wf1KwO7HotuvRUmfzuIQw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6Ldvi/btsaRN4iLHU/wf1KwO7HotuvRUmfzuIQw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6Ldvi%2FbtsaRN4iLHU%2Fwf1KwO7HotuvRUmfzuIQw1%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;568&quot; height=&quot;102&quot; data-filename=&quot;fz9.png&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;102&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;서버에 들어가서, 해당 디렉토리에 접근해 보니 정말로 gh_hide.jpg가 올라갔음을 알 수 있습니다. 당연하게도, 폴더 업로드가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fz11.png&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNk8wR/btsaSiCVq8V/oUnNn802YUylPBd4799k91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNk8wR/btsaSiCVq8V/oUnNn802YUylPBd4799k91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNk8wR/btsaSiCVq8V/oUnNn802YUylPBd4799k91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNk8wR%2FbtsaSiCVq8V%2FoUnNn802YUylPBd4799k91%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;450&quot; height=&quot;222&quot; data-filename=&quot;fz11.png&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;클라이언트의 D: 폴더에 파일을 다운로드 받고 싶습니다. 그러면 로컬 사이트를 D:를 보게 만듭니다. D:를 선택하면 되겠네요. 그러면, 현재 제 로컬은 로컬의 D: 디렉토리를 보고 있습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fz10.png&quot; data-origin-width=&quot;405&quot; data-origin-height=&quot;221&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpamlf/btsaUllCNpY/AuXCsdDBH8qKjnrt8mClq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpamlf/btsaUllCNpY/AuXCsdDBH8qKjnrt8mClq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpamlf/btsaUllCNpY/AuXCsdDBH8qKjnrt8mClq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpamlf%2FbtsaUllCNpY%2FAuXCsdDBH8qKjnrt8mClq0%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;405&quot; height=&quot;221&quot; data-filename=&quot;fz10.png&quot; data-origin-width=&quot;405&quot; data-origin-height=&quot;221&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;다음 리모트에 있는 파일을 클릭한 다음에 다운로드를 눌러보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fz12.png&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKD2RU/btsaSjaMRY4/xWbupAVB9NVPkMcfygU0i1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKD2RU/btsaSjaMRY4/xWbupAVB9NVPkMcfygU0i1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKD2RU/btsaSjaMRY4/xWbupAVB9NVPkMcfygU0i1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKD2RU%2FbtsaSjaMRY4%2FxWbupAVB9NVPkMcfygU0i1%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;569&quot; height=&quot;291&quot; data-filename=&quot;fz12.png&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;291&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;몇 초 후에, 다운로드가 되게 됩니다. D: 폴더에 가 보니, gh_hide.jpg가 잘 들어왔음을 확인할 수 있습니다. 폴더도 다운로드가 되니 잘 이용하면 좋겠습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>유틸리티</category>
      <category>FileZilla</category>
      <category>다운로드</category>
      <category>업로드</category>
      <category>파일질라</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/876</guid>
      <comments>https://codingdog.tistory.com/entry/filezilla-%EB%A1%9C-%ED%8C%8C%EC%9D%BC-%EC%97%85%EB%A1%9C%EB%93%9C-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry876comment</comments>
      <pubDate>Mon, 17 Apr 2023 23:58:46 +0900</pubDate>
    </item>
    <item>
      <title>git merge squash에 대해 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/git-merge-squash%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;안녕하세요. 이번 시간에는 git merge squash에 대해 간단하게 알아보고 실습해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sa1.png&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPXDal/btsahzlTzNe/wH8A6bIZoGXG3jxzqSX9kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPXDal/btsahzlTzNe/wH8A6bIZoGXG3jxzqSX9kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPXDal/btsahzlTzNe/wH8A6bIZoGXG3jxzqSX9kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPXDal%2FbtsahzlTzNe%2FwH8A6bIZoGXG3jxzqSX9kk%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;482&quot; height=&quot;114&quot; data-filename=&quot;sa1.png&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;현재, 깃 그래프는 위와 같아요. main commit가 master의 head입니다. 여기로부터 분기되어 test add와 test2 add라는 커밋이 들어갔는데요. 이 부분이 test 브랜치에 있는 commit입니다. 이제, 우리는 이런 상황을 생각해 보겠습니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;feature test를 개발했고, 테스트가 잘 되어서 merge하려는 상황입니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sa2.png&quot; data-origin-width=&quot;511&quot; data-origin-height=&quot;289&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p2zcr/btsakhEKlUo/fCFbobSYQ6GKtGvaXjSJjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p2zcr/btsakhEKlUo/fCFbobSYQ6GKtGvaXjSJjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p2zcr/btsakhEKlUo/fCFbobSYQ6GKtGvaXjSJjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp2zcr%2FbtsakhEKlUo%2FfCFbobSYQ6GKtGvaXjSJjk%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;511&quot; height=&quot;289&quot; data-filename=&quot;sa2.png&quot; data-origin-width=&quot;511&quot; data-origin-height=&quot;289&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저, test add의 커밋 hash는 f7ca322.. 입니다. test.txt가 추가되었다고 하는군요. 어떤 내용이 추가되었는지 보겠습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sa4.png&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZppDP/btsak4yx6cz/GrBks9wo9IJD5TzfHdZCp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZppDP/btsak4yx6cz/GrBks9wo9IJD5TzfHdZCp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZppDP/btsak4yx6cz/GrBks9wo9IJD5TzfHdZCp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZppDP%2Fbtsak4yx6cz%2FGrBks9wo9IJD5TzfHdZCp0%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;417&quot; height=&quot;114&quot; data-filename=&quot;sa4.png&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;test.txt에 1과 2가 추가되었습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sa3.png&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dggCQE/btsamYdBqic/jQERBwGPUbtXKQqnfPfLAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dggCQE/btsamYdBqic/jQERBwGPUbtXKQqnfPfLAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dggCQE/btsamYdBqic/jQERBwGPUbtXKQqnfPfLAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdggCQE%2FbtsamYdBqic%2FjQERBwGPUbtXKQqnfPfLAK%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;466&quot; height=&quot;267&quot; data-filename=&quot;sa3.png&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다음 test2 add에는 test2.txt가 추가되었습니다. 커밋 hash는 f42e420입니다. 어떤 내용이 추가되었는지 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sa5.png&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;151&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZ6ta3/btsaqPgxqGj/SOibaAI2uNnxooFKOPefZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZ6ta3/btsaqPgxqGj/SOibaAI2uNnxooFKOPefZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZ6ta3/btsaqPgxqGj/SOibaAI2uNnxooFKOPefZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZ6ta3%2FbtsaqPgxqGj%2FSOibaAI2uNnxooFKOPefZk%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;409&quot; height=&quot;151&quot; data-filename=&quot;sa5.png&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;151&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;역시 test2.txt에 1, 2가 추가되었습니다. test 브랜치에서 추가된 기능을 요약하면, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;test.txt와 test2.txt에 1과 2, 이렇게 2개의 줄이 추가되었다는 점이겠군요.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sa6.png&quot; data-origin-width=&quot;427&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dYL33p/btsajeaEF2v/neq10FCdXtzHdxYdEC8Co1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dYL33p/btsajeaEF2v/neq10FCdXtzHdxYdEC8Co1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dYL33p/btsajeaEF2v/neq10FCdXtzHdxYdEC8Co1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdYL33p%2FbtsajeaEF2v%2Fneq10FCdXtzHdxYdEC8Co1%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;427&quot; height=&quot;236&quot; data-filename=&quot;sa6.png&quot; data-origin-width=&quot;427&quot; data-origin-height=&quot;236&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이제, git merge test --squash로 머지해 보겠습니다. test를 main에 merge를 하는데, --squash를 한다는 의미입니다. test에는 커밋 2개가 쌓여 있었는데요. 어떻게 머지가 되는지 보겠습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sa7.png&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MP9TR/btsamXThDN7/KIKbojJFtMY0JjA4kGpVR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MP9TR/btsamXThDN7/KIKbojJFtMY0JjA4kGpVR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MP9TR/btsamXThDN7/KIKbojJFtMY0JjA4kGpVR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMP9TR%2FbtsamXThDN7%2FKIKbojJFtMY0JjA4kGpVR1%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;566&quot; height=&quot;256&quot; data-filename=&quot;sa7.png&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;test.txt와 test2.txt에 변경 사항이 있는, 커밋 hash가 923bf.. 인 커밋이 main에 추가됩니다. 즉, test에 test feature를 개발하기 위한 커밋이 t1, t2가 있었어요. 이 부분을 main에 머지했을 때, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;t1과 t2가 반영된 또 다른 t3'이 생성&lt;/u&gt;&lt;/span&gt;됨을 알 수 있어요. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;즉 t1과 t2가 t3'으로 되었음을 알 수 있어요. 합쳐진 셈입니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;해당 커밋에 test.txt와 test2.txt가 어떻게 변했는지 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sa8.png&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;115&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ADan1/btsayU9nTFD/UGBirRti6Rov93Y4HAVbIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ADan1/btsayU9nTFD/UGBirRti6Rov93Y4HAVbIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ADan1/btsayU9nTFD/UGBirRti6Rov93Y4HAVbIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FADan1%2FbtsayU9nTFD%2FUGBirRti6Rov93Y4HAVbIk%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;447&quot; height=&quot;115&quot; data-filename=&quot;sa8.png&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;115&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저 test.txt입니다. 1과 2가 추가되었습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sa9.png&quot; data-origin-width=&quot;419&quot; data-origin-height=&quot;102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kQKXr/btsatWsUr4h/XHZ4mZGr6VfRNdCK9M2gfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kQKXr/btsatWsUr4h/XHZ4mZGr6VfRNdCK9M2gfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kQKXr/btsatWsUr4h/XHZ4mZGr6VfRNdCK9M2gfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkQKXr%2FbtsatWsUr4h%2FXHZ4mZGr6VfRNdCK9M2gfK%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;419&quot; height=&quot;102&quot; data-filename=&quot;sa9.png&quot; data-origin-width=&quot;419&quot; data-origin-height=&quot;102&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다음 test2.txt입니다. 역시 1과 2가 추가되었음을 알 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>GIT</category>
      <category>Git</category>
      <category>merge</category>
      <category>squash</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/875</guid>
      <comments>https://codingdog.tistory.com/entry/git-merge-squash%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry875comment</comments>
      <pubDate>Sun, 16 Apr 2023 01:20:32 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 bg fg 전환 방법을 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-bg-fg-%EC%A0%84%ED%99%98-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;리눅스에는 foreground process, background process가 있습니다. foreground process를 백그라운드로 돌게, background process를 foreground로 돌게 바꾸는 방법을 알아봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fg1.png&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;95&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dZ1RJp/btr91w3PdvR/2zagkG1KVk9NHyyzU2kPqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dZ1RJp/btr91w3PdvR/2zagkG1KVk9NHyyzU2kPqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dZ1RJp/btr91w3PdvR/2zagkG1KVk9NHyyzU2kPqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdZ1RJp%2Fbtr91w3PdvR%2F2zagkG1KVk9NHyyzU2kPqk%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;528&quot; height=&quot;95&quot; data-filename=&quot;fg1.png&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;95&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저, foreground process입니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;sleep 100을 치면, 해당 terminal에서 100초동안 멈춰 있어요.&lt;/b&gt;&lt;/span&gt; 여기까지 정리해 봅시다. 제가 sleep 100을 터미널 tty1에서 입력하였습니다. 그러면, tty1과 sleep 100을 실행시킨 프로세스는 연결되어 있고, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;100초가 지날 때 까지 유저와 커뮤니케이션을 하게 됩니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fg4.png&quot; data-origin-width=&quot;383&quot; data-origin-height=&quot;70&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8tD7j/btr9Ylhq8p9/m22bV2see30OCjJmnGfJ91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8tD7j/btr9Ylhq8p9/m22bV2see30OCjJmnGfJ91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8tD7j/btr9Ylhq8p9/m22bV2see30OCjJmnGfJ91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8tD7j%2Fbtr9Ylhq8p9%2Fm22bV2see30OCjJmnGfJ91%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;383&quot; height=&quot;70&quot; data-filename=&quot;fg4.png&quot; data-origin-width=&quot;383&quot; data-origin-height=&quot;70&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;뒤에 &amp;amp;를 붙이면 어떻게 될까요? sleep 100 &amp;amp;을 했는데도, 멈춰 있지 않습니다. sleep 100을 백그라운드로 실행시켰다고 생각하면 편합니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fg21.png&quot; data-origin-width=&quot;290&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nkZDz/btr94yGhJhj/CoO6iRFPUWTrTley8V6vu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nkZDz/btr94yGhJhj/CoO6iRFPUWTrTley8V6vu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nkZDz/btr94yGhJhj/CoO6iRFPUWTrTley8V6vu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnkZDz%2Fbtr94yGhJhj%2FCoO6iRFPUWTrTley8V6vu1%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;290&quot; height=&quot;453&quot; data-filename=&quot;fg21.png&quot; data-origin-width=&quot;290&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;요래 그려지겠네요. 정리하면 뒤에 &amp;amp;을 붙여서 실행하면 백그라운드 프로세스로 돌아간다. 입니다. 제가 sleep 100 &amp;amp;을 했기 때문에 터미널 tty의 뒤에서 돌아가고 있는 셈입니다. 데몬하고는 구분지어야 하는데요. 이건 기회 되면 한 번 정리해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fg12.png&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;101&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boG6aU/btr94icrJkI/Bn11oTXtdk56qd9nGJ90Q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boG6aU/btr94icrJkI/Bn11oTXtdk56qd9nGJ90Q0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boG6aU/btr94icrJkI/Bn11oTXtdk56qd9nGJ90Q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboG6aU%2Fbtr94icrJkI%2FBn11oTXtdk56qd9nGJ90Q0%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;364&quot; height=&quot;101&quot; data-filename=&quot;fg12.png&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;101&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이제 sleep 100을 한 상태에서 ctrl Z를 입력해 봅시다. 그러면, suspend 상태가 되면서 제어권이 터미널로 넘어오게 됩니다. 이를 간단하게 도식화 해서 그려보면 아래와 같습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fg20.png&quot; data-origin-width=&quot;309&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7JRAb/btr91xuVi73/9mkxFhtG59IADkEfHybFe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7JRAb/btr91xuVi73/9mkxFhtG59IADkEfHybFe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7JRAb/btr91xuVi73/9mkxFhtG59IADkEfHybFe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7JRAb%2Fbtr91xuVi73%2F9mkxFhtG59IADkEfHybFe0%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;309&quot; height=&quot;453&quot; data-filename=&quot;fg20.png&quot; data-origin-width=&quot;309&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;여기까지 별로 어렵지 않아요. 즉, foreground 프로세스가 실행되었을 때, ctrl + z를 누르면 suspend 상태가 된다. 정도만 기억하시면 됩니다. 혹은 signal을 보낼 수도 있습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fg15.png&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lhFZ4/btr9V99gH9e/1mrli4TALBup40wJHLHQK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lhFZ4/btr9V99gH9e/1mrli4TALBup40wJHLHQK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lhFZ4/btr9V99gH9e/1mrli4TALBup40wJHLHQK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlhFZ4%2Fbtr9V99gH9e%2F1mrli4TALBup40wJHLHQK0%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;577&quot; height=&quot;112&quot; data-filename=&quot;fg15.png&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;ps -aux | grep sleep을 쳐서 sleep을 실행시킨 프로세스를 찾습니다. 보니까 9116이네요. kill -19 9116 (sigstop 시그널)을 날려 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fg16.png&quot; data-origin-width=&quot;394&quot; data-origin-height=&quot;65&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/etuq41/btr95pbfgSd/aFmezfPjQkM7NGE3tGdEdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/etuq41/btr95pbfgSd/aFmezfPjQkM7NGE3tGdEdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/etuq41/btr95pbfgSd/aFmezfPjQkM7NGE3tGdEdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fetuq41%2Fbtr95pbfgSd%2FaFmezfPjQkM7NGE3tGdEdk%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;394&quot; height=&quot;65&quot; data-filename=&quot;fg16.png&quot; data-origin-width=&quot;394&quot; data-origin-height=&quot;65&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 sleep 프로세스가 signal 때문에 suspend 되었음을 볼 수 있어요.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fg17.png&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;79&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cybOLE/btr96PHz8MJ/GTIFRkrwpLEKKwRgEDHYzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cybOLE/btr96PHz8MJ/GTIFRkrwpLEKKwRgEDHYzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cybOLE/btr96PHz8MJ/GTIFRkrwpLEKKwRgEDHYzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcybOLE%2Fbtr96PHz8MJ%2FGTIFRkrwpLEKKwRgEDHYzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;346&quot; height=&quot;79&quot; data-filename=&quot;fg17.png&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;79&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이제 jobs를 보면 1번 job이 sleep 100이 잡혀있음을 볼 수 있어요. bg %1을 입력해 보겠습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fg18.png&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;79&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yCLWG/btr9SOKXJtD/LLrJeivKdtsq65WG5yyY51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yCLWG/btr9SOKXJtD/LLrJeivKdtsq65WG5yyY51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yCLWG/btr9SOKXJtD/LLrJeivKdtsq65WG5yyY51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyCLWG%2Fbtr9SOKXJtD%2FLLrJeivKdtsq65WG5yyY51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;346&quot; height=&quot;79&quot; data-filename=&quot;fg18.png&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;79&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 suspend 된 프로세스가 백그라운드로 실행됩니다. 이 경우에는 done까지 같이 출력되었는데요. 아마도 suspend를 시킨 지 너무 오래 되어서 그러지 않았을까 싶네요. 여기까지 정리해 봅시다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fg19.png&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;467&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nttw6/btr93mzjDBM/WaXCJ05eCLkRrpbXH5cF61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nttw6/btr93mzjDBM/WaXCJ05eCLkRrpbXH5cF61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nttw6/btr93mzjDBM/WaXCJ05eCLkRrpbXH5cF61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnttw6%2Fbtr93mzjDBM%2FWaXCJ05eCLkRrpbXH5cF61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;467&quot; data-filename=&quot;fg19.png&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;467&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;별로 어렵지 않지요? ctrl+z를 눌러도 되고, SIGSTOP을 보내도 됩니다. 둘의 차이점은 잡거나 무시될 수 있는 시그널이냐, 그렇지 않냐입니다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이제 background 프로세스를 foreground 프로세스로 돌게끔 만들어 봅시다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fg22.png&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dydUql/btr92vXCDqf/nw4IGCfEXj5V8fc71OTQI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dydUql/btr92vXCDqf/nw4IGCfEXj5V8fc71OTQI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dydUql/btr92vXCDqf/nw4IGCfEXj5V8fc71OTQI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdydUql%2Fbtr92vXCDqf%2Fnw4IGCfEXj5V8fc71OTQI1%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;349&quot; height=&quot;88&quot; data-filename=&quot;fg22.png&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;jobs -l을 입력해 보겠습니다. 그러면, 작업들의 리스트와 pid가 나옵니다. 저는 이 중에 2번 job을 suspend 시킬 겁니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fg23.png&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;103&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmVT20/btr90Uw8EA4/Q7nIkIlO9zP995j1QtM05K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmVT20/btr90Uw8EA4/Q7nIkIlO9zP995j1QtM05K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmVT20/btr90Uw8EA4/Q7nIkIlO9zP995j1QtM05K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmVT20%2Fbtr90Uw8EA4%2FQ7nIkIlO9zP995j1QtM05K%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;402&quot; height=&quot;103&quot; data-filename=&quot;fg23.png&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;103&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그럴려면 단순히 19번 signal, 혹은 stop signal을 9761번 process에게 넘겨주면 됩니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fg24.png&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OEGIF/btr90VJAOPC/Gn3WSGetHfnSP9rKqNIqr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OEGIF/btr90VJAOPC/Gn3WSGetHfnSP9rKqNIqr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OEGIF/btr90VJAOPC/Gn3WSGetHfnSP9rKqNIqr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOEGIF%2Fbtr90VJAOPC%2FGn3WSGetHfnSP9rKqNIqr1%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;312&quot; height=&quot;108&quot; data-filename=&quot;fg24.png&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;혹은 fg %N으로 N번 job을 foreground process로 바로 전환할 수도 있습니다. 여기까지 정리하면 아래와 같습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fg25.png&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;443&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rkXHj/btr91Aypqjb/UKA6FgUYhUpfhPGe3CE0F1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rkXHj/btr91Aypqjb/UKA6FgUYhUpfhPGe3CE0F1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rkXHj/btr91Aypqjb/UKA6FgUYhUpfhPGe3CE0F1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrkXHj%2Fbtr91Aypqjb%2FUKA6FgUYhUpfhPGe3CE0F1%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;495&quot; height=&quot;443&quot; data-filename=&quot;fg25.png&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;443&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>OS/리눅스</category>
      <category>bg</category>
      <category>fg</category>
      <category>Linux</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/874</guid>
      <comments>https://codingdog.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-bg-fg-%EC%A0%84%ED%99%98-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry874comment</comments>
      <pubDate>Fri, 14 Apr 2023 00:22:11 +0900</pubDate>
    </item>
    <item>
      <title>redis 패턴 키 삭제하는 방법을 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/redis-%ED%8C%A8%ED%84%B4-%EC%82%AD%EC%A0%9C%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;redis에서 특정 패턴을 가지는 키를 모두 삭제하는 방법이 없을까요? &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;xargs를 이용하면 가능&lt;/u&gt;&lt;/span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pr1.png&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;149&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KUR3R/btr9n6jAEsY/hTLDQKQOQIQNB4MEjedok0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KUR3R/btr9n6jAEsY/hTLDQKQOQIQNB4MEjedok0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KUR3R/btr9n6jAEsY/hTLDQKQOQIQNB4MEjedok0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKUR3R%2Fbtr9n6jAEsY%2FhTLDQKQOQIQNB4MEjedok0%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;333&quot; height=&quot;149&quot; data-filename=&quot;pr1.png&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;149&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저 키 값이 h1:1, h1:2, h1:3, h1:4, h1:5인 것을 넣어보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pr2.png&quot; data-origin-width=&quot;339&quot; data-origin-height=&quot;111&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M8EV6/btr9kirQ9ee/3jX1XtiZMeSLYDNQQ3sKJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M8EV6/btr9kirQ9ee/3jX1XtiZMeSLYDNQQ3sKJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M8EV6/btr9kirQ9ee/3jX1XtiZMeSLYDNQQ3sKJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM8EV6%2Fbtr9kirQ9ee%2F3jX1XtiZMeSLYDNQQ3sKJ1%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;339&quot; height=&quot;111&quot; data-filename=&quot;pr2.png&quot; data-origin-width=&quot;339&quot; data-origin-height=&quot;111&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;다음에 keys *를 입력하면 모든 키가 나옵니다. h1:2, h1:1, h1:3, h1:4, h1:5가 있습니다. 상당히 많은 키가 있는 경우에, 이들을 빠르게 삭제하고 싶은데요. redis에서는 패턴 삭제를 지원하지 않습니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;대신에, 키를 삭제하는 연산과 특정 패턴을 가지는 키들을 보는 연산을 지원해 줍니다. 이를 이용해 봅시다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pr3.png&quot; data-origin-width=&quot;315&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k20fv/btr9shYVKMV/hDXUVUzt1ddPg3ybpx5x3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k20fv/btr9shYVKMV/hDXUVUzt1ddPg3ybpx5x3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k20fv/btr9shYVKMV/hDXUVUzt1ddPg3ybpx5x3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk20fv%2Fbtr9shYVKMV%2FhDXUVUzt1ddPg3ybpx5x3K%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;315&quot; height=&quot;118&quot; data-filename=&quot;pr3.png&quot; data-origin-width=&quot;315&quot; data-origin-height=&quot;118&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;keys h1:*는 h1:으로 시작하는 패턴의 키들을 모두 얻어옵니다. h1:2, h1:1, h1:3, h1:4, h1:5가 모두 해당 패턴애 match가 되니까 출력되겠네요.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pr4.png&quot; data-origin-width=&quot;391&quot; data-origin-height=&quot;113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTnCci/btr9pZj1LqA/HaQkQoQNZPLIYcPjrQ5yEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTnCci/btr9pZj1LqA/HaQkQoQNZPLIYcPjrQ5yEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTnCci/btr9pZj1LqA/HaQkQoQNZPLIYcPjrQ5yEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTnCci%2Fbtr9pZj1LqA%2FHaQkQoQNZPLIYcPjrQ5yEK%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;391&quot; height=&quot;113&quot; data-filename=&quot;pr4.png&quot; data-origin-width=&quot;391&quot; data-origin-height=&quot;113&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;shell에서 redis-cli keys &quot;h1:*&quot;를 입력하셔도 동일한 결과가 나오게 됩니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pr6.png&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;78&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dnSgoI/btr9pqIUbgm/7J1OEFBzIFmdQi8BY7OJw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dnSgoI/btr9pqIUbgm/7J1OEFBzIFmdQi8BY7OJw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dnSgoI/btr9pqIUbgm/7J1OEFBzIFmdQi8BY7OJw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdnSgoI%2Fbtr9pqIUbgm%2F7J1OEFBzIFmdQi8BY7OJw0%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;393&quot; height=&quot;78&quot; data-filename=&quot;pr6.png&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;78&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;h1:2라는 키를 제거하기 위해 redis-cli del h1:2를 입력하였습니다. 그랬더니 1개의 키가 제거되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;결국 redis-cli keys 명령어와 redis-cli del 명령어를 잘 이용하면 된다는 결론을 얻었습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pr5.png&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3cT5Q/btr9dYAt1u6/skgg0kkdvMOnFbXv9Y86uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3cT5Q/btr9dYAt1u6/skgg0kkdvMOnFbXv9Y86uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3cT5Q/btr9dYAt1u6/skgg0kkdvMOnFbXv9Y86uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3cT5Q%2Fbtr9dYAt1u6%2Fskgg0kkdvMOnFbXv9Y86uk%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;536&quot; height=&quot;68&quot; data-filename=&quot;pr5.png&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt; xargs 명령어는 이 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;a style=&quot;color: #f89009;&quot; href=&quot;https://codingdog.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-xargs-%EB%AA%85%EB%A0%B9%EC%96%B4%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;글&lt;/a&gt;&lt;/span&gt;에서도 설명했다 시피, 출력값을 command line의 인자로 넘겨주게 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pr8.png&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;69&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dWT2mN/btr9pZK538H/2oJXGlZpAwFOAUMCPsx8YK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dWT2mN/btr9pZK538H/2oJXGlZpAwFOAUMCPsx8YK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dWT2mN/btr9pZK538H/2oJXGlZpAwFOAUMCPsx8YK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdWT2mN%2Fbtr9pZK538H%2F2oJXGlZpAwFOAUMCPsx8YK%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;544&quot; height=&quot;69&quot; data-filename=&quot;pr8.png&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;69&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;redis-cli keys &quot;h1:*&quot; | xargs redis-cli del 명령어는 redis에서 h1:* 패턴을 가지는 키들을 제거하게 됩니다. 이게 어떻게 일어나는지 간단하게 도식화 시켜 보겠습니다. 먼저, redis-cli keys &quot;h1:*&quot;를 하면, 아래와 같은 결과가 나올 겁니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pr10.png&quot; data-origin-width=&quot;92&quot; data-origin-height=&quot;312&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RafNU/btr9nmUvbXV/8KWglEAolBHBPVYzN3e80k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RafNU/btr9nmUvbXV/8KWglEAolBHBPVYzN3e80k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RafNU/btr9nmUvbXV/8KWglEAolBHBPVYzN3e80k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRafNU%2Fbtr9nmUvbXV%2F8KWglEAolBHBPVYzN3e80k%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;92&quot; height=&quot;312&quot; data-filename=&quot;pr10.png&quot; data-origin-width=&quot;92&quot; data-origin-height=&quot;312&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;이 결과들이 xargs의 input으로 들어가게 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pr11.png&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cabBqu/btr9kirRmaS/8BArH03ySh2k8Ki1sPM7zK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cabBqu/btr9kirRmaS/8BArH03ySh2k8Ki1sPM7zK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cabBqu/btr9kirRmaS/8BArH03ySh2k8Ki1sPM7zK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcabBqu%2Fbtr9kirRmaS%2F8BArH03ySh2k8Ki1sPM7zK%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;324&quot; height=&quot;309&quot; data-filename=&quot;pr11.png&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;309&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;그러면 이것은 어떻게 입력으로 받을까요? redis-cli del h1:1 h1:3 h1:4 h1:5로 받게 됩니다. 즉, redis-cli del의 arguments들로 받아버리게 됩니다. redis에서 del key1 key2 ... 는 key1 key2 ... 를 삭제하는 것입니다. 따라서, redis-cli keys &quot;h1:*&quot; | xargs redis-cli del은 &quot;h1:*&quot; 패턴을 가진 모든 키를 제거합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pr9.png&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d9IjD8/btr9sgsbLFK/GPHX9safRqGeo5BcW7gPZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d9IjD8/btr9sgsbLFK/GPHX9safRqGeo5BcW7gPZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d9IjD8/btr9sgsbLFK/GPHX9safRqGeo5BcW7gPZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd9IjD8%2Fbtr9sgsbLFK%2FGPHX9safRqGeo5BcW7gPZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;346&quot; height=&quot;96&quot; data-filename=&quot;pr9.png&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이제 redis-cli을 켜서, keys h1:*을 입력해 봅시다. 그러면, empty array가 나옴을 확인할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>REDIS</category>
      <category>pattern</category>
      <category>REDIS</category>
      <category>삭제</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/873</guid>
      <comments>https://codingdog.tistory.com/entry/redis-%ED%8C%A8%ED%84%B4-%EC%82%AD%EC%A0%9C%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry873comment</comments>
      <pubDate>Mon, 10 Apr 2023 23:00:31 +0900</pubDate>
    </item>
    <item>
      <title>python math의 lcm 함수에 대해 간단하게 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/python-math%EC%9D%98-lcm-%ED%95%A8%EC%88%98%EC%97%90-%EB%8C%80%ED%95%B4-%EA%B0%84%EB%8B%A8%ED%95%98%EA%B2%8C-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;python math의 lcm은 여러 정수의 최소 공배수를 구하기 위한 함수입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lc1.png&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2Ee0V/btr8XyOlgeI/wTLTQbkM9mp34gbYGyqRXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2Ee0V/btr8XyOlgeI/wTLTQbkM9mp34gbYGyqRXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2Ee0V/btr8XyOlgeI/wTLTQbkM9mp34gbYGyqRXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2Ee0V%2Fbtr8XyOlgeI%2FwTLTQbkM9mp34gbYGyqRXk%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;390&quot; height=&quot;114&quot; data-filename=&quot;lc1.png&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;1번째 예제입니다. 2와 3의 최소공배수를 구하라고 했습니다. 결과는 6이 나올 겁니다. 왜냐하면 2와 3의 공배수 중 최소인 것은 6이기 때문입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lc2.png&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;69&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1OnWg/btr8OVQQWFy/wv1LasJ096WiY1WsEmTKd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1OnWg/btr8OVQQWFy/wv1LasJ096WiY1WsEmTKd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1OnWg/btr8OVQQWFy/wv1LasJ096WiY1WsEmTKd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1OnWg%2Fbtr8OVQQWFy%2Fwv1LasJ096WiY1WsEmTKd1%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;344&quot; height=&quot;69&quot; data-filename=&quot;lc2.png&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;69&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;여기까지는 별로 어렵지 않습니다. 당연한 것이니까요.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lc13.png&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bK2kry/btr8ZUcx0D8/fZYmsCUryGvNQW1dLnhUk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bK2kry/btr8ZUcx0D8/fZYmsCUryGvNQW1dLnhUk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bK2kry/btr8ZUcx0D8/fZYmsCUryGvNQW1dLnhUk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbK2kry%2Fbtr8ZUcx0D8%2FfZYmsCUryGvNQW1dLnhUk1%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;332&quot; height=&quot;106&quot; data-filename=&quot;lc13.png&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이제 0과 5의 최소 공배수를 구하려고 합니다. 어떻게 나올까요? 문서를 찾아보면, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;하나라도 0이 있는 경우에 무조건 0이 나온다고 되어 있습니다.&lt;/u&gt;&lt;/span&gt; 따라서, 이 경우에는 0이 나오게 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lc14.png&quot; data-origin-width=&quot;345&quot; data-origin-height=&quot;69&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdO5jc/btr8T5FGaoO/Kd2IjUKTpzypHC6vrnEKkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdO5jc/btr8T5FGaoO/Kd2IjUKTpzypHC6vrnEKkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdO5jc/btr8T5FGaoO/Kd2IjUKTpzypHC6vrnEKkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdO5jc%2Fbtr8T5FGaoO%2FKd2IjUKTpzypHC6vrnEKkK%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;345&quot; height=&quot;69&quot; data-filename=&quot;lc14.png&quot; data-origin-width=&quot;345&quot; data-origin-height=&quot;69&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;정말 그리 나오네요. 만약에 음수가 있으면 어떻게 될까요?&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lc15.png&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eBj8iZ/btr8LMUFOPm/67zOupooTkScefi3axnLE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eBj8iZ/btr8LMUFOPm/67zOupooTkScefi3axnLE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eBj8iZ/btr8LMUFOPm/67zOupooTkScefi3axnLE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeBj8iZ%2Fbtr8LMUFOPm%2F67zOupooTkScefi3axnLE1%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;340&quot; height=&quot;108&quot; data-filename=&quot;lc15.png&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;-4와 6의 최소공배수를 구하려고 합니다. 이 경우, -4의 multiple과 6의 multiple이면서 가장 값이 작은 positive integer를 돌려줍니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;multiple을 조금 더 넓게 볼 필요&lt;/b&gt;&lt;/span&gt;가 있는데요. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;y = ax이고, a와 x와 y가 integer라면 y는 x의 multiple이라고 합니다. 12는 -4의 multiple인가요?&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;네. 왜냐하면 12 = -4에 -3을 곱한 것이기 때문입니다. 그리고, -4, -3은 integer에 속합니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lc16.png&quot; data-origin-width=&quot;316&quot; data-origin-height=&quot;67&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2vVmh/btr8KHGaGmi/cztIcLzhTTg9ktKTMOcJm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2vVmh/btr8KHGaGmi/cztIcLzhTTg9ktKTMOcJm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2vVmh/btr8KHGaGmi/cztIcLzhTTg9ktKTMOcJm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2vVmh%2Fbtr8KHGaGmi%2FcztIcLzhTTg9ktKTMOcJm0%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;316&quot; height=&quot;67&quot; data-filename=&quot;lc16.png&quot; data-origin-width=&quot;316&quot; data-origin-height=&quot;67&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;고로, -4와 6의 최소 공배수는 12라는 결과가 나옵니다. 여기까지는 쉽게 이해할 만한 내용입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;제가 출제했던 가희와 서울 지하철 1호선 문제는 구간 lcm을 잘 처리해야 하는 문제였습니다. 그런데, python의 math.lcm을 잘못 사용해서 overflow가 발생했던 경우가 조금 있었습니다. 일단, math.lcm의 경우 결과 값으로 얼마나 커지면 런타임 에러를 뱉어버릴까요?&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lc3.png&quot; data-origin-width=&quot;375&quot; data-origin-height=&quot;85&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WVLEJ/btr8UXgmv1X/9hR33Fbj6vMRE6aTs5I8N0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WVLEJ/btr8UXgmv1X/9hR33Fbj6vMRE6aTs5I8N0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WVLEJ/btr8UXgmv1X/9hR33Fbj6vMRE6aTs5I8N0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWVLEJ%2Fbtr8UXgmv1X%2F9hR33Fbj6vMRE6aTs5I8N0%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;375&quot; height=&quot;85&quot; data-filename=&quot;lc3.png&quot; data-origin-width=&quot;375&quot; data-origin-height=&quot;85&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;간단하게 1과 10^9000의 최소공배수를 구해 봅시다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lc4.png&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/slYM6/btr891WCa1W/d5KQWe53GpjCeVsySmO1Yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/slYM6/btr891WCa1W/d5KQWe53GpjCeVsySmO1Yk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/slYM6/btr891WCa1W/d5KQWe53GpjCeVsySmO1Yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FslYM6%2Fbtr891WCa1W%2Fd5KQWe53GpjCeVsySmO1Yk%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;604&quot; height=&quot;135&quot; data-filename=&quot;lc4.png&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;135&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그랬더니 어떻게 나오나요? 4300자리 수까지 출력 가능하다 되어 있어요. 이 제한을 물론 풀어버릴 수도 있어요.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lc7.png&quot; data-origin-width=&quot;384&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xsVCU/btr8LjSBTCT/0sMouBxEJklHul711Fu0AK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xsVCU/btr8LjSBTCT/0sMouBxEJklHul711Fu0AK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xsVCU/btr8LjSBTCT/0sMouBxEJklHul711Fu0AK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxsVCU%2Fbtr8LjSBTCT%2F0sMouBxEJklHul711Fu0AK%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;384&quot; height=&quot;220&quot; data-filename=&quot;lc7.png&quot; data-origin-width=&quot;384&quot; data-origin-height=&quot;220&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;3.11버전부터 추가된 sys의 set_max_str_digits로 풀어버리면 됩니다. 8번째 줄에 9005라고 넣었는데요. 9005자리의 수까지 제한을 풀어버리겠다는 의미입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lc8.png&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rV2dc/btr8OV4rzXQ/EmkN486AvRPdvUPthD4mEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rV2dc/btr8OV4rzXQ/EmkN486AvRPdvUPthD4mEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rV2dc/btr8OV4rzXQ/EmkN486AvRPdvUPthD4mEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrV2dc%2Fbtr8OV4rzXQ%2FEmkN486AvRPdvUPthD4mEk%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;497&quot; height=&quot;88&quot; data-filename=&quot;lc8.png&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 10^9000도 정상적으로 출력됨을 확인할 수 있습니다. 그&lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;런데 소수들 몇 개를 lcm 시켜버리면 상당히 큰 수가 나오게 됩니다.&lt;/u&gt;&lt;/span&gt; 2이상 5000 이하 소수들의 최소 공배수를 구해 보겠습니다. 그리고 제가 해당 문제에서 그러한 데이터를 세팅해 놓지 않았을 리가 없을 겁니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lc11.png&quot; data-origin-width=&quot;366&quot; data-origin-height=&quot;219&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sOWm8/btr8PZetOKG/cFfV7CzNRyFNo5pCGbh8IK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sOWm8/btr8PZetOKG/cFfV7CzNRyFNo5pCGbh8IK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sOWm8/btr8PZetOKG/cFfV7CzNRyFNo5pCGbh8IK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsOWm8%2Fbtr8PZetOKG%2FcFfV7CzNRyFNo5pCGbh8IK%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;366&quot; height=&quot;219&quot; data-filename=&quot;lc11.png&quot; data-origin-width=&quot;366&quot; data-origin-height=&quot;219&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;어떻게 해야 할까요? 이 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;a style=&quot;color: #f89009;&quot; href=&quot;https://www.acmicpc.net/problem/27886&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;문제&lt;/a&gt;&lt;/span&gt;의 경우, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;최대 제한을 넘어가는 경우에 inf로 잘라버리면 됩니다.&lt;/u&gt;&lt;/span&gt; 예를 들어 1부터 5000까지 최소 공배수를 구해야 한다고 해 보겠습니다. 그러면, inf가 넘어가는 순간에 강제로 최소 공배수가 inf가 되게끔 조정해 주면 됩니다. 우리에게 중요한 정보는 특정 구간의 최소 공배수가 1 이상 100만 이하의 소수이냐입니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;만약에 최소 공배수가 inf라면 이 범위를 초과하는 것이기 때문에&lt;/b&gt;&lt;/span&gt;, valid 하지 않다는 정보는 쉽게 파악이 가능합니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lc12.png&quot; data-origin-width=&quot;371&quot; data-origin-height=&quot;67&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTSXuK/btr8Ls3ig6t/ukAwVHOuozXK6OLrcKpwc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTSXuK/btr8Ls3ig6t/ukAwVHOuozXK6OLrcKpwc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTSXuK/btr8Ls3ig6t/ukAwVHOuozXK6OLrcKpwc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTSXuK%2Fbtr8Ls3ig6t%2FukAwVHOuozXK6OLrcKpwc1%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;371&quot; height=&quot;67&quot; data-filename=&quot;lc12.png&quot; data-origin-width=&quot;371&quot; data-origin-height=&quot;67&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;1부터 5000까지의 최소 공배수는 너무 크니까 1061109567로 처리해도 됩니다. 그렇게 해도 문제에서 요구하는 1 이상 100만 이하의 소수보다는 작습니다. 1061109567이 나왔다는 것은 이미 답이 100만을 초과했다는 것과 동치입니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>레퍼런스/예제</category>
      <category>lcm</category>
      <category>math</category>
      <category>python</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/872</guid>
      <comments>https://codingdog.tistory.com/entry/python-math%EC%9D%98-lcm-%ED%95%A8%EC%88%98%EC%97%90-%EB%8C%80%ED%95%B4-%EA%B0%84%EB%8B%A8%ED%95%98%EA%B2%8C-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry872comment</comments>
      <pubDate>Sun, 9 Apr 2023 23:57:17 +0900</pubDate>
    </item>
    <item>
      <title>python convert value to enum과 name to enum을 하는 방법을 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/python-convert-value-to-enum%EA%B3%BC-name-to-enum%EC%9D%84-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt; 안녕하세요. enum은 보통 상수값을 선언하고, 제약하기 위해서 많이 쓰게 됩니다. 이번 시간에는 그 중에, valie 값으로 대응되는 enum member를 얻어오는 방법과 name to enum을 하는 방법을 알아보겠습니다. 상당히 많이 쓰일 듯 하니 알아두면 좋을 듯 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;그 전에 몇 가지 용어를 알아볼 거에요.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;en4.png&quot; data-origin-width=&quot;331&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Liz3P/btr8XyAe93J/9u5ydruMhHFOCp9KyK6wqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Liz3P/btr8XyAe93J/9u5ydruMhHFOCp9KyK6wqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Liz3P/btr8XyAe93J/9u5ydruMhHFOCp9KyK6wqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLiz3P%2Fbtr8XyAe93J%2F9u5ydruMhHFOCp9KyK6wqK%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;331&quot; height=&quot;108&quot; data-filename=&quot;en4.png&quot; data-origin-width=&quot;331&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;enum은 name과 value가 있어요. 5번째 줄을 보겠습니다. RED = &quot;red&quot;라고 되어 있어요. &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;여기서 우리는 RED를 name이라고 합니다. 그리고, 이 이름에 대응되는 값 &quot;red&quot;를 값이라 불러요.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;en5.png&quot; data-origin-width=&quot;326&quot; data-origin-height=&quot;41&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k7aWk/btr8MolbUzq/WiT4PffLMNxLVbhW0M4ki1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k7aWk/btr8MolbUzq/WiT4PffLMNxLVbhW0M4ki1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k7aWk/btr8MolbUzq/WiT4PffLMNxLVbhW0M4ki1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk7aWk%2Fbtr8MolbUzq%2FWiT4PffLMNxLVbhW0M4ki1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;326&quot; height=&quot;41&quot; data-filename=&quot;en5.png&quot; data-origin-width=&quot;326&quot; data-origin-height=&quot;41&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;8 ~ 9번째 줄은 Color.Red의 이름과 Color.Red의 value를 출력합니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;en6.png&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;93&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbnAly/btr8Mqb8gVe/hz99Jy1k0WeG8uoR6Kthq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbnAly/btr8Mqb8gVe/hz99Jy1k0WeG8uoR6Kthq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbnAly/btr8Mqb8gVe/hz99Jy1k0WeG8uoR6Kthq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbnAly%2Fbtr8Mqb8gVe%2Fhz99Jy1k0WeG8uoR6Kthq1%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;393&quot; height=&quot;93&quot; data-filename=&quot;en6.png&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;93&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;각각 RED와 red가 출력되게 됩니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;이 둘을 묶어놓은 것을 member라고 합니다.&lt;/u&gt;&lt;/span&gt; 즉, enum에서 &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;member는 name과 value를 가지고 있다고 볼 수 있어요.&lt;/b&gt;&lt;/span&gt; 여기까지 정리해 봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;en7.png&quot; data-origin-width=&quot;259&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8Rh55/btr8KJDBx6u/sgKoru4JRRVl5Hy1Eo2NfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8Rh55/btr8KJDBx6u/sgKoru4JRRVl5Hy1Eo2NfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8Rh55/btr8KJDBx6u/sgKoru4JRRVl5Hy1Eo2NfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8Rh55%2Fbtr8KJDBx6u%2FsgKoru4JRRVl5Hy1Eo2NfK%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;259&quot; height=&quot;200&quot; data-filename=&quot;en7.png&quot; data-origin-width=&quot;259&quot; data-origin-height=&quot;200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;어렵지 않지요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;이제 이 내용을 바탕으로 value를 enum member로 바꾸는 방법을 알아봅시다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;en1.png&quot; data-origin-width=&quot;307&quot; data-origin-height=&quot;153&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgPJEs/btr8LrvXLTl/0pWG7knUcQFwuK3o5ZIvU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgPJEs/btr8LrvXLTl/0pWG7knUcQFwuK3o5ZIvU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgPJEs/btr8LrvXLTl/0pWG7knUcQFwuK3o5ZIvU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgPJEs%2Fbtr8LrvXLTl%2F0pWG7knUcQFwuK3o5ZIvU1%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;307&quot; height=&quot;153&quot; data-filename=&quot;en1.png&quot; data-origin-width=&quot;307&quot; data-origin-height=&quot;153&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;먼저 enum member는 3개가 있어요. RED, BLUE, ORANGE입니다.&amp;nbsp;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;en8.png&quot; data-origin-width=&quot;256&quot; data-origin-height=&quot;495&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s3ufi/btr8OWhoPPJ/tig4W0GkLQydRZtK5uyab1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s3ufi/btr8OWhoPPJ/tig4W0GkLQydRZtK5uyab1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s3ufi/btr8OWhoPPJ/tig4W0GkLQydRZtK5uyab1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs3ufi%2Fbtr8OWhoPPJ%2Ftig4W0GkLQydRZtK5uyab1%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;256&quot; height=&quot;495&quot; data-filename=&quot;en8.png&quot; data-origin-width=&quot;256&quot; data-origin-height=&quot;495&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;먼저 value를 기준으로 값을 얻어오는 방법은 아래와 같이 불러오는 것입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;en2.png&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;65&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r2HsN/btr8XzzacID/MsIlE5jmkdkIbbbvKe7eiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r2HsN/btr8XzzacID/MsIlE5jmkdkIbbbvKe7eiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r2HsN/btr8XzzacID/MsIlE5jmkdkIbbbvKe7eiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr2HsN%2Fbtr8XzzacID%2FMsIlE5jmkdkIbbbvKe7eiK%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;336&quot; height=&quot;65&quot; data-filename=&quot;en2.png&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;65&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Color(&quot;red&quot;). &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;enum 클래스가 E라고 한다면, E(value)로 불러오면 됩니다.&lt;/u&gt;&lt;/span&gt; 그러면 value에 대응되는 member가 나오게 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;en3.png&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;69&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8mQAu/btr8UUwF15I/kg50T8wxLKue5mFWsfgGr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8mQAu/btr8UUwF15I/kg50T8wxLKue5mFWsfgGr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8mQAu/btr8UUwF15I/kg50T8wxLKue5mFWsfgGr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8mQAu%2Fbtr8UUwF15I%2Fkg50T8wxLKue5mFWsfgGr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;381&quot; height=&quot;69&quot; data-filename=&quot;en3.png&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;69&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;위 프로그램의 실행 결과는 Color.RED가 나옵니다. 이건 어떤 메소드를 호출할까요?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;en9.png&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWyRa3/btr8JpS8FYn/C1d4ZDR76FbfGoYkcKWFQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWyRa3/btr8JpS8FYn/C1d4ZDR76FbfGoYkcKWFQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWyRa3/btr8JpS8FYn/C1d4ZDR76FbfGoYkcKWFQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWyRa3%2Fbtr8JpS8FYn%2FC1d4ZDR76FbfGoYkcKWFQ1%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;432&quot; height=&quot;602&quot; data-filename=&quot;en9.png&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;디버그를 쭉 따라가다 보면, enum.py의 __call__을 호출함을 볼 수 있습니다. 계속 따라 들어가면 __new__를 호출하게 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;en10.png&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kFmT1/btr8MqwpSEU/wKfsqiqZDHTv4gigkeysnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kFmT1/btr8MqwpSEU/wKfsqiqZDHTv4gigkeysnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kFmT1/btr8MqwpSEU/wKfsqiqZDHTv4gigkeysnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkFmT1%2Fbtr8MqwpSEU%2FwKfsqiqZDHTv4gigkeysnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;662&quot; height=&quot;154&quot; data-filename=&quot;en10.png&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;154&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;cls._value2member_map_이라는 딕셔너리에서 값을 얻어오는데요. 이를 통해, value를 키 값으로,&lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt; member를 value 값으로 하는 딕셔너리가 있어서, enum의 값이 매우 많아도 효율적으로 작동할 거라는 추측을 할 수 있습니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;이제, name으로 member를 부르고 싶습니다. 이 때에는 어떻게 하면 될까요?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;en11.png&quot; data-origin-width=&quot;283&quot; data-origin-height=&quot;217&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bc9gqm/btr8JqkaYk3/wtrCNiCQmNSNao9OLdOkek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bc9gqm/btr8JqkaYk3/wtrCNiCQmNSNao9OLdOkek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bc9gqm/btr8JqkaYk3/wtrCNiCQmNSNao9OLdOkek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbc9gqm%2Fbtr8JqkaYk3%2FwtrCNiCQmNSNao9OLdOkek%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;283&quot; height=&quot;217&quot; data-filename=&quot;en11.png&quot; data-origin-width=&quot;283&quot; data-origin-height=&quot;217&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt; enum 클래스가 E라고 한다면, E[&quot;name&quot;] 이렇게 부르면 됩니다.&lt;/u&gt;&lt;/span&gt; 위 예제는 Color[&quot;RED&quot;]로 member를 호출하였는데요. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;이러면, enum Color에서, 이름이 &quot;RED&quot;인 멤버를 부르게 됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;en12.png&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bP5okG/btr8NdqbgLo/akEe0obEgKxCFsWOSdpI9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bP5okG/btr8NdqbgLo/akEe0obEgKxCFsWOSdpI9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bP5okG/btr8NdqbgLo/akEe0obEgKxCFsWOSdpI9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbP5okG%2Fbtr8NdqbgLo%2FakEe0obEgKxCFsWOSdpI9k%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;468&quot; height=&quot;137&quot; data-filename=&quot;en12.png&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;내부적으로 __getitem__을 부르게 되고, _member_map_이라는 딕셔너리에서 값을 얻어오게 되므로, 이 역시 효율적인 연산이 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>코딩/파이선</category>
      <category>Enum</category>
      <category>python</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/871</guid>
      <comments>https://codingdog.tistory.com/entry/python-convert-value-to-enum%EA%B3%BC-name-to-enum%EC%9D%84-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry871comment</comments>
      <pubDate>Sat, 8 Apr 2023 23:47:31 +0900</pubDate>
    </item>
    <item>
      <title>java linkedhashmap removeeldestentry 메소드에 대해 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/java-linkedhashmap-removeeldestentry-%EB%A9%94%EC%86%8C%EB%93%9C%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;가희배 5회 코딩테스트가 4월 2일에 열렸습니다. 제가 플레 이상으로 예측한 문제도 있었지만, 골드 정도로 예측했는데 실제로 까 보니 플레였던 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;a style=&quot;color: #f89009;&quot; href=&quot;https://www.acmicpc.net/problem/27882&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;문제&lt;/a&gt;&lt;/span&gt;가 있었습니다. 그 문제에 이어서 또 당한 셈인데요. 이 문제가 어려웠던 이유는 2가지가 있습니다. 카카오 기출 문제를 3개나 섞었다. 그리고, 이 문제에 jpop 이랑 kpop이 상당히 많이 들어가면서 지문 자체가 어마어마하게 길었다. 이 2가지가 있겠습니다. 이것은 가희와 코드도 마찬가지입니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;후자는 사전 지식이 없으면 해석하는 데 시간이 구현시간보다 더 걸렸을거고 전자는 구현량이 생각보다 있었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;a style=&quot;color: #f89009;&quot; href=&quot;https://www.acmicpc.net/problem/27882&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;문제&lt;/a&gt;&lt;/span&gt;에서 요구하는 것은 2가지입니다. lru, 가장 가까운 cache 찾기, 엄청나게 긴 지문과 이상하게 jpop과 kpop이 들어간 예제 해석. 이 중 lru 부분은 클래스로 따로 빼서 구현해야 겠다는 생각은 하셨을 겁니다. 그리고 Java의 Collection에는 LinkedHashMap이 있습니다. &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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;re5.png&quot; data-origin-width=&quot;358&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ds9qPG/btr7Tla6jZ7/YOkjhVIAxLTBUFIRsI8Ku0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ds9qPG/btr7Tla6jZ7/YOkjhVIAxLTBUFIRsI8Ku0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ds9qPG/btr7Tla6jZ7/YOkjhVIAxLTBUFIRsI8Ku0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fds9qPG%2Fbtr7Tla6jZ7%2FYOkjhVIAxLTBUFIRsI8Ku0%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;358&quot; height=&quot;335&quot; data-filename=&quot;re5.png&quot; data-origin-width=&quot;358&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;여기서, accessOrder의 설명을 봅시다. ordering mode를 의미한다고 되어 있어요. 만약에 이 값이 true면 AfterNodeAccess, 즉 접근하고 난 후 노드 처리를 하는 메서드와, AfterNodeInsertion, 노드를 추가하고 난 후의 처리를 하는 메서드를 호출하게 됩니다. 이 클래스의 공식 문서를 뒤져가면서 찾아보면 removeEldestEntry 메서드가 있어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;오늘은 이것을 볼 거에요.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;re1.png&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rc6IH/btr7PjyoJXh/Jup315SKaBZpPEFGtgztEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rc6IH/btr7PjyoJXh/Jup315SKaBZpPEFGtgztEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rc6IH/btr7PjyoJXh/Jup315SKaBZpPEFGtgztEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frc6IH%2Fbtr7PjyoJXh%2FJup315SKaBZpPEFGtgztEK%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;592&quot; height=&quot;146&quot; data-filename=&quot;re1.png&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt; 요렇게 씁니다. LinkedHashMap을 생성할 때, accessOrder를 true로 주었습니다. capacity는 용량을 의미해요. 84번째 줄부터 86번째 줄까지를 보면 return size() &amp;gt; capacity; 를 볼 수 있는데요. 이건 또 무엇인가? &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;일단 size가 capacity보다 크면 true를 리턴합니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이 메서드가 true를 리턴하는가, false를 리턴하는가에 따라서 무언가에 쓰이게 될 겁니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;re2.png&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;153&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yNdoF/btr7R23WuHW/dNtP9AmNjHw90F7B4NX7V0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yNdoF/btr7R23WuHW/dNtP9AmNjHw90F7B4NX7V0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yNdoF/btr7R23WuHW/dNtP9AmNjHw90F7B4NX7V0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyNdoF%2Fbtr7R23WuHW%2FdNtP9AmNjHw90F7B4NX7V0%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;745&quot; height=&quot;153&quot; data-filename=&quot;re2.png&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;153&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;AfterNodeInsertion을 봅시다. 그러면 evict이고 first가 NULL이 아니면서, removeEldestEntry(first)가 나옵니다. 이 3개의 조건이 참이면, 처음 원소를 remove 하게 됩니다. 그런데 저는 removeEldestEntry 메서드를 size() &amp;gt; capacity인지를 검사했단 말입니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;re6.png&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGhbZA/btr7QmuPDly/sIDE869A3ZdmIlL02jgdHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGhbZA/btr7QmuPDly/sIDE869A3ZdmIlL02jgdHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGhbZA/btr7QmuPDly/sIDE869A3ZdmIlL02jgdHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGhbZA%2Fbtr7QmuPDly%2FsIDE869A3ZdmIlL02jgdHk%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;392&quot; height=&quot;376&quot; data-filename=&quot;re6.png&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이 메서드의 결과가 참이라면 가장 앞에 있는 원소를 제거해 버립니다. 그렇지 않으면 제거되지 않습니다. 여기서 정리할 수 있는 것은 2가지입니다. 아. Link로 연결된 것에서 head를 제거하는구나. 그러면 tail은 늦게 제거되겠구나.&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt; 그리고 특정 조건을 만족하면 꽉 찼으니, 제일 오래된 것을 제거하는 로직을 태우는데요.&lt;/u&gt;&lt;/span&gt; &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;그 기준을 정해주는 것이 removeEldestEntry가 되겠습니다.&lt;/b&gt;&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;하나 질문. 추가될 때에는 뒤에 tail에 추가되긴 할 텐데요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;tail에 추가되는 부분은 afterNodeInsertion에서 수행되지는 않습니다. 그러면 언제 수행되는가? &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;putVal에서 newNode를 호출하는 시점에서 수행됩니다.&amp;nbsp;&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;re7.png&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;131&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chcxTR/btr7PqRDttN/FEE4AZF4a8KXQ2jMwDXHgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chcxTR/btr7PqRDttN/FEE4AZF4a8KXQ2jMwDXHgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chcxTR/btr7PqRDttN/FEE4AZF4a8KXQ2jMwDXHgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchcxTR%2Fbtr7PqRDttN%2FFEE4AZF4a8KXQ2jMwDXHgk%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;401&quot; height=&quot;131&quot; data-filename=&quot;re7.png&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;131&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;putVal 메소드를 잘 보면 newNode를 생성하는 부분이 있습니다. 이 부분을 디버그 하면서 따라들어가다 보면, LinkHashMap의 linkNodeLast 메서드를 부르고 있음을 알 수 있습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;re8.png&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m792F/btr7OOZuR0X/aVwnoNPzOJR49n4imWm07K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m792F/btr7OOZuR0X/aVwnoNPzOJR49n4imWm07K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m792F/btr7OOZuR0X/aVwnoNPzOJR49n4imWm07K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm792F%2Fbtr7OOZuR0X%2FaVwnoNPzOJR49n4imWm07K%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;562&quot; height=&quot;246&quot; data-filename=&quot;re8.png&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;로직을 보면, 그냥 맨 끝에 추가함을 알 수 있습니다. 그냥 tail에 새로 추가한 것을 넣어주고, 기존의 last와 p를 연결합니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;re9.png&quot; data-origin-width=&quot;213&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cj9SSA/btr7Qngd4TK/kkX6iNG3r03dcyFpIRKZmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cj9SSA/btr7Qngd4TK/kkX6iNG3r03dcyFpIRKZmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cj9SSA/btr7Qngd4TK/kkX6iNG3r03dcyFpIRKZmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcj9SSA%2Fbtr7Qngd4TK%2FkkX6iNG3r03dcyFpIRKZmK%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;213&quot; height=&quot;159&quot; data-filename=&quot;re9.png&quot; data-origin-width=&quot;213&quot; data-origin-height=&quot;159&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;노란색이 새로 추가된 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;re3.png&quot; data-origin-width=&quot;664&quot; data-origin-height=&quot;111&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vRX6a/btr7HfRbS8w/NesLG79pp0DkKTF2HtZiHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vRX6a/btr7HfRbS8w/NesLG79pp0DkKTF2HtZiHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vRX6a/btr7HfRbS8w/NesLG79pp0DkKTF2HtZiHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvRX6a%2Fbtr7HfRbS8w%2FNesLG79pp0DkKTF2HtZiHk%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;664&quot; height=&quot;111&quot; data-filename=&quot;re3.png&quot; data-origin-width=&quot;664&quot; data-origin-height=&quot;111&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;그러면 접근을 한 것에 대해서는 어떻게 처리될까요? 당연하게도, 노드에 접근해서 맨 뒤로 밀어버릴 겁니다. e가 어디로 밀어지는지 보면 되겠는데요. 310번 줄에서 p = e, 가 있으므로, p가 어디로 가는지 보면 되겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;re4.png&quot; data-origin-width=&quot;366&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMwMoY/btr7OyiwgRg/d7NKn9Ij8RMtB6EYmD3mF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMwMoY/btr7OyiwgRg/d7NKn9Ij8RMtB6EYmD3mF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMwMoY/btr7OyiwgRg/d7NKn9Ij8RMtB6EYmD3mF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMwMoY%2Fbtr7OyiwgRg%2Fd7NKn9Ij8RMtB6EYmD3mF0%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;366&quot; height=&quot;416&quot; data-filename=&quot;re4.png&quot; data-origin-width=&quot;366&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;이것 저것 뚝딱한 다음에 tail = p가 되어 있습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;re10.png&quot; data-origin-width=&quot;329&quot; data-origin-height=&quot;161&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uDGVY/btr7R23W6xg/E4qKiznnh1xBzRpp7lDzWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uDGVY/btr7R23W6xg/E4qKiznnh1xBzRpp7lDzWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uDGVY/btr7R23W6xg/E4qKiznnh1xBzRpp7lDzWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuDGVY%2Fbtr7R23W6xg%2FE4qKiznnh1xBzRpp7lDzWK%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;329&quot; height=&quot;161&quot; data-filename=&quot;re10.png&quot; data-origin-width=&quot;329&quot; data-origin-height=&quot;161&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;a, b, c로 연결된 상태에서 b에 접근했습니다. 그러면 어떻게 동작할까요? b를 제거합니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;re11.png&quot; data-origin-width=&quot;330&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blOQsc/btr7TloD5Kw/FuBmKZEp5UE3LX2HUHvGQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blOQsc/btr7TloD5Kw/FuBmKZEp5UE3LX2HUHvGQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blOQsc/btr7TloD5Kw/FuBmKZEp5UE3LX2HUHvGQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblOQsc%2Fbtr7TloD5Kw%2FFuBmKZEp5UE3LX2HUHvGQ1%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;330&quot; height=&quot;166&quot; data-filename=&quot;re11.png&quot; data-origin-width=&quot;330&quot; data-origin-height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp; 다음에 어떻게 해야 할까요? b를 tail에 추가하면 되겠네요.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;re12.png&quot; data-origin-width=&quot;448&quot; data-origin-height=&quot;169&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chMKuk/btr7Hh9jcfA/CdkQOZUCahP8M5QW8QGRnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chMKuk/btr7Hh9jcfA/CdkQOZUCahP8M5QW8QGRnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chMKuk/btr7Hh9jcfA/CdkQOZUCahP8M5QW8QGRnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchMKuk%2Fbtr7Hh9jcfA%2FCdkQOZUCahP8M5QW8QGRnK%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;448&quot; height=&quot;169&quot; data-filename=&quot;re12.png&quot; data-origin-width=&quot;448&quot; data-origin-height=&quot;169&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;이 과정을 수행하면 b가 맨 뒤로 가게 됩니다. 그림에서는 단일 링크드로 표현하였지만, 실제로는 before와 after가 있는 이중 링크드 리스트로 구현되어 있습니다. 결국, afterNodeXXX 메서드로 특정한 일을 수행한 후에 추가적으로 해야 할 일을 호출하게 됩니다. 추가를 할 때 용량이 꽉 찬 경우에 삭제하는 로직이 필요하고, 순서를 유지하는 것이 필요합니다. LinkedHashMap은 들어온 순서를 저장하고 있어요. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;그리고 용량이 꽉 찬 경우에 삭제하기 위해서 removeEldestEntry를 구현했습니다. &lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이 둘을 잘 버무리면 복잡한 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;a style=&quot;color: #f89009;&quot; href=&quot;https://www.acmicpc.net/problem/27882&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;문제&lt;/a&gt;&lt;/span&gt;를 보다 단순화 시킬 수 있습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>자료알고/자료구조</category>
      <category>Java</category>
      <category>LinkedHashMap</category>
      <category>removeeldestentry</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/870</guid>
      <comments>https://codingdog.tistory.com/entry/java-linkedhashmap-removeeldestentry-%EB%A9%94%EC%86%8C%EB%93%9C%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry870comment</comments>
      <pubDate>Tue, 4 Apr 2023 02:16:05 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 f string에서 bracket을 escape 하는 방법을 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-f-string%EC%97%90%EC%84%9C-bracket%EC%9D%84-escape-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;파이썬에 f string이 있습니다. 이 중 {는 replacement field라고 해서 특수한 문자로 취급합니다. 이것을 일반 문자처럼 취급하려면 어떻게 해야하는지 간단하게 알아보고 실습도 해 보겠습니다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fb1.png&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;70&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rWVvw/btr7eWEhbLc/HpSworNkFcSvOSxwuatwxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rWVvw/btr7eWEhbLc/HpSworNkFcSvOSxwuatwxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rWVvw/btr7eWEhbLc/HpSworNkFcSvOSxwuatwxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrWVvw%2Fbtr7eWEhbLc%2FHpSworNkFcSvOSxwuatwxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;381&quot; height=&quot;70&quot; data-filename=&quot;fb1.png&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;70&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt; 먼저 f string이 아닌 문자열입니다. 앞에 f가 붙지 않았어요. 그러면 {과 } 등은 일반 문자로 취급됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fb2.png&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKRiwO/btr7fmW1hTI/5gOW74EuIQBZ1pjsTDvOEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKRiwO/btr7fmW1hTI/5gOW74EuIQBZ1pjsTDvOEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKRiwO/btr7fmW1hTI/5gOW74EuIQBZ1pjsTDvOEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKRiwO%2Fbtr7fmW1hTI%2F5gOW74EuIQBZ1pjsTDvOEK%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;413&quot; height=&quot;68&quot; data-filename=&quot;fb2.png&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;a{b}cde가 출력됨을 알 수 있어요.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fb3.png&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;65&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dMFxeb/btr7hUrDQqJ/dNzHSuuE9dmdvEfTubolU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dMFxeb/btr7hUrDQqJ/dNzHSuuE9dmdvEfTubolU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dMFxeb/btr7hUrDQqJ/dNzHSuuE9dmdvEfTubolU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdMFxeb%2Fbtr7hUrDQqJ%2FdNzHSuuE9dmdvEfTubolU0%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;437&quot; height=&quot;65&quot; data-filename=&quot;fb3.png&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;65&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;그런데, 앞에 f가 붙었어요. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;그 안에 {와 }가 있는데요. 이렇게 되면 replace가 되어 버려요.&lt;/u&gt;&lt;/span&gt; f&quot;a{b}cde&quot;는, {b} 대신에 b의 값이 들어가 버립니다. 그래서, 이 프로그램의 실제 결과는 a3cde가 출력되게 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fb4.png&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;67&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K4OxD/btr7fnBDS0L/yvMc3DKiQbzAICfkt20Ct0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K4OxD/btr7fnBDS0L/yvMc3DKiQbzAICfkt20Ct0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K4OxD/btr7fnBDS0L/yvMc3DKiQbzAICfkt20Ct0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK4OxD%2Fbtr7fnBDS0L%2FyvMc3DKiQbzAICfkt20Ct0%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;382&quot; height=&quot;67&quot; data-filename=&quot;fb4.png&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;67&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;실행 결과는 위와 같습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fb5.png&quot; data-origin-width=&quot;363&quot; data-origin-height=&quot;44&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEdsF2/btr7gSANIDM/L29cPQIGOQk4m3ANiVqoh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEdsF2/btr7gSANIDM/L29cPQIGOQk4m3ANiVqoh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEdsF2/btr7gSANIDM/L29cPQIGOQk4m3ANiVqoh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEdsF2%2Fbtr7gSANIDM%2FL29cPQIGOQk4m3ANiVqoh0%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;363&quot; height=&quot;44&quot; data-filename=&quot;fb5.png&quot; data-origin-width=&quot;363&quot; data-origin-height=&quot;44&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;그러면 f string에서 {와 }를 일반 문자처럼 취급하려면 어떻게 해야 할까요? 즉, escape를 하고 싶습니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;그럴려면 {의 경우 앞에 {를, }의 경우 앞에 }를 붙이면 됩니다&lt;/b&gt;&lt;/span&gt;. 즉 f-string에서 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;{{는 일반 문자 {를, }}는 일반 문자 }를 의미합니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fb6.png&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;67&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/squOH/btr7dMu95Q9/lgQnqcVslaI1jvJB54U1p0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/squOH/btr7dMu95Q9/lgQnqcVslaI1jvJB54U1p0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/squOH/btr7dMu95Q9/lgQnqcVslaI1jvJB54U1p0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsquOH%2Fbtr7dMu95Q9%2FlgQnqcVslaI1jvJB54U1p0%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;445&quot; height=&quot;67&quot; data-filename=&quot;fb6.png&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;67&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;실행 결과는 위와 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fb7.png&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yA8Q5/btr7hTsIlcn/aIlc1EGTLfcWshdX5eOyUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yA8Q5/btr7hTsIlcn/aIlc1EGTLfcWshdX5eOyUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yA8Q5/btr7hTsIlcn/aIlc1EGTLfcWshdX5eOyUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyA8Q5%2Fbtr7hTsIlcn%2FaIlc1EGTLfcWshdX5eOyUK%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;488&quot; height=&quot;87&quot; data-filename=&quot;fb7.png&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;87&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt;&amp;nbsp;이런 경우에는 어떻게 해야 할까요? 일일히 { 앞에 {를 붙여주고, } 앞에 }를 붙여야 할까요? replacement 필드가 없다면 그냥 &quot; 앞에 있는 {를 빼도 됩니다만, 그렇지 않다면 상당히 까다로울 수 있습니다. pycharm에서는 {를 {{로, }를 }}로 바꿀 문자열 전체를 선택하고 ctrl+R을 누르면 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fb8.png&quot; data-origin-width=&quot;415&quot; data-origin-height=&quot;76&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMvzRs/btr7hSggFnE/T7Zxp4Al61QBkHYf0Vkmt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMvzRs/btr7hSggFnE/T7Zxp4Al61QBkHYf0Vkmt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMvzRs/btr7hSggFnE/T7Zxp4Al61QBkHYf0Vkmt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMvzRs%2Fbtr7hSggFnE%2FT7Zxp4Al61QBkHYf0Vkmt0%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;415&quot; height=&quot;76&quot; data-filename=&quot;fb8.png&quot; data-origin-width=&quot;415&quot; data-origin-height=&quot;76&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;이제, ctrl+R을 다시 누르겠습니다. 그러면, 내가 선택한 영역에 대해서만 찾게 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fb9.png&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EEeHp/btr7hQQhDiP/CfJThouLZK3yXSHZXczL71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EEeHp/btr7hQQhDiP/CfJThouLZK3yXSHZXczL71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EEeHp/btr7hQQhDiP/CfJThouLZK3yXSHZXczL71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEEeHp%2Fbtr7hQQhDiP%2FCfJThouLZK3yXSHZXczL71%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;707&quot; height=&quot;148&quot; data-filename=&quot;fb9.png&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;148&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;{를 찾아서 {{로 바꿔 볼까요? Replacement에 요래 입력하고, Replace All을 누르겠습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fb10.png&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;143&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vlEPq/btr7dXwWvJk/re8HCVbWPvpiYW9u7rKYjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vlEPq/btr7dXwWvJk/re8HCVbWPvpiYW9u7rKYjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vlEPq/btr7dXwWvJk/re8HCVbWPvpiYW9u7rKYjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvlEPq%2Fbtr7dXwWvJk%2Fre8HCVbWPvpiYW9u7rKYjK%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;706&quot; height=&quot;143&quot; data-filename=&quot;fb10.png&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;143&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;다음에 }를 찾아서 }}로 바꿉니다. 역시 Replace All을 눌러주면 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fb11.png&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l9MuH/btr7gkxABTz/9TsfzNdPgltPyLfnZKpmeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l9MuH/btr7gkxABTz/9TsfzNdPgltPyLfnZKpmeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l9MuH/btr7gkxABTz/9TsfzNdPgltPyLfnZKpmeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl9MuH%2Fbtr7gkxABTz%2F9TsfzNdPgltPyLfnZKpmeK%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;695&quot; height=&quot;87&quot; data-filename=&quot;fb11.png&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;87&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;실행 결과는 위와 같습니다. 이제 s1과 s2를 출력해 보겠습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fb12.png&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;89&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q2zEc/btr7dtilGiY/WoHeVl5vSlfxoxbVAblWKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q2zEc/btr7dtilGiY/WoHeVl5vSlfxoxbVAblWKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q2zEc/btr7dtilGiY/WoHeVl5vSlfxoxbVAblWKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq2zEc%2Fbtr7dtilGiY%2FWoHeVl5vSlfxoxbVAblWKK%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;460&quot; height=&quot;89&quot; data-filename=&quot;fb12.png&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;89&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333;&quot;&gt; 두 문자열이 서로 같음을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>코딩/파이선</category>
      <category>Bracket</category>
      <category>escape</category>
      <category>f-string</category>
      <category>파이썬</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/869</guid>
      <comments>https://codingdog.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-f-string%EC%97%90%EC%84%9C-bracket%EC%9D%84-escape-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry869comment</comments>
      <pubDate>Fri, 31 Mar 2023 23:55:15 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 max min 사용법과 default key 인자를 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-max-min-%EC%82%AC%EC%9A%A9%EB%B2%95%EA%B3%BC-default-key-%EC%9D%B8%EC%9E%90%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;안녕하세요. 이번시간에는 파이썬 min, max에 대해 알아보겠습니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;이것은 각 원소간에 &amp;lt;가 지원되면 가능&lt;/u&gt;&lt;/span&gt;합니다. 저는 보통 리스트에 있는 수들을 가지고 max, min값을 뽑을 때 상당히 많이 쓰곤 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pm1.png&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZFvug/btr6PzPrXMO/7FnQWVktgabfnZeW8XNpNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZFvug/btr6PzPrXMO/7FnQWVktgabfnZeW8XNpNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZFvug/btr6PzPrXMO/7FnQWVktgabfnZeW8XNpNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZFvug%2Fbtr6PzPrXMO%2F7FnQWVktgabfnZeW8XNpNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;406&quot; height=&quot;66&quot; data-filename=&quot;pm1.png&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;66&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;기본적으로 max와 min은 빈 sequence에서는 동작하지 않습니다. 이 프로그램을 실행시켜 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pm2.png&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTTSw8/btr6RBsmYa4/YL3x0uc1r0gflN6QEVG5Q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTTSw8/btr6RBsmYa4/YL3x0uc1r0gflN6QEVG5Q1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTTSw8/btr6RBsmYa4/YL3x0uc1r0gflN6QEVG5Q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTTSw8%2Fbtr6RBsmYa4%2FYL3x0uc1r0gflN6QEVG5Q1%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;605&quot; height=&quot;113&quot; data-filename=&quot;pm2.png&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;113&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;빈 리스트를 min의 인자로 넘겨주었습니다. 어떠한 값도 없으니 min이나 max를 적용하는 것은 불가능해 보입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pm3.png&quot; data-origin-width=&quot;327&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D8o68/btr6K2Zz2Sg/AtfpmEKZKVzWsP2E9vC2Nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D8o68/btr6K2Zz2Sg/AtfpmEKZKVzWsP2E9vC2Nk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D8o68/btr6K2Zz2Sg/AtfpmEKZKVzWsP2E9vC2Nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD8o68%2Fbtr6K2Zz2Sg%2FAtfpmEKZKVzWsP2E9vC2Nk%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;327&quot; height=&quot;64&quot; data-filename=&quot;pm3.png&quot; data-origin-width=&quot;327&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;default는 이런 상황에서 유용하게 쓰일 수 있습니다. 똑같이 빈 리스트인 상황입니다. default값을 -1로 두었습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pm4.png&quot; data-origin-width=&quot;353&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cE6wwD/btr6K2FgIKL/rLAFs8NXYhj3jxcbwACAX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cE6wwD/btr6K2FgIKL/rLAFs8NXYhj3jxcbwACAX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cE6wwD/btr6K2FgIKL/rLAFs8NXYhj3jxcbwACAX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcE6wwD%2Fbtr6K2FgIKL%2FrLAFs8NXYhj3jxcbwACAX1%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;353&quot; height=&quot;68&quot; data-filename=&quot;pm4.png&quot; data-origin-width=&quot;353&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이 경우, 예외가 떨어지는 것이 아니라 -1이 출력됩니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;즉, sequence에 값이 없을 때 디폴트 값 k을 설정해 주면 빈 리스트를 넘겨주었을 때, k가 떨어지게 됩니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pm5.png&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tZwmU/btr6NksfqHg/Mno4IZXHSD7oCTjLGVLcAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tZwmU/btr6NksfqHg/Mno4IZXHSD7oCTjLGVLcAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tZwmU/btr6NksfqHg/Mno4IZXHSD7oCTjLGVLcAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtZwmU%2Fbtr6NksfqHg%2FMno4IZXHSD7oCTjLGVLcAk%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;336&quot; height=&quot;108&quot; data-filename=&quot;pm5.png&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;max는 list와 같은 sequence에서 가장 큰 값을 찾게 됩니다. 위 코드를 볼까요? 2, -1, 7이 들어 있는 리스트가 있어요. 최소값은 -1이고, 최댓값은 7이에요. 그러면 결과는 1번째 줄에 -1, 2번째 줄에는 7이 나올 겁니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pm6.png&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFH9wX/btr6N43Fg7T/maP5Jw63mSpM8DlBPvj4pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFH9wX/btr6N43Fg7T/maP5Jw63mSpM8DlBPvj4pk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFH9wX/btr6N43Fg7T/maP5Jw63mSpM8DlBPvj4pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFH9wX%2Fbtr6N43Fg7T%2FmaP5Jw63mSpM8DlBPvj4pk%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;385&quot; height=&quot;87&quot; data-filename=&quot;pm6.png&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;87&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;여기까지는 그러려니 하고 넘어갈 수 있습니다. 그런데 조금 더 특이한 일을 하고 싶습니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;바로 변환된 결과가 최소, 혹은 최대가 되는 x 값을 리턴하고 싶습니다. 이 때 key를 쓰면 됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pm7.png&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9joOy/btr6QSVotRH/8L2jZOFKdDAHYaG0U5oVrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9joOy/btr6QSVotRH/8L2jZOFKdDAHYaG0U5oVrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9joOy/btr6QSVotRH/8L2jZOFKdDAHYaG0U5oVrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9joOy%2Fbtr6QSVotRH%2F8L2jZOFKdDAHYaG0U5oVrK%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;332&quot; height=&quot;64&quot; data-filename=&quot;pm7.png&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;key는 무엇일까요? key=lambda k: -k가 있는데요. 이를 편의상 함수라고 하겠습니다. 쉽게 말해, x에 대응되는 f(x)라고 해 볼게요. key로 함수 f를 주면, f(x)가 최소가 되는 x 값을 구해줍니다. 위 예제에서는요. lambda k: -k이기 때문에, f(x) = -x가 됩니다. x가 2, -1, 7인 경우에, f(x)의 값은 -2, 1, -7이 됩니다. f(x)의 최소값은 -7이 됩니다. 그럴려면 x가 7이 되어야 겠네요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;즉, 2, -1, 7이 있다면, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;f(x)를 최소가 되게 하는 것은 7이 되기 때문에 7이 리턴&lt;/u&gt;&lt;/span&gt;됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pm8.png&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TTqC0/btr6NZH3k2W/sti5H009sloVKYotNbLuCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TTqC0/btr6NZH3k2W/sti5H009sloVKYotNbLuCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TTqC0/btr6NZH3k2W/sti5H009sloVKYotNbLuCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTTqC0%2Fbtr6NZH3k2W%2Fsti5H009sloVKYotNbLuCK%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;416&quot; height=&quot;66&quot; data-filename=&quot;pm8.png&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;66&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;결과는 7이 나옵니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pm9.png&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;63&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cetXY0/btr6TlQmDUO/UAqaKqF65D40Lvcu0hhKKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cetXY0/btr6TlQmDUO/UAqaKqF65D40Lvcu0hhKKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cetXY0/btr6TlQmDUO/UAqaKqF65D40Lvcu0hhKKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcetXY0%2Fbtr6TlQmDUO%2FUAqaKqF65D40Lvcu0hhKKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;406&quot; height=&quot;63&quot; data-filename=&quot;pm9.png&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;63&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이번에는 리스트에 있는 수들 중 절댓값이 최소인 것을 구하고 싶습니다. 이건 또 어떻게 하면 될까요? 복잡하게 생각하지 않아도 됩니다. 그냥, lambda y: abs(y)를 넘겨주면 됩니다. 그러면 x를 넘겨주었을 때, f(x) = abs(x)가 됩니다. -2, 1, 7 중 절댓값이 최소인 것은 1이므로, 1이 리턴됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pm10.png&quot; data-origin-width=&quot;374&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/trOfk/btr6N768D3u/5ZWDGM9s3eU9nxDpFfuLSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/trOfk/btr6N768D3u/5ZWDGM9s3eU9nxDpFfuLSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/trOfk/btr6N768D3u/5ZWDGM9s3eU9nxDpFfuLSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtrOfk%2Fbtr6N768D3u%2F5ZWDGM9s3eU9nxDpFfuLSk%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;374&quot; height=&quot;64&quot; data-filename=&quot;pm10.png&quot; data-origin-width=&quot;374&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;정말 그렇게 나오는군요&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pm11.png&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFOaXj/btr6QTGKGk0/sOmKtYyUNeKdj9KtM7NqPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFOaXj/btr6QTGKGk0/sOmKtYyUNeKdj9KtM7NqPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFOaXj/btr6QTGKGk0/sOmKtYyUNeKdj9KtM7NqPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFOaXj%2Fbtr6QTGKGk0%2FsOmKtYyUNeKdj9KtM7NqPk%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;417&quot; height=&quot;64&quot; data-filename=&quot;pm11.png&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이건 어떨까요? 각 아이템들이 list입니다. lambda y: sum(y)입니다. 인풋은 list이네요? output은 sum(list)입니다. 리스트를 받으면, 함수 f는 리스트에 있는 수들의 합을 리턴해요. [-2, 0, 3]의 합은 1, [-1, 19]는 18, [3, 7]은 10, []은 0이니까 합이 가장 큰 [-1, 19]가 리턴되겠네요?&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pm12.png&quot; data-origin-width=&quot;359&quot; data-origin-height=&quot;69&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pFd2g/btr6NvAqk6X/oSPqpENH4iykkFZUSXyzO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pFd2g/btr6NvAqk6X/oSPqpENH4iykkFZUSXyzO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pFd2g/btr6NvAqk6X/oSPqpENH4iykkFZUSXyzO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpFd2g%2Fbtr6NvAqk6X%2FoSPqpENH4iykkFZUSXyzO1%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;359&quot; height=&quot;69&quot; data-filename=&quot;pm12.png&quot; data-origin-width=&quot;359&quot; data-origin-height=&quot;69&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;실행 결과는 위와 같습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>코딩/파이선</category>
      <category>default</category>
      <category>Key</category>
      <category>Max</category>
      <category>Min</category>
      <category>파이썬</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/868</guid>
      <comments>https://codingdog.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-max-min-%EC%82%AC%EC%9A%A9%EB%B2%95%EA%B3%BC-default-key-%EC%9D%B8%EC%9E%90%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry868comment</comments>
      <pubDate>Thu, 30 Mar 2023 07:30:42 +0900</pubDate>
    </item>
    <item>
      <title>pytest coverage omit 옵션으로 report에 특정 파일의 결과를 제외해 봅시다.</title>
      <link>https://codingdog.tistory.com/entry/pytest-coverage-omit-%EC%98%B5%EC%85%98%EC%9C%BC%EB%A1%9C-report%EC%97%90-%ED%8A%B9%EC%A0%95-%ED%8C%8C%EC%9D%BC%EC%9D%98-%EA%B2%B0%EA%B3%BC%EB%A5%BC-%EC%A0%9C%EC%99%B8%ED%95%B4-%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;pytest와 pytest-cov를 저는 같이 쓰는 편입니다. report를 할 때 굳이 coverage 측정이 필요 없는 것이 있을 텐데요. 이들을 제외하는 방법을 알아보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;om10.png&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEj3NS/btr6srp1RO1/jV4aKYjqmA6Uu1rN1Cli50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEj3NS/btr6srp1RO1/jV4aKYjqmA6Uu1rN1Cli50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEj3NS/btr6srp1RO1/jV4aKYjqmA6Uu1rN1Cli50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEj3NS%2Fbtr6srp1RO1%2FjV4aKYjqmA6Uu1rN1Cli50%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;510&quot; height=&quot;267&quot; data-filename=&quot;om10.png&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;pytest는 7.2.2, coverage는 7.2.2, pytest-cov는 4.0.0 버전에서 실습하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;om1.png&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YTxXF/btr6oIzsFO1/5977EBTvUkpIYJcMOKdJfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YTxXF/btr6oIzsFO1/5977EBTvUkpIYJcMOKdJfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YTxXF/btr6oIzsFO1/5977EBTvUkpIYJcMOKdJfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYTxXF%2Fbtr6oIzsFO1%2F5977EBTvUkpIYJcMOKdJfk%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;462&quot; height=&quot;243&quot; data-filename=&quot;om1.png&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;243&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저, 프로젝트 request_ex의 구조입니다. pg1 패키지에 a.py가 있고, pg2 패키지에 b.py가 있습니다.&amp;nbsp; 다음에 root에 main.py가 있고, .coveragerc가 있는데요. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;이 .coveragerc는 coverage 관련 설정을 적어놓습니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;om2.png&quot; data-origin-width=&quot;353&quot; data-origin-height=&quot;181&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUiLCu/btr6lqfbfFm/0PfksNlKGSvsWsJINeTXbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUiLCu/btr6lqfbfFm/0PfksNlKGSvsWsJINeTXbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUiLCu/btr6lqfbfFm/0PfksNlKGSvsWsJINeTXbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUiLCu%2Fbtr6lqfbfFm%2F0PfksNlKGSvsWsJINeTXbK%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;353&quot; height=&quot;181&quot; data-filename=&quot;om2.png&quot; data-origin-width=&quot;353&quot; data-origin-height=&quot;181&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;main.py입니다. pg1.a로부터 feature_a를 import하고, pg2.b로부터 feature_b를 import 했네요. test_a에는, feature_a(1)과, feature_b(3)을 호출합니다. 다음에 pyest main.py --cov를 입력해 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;om3.png&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdCuEk/btr6pGabbS2/mD9WTCv6AkI2xfwj9deKZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdCuEk/btr6pGabbS2/mD9WTCv6AkI2xfwj9deKZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdCuEk/btr6pGabbS2/mD9WTCv6AkI2xfwj9deKZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdCuEk%2Fbtr6pGabbS2%2FmD9WTCv6AkI2xfwj9deKZK%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;597&quot; height=&quot;267&quot; data-filename=&quot;om3.png&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그랬더니, main.py, pg1/__init__.py, pg1/a.py, pg2/__init__.py, pg2/b.py의 커버리지가 출력됩니다. 토탈 coverage는 85%라고 출력되는군요. 어디서 cover를 깍아먹었는지 html 형식으로 report 해 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;om4.png&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E7506/btr6pG2jX1s/lefBg9uSBfu5piXkDct1EK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E7506/btr6pG2jX1s/lefBg9uSBfu5piXkDct1EK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E7506/btr6pG2jX1s/lefBg9uSBfu5piXkDct1EK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE7506%2Fbtr6pG2jX1s%2FlefBg9uSBfu5piXkDct1EK%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;739&quot; height=&quot;137&quot; data-filename=&quot;om4.png&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;프로젝트의 root 폴더에서 python main.py --cov --cov-report=html을 입력해 보겠습니다. 그러면, htmlcov라는 폴더가 하나 새로 생길 겁니다. index.html로 들어가 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;om5.png&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w7yzc/btr53IOw3O0/UFcCg1YUyN5UEAGueHleek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w7yzc/btr53IOw3O0/UFcCg1YUyN5UEAGueHleek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w7yzc/btr53IOw3O0/UFcCg1YUyN5UEAGueHleek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw7yzc%2Fbtr53IOw3O0%2FUFcCg1YUyN5UEAGueHleek%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;499&quot; height=&quot;255&quot; data-filename=&quot;om5.png&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;255&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;표 형식으로 Statements, missing, excluded가 나오는 것을 볼 수 있어요. Module에 있는 pg1/a.py를 클릭해서 들어가 봅시다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;om6.png&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L5BlT/btr6g86QdhW/hn9zZQRWTpzk0kkheiiGp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L5BlT/btr6g86QdhW/hn9zZQRWTpzk0kkheiiGp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L5BlT/btr6g86QdhW/hn9zZQRWTpzk0kkheiiGp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL5BlT%2Fbtr6g86QdhW%2Fhn9zZQRWTpzk0kkheiiGp0%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;569&quot; height=&quot;215&quot; data-filename=&quot;om6.png&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;215&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 missing이 보이는데요. feature_a(1)을 호출하였습니다. x &amp;gt; 1인 경우를 호출하지 않았기 때문에, 5번째 줄이 전혀 실행이 안 됩니다. 따라서, 1 missing이 뜨게 됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;om7.png&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;213&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAsqkZ/btr6qPEHpfR/1vcK33VKV7LoIuqULFJKQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAsqkZ/btr6qPEHpfR/1vcK33VKV7LoIuqULFJKQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAsqkZ/btr6qPEHpfR/1vcK33VKV7LoIuqULFJKQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAsqkZ%2Fbtr6qPEHpfR%2F1vcK33VKV7LoIuqULFJKQ1%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;490&quot; height=&quot;213&quot; data-filename=&quot;om7.png&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;213&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;feature_b는 어떨까요? x가 3인 경우만 호출했기 때문에, x &amp;lt;= 1 조건에 걸리는 문장이 수행되지 않습니다. 1 missing입니다. 간단하게 요래 보시면 되겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;om8.png&quot; data-origin-width=&quot;435&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dS1CH3/btr6lqfbfFx/SgppPxZs3DqYu4NCCEso31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dS1CH3/btr6lqfbfFx/SgppPxZs3DqYu4NCCEso31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dS1CH3/btr6lqfbfFx/SgppPxZs3DqYu4NCCEso31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdS1CH3%2Fbtr6lqfbfFx%2FSgppPxZs3DqYu4NCCEso31%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;435&quot; height=&quot;139&quot; data-filename=&quot;om8.png&quot; data-origin-width=&quot;435&quot; data-origin-height=&quot;139&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;우리는 .coveragerc에서 [run]에 omit 옵션을 줄 수 있습니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;잠깐. 여기서 omit은 제외하다&lt;/b&gt;&lt;/span&gt;라는 뜻이 있어요. 3번째 줄부터 5번째 줄까지 앞에 space 4개를 붙였습니다. 이 리스트들이 있는데요. pg1/**, main.py, *__init__.py가 있네요. 이 패턴들은 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;a style=&quot;color: #f89009;&quot; href=&quot;https://coverage.readthedocs.io/en/stable/source.html#file-patterns&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;문서&lt;/a&gt;&lt;/span&gt;에 자세히 설명이 되어 있습니다만, 요약해서 설명드리겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저 **는 몇 개의 directory도 상관이 없고, 심지어 아무 것도 없어도 됩니다. gitignore에서 **을 생각하시면 편하겠습니다. 다음에 *는 문자 0개 이상인 파일 이름인데요. /와 같은 디렉토리 구분자를 제외합니다. ?는 하나의 파일 문자를 의미합니다. 어떤 것이 제외되는지 보겠습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;om11.png&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;141&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IOEP4/btr6odT0bb8/OvQQNrXvwcONkPfSq8BKnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IOEP4/btr6odT0bb8/OvQQNrXvwcONkPfSq8BKnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IOEP4/btr6odT0bb8/OvQQNrXvwcONkPfSq8BKnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIOEP4%2Fbtr6odT0bb8%2FOvQQNrXvwcONkPfSq8BKnK%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;402&quot; height=&quot;141&quot; data-filename=&quot;om11.png&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;141&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;먼저 pg1/**입니다. pg1 밑에 있는 .py 파일도 당연하게 제외됩니다. 다음에 *__init__.py가 있는데요. pg2 밑에 있는 __init__.py도 여기에 걸립니다. 따라서 pg2/__init__.py도 제외됩니다. 그리고 main.py는 root 디렉토리에 있는데요. main.py도 제외하라고 했으니, 이것도 제외됩니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;om9.png&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciYUyp/btr6qsv56VH/zIED33LLs9TmPeSGQ8D3w0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciYUyp/btr6qsv56VH/zIED33LLs9TmPeSGQ8D3w0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciYUyp/btr6qsv56VH/zIED33LLs9TmPeSGQ8D3w0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciYUyp%2Fbtr6qsv56VH%2FzIED33LLs9TmPeSGQ8D3w0%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;466&quot; height=&quot;166&quot; data-filename=&quot;om9.png&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;다시 python main.py --cov --cov-report=html를 입력합니다. 다음에, htmlcov 밑에 있는 index.html에 들어가 보면, pg2/b.py만 report에 나옴을 볼 수 있습니다. &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;즉, .coveragerc에 [run] 옵션에 omit = 을 적어주고, 제외할 파일들의 패턴을 적어주면 됩니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>코딩/파이선</category>
      <category>coverage</category>
      <category>omit</category>
      <category>pytest</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/867</guid>
      <comments>https://codingdog.tistory.com/entry/pytest-coverage-omit-%EC%98%B5%EC%85%98%EC%9C%BC%EB%A1%9C-report%EC%97%90-%ED%8A%B9%EC%A0%95-%ED%8C%8C%EC%9D%BC%EC%9D%98-%EA%B2%B0%EA%B3%BC%EB%A5%BC-%EC%A0%9C%EC%99%B8%ED%95%B4-%EB%B4%85%EC%8B%9C%EB%8B%A4#entry867comment</comments>
      <pubDate>Tue, 28 Mar 2023 07:20:38 +0900</pubDate>
    </item>
    <item>
      <title>notepad++에서 줄 번호로 찾아가는 방법을 알아봅시다.</title>
      <link>https://codingdog.tistory.com/entry/notepad%EC%97%90%EC%84%9C-%EC%A4%84-%EB%B2%88%ED%98%B8%EB%A1%9C-%EC%B0%BE%EC%95%84%EA%B0%80%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;notepad++에서 줄 번호 찾아가기 기능에 대해 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;line 수가 엄청난 파일을 다뤄야 하는 경우가 간혹 가다 있습니다. 예를 들자면 문제 출제할 때 입력 파일의 line 수가 100만줄이 넘어가는 경우도 매우 흔합니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lis1.png&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/85JbY/btr5ZkMmLaq/AZXEqBJbKJPtTuOgCk9Th0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/85JbY/btr5ZkMmLaq/AZXEqBJbKJPtTuOgCk9Th0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/85JbY/btr5ZkMmLaq/AZXEqBJbKJPtTuOgCk9Th0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F85JbY%2Fbtr5ZkMmLaq%2FAZXEqBJbKJPtTuOgCk9Th0%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;538&quot; height=&quot;140&quot; data-filename=&quot;lis1.png&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;140&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이 데이터 파일은 100만줄이 넘네요. 32만번째 줄에 있는 것을 정확히 찾아가려면 어떻게 해야 할까요? 그냥 스크롤 바를 올려버리는 방법도 있습니다만, &lt;span&gt;일일히 줄 번호를 찾아가기 위해 스크롤바로 이동하면 상당한 인내가 필요할 것입니다.&lt;/span&gt; &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;찾기(S)를 누르면, 줄 찾아가기라는 메뉴가 있습니다.&lt;/u&gt;&lt;/span&gt; 이를 이용하면 매우 간단합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lis2.png&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;329&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Zdtfb/btr6eTmK15r/dUE16IpWkGE4z4ID1WsrVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Zdtfb/btr6eTmK15r/dUE16IpWkGE4z4ID1WsrVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Zdtfb/btr6eTmK15r/dUE16IpWkGE4z4ID1WsrVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZdtfb%2Fbtr6eTmK15r%2FdUE16IpWkGE4z4ID1WsrVk%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;385&quot; height=&quot;329&quot; data-filename=&quot;lis2.png&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;329&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;줄 찾아가기의 단축키는 Ctrl+G입니다. 이것을 눌러 주겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lis3.png&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z5A2D/btr53C61BD1/wkNMcsswkxApxk8h12Xtx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z5A2D/btr53C61BD1/wkNMcsswkxApxk8h12Xtx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z5A2D/btr53C61BD1/wkNMcsswkxApxk8h12Xtx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz5A2D%2Fbtr53C61BD1%2FwkNMcsswkxApxk8h12Xtx1%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;388&quot; height=&quot;157&quot; data-filename=&quot;lis3.png&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;157&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 메뉴 선택창에 줄과 오프셋이 있습니다. 오프셋은 밑에서 후술하겠습니다. 이동할 줄 번호를 320000으로 입력해 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lis4.png&quot; data-origin-width=&quot;527&quot; data-origin-height=&quot;161&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TyJBG/btr5Uj1iKrU/xhXkvPKzLvl86HOOl6Um40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TyJBG/btr5Uj1iKrU/xhXkvPKzLvl86HOOl6Um40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TyJBG/btr5Uj1iKrU/xhXkvPKzLvl86HOOl6Um40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTyJBG%2Fbtr5Uj1iKrU%2FxhXkvPKzLvl86HOOl6Um40%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;527&quot; height=&quot;161&quot; data-filename=&quot;lis4.png&quot; data-origin-width=&quot;527&quot; data-origin-height=&quot;161&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 정확히 32만번째 줄로 이동합니다. bylrzt[wed8이라는 내용이 있는 걸로 보아서는 이상한 제너레이트 알고리즘으로 데이터를 생성한 거 같습니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;notepad++에서 줄 번호를 찾아가기 위해서는 ctrl+G를 누르면 됩니다.&lt;/u&gt;&lt;/span&gt; &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;다음에, 줄을 선택하고, 이동할 줄 번호를 적고, 이동을 누르면 됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lis6.png&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvmBsb/btr5TptACRt/HmM84iZdWr5D7WGb5b0wYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvmBsb/btr5TptACRt/HmM84iZdWr5D7WGb5b0wYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvmBsb/btr5TptACRt/HmM84iZdWr5D7WGb5b0wYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvmBsb%2Fbtr5TptACRt%2FHmM84iZdWr5D7WGb5b0wYK%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;389&quot; height=&quot;160&quot; data-filename=&quot;lis6.png&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그런데, 오프셋으로 기능도 있습니다? 이 기능은 무엇을 하는 것일까요? 이동 가능한 마지막 줄 번호가 48047787인데요. 이 파일의 크기가 48047787byte임을 의미합니다. 14번째 오프셋으로 이동해 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lis7.png&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;61&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwPx7M/btr5Tq0kCn7/bLKREhI9sG1W1fq0BKxtY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwPx7M/btr5Tq0kCn7/bLKREhI9sG1W1fq0BKxtY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwPx7M/btr5Tq0kCn7/bLKREhI9sG1W1fq0BKxtY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwPx7M%2Fbtr5Tq0kCn7%2FbLKREhI9sG1W1fq0BKxtY1%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;385&quot; height=&quot;61&quot; data-filename=&quot;lis7.png&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;61&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;그러면 2번째 줄의 teg 앞에 오프셋이 이동했음을 볼 수 있습니다. 이는, 500000 500000이 13자이고, 13번째 offset이 1번째 줄의 끝을 가리키기 때문이에요. 1칸 더 이동하면, 2번째 줄의 시작을 가리킵니다. &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;즉, byte 단위로 이동하고 싶을 때 쓰면 됩니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lis8.png&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDcCNZ/btr5RSiulWD/Zwr6XX54yu3ulLRTEiY7x1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDcCNZ/btr5RSiulWD/Zwr6XX54yu3ulLRTEiY7x1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDcCNZ/btr5RSiulWD/Zwr6XX54yu3ulLRTEiY7x1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDcCNZ%2Fbtr5RSiulWD%2FZwr6XX54yu3ulLRTEiY7x1%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;493&quot; height=&quot;194&quot; data-filename=&quot;lis8.png&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;194&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;이런 경우는 어떨까요? 한글과 영어가 섞여 있습니다. 인코딩 형식은 UTF-8입니다. 즉, 한글이 3byte이고 ascii가 1byte입니다. 이 경우, offset을 6으로 설정하면 어떻게 될까요? 한 번 그렇게 해 보겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lis9.png&quot; data-origin-width=&quot;387&quot; data-origin-height=&quot;161&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ble4vL/btr6hau7ycd/JEzKLgxFjBp5vHL7w1wY10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ble4vL/btr6hau7ycd/JEzKLgxFjBp5vHL7w1wY10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ble4vL/btr6hau7ycd/JEzKLgxFjBp5vHL7w1wY10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fble4vL%2Fbtr6hau7ycd%2FJEzKLgxFjBp5vHL7w1wY10%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;387&quot; height=&quot;161&quot; data-filename=&quot;lis9.png&quot; data-origin-width=&quot;387&quot; data-origin-height=&quot;161&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;ctrl+G를 누른 다음에 오프셋을 선택합니다. 다음에 이동할 줄 번호를 6으로 적고 이동을 누르겠습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lis10.png&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NsDua/btr5QzRoono/s2OP4VkSFV9qe3Ewmeo5Ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NsDua/btr5QzRoono/s2OP4VkSFV9qe3Ewmeo5Ck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NsDua/btr5QzRoono/s2OP4VkSFV9qe3Ewmeo5Ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNsDua%2Fbtr5QzRoono%2Fs2OP4VkSFV9qe3Ewmeo5Ck%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;482&quot; height=&quot;197&quot; data-filename=&quot;lis10.png&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;그러면 는 앞에 커서가 이동합니다. 이는 가와 희가 UTF-8 인코딩에서는 3byte씩이나 차지하기 때문입니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;즉, 오프셋은 byte 단위로 먹힌다는 것만 짚고 가셔도 되겠습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>유틸리티</category>
      <category>Notepad++</category>
      <category>줄찾기</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/866</guid>
      <comments>https://codingdog.tistory.com/entry/notepad%EC%97%90%EC%84%9C-%EC%A4%84-%EB%B2%88%ED%98%B8%EB%A1%9C-%EC%B0%BE%EC%95%84%EA%B0%80%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4#entry866comment</comments>
      <pubDate>Mon, 27 Mar 2023 07:00:23 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 pytest stdout print 콘솔에 출력되게 해 봅시다.</title>
      <link>https://codingdog.tistory.com/entry/pytest-print-%EC%BD%98%EC%86%94%EC%97%90-%EC%B6%9C%EB%A0%A5%EB%90%98%EA%B2%8C-%ED%95%B4-%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt; 어떤 프로그램을 테스트 할 때 pytest를 쓰는 편입니다. 이번 시간에는 print 문으로 출력한 것을 어떻게 콘솔로 볼 수 있는지 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;기본적으로 pytest는 capture 옵션을 fd로 받게 되어 있습니다. 이는 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;a style=&quot;color: #f89009;&quot; href=&quot;https://docs.pytest.org/en/7.1.x/how-to/capture-stdout-stderr.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;문서&lt;/a&gt;&lt;/span&gt;에도 나와 있는 부분이에요. 1번과 2번 데스크립터에 쓰여지는 내용, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;즉 표준 출력과 오류가 모두 캡쳐되는 것이 default입니다.&lt;/u&gt;&lt;/span&gt; 실험을 하나 해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pyt3.png&quot; data-origin-width=&quot;347&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eiDYuv/btr5TonszOH/LtlNxCCPFl15qbVkhDAE30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eiDYuv/btr5TonszOH/LtlNxCCPFl15qbVkhDAE30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eiDYuv/btr5TonszOH/LtlNxCCPFl15qbVkhDAE30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeiDYuv%2Fbtr5TonszOH%2FLtlNxCCPFl15qbVkhDAE30%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;347&quot; height=&quot;72&quot; data-filename=&quot;pyt3.png&quot; data-origin-width=&quot;347&quot; data-origin-height=&quot;72&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;예제 프로그램 1번은 test_feature_a라는 함수를 만들었습니다. 간단하게 &quot;1&quot;을 표준 출력에 출력합니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pyt4.png&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;221&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6ULZC/btr5TnPCWq2/L2ACAz5F7ARFNQPLybh0P1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6ULZC/btr5TnPCWq2/L2ACAz5F7ARFNQPLybh0P1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6ULZC/btr5TnPCWq2/L2ACAz5F7ARFNQPLybh0P1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6ULZC%2Fbtr5TnPCWq2%2FL2ACAz5F7ARFNQPLybh0P1%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;579&quot; height=&quot;221&quot; data-filename=&quot;pyt4.png&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;221&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그런데, 1이라는 것은 출력되지 않았습니다. 이는, 문서에 따르면 캡쳐되었기 때문입니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pyt5.png&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;91&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mNXY5/btr5R0HaMkZ/NT7ZwKIKNBrX5UksvcSqIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mNXY5/btr5R0HaMkZ/NT7ZwKIKNBrX5UksvcSqIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mNXY5/btr5R0HaMkZ/NT7ZwKIKNBrX5UksvcSqIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmNXY5%2Fbtr5R0HaMkZ%2FNT7ZwKIKNBrX5UksvcSqIK%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;409&quot; height=&quot;91&quot; data-filename=&quot;pyt5.png&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;91&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이것은 어떨까요? 1.txt에 1이라는 내용을 쓰는 프로그램입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pyt6.png&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWNaQi/btr5TnhMLWi/yPkeRohKLmEjxs0Jdizho0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWNaQi/btr5TnhMLWi/yPkeRohKLmEjxs0Jdizho0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWNaQi/btr5TnhMLWi/yPkeRohKLmEjxs0Jdizho0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWNaQi%2Fbtr5TnhMLWi%2FyPkeRohKLmEjxs0Jdizho0%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;578&quot; height=&quot;225&quot; data-filename=&quot;pyt6.png&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;역시 테스트는 성공하였습니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pyt7.png&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEWrby/btr5QgYhRce/uy8llgkv0vlPzjgEtkYTL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEWrby/btr5QgYhRce/uy8llgkv0vlPzjgEtkYTL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEWrby/btr5QgYhRce/uy8llgkv0vlPzjgEtkYTL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEWrby%2Fbtr5QgYhRce%2Fuy8llgkv0vlPzjgEtkYTL0%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;420&quot; height=&quot;86&quot; data-filename=&quot;pyt7.png&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;1.txt에 쓰여진 내용 역시 1로 잘 출력되었습니다. 어? 이건 왜 그런 것일까요? 표준 입력, 출력이 아니였기 때문입니다. 이 말은, 파일에 출력하는 것은 문서에서 설명하는 1번, 2번 데스크립터와 와 별개의 fd를 사용했습니다. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;고로, 캡쳐가 되지 않았고 파일에 출력되었던 것입니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;그러면 어떻게 해야 print에 있는 내용이 콘솔에 출력될까요?&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pyt1.png&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;42&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnVB2a/btr5OzqxCaG/I8VfV0KiYue3Pi9g75fwPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnVB2a/btr5OzqxCaG/I8VfV0KiYue3Pi9g75fwPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnVB2a/btr5OzqxCaG/I8VfV0KiYue3Pi9g75fwPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnVB2a%2Fbtr5OzqxCaG%2FI8VfV0KiYue3Pi9g75fwPK%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;641&quot; height=&quot;42&quot; data-filename=&quot;pyt1.png&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;42&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;pytest의 --capture 옵션을 보면, fd, sys, no, tee-sys 이렇게 4개가 있다고 나와 있습니다. 디폴트가 fd입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pyt2.png&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;42&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TtMz2/btr5ORkpmwB/Jelix524VkrxVOTc88Y5Yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TtMz2/btr5ORkpmwB/Jelix524VkrxVOTc88Y5Yk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TtMz2/btr5ORkpmwB/Jelix524VkrxVOTc88Y5Yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTtMz2%2Fbtr5ORkpmwB%2FJelix524VkrxVOTc88Y5Yk%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;676&quot; height=&quot;42&quot; data-filename=&quot;pyt2.png&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;42&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;-s는 --capture=no의 짧은 버전입니다. 고로, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;뒤에 -s를 붙여주면 캡쳐를 하지 않게 됩니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pyt8.png&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buCZEc/btr5Q3xpiLy/dMI3lrPw0pfMKKjB4oPzwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buCZEc/btr5Q3xpiLy/dMI3lrPw0pfMKKjB4oPzwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buCZEc/btr5Q3xpiLy/dMI3lrPw0pfMKKjB4oPzwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuCZEc%2Fbtr5Q3xpiLy%2FdMI3lrPw0pfMKKjB4oPzwK%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;410&quot; height=&quot;68&quot; data-filename=&quot;pyt8.png&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;main.py는 메서드 test_a를 호출합니다. !를 print합니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pyt9.png&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0I4ev/btr5RRi7FlO/sbWpo8Nz5nmkC6FOvru8Ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0I4ev/btr5RRi7FlO/sbWpo8Nz5nmkC6FOvru8Ek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0I4ev/btr5RRi7FlO/sbWpo8Nz5nmkC6FOvru8Ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0I4ev%2Fbtr5RRi7FlO%2FsbWpo8Nz5nmkC6FOvru8Ek%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;586&quot; height=&quot;246&quot; data-filename=&quot;pyt9.png&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;-s 옵션을 붙여서 실행&lt;/b&gt;&lt;/span&gt;해 보겠습니다. 그러면 !이 떡하니 나오게 됩니다. &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;u&gt;어떠한 캡쳐도 하지 않기 때문에, 표준 출력이나 에러 출력도 콘솔에 나오게 됩니다.&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>코딩/파이선</category>
      <category>pytest</category>
      <category>python</category>
      <author>코딩강아지</author>
      <guid isPermaLink="true">https://codingdog.tistory.com/865</guid>
      <comments>https://codingdog.tistory.com/entry/pytest-print-%EC%BD%98%EC%86%94%EC%97%90-%EC%B6%9C%EB%A0%A5%EB%90%98%EA%B2%8C-%ED%95%B4-%EB%B4%85%EC%8B%9C%EB%8B%A4#entry865comment</comments>
      <pubDate>Sat, 25 Mar 2023 23:59:32 +0900</pubDate>
    </item>
  </channel>
</rss>