<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>bullsoneshot의 개발 블로그</title>
    <link>https://bulls0neshot.tistory.com/</link>
    <description>데이터분석 공부 기록</description>
    <language>ko</language>
    <pubDate>Tue, 2 Jun 2026 16:19:25 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>bullsoneshot</managingEditor>
    <image>
      <title>bullsoneshot의 개발 블로그</title>
      <url>https://tistory1.daumcdn.net/tistory/7530466/attach/ad140fbafce046f4ab9e8e27179d58df</url>
      <link>https://bulls0neshot.tistory.com</link>
    </image>
    <item>
      <title>imweb을 활용한 브랜딩 페이지 (카네이테이)</title>
      <link>https://bulls0neshot.tistory.com/entry/Imweb%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%EB%B8%8C%EB%9E%9C%EB%94%A9-%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%B9%B4%EB%84%A4%EC%9D%B4%ED%85%8C%EC%9D%B4</link>
      <description>&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;imweb을 활용한 브랜딩페이지 만들기&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;업사이클링 브랜드인 카네이테이 공식 홈페이지&lt;/h4&gt;
&lt;figure id=&quot;og_1776820834453&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;카네이테이&quot; data-og-description=&quot;친환경 업사이클링 브랜드 카네이테이&quot; data-og-host=&quot;kaneitei.com&quot; data-og-source-url=&quot;https://kaneitei.com/?srsltid=AfmBOoqr7VFsqadk_7D_z8iTBA7Y-QB0dCFXQxgJ-WFYoGDdwvpW8-XV&quot; data-og-url=&quot;https://kaneitei.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/tZAo7/dJMb8XR7WDc/T7P8c03cLKd9dSFrcfFvA1/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628,https://scrap.kakaocdn.net/dn/40EdI/dJMb8Qeoqxv/poPYwCXV7fR7LMIxNyHkg0/img.png?width=1536&amp;amp;height=2048&amp;amp;face=0_0_1536_2048,https://scrap.kakaocdn.net/dn/cYAKmw/dJMb8TCbUcO/ykJFkkOoGCqkcdpH7G5bgK/img.png?width=356&amp;amp;height=355&amp;amp;face=0_0_356_355&quot;&gt;&lt;a href=&quot;https://kaneitei.com/?srsltid=AfmBOoqr7VFsqadk_7D_z8iTBA7Y-QB0dCFXQxgJ-WFYoGDdwvpW8-XV&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kaneitei.com/?srsltid=AfmBOoqr7VFsqadk_7D_z8iTBA7Y-QB0dCFXQxgJ-WFYoGDdwvpW8-XV&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/tZAo7/dJMb8XR7WDc/T7P8c03cLKd9dSFrcfFvA1/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628,https://scrap.kakaocdn.net/dn/40EdI/dJMb8Qeoqxv/poPYwCXV7fR7LMIxNyHkg0/img.png?width=1536&amp;amp;height=2048&amp;amp;face=0_0_1536_2048,https://scrap.kakaocdn.net/dn/cYAKmw/dJMb8TCbUcO/ykJFkkOoGCqkcdpH7G5bgK/img.png?width=356&amp;amp;height=355&amp;amp;face=0_0_356_355');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;카네이테이&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;친환경 업사이클링 브랜드 카네이테이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kaneitei.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;imweb으로 생성한 카네이테이 리디자인 홈페이지&lt;/h4&gt;
&lt;figure id=&quot;og_1776755330258&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;카네이테이 (KANEITEI)&quot; data-og-description=&quot;카네이테이 브랜딩 아임웹 실습페이지&quot; data-og-host=&quot;kaneitei-practice.imweb.me&quot; data-og-source-url=&quot;https://kaneitei-practice.imweb.me/&quot; data-og-url=&quot;https://kaneitei-practice.imweb.me/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/8JyUE/dJMb8SXzWic/21q4lLglWflCC4DgRRJH5K/img.png?width=2292&amp;amp;height=1146&amp;amp;face=0_0_2292_1146,https://scrap.kakaocdn.net/dn/khvbq/dJMb8PGyial/7pKq90L8KCGZmsJq1NCNk1/img.jpg?width=1446&amp;amp;height=1334&amp;amp;face=0_0_1446_1334,https://scrap.kakaocdn.net/dn/bGfYFl/dJMb8ZvDCa0/zQ6hzprkoSHT7JTvqSmg0k/img.jpg?width=960&amp;amp;height=954&amp;amp;face=0_0_960_954&quot;&gt;&lt;a href=&quot;https://kaneitei-practice.imweb.me/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kaneitei-practice.imweb.me/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/8JyUE/dJMb8SXzWic/21q4lLglWflCC4DgRRJH5K/img.png?width=2292&amp;amp;height=1146&amp;amp;face=0_0_2292_1146,https://scrap.kakaocdn.net/dn/khvbq/dJMb8PGyial/7pKq90L8KCGZmsJq1NCNk1/img.jpg?width=1446&amp;amp;height=1334&amp;amp;face=0_0_1446_1334,https://scrap.kakaocdn.net/dn/bGfYFl/dJMb8ZvDCa0/zQ6hzprkoSHT7JTvqSmg0k/img.jpg?width=960&amp;amp;height=954&amp;amp;face=0_0_960_954');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;카네이테이 (KANEITEI)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;카네이테이 브랜딩 아임웹 실습페이지&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kaneitei-practice.imweb.me&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKmeEo/dJMcagkWggE/pI2SHy29tT30RSoD01ES91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKmeEo/dJMcagkWggE/pI2SHy29tT30RSoD01ES91/img.png&quot; data-alt=&quot;QR코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKmeEo/dJMcagkWggE/pI2SHy29tT30RSoD01ES91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKmeEo%2FdJMcagkWggE%2FpI2SHy29tT30RSoD01ES91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;230&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;QR코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; 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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;5002&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csRph6/dJMcafzzG32/KuVNKs7fI8BZc7S9QD9dt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csRph6/dJMcafzzG32/KuVNKs7fI8BZc7S9QD9dt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csRph6/dJMcafzzG32/KuVNKs7fI8BZc7S9QD9dt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsRph6%2FdJMcafzzG32%2FKuVNKs7fI8BZc7S9QD9dt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;5002&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;5002&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;2221&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nElLR/dJMb99TDszp/UWvY8djONA7xUBHScpwrFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nElLR/dJMb99TDszp/UWvY8djONA7xUBHScpwrFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nElLR/dJMb99TDszp/UWvY8djONA7xUBHScpwrFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnElLR%2FdJMb99TDszp%2FUWvY8djONA7xUBHScpwrFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;2221&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;2221&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;2026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bteBc6/dJMcadaBPrM/0fdKgjvPfe5AbVq3kmdCb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bteBc6/dJMcadaBPrM/0fdKgjvPfe5AbVq3kmdCb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bteBc6/dJMcadaBPrM/0fdKgjvPfe5AbVq3kmdCb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbteBc6%2FdJMcadaBPrM%2F0fdKgjvPfe5AbVq3kmdCb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;2026&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;2026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://kaneitei-practice.imweb.me/?utm_source=tistory&amp;amp;utm_medium=blog&amp;amp;utm_campaign=ga_data_analytics&amp;amp;utm_term=ga_데이터분석&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;신청하기&lt;/a&gt;&lt;/p&gt;</description>
      <category>GA 실습</category>
      <category>imweb</category>
      <category>리브랜딩</category>
      <category>바이브코딩</category>
      <category>브랜딩</category>
      <category>아임웹</category>
      <category>웹페이지</category>
      <category>카네이테이</category>
      <author>bullsoneshot</author>
      <guid isPermaLink="true">https://bulls0neshot.tistory.com/72</guid>
      <comments>https://bulls0neshot.tistory.com/entry/Imweb%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%EB%B8%8C%EB%9E%9C%EB%94%A9-%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%B9%B4%EB%84%A4%EC%9D%B4%ED%85%8C%EC%9D%B4#entry72comment</comments>
      <pubDate>Tue, 21 Apr 2026 16:10:44 +0900</pubDate>
    </item>
    <item>
      <title>[이슈해결] 프로그래머스 백준허브 연동 안될때</title>
      <link>https://bulls0neshot.tistory.com/entry/%EC%9D%B4%EC%8A%88%ED%95%B4%EA%B2%B0-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%B0%B1%EC%A4%80%ED%97%88%EB%B8%8C-%EC%97%B0%EB%8F%99-%EC%95%88-%EB%90%A0%EB%95%8C</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d3zyP8/dJMcaaKEjV8/4IBCjTfAj1bDxAloke5WzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d3zyP8/dJMcaaKEjV8/4IBCjTfAj1bDxAloke5WzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d3zyP8/dJMcaaKEjV8/4IBCjTfAj1bDxAloke5WzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd3zyP8%2FdJMcaaKEjV8%2F4IBCjTfAj1bDxAloke5WzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1198&quot; height=&quot;558&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;558&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;오랜만에 프로그래머스 문제를 풀다 보니까 어느 순간 깃허브 연동이 안되고 있는것을 확인했다&lt;/b&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-origin-width=&quot;933&quot; data-origin-height=&quot;734&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2zY6e/dJMcacPevJA/fSHzro8ejMyFvOqxG3iWN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2zY6e/dJMcacPevJA/fSHzro8ejMyFvOqxG3iWN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2zY6e/dJMcacPevJA/fSHzro8ejMyFvOqxG3iWN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2zY6e%2FdJMcacPevJA%2FfSHzro8ejMyFvOqxG3iWN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;742&quot; height=&quot;584&quot; data-origin-width=&quot;933&quot; data-origin-height=&quot;734&quot;/&gt;&lt;/span&gt;&lt;/figure&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;백준허브도 재설치해봤는데 해결이 안됐고&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;구글링을 열심히 해보니까 최후의 수단으로 확장프로그램으로 CORS를 깔아보기로 했다&lt;/b&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lNVDg/dJMb99LJLyi/6R7y69BcJ5WDdlQ5Y57Mx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lNVDg/dJMb99LJLyi/6R7y69BcJ5WDdlQ5Y57Mx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lNVDg/dJMb99LJLyi/6R7y69BcJ5WDdlQ5Y57Mx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlNVDg%2FdJMb99LJLyi%2F6R7y69BcJ5WDdlQ5Y57Mx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;660&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X59bT/dJMcafSJim3/hWuVaXS26mmNwBbT2q5oFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X59bT/dJMcafSJim3/hWuVaXS26mmNwBbT2q5oFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X59bT/dJMcafSJim3/hWuVaXS26mmNwBbT2q5oFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX59bT%2FdJMcafSJim3%2FhWuVaXS26mmNwBbT2q5oFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;678&quot; height=&quot;364&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;364&quot;/&gt;&lt;/span&gt;&lt;/figure&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Open options page를 누르고 들어간다&lt;/b&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-origin-width=&quot;1874&quot; data-origin-height=&quot;968&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgNYsB/dJMcagjM45L/DXXSTn2RRHLAnEb3OnaaV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgNYsB/dJMcagjM45L/DXXSTn2RRHLAnEb3OnaaV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgNYsB/dJMcagjM45L/DXXSTn2RRHLAnEb3OnaaV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgNYsB%2FdJMcagjM45L%2FDXXSTn2RRHLAnEb3OnaaV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1874&quot; height=&quot;968&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;968&quot;/&gt;&lt;/span&gt;&lt;/figure&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2번과 3번 옵션에 체크를 표시해준다&lt;/b&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 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-origin-width=&quot;921&quot; data-origin-height=&quot;619&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8Q0IF/dJMcabJzpFJ/k5z2gyglklpdeg2eWxYgb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8Q0IF/dJMcabJzpFJ/k5z2gyglklpdeg2eWxYgb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8Q0IF/dJMcabJzpFJ/k5z2gyglklpdeg2eWxYgb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8Q0IF%2FdJMcabJzpFJ%2Fk5z2gyglklpdeg2eWxYgb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;921&quot; height=&quot;619&quot; data-origin-width=&quot;921&quot; data-origin-height=&quot;619&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjxEJi/dJMcag5aRtC/xGMyLC2CC1jxojQORGn0s1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjxEJi/dJMcag5aRtC/xGMyLC2CC1jxojQORGn0s1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjxEJi/dJMcag5aRtC/xGMyLC2CC1jxojQORGn0s1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjxEJi%2FdJMcag5aRtC%2FxGMyLC2CC1jxojQORGn0s1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1125&quot; height=&quot;356&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;356&quot;/&gt;&lt;/span&gt;&lt;/figure&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그러고 다시 프로그래머스를 실행하면 원래대로 초록색 체크가 뜨면서 정상적으로 커밋이 되는걸 확인할 수 있다&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;</description>
      <category>Git/Github</category>
      <author>bullsoneshot</author>
      <guid isPermaLink="true">https://bulls0neshot.tistory.com/70</guid>
      <comments>https://bulls0neshot.tistory.com/entry/%EC%9D%B4%EC%8A%88%ED%95%B4%EA%B2%B0-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%B0%B1%EC%A4%80%ED%97%88%EB%B8%8C-%EC%97%B0%EB%8F%99-%EC%95%88-%EB%90%A0%EB%95%8C#entry70comment</comments>
      <pubDate>Mon, 22 Dec 2025 19:55:02 +0900</pubDate>
    </item>
    <item>
      <title>Git 협업</title>
      <link>https://bulls0neshot.tistory.com/entry/Git-%ED%98%91%EC%97%85</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUUtjc/btsOTteAQD4/ktpWIDCTn7gxObBpUfNAR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUUtjc/btsOTteAQD4/ktpWIDCTn7gxObBpUfNAR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUUtjc/btsOTteAQD4/ktpWIDCTn7gxObBpUfNAR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUUtjc%2FbtsOTteAQD4%2FktpWIDCTn7gxObBpUfNAR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;658&quot; height=&quot;464&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;git flow (Branch Management)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스코드를 관리하고 배포하기 위한 브랜치 관리 전략&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;대표적인 모델 (5가지 브랜치를 사용)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Master : 제품으로 출시되는 Branch, Production의 개념&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Develop : 다음 출시 버전을 개발하는 Branch&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Feature : 기능을 개발하는 Branch, 주로 이 브랜치에서 개발&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Release : 이번 출시 버전을 준비하는 Branch, QA 진행 (Deploy)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Hotfix : 출시 버전에서 발생한 버그를 수정하는 Branch&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;78&quot; data-start=&quot;55&quot; data-ke-size=&quot;size23&quot;&gt;Git Flow 활용 개발 시나리오&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;393&quot; data-start=&quot;79&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;111&quot; data-start=&quot;79&quot;&gt;처음에 Master(Main)과 Develop 생성&lt;/li&gt;
&lt;li data-end=&quot;155&quot; data-start=&quot;112&quot;&gt;새로운 추가 작업은 Develop에서 Feature Branch를 생성&lt;/li&gt;
&lt;li data-end=&quot;209&quot; data-start=&quot;156&quot;&gt;Feature는 Develop으로 Merge (이 때 Develop의 최신 상태를 확인)&lt;/li&gt;
&lt;li data-end=&quot;248&quot; data-start=&quot;210&quot;&gt;QA를 위해 Develop에서 Release Branch 생성&lt;/li&gt;
&lt;li data-end=&quot;278&quot; data-start=&quot;249&quot;&gt;QA에서 발생한 버그는 Release에서 수정&lt;/li&gt;
&lt;li data-end=&quot;334&quot; data-start=&quot;279&quot;&gt;QA가 끝나면 Release에서 Develop / Master(Main)으로 각각 Merge&lt;/li&gt;
&lt;li data-end=&quot;393&quot; data-start=&quot;335&quot;&gt;Hotfix는 Master에서 생성하여 수정한 뒤, Master, Develop에 각각 Merge&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;398&quot; data-start=&quot;395&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;415&quot; data-start=&quot;400&quot; data-ke-size=&quot;size23&quot;&gt;Git Flow 응용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;509&quot; data-start=&quot;416&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;470&quot; data-start=&quot;416&quot;&gt;QA를 진행할 때 Release(Deploy) branch는 test서버에 배포해놓고 수행&lt;/li&gt;
&lt;li data-end=&quot;509&quot; data-start=&quot;471&quot;&gt;Master Branch의 경우에는 운영서버에 배포하도록 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;514&quot; data-start=&quot;511&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;531&quot; data-start=&quot;516&quot; data-ke-size=&quot;size23&quot;&gt;Git Flow 적용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;761&quot; data-start=&quot;532&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;594&quot; data-start=&quot;532&quot;&gt;Branch 이름은 사내 컨벤션에 맞게 적용 (Master &amp;rarr; Main, Release &amp;rarr; Deploy)&lt;/li&gt;
&lt;li data-end=&quot;644&quot; data-start=&quot;595&quot;&gt;Master &amp;rarr; Hotfix / Release &amp;rarr; Develop &amp;rarr; Feature&lt;/li&gt;
&lt;li data-end=&quot;761&quot; data-start=&quot;645&quot;&gt;여러 명이 동일한 개발지점을 다양한 개발을 할 수 있도록 하기 위해 Feature의 이름을 세분화
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;761&quot; data-start=&quot;706&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;761&quot; data-start=&quot;706&quot;&gt;ex) feat/back/login, feat/front/dashboard, issue/#1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;766&quot; data-start=&quot;763&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;786&quot; data-start=&quot;768&quot; data-ke-size=&quot;size23&quot;&gt;Issue Tracking&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1308&quot; data-start=&quot;787&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;856&quot; data-start=&quot;787&quot;&gt;이슈 관리를 지원하는 원격저장소 플랫폼의 경우 (ex. GitHub, GitLab) issue tracking을 지원&lt;/li&gt;
&lt;li data-end=&quot;998&quot; data-start=&quot;857&quot;&gt;Issue ID를 commit message에 입력하면 관련 링크로 이동할 수 있도록 하이퍼링크
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;998&quot; data-start=&quot;917&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;940&quot; data-start=&quot;917&quot;&gt;예: 이슈를 나타내는 기호를 #&lt;/li&gt;
&lt;li data-end=&quot;998&quot; data-start=&quot;943&quot;&gt;이슈 기반으로 개발하는 것을 IID (Issue-driven Development) 라고 함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;607&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMeZWg/btsOTYFK8eM/K1PhTpx6R6bGyHJm9eorP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMeZWg/btsOTYFK8eM/K1PhTpx6R6bGyHJm9eorP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMeZWg/btsOTYFK8eM/K1PhTpx6R6bGyHJm9eorP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMeZWg%2FbtsOTYFK8eM%2FK1PhTpx6R6bGyHJm9eorP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;683&quot; height=&quot;607&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;607&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1308&quot; data-start=&quot;787&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1076&quot; data-start=&quot;999&quot;&gt;Issue에는 Task를 별도로 생성하여 할 일을 관리할 수 있음 (단, Issue 목록에 추가됨, Sub Issue라고 보면 됨)&lt;/li&gt;
&lt;li data-end=&quot;1164&quot; data-start=&quot;1077&quot;&gt;이슈 목록에 추가되는 것이 싫다면, description에 markdown 체크리스트 모델을 활용하는 것도 괜찮음 &amp;rarr; ex) - [ ] To do&lt;/li&gt;
&lt;li data-end=&quot;1266&quot; data-start=&quot;1165&quot;&gt;Linked Items는 특정 Issue와 연결 기능 (예: 수정 Issue 등 연결 필요 시 사용, 혹은 Issue &amp;rarr; history Issue로 연결하여 관리하는 법 등)&lt;/li&gt;
&lt;li data-end=&quot;1308&quot; data-start=&quot;1267&quot;&gt;프로젝트 관리 도구 (jira)를 Issue 대신하여 사용하기도 함&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1313&quot; data-start=&quot;1310&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1336&quot; data-start=&quot;1315&quot; data-ke-size=&quot;size23&quot;&gt;Commit Convention&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1712&quot; data-start=&quot;1337&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1378&quot; data-start=&quot;1337&quot;&gt;커밋 컨벤션은 개발 내용에 대한 이해와 추적을 쉽게 하기 위한 목적&lt;/li&gt;
&lt;li data-end=&quot;1414&quot; data-start=&quot;1379&quot;&gt;Issue와 Merge Request를 넘어서 추적 가능&lt;/li&gt;
&lt;li data-end=&quot;1621&quot; data-start=&quot;1416&quot;&gt;&lt;b&gt;COMMIT_TYPE (예시)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1621&quot; data-start=&quot;1443&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1463&quot; data-start=&quot;1443&quot;&gt;feat : 새로운 기능 추가&lt;/li&gt;
&lt;li data-end=&quot;1481&quot; data-start=&quot;1466&quot;&gt;fix : 버그 수정&lt;/li&gt;
&lt;li data-end=&quot;1505&quot; data-start=&quot;1484&quot;&gt;docs : 문서 추가 및 수정&lt;/li&gt;
&lt;li data-end=&quot;1544&quot; data-start=&quot;1508&quot;&gt;style : 코드 포멧팅, 세미콜론 누락, 오타 수정 등&lt;/li&gt;
&lt;li data-end=&quot;1564&quot; data-start=&quot;1547&quot;&gt;test : 테스트 코드&lt;/li&gt;
&lt;li data-end=&quot;1586&quot; data-start=&quot;1567&quot;&gt;refactor : 리팩토링&lt;/li&gt;
&lt;li data-end=&quot;1621&quot; data-start=&quot;1589&quot;&gt;chore : 빌드 업무 수정, 패키지 매니저 수정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1712&quot; data-start=&quot;1623&quot;&gt;&lt;b&gt;COMMIT_SUMMARY (예시)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1712&quot; data-start=&quot;1653&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1675&quot; data-start=&quot;1653&quot;&gt;영어로 작성 (or 한글로 작성)&lt;/li&gt;
&lt;li data-end=&quot;1694&quot; data-start=&quot;1678&quot;&gt;마침표를 입력하지 않음&lt;/li&gt;
&lt;li data-end=&quot;1712&quot; data-start=&quot;1697&quot;&gt;50자를 넘기지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;525&quot; data-start=&quot;495&quot; data-ke-size=&quot;size23&quot;&gt;병합 &amp;amp; 충돌 관리 (Merge Request)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;770&quot; data-start=&quot;526&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;679&quot; data-start=&quot;526&quot;&gt;git flow에 의해 브랜치를 구분하여 개발을 진행하면, 그것을 상위 브랜치에 병합해야 함
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;679&quot; data-start=&quot;582&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;679&quot; data-start=&quot;582&quot;&gt;이것을 Merge라고 하고, 협업 할 때 병합 관련 내용과 충돌을 해결, 변경 사항을 공유하기 위한 목적 등으로 Merge Request(Pull Request)를 넣음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;770&quot; data-start=&quot;681&quot;&gt;MR, PR의 경우 제목은 병합하는 commit들을 요약
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;770&quot; data-start=&quot;717&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;770&quot; data-start=&quot;717&quot;&gt;상세 내용의 경우 commit에 대한 세부 설명이나 특히 리뷰를 요청할 부분을 남길 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;927&quot; data-origin-height=&quot;662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDWpMB/btsOUfNFcb5/iw4XRWLw833Kkhvi0cVdA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDWpMB/btsOUfNFcb5/iw4XRWLw833Kkhvi0cVdA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDWpMB/btsOUfNFcb5/iw4XRWLw833Kkhvi0cVdA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDWpMB%2FbtsOUfNFcb5%2Fiw4XRWLw833Kkhvi0cVdA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;927&quot; height=&quot;662&quot; data-origin-width=&quot;927&quot; data-origin-height=&quot;662&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;807&quot; data-start=&quot;772&quot; data-ke-size=&quot;size20&quot;&gt;- 코드 리뷰는 Merge Request에서 주로 진행&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;879&quot; data-start=&quot;808&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;834&quot; data-start=&quot;808&quot;&gt;Reviewer에 코드 리뷰 대상자 설정&lt;/li&gt;
&lt;li data-end=&quot;879&quot; data-start=&quot;835&quot;&gt;Reviewer는 change 내용을 보고 review를 진행할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;884&quot; data-start=&quot;881&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1077&quot; data-start=&quot;886&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;924&quot; data-start=&quot;886&quot;&gt;병합 중, 버전 간의 수정한 파일의 겹친 조합들이 발생할 수 있음&lt;/li&gt;
&lt;li data-end=&quot;1077&quot; data-start=&quot;926&quot;&gt;병합 내용은 충돌된 두 버전에서 충돌된 부분에 대해 처리하는 것
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1077&quot; data-start=&quot;968&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1014&quot; data-start=&quot;968&quot;&gt;그래소서 충돌 해결한 뒤 이어 병합할 branch에 commit, merge&lt;/li&gt;
&lt;li data-end=&quot;1077&quot; data-start=&quot;1017&quot;&gt;체계있는 충돌이 낮을 경우 해결할 수 있도록 웹 IDE를 지원해주기 때문에, 충돌 해결 후 merge&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Git/Github</category>
      <author>bullsoneshot</author>
      <guid isPermaLink="true">https://bulls0neshot.tistory.com/69</guid>
      <comments>https://bulls0neshot.tistory.com/entry/Git-%ED%98%91%EC%97%85#entry69comment</comments>
      <pubDate>Fri, 27 Jun 2025 10:46:27 +0900</pubDate>
    </item>
    <item>
      <title>Branch 생성</title>
      <link>https://bulls0neshot.tistory.com/entry/Branch-%EC%83%9D%EC%84%B1</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;30&quot; data-end=&quot;47&quot; data-ke-size=&quot;size23&quot;&gt;분기 (Branch)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;48&quot; data-end=&quot;143&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot; data-start=&quot;48&quot; data-end=&quot;143&quot;&gt;여러 사람과 협업할 경우 Master에서 바로 작업하는 것이 아닌&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&amp;ldquo;기능이나 목적별로&amp;rdquo;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;branch를 따로 만들어서 작업 후 Master에 병합하는 식으로 협업&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tmjbt/btsOKD3DluX/pr174lyRzSlAyHaQb2BaW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tmjbt/btsOKD3DluX/pr174lyRzSlAyHaQb2BaW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tmjbt/btsOKD3DluX/pr174lyRzSlAyHaQb2BaW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftmjbt%2FbtsOKD3DluX%2Fpr174lyRzSlAyHaQb2BaW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;699&quot; height=&quot;357&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;291&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-end=&quot;165&quot; data-start=&quot;150&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Master (=main)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-end=&quot;165&quot; data-start=&quot;150&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-end=&quot;165&quot; data-start=&quot;150&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Your Work&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-end=&quot;237&quot; data-start=&quot;166&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot; data-end=&quot;179&quot; data-start=&quot;166&quot;&gt;branch1&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot; data-end=&quot;196&quot; data-start=&quot;180&quot;&gt;작업 후 merge&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot; data-end=&quot;237&quot; data-start=&quot;197&quot;&gt;중간에 move (다른 브랜치로 이동 또는 업데이트한 듯한 흐름)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-end=&quot;286&quot; data-start=&quot;261&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Someone Else&amp;rsquo;s Work&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-end=&quot;298&quot; data-start=&quot;287&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot; data-end=&quot;298&quot; data-start=&quot;287&quot;&gt;branch2&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;331&quot; data-start=&quot;305&quot; data-ke-size=&quot;size23&quot;&gt;branch 이름 예시) 웹 서비스 개발&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-end=&quot;521&quot; data-start=&quot;333&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot; data-end=&quot;377&quot; data-start=&quot;333&quot;&gt;&lt;b&gt;develop&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 개발 단계 코드를 merge(합치고), test&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot; data-end=&quot;441&quot; data-start=&quot;378&quot;&gt;&lt;b&gt;feat/front/dashboard&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: frontend 작업, dashboard 기능 branch&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot; data-end=&quot;499&quot; data-start=&quot;442&quot;&gt;&lt;b&gt;feat/back/login&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: backend 작업, login api 기능 branch&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot; data-end=&quot;521&quot; data-start=&quot;500&quot;&gt;&lt;b&gt;deploy&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 배포 브랜치&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&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-origin-width=&quot;988&quot; data-origin-height=&quot;879&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JstKh/btsOL6w3k4K/3KndkA7OLK8zsyz9fLv8V1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JstKh/btsOL6w3k4K/3KndkA7OLK8zsyz9fLv8V1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JstKh/btsOL6w3k4K/3KndkA7OLK8zsyz9fLv8V1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJstKh%2FbtsOL6w3k4K%2F3KndkA7OLK8zsyz9fLv8V1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;988&quot; height=&quot;879&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;879&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&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-origin-width=&quot;732&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5HiXf/btsOMlN452o/xP9hru4aNvxG5fhifzDcg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5HiXf/btsOMlN452o/xP9hru4aNvxG5fhifzDcg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5HiXf/btsOMlN452o/xP9hru4aNvxG5fhifzDcg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5HiXf%2FbtsOMlN452o%2FxP9hru4aNvxG5fhifzDcg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;215&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;215&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이름으로 된 새 폴더를 만든다&lt;/p&gt;
&lt;p style=&quot;color: #222222; 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-origin-width=&quot;657&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qcEIc/btsOMbx6KHq/kDvvSIxgCBkbYuwInY3sTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qcEIc/btsOMbx6KHq/kDvvSIxgCBkbYuwInY3sTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qcEIc/btsOMbx6KHq/kDvvSIxgCBkbYuwInY3sTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqcEIc%2FbtsOMbx6KHq%2FkDvvSIxgCBkbYuwInY3sTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;166&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;해당 폴더 안에 들어가서 새 파일을 작성한다&lt;/p&gt;
&lt;p style=&quot;color: #222222; 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-origin-width=&quot;735&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bT4VvY/btsOMl8mjHO/2gajp7k6tkrlRi8WcBReB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bT4VvY/btsOMl8mjHO/2gajp7k6tkrlRi8WcBReB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bT4VvY/btsOMl8mjHO/2gajp7k6tkrlRi8WcBReB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbT4VvY%2FbtsOMl8mjHO%2F2gajp7k6tkrlRi8WcBReB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;735&quot; height=&quot;313&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;git status를 해보면 확인가능&lt;/p&gt;
&lt;p style=&quot;color: #222222; 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-origin-width=&quot;739&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0Ktb0/btsOKJJzEj8/iybrunKemLay1UYK7p3Dx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0Ktb0/btsOKJJzEj8/iybrunKemLay1UYK7p3Dx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0Ktb0/btsOKJJzEj8/iybrunKemLay1UYK7p3Dx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0Ktb0%2FbtsOKJJzEj8%2FiybrunKemLay1UYK7p3Dx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;429&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;git add 폴더경로/파일명 하면 해당 파일만 업로드 가능&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;git status로 확인가능&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; 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-origin-width=&quot;757&quot; data-origin-height=&quot;691&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGied4/btsONdBX4l6/qdGOmezL8lP8CtXPSFXyDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGied4/btsONdBX4l6/qdGOmezL8lP8CtXPSFXyDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGied4/btsONdBX4l6/qdGOmezL8lP8CtXPSFXyDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGied4%2FbtsONdBX4l6%2FqdGOmezL8lP8CtXPSFXyDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;691&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;691&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;git commit 으로&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;git log로&lt;/p&gt;
&lt;p style=&quot;color: #222222; 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-origin-width=&quot;703&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BPAvw/btsOLfVHf76/9CbMNucjaXyK01iGRs5n2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BPAvw/btsOLfVHf76/9CbMNucjaXyK01iGRs5n2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BPAvw/btsOLfVHf76/9CbMNucjaXyK01iGRs5n2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBPAvw%2FbtsOLfVHf76%2F9CbMNucjaXyK01iGRs5n2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;703&quot; height=&quot;266&quot; data-origin-width=&quot;703&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;git push&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; 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-origin-width=&quot;849&quot; data-origin-height=&quot;385&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7KMPj/btsOK8WwOFY/XxblXtOZeqXiWvWVpugSnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7KMPj/btsOK8WwOFY/XxblXtOZeqXiWvWVpugSnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7KMPj/btsOK8WwOFY/XxblXtOZeqXiWvWVpugSnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7KMPj%2FbtsOK8WwOFY%2FXxblXtOZeqXiWvWVpugSnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;385&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;385&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&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-origin-width=&quot;846&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCNGlz/btsOLDB0B9N/TxxmkHT2zYSJU5Io3xlkJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCNGlz/btsOLDB0B9N/TxxmkHT2zYSJU5Io3xlkJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCNGlz/btsOLDB0B9N/TxxmkHT2zYSJU5Io3xlkJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCNGlz%2FbtsOLDB0B9N%2FTxxmkHT2zYSJU5Io3xlkJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;846&quot; height=&quot;476&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&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-origin-width=&quot;843&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lTvlk/btsOKkwBmsw/bNgZE0cmECKGaK9Yrvm6u1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lTvlk/btsOKkwBmsw/bNgZE0cmECKGaK9Yrvm6u1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lTvlk/btsOKkwBmsw/bNgZE0cmECKGaK9Yrvm6u1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlTvlk%2FbtsOKkwBmsw%2FbNgZE0cmECKGaK9Yrvm6u1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;843&quot; height=&quot;516&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;516&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;main 브랜치와의 차이점이 있다면 내 이름으로된 폴더가 있다&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;상단에 This branch is 1 commit ahead of main 이라는 뜻은 바로 그 뜻&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;위에 compare &amp;amp; pull request는 main브랜치와 merge를 할 수 있다&lt;/p&gt;
&lt;p style=&quot;color: #222222; 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-origin-width=&quot;976&quot; data-origin-height=&quot;684&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0lFN8/btsOKKPcB7W/jDJBBRxmsguyYDOr0tIO7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0lFN8/btsOKKPcB7W/jDJBBRxmsguyYDOr0tIO7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0lFN8/btsOKKPcB7W/jDJBBRxmsguyYDOr0tIO7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0lFN8%2FbtsOKKPcB7W%2FjDJBBRxmsguyYDOr0tIO7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;976&quot; height=&quot;684&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;684&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;973&quot; data-origin-height=&quot;616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLnVBa/btsOLCQzfwQ/QvKFhvOuu0SslP6V1SLrt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLnVBa/btsOLCQzfwQ/QvKFhvOuu0SslP6V1SLrt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLnVBa/btsOLCQzfwQ/QvKFhvOuu0SslP6V1SLrt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLnVBa%2FbtsOLCQzfwQ%2FQvKFhvOuu0SslP6V1SLrt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;973&quot; height=&quot;616&quot; data-origin-width=&quot;973&quot; data-origin-height=&quot;616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;git checkout main하면 이름으로된 폴더가 없는데&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다시 jeon99yu로 하면 내 이름으로 된 폴더가 생긴다&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; 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-origin-width=&quot;974&quot; data-origin-height=&quot;189&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1gTiu/btsOLyOaFiL/Rvp2sOLtyD70ChKhfFfFEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1gTiu/btsOLyOaFiL/Rvp2sOLtyD70ChKhfFfFEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1gTiu/btsOLyOaFiL/Rvp2sOLtyD70ChKhfFfFEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1gTiu%2FbtsOLyOaFiL%2FRvp2sOLtyD70ChKhfFfFEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;974&quot; height=&quot;189&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;189&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 잠시 이름폴더에 19파일 삭제&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;main에는 17~19 파일이 다 있음&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;main의 19파일을 jeon99yu로 합치고싶음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;155&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cshb5F/btsOKQ9HcGr/S0ctkbkYL3htHBTieazxnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cshb5F/btsOKQ9HcGr/S0ctkbkYL3htHBTieazxnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cshb5F/btsOKQ9HcGr/S0ctkbkYL3htHBTieazxnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcshb5F%2FbtsOKQ9HcGr%2FS0ctkbkYL3htHBTieazxnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;658&quot; height=&quot;155&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;155&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;git merge main으로 main과 병합&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;병합 후에는 :q로 나와서 엔터누르면 합쳐진 거 확인&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;브랜치 삭제하는 법&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;141&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eayxqh/btsOS89G1V1/zXVO0U97Gak0f1qeiGzL3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eayxqh/btsOS89G1V1/zXVO0U97Gak0f1qeiGzL3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eayxqh/btsOS89G1V1/zXVO0U97Gak0f1qeiGzL3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feayxqh%2FbtsOS89G1V1%2FzXVO0U97Gak0f1qeiGzL3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;141&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;141&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;git branch -D 브랜치명&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;git branch --list 로 삭제되었는지 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Git/Github</category>
      <author>bullsoneshot</author>
      <guid isPermaLink="true">https://bulls0neshot.tistory.com/68</guid>
      <comments>https://bulls0neshot.tistory.com/entry/Branch-%EC%83%9D%EC%84%B1#entry68comment</comments>
      <pubDate>Sun, 22 Jun 2025 16:53:16 +0900</pubDate>
    </item>
    <item>
      <title>Repository 생성</title>
      <link>https://bulls0neshot.tistory.com/entry/%EB%A0%88%ED%8F%AC%EC%A7%80%ED%86%A0%EB%A6%AC-%EC%83%9D%EC%84%B1</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;497&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmIMCr/btsOKRscTF7/movrZDxo3lpYyyvMV7M94K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmIMCr/btsOKRscTF7/movrZDxo3lpYyyvMV7M94K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmIMCr/btsOKRscTF7/movrZDxo3lpYyyvMV7M94K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmIMCr%2FbtsOKRscTF7%2FmovrZDxo3lpYyyvMV7M94K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;975&quot; height=&quot;497&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;497&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot; data-start=&quot;187&quot; data-end=&quot;222&quot;&gt;그림 설명 (왼쪽: 데스크탑 PC / 오른쪽: 노트북)&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;224&quot; data-end=&quot;236&quot;&gt;공통 요소&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;237&quot; data-end=&quot;368&quot;&gt;
&lt;li data-start=&quot;237&quot; data-end=&quot;277&quot;&gt;&lt;b&gt;TIL&lt;/b&gt;: Today I Learned 폴더(프로젝트명)&lt;/li&gt;
&lt;li data-start=&quot;278&quot; data-end=&quot;309&quot;&gt;&lt;b&gt;로컬 저장소&lt;/b&gt;: 내 컴퓨터에 있는 Git 저장소&lt;/li&gt;
&lt;li data-start=&quot;310&quot; data-end=&quot;338&quot;&gt;&lt;b&gt;원격 저장소&lt;/b&gt;: GitHub에 있는 저장소&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;375&quot; data-end=&quot;403&quot;&gt;[노트북]에서의 작업 순서  ️ &lt;span&gt;&lt;/span&gt;(오른쪽)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot; data-start=&quot;405&quot; data-end=&quot;592&quot;&gt;
&lt;li data-start=&quot;405&quot; data-end=&quot;444&quot;&gt;&lt;b&gt;git init&lt;/b&gt;: 노트북에서 새로운 Git 저장소 생성&lt;/li&gt;
&lt;li data-start=&quot;445&quot; data-end=&quot;491&quot;&gt;&lt;b&gt;로컬 작업 및 커밋&lt;/b&gt;: add, commit 등으로 로컬에서 작업&lt;/li&gt;
&lt;li data-start=&quot;492&quot; data-end=&quot;549&quot;&gt;&lt;b&gt;git remote add origin &amp;lt;URL&amp;gt;&lt;/b&gt;: 원격 저장소 GitHub 주소 연결&lt;/li&gt;
&lt;li data-start=&quot;550&quot; data-end=&quot;592&quot;&gt;&lt;b&gt;git push&lt;/b&gt;: 노트북의 변경 사항을 GitHub에 업로드&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;599&quot; data-end=&quot;629&quot;&gt; (왼쪽) [데스크탑 PC]에서의 작업 순서&amp;nbsp;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot; data-start=&quot;631&quot; data-end=&quot;806&quot;&gt;
&lt;li data-start=&quot;631&quot; data-end=&quot;696&quot;&gt;&lt;b&gt;git clone &amp;lt;URL&amp;gt;&lt;/b&gt;: GitHub에 있는 원격 저장소를 복사해서 데스크탑에 로컬 저장소 생성&lt;/li&gt;
&lt;li data-start=&quot;697&quot; data-end=&quot;723&quot;&gt;&lt;b&gt;로컬에서 작업&lt;/b&gt;: 파일 수정 및 커밋&lt;/li&gt;
&lt;li data-start=&quot;724&quot; data-end=&quot;806&quot;&gt;&lt;b&gt;git push&lt;/b&gt;: 데스크탑에서 GitHub로 업로드 또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;git pull&lt;/b&gt;: GitHub에서 변경된 내용을 가져옴&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot; data-start=&quot;813&quot; data-end=&quot;824&quot;&gt;  흐름 요약&lt;/h2&gt;
&lt;div&gt;&lt;br /&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-start=&quot;826&quot; data-end=&quot;1021&quot;&gt;
&lt;tbody data-start=&quot;854&quot; data-end=&quot;1021&quot;&gt;
&lt;tr data-start=&quot;854&quot; data-end=&quot;894&quot;&gt;
&lt;td data-start=&quot;854&quot; data-end=&quot;860&quot; data-col-size=&quot;sm&quot;&gt;1️⃣&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-start=&quot;860&quot; data-end=&quot;894&quot;&gt;노트북에서 git init으로 TIL 프로젝트 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-start=&quot;895&quot; data-end=&quot;930&quot;&gt;
&lt;td data-start=&quot;895&quot; data-end=&quot;901&quot; data-col-size=&quot;sm&quot;&gt;2️⃣&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-start=&quot;901&quot; data-end=&quot;930&quot;&gt;원격 저장소(GitHub)에 연결하고 push&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-start=&quot;931&quot; data-end=&quot;983&quot;&gt;
&lt;td data-start=&quot;931&quot; data-end=&quot;937&quot; data-col-size=&quot;sm&quot;&gt;3️⃣&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-start=&quot;937&quot; data-end=&quot;983&quot;&gt;데스크탑에서는 git clone으로 GitHub에서 TIL 프로젝트 복사&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-start=&quot;984&quot; data-end=&quot;1021&quot;&gt;
&lt;td data-start=&quot;984&quot; data-end=&quot;989&quot; data-col-size=&quot;sm&quot;&gt;이후&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-start=&quot;989&quot; data-end=&quot;1021&quot;&gt;양쪽 모두 pull/push로 협업 및 동기화 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h1 style=&quot;color: #000000; text-align: justify;&quot; data-end=&quot;127&quot; data-start=&quot;107&quot;&gt;레포지토리 생성&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/h1&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;357&quot; data-start=&quot;327&quot; data-ke-size=&quot;size26&quot;&gt;1. GitHub에서 저장소(Repository) 만들기&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;845&quot; data-origin-height=&quot;193&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciNNWq/btsOIpYNJEy/f48V3bUOzxfljK91K5xKm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciNNWq/btsOIpYNJEy/f48V3bUOzxfljK91K5xKm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciNNWq/btsOIpYNJEy/f48V3bUOzxfljK91K5xKm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciNNWq%2FbtsOIpYNJEy%2Ff48V3bUOzxfljK91K5xKm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;845&quot; height=&quot;193&quot; data-origin-width=&quot;845&quot; data-origin-height=&quot;193&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-start=&quot;145&quot; data-end=&quot;217&quot;&gt;&lt;b&gt;GitHub 접속&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;후 오른쪽 상단의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;[New Repository]&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는 초록색&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;[New] 버튼&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;클릭&lt;/li&gt;
&lt;li data-start=&quot;218&quot; data-end=&quot;320&quot;&gt;저장소 이름을 지정하고, Public/Private 설정 후&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;[Create Repository]&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;클릭&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 원격 저장소가 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-start=&quot;327&quot; data-end=&quot;357&quot; data-ke-size=&quot;size26&quot;&gt;2. 로컬 폴더 구성 (Workspace 만들기)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;254&quot; data-origin-height=&quot;105&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHVpMM/btsOIxvuGNw/xyxjRDiQtv9iZk60L7yZ4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHVpMM/btsOIxvuGNw/xyxjRDiQtv9iZk60L7yZ4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHVpMM/btsOIxvuGNw/xyxjRDiQtv9iZk60L7yZ4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHVpMM%2FbtsOIxvuGNw%2FxyxjRDiQtv9iZk60L7yZ4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;254&quot; height=&quot;105&quot; data-origin-width=&quot;254&quot; data-origin-height=&quot;105&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot; data-start=&quot;359&quot; data-end=&quot;450&quot;&gt;
&lt;li data-start=&quot;359&quot; data-end=&quot;402&quot;&gt;내 PC에 notebook이라는 이름의 폴더 생성 (로컬 작업 공간)&lt;/li&gt;
&lt;li data-start=&quot;403&quot; data-end=&quot;450&quot;&gt;이 폴더 안에 작업할 .txt 파일을 넣는다. (예: work.txt)&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-start=&quot;457&quot; data-end=&quot;483&quot; data-ke-size=&quot;size26&quot;&gt;3. Git Bash로 로컬 저장소 만들기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;987&quot; data-origin-height=&quot;772&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kpc15/btsOKnFadtZ/dKmH3S14RocwieisYqDw4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kpc15/btsOKnFadtZ/dKmH3S14RocwieisYqDw4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kpc15/btsOKnFadtZ/dKmH3S14RocwieisYqDw4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKpc15%2FbtsOKnFadtZ%2FdKmH3S14RocwieisYqDw4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;987&quot; height=&quot;772&quot; data-origin-width=&quot;987&quot; data-origin-height=&quot;772&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot; data-start=&quot;485&quot; data-end=&quot;554&quot;&gt;
&lt;li data-start=&quot;485&quot; data-end=&quot;540&quot;&gt;Notebook 폴더 안에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Git Bash Here&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;마우스 우클릭 &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;[Git Bash Here]&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;선택&lt;/li&gt;
&lt;li data-start=&quot;541&quot; data-end=&quot;554&quot;&gt;아래 명령어 입력:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1750488554810&quot; class=&quot;dockerfile&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;git init                      # Git 저장소 초기화 (.git 생성됨)
git add work.txt              # txt 파일을 Git 스테이징 영역에 추가
git commit -m &quot;Add work.txt&quot;  # 첫 커밋 저장&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-start=&quot;725&quot; data-end=&quot;741&quot; data-ke-size=&quot;size26&quot;&gt;4. 커밋 로그 확인하기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhGpI5/btsOL2nTuXk/KCbCWQK1BvKKzyri9P4avK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhGpI5/btsOL2nTuXk/KCbCWQK1BvKKzyri9P4avK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhGpI5/btsOL2nTuXk/KCbCWQK1BvKKzyri9P4avK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhGpI5%2FbtsOL2nTuXk%2FKCbCWQK1BvKKzyri9P4avK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;848&quot; height=&quot;366&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;366&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1750488554810&quot; class=&quot;1c&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;git log&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;764&quot; data-end=&quot;861&quot;&gt;
&lt;li data-start=&quot;764&quot; data-end=&quot;828&quot;&gt;이 명령어를 입력하면 해당 로컬 저장소에서의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;모든 수정 내역(commit 로그)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;을 확인할 수 있다.&lt;/li&gt;
&lt;li data-start=&quot;829&quot; data-end=&quot;861&quot;&gt;작성자, 날짜, 메시지, 커밋 해시값 등이 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 style=&quot;color: #000000;&quot; data-start=&quot;107&quot; data-end=&quot;127&quot;&gt;&amp;nbsp;&lt;/h1&gt;</description>
      <category>Git/Github</category>
      <author>bullsoneshot</author>
      <guid isPermaLink="true">https://bulls0neshot.tistory.com/67</guid>
      <comments>https://bulls0neshot.tistory.com/entry/%EB%A0%88%ED%8F%AC%EC%A7%80%ED%86%A0%EB%A6%AC-%EC%83%9D%EC%84%B1#entry67comment</comments>
      <pubDate>Sat, 21 Jun 2025 15:50:44 +0900</pubDate>
    </item>
    <item>
      <title>GitHub란?</title>
      <link>https://bulls0neshot.tistory.com/entry/GitHub%EB%9E%80</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;GitHub란?&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KeIlh/btsOMGj6eYT/fw8WYuaNhKgL4zyfIt5nQK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KeIlh/btsOMGj6eYT/fw8WYuaNhKgL4zyfIt5nQK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KeIlh/btsOMGj6eYT/fw8WYuaNhKgL4zyfIt5nQK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKeIlh%2FbtsOMGj6eYT%2Ffw8WYuaNhKgL4zyfIt5nQK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;241&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;241&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;48&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;48&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GitHub&lt;/b&gt;는 &lt;b&gt;Git을 기반으로 한 원격 저장소 호스팅 서비스&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;113&quot; data-start=&quot;50&quot; data-ke-size=&quot;size16&quot;&gt;즉, Git으로 관리되는 소스 코드 저장소를 &lt;b&gt;웹에서 쉽게 관리하고 공유할 수 있도록 도와주는 플랫폼&lt;/b&gt;이다.&lt;/p&gt;
&lt;hr data-end=&quot;118&quot; data-start=&quot;115&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;140&quot; data-start=&quot;120&quot; data-ke-size=&quot;size23&quot;&gt;GitHub의 핵심 기능&lt;/h3&gt;
&lt;div&gt;&lt;br /&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;475&quot; data-start=&quot;142&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;475&quot; data-start=&quot;170&quot;&gt;
&lt;tr data-end=&quot;242&quot; data-start=&quot;170&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;202&quot; data-start=&quot;170&quot;&gt;&lt;b&gt;원격 저장소(Remote Repository)&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;242&quot; data-start=&quot;202&quot; data-col-size=&quot;sm&quot;&gt;로컬에서 작업한 내용을 업로드(push)하거나 다운로드(pull)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;285&quot; data-start=&quot;243&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;255&quot; data-start=&quot;243&quot;&gt;&lt;b&gt;버전 관리&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;285&quot; data-start=&quot;255&quot; data-col-size=&quot;sm&quot;&gt;Git을 통해 코드의 변경 이력을 기록하고 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;341&quot; data-start=&quot;286&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;298&quot; data-start=&quot;286&quot;&gt;&lt;b&gt;협업 기능&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;341&quot; data-start=&quot;298&quot; data-col-size=&quot;sm&quot;&gt;여러 개발자들이 브랜치를 만들어 작업 후 병합(Pull Request)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;378&quot; data-start=&quot;342&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;354&quot; data-start=&quot;342&quot;&gt;&lt;b&gt;이슈 관리&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;378&quot; data-start=&quot;354&quot; data-col-size=&quot;sm&quot;&gt;버그, 기능 요청 등을 기록하고 추적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;426&quot; data-start=&quot;379&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;391&quot; data-start=&quot;379&quot;&gt;&lt;b&gt;코드 리뷰&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;426&quot; data-start=&quot;391&quot; data-col-size=&quot;sm&quot;&gt;PR(Pull Request)로 서로의 코드를 검토 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;475&quot; data-start=&quot;427&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;441&quot; data-start=&quot;427&quot;&gt;&lt;b&gt;프로젝트 관리&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;475&quot; data-start=&quot;441&quot; data-col-size=&quot;sm&quot;&gt;Kanban 보드, 마일스톤, 프로젝트 관리 도구 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;480&quot; data-start=&quot;477&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;504&quot; data-start=&quot;482&quot; data-ke-size=&quot;size23&quot;&gt;GitHub를 사용하는 이유&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;640&quot; data-start=&quot;505&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;523&quot; data-start=&quot;505&quot;&gt;팀 프로젝트에서 협업하기 편함&lt;/li&gt;
&lt;li data-end=&quot;551&quot; data-start=&quot;524&quot;&gt;오픈소스 프로젝트를 공유하거나 참여할 수 있음&lt;/li&gt;
&lt;li data-end=&quot;581&quot; data-start=&quot;552&quot;&gt;포트폴리오처럼 &lt;b&gt;개발 이력을 공개&lt;/b&gt;할 수 있음&lt;/li&gt;
&lt;li data-end=&quot;640&quot; data-start=&quot;582&quot;&gt;자동 배포(GitHub Actions), 웹호스팅(GitHub Pages) 등 다양한 부가 기능 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;132&quot; data-start=&quot;94&quot; data-ke-size=&quot;size26&quot;&gt;Git vs GitHub vs Workspace 관계 정리&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yp0Jl/btsOKHrmrVE/f12YI7gkrYfAkKfoFiZQw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yp0Jl/btsOKHrmrVE/f12YI7gkrYfAkKfoFiZQw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yp0Jl/btsOKHrmrVE/f12YI7gkrYfAkKfoFiZQw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyp0Jl%2FbtsOKHrmrVE%2Ff12YI7gkrYfAkKfoFiZQw0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;488&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;&lt;br /&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 76px;&quot; border=&quot;1&quot; data-end=&quot;334&quot; data-start=&quot;134&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;334&quot; data-start=&quot;182&quot;&gt;
&lt;tr style=&quot;height: 22px;&quot; data-end=&quot;222&quot; data-start=&quot;182&quot;&gt;
&lt;td style=&quot;height: 22px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;195&quot; data-start=&quot;182&quot;&gt;&lt;b&gt;Git&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot; data-end=&quot;222&quot; data-start=&quot;195&quot; data-col-size=&quot;sm&quot;&gt;로컬에서 버전 관리를 수행하는 &lt;b&gt;도구&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot; data-end=&quot;277&quot; data-start=&quot;223&quot;&gt;
&lt;td style=&quot;height: 22px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;236&quot; data-start=&quot;223&quot;&gt;&lt;b&gt;GitHub&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot; data-end=&quot;277&quot; data-start=&quot;236&quot; data-col-size=&quot;sm&quot;&gt;Git 저장소를 &lt;b&gt;인터넷에 호스팅&lt;/b&gt;해주는 서비스 (원격 저장소)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot; data-end=&quot;334&quot; data-start=&quot;278&quot;&gt;
&lt;td style=&quot;height: 22px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;294&quot; data-start=&quot;278&quot;&gt;&lt;b&gt;Workspace&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot; data-end=&quot;334&quot; data-start=&quot;294&quot; data-col-size=&quot;sm&quot;&gt;사용자가 실제로 &lt;b&gt;코드를 작성&amp;middot;편집하는 폴더(작업 디렉토리)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;339&quot; data-start=&quot;336&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;367&quot; data-start=&quot;341&quot; data-ke-size=&quot;size23&quot;&gt;1. Git: &lt;b&gt;버전 관리 도구&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;559&quot; data-start=&quot;369&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;398&quot; data-start=&quot;369&quot;&gt;Git은 내 컴퓨터에서 코드를 관리하는 툴&lt;/li&gt;
&lt;li data-end=&quot;456&quot; data-start=&quot;399&quot;&gt;주된 기능: commit, branch, merge, log, checkout 등&lt;/li&gt;
&lt;li data-end=&quot;501&quot; data-start=&quot;457&quot;&gt;Git은 .git이라는 숨겨진 폴더를 통해 코드 변경 이력을 추적&lt;/li&gt;
&lt;li data-end=&quot;559&quot; data-start=&quot;502&quot;&gt;Git은 로컬(local)에서만 동작해도 사용 가능하지만, 협업을 위해선 원격 저장소가 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;564&quot; data-start=&quot;561&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;597&quot; data-start=&quot;566&quot; data-ke-size=&quot;size23&quot;&gt;2. GitHub: &lt;b&gt;원격 저장소 서비스&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;790&quot; data-start=&quot;599&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;659&quot; data-start=&quot;599&quot;&gt;GitHub는 Git 저장소를 &lt;b&gt;인터넷에 올려서 다른 사람들과 공유&lt;/b&gt;할 수 있게 해주는 플랫폼&lt;/li&gt;
&lt;li data-end=&quot;725&quot; data-start=&quot;660&quot;&gt;Git과 함께 사용하며, push, pull, clone 같은 명령어를 통해 GitHub와 소통&lt;/li&gt;
&lt;li data-end=&quot;790&quot; data-start=&quot;726&quot;&gt;협업 기능(Pull Request, Issue, 리뷰 등)이 탁월해서 오픈소스와 팀 프로젝트에 자주 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;795&quot; data-start=&quot;792&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;823&quot; data-start=&quot;797&quot; data-ke-size=&quot;size23&quot;&gt;3. Workspace (작업 공간)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;971&quot; data-start=&quot;825&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;882&quot; data-start=&quot;825&quot;&gt;Git이 관리하는 폴더 또는 디렉토리를 &lt;b&gt;워크스페이스&lt;/b&gt; 또는 &lt;b&gt;작업 디렉토리&lt;/b&gt;라고 부름&lt;/li&gt;
&lt;li data-end=&quot;907&quot; data-start=&quot;883&quot;&gt;여기서 코드 파일을 생성하고 수정&lt;/li&gt;
&lt;li data-end=&quot;971&quot; data-start=&quot;908&quot;&gt;이 작업공간은 Git에 의해 &lt;b&gt;Untracked &amp;rarr; Staged &amp;rarr; Committed&lt;/b&gt; 상태로 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;1006&quot; data-start=&quot;978&quot; data-ke-size=&quot;size26&quot;&gt;  실제 흐름 예시 (개발자 입장에서 보기)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 작업 공간 생성 &lt;/b&gt;&amp;rarr; 로컬에서 Git이 관리하는 워크스페이스(작업 공간)를 생성&lt;/p&gt;
&lt;pre id=&quot;code_1750487459527&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mkdir my_project 
cd my_project 
git init&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 코드 작성 및 커밋 &lt;/b&gt;&amp;rarr; 작업 공간에서 만든 파일을 Git으로 버전 관리&lt;/p&gt;
&lt;pre id=&quot;code_1750487502556&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo &quot;print('hello')&quot; &amp;gt; hello.py 
git add hello.py 
git commit -m &quot;Add hello script&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. GitHub에 원격 저장소 생성 후 연결 &lt;/b&gt;&amp;rarr; 로컬 Git 저장소를 GitHub와 연결하고 코드를 업로드&lt;/p&gt;
&lt;pre id=&quot;code_1750487544729&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git remote add origin https://github.com/username/my_project.
git git push -u origin main
# 다른 사람이 클론해서 작업 &amp;rarr; 다른 개발자가 GitHub에서 코드를 받아서 자신의 로컬 워크스페이스를 구성합
git clone https://github.com/username/my_project.git&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;1637&quot; data-start=&quot;1634&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1653&quot; data-start=&quot;1639&quot; data-ke-size=&quot;size26&quot;&gt;  핵심 관계 요약&lt;/h2&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1750487591421&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[작업 공간] &amp;larr; 실제 파일 작업
   │
   └─&amp;gt; [Git] &amp;larr; 버전 관리 수행 (commit, branch 등)
         │
         └─&amp;gt; [GitHub] &amp;larr; 온라인 협업/공유/백업&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1782&quot; data-start=&quot;1779&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1798&quot; data-start=&quot;1784&quot; data-ke-size=&quot;size26&quot;&gt;비유로 이해하면?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1915&quot; data-start=&quot;1800&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1835&quot; data-start=&quot;1800&quot;&gt;&lt;b&gt;Git&lt;/b&gt;은 내 컴퓨터에 설치된 &lt;b&gt;&amp;lsquo;타임머신 도구&amp;rsquo;&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1879&quot; data-start=&quot;1836&quot;&gt;&lt;b&gt;GitHub&lt;/b&gt;은 타임머신의 기록을 &amp;lsquo;클라우드에 저장&amp;rsquo;하는 공간&lt;/li&gt;
&lt;li data-end=&quot;1915&quot; data-start=&quot;1880&quot;&gt;&lt;b&gt;Workspace&lt;/b&gt;는 내가 실제로 &lt;b&gt;작업하는 책상&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Git/Github</category>
      <author>bullsoneshot</author>
      <guid isPermaLink="true">https://bulls0neshot.tistory.com/66</guid>
      <comments>https://bulls0neshot.tistory.com/entry/GitHub%EB%9E%80#entry66comment</comments>
      <pubDate>Sat, 21 Jun 2025 15:33:45 +0900</pubDate>
    </item>
    <item>
      <title>Git 명령어 흐름 정리</title>
      <link>https://bulls0neshot.tistory.com/entry/Git-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC</link>
      <description>&lt;h1 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;127&quot; data-start=&quot;107&quot;&gt;Git 명령어 흐름정리  &lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;349&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n8rzE/btsOLpXXoIU/kPJwIU0OKKDKv5rbPTPm8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n8rzE/btsOLpXXoIU/kPJwIU0OKKDKv5rbPTPm8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n8rzE/btsOLpXXoIU/kPJwIU0OKKDKv5rbPTPm8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn8rzE%2FbtsOLpXXoIU%2FkPJwIU0OKKDKv5rbPTPm8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;958&quot; height=&quot;349&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;349&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;192&quot; data-start=&quot;180&quot; data-ke-size=&quot;size26&quot;&gt;  Git이란?&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-end=&quot;259&quot; data-start=&quot;194&quot; data-ke-size=&quot;size16&quot;&gt;Git은 소스 코드의 변경 사항을 추적하고, 협업을 가능하게 해주는 분산 버전 관리 시스템(VCS)이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;410&quot; data-start=&quot;261&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;304&quot; data-start=&quot;261&quot;&gt;&lt;b&gt;저장소(Repository)&lt;/b&gt;: Git이 관리하는 코드 저장 공간&lt;/li&gt;
&lt;li data-end=&quot;356&quot; data-start=&quot;305&quot;&gt;&lt;b&gt;로컬 저장소(Local Repository)&lt;/b&gt;: 내 컴퓨터에 있는 Git 저장소&lt;/li&gt;
&lt;li data-end=&quot;410&quot; data-start=&quot;357&quot;&gt;&lt;b&gt;원격 저장소(Remote Repository)&lt;/b&gt;: GitHub와 같은 온라인 저장소&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;437&quot; data-start=&quot;417&quot; data-ke-size=&quot;size26&quot;&gt;  Git 설치 후 기본 설정&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-end=&quot;476&quot; data-start=&quot;439&quot; data-ke-size=&quot;size16&quot;&gt;터미널(명령 프롬프트)에서 아래 명령어로 사용자 정보를 설정한다:&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;pre id=&quot;code_1750485672610&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git config --global user.name &quot;사용자 이름&quot; git config --global user.email &quot;이메일 주소&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;618&quot; data-start=&quot;570&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;618&quot; data-start=&quot;570&quot;&gt;--global은 시스템 전체에 적용. (생략하면 해당 프로젝트에만 적용)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;639&quot; data-start=&quot;625&quot; data-ke-size=&quot;size26&quot;&gt; ️ 저장소 초기화&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-end=&quot;662&quot; data-start=&quot;641&quot; data-ke-size=&quot;size16&quot;&gt;새로운 Git 저장소를 만들고 싶다면:&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1750485672610&quot; class=&quot;ebnf&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git init&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;731&quot; data-start=&quot;686&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;731&quot; data-start=&quot;686&quot;&gt;현재 디렉토리에 .git 폴더가 생성되며, Git으로 관리됨을 의미한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;760&quot; data-start=&quot;738&quot; data-ke-size=&quot;size26&quot;&gt;  Git에서 파일의 4가지 상태&lt;/h2&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;상태설명
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1046&quot; data-start=&quot;762&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1046&quot; data-start=&quot;870&quot;&gt;
&lt;tr data-end=&quot;915&quot; data-start=&quot;870&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;884&quot; data-start=&quot;870&quot;&gt;Untracked&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;915&quot; data-start=&quot;884&quot;&gt;Git이 아직 추적하지 않는 새 파일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;960&quot; data-start=&quot;916&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;930&quot; data-start=&quot;916&quot;&gt;Unmodified&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;960&quot; data-start=&quot;930&quot;&gt;커밋 이후 변경되지 않은 상태&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1002&quot; data-start=&quot;961&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;975&quot; data-start=&quot;961&quot;&gt;Modified&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1002&quot; data-start=&quot;975&quot;&gt;수정되었지만 스테이지에 올라가지 않은 상태&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1046&quot; data-start=&quot;1003&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1017&quot; data-start=&quot;1003&quot;&gt;Staged&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1046&quot; data-start=&quot;1017&quot;&gt;커밋을 위해 준비된 상태 (add 완료됨)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;1070&quot; data-start=&quot;1053&quot; data-ke-size=&quot;size26&quot;&gt;  현재 파일 상태 확인&lt;/h2&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1750485672611&quot; class=&quot;ebnf&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git status&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-end=&quot;1142&quot; data-start=&quot;1096&quot; data-ke-size=&quot;size16&quot;&gt;파일들의 현재 상태(Untracked, Modified 등)를 확인할 수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;1170&quot; data-start=&quot;1149&quot; data-ke-size=&quot;size26&quot;&gt;➕ 파일을 Staging에 올리기&lt;/h2&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1750485672612&quot; class=&quot;dockerfile&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git add 파일명 # 특정 파일 추가 
git add . # 현재 디렉토리 내 모든 변경 사항 추가 
git add *.py # 확장자별(.py) 파일만 추가&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;1328&quot; data-start=&quot;1310&quot; data-ke-size=&quot;size26&quot;&gt;✅ 변경 이력 저장 (커밋)&lt;/h2&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1750485672612&quot; class=&quot;nginx&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git commit -m &quot;커밋 메시지&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1417&quot; data-start=&quot;1366&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1417&quot; data-start=&quot;1366&quot;&gt;현재 staging 상태의 변경 사항을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;스냅샷(Snapshot)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;으로 저장.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;1439&quot; data-start=&quot;1424&quot; data-ke-size=&quot;size26&quot;&gt;  원격 저장소 연결&lt;/h2&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;pre id=&quot;code_1750485672612&quot; class=&quot;cs&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;git remote add origin https://github.com/username/repo.git

# 기존 연결 제거
git remote remove origin

# 현재 연결된 원격 저장소 목록 확인
git remote -v&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;1658&quot; data-start=&quot;1634&quot; data-ke-size=&quot;size26&quot;&gt;  원격 저장소로 업로드 (Push)&lt;/h2&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;pre id=&quot;code_1750485672612&quot; class=&quot;gauss&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;git push origin main
git push https://github.com/username/repo.git main&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1788&quot; data-start=&quot;1762&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1788&quot; data-start=&quot;1762&quot;&gt;지정한 브랜치(main)로 업로드.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;1818&quot; data-start=&quot;1795&quot; data-ke-size=&quot;size26&quot;&gt;  원격 저장소 클론 (Clone)&lt;/h2&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1750485672612&quot; class=&quot;crmsh&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;git clone https://github.com/username/repo.git&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1919&quot; data-start=&quot;1880&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1919&quot; data-start=&quot;1880&quot;&gt;해당 저장소를 내 컴퓨터에 복사하면서 Git 저장소로 초기화.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;1946&quot; data-start=&quot;1926&quot; data-ke-size=&quot;size26&quot;&gt;  자주 사용하는 기타 명령어&lt;/h2&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;pre id=&quot;code_1750485672613&quot; class=&quot;mipsasm&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git log # 커밋 내역 확인 
git diff # 변경된 내용 확인 
git branch # 현재 브랜치 목록 확인 
git checkout -b 새브랜치명 # 새 브랜치 생성 및 이동 
git checkout 브랜치명 # 기존 브랜치로 이동&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;2151&quot; data-start=&quot;2133&quot; data-ke-size=&quot;size26&quot;&gt;  Git 기본 흐름 요약&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2288&quot; data-start=&quot;2153&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2189&quot; data-start=&quot;2153&quot;&gt;git init 또는 git clone 으로 시작&lt;/li&gt;
&lt;li data-end=&quot;2205&quot; data-start=&quot;2190&quot;&gt;파일 생성 및 수정&lt;/li&gt;
&lt;li data-end=&quot;2231&quot; data-start=&quot;2206&quot;&gt;git add로 스테이지에 올리기 (중간에 git status, git log 등을 통해 상태를 확인하며 진행)&lt;/li&gt;
&lt;li data-end=&quot;2260&quot; data-start=&quot;2232&quot;&gt;git commit으로 변경 사항 저장&lt;/li&gt;
&lt;li data-end=&quot;2288&quot; data-start=&quot;2261&quot;&gt;git push로 원격 저장소에 반영&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>Git/Git</category>
      <category>git명령어</category>
      <author>bullsoneshot</author>
      <guid isPermaLink="true">https://bulls0neshot.tistory.com/63</guid>
      <comments>https://bulls0neshot.tistory.com/entry/Git-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC#entry63comment</comments>
      <pubDate>Fri, 20 Jun 2025 13:15:29 +0900</pubDate>
    </item>
    <item>
      <title>단어 단위 전처리</title>
      <link>https://bulls0neshot.tistory.com/entry/%EB%8B%A8%EC%96%B4-%EB%8B%A8%EC%9C%84-%EC%A0%84%EC%B2%98%EB%A6%AC</link>
      <description>&lt;h1 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;0&quot;&gt;자연어 전처리란?&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;데이터를 깔끔하게 전처리 하는건 데이터 분석에서 굉장히 중요한 단계인데요. 자연어 데이터를 사용할 때도 마찬가지입니다. 전처리를 어떻게 하냐에 따라 분석 결과가 크게 달라집니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;먼저, 자연어 전처리가 필요한 예시를 한번 살펴볼게요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;Oh, Hi helo. Nice to meetyou.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;위 문장은 딱 보기에도 좋은 자연어 데이터라고 하기 어렵습니다. 먼저, 맞춤법과 띄어쓰기에 오류가 있네요. 이런 부분들은 올바른 표기로 변경해야 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;10&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;Oh, Hi&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;hello&lt;/b&gt;. Nice to&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;meet you&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;그리고 문장의 의미를 표현하는데 크게 기여하지 않는 단어는 삭제하는게 좋습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;14&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;&lt;s&gt;&lt;b&gt;Oh,&lt;/b&gt;&lt;/s&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Hi hello. Nice to meet you.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;Hi와 hello처럼 비슷한 의미가 중첩되어 사용된 경우에도 둘 중 하나를 제거하는 게 좋습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;18&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;Hi&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;s&gt;&lt;b&gt;hello&lt;/b&gt;&lt;/s&gt;. Nice to meet you.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;20&quot; data-ke-size=&quot;size16&quot;&gt;다음으로, 분석의 목적에 따라서는 컴퓨터가 자연어를 잘 이해할 수 있도록 하기 위해 각 단어에 숫자 인덱스를 부여하는게 필요하기도 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;22&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;{'Hi':0, 'Nice':1, 'to':2, 'meet':3, 'you':4}&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 데이터를 정제해서 분석에 활용하기 좋은 형태로 다듬는 과정을 자연어 전처리라고 합니다.&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;26&quot;&gt;자연어 전처리 과정들&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;28&quot; data-ke-size=&quot;size16&quot;&gt;자연어 전처리에는 다음과 같은 단계들이 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;30&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;토큰화: 자연어 데이터를 분석을 위한 작은 단위(토큰)로 분리합니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;정제: 분석에 큰 의미가 없는 데이터들을 제거합니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;정규화: 표현 방법이 다르지만 의미가 같은 단어들을 통합시킵니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;정수 인코딩: 컴퓨터가 이해하기 쉽도록 자연어 데이터에 정수 인덱스를 부여합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;35&quot; data-ke-size=&quot;size16&quot;&gt;참고로 자연어 전처리 방법에는 정해진 표준이 없습니다. 분석의 목적과 활용할 자연어 데이터의 특성에 따라 적용해야 하는 전처리 단계가 다 다르고, 각 단계를 적용하는 순서에도 차이가 생길 수 있죠. 그리고 원하는 전처리의 결과물이 어떤 형태여야 하는지도 분석하는 상황에 따라 다 다릅니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;35&quot; 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;style6&quot; /&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;분석에 활용하기 위한 자연어 데이터를 &lt;b&gt;코퍼스(Corpus)&lt;/b&gt;라고 합니다. 한국어로는 말뭉치라고 하는데요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;코퍼스를 분석에 활용하려면 먼저 의미있는 작은 단위로 나눠야 합니다. 여기에서 '의미있는 작은 단위'를 &lt;b&gt;토큰(Token)&lt;/b&gt;이라고 하고, 하나의 코퍼스를 여러 개의 토큰으로 나누는 과정을 &lt;b&gt;토큰화(Tokenization)&lt;/b&gt;라고 합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;30&quot;&gt;단어 토큰화 하기&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;32&quot; data-ke-size=&quot;size16&quot;&gt;NLTK의 word_tokenize()는 코퍼스를 파라미터로 넘겨서 토큰화 된 단어 리스트를 반환하는 함수입니다. 아래는 사용 예시인데요.&lt;/p&gt;
&lt;pre id=&quot;code_1739345135423&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;text = &quot;Although it's not a happily-ever-after ending, it is very realistic.&quot;

# 단어 토큰화
tokenized_words = word_tokenize(text)

print(tokenized_words)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YLkF5/btsMgybnXvj/lLxC28aU3VBYUS7HLku82k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YLkF5/btsMgybnXvj/lLxC28aU3VBYUS7HLku82k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YLkF5/btsMgybnXvj/lLxC28aU3VBYUS7HLku82k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYLkF5%2FbtsMgybnXvj%2FlLxC28aU3VBYUS7HLku82k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;152&quot; data-origin-width=&quot;1280&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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;44&quot; data-ke-size=&quot;size16&quot;&gt;실행 결과를 보면, it's는 it과 's로 분리됐고, happily-ever-after는 구분 없이 하나의 토큰이 됐습니다. 또, ending 뒤에 있던 콤마는 떨어져서 두 개의 토큰이 되었네요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;44&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;46&quot; data-ke-size=&quot;size16&quot;&gt;단어를 토큰으로 나누기 위한 기준은 다양한데요. 기본적으로 띄어쓰기가 기준이 됩니다. 그리고 문장 기호들도 기준이 될 수 있습니다. 위의 예시를 보니 word_tokenize()는 어퍼스트로피( ' )나 콤마( , )를 토큰화의 기준으로 사용하고 있습니다. 반면, 하이픈( - )은 토큰화의 기준으로 사용하지 않고 있네요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;46&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;48&quot; data-ke-size=&quot;size16&quot;&gt;어떤 기준을 가지고 단어 토큰화를 하는게 더 좋다고 할 수는 없습니다. 분석에 활용하려는 코퍼스의 특성에 따라 적절한 토큰화 기준을 사용하면 됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;0&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;정제(Cleaning)&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;코퍼스에는 아무 의미도 없거나 분석의 목적에 적합하지 않은 단어들도 포함됩니다. 이런 단어들은 전처리 과정에서 제거해야 하는데요. 그 과정을 &lt;b&gt;정제(Cleaning)&lt;/b&gt;라고 합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;자연어 데이터를 정제하는 방법은 여러가지인데요. 그 중에서도 등장 빈도, 단어 길이, 불용어 등을 기준으로 많이 사용합니다. 하나씩 살펴볼게요.&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;4&quot;&gt;등장 빈도가 적은 단어&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;코퍼스에 등장하는 빈도가 너무 적은 단어는 분석에 도움이 되지 않기 때문에 제거해야 합니다.&lt;/p&gt;
&lt;pre class=&quot;stylus&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;corpus = TEXT
print(corpus)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;471&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BcYy4/btsMgK3Rbts/kHWlQnqCrIUCzVes87Jrh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BcYy4/btsMgK3Rbts/kHWlQnqCrIUCzVes87Jrh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BcYy4/btsMgK3Rbts/kHWlQnqCrIUCzVes87Jrh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBcYy4%2FbtsMgK3Rbts%2FkHWlQnqCrIUCzVes87Jrh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;471&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;471&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;굉장히 긴 본문인데요. 해당 본문에서 등장 빈도가 2 이하인 단어들만 찾아 볼게요.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;from collections import Counter
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;ini&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;# 전체 단어 토큰 리스트
tokenized_words = word_tokenize(corpus)

# 파이썬의 Counter 모듈을 통해 단어의 빈도수 카운트하여 단어 집합 생성
vocab = Counter(tokenized_words)

# 빈도수가 2 이하인 단어 리스트 추출
uncommon_words = [key for key, value in vocab.items() if value &amp;lt;= 2]

# 빈도수가 2 이하인 단어들만 제거한 결과를 따로 저장
cleaned_by_freq = [word for word in tokenized_words if word not in uncommon_words]
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;43&quot; data-ke-size=&quot;size16&quot;&gt;한 부분씩 떼서 살펴보겠습니다. 먼저 단어의 빈도 계산에 사용할 Counter() 함수를 불러옵니다.&lt;/p&gt;
&lt;pre class=&quot;clean&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;# Counter모듈 import
from collections import Counter
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;50&quot; data-ke-size=&quot;size16&quot;&gt;빈도수 계산을 위해선 먼저 코퍼스를 단어 기준으로 토큰화 해야 하는데요. 앞에서 배운 word_tokenize() 함수로 단어 토큰화할게요.&lt;/p&gt;
&lt;pre class=&quot;ini&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;# 전체 단어 토큰 리스트
tokenized_words = word_tokenize(corpus)
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;57&quot; data-ke-size=&quot;size16&quot;&gt;다음으로, 단어의 등장 빈도를 Counter() 함수로 계산합니다. Counter()는 파라미터로 단어 리스트를 받고, 각 단어의 등장 빈도를 딕셔너리({단어: 등장 횟수}) 형태로 반환합니다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;# 파이썬의 Counter 모듈을 통해 단어의 빈도수 카운트하여 단어 집합 생성
vocab = Counter(tokenized_words)
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;64&quot; data-ke-size=&quot;size16&quot;&gt;vocab은 다음과 같은 형태로 저장되어 있습니다.&lt;/p&gt;
&lt;pre class=&quot;stylus&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;print(vocab)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;483&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLyoaM/btsMgxXQ460/lN7c0MqF5UHTZafFClJ1D1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLyoaM/btsMgxXQ460/lN7c0MqF5UHTZafFClJ1D1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLyoaM/btsMgxXQ460/lN7c0MqF5UHTZafFClJ1D1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLyoaM%2FbtsMgxXQ460%2FlN7c0MqF5UHTZafFClJ1D1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;483&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;483&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;72&quot; data-ke-size=&quot;size16&quot;&gt;생성된 단어 집합에서 빈도수가 2 이하인 단어 리스트만 추출하겠습니다. 해당 작업에는 list comprehension 문법을 사용할게요. 해당 문법이 익숙하지 않은 분들은 &lt;a style=&quot;color: #000000;&quot; href=&quot;https://www.codeit.kr/topics/what-is-oop/lessons/1968&quot;&gt;레슨&lt;/a&gt;에 있는 설명을 참고해 주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;# 빈도수가 2 이하인 단어 리스트 추출
uncommon_words = [key for key, value in vocab.items() if value &amp;lt;= 2]
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;79&quot; data-ke-size=&quot;size16&quot;&gt;등장 빈도가 2 이하인 단어 리스트가 몇 개인지 확인해 볼까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;stylus&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;print('빈도수가 2 이하인 단어 수:', len(uncommon_words))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;115&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Wbfe6/btsMgyibdIO/gK9E8nyNsmOTXdiV8cUWuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Wbfe6/btsMgyibdIO/gK9E8nyNsmOTXdiV8cUWuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Wbfe6/btsMgyibdIO/gK9E8nyNsmOTXdiV8cUWuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWbfe6%2FbtsMgyibdIO%2FgK9E8nyNsmOTXdiV8cUWuk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;115&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;115&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;87&quot; data-ke-size=&quot;size16&quot;&gt;총 234개의 단어가 포함되어 있네요. 이제 uncommon_words에 없는 단어들만 cleaned_words에 저장하면 3회 이상 등장한 단어들만 남게 되겠죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;cleaned_by_freq = [word for word in tokenized_words if word not in uncommon_words]

print('빈도수 3 이상인 토큰 수:', len(cleaned_by_freq))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;115&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1vkGW/btsMffqv42S/oJ1Y1jZz4D419wPEf5mqG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1vkGW/btsMffqv42S/oJ1Y1jZz4D419wPEf5mqG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1vkGW/btsMffqv42S/oJ1Y1jZz4D419wPEf5mqG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1vkGW%2FbtsMffqv42S%2FoJ1Y1jZz4D419wPEf5mqG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;115&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;115&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;97&quot; data-ke-size=&quot;size16&quot;&gt;등장 빈도가 3회 이상인 단어 총 306개가 cleaned_by_freq에 저장되었습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;99&quot; data-ke-size=&quot;size16&quot;&gt;위의 예시에서는 정제를 위한 기준을 등장 빈도 2회 이하로 설정했는데요. 코퍼스의 특징과 분석의 목적에 따라 몇 회 이하 등장하는 단어를 정제할지는 달라집니다. 단어 토큰이 많은 코퍼스라면 빈도수 10 이하인 경우를 제거할 수도 있죠.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;101&quot; data-ke-size=&quot;size16&quot;&gt;정제의 기준이 되는 숫자는 가장 적절한 숫자를 임의로 설정하면 됩니다. 다만, 보통 그런 최적의 정제 기준을 한번에 직관적으로 찾기는 어렵습니다. 그래서 같은 코퍼스를 여러번 전처리해 보고, 가장 좋은 결과가 나올 때의 정제 기준을 활용하는게 일반적입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;103&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 여러번 전처리 과정을 반복해서 가장 결과가 잘 나오는 기준을 찾는 방식은 정제뿐만 아니라 모든 전처리 단계에서 동일하게 적용됩니다. 앞으로는 설명을 위해 임의의 기준을 잡고 전처리를 하지만, 실제 데이터 분석시에는 꼭 여러번 전처리해서 결과를 비교해 봐야 한다는 점 꼭 기억해 주세요.&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;105&quot;&gt;길이가 짧은 단어&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;107&quot; data-ke-size=&quot;size16&quot;&gt;영어 단어의 경우, 알파벳 하나 또는 두개로 구성된 단어는 코퍼스의 의미를 나타내는데 중요하지 않을 가능성이 높습니다. 그래서 이런 단어들은 제거하는 게 좋습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;109&quot; data-ke-size=&quot;size16&quot;&gt;아래는 길이가 2 이하인 단어들을 제거하는 코드입니다. 단어 토큰들을 순회하면서 단어의 길이(len(word))가 2보다 큰 단어들만 cleaned_words에 넣으면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;# 길이가 2 이하인 단어 제거
cleaned_by_freq_len = []

for word in cleaned_by_freq:
    if len(word) &amp;gt; 2:
        cleaned_by_freq_len.append(word)
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;120&quot; data-ke-size=&quot;size16&quot;&gt;정제 전과 후의 결과를 비교해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;perl&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;# 정제 결과 확인
print('정제 전:', cleaned_by_freq[:10])
print('정제 후:', cleaned_by_freq_len[:10])
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8WAf7/btsMgOSywDi/wx0fOSxTcOjTvi12HX2iG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8WAf7/btsMgOSywDi/wx0fOSxTcOjTvi12HX2iG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8WAf7/btsMgOSywDi/wx0fOSxTcOjTvi12HX2iG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8WAf7%2FbtsMgOSywDi%2Fwx0fOSxTcOjTvi12HX2iG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;150&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;130&quot; data-ke-size=&quot;size16&quot;&gt;콤마, I, be 등 큰 의미를 갖지 않는 단어들이 잘 제거되었습니다.&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;132&quot;&gt;정제 함수 만들기&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;134&quot; data-ke-size=&quot;size16&quot;&gt;등장 빈도, 단어 길이 기준의 정제를 이후에 쉽게 사용할 수 있도록 따로 함수로 만들어 두겠습니다. 만들어진 함수는 preprocess.py라는 파일을 하나 따로 만들어서 추가해 두고 이후 레슨에서 필요할 때마다 불러와서 사용할게요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;136&quot; data-ke-size=&quot;size16&quot;&gt;이후 레슨에서 해당 함수들을 불러와 사용해야 하기 때문에, 실습 중인 주피터 노트북과 같은 디렉토리에 꼭 별도의 Python 파일을 만들어서 아래 함수들을 작성해 주세요.&lt;/p&gt;
&lt;p style=&quot;background-color: #000000; color: #000000; text-align: start;&quot; data-line=&quot;138&quot; data-ke-size=&quot;size16&quot;&gt;preprocess.p&lt;/p&gt;
&lt;pre class=&quot;properties&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;from collections import Counter

# 등장 빈도 기준 정제 함수
def clean_by_freq(tokenized_words, cut_off_count):
    # 파이썬의 Counter 모듈을 통해 단어의 빈도수 카운트하여 단어 집합 생성
    vocab = Counter(tokenized_words)
    
    # 빈도수가 cut_off_count 이하인 단어 set 추출
    uncommon_words = {key for key, value in vocab.items() if value &amp;lt;= cut_off_count}
    
    # uncommon_words에 포함되지 않는 단어 리스트 생성
    cleaned_words = [word for word in tokenized_words if word not in uncommon_words]

    return cleaned_words

# 단어 길이 기준 정제 함수
def clean_by_len(tokenized_words, cut_off_length):
    # 길이가 cut_off_length 이하인 단어 제거
    cleaned_by_freq_len = []
    
    for word in tokenized_words:
        if len(word) &amp;gt; cut_off_length:
            cleaned_by_freq_len.append(word)

    return cleaned_by_freq_len&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;코퍼스에서 큰 의미가 없거나, 분석 목적에서 벗어나는 단어들을 &lt;b&gt;불용어(stopword)&lt;/b&gt;라고 합니다. 이런 단어들은 정확한 분석을 방해하기 때문에 제거해야 합니다.&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;2&quot;&gt;불용어(Stopwords) 정의하기&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;불용어 제거는 다음과 같은 방식으로 진행됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;불용어를 모아 놓은 불용어 세트 준비&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;코퍼스의 각 단어 토큰이 불용어 세트에 포함되는지 확인&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;불용어 세트에 있는 단어 토큰은 분석에서 제외&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;불용어 제거에 활용되는 불용어 세트는 분석을 하는 사람이 코퍼스의 형태, 분석의 목적을 고려해 미리 만들어야 합니다. 그런데 매번 분석을 할 때만다 불용어 세트를 새롭게 만드는 것은 번거롭겠죠? 분명 코퍼스의 종류에 상관 없이 많이 사용되는 불용어들이 있기 때문에, 그런 것들은 미리 정의해 두고 필요할 때마다 불러와서 사용하면 훨씬 편리할 거 같습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;그런 용도로 NLTK는 기본 불용어 목록 179개를 제공합니다. 해당 불용어 목록은 stopwords.words('english')로 접근할 수 있습니다. 한번 확인해 볼게요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;stopwords.words('english')로 받아온 불용어들을 세트 자료형으로 저장해 주겠습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;clean&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;from nltk.corpus import stopwords
nltk.download('stopwords')
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;lisp&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;stopwords_set = set(stopwords.words('english'))

print('불용어 개수 :', len(stopwords_set))
print(stopwords_set)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyykCR/btsMgLuZyNg/TIEvTKSPKs5z3RwKKb3YG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyykCR/btsMgLuZyNg/TIEvTKSPKs5z3RwKKb3YG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyykCR/btsMgLuZyNg/TIEvTKSPKs5z3RwKKb3YG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyykCR%2FbtsMgLuZyNg%2FTIEvTKSPKs5z3RwKKb3YG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;502&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;30&quot; data-ke-size=&quot;size16&quot;&gt;일반적인 코퍼스에서 많이 사용되지만 분석에 크게 활용되지 않는 단어들이 불용어 세트에 포함되어 있네요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;32&quot; data-ke-size=&quot;size16&quot;&gt;경우에 따라서는 NLTK에서 기본 제공하는 불용어에 새로운 단어를 추가하거나, 일부 단어를 기본 불용어 목록에서 제거해야 할 수도 있죠. 이런 경우에는 세트 데이터 형식의 add(), remove() 함수를 사용하면 됩니다. 한번 stopwords_set에 원하는 불용어를 추가하고 삭제해 볼게요.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;stopwords_set.add('hello')
stopwords_set.remove('the')
stopwords_set.remove('me')

print('불용어 개수 :', len(stopwords_set))
print('불용어 출력 :',stopwords_set)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKaYBF/btsMf5gqYRF/MGbkl7kCn3gP8knNUXStz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKaYBF/btsMf5gqYRF/MGbkl7kCn3gP8knNUXStz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKaYBF/btsMf5gqYRF/MGbkl7kCn3gP8knNUXStz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKaYBF%2FbtsMf5gqYRF%2FMGbkl7kCn3gP8knNUXStz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;522&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;522&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;45&quot; data-ke-size=&quot;size16&quot;&gt;NLTK에서 받아온 불용어 세트에 hello가 추가되었고, the와 me가 제거되었습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;47&quot; data-ke-size=&quot;size16&quot;&gt;또, NLTK가 기본 제공하는 불용어가 아니라 새로운 불용어 세트를 정의해서 사용할 수도 있습니다.&lt;/p&gt;
&lt;pre class=&quot;stylus&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;my_stopwords_set = {'i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves'}

print(my_stopwords_set)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ncqY7/btsMfe6ganX/5gYqBOeIpPm47g5M8bWmN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ncqY7/btsMfe6ganX/5gYqBOeIpPm47g5M8bWmN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ncqY7/btsMfe6ganX/5gYqBOeIpPm47g5M8bWmN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FncqY7%2FbtsMfe6ganX%2F5gYqBOeIpPm47g5M8bWmN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;120&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;57&quot;&gt;불용어(Stopwords) 제거하기&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;59&quot; data-ke-size=&quot;size16&quot;&gt;등장 빈도와 단어 길이 기준으로 정제했던 cleaned_by_freq_len에서 불용어도 제거해 보겠습니다. cleaned_by_freq_len에 있는 토큰을 하나씩 순회하면서 단어가 불용어 세트에 있는지 확인하고, 없을 때에만 cleaned_words에 저장해 줄게요.&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;stop_words_set = set(stopwords.words('english'))

# 불용어 제거
cleaned_words = []

for word in cleaned_by_freq_len:
    if word not in stop_words_set:
        cleaned_words.append(word)
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;72&quot; data-ke-size=&quot;size16&quot;&gt;불용어 제거 후 남은 토큰이 얼마나 있는지 확인해 볼게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;# 불용어 제거 결과 확인
print('불용어 제거 전:', len(cleaned_by_freq_len))
print('불용어 제거 후:', len(cleaned_words))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjzjDC/btsMe2kHiha/PyYk84n1bnzWCKJKgmW561/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjzjDC/btsMe2kHiha/PyYk84n1bnzWCKJKgmW561/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjzjDC/btsMe2kHiha/PyYk84n1bnzWCKJKgmW561/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjzjDC%2FbtsMe2kHiha%2FPyYk84n1bnzWCKJKgmW561%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;166&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;82&quot; data-ke-size=&quot;size16&quot;&gt;102개의 불용어가 잘 제거됐습니다. 처음 코퍼스에서는 단어가 굉장히 많았는데, 정제 과정을 다 끝내고 나니 67개의 단어만 남았네요.&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;84&quot;&gt;불용어 처리 함수 만들기&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;86&quot; data-ke-size=&quot;size16&quot;&gt;불용어 처리를 위한 코드도 함수로 만들어 두겠습니다. 함수 이름은 clean_by_stopwords()로 하고, 단어 토큰화 된 토큰 리스트와 불용어 세트를 파라미터로 받아 정제된 토큰 리스트를 반환하도록 함수를 만들어 볼게요.&lt;/p&gt;
&lt;p style=&quot;background-color: #000000; color: #000000; text-align: start;&quot; data-line=&quot;88&quot; data-ke-size=&quot;size16&quot;&gt;preprocess.py&lt;/p&gt;
&lt;pre class=&quot;properties&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;# 불용어 제거 함수
def clean_by_stopwords(tokenized_words, stop_words_set):
    cleaned_words = []
    
    for word in tokenized_words:
        if word not in stop_words_set:
            cleaned_words.append(word)
            
    return cleaned_words&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;아래 단어들은 형태가 조금씩 다르지만 의미는 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;2&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;US, USA, U.S., America...&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 형태가 다르지만 같은 의미를 나타내는 단어들이 많아질수록 코퍼스는 복잡해지고 분석이 어려워집니다. 그래서 의미가 같은 단어라면 형태를 하나로 통일하는 게 좋습니다. 해당 과정을 &lt;b&gt;정규화(Normalization)&lt;/b&gt;라고 합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;정규화에는 여러 방법이 있는데요. 이번 레슨에서는 가장 보편적으로 사용되는 두 가지만 소개해 드릴게요.&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;8&quot;&gt;정규화 방법: 대소문자 통합&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;대부분의 프로그래밍 언어는 대소문자를 구분합니다. 그래서 코퍼스를 대문자나 소문자 중 하나로 통일하면 정규화가 됩니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;영어 문법 상 대문자는 특수한 상황에서만 사용되고, 보통은 소문자가 많이 사용됩니다. 따라서 대문자를 소문자로 바꾸는 게 일반적입니다. 해당 과정에는 파이썬의 문자열 내장함수인 lower()가 사용됩니다.&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;text = &quot;What can I do for you? Do your homework now.&quot;

# 소문자로 변환
print(text.lower())
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A8Fmr/btsMgvZ61UH/J5UOTAKOgWLmDMWIJYRfJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A8Fmr/btsMgvZ61UH/J5UOTAKOgWLmDMWIJYRfJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A8Fmr/btsMgvZ61UH/J5UOTAKOgWLmDMWIJYRfJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA8Fmr%2FbtsMgvZ61UH%2FJ5UOTAKOgWLmDMWIJYRfJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;120&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;do와 Do는 원래 형태가 달랐지만, 소문자로 변환하여 완전히 같은 형태가 되었습니다.&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;25&quot;&gt;정규화 방법: 규칙 기반 정규화&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;27&quot; data-ke-size=&quot;size16&quot;&gt;USA, US, U.S.는 형태가 다르지만 의미는 같습니다. 표준어는 아니지만 Umm과 Ummmm도 같은 의미이기 때문에 정규화할 수 있죠. 이런 단어들은 규칙을 정의해서 하나의 표현으로 통합할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;29&quot; data-ke-size=&quot;size16&quot;&gt;아래 코드는 US를 USA로, Ummmm을 Umm으로 통합하는 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;sml&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;# 동의어 사전
synonym_dict = {'US':'USA', 'U.S.':'USA', 'Ummm':'Umm', 'Ummmm':'Umm' }
text = &quot;She became a US citizen. Ummmm, I think, maybe and or.&quot;
normalized_words = []

# 단어 토큰화
tokenized_words = nltk.word_tokenize(text)

for word in tokenized_words:
    # 동의어 사전에 있는 단어라면, value에 해당하는 값으로 변환
    if word in synonym_dict.keys():
        word = synonym_dict[word]

    normalized_words.append(word)
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;48&quot; data-ke-size=&quot;size16&quot;&gt;한 부분씩 살펴볼게요. 먼저, 같은 의미를 가지는 단어들을 어떤 형태로 정규화할지 미리 정해야 합니다. 기준이 정해졌다면 정규화할 단어들을 짝지어 딕셔너리 형태의 동의어 사전을 만들어 줍니다. 그리고, 분석에 활용할 텍스트와 정규화된 단어들을 저장할 리스트 normalized_words도 만들어 줄게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;ini&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;# 동의어 사전
synonym_dict = {'US':'USA', 'U.S.':'USA', 'Ummm':'Umm', 'Ummmm':'Umm' }
text = &quot;She became a US citizen. Ummmm, I think, maybe and or.&quot;
normalized_words = []
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;57&quot; data-ke-size=&quot;size16&quot;&gt;다음으로, 문장을 단어 토큰화한 다음 토큰들을 순회하면서 동의어 사전의 키에 해당 단어가 포함되는지 확인합니다. 만약에 포함된다면 정규화할 단어로 바꿉니다.&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;# 단어 토큰화
tokenized_words = nltk.word_tokenize(text)

for word in tokenized_words:
    # 동의어 사전에 있는 단어라면, value에 해당하는 값으로 변환
    if word in synonym_dict.keys():
        word = synonym_dict[word]

    normalized_words.append(word)
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;71&quot; data-ke-size=&quot;size16&quot;&gt;결과를 확인해 볼게요.&lt;/p&gt;
&lt;pre class=&quot;gauss&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;# 결과 확인
print(normalized_words)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7pYs3/btsMfG2g2JQ/khKnJLhsk3Cf1CEiShqrgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7pYs3/btsMfG2g2JQ/khKnJLhsk3Cf1CEiShqrgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7pYs3/btsMfG2g2JQ/khKnJLhsk3Cf1CEiShqrgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7pYs3%2FbtsMfG2g2JQ%2FkhKnJLhsk3Cf1CEiShqrgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;137&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;80&quot; data-ke-size=&quot;size16&quot;&gt;US는 USA로, Ummmm은 Umm으로 잘 변경되었네요.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;0&quot;&gt;어간 추출이란?&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;특정한 단어의 핵심이 되는 부분을 &lt;b&gt;어간(Stem)&lt;/b&gt;이라고 합니다. 그리고 단어에서 어간을 찾아내는 것을 &lt;b&gt;어간 추출(Stemming)&lt;/b&gt;이라고 합니다. 서로 다른 형태의 단어들도 어간 추출을 하면 같은 단어로 통합되기 때문에 이를 정규화 방법 중 하나로 사용합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;아래는 어간 추출 알고리즘 중 하나인 포터 스테머 알고리즘(Porter Stemmer Algorithm)의 규칙 일부입니다. 단순히 어미만 잘라내는 방식으로 어간을 찾고 있는데요. 그렇기 때문에 사전에 없는 단어가 결과로 나오기도 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;alize &amp;rarr; al (Formalize &amp;rarr; Formal)&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;ational &amp;rarr; ate (Relational -&amp;gt; Relate)&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;ate &amp;rarr; 제거 (Activate -&amp;gt; Activ)&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;ment &amp;rarr; 제거 (Encouragement -&amp;gt; Encourage)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;예를 들면 Activate에서 ate를 제거해 찾은 어간 activ는 사전에 없는 단어입니다. ate를 제거하고 뒤에 e를 붙여줘야 완전한 단어가 되지만, 그렇게까지 섬세하게 처리해 주지는 못하고 있네요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;따라서 코퍼스의 특성이나 분석하는 상황에 따라 어간 추출을 하는게 적합한지를 잘 판단해야 합니다. 그렇지 않으면 분석에 활용돼야 하는 중요한 단어가 손실될 수 있습니다.&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;15&quot;&gt;NLTK로 어간 추출 하기&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;NLTK는 어간 추출을 위한 알고리즘으로 포터 스테머(Porter Stemmer)와 랭커스터 스테머(Lancaster Stemmer)를 제공합니다. 두 알고리즘은 어간 추출을 하는 기준이 미세하게 다르기 때문에 무엇을 사용하느냐에 따라 결과가 조금씩 달라집니다. 하지만 사용 방식은 거의 동일하기 때문에, 이번 레슨에서는 포터 스테머 알고리즘을 사용하는 방법만 자세히 알아 볼게요. 아래는 어간 추출을 위한 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;from nltk.stem import PorterStemmer
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;makefile&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;porter_stemmer = PorterStemmer()
text = &quot;You are so lovely. I am loving you now.&quot;
porter_stemmed_words = []

# 단어 토큰화
tokenized_words = nltk.word_tokenize(text)

# 포터 스테머의 어간 추출
for word in tokenized_words:
    stem = porter_stemmer.stem(word)
    porter_stemmed_words.append(stem)
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;37&quot; data-ke-size=&quot;size16&quot;&gt;한 부분씩 살펴볼게요. 먼저, 어간 추출을 하기 전에 단어 토큰화가 돼야합니다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;# 단어 토큰화
tokenized_words = nltk.word_tokenize(text)
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;44&quot; data-ke-size=&quot;size16&quot;&gt;다음으로, 토큰화 된 단어를 순회하며 어간을 추출하여 결과를 porter_stemmed_words에 추가합니다. 참고로, NLTK의 porter_stemmer.stem() 함수는 단어가 포터 스테머 알고리즘의 기준에 포함되면 추출된 어간을 반환하고, 그렇지 않은 경우에는 원래의 단어를 반환해 줍니다.&lt;/p&gt;
&lt;pre class=&quot;stata&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;# 포터 스테머의 어간 추출
for word in tokenized_words:
    stem = porter_stemmer.stem(word)
    porter_stemmed_words.append(stem)
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;53&quot; data-ke-size=&quot;size16&quot;&gt;어간 추출 결과를 한번 확인해 볼게요.&lt;/p&gt;
&lt;pre class=&quot;stylus&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;print('어간 추출 전 :', tokenized_words)
print('포터 스테머의 어간 추출 후:', porter_stemmed_words)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVjoTf/btsMfcU2roJ/JFcTjPfs3KXN5KwQ7q0zDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVjoTf/btsMfcU2roJ/JFcTjPfs3KXN5KwQ7q0zDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVjoTf/btsMfcU2roJ/JFcTjPfs3KXN5KwQ7q0zDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVjoTf%2FbtsMfcU2roJ%2FJFcTjPfs3KXN5KwQ7q0zDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;200&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;62&quot; data-ke-size=&quot;size16&quot;&gt;lovely와 loving이 love로 어간 추출 되었습니다. 서로 다른 두 개의 단어가 하나의 어간으로 정규화 되었네요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;64&quot; data-ke-size=&quot;size16&quot;&gt;지금까지 포터 스테머 알고리즘을 이용한 어간 추출 방법을 배웠는데요. 랭커스터 스테머 알고리즘은 동일한 코드에 적용하는 함수만 바꾸면 됩니다.&lt;/p&gt;
&lt;pre class=&quot;makefile&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;from nltk.stem import LancasterStemmer

lancaster_stemmer = LancasterStemmer()
text = &quot;You are so lovely. I am loving you now.&quot;
lancaster_stemmed_words = []

# 랭커스터 스테머의 어간 추출
for word in tokenized_words:
    stem = lancaster_stemmer.stem(word)
    lancaster_stemmed_words.append(stem)
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;79&quot; data-ke-size=&quot;size16&quot;&gt;랭커스터 스테머 알고리즘을 사용하면 결과가 조금 다르게 나오는데요. 꼭 각각의 알고리즘을 적용해 보고 차이를 비교해 보시기 바랍니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;81&quot; data-ke-size=&quot;size16&quot;&gt;그러면 어간 추출을 하는 코드도 하나의 함수로 만들어볼게요.&lt;/p&gt;
&lt;p style=&quot;background-color: #000000; color: #000000; text-align: start;&quot; data-line=&quot;83&quot; data-ke-size=&quot;size16&quot;&gt;preprocess.py&lt;/p&gt;
&lt;pre class=&quot;elm&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;from nltk.stem import PorterStemmer

# 포터 스테머 어간 추출 함수
def stemming_by_porter(tokenized_words):
    porter_stemmer = PorterStemmer()
    porter_stemmed_words = []

    for word in tokenized_words:
        stem = porter_stemmer.stem(word)
        porter_stemmed_words.append(stem)

    return porter_stemmed_words&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;2&quot;&gt;실습 준비하기&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;실습에는 IMDb 영화 리뷰 데이터를 사용하겠습니다. IMDb는 The Internet Movie Database의 약자로, 약 200만개 이상의 영화 관련 정보들이 저장되어 있는 데이터 베이스입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;tsv(Tab-separated values)는 데이터를 탭 기준으로 구분한 파일 형식입니다. 그동안 많이 사용했던 csv(Comma-separated values)는 콤마로 데이터를 구분했었죠? 하지만 자연어 데이터에는 콤마가 들어있는 경우가 많기 때문에 csv를 데이터 구분의 기준으로 사용하면 코퍼스의 형태가 망가질 수 있습니다. 그래서 자연어 데이터를 저장할 때에는 tsv 형식을 많이 사용합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;tsv 파일을 불러올 때에도 동일하게 read_csv() 함수를 사용합니다. 대신, delimiter 속성을 '\t'로 지정해야 합니다.&lt;/p&gt;
&lt;pre class=&quot;elm&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;import pandas as pd
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;df = pd.read_csv('imdb.tsv', delimiter='\\t')
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;22&quot; data-ke-size=&quot;size16&quot;&gt;데이터의 형태는 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;df
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;523&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wP1EA/btsMgyidUMN/WmC9QdkcOvRjSI858NjsD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wP1EA/btsMgyidUMN/WmC9QdkcOvRjSI858NjsD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wP1EA/btsMgyidUMN/WmC9QdkcOvRjSI858NjsD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwP1EA%2FbtsMgyidUMN%2FWmC9QdkcOvRjSI858NjsD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;523&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;523&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;30&quot; data-ke-size=&quot;size16&quot;&gt;실무에서는 자연어 데이터를 보통 Pandas 데이터 프레임 형태로 처리합니다. 본 레슨에서도 실무 상황과 동일하게 Pandas 데이터 프레임의 각 로우에 코퍼스들을 저장하고 실습을 진행하겠습니다.&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;32&quot;&gt;대소문자 통합&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;34&quot; data-ke-size=&quot;size16&quot;&gt;가장 먼저 정규화를 위해 코퍼스의 대소문자를 통합해 주겠습니다. 앞선 정규화 레슨에서 대소문자 통합은 보통 대문자를 소문자로 바꾼다고 했었죠? 해당 과정을 진행해 보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;prolog&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;df['review'] = df['review'].str.lower()
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;40&quot; data-ke-size=&quot;size16&quot;&gt;df['review']는 Pandas 시리즈 형식의 데이터인데요. 해당 데이터 형식으로 저장되어 있는 문자열들을 소문자로 변환하려면 str.lower() 를 사용하면 됩니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;42&quot; data-ke-size=&quot;size16&quot;&gt;소문자로 정규화가 잘 됐는지 확인해 보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;markdown&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;print(df['review'][0])
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccQgGl/btsMfjsL6az/5KoYWcthJGSQG8tUgO9PMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccQgGl/btsMfjsL6az/5KoYWcthJGSQG8tUgO9PMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccQgGl/btsMfjsL6az/5KoYWcthJGSQG8tUgO9PMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccQgGl%2FbtsMfjsL6az%2F5KoYWcthJGSQG8tUgO9PMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;317&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;50&quot; data-ke-size=&quot;size16&quot;&gt;모든 단어가 소문자로 잘 정규화 됐습니다.&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;52&quot;&gt;단어 토큰화&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;54&quot; data-ke-size=&quot;size16&quot;&gt;다음으로 전체 코퍼스를 단어로 토큰화해 보겠습니다. df['review']에 있는 모든 로우에 word_tokenize() 함수를 적용하면 되는데요. apply() 함수를 사용하면 그 작업을 쉽게 처리할 수 있습니다. apply()는 파라미터로 함수 이름을 전달하여 데이터 프레임 전체에 동일한 함수를 적용시켜 줍니다. 사용 방법은 아래와 같습니다.&lt;/p&gt;
&lt;pre class=&quot;prolog&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;df['word_tokens'] = df['review'].apply(word_tokenize)
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;60&quot; data-ke-size=&quot;size16&quot;&gt;단어 토큰화가 잘 됐는지 확인해 볼게요.&lt;/p&gt;
&lt;pre class=&quot;markdown&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;print(df['word_tokens'][0])
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B3oGZ/btsMfdTRAGB/AikocBKCRelmYBvx8fVwJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B3oGZ/btsMfdTRAGB/AikocBKCRelmYBvx8fVwJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B3oGZ/btsMfdTRAGB/AikocBKCRelmYBvx8fVwJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB3oGZ%2FbtsMfdTRAGB%2FAikocBKCRelmYBvx8fVwJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;422&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;68&quot; data-ke-size=&quot;size16&quot;&gt;토큰화가 잘 됐습니다.&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;70&quot;&gt;데이터 정제&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;72&quot; data-ke-size=&quot;size16&quot;&gt;데이터 정제 방법으로는 등장 빈도, 단어 길이, 불용어 세트를 사용하는 방법을 배웠었죠? 해당 내용들을 모두 활용해 볼게요. 각 코퍼스별로 등장 빈도가 1회 이하, 단어의 길이가 2 이하, 그리고 NLTK에서 기본 제공하는 불용어에 해당하는 단어들을 정제해 보겠습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;74&quot; data-ke-size=&quot;size16&quot;&gt;해당 과정은 preprocess.py 파일에 만들어 둔 함수 clean_by_freq(), clean_by_len(), clean_by_stopwords()를 사용하면 쉽게 처리할 수 있는데요. 불러오기 전에 꼭 아래 코드를 먼저 실행해야 합니다.&lt;/p&gt;
&lt;pre class=&quot;haml&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;%load_ext autoreload
%autoreload 2
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;81&quot; data-ke-size=&quot;size16&quot;&gt;ipynb 파일에서 직접 만든 파이썬 모듈(.py)을 불러와 사용할 때, 파이썬 모듈 파일이 중간에 수정되면 해당 내용이 자동으로 반영되지 않는 문제가 있습니다. 그래서, preprocess.py 파일을 수정할 때마다 주피터 노트북의 커널을 Restart해야 하는 번거로움이 있는데요. 그런 번거로움을 줄이기 위해 위의 코드를 먼저 실행해야 합니다. 관련된 자세한 사항은 &lt;a style=&quot;color: #000000;&quot; href=&quot;https://www.codeit.kr/tutorials/41/&quot;&gt;튜토리얼 레슨&lt;/a&gt;을 참고해 주세요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;83&quot; data-ke-size=&quot;size16&quot;&gt;그러면 불러온 함수들을 df['word_tokens']에 apply()로 적용해 볼게요.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;# .py 모듈 수정 시 자동 리로드
%load_ext autoreload
%autoreload 2

from preprocess import clean_by_freq
from preprocess import clean_by_len
from preprocess import clean_by_stopwords
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;sas&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;stopwords_set = set(stopwords.words('english'))

df['cleaned_tokens'] = df['word_tokens'].apply(lambda x: clean_by_freq(x, 1))
df['cleaned_tokens'] = df['cleaned_tokens'].apply(lambda x: clean_by_len(x, 2))
df['cleaned_tokens'] = df['cleaned_tokens'].apply(lambda x: clean_by_stopwords(x, stopwords_set))
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;103&quot; data-ke-size=&quot;size16&quot;&gt;만들어 둔 함수들을 데이터 프레임에 적용할 때 처음 보는 표현 방식이 사용됐는데요. lambda 파라미터: 표현식 형태로 사용된 이 부분을 &lt;b&gt;람다 함수&lt;/b&gt;라고 부릅니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;105&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 아래와 같이 파라미터로 받은 두 숫자를 더하는 함수가 있다고 가정해 볼게요.&lt;/p&gt;
&lt;pre class=&quot;ruby&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;def plus(a, b):
    return a+b
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;112&quot; data-ke-size=&quot;size16&quot;&gt;해당 함수는 람다 함수로 아래와 같이 표현할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;gml&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;lambda x, y: x + y
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;118&quot; data-ke-size=&quot;size16&quot;&gt;여러 줄로 작성해야 하는 함수의 내용을 람다 함수를 사용하면 한 줄로 간단하게 함수를 표현할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;120&quot; data-ke-size=&quot;size16&quot;&gt;위에서 사용된 예시로도 생각해 볼게요. 아래의 람다 함수는 clean_by_freq() 함수를 실행해 주는 하나의 함수입니다. 매개변수 x에 데이터프레임의 각 행에 있는 데이터가 들어와서 clean_by_freq(x, 1)을 실행한 결과를 리턴하는 함수인거죠.&lt;/p&gt;
&lt;pre class=&quot;perl&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;lambda x: clean_by_freq(x ,1)
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;126&quot; data-ke-size=&quot;size16&quot;&gt;apply()는 파라미터로 적용할 함수 이름 하나만 넣을 수 있기 때문에 clean_by_freq()처럼 두 개 이상의 파라미터가 필요한 함수를 써야 할 때에는 해당 함수를 실행하는 또 다른 함수를 람다식 형태로 만들어서 사용할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;128&quot; data-ke-size=&quot;size16&quot;&gt;적용한 결과도 한번 확인해 보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;markdown&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;print(df['cleaned_tokens'][0])
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpY1JV/btsMfPx6Wdc/0B6PUmui4c48OhCJ4KYYK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpY1JV/btsMfPx6Wdc/0B6PUmui4c48OhCJ4KYYK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpY1JV/btsMfPx6Wdc/0B6PUmui4c48OhCJ4KYYK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpY1JV%2FbtsMfPx6Wdc%2F0B6PUmui4c48OhCJ4KYYK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;134&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;136&quot; data-ke-size=&quot;size16&quot;&gt;길이, 빈도, 불용어 기준으로 잘 정제됐습니다. 실제로 분석에 중요하게 사용될 단어들만 남았네요.&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;138&quot;&gt;어간 추출&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;140&quot; data-ke-size=&quot;size16&quot;&gt;마지막으로 어간 추출을 이용해 정규화해 보겠습니다. 어간 추출 레슨에서 만들었던 stemming_by_porter() 함수를 df['cleaned_tokens']에 적용해 볼게요.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;from preprocess import stemming_by_porter
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;prolog&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;df['stemmed_tokens'] = df['cleaned_tokens'].apply(stemming_by_porter)
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;150&quot; data-ke-size=&quot;size16&quot;&gt;결과도 확인해 보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;markdown&quot; style=&quot;background-color: #000000; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;print(df['stemmed_tokens'][0])
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JPjS4/btsMg6SZLq6/7OYTPIskWD2qyKDuD9r7l0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JPjS4/btsMg6SZLq6/7OYTPIskWD2qyKDuD9r7l0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JPjS4/btsMg6SZLq6/7OYTPIskWD2qyKDuD9r7l0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJPjS4%2FbtsMg6SZLq6%2F7OYTPIskWD2qyKDuD9r7l0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;134&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;158&quot; data-ke-size=&quot;size16&quot;&gt;이전 레슨에서 어간 추출의 결과로는 사전에 없는 단어가 나올 수 있으니 사용할 때 주의해야 한다고 했었죠? 이 경우에도 'realli', 'movi' 처럼 잘못된 단어가 결과로 나오네요. 이렇게 잘못된 단어가 나올수도 있기 때문에, 어간 추출이 해당 코퍼스를 이용한 분석에 도움이 될지 잘 판단해서 사용해야 합니다. 이점 꼭 기억해 주세요.&lt;/p&gt;</description>
      <category>데이터분석/NLP</category>
      <category>출처:코드잇</category>
      <author>bullsoneshot</author>
      <guid isPermaLink="true">https://bulls0neshot.tistory.com/62</guid>
      <comments>https://bulls0neshot.tistory.com/entry/%EB%8B%A8%EC%96%B4-%EB%8B%A8%EC%9C%84-%EC%A0%84%EC%B2%98%EB%A6%AC#entry62comment</comments>
      <pubDate>Wed, 12 Feb 2025 16:27:40 +0900</pubDate>
    </item>
    <item>
      <title>자연어 처리란?</title>
      <link>https://bulls0neshot.tistory.com/entry/%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC%EB%9E%80</link>
      <description>&lt;h1 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;0&quot;&gt;자연어 처리란?&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;언어는 크게 인공어와 자연어로 나눌 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;인공어는 정보 전달을 위해 인위적으로 만들어진 언어입니다. 대표적으로 사람과 컴퓨터의 소통을 위해 만들어진 프로그래밍 언어가 있습니다. 반대로 사람들의 일상 생활에서 자연 발생된 언어를 자연어라고 합니다. 한국어, 영어, 중국어 등 사람들이 일상에서 사용하는 모든 언어는 자연어에 속합니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;자연어에는 다양한 정보들이 담겨있습니다. 그래서 잘 활용하면 재밌는 분석을 할 수 있는데요. 하지만 컴퓨터가 자연어의 의미를 제대로 파악하도록 하는건 쉽지 않습니다. 컴퓨터는 인공어로만 소통하기 때문에 자연어를 다루려면 별도의 처리 과정이 필요하죠.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;그 과정을 &lt;b&gt;자연어 처리(NLP; Natural Language Processing)&lt;/b&gt;라고 합니다. 자연어 데이터를 컴퓨터가 처리할 수 있는 형태로 가공하여 의미 있는 분석을 하는 모든 과정이 자연어 처리입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;자연어 처리의 하위 분야에는 &lt;b&gt;자연어 이해(NLU; Natural Language Understanding)&lt;/b&gt;와 &lt;b&gt;자연어 생성(NLG; Natural Language Generation)&lt;/b&gt;이 있는데요. 이름 그대로 자연어의 의미를 이해하고, 새로운 자연어를 생성하기 위한 기술들이 포함됩니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;자연어가 가진 감정을 파악하는 감성분석, 스팸메일을 분류하는 스팸 필터링은 자연어 이해 기술이 적용되고, 시나 신문 기사 등을 작성하는 인공지능에는 자연어 생성 기술이 적용되죠. 문서 자동 번역기나 인공지능 챗봇에는 자연어 이해와 생성 분야의 기술이 모두 적용됩니다. 이외에도 자연어 처리를 활용해 여러 어려운 문제들을 해결할 수 있습니다.&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;16&quot;&gt;자연어 처리를 하는 방법&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;자연어를 처리하는 방식에는 크게 규칙 기반 접근법(Rule Based Approach)과 통계 기반 접근법(Statistical Based Approach)이 있습니다.&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;20&quot; data-ke-size=&quot;size26&quot;&gt;규칙 기반 접근법(Rule Based Approach)&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;22&quot; data-ke-size=&quot;size16&quot;&gt;정해진 규칙을 통해 자연어를 처리하는 것을 &lt;b&gt;규칙 기반 접근법&lt;/b&gt;이라고 합니다. 예를 들어볼게요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;24&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;100일, 100미터, 100원&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;26&quot; data-ke-size=&quot;size16&quot;&gt;위의 표현들에는 앞에 숫자가 오고 뒤에 문자가 온다는 규칙성이 있습니다. 이 규칙성을 토대로 숫자 뒤에 '일'이 나오면 날짜, '미터'가 나오면 거리, '원'이 나오면 돈과 관련된 의미를 가진다는걸 알 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;28&quot; data-ke-size=&quot;size16&quot;&gt;규칙 기반 접근법은 일정한 패턴을 가지는 자연어에 대해서 안정적으로 좋은 성능을 낼 수 있기 때문에 실제 상용 서비스에서도 많이 활용되고 있습니다.&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;30&quot; data-ke-size=&quot;size26&quot;&gt;통계 기반 접근법(Statistical Based Approach)&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;32&quot; data-ke-size=&quot;size16&quot;&gt;하지만 자연어에는 일정한 규칙이 없는 경우도 많은데요. 이럴 땐 통계 기반 접근법을 사용할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;34&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 문서에서 가장 중요한 키워드가 무엇인지 찾고 싶은 상황이라 해 볼게요. 수많은 단어들 중 가장 중요한 단어는 어떻게 찾을 수 있을까요? 아마도 자주 등장하는 단어가 핵심 키워드일 가능성이 높겠죠? 또 다른 문서들에서는 잘 사용되지 않는데 유독 그 문서에서만 많이 사용된다면 해당 문서의 중요한 키워드일 것입니다. 이렇게 특정 단어의 출현 빈도를 통해 자연어의 중요도를 파악하는 것은 대표적인 통계 기반 접근법입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;36&quot; data-ke-size=&quot;size16&quot;&gt;그리고 머신러닝, 딥러닝을 활용한 자연어 처리 기법도 통계 기반 접근법입니다. 일관된 패턴을 파악하기 어려운 자연어에서도 유의미한 정보를 찾을 수 있기 때문에 많은 관심을 받고 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;36&quot; 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;style6&quot; /&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;36&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;컴퓨터가 자연어 데이터를 처리하도록 하는 건 쉽지 않은데요. 자연어가 가진 몇 가지 특성 때문에 그렇습니다. 본격적인 학습 전에 자연어 처리에 어떤 어려움이 있는지 간단하게 살펴볼게요.&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;2&quot;&gt;같은 자연어가 두 개 이상의 의미를 가지는 경우&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;아래와 같이 형태가 같더라도 여러 의미를 가지는 단어가 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;She had the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;lead&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;in a new film.&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;She found&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;lead&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;위 문장에서 공통으로 사용된 단어 lead는 '이끈다'와 '납'이라는 두 가지 의미를 가지는데요. 어떤 문장에서 어떤 의미로 사용되었는지가 표면적으로 나타나지 않기 때문에 문장의 정확한 의미를 모호하게 만듭니다. 만약에 lead를 이끈다라는 의미로만 알고 있다면 납이라는 뜻으로 사용된 문장의 의미는 제대로 해석하기 어렵겠죠?&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;또, 같은 문장이 여러 의미를 가지는 경우도 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;너는 웃으며 걸어가는 나에게 인사했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;위 문장은 아래와 같이 두 가지 의미로 해석됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;17&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;&lt;b&gt;너는 웃으며&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;걸어가는 나에게 인사했다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;너는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;웃으며 걸어가는&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;나에게 인사했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;20&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 중의적인 문장의 의미를 파악하는 건 사람에게도 쉽지 않은데요. 마찬가지로 컴퓨터도 중의적인 문장에 굉장히 취약합니다.&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;22&quot;&gt;다른 자연어가 같은 의미를 가지는 경우&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;자연어의 표기가 전혀 다르지만 같은 의미를 가지는 경우가 있습니다. 비슷한 의미의 단어가 많고, 문장의 표현 형식이 다양한 언어일수록 이런 경우가 많이 발생합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;26&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 아래 두 문장은 표현 방식이 다르지만 의미는 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;28&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;비행기가 1시에 떠날 예정입니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;비행기 출발 시간은 1시입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;31&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 동일한 의미를 다양한 방식으로 표현하는 걸 &lt;b&gt;패러프레이징(Paraphrasing)&lt;/b&gt;이라고 합니다. 그리고 패러프레이징 된 두 문장의 의미가 같다는 것을 컴퓨터에게 이해시키는 건 굉장히 어렵습니다.&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;33&quot;&gt;단어 간의 관계성&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;35&quot; data-ke-size=&quot;size16&quot;&gt;파랑과 빨강 중 분홍과 더 유사한 단어는 무엇일까요? 단어의 의미를 알고 있는 사람이라면 '빨강'이라고 쉽게 답할 수 있을 텐데요. 하지만 컴퓨터로는 이 작업을 처리하는 게 어렵습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;37&quot; data-ke-size=&quot;size16&quot;&gt;단어 간에는 의미를 기준으로 유사하거나, 다르거나, 포함되는 등 특정한 관계가 형성됩니다. 그리고, 그런 단어 사이의 관계를 잘 파악해야만 자연어의 의미를 제대로 해석할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;39&quot; data-ke-size=&quot;size16&quot;&gt;하지만 컴퓨터는 자연어의 의미를 직관적으로 받아들일 수 없습니다. 때문에 단어 간의 관계 정보를 컴퓨터가 파악하도록 하려면 복잡한 과정이 필요합니다.&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;41&quot;&gt;한국어 자연어 처리가 더 어려운 이유&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;43&quot; data-ke-size=&quot;size16&quot;&gt;특히 한국어는 다른 언어보다 자연어 처리가 더 어려운데요. 위에서 설명한 이유 외에도 한국어가 가지는 고유한 특성들 때문에 그렇습니다.&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;45&quot; data-ke-size=&quot;size26&quot;&gt;접사와 조사 처리&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;47&quot; data-ke-size=&quot;size16&quot;&gt;한국어는 교착어입니다. 교착어란 어근에 붙는 접사에 따라 의미가 변하는 언어를 뜻하는데요. 예를 들어, '잡히시었겠더라'라는 예문은 어근에 붙는 접사에 따라 다양한 의미가 추가된 경우에 해당합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;49&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;잡-: 어근&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;히-: 피동을 의미하는 접사&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;시-: 주체 높임을 의미하는 접사&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;었-: 과거 시제를 의미하는 접사&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;겠-: 추측을 의미하는 접사&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;더라: 전달을 의미하는 접사&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;56&quot; data-ke-size=&quot;size16&quot;&gt;또 어떤 조사가 붙냐에 따라서도 의미가 달라집니다. 예를 들어 '너가' '너를' '너의' 등은 '너' 뒤에 어떤 조사가 붙느냐에 따라 다른 의미를 갖게 됩니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;58&quot; data-ke-size=&quot;size16&quot;&gt;보통 자연어 처리를 하려면 어떠한 단어의 어근을 찾아서 사용하는 게 일반적입니다. 하지만 한국어는 어근에 붙는 접사와 조사의 종류가 다양하며 의미 차이에 큰 영향을 주기 때문에 컴퓨터로 깔끔하게 처리하기가 어렵습니다.&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;60&quot; data-ke-size=&quot;size26&quot;&gt;유연한 어순&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;62&quot; data-ke-size=&quot;size16&quot;&gt;한국어의 어순은 굉장히 유연합니다. 예를 들어 아래 세 문장은 모두 동일한 의미를 가지는데요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;64&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;나는 공부하러 간다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;공부하러 나는 간다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;나는 간다, 공부하러.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;68&quot; data-ke-size=&quot;size16&quot;&gt;심지어 주어를 생략하고 '공부하러 간다'라고만 해도 의미는 같습니다. 이렇게 유연한 어순 때문에 컴퓨터가 다음에 출현할 단어를 예측하는 게 어렵습니다.&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;70&quot; data-ke-size=&quot;size26&quot;&gt;잘 지켜지지 않는 띄어쓰기&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;72&quot; data-ke-size=&quot;size16&quot;&gt;한국어는 띄어쓰기를 철저하게 지키지 않아도 문장의 의미를 이해할 수 있습니다. 아래 문장도 띄어쓰기는 안돼있지만 무슨 의미인지는 알 수 있죠?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;74&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;나는오늘코드잇강의를들었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;76&quot; data-ke-size=&quot;size16&quot;&gt;하지만, 경우에 따라서는 띄어쓰기가 구분되지 않아 의미가 모호해지는 경우가 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;78&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit; color: #000000;&quot;&gt;아버지가방에들어가신다&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;80&quot; data-ke-size=&quot;size16&quot;&gt;위 문장은 '아버지가 방에 들어가신다'라는 의미일 텐데요. 만약 띄어쓰기가 잘못되면 '아버지 가방에 들어가신다'라는 이상한 문장이 되어 버립니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;82&quot; data-ke-size=&quot;size16&quot;&gt;그래서 한국어 자연어 데이터를 처리할 때에는 정확한 띄어쓰기가 되도록 먼저 처리해야 합니다. 그런데 컴퓨터가 문장의 띄어쓰기를 잘 처리하도록 하는 건 어려운 일입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a494f; text-align: start;&quot; data-line=&quot;84&quot; data-ke-size=&quot;size16&quot;&gt;한국어가 영어보다 다루기도 어렵고, 관련 자료나 도구도 주로 영어로 발전했습니다. 그래서 처음 자연어 처리를 배울 때에는 영어 텍스트를 다루는 게 조금 더 수월합니다.&lt;/p&gt;</description>
      <category>데이터분석/NLP</category>
      <author>bullsoneshot</author>
      <guid isPermaLink="true">https://bulls0neshot.tistory.com/61</guid>
      <comments>https://bulls0neshot.tistory.com/entry/%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC%EB%9E%80#entry61comment</comments>
      <pubDate>Wed, 12 Feb 2025 16:23:55 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기- 164671</title>
      <link>https://bulls0neshot.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%A1%B0%ED%9A%8C%EC%88%98%EA%B0%80-%EA%B0%80%EC%9E%A5-%EB%A7%8E%EC%9D%80-%EC%A4%91%EA%B3%A0%EA%B1%B0%EB%9E%98-%EA%B2%8C%EC%8B%9C%ED%8C%90%EC%9D%98-%EC%B2%A8%EB%B6%80%ED%8C%8C%EC%9D%BC-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0-164671</link>
      <description>&lt;h1 style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;[MySQL] 조회수가&amp;nbsp;가장&amp;nbsp;많은&amp;nbsp;중고거래&amp;nbsp;게시판의&amp;nbsp;첨부파일&amp;nbsp;조회하기&lt;/h1&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제 링크&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/164671&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/164671&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738139280522&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/164671&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gK0ET/hyX70mAGt5/l29HWmkQ4pfkIUn3xQ9zF0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/KOSJY/hyX7OzH4a2/SiKVTTK0QT6sTj0YUhABDK/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/164671&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/164671&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gK0ET/hyX70mAGt5/l29HWmkQ4pfkIUn3xQ9zF0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/KOSJY/hyX7OzH4a2/SiKVTTK0QT6sTj0YUhABDK/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;다음은 중고거래 게시판 정보를 담은 USED_GOODS_BOARD 테이블과 중고거래 게시판 첨부파일 정보를 담은 USED_GOODS_FILE 테이블입니다. USED_GOODS_BOARD 테이블은 다음과 같으며 BOARD_ID, WRITER_ID, TITLE, CONTENTS, PRICE, CREATED_DATE, STATUS, VIEWS은 게시글 ID, 작성자 ID, 게시글 제목, 게시글 내용, 가격, 작성일, 거래상태, 조회수를 의미합니다.&lt;br /&gt;&lt;br /&gt;USED_GOODS_FILE 테이블은 다음과 같으며 FILE_ID, FILE_EXT, FILE_NAME, BOARD_ID는 각각 파일 ID, 파일 확장자, 파일 이름, 게시글 ID를 의미합니다.&lt;/blockquote&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;USED_GOODS_BOARD와 USED_GOODS_FILE 테이블에서 조회수가 가장 높은 중고거래 게시물에 대한 첨부파일 경로를 조회하는 SQL문을 작성해주세요. 첨부파일 경로는 FILE ID를 기준으로 내림차순 정렬해주세요. 기본적인 파일경로는 /home/grep/src/ 이며, 게시글 ID를 기준으로 디렉토리가 구분되고, 파일이름은 파일 ID, 파일 이름, 파일 확장자로 구성되도록 출력해주세요. 조회수가 가장 높은 게시물은 하나만 존재합니다.&lt;/blockquote&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1081&quot; data-origin-height=&quot;638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dZiePI/btsL3rJ944o/SkqcOOiN0YOUhWKgvgzlj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dZiePI/btsL3rJ944o/SkqcOOiN0YOUhWKgvgzlj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dZiePI/btsL3rJ944o/SkqcOOiN0YOUhWKgvgzlj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdZiePI%2FbtsL3rJ944o%2FSkqcOOiN0YOUhWKgvgzlj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1081&quot; height=&quot;638&quot; data-origin-width=&quot;1081&quot; data-origin-height=&quot;638&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;오답 풀이&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;SELECT CONCAT('/home/grep/src/', B.BOARD_ID, '/', F.FILE_ID, '_', F.FILE_NAME, F.FILE_EXT) AS FILE_PATH
FROM USED_GOODS_BOARD AS B JOIN USED_GOODS_FILE AS F ON B.BOARD_ID = F.BOARD_ID
WHERE B.BOARD_ID = (
    SELECT BOARD_ID
    FROM USED_GOODS_BOARD
    ORDER BY VIEWS DESC
    LIMIT 1
);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;[잘못된 점]&lt;/h4&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;문제점 1:&lt;span&gt; 서브쿼리에서&amp;nbsp;VIEWS&amp;nbsp;컬럼이&amp;nbsp;NULL일&amp;nbsp;경우&amp;nbsp;오류&amp;nbsp;발생&amp;nbsp;가능&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;'ORDER BY VIEWS DESC LIMIT 1'을 사용할 때 모든 행의 VIEWS가 NULL인 경우 오류가 발생할 수 있음&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;'WHERE VIEWS IS NOT NULL'을 추가하여 VIEWS가 NULL이 아닌 데이터만 정렬하도록 설정.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;문제점 2: 서브쿼리&amp;nbsp;LIMIT&amp;nbsp;1이&amp;nbsp;여러&amp;nbsp;개의&amp;nbsp;동률이&amp;nbsp;있는&amp;nbsp;경우&amp;nbsp;예측&amp;nbsp;불가한&amp;nbsp;결과&amp;nbsp;반환&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;'ORDER BY VIEWS DESC LIMIT 1'을 사용할 때, 만약 VIEWS 값이 가장 높은 행이 여러 개일 경우 어떤 BOARD_ID가 선택될지 예측하기 어려움. (하단 예시)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1738144012079&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BOARD_ID  |  VIEWS
----------|-------
B0001     |  250
B0003     |  250
# 이 경우, B0001이 선택될지 B0003이 선택될지 보장되지 않음.&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;ORDER&amp;nbsp;BY&amp;nbsp;기준을&amp;nbsp;추가하여&amp;nbsp;BOARD_ID&amp;nbsp;기준으로도&amp;nbsp;정렬하면&amp;nbsp;일관된&amp;nbsp;결과를&amp;nbsp;얻을&amp;nbsp;수&amp;nbsp;있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;정답 코드&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1738139417264&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT CONCAT('/home/grep/src/',BOARD_ID,'/', FILE_ID, FILE_NAME, FILE_EXT) FILE_PATH
FROM USED_GOODS_FILE 
WHERE BOARD_ID = (
    SELECT BOARD_ID
    FROM USED_GOODS_BOARD 
    ORDER BY VIEWS DESC LIMIT 1
)
ORDER BY FILE_ID DESC;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;두 번째 SELECT 문을 제거&lt;/b&gt; (불필요한 중복 제거) &lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;여러 개의 SELECT 문을 실행하려면 각 SQL 문을 명확히 구분해야 합니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;첫 번째 쿼리는 정상적으로 실행되지만, 두 번째 쿼리는 불필요하게 반복되면서 실행 환경에 따라 오류가 발생할 가능성이 있음&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SQL/프로그래머스</category>
      <author>bullsoneshot</author>
      <guid isPermaLink="true">https://bulls0neshot.tistory.com/60</guid>
      <comments>https://bulls0neshot.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%A1%B0%ED%9A%8C%EC%88%98%EA%B0%80-%EA%B0%80%EC%9E%A5-%EB%A7%8E%EC%9D%80-%EC%A4%91%EA%B3%A0%EA%B1%B0%EB%9E%98-%EA%B2%8C%EC%8B%9C%ED%8C%90%EC%9D%98-%EC%B2%A8%EB%B6%80%ED%8C%8C%EC%9D%BC-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0-164671#entry60comment</comments>
      <pubDate>Wed, 29 Jan 2025 18:47:59 +0900</pubDate>
    </item>
  </channel>
</rss>