<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>VHAL_</title>
    <link>https://n1mss-e.tistory.com/</link>
    <description>내가 공부하려고 기록하는 기록장 ..</description>
    <language>ko</language>
    <pubDate>Fri, 3 Jul 2026 06:15:33 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>VHAL_</managingEditor>
    <item>
      <title>[HTTP] 3. http 기초</title>
      <link>https://n1mss-e.tistory.com/45</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;HTTP란 무엇인가&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;HTTP는 HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 프로토콜입니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;HTTP는 웹에서 이루어지는 모든 데이터 교환의 기초이며, &lt;b&gt;클라이언트-서버 프로토콜&lt;/b&gt;이기도 합니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클라이언트-서버 프로토콜이란 (보통 웹브라우저인) 수신자 측에 의해 요청이 초기화되는 프로토콜을 의미합니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. HTTP의 핵심 개념&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YkDeu/btsLmJM4B2y/uH6Sjse2tyD5y8TtDJlClk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YkDeu/btsLmJM4B2y/uH6Sjse2tyD5y8TtDJlClk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YkDeu/btsLmJM4B2y/uH6Sjse2tyD5y8TtDJlClk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYkDeu%2FbtsLmJM4B2y%2FuH6Sjse2tyD5y8TtDJlClk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;544&quot; height=&quot;143&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;250&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;클라이언트-서버 구조&lt;/b&gt;: 클라이언트가 요청(Request)을 보내면 서버가 응답(Response)을 반환합니다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b; text-align: start;&quot;&gt;클라이언트와 서버들은 (데이터 스트림과 대조적으로) 개별적인 메시지 교환에 의해 통신합니다. 보통 브라우저인 클라이언트에 의해 전송되는 메시지를 요청(&lt;/span&gt;requests&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b; text-align: start;&quot;&gt;)이라고 부르며, 그에 대해 서버에서 응답으로 전송되는 메시지를 응답(&lt;/span&gt;responses&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b; text-align: start;&quot;&gt;)이라고 부릅니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;무상태 프로토콜(Stateless)&lt;/b&gt;: 각 요청은 독립적으로 처리되며, 서버는 클라이언트 상태를 기억하지 않습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상태 유지인 Stateful은 항상 같은 서버로 유지되어야 하고, stateless는 중간에 서버가 장애나도 아무 서버나 호출해도 되는 중 스케일아웃-수평확장에 유리합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비연결성(Connectionless)&lt;/b&gt;: 요청-응답 후 연결을 종료하여 서버 자원을 효율적으로 관리합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TCP/IP 연결을 새로 맺어야 한다는 한계가 있습니다. (3 way handshake 시간 추가)&lt;/li&gt;
&lt;li&gt;웹 브라우저로 사이트를 요청하면 HTML 뿐만 아니라 자바스크립트, css, 추가 이미지 등 등 수 많은 자원이 함께 다운로드됩니다.&lt;/li&gt;
&lt;li&gt;현재에는 HTTP 지속 연결(Persistent Connections)로 문제 해결하였습니다.&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;987&quot; data-origin-height=&quot;631&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ucux9/btsLoaJksWI/Oko1NJkxICU9FqLKQzLfv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ucux9/btsLoaJksWI/Oko1NJkxICU9FqLKQzLfv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ucux9/btsLoaJksWI/Oko1NJkxICU9FqLKQzLfv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fucux9%2FbtsLoaJksWI%2FOko1NJkxICU9FqLKQzLfv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;462&quot; height=&quot;295&quot; data-origin-width=&quot;987&quot; data-origin-height=&quot;631&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;1060&quot; data-origin-height=&quot;620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xKKem/btsLnX4wOrl/7K7JTHIke4weBZ5JnWioPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xKKem/btsLnX4wOrl/7K7JTHIke4weBZ5JnWioPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xKKem/btsLnX4wOrl/7K7JTHIke4weBZ5JnWioPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxKKem%2FbtsLnX4wOrl%2F7K7JTHIke4weBZ5JnWioPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;470&quot; height=&quot;275&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. HTTP 요청 메시지&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP 요청 메시지는 클라이언트가 서버로 데이터를 요청할 때 사용하는 메시지 형식으로, 다음과 같은 구조를 가지고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;553&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6922d/btsLpexukjf/uZAUkrmnUGiT854jEh1VI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6922d/btsLpexukjf/uZAUkrmnUGiT854jEh1VI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6922d/btsLpexukjf/uZAUkrmnUGiT854jEh1VI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6922d%2FbtsLpexukjf%2FuZAUkrmnUGiT854jEh1VI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;364&quot; height=&quot;166&quot; data-origin-width=&quot;553&quot; data-origin-height=&quot;252&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Start Line (시작 라인)&lt;/b&gt;: 요청의 기본 정보를 나타냄.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Header (헤더)&lt;/b&gt;: 요청 관련 부가 정보를 포함.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Message Body (본문)&lt;/b&gt;: 실제 데이터를 전송(선택적).&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;✔️ &lt;b&gt;시작 라인 (Start Line)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 요청 메시지의 첫 번째 라인으로, 세 가지 구성 요소로 나뉩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drecjo/btsLnI7Cc4K/NL98LAwFiQA6XFScFjmrcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drecjo/btsLnI7Cc4K/NL98LAwFiQA6XFScFjmrcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drecjo/btsLnI7Cc4K/NL98LAwFiQA6XFScFjmrcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdrecjo%2FbtsLnI7Cc4K%2FNL98LAwFiQA6XFScFjmrcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;562&quot; height=&quot;143&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;308&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&gt;&lt;b&gt;HTTP 메서드&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트가 서버에서 수행할 동작을 지정.&lt;/li&gt;
&lt;li&gt;주요 메서드:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GET: 데이터 조회 요청.&lt;/li&gt;
&lt;li&gt;POST: 데이터 생성/처리 요청.&lt;/li&gt;
&lt;li&gt;PUT: 데이터 전체 수정.&lt;/li&gt;
&lt;li&gt;DELETE: 데이터 삭제.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;요청 대상(Request Target)&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요청할 리소스의 경로를 지정.&lt;/li&gt;
&lt;li&gt;예: /search?q=hello&amp;amp;hl=ko (절대 경로와 쿼리 파라미터 포함).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HTTP 버전&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요청에 사용된 HTTP 프로토콜의 버전.&lt;/li&gt;
&lt;li&gt;예: HTTP/1.1.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;✔️ 헤더 (Header)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 요청에 필요한 추가 정보를 전달하는 부분.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예: Host: www.google.com&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;1015&quot; data-origin-height=&quot;77&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZYV3o/btsLmqz62bh/4St6CFBJmy1fXf6klaKtQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZYV3o/btsLmqz62bh/4St6CFBJmy1fXf6klaKtQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZYV3o/btsLmqz62bh/4St6CFBJmy1fXf6klaKtQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZYV3o%2FbtsLmqz62bh%2F4St6CFBJmy1fXf6klaKtQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;609&quot; height=&quot;46&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;77&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&gt;주요 헤더:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Host&lt;/b&gt;: 요청을 보낼 서버의 도메인&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Content-Type&lt;/b&gt;: 본문 데이터의 형식 지정 (예: JSON, HTML)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;User-Agent&lt;/b&gt;: 클라이언트 정보 (브라우저, 앱 등)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Authorization&lt;/b&gt;: 인증 정보&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;✔️ &lt;b&gt;메시지 바디 (Message Body)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요청과 함께 전송되는 데이터로, POST, PUT 등의 메서드에서 주로 사용.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 전송할 데이터&lt;/li&gt;
&lt;li&gt;HTML 문서, 이미지, 영상, JSON 등등 byte로 표현할 수 있는 모든 데이터 전송 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. HTTP 응답 메시지&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; HTTP 응답 메시지는 서버가 클라이언트의 요청에 대한 결과를 전달하는 메시지로, 다음과 같은 구조를 가지고 있습니&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;510&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGfztg/btsLnjAfucm/qn5pA25G1ar7lT66lDzeS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGfztg/btsLnjAfucm/qn5pA25G1ar7lT66lDzeS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGfztg/btsLnjAfucm/qn5pA25G1ar7lT66lDzeS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGfztg%2FbtsLnjAfucm%2Fqn5pA25G1ar7lT66lDzeS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;241&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Start Line (시작 라인)&lt;/b&gt;: 응답 상태와 관련된 정보를 나타냄&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Header (헤더)&lt;/b&gt;: 응답의 부가 정보&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Message Body (본문)&lt;/b&gt;: 실제 응답 데이터(선택적)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✔️ 시작 라인 (Start Line)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bi29sM/btsLpbndH0M/Vz4WrWKg3bU6SQrH7M5nYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bi29sM/btsLpbndH0M/Vz4WrWKg3bU6SQrH7M5nYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bi29sM/btsLpbndH0M/Vz4WrWKg3bU6SQrH7M5nYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbi29sM%2FbtsLpbndH0M%2FVz4WrWKg3bU6SQrH7M5nYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;596&quot; height=&quot;158&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;263&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&gt;HTTP 상태 코드 : 요청 성공, 실패를 나타냄
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;200 : 성공&lt;/li&gt;
&lt;li&gt;400 : 클라이언트 요청 오류&lt;/li&gt;
&lt;li&gt;500 : 서버 내부 오류&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이유 문구: 사람이 이해할 수 있는 짧은 상태 코드 설명 글&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✔️ 헤더 (Header)&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jyaze/btsLoKJ8CMD/7YMX1NJKenGqt7JqfaMLz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jyaze/btsLoKJ8CMD/7YMX1NJKenGqt7JqfaMLz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jyaze/btsLoKJ8CMD/7YMX1NJKenGqt7JqfaMLz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJyaze%2FbtsLoKJ8CMD%2F7YMX1NJKenGqt7JqfaMLz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;353&quot; height=&quot;174&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;255&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTTP 전송에 필요한 모든 부가정보&lt;/li&gt;
&lt;li&gt;예) 메시지 바디의 내용, 메시지 바디의 크기, 압축, 인증, 요청 클라이언트(브라우저) 정보, 서버 애플리케이션 정보, 캐시 관리 정보...&lt;/li&gt;
&lt;li&gt;주요 헤더:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Content-Type&lt;/b&gt;: 응답 본문의 데이터 형식 지정 (예: JSON, HTML).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Content-Length&lt;/b&gt;: 응답 본문의 크기(바이트 단위).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Cache-Control&lt;/b&gt;: 클라이언트의 캐시 동작을 제어.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Set-Cookie&lt;/b&gt;: 클라이언트에 쿠키 저장 요청.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Server&lt;/b&gt;: 서버 정보.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✔️ 메시지 바디 (Message Body)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;476&quot; data-origin-height=&quot;229&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5qunh/btsLpeRM3Y4/e4E8nzBt9CDWsUiKX3Jer0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5qunh/btsLpeRM3Y4/e4E8nzBt9CDWsUiKX3Jer0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5qunh/btsLpeRM3Y4/e4E8nzBt9CDWsUiKX3Jer0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5qunh%2FbtsLpeRM3Y4%2Fe4E8nzBt9CDWsUiKX3Jer0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;310&quot; height=&quot;149&quot; data-origin-width=&quot;476&quot; data-origin-height=&quot;229&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 전송할 데이터&lt;/li&gt;
&lt;li&gt;HTML 문서, 이미지, 영상, JSON 등등 byte로 표현할 수 있는 모든 데이터 전송 가능&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>CS/WEB</category>
      <author>VHAL_</author>
      <guid isPermaLink="true">https://n1mss-e.tistory.com/45</guid>
      <comments>https://n1mss-e.tistory.com/45#entry45comment</comments>
      <pubDate>Thu, 19 Dec 2024 00:06:50 +0900</pubDate>
    </item>
    <item>
      <title>[HTTP] 2. URI Web Browser</title>
      <link>https://n1mss-e.tistory.com/44</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&amp;nbsp;URI란?&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;URI란 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;통합 자원 식별자(Uniform Resource Identifier)는 인터넷에 있는 자원을 어디에 있는지 자원 자체를 식별하는 방법입니다. URI의 하위개념으로는 URL, URN이 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&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;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JglVV/btsKN0WexwE/k7CeHzSuMEZPxpX6UiGgTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JglVV/btsKN0WexwE/k7CeHzSuMEZPxpX6UiGgTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JglVV/btsKN0WexwE/k7CeHzSuMEZPxpX6UiGgTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJglVV%2FbtsKN0WexwE%2Fk7CeHzSuMEZPxpX6UiGgTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;436&quot; height=&quot;398&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;398&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-origin-width=&quot;1008&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qeqh1/btsKPwTPNW5/FBrKfPQ7u6bbvmo0fmKOv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qeqh1/btsKPwTPNW5/FBrKfPQ7u6bbvmo0fmKOv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qeqh1/btsKPwTPNW5/FBrKfPQ7u6bbvmo0fmKOv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqeqh1%2FbtsKPwTPNW5%2FFBrKfPQ7u6bbvmo0fmKOv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;607&quot; height=&quot;271&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;URL&lt;/b&gt;은 &lt;b&gt;Locator&lt;/b&gt;를 의미하며 리소스가 있는 위치를 지정합니다. 반면에 &lt;b&gt;URN&lt;/b&gt;은 &lt;b&gt;Name&lt;/b&gt;을 의미하며 리소스에 이름을 부여하비다. 위치는 변할 수 있지만, 이름은 변하지 않습니다. 따라서 URN 이름만으로 실제 리소스를 찾을 수 있는 방법이 보편화되지 않았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;☁️ URL은?&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;URL&lt;/b&gt;은 네트워크 상에서 자원이 어디 있는지 위치를 알려주기 위한 규약입니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;즉, 컴퓨터 네트워크와 검색 메커니즘에서의 위치를 지정하는, 웹 리소스에 대한 참조라고 할 수 있습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;흔히 우리는 URL을 웹 사이트 주소로만 알고 있지만, URL은 웹 사이트 주소뿐만 아니라 컴퓨터 네트워크상의 자원을 모두 나타내는 표기법이며 해당 주소에 접속하려면 URL에 맞는 프로토콜(http, sftp, smp ..등)을 알아야 하고, 그와 동일한 프로토콜로 접속해야 합니다&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;URL의 문법&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;bull; scheme://[userinfo@]host[:port][/path][?query][#fragment]&lt;br /&gt;&amp;bull; https://www.google.com:443/search?q=hello&amp;amp;hl=ko&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로토콜 (http)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;의미: 어떤 방식으로 자원에 접근할 것인가 하는 약속&amp;nbsp; 규칙 (ex. http, https 등)&lt;/li&gt;
&lt;li&gt;http는 80포트, https는 443포트를 주로 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;호스트명(www.google.com)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;호스트명을 의미&lt;/li&gt;
&lt;li&gt;도메인명 또는 IP 주소를 직접 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;포트 번호(443)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;접속한 포트를 의미&lt;/li&gt;
&lt;li&gt;일반적으로 생략함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;path(/search)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리소스 경로를 의미하며 계층적 구조로 이루어짐&lt;/li&gt;
&lt;li&gt;ex. /home/file1.jpg&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;쿼리 파라미터(q=hello&amp;amp;hl=ko)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;key=value 형태&lt;/li&gt;
&lt;li&gt;?로 시작, &amp;amp;로 추가 가능 ?keyA=valueA&amp;amp;keyB=valueB&lt;/li&gt;
&lt;li&gt;query parameter, query string 등으로 불림, 웹서버에 제공하는 파라미터, 문자 형태&lt;/li&gt;
&lt;/ul&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-ke-size=&quot;size26&quot;&gt;&lt;b&gt;웹 브라우저 요청 흐름&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;957&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rMjKN/btsKPd1msVj/YoUld5GpPKtqAT9ddDrzk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rMjKN/btsKPd1msVj/YoUld5GpPKtqAT9ddDrzk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rMjKN/btsKPd1msVj/YoUld5GpPKtqAT9ddDrzk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrMjKN%2FbtsKPd1msVj%2FYoUld5GpPKtqAT9ddDrzk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;634&quot; height=&quot;300&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;URL 입력&lt;/b&gt;:&lt;br /&gt;사용자가 브라우저에 URL을 입력합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DNS 조회&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브라우저는 도메인 이름(www.google.com)을 &lt;b&gt;DNS 서버&lt;/b&gt;에 질의합니다.&lt;/li&gt;
&lt;li&gt;DNS 서버는 해당 도메인의 **IP 주소(200.200.200.2)**를 반환합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HTTPS 포트 생성&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브라우저는 IP 주소와 함께 **443번 포트(HTTPS용)**를 사용하여 구글 서버와 연결을 시도합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HTTP 요청 메시지 생성&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브라우저는 사용자의 요청(/search?q=hello&amp;amp;hl=ko)을 &lt;b&gt;HTTP 요청 메시지&lt;/b&gt;로 생성하여 서버에 전송합니다.&lt;/li&gt;
&lt;li&gt;이 과정에서 HTTPS를 사용하면 데이터가 암호화되어 전송됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;서버 응답&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버(200.200.200.2)는 요청을 처리한 후 결과를 브라우저로 반환합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결과 표시&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브라우저는 서버에서 받은 응답 데이터를 사용자에게 표시합니다(예: 구글 검색 결과 페이지).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CS/WEB</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>VHAL_</author>
      <guid isPermaLink="true">https://n1mss-e.tistory.com/44</guid>
      <comments>https://n1mss-e.tistory.com/44#entry44comment</comments>
      <pubDate>Wed, 20 Nov 2024 11:54:54 +0900</pubDate>
    </item>
    <item>
      <title>[HTTP] 1. Internet Network</title>
      <link>https://n1mss-e.tistory.com/43</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;** 해당 포스팅은 '[인프런] 김영한의 HTTP 웹 기본 지식' 강의 내용을 기록용으로 정리한 글입니다. HTTP의 매우 얕고 넓은 개념을 기록한 점 참고 부탁드리며, 구체적인 내용은 추후 다른 포스팅에서 작성할 예정입니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;IP란?&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;IP(Internet Protocol)&amp;nbsp;란 인터넷에 연결되어 있는 모든 장치들(컴퓨터, 서버 장비, 스마트폰 등)을 식별할 수 있도록 각각의 장비에게 부여되는 고유 주소입니다. &lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;IP의 주요 역할은?&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지정한 IP 주소 (IP Address)에 데이터 전달&lt;/li&gt;
&lt;li&gt;패킷 (Packet)이라는 통신 단위로 데이터 전달&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;1127&quot; data-origin-height=&quot;686&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JmTvd/btsKOcuolrJ/8ZKDsIFkoObcddr2KiF1Ik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JmTvd/btsKOcuolrJ/8ZKDsIFkoObcddr2KiF1Ik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JmTvd/btsKOcuolrJ/8ZKDsIFkoObcddr2KiF1Ik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJmTvd%2FbtsKOcuolrJ%2F8ZKDsIFkoObcddr2KiF1Ik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;397&quot; height=&quot;242&quot; data-origin-width=&quot;1127&quot; data-origin-height=&quot;686&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;IP 프로토콜의 한계는?&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;비연결성&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷 전송&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비신뢰성&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;중간에 패킷이 사라지면?&lt;/li&gt;
&lt;li&gt;패킷이 순서대로 안오면?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로그램 구분&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상이면?&lt;/li&gt;
&lt;/ul&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;TCP/IP란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TCP/IP를 알아보기 이전, 인터넷 프로토콜에 관련하여 간단하게 알아보겠습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;인터넷 프로토콜&lt;/b&gt;&lt;br /&gt;인터넷에서 컴퓨터들이 서로 정보를 주고 받는데 쓰이는 통신규약. &lt;br /&gt;여러가지 종류의 인터넷 프로토콜이 있으나 그 중 TCP/IP가 가장 많이 쓰이기 때문에 TCP/IP 프로토콜이라고 함께 부르는 경우가 많다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷 프로토콜은 다음과 같이 4계층으로 이루어져 있습니다. &lt;br /&gt;각 계층은 인터넷 통신에서 특정 역할을 담당하며, 데이터를 전송하고 수신하는 데 필요한 기능을 분리하여 정의합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;664&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VlXRD/btsKOJL2VV3/Nyciy2ZuwVGAYTCWRkHp5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VlXRD/btsKOJL2VV3/Nyciy2ZuwVGAYTCWRkHp5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VlXRD/btsKOJL2VV3/Nyciy2ZuwVGAYTCWRkHp5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVlXRD%2FbtsKOJL2VV3%2FNyciy2ZuwVGAYTCWRkHp5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;378&quot; height=&quot;186&quot; data-origin-width=&quot;664&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로토콜 계층에서 데이터는 어떻게 전달될까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터가 애플리케이션에서 생성되어 인터넷을 통해 전송되고, 서버에 도달하기까지의 과정을 간단하게 시각적으로 보여드리겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1036&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHYa0w/btsKNz4HD0D/kyloX2c7xaMiumusvfXf8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHYa0w/btsKNz4HD0D/kyloX2c7xaMiumusvfXf8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHYa0w/btsKNz4HD0D/kyloX2c7xaMiumusvfXf8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHYa0w%2FbtsKNz4HD0D%2FkyloX2c7xaMiumusvfXf8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;562&quot; height=&quot;283&quot; data-origin-width=&quot;1036&quot; data-origin-height=&quot;522&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;TCP/IP 정의&lt;/b&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;TCP/IP는 하나의 프로토콜이 아니라 &lt;b&gt;TCP와 IP를 합쳐&lt;/b&gt; 부르는 말입니다. TCP/IP를 사용한다는 것은 &lt;i&gt;&lt;b&gt;IP 주소 체계를 따라 목적지에 데이터를 전달하고, IP 라우팅을 통해 데이터가 올바른 경로로 도달하도록 한다는 의미입니다&lt;/b&gt;.&lt;/i&gt; 또한, TCP의 특징을 활용해 송신자와 수신자 간의 논리적 연결을 생성하고 데이터 전송의 신뢰성을 유지할 수 있도록 보장합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;즉, TCP/IP를 말한다는 것은 송신자가 수신자에게 IP 주소를 사용해 데이터를 전달하고, 데이터가 제대로 전달되었는지, 너무 빠르거나 느리지 않은지, 정상적으로 수신되었는지에 대해 이야기하는 것을 의미합니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&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;980&quot; data-origin-height=&quot;539&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0OY4Y/btsKNoWQG1M/5fqhQeUD89CkEpkmncfph1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0OY4Y/btsKNoWQG1M/5fqhQeUD89CkEpkmncfph1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0OY4Y/btsKNoWQG1M/5fqhQeUD89CkEpkmncfph1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0OY4Y%2FbtsKNoWQG1M%2F5fqhQeUD89CkEpkmncfph1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;402&quot; height=&quot;221&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;539&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;☁️&amp;nbsp;&lt;b&gt;TCP 특징&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TCP는 &lt;i&gt;&lt;b&gt;전송 제어 프로토콜 (Transmission Control&lt;/b&gt; Protocol)&lt;/i&gt;이며 현재는 대부분 TCP를 사용합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;연결지향 - TCP 3 way handshake (가상 연결)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;의미 : TCP/IP 프로토콜을 이용해서 통신을 하는 응용 프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴와 사전에 세션을 수립하는 과정&lt;/li&gt;
&lt;li&gt;SYN(접속 요청), ACK(요청 수락)을 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;데이터 전달 보증
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전송한 데이터를 잘 받았는지 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;순서 보장
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전송한 순서대로 도착&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;신뢰할 수 있는 프로토콜&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;☁️ &lt;b&gt;UDP 특징&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UDP는 &lt;i&gt;&lt;b&gt;사용자 데이터그램 프로토콜(User Datagram Protocol)&lt;/b&gt;&lt;/i&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;연결지향 X - TCP 3 way handshake X&lt;/li&gt;
&lt;li&gt;데이터 전달 보증 X&lt;/li&gt;
&lt;li&gt;순서 보장 X&lt;/li&gt;
&lt;li&gt;데이터 전달 및 순서가 보장되지 않지만, 단순하고 빠름&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추상적으로 정리하자면, IP와 거의 유사하지만, port와 체크섬 정도가 추가된 것입니다. 따라서 애플리케이션에서 추가 작업이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Port 란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;포트(port)는 '논리적인 접속장소'이며, 특히 인터넷 프로토콜인 TCP/IP를 사용할 때에는 &lt;/span&gt;클라이언트 프로그램이 네트워크 상의 특정 서버 프로그램을 지정하는 방법으로 사용됩니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;네트워크 상에서 통신을 할 때 IP를 토대로 해당 서버가 있는 컴퓨터에 접근하게 됩니다. 하지만 대부분의 경우 하나의 컴퓨터에는 여러 개의 서버가 실행될 수 있습니다. 이렇게 컴퓨터에 여러 개의 서버가 실행되고 있다면, 어느 서버에 접속해야 하는지 컴퓨터에게 알려주어야 합니다. 이때 사용되는 것이 바로 포트 번호입니다 !&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; 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;1057&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xIHQc/btsKMJmFb32/VEGUEZu7cO5fnMmiajMlsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xIHQc/btsKMJmFb32/VEGUEZu7cO5fnMmiajMlsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xIHQc/btsKMJmFb32/VEGUEZu7cO5fnMmiajMlsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxIHQc%2FbtsKMJmFb32%2FVEGUEZu7cO5fnMmiajMlsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;553&quot; height=&quot;315&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;602&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;1093&quot; data-origin-height=&quot;654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GL6jV/btsKOrrpVF7/vvR5xDRntboQHyKy7UEWLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GL6jV/btsKOrrpVF7/vvR5xDRntboQHyKy7UEWLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GL6jV/btsKOrrpVF7/vvR5xDRntboQHyKy7UEWLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGL6jV%2FbtsKOrrpVF7%2FvvR5xDRntboQHyKy7UEWLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;486&quot; height=&quot;291&quot; data-origin-width=&quot;1093&quot; data-origin-height=&quot;654&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;포트 번호의 범위는 ?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포트 번호는 0~65535번까지의 범위를 가집니다. 이 중 일부는 특정 용도로 예약되어 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;0~1023 (Well-Known Ports)&lt;/b&gt;: 표준화된 서비스와 프로토콜에 할당된 포트.&lt;br /&gt;예:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;80번: HTTP (웹 서버)&lt;/li&gt;
&lt;li&gt;443번: HTTPS (보안 웹 서버)&lt;/li&gt;
&lt;li&gt;25번: SMTP (메일 전송)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;1024~49151 (Registered Ports)&lt;/b&gt;: 특정 응용 프로그램에 등록된 포트.&lt;br /&gt;예: 3306번 (MySQL), 5432번 (PostgreSQL).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;49152~65535 (Dynamic/Private Ports)&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;DNS란?&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DNS(Domain Name System)는 도메인 이름과 IP 주소를 매핑하는 시스템입니다. 인터넷 상의 모든 장치는 고유한 IP 주소를 통해 통신합니다. 그러나 IP 주소는 숫자로 이루어져 있어 사용자가 기억하기 어렵기 때문에, 사람이 이해하기 쉬운 도메인 이름(예: www.google.com)을 사용할 수 있도록 DNS가 만들어졌습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;✔️ DNS의 주요 역할&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP는 기억하기 어려우며, 변경될 수 있습니다. DNS는 변경된 IP 주소를 도메인 이름에 자동으로 매핑하여, 사용자는 IP 주소 변경을 신경 쓰지 않고 도메인 이름만으로 서비스를 이용할 수 있습니다. 즉, 사용자에게는 도메인 이름만 제공되므로, IP 주소가 변경되어도 동일한 도메인 이름으로 서비스를 이용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;도메인 이름 &amp;rarr; IP 주소 변환&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 www.google.com과 같은 도메인 이름을 입력하면, DNS 서버가 이를 IP 주소(예: 142.250.190.78)로 변환하여 해당 웹사이트에 접근할 수 있도록 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용자 친화적인 인터넷 환경 제공&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IP 주소 대신 도메인 이름을 사용하므로 기억하기 쉽고, 직관적인 인터넷 사용이 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인터넷의 전화번호부 역할&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DNS는 도메인 이름과 IP 주소를 저장하고 관리하며, 인터넷 사용자가 원하는 웹사이트에 쉽게 연결될 수 있도록 돕습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>CS/Network</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>VHAL_</author>
      <guid isPermaLink="true">https://n1mss-e.tistory.com/43</guid>
      <comments>https://n1mss-e.tistory.com/43#entry43comment</comments>
      <pubDate>Tue, 19 Nov 2024 14:10:11 +0900</pubDate>
    </item>
    <item>
      <title>[Git] 02. Git Branch 전략</title>
      <link>https://n1mss-e.tistory.com/42</link>
      <description>&lt;h2 id=&quot;1-git-branch란&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Git Branch란?&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Git Branch는 &lt;b&gt;Git에서 코드를 분기하여 관리하는 개념&lt;/b&gt;입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Git에서는 기본적으로 master라는 하나의 브랜치를 가지고 있으며, 이 master 브랜치에서 새로운 브랜치를 만들어 작업을 진행합니다.&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/op5oD/btsKMconsNU/K3IQ8IG70zw9CZgrIEilKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/op5oD/btsKMconsNU/K3IQ8IG70zw9CZgrIEilKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/op5oD/btsKMconsNU/K3IQ8IG70zw9CZgrIEilKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fop5oD%2FbtsKMconsNU%2FK3IQ8IG70zw9CZgrIEilKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;675&quot; height=&quot;342&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;451&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;h3 style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;☁️ Git Branch 전략이란&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Git 브랜치 전략은 &lt;b&gt;여러 개발자가 하나의 저장소를 사용하는 환경에서 저장소를 효과적으로 활용하기 위한 work-flow&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;입니다. 개발 프로젝트를 효율적으로 관리하고, 코드 품질을 유지하며, 협업을 원활하게 하기 위해 브랜치를 사용하는 체계적인 방법이며 프로젝트의 규모와 팀의 협업 방식에 따라 다양한 전략을 사용할 수 있습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&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;b&gt;git branch 전략이 중요한 이유는?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만일 브랜치 전략이 없는 팀이라면, 어떤 상황이 발생할까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;저는 깃을 잘 모르고, 무작정 깃허브를 활용하여 협업 팀 프로젝트를 진행하였을 때 많은 문제점을 경험했었습니다 ..&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 브랜치가 최신 브랜치인지 알기 어려웠고, 팀원 사이에 소통이 부족했을 때 어디에 push를 해야 하고 어떤 브랜치를 끌어와야 하는지 혼란스러웠습니다. 또, 버그 수정을 할 때 어떤 브랜치를 기준으로 수정해야 할지 알기 어려웠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 문제점들을 다 겪으니 브랜치 전략 도입의 중요성을 꺠달을 수 있었습니다 ..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점은 각 전략마다 조금씩 차이가 있으며, 이 외에도 다양하지만 일부 요약하여 작성하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;동시 작업이 편하다&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 사람이 독립적으로 작업하고, 커밋을 할 때, 자신의 브랜치에서 변경 사항을 커밋하게 됩니다.&lt;/li&gt;
&lt;li&gt;브랜치가 병합될 때만 충돌을 해결하면 되니, 아무 규칙이 없는 것보다 충돌 시점이 명확해지기에 생산성을 높일 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;목적이 명확한 브랜치&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;애플리케이션의 상태에 몇 가지가 있는데, 안정된 프로덕션, 테스트 환경, 기능 추가 환경... 등이 있습니다. 여러 기능별 브랜치(안정된 버전의 코드만이 관리되는 브랜치, 테스트 환경을 위한 브랜치, 기능 추가를 위한 브랜치)를 네이밍을 통해 구분하면 각각의 브랜치에 대해서 추가적인 설명을 할 필요 없이 명확하게 관리할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;배포 파이프라인 관리가 편함&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브랜치가 네이밍으로 명확하게 구분이 되어있다면, 조건을 설정하기 쉽습니다.&lt;/li&gt;
&lt;li&gt;특정 타입의 브랜치에 push 되었을 때, pull request를 만들었을 때 같은 조건에 따른 스크립트를 만들어둔다면 CI/CD를 구축하기 쉽습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;버전 관리가 편리하다&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버에 문제가 생겼을 때, 어떤 브랜치로 돌아가서 롤백을 해야 하는지에 대한 것들이 명확합니다.&lt;/li&gt;
&lt;li&gt;안정된 브랜치가 어떤 것인지 명확하기에, 롤백 과정에 대한 의사결정을 줄일 수 있습니다.&lt;/li&gt;
&lt;/ul&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;☁️ Git Branch 전략의 종류는?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 브랜치 전략의 종류는 어떻게 될까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git Flow, Github Flow, GitLab Flow 등 이 외에도 다양하지만 주로 널리 사용디는 Git Flow와 Github Flow를 기준으로 설명드리겠습니다.&lt;/p&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;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Git Flow 전략&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&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;882&quot; data-origin-height=&quot;1102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcMfSz/btsKMaYpGVJ/JFKWOKK4Ln68C3Fucw7cXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcMfSz/btsKMaYpGVJ/JFKWOKK4Ln68C3Fucw7cXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcMfSz/btsKMaYpGVJ/JFKWOKK4Ln68C3Fucw7cXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcMfSz%2FbtsKMaYpGVJ%2FJFKWOKK4Ln68C3Fucw7cXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;621&quot; height=&quot;776&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;1102&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;기본적인 브랜치 이름은 feature, develop, release, hotfix, master 5가지로 구분됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;master, develop 2가지 브랜치는 '항시 유지되는 메인 브랜치'이며 feature, release, hotfiix 3가지 브랜치는 'merge되면 사라지는 보조 브랜치'입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; 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;1099&quot; data-origin-height=&quot;610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHTXfp/btsKLoJqhqj/W15PWGz4iB6cGi80FYTj61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHTXfp/btsKLoJqhqj/W15PWGz4iB6cGi80FYTj61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHTXfp/btsKLoJqhqj/W15PWGz4iB6cGi80FYTj61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHTXfp%2FbtsKLoJqhqj%2FW15PWGz4iB6cGi80FYTj61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;533&quot; height=&quot;296&quot; data-origin-width=&quot;1099&quot; data-origin-height=&quot;610&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;i&gt;&amp;nbsp;Git Flow 브랜치 구조&lt;/i&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Master: 라이브 서버에 제품으로 출시되는 브랜치&lt;/li&gt;
&lt;li&gt;Develop : 다음 출시 버전을 대비하여 개발하는 브랜치&lt;/li&gt;
&lt;li&gt;Feature : 추가 기능 개발 브랜치. Develop 브랜치에 들어감.&lt;/li&gt;
&lt;li&gt;Release : 다음 버전 출시를 준비하는 브랜치. Develop 브랜치를 Release 브랜치로 옮긴 후, QA와 테스트를 진행하고 Master 브랜치로 합친다.&lt;/li&gt;
&lt;li&gt;Hotfix : Master 브랜치에서 발생한 버그를 수정하는 브랜치&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;메인_브랜치&quot; data-ke-size=&quot;size18&quot;&gt;✔️ 메인 브랜치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;메인 브랜치는 &lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;master 브랜치&lt;/span&gt;&lt;/b&gt;와 &lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;develop 브랜치&lt;/span&gt;&lt;/b&gt; 두 종류를 말한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-origin-height=&quot;295&quot; data-origin-width=&quot;719&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-phocus=&quot;https://blog.kakaocdn.net/dn/ltmzh/btrlPn0RYiX/qSivFQwoY63XkW28XuBmWK/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/ltmzh/btrlPn0RYiX/qSivFQwoY63XkW28XuBmWK/img.png&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/ltmzh/btrlPn0RYiX/qSivFQwoY63XkW28XuBmWK/img.png&quot; data-fslightbox=&quot;gallery&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ltmzh/btrlPn0RYiX/qSivFQwoY63XkW28XuBmWK/img.png&quot; width=&quot;550&quot; data-phocus-index=&quot;3&quot; data-src=&quot;https://blog.kakaocdn.net/dn/ltmzh/btrlPn0RYiX/qSivFQwoY63XkW28XuBmWK/img.png&quot; data-srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fltmzh%2FbtrlPn0RYiX%2FqSivFQwoY63XkW28XuBmWK%2Fimg.png&quot; data-origin-height=&quot;295&quot; data-origin-width=&quot;719&quot; /&gt;&lt;/a&gt;&lt;/span&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;master 브랜치는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;배포 가능한 상태&lt;/span&gt;&lt;/b&gt;만을 관리하는 브랜치를 말하며,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;develop브랜치는 다음에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;배포할 것을 개발&lt;/span&gt;&lt;/b&gt;하는 브랜치이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;즉 develop 브랜치는 통합 브랜치의 역할을 하며, 평소에는 이 브랜치를 기반으로 개발을 진행합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;보조_브랜치&quot; data-ke-size=&quot;size18&quot;&gt;✔️ 보조 브랜치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;보조 브랜치는&lt;span&gt; &lt;/span&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;feature branch&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;를 말한다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-origin-height=&quot;410&quot; data-origin-width=&quot;720&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-phocus=&quot;https://blog.kakaocdn.net/dn/l7ghN/btrlEIzgZhO/Yr4Bq3K2Rdmo37VhmG9KBk/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/l7ghN/btrlEIzgZhO/Yr4Bq3K2Rdmo37VhmG9KBk/img.png&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/l7ghN/btrlEIzgZhO/Yr4Bq3K2Rdmo37VhmG9KBk/img.png&quot; data-fslightbox=&quot;gallery&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l7ghN/btrlEIzgZhO/Yr4Bq3K2Rdmo37VhmG9KBk/img.png&quot; width=&quot;550&quot; data-phocus-index=&quot;4&quot; data-src=&quot;https://blog.kakaocdn.net/dn/l7ghN/btrlEIzgZhO/Yr4Bq3K2Rdmo37VhmG9KBk/img.png&quot; data-srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl7ghN%2FbtrlEIzgZhO%2FYr4Bq3K2Rdmo37VhmG9KBk%2Fimg.png&quot; data-origin-height=&quot;410&quot; data-origin-width=&quot;720&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;가지가 뻗어나오는 곳&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: develop&lt;/li&gt;
&lt;li&gt;&lt;b&gt;뻗어나갔던 가지가 다시 합쳐지는 곳&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: develop&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이름 설정&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: master, develop, release-*, hotfix-*를 제외하기만 하면 자유롭게 이름 설정이 가능하다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;새로운 기능을 추가&lt;/b&gt;&lt;/span&gt;할 때 주로 사용하는 가지이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;master 브랜치에서 develop 브랜치를 만들었고,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;develop 브랜치에서 다시&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;feature 브랜치를 나눠 작업&lt;/span&gt;&lt;/b&gt;을 하고 있는 것을 그림을 통해 알 수 있다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;develop 브랜치에는 기존에 잘 작동하는 개발코드가 담겨있으며,&amp;nbsp;보조 브랜치는 새로 변경될 개발코드를 분리하고 각각 보존하는 역할을 한다. 즉, 보조 브랜치는&amp;nbsp;기능을 다 완성할 때까지 유지하고, 다 완성되면 develop 브랜치로 merge 하고 결과가 좋지 못하면 버리는 방향을 취한다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;보조 브랜치는 보통 개발자 저장소에만 있는 브랜치고, origin에는 push하지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 id=&quot;릴리즈_브랜치release_branch&quot; data-ke-size=&quot;size20&quot;&gt;✔️ 릴리즈 브랜치(release branch)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;릴리즈 브랜치&lt;/b&gt;는&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;배포를 위한 최종적인 버그 수정&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;등의 개발을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;수행&lt;/b&gt;하는 브랜치를 말한다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-origin-height=&quot;461&quot; data-origin-width=&quot;718&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-phocus=&quot;https://blog.kakaocdn.net/dn/bfrnW4/btrlKeQT8mr/Tw2TZEkr39sZIeoKUJES8k/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/bfrnW4/btrlKeQT8mr/Tw2TZEkr39sZIeoKUJES8k/img.png&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bfrnW4/btrlKeQT8mr/Tw2TZEkr39sZIeoKUJES8k/img.png&quot; data-fslightbox=&quot;gallery&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfrnW4/btrlKeQT8mr/Tw2TZEkr39sZIeoKUJES8k/img.png&quot; width=&quot;550&quot; data-phocus-index=&quot;5&quot; data-src=&quot;https://blog.kakaocdn.net/dn/bfrnW4/btrlKeQT8mr/Tw2TZEkr39sZIeoKUJES8k/img.png&quot; data-srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfrnW4%2FbtrlKeQT8mr%2FTw2TZEkr39sZIeoKUJES8k%2Fimg.png&quot; data-origin-height=&quot;461&quot; data-origin-width=&quot;718&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;가지가 뻗어나오는 곳&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: develop&lt;/li&gt;
&lt;li&gt;&lt;b&gt;뻗어나갔던 가지가 다시 합쳐지는 곳&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: develop, master&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이름 설정&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: release-*&lt;/li&gt;
&lt;li&gt;새로운&lt;span style=&quot;color: #ee2323;&quot;&gt; &lt;b&gt;제품을 배포&lt;/b&gt;&lt;/span&gt;하고자 할 때 사용하는 가지이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;develop 브랜치에 버전에 포함되는 기능이 merge 되었다면 QA를 위해 develop 브랜치에서부터 release 브랜치를 생성한다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;배포 가능한 상태가 되면 master 브랜치로 병합&lt;/b&gt;&lt;/span&gt;시키고,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;출시된 master 브랜치에 버전 태그(ex, v1.0, v0.2)를 추&lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;가&lt;/span&gt;&lt;/b&gt;한다. &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;release 브랜치에서 기능을 점검하며 발견한 버그 수정 사항은 develop 브랜치에도 적용해줘야 한다. &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;그러므로 배포 완료 후 develop 브랜치에 대해서도 merge 작업을 수행해야 한다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 id=&quot;핫픽스_브랜치hotfix_branch&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;✔️ 핫픽스 브랜치(hotfix branch)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;핫픽스 브랜치&lt;/b&gt;는&lt;span&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;배포한 버전에서 긴급하게 수정&lt;/span&gt;&lt;/b&gt;할 필요가 있을 때 master 브랜치에서 분리하는 브랜치를 말한다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-origin-height=&quot;514&quot; data-origin-width=&quot;717&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-phocus=&quot;https://blog.kakaocdn.net/dn/ct9FBn/btrlGJqMMST/JgZHcI2gO5IkcXwwMNckA0/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/ct9FBn/btrlGJqMMST/JgZHcI2gO5IkcXwwMNckA0/img.png&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/ct9FBn/btrlGJqMMST/JgZHcI2gO5IkcXwwMNckA0/img.png&quot; data-fslightbox=&quot;gallery&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ct9FBn/btrlGJqMMST/JgZHcI2gO5IkcXwwMNckA0/img.png&quot; width=&quot;550&quot; data-phocus-index=&quot;6&quot; data-src=&quot;https://blog.kakaocdn.net/dn/ct9FBn/btrlGJqMMST/JgZHcI2gO5IkcXwwMNckA0/img.png&quot; data-srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fct9FBn%2FbtrlGJqMMST%2FJgZHcI2gO5IkcXwwMNckA0%2Fimg.png&quot; data-origin-height=&quot;514&quot; data-origin-width=&quot;717&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;가지가 뻗어나오는 곳&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: master&lt;/li&gt;
&lt;li&gt;&lt;b&gt;뻗어나갔던 가지가 다시 합쳐지는 곳&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: develop, master&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이름 설정&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: hotfix-*&lt;/li&gt;
&lt;li&gt;제품에서 버그가 발생했을 경우에는 처리를 위해 이 가지로 해당 정보들을 모아준다. 버그에 대한 수정이 완료된 후에는 develop, master에 곧장 반영해주며 tag를 통해 관련 정보를 기록해둔다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;버그를 잡는 사람이 일하는 동안에도 다른 사람들은 develop 브랜치에서 하던 일을 계속할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 때 만든 hotfix 브랜치에서의 변경 사항은 develop 브랜치에도 merge 하여 문제가 되는 부분을 처리해줘야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;release 가지가 생성되어 관리되고 있는 상태라면 해당 가지에 hotfix정보를 병합시켜 다음번 배포 시 반영이 정상적으로 이루어질 수 있도록 해준다. &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;Hotfix는 보통 다급하게 버그를 고치기 위해 생성되는 가지이기 때문에 버그를 해결하면 보통 제거하는 일회성 가지다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h4 id=&quot;git_flow_흐름&quot; data-ke-size=&quot;size20&quot;&gt;&lt;i&gt;Git flow 흐름&lt;/i&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;앞에서 적었던 기본 구조 5개 중 가장 많이 사용되는 가지는 master와 develop가 되며 정상적인 프로젝트를 진행하기 위해서는 둘 모두를 운용해야 한다.&lt;/li&gt;
&lt;li&gt;나머지 feature, release, hotfix branch는 사용하지 않는다면 지우더라도 오류가 발생하지 않기 때문에 깔끔한 프로젝트 진행을 원한다면 지워뒀다가 해당 가지를 활용해야 할 상황이 왔을 때 만들어줘도 괜찮다.&lt;/li&gt;
&lt;li&gt;대부분의 작업은 develop에서 취합한다 생각하면 되며 테스트를 통해 정말 확실하게 더 이상 변동사항이 없다 싶을 때 master로의 병합을 진행하게 된다.&lt;/li&gt;
&lt;li&gt;master가 아닌 가지들은 master의 변동사항을 꾸준히 주시해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1-신규-기능-개발&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;1.&lt;/span&gt; 신규 기능 개발&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-origin-height=&quot;831&quot; data-origin-width=&quot;1137&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-phocus=&quot;https://blog.kakaocdn.net/dn/c4oHhU/btrlEsJEeue/Cao2ePzB1Bdx8OAH9eAKk0/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/c4oHhU/btrlEsJEeue/Cao2ePzB1Bdx8OAH9eAKk0/img.png&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/c4oHhU/btrlEsJEeue/Cao2ePzB1Bdx8OAH9eAKk0/img.png&quot; data-fslightbox=&quot;gallery&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4oHhU/btrlEsJEeue/Cao2ePzB1Bdx8OAH9eAKk0/img.png&quot; data-phocus-index=&quot;7&quot; data-src=&quot;https://blog.kakaocdn.net/dn/c4oHhU/btrlEsJEeue/Cao2ePzB1Bdx8OAH9eAKk0/img.png&quot; data-srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4oHhU%2FbtrlEsJEeue%2FCao2ePzB1Bdx8OAH9eAKk0%2Fimg.png&quot; data-origin-height=&quot;831&quot; data-origin-width=&quot;1137&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;개발자는&amp;nbsp;&lt;span style=&quot;color: #f3c000;&quot;&gt;develop&amp;nbsp;브랜치&lt;/span&gt;로부터 본인이 신규 개발할 기능을 위한&amp;nbsp;&lt;span style=&quot;color: #ef5369;&quot;&gt;feature&amp;nbsp;브랜치&lt;/span&gt;를 생성한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;feature&amp;nbsp;브랜치&lt;/span&gt;에서 기능을 완성하면&amp;nbsp;&lt;span style=&quot;color: #f3c000;&quot;&gt;develop&amp;nbsp;브랜치&lt;/span&gt;에 merge를 진행하게 된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;2-라이브-서버로-배포&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;2.&lt;/span&gt; 라이브 서버로 배포&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-origin-height=&quot;737&quot; data-origin-width=&quot;1132&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-phocus=&quot;https://blog.kakaocdn.net/dn/bLxHoz/btrlPoeoynz/U795uDv8y9GkT4tHtLdykK/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/bLxHoz/btrlPoeoynz/U795uDv8y9GkT4tHtLdykK/img.png&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bLxHoz/btrlPoeoynz/U795uDv8y9GkT4tHtLdykK/img.png&quot; data-fslightbox=&quot;gallery&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLxHoz/btrlPoeoynz/U795uDv8y9GkT4tHtLdykK/img.png&quot; data-phocus-index=&quot;8&quot; data-src=&quot;https://blog.kakaocdn.net/dn/bLxHoz/btrlPoeoynz/U795uDv8y9GkT4tHtLdykK/img.png&quot; data-srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLxHoz%2FbtrlPoeoynz%2FU795uDv8y9GkT4tHtLdykK%2Fimg.png&quot; data-origin-height=&quot;737&quot; data-origin-width=&quot;1132&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;feature 브랜치들이 모두 develop 브랜치에 merge 되었다면 QA를 위해&amp;nbsp;&lt;span style=&quot;color: #409d00;&quot;&gt;release&amp;nbsp;브랜치&lt;/span&gt;를 생성한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;release&amp;nbsp;브랜치를 통해 오류가 확인된다면&amp;nbsp;release&amp;nbsp;브랜치 내에서 수정을 진행한다.&lt;/li&gt;
&lt;li&gt;QA와 테스트를 모두 통과했다면, 배포를 위해&amp;nbsp;&lt;span style=&quot;color: #409d00;&quot;&gt;release&amp;nbsp;브랜치&lt;/span&gt;를&amp;nbsp;&lt;span style=&quot;color: #0593d3;&quot;&gt;master&amp;nbsp;브랜치&lt;/span&gt; 쪽으로 merge하며,&lt;/li&gt;
&lt;li&gt;만일&amp;nbsp;release&amp;nbsp;브랜치 내부에서 오류 수정이 진행되었을 경우 동기화를 위해&amp;nbsp;&lt;span style=&quot;color: #f3c000;&quot;&gt;develop&amp;nbsp;브랜치&lt;/span&gt; 쪽에도 merge를 진행한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;3-배포-후-관리&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;3.&lt;/span&gt; 배포 후 관리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-origin-height=&quot;703&quot; data-origin-width=&quot;1127&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-phocus=&quot;https://blog.kakaocdn.net/dn/bw4I9Q/btrlOVXIxW0/zf8ol3GOUpRdUAEfyduKZ0/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/bw4I9Q/btrlOVXIxW0/zf8ol3GOUpRdUAEfyduKZ0/img.png&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bw4I9Q/btrlOVXIxW0/zf8ol3GOUpRdUAEfyduKZ0/img.png&quot; data-fslightbox=&quot;gallery&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bw4I9Q/btrlOVXIxW0/zf8ol3GOUpRdUAEfyduKZ0/img.png&quot; data-phocus-index=&quot;9&quot; data-src=&quot;https://blog.kakaocdn.net/dn/bw4I9Q/btrlOVXIxW0/zf8ol3GOUpRdUAEfyduKZ0/img.png&quot; data-srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbw4I9Q%2FbtrlOVXIxW0%2Fzf8ol3GOUpRdUAEfyduKZ0%2Fimg.png&quot; data-origin-height=&quot;703&quot; data-origin-width=&quot;1127&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;만일 배포된 라이브 서버(master)에서 버그가 발생된다면,&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;hotfix&amp;nbsp;브랜치&lt;/span&gt;를 생성하여 버그 픽스를 진행한다.&lt;/li&gt;
&lt;li&gt;그리고 종료된 버그 픽스를 &lt;span style=&quot;color: #0593d3;&quot;&gt;master&lt;/span&gt;와&amp;nbsp;&lt;span style=&quot;color: #f3c000;&quot;&gt;develop&lt;/span&gt;&amp;nbsp;양 쪽에 merge하여 동기화 시킨다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Github Flow 전략&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&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;1092&quot; data-origin-height=&quot;538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4wuH8/btsKMELINxK/k1fgjBl4oUQQx0oAsvjp4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4wuH8/btsKMELINxK/k1fgjBl4oUQQx0oAsvjp4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4wuH8/btsKMELINxK/k1fgjBl4oUQQx0oAsvjp4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4wuH8%2FbtsKMELINxK%2Fk1fgjBl4oUQQx0oAsvjp4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1092&quot; height=&quot;538&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;538&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GitHub Flow는 간단하고 직관적인 브랜치 전략으로, 빠르게 변화하는 프로젝트나 소규모 팀에서 주로 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 master 브랜치에 대한 규칙만 정확하게 정립되어 있다면 나머지 가지들에 대해서는 특별한 관여를 하지 않으며 PR(Pull Request)기능을 사용하도록 권장합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 id=&quot;github-flow_특징&quot; data-ke-size=&quot;size20&quot;&gt;&lt;i&gt;GitHub-Flow 특징&lt;/i&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;release branch가 명확하게 구분되지 않은 시스템에서의 사용이 유용하다.&lt;/li&gt;
&lt;li&gt;GitHub 자체의 서비스 특성상 배포의 개념이 없는 시스템으로 되어있기 때문에 이 flow가 유용하다.&lt;/li&gt;
&lt;li&gt;웹 서비스들에 배포의 개념이 없어지고 있는 추세이기 때문에 앞으로도 Git flow에 비해 사용하기에 더 수월할 것이다.&lt;/li&gt;
&lt;li&gt;hotfix와 가장 작은 기능을 구분하지 않는다. 모든 구분사항들도 결국 개발자가 전부 수정하는 일들 중 하나이기 때문이다. 이 대신 구분하는 것은 우선 순위가 어떤 것이 더 높은지에 대한 것이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h4 id=&quot;github-flow_흐름&quot; data-ke-size=&quot;size20&quot;&gt;&lt;i&gt;Github-Flow 흐름&lt;/i&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;1-브랜치-생성&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;1.&lt;/span&gt; 브랜치 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-origin-height=&quot;310&quot; data-origin-width=&quot;1270&quot; data-filename=&quot;blob&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-phocus=&quot;https://blog.kakaocdn.net/dn/sartC/btrlFbgVPdm/sZbc064FclDUVwNIWjebuk/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/sartC/btrlFbgVPdm/sZbc064FclDUVwNIWjebuk/img.png&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/sartC/btrlFbgVPdm/sZbc064FclDUVwNIWjebuk/img.png&quot; data-fslightbox=&quot;gallery&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sartC/btrlFbgVPdm/sZbc064FclDUVwNIWjebuk/img.png&quot; data-phocus-index=&quot;11&quot; data-src=&quot;https://blog.kakaocdn.net/dn/sartC/btrlFbgVPdm/sZbc064FclDUVwNIWjebuk/img.png&quot; data-srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsartC%2FbtrlFbgVPdm%2FsZbc064FclDUVwNIWjebuk%2Fimg.png&quot; data-origin-height=&quot;310&quot; data-origin-width=&quot;1270&quot; data-filename=&quot;blob&quot; /&gt;&lt;/a&gt;&lt;/span&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;Github-flow 전략은 기능 개발, 버그 픽스 등 어떤 이유로든 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;새로운 브랜치를 생성&lt;/b&gt;&lt;/span&gt;하는 것으로 시작된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, 이때 체계적인 분류 없이 브랜치 하나에 의존하게 되기 때문에&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;브랜치 이름을 통해 의도를 명확하게&lt;/span&gt; &lt;/b&gt;드러내는 것이 매우 중요하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;master 브랜치는 항상 최신 상태며, stable 상태로 product에 배포되는 브랜치다. &lt;/span&gt;&lt;span&gt;이 브랜치에 대해서는 엄격한 role과 함께 사용한다&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;새로운 브랜치는 항상 master 브랜치에서 만든다&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Git-flow와는 다르게 feature 브랜치나 develop 브랜치가 존재하지 않는다.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;그렇지만, 새로운 기능을 추가하거나 버그를 해결하기 위한 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;브랜치 이름은 자세하게&lt;/span&gt;&lt;/b&gt; 어떤 일을 하고 있는지에 대해서 작성해주도록 하자&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;2-열심히-개발-열심히-커밋&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;2.&lt;/span&gt; 개발 &amp;amp; 커밋 &amp;amp; 푸쉬&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-origin-height=&quot;299&quot; data-origin-width=&quot;1279&quot; data-filename=&quot;blob&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-phocus=&quot;https://blog.kakaocdn.net/dn/CvHSI/btrlD3QSnw0/areYgHfDrZOp9GvHsKK1hK/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/CvHSI/btrlD3QSnw0/areYgHfDrZOp9GvHsKK1hK/img.png&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/CvHSI/btrlD3QSnw0/areYgHfDrZOp9GvHsKK1hK/img.png&quot; data-fslightbox=&quot;gallery&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CvHSI/btrlD3QSnw0/areYgHfDrZOp9GvHsKK1hK/img.png&quot; data-phocus-index=&quot;12&quot; data-src=&quot;https://blog.kakaocdn.net/dn/CvHSI/btrlD3QSnw0/areYgHfDrZOp9GvHsKK1hK/img.png&quot; data-srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCvHSI%2FbtrlD3QSnw0%2FareYgHfDrZOp9GvHsKK1hK%2Fimg.png&quot; data-origin-height=&quot;299&quot; data-origin-width=&quot;1279&quot; data-filename=&quot;blob&quot; /&gt;&lt;/a&gt;&lt;/span&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;개발을 진행하면서 커밋을 남긴다.&lt;br /&gt;이때도 브랜치와 같이 커밋 메세지에 의존해야 하기 때문에, 커밋 메세지를 최대한 상세하게 적어주는 것이 중요하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;커밋메시지를 명확하게 작성하자&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;원격지 브랜치로 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;수시로 push&lt;/span&gt;&lt;/b&gt;&lt;span&gt; 하자&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Git-flow와 상반되는 방식&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;항상 원격지에 자신이 하고 있는 일들을 올려 다른 사람들도 확인할 수 있도록 해준다&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;이는 하드웨어에 문제가 발생해 작업하던 부분이 없어지더라도, 원격지에 있는 소스를 받아서 작업할 수 있도록 해준다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;3-pr-생성&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;3.&lt;/span&gt; PR(Pull Request) 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-origin-height=&quot;272&quot; data-origin-width=&quot;1279&quot; data-filename=&quot;blob&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-phocus=&quot;https://blog.kakaocdn.net/dn/XDeFC/btrlFmhSJ7Y/fx1cePcEtg57k04pd8MuLK/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/XDeFC/btrlFmhSJ7Y/fx1cePcEtg57k04pd8MuLK/img.png&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/XDeFC/btrlFmhSJ7Y/fx1cePcEtg57k04pd8MuLK/img.png&quot; data-fslightbox=&quot;gallery&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XDeFC/btrlFmhSJ7Y/fx1cePcEtg57k04pd8MuLK/img.png&quot; data-phocus-index=&quot;13&quot; data-src=&quot;https://blog.kakaocdn.net/dn/XDeFC/btrlFmhSJ7Y/fx1cePcEtg57k04pd8MuLK/img.png&quot; data-srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXDeFC%2FbtrlFmhSJ7Y%2Ffx1cePcEtg57k04pd8MuLK%2Fimg.png&quot; data-origin-height=&quot;272&quot; data-origin-width=&quot;1279&quot; data-filename=&quot;blob&quot; /&gt;&lt;/a&gt;&lt;/span&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;&lt;span&gt;피드백이나 도움이 필요할 때, 그리고 merge 준비가 완료되었을 때는 pull request를 생성한다&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;pull request는 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;코드 리뷰&lt;/span&gt;&lt;/b&gt;를 도와주는 시스템&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;이것을 이용해 자신의 코드를 공유하고, 리뷰받는다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; merge 준비가 완료되었다면 master 브랜치로 반영을 요구한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;4-리뷰-토의-리뷰-토의&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;4.&lt;/span&gt; 리뷰 &amp;amp; 토의&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-origin-height=&quot;281&quot; data-origin-width=&quot;1280&quot; data-filename=&quot;blob&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-phocus=&quot;https://blog.kakaocdn.net/dn/bJXi8B/btrlDAVImKv/dsrlw9Nc1YZkNxogdRSRB0/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/bJXi8B/btrlDAVImKv/dsrlw9Nc1YZkNxogdRSRB0/img.png&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bJXi8B/btrlDAVImKv/dsrlw9Nc1YZkNxogdRSRB0/img.png&quot; data-fslightbox=&quot;gallery&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJXi8B/btrlDAVImKv/dsrlw9Nc1YZkNxogdRSRB0/img.png&quot; data-phocus-index=&quot;14&quot; data-src=&quot;https://blog.kakaocdn.net/dn/bJXi8B/btrlDAVImKv/dsrlw9Nc1YZkNxogdRSRB0/img.png&quot; data-srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJXi8B%2FbtrlDAVImKv%2Fdsrlw9Nc1YZkNxogdRSRB0%2Fimg.png&quot; data-origin-height=&quot;281&quot; data-origin-width=&quot;1280&quot; data-filename=&quot;blob&quot; /&gt;&lt;/a&gt;&lt;/span&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;Pull-Request가&lt;span&gt;&amp;nbsp;&lt;/span&gt;master&lt;span&gt;&amp;nbsp;&lt;/span&gt;브랜치 쪽에 합쳐진다면 곧장 라이브 서버에 배포되는 것과 다름 없으므로, 상세한 리뷰와 토의가 이루어져야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;5-토의가-끝났어도-테스트&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;5.&lt;/span&gt; 테스트&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-origin-height=&quot;280&quot; data-origin-width=&quot;1279&quot; data-filename=&quot;blob&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-phocus=&quot;https://blog.kakaocdn.net/dn/N7QbA/btrlJNF6YVy/PkLcqZ8Kjr9tzyFZdPCoDk/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/N7QbA/btrlJNF6YVy/PkLcqZ8Kjr9tzyFZdPCoDk/img.png&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/N7QbA/btrlJNF6YVy/PkLcqZ8Kjr9tzyFZdPCoDk/img.png&quot; data-fslightbox=&quot;gallery&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N7QbA/btrlJNF6YVy/PkLcqZ8Kjr9tzyFZdPCoDk/img.png&quot; data-phocus-index=&quot;15&quot; data-src=&quot;https://blog.kakaocdn.net/dn/N7QbA/btrlJNF6YVy/PkLcqZ8Kjr9tzyFZdPCoDk/img.png&quot; data-srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN7QbA%2FbtrlJNF6YVy%2FPkLcqZ8Kjr9tzyFZdPCoDk%2Fimg.png&quot; data-origin-height=&quot;280&quot; data-origin-width=&quot;1279&quot; data-filename=&quot;blob&quot; /&gt;&lt;/a&gt;&lt;/span&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;리뷰와 토의가 끝났다면 해당 내용을 라이브 서버(혹은 테스트 환경)에 배포해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배포시 문제가 발생한다면 곧장&lt;span&gt;&amp;nbsp;&lt;/span&gt;master&lt;span&gt;&amp;nbsp;&lt;/span&gt;브랜치의 내용을 다시 배포하여 초기화 시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;6-최종-merge&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;6.&lt;/span&gt; 최종 Merge&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-origin-height=&quot;309&quot; data-origin-width=&quot;1273&quot; data-filename=&quot;blob&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-phocus=&quot;https://blog.kakaocdn.net/dn/cpGa8k/btrlJNMRC3m/miaSfApRLc64KSm2JJPWZ1/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/cpGa8k/btrlJNMRC3m/miaSfApRLc64KSm2JJPWZ1/img.png&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cpGa8k/btrlJNMRC3m/miaSfApRLc64KSm2JJPWZ1/img.png&quot; data-fslightbox=&quot;gallery&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpGa8k/btrlJNMRC3m/miaSfApRLc64KSm2JJPWZ1/img.png&quot; data-phocus-index=&quot;16&quot; data-src=&quot;https://blog.kakaocdn.net/dn/cpGa8k/btrlJNMRC3m/miaSfApRLc64KSm2JJPWZ1/img.png&quot; data-srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpGa8k%2FbtrlJNMRC3m%2FmiaSfApRLc64KSm2JJPWZ1%2Fimg.png&quot; data-origin-height=&quot;309&quot; data-origin-width=&quot;1273&quot; data-filename=&quot;blob&quot; /&gt;&lt;/a&gt;&lt;/span&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;라이브 서버(혹은 테스트 환경)에 배포했음에도 문제가 발견되지 않았다면 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;그대로&amp;nbsp;master&amp;nbsp;브랜치에 푸시를 하고, 즉시 배포&lt;/span&gt;&lt;/b&gt;를 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 Github-flow 에선&lt;span&gt;&amp;nbsp;&lt;/span&gt;master&lt;span&gt;&amp;nbsp;&lt;/span&gt;브랜치를 최신 브랜치라고 가정하기 때문에 배포 자동화 도구를 이용해서 Merge 즉시 배포를 시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;master로 merge되고 push 되었을 때는, 즉시 배포되어야한다&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;GitHub-flow의 핵심&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;master로 merge가 일어나면 자동으로 배포가 되도록 설정해놓는다. (CI / CD)&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;☁️ Git Flow vs Github Flow 비교하기&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;1135&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpPUT4/btsKNdT6HJM/jy2UTvNPoYtpSEm5kAGkl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpPUT4/btsKNdT6HJM/jy2UTvNPoYtpSEm5kAGkl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpPUT4/btsKNdT6HJM/jy2UTvNPoYtpSEm5kAGkl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpPUT4%2FbtsKNdT6HJM%2Fjy2UTvNPoYtpSEm5kAGkl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;671&quot; height=&quot;206&quot; data-origin-width=&quot;1135&quot; data-origin-height=&quot;348&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론적으로, 1개월 이상의 긴 호흡으로 개발하여 주기적으로 배포, QA 및 테스트, hotfix 등 수행할 수 있는 여력이 있는 팀이라면 &lt;span style=&quot;color: #7e98b1;&quot;&gt;&lt;b&gt;git-flow&lt;/b&gt;&lt;/span&gt;가 적합하다. 하지만 수시로 릴리즈 되어야 할 필요가 있는 서비스를 지속적으로 테스트하고 배포하는 팀이라면 &lt;span style=&quot;color: #a6bc00;&quot;&gt;&lt;b&gt;github-flow&lt;/b&gt;&lt;/span&gt;와 같은 간단한 work-flow가 적합하다.&lt;/p&gt;</description>
      <category>Ect/Git</category>
      <author>VHAL_</author>
      <guid isPermaLink="true">https://n1mss-e.tistory.com/42</guid>
      <comments>https://n1mss-e.tistory.com/42#entry42comment</comments>
      <pubDate>Mon, 18 Nov 2024 13:57:26 +0900</pubDate>
    </item>
    <item>
      <title>[Git] 01. Git의 기본 개념</title>
      <link>https://n1mss-e.tistory.com/41</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Git이란 무엇인가&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git은 &lt;b&gt;분산 버전 관리 시스템&lt;/b&gt;으로, 파일의 변경 이력을 기록하고 협업을 가능하게 하는 도구입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git을 사용하면 코드와 파일의 변화를 시간순으로 기록하고, 이전 상태로 되돌리거나 여러 사람이 동시에 같은 프로젝트에서 작업할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&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;1667&quot; data-origin-height=&quot;952&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HRycC/btsKMacXtiu/UsZ0Dlua9foqBIHC1FrBg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HRycC/btsKMacXtiu/UsZ0Dlua9foqBIHC1FrBg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HRycC/btsKMacXtiu/UsZ0Dlua9foqBIHC1FrBg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHRycC%2FbtsKMacXtiu%2FUsZ0Dlua9foqBIHC1FrBg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;715&quot; height=&quot;408&quot; data-origin-width=&quot;1667&quot; data-origin-height=&quot;952&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. &lt;b&gt;Repository와 Commit&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Repository(저장소)&lt;/b&gt;&lt;br /&gt;Git에서 파일의 변경 이력을 관리하는 공간으로, 프로젝트의 전체 상태와 이력을 저장합니다. 저장소는 로컬(Local) 저장소와 원격(Remote) 저장소로 나뉩니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;로컬 저장소&lt;/b&gt;: 사용자 컴퓨터에 저장된 Git 저장소.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;원격 저장소&lt;/b&gt;: GitHub, GitLab 같은 서버에 저장된 Git 저장소.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Commit(커밋)&lt;/b&gt;&lt;br /&gt;변경된 파일의 상태를 기록한 스냅샷입니다. Git은 커밋 단위로 변경 사항을 추적하며, 각 커밋은 고유한 해시값을 가집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. &lt;b&gt;Branch와 Merge&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Branch(브랜치)&lt;/b&gt;&lt;br /&gt;브랜치는 저장소의 독립적인 작업 공간으로, 프로젝트의 기본 흐름(main)에서 분기하여 새로운 작업을 할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Merge(병합)&lt;/b&gt;&lt;br /&gt;브랜치에서 작업한 변경 사항을 다른 브랜치(main 등)와 통합하는 작업입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. &lt;b&gt;Staging Area와 Working Directory&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;317&quot; data-origin-height=&quot;237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buossb/btsKNtvorgR/tLBjfTt9dTapfSzjH1uNVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buossb/btsKNtvorgR/tLBjfTt9dTapfSzjH1uNVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buossb/btsKNtvorgR/tLBjfTt9dTapfSzjH1uNVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbuossb%2FbtsKNtvorgR%2FtLBjfTt9dTapfSzjH1uNVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;317&quot; height=&quot;237&quot; data-origin-width=&quot;317&quot; data-origin-height=&quot;237&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&gt;&lt;b&gt;Working Directory (작업 디렉터리):&lt;/b&gt; 현재 사용자가 작업 중인 파일들이 있는 공간입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Staging Area (스테이징 영역)&lt;/b&gt;: 커밋 전에 변경 사항을 임시로 저장하는 공간으로, 커밋할 파일들을 준비하는 단계입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Repository (저장소)&lt;/b&gt;: 커밋된 파일들이 영구적으로 저장되는 공간입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;☁️ File Status Lifecycle&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;577&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9YSlR/btsKLi98aEN/WSLvi3BVac0vD9ZLW8EDTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9YSlR/btsKLi98aEN/WSLvi3BVac0vD9ZLW8EDTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9YSlR/btsKLi98aEN/WSLvi3BVac0vD9ZLW8EDTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9YSlR%2FbtsKLi98aEN%2FWSLvi3BVac0vD9ZLW8EDTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;577&quot; height=&quot;362&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git에서 파일은 다음 4가지 상태 중 하나에 속합니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Untracked (추적되지 않음)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Git이 추적하지 않는 새로운 파일입니다.&lt;/li&gt;
&lt;li&gt;git add 명령어로 파일을 스테이징 영역에 추가하면 &lt;b&gt;Staged&lt;/b&gt; 상태로 전환됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Unmodified (변경되지 않음)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Git이 추적하고 있으며, 마지막 커밋 이후 변경되지 않은 파일입니다.&lt;/li&gt;
&lt;li&gt;이 상태의 파일은 커밋 내용과 동일하므로 아무 작업도 필요하지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Modified (수정됨)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Git이 추적 중인 파일이 변경되었지만, 아직 스테이징 영역에 추가되지 않은 상태입니다.&lt;/li&gt;
&lt;li&gt;git add 명령어로 변경된 내용을 스테이징 영역에 추가할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Staged (스테이징됨)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변경된 파일이 스테이징 영역에 추가되어 커밋 준비가 된 상태입니다.&lt;/li&gt;
&lt;li&gt;git commit 명령어로 변경 사항을 저장소에 커밋할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Ect/Git</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>VHAL_</author>
      <guid isPermaLink="true">https://n1mss-e.tistory.com/41</guid>
      <comments>https://n1mss-e.tistory.com/41#entry41comment</comments>
      <pubDate>Mon, 18 Nov 2024 12:40:42 +0900</pubDate>
    </item>
    <item>
      <title>[CI/CD] Github Action으로 CI/CD 구축하기</title>
      <link>https://n1mss-e.tistory.com/40</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Github Action이란?&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;Github Action 공식 문서&lt;/b&gt; : &lt;a title=&quot;Link&quot; href=&quot;https://docs.github.com/en/actions&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Link&lt;/a&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;GitHub Actions은 GitHub 플랫폼에서 제공하는 자동화 및 &lt;i&gt;지속적 통합/지속적 배포(CI/CD) 서비스&lt;/i&gt;입니다. 소&lt;span style=&quot;background-color: #ffffff; color: #1e1f21; text-align: start;&quot;&gt;프트웨어 개발 라이프사이클 안에서 Pull Request, Push 등의 이벤트 발생에 따라 자동화된 작업을 진행할 수 있게 해주며 &lt;/span&gt;코드의 통합과 배포 프로세스를 자동화하여 개발 생산성을 향상시킬 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;** 하단의 글들을 모두 타블로그의 글을 참고한 추후 수정 목적의 개인 공부용 글입니다. **&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;-시작하기&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;시작하기&lt;/b&gt;&lt;/h3&gt;
&lt;h4 id=&quot;️-템플릿-이용하기&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;✔️ 템플릿 이용하기&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;공식문서의&lt;span&gt;&amp;nbsp;&lt;/span&gt;Quick Start에도 설명이 잘 되어 있듯이, 이미 기본적인 프로젝트에 대한 CI/CD 템플릿을 어느정도 지원하고 있습니다. 간단한 프로젝트라면 이미 구축되어 있는 템플릿을 활용하는 것도 빠른 CI/CD를 구축하는데 도움이 될 것 같습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;CI/CD를 구축하고 싶은 Repository로 이동하여 Actions 탭을 누르면 다음과 같은 화면이 보입니다. 여기서 원하는 템플릿을 가져다 쓰면 됩니다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;695&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcKSo8/btsKKH3xdvU/ZprTJsY69SH5Nj1ZJDnSDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcKSo8/btsKKH3xdvU/ZprTJsY69SH5Nj1ZJDnSDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcKSo8/btsKKH3xdvU/ZprTJsY69SH5Nj1ZJDnSDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcKSo8%2FbtsKKH3xdvU%2FZprTJsY69SH5Nj1ZJDnSDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1264&quot; height=&quot;695&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;695&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하지만 이번 포스팅에서는 워크플로우를 직접 구성하여 클라우드 서비스와 연동하는 과정까지 직접 작성한 내용에 대해 다루어보도록 하겠습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;️-githubworkflowscicdyml&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;✔️ .github/workflows/cicd.yml&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;처음 접하는 yaml 문법이라면, 속도가 당연히 더딜 수는 있어도 프로젝트 환경에 맞는 배포 워크플로우를 커스터마이징 할 수 있다는 장점이 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다만, 워크플로우를 작성할 때는 yaml 파일이 프로젝트 폴더의&lt;span&gt;&amp;nbsp;&lt;/span&gt;.github/workflows/&lt;span&gt;&amp;nbsp;&lt;/span&gt;디렉토리에 위치해있는지 확인하면 됩니다.&lt;/p&gt;
&lt;pre class=&quot;css&quot; style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;code&gt;  .github
  ├── workflows
  │   └── cicd-file-name.yml
  src
  app.ts
  package.json
  │
  ... &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;yaml이란?&lt;/b&gt;&lt;br /&gt;yaml이란 데이터 표현 양식의 한 종류이며 기본적으로 들여쓰기(indent)를 원칙으로 하며 데이터는 Map(key-value)형식으로 작성되어야 합니다.&lt;/blockquote&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h3 id=&quot;-구성요소&quot; style=&quot;background-color: #ffffff; color: #212529; 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;1191&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dr6LPp/btsKL1GHQjW/9whH0LSmfdeN7uXodbJC1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dr6LPp/btsKL1GHQjW/9whH0LSmfdeN7uXodbJC1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dr6LPp/btsKL1GHQjW/9whH0LSmfdeN7uXodbJC1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdr6LPp%2FbtsKL1GHQjW%2F9whH0LSmfdeN7uXodbJC1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;736&quot; height=&quot;362&quot; data-origin-width=&quot;1191&quot; data-origin-height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote id=&quot;workflow&quot; data-ke-style=&quot;style3&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Workflow&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1e1f21; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Workflow란 레포지토리에 추가할 수 있는 일련의 자동화된 커맨드 집합입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1e1f21; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;하나 이상의 Job으로 구성되어 있으며, Push나 PR과 같은 이벤트에 의해 실행될 수도 있고 특정 시간대에 실행될 수도 있습니다. 빌드, 테스트, 배포 등 각각의 역할에 맞는 Workflow를 추가할 수 있고,&lt;span&gt;&amp;nbsp;&lt;/span&gt;.github/workflows&lt;span&gt;&amp;nbsp;&lt;/span&gt;디렉토리에 YAML 형태로 저장합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Event&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1e1f21; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Event란 Workflow를 실행시키는 Push, Pull Request, Commit 등의 특정 행동을 의미합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1e1f21; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 위의 특정 행동이 아닌,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #4263eb;&quot; href=&quot;https://docs.github.com/en/rest/reference/repos#create-a-repository-dispatch-event&quot;&gt;Repository Dispatch Webhook&lt;/a&gt;을 사용하면 Github 외부에서 발생한 이벤트에 의해서도 Workflow를 실행시킬 수 있습니다. Event 종류에 대해 더 알고 싶다면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #4263eb;&quot; href=&quot;https://docs.github.com/en/actions/reference/events-that-trigger-workflows&quot;&gt;Github Actions 공식 문서&lt;/a&gt;를 확인해주세요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Jobs&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; color: #1e1f21; text-align: left;&quot;&gt;Job이란 동일한 Runner에서 실행되는 여러 Step의 집합을 의미합니다.&lt;/span&gt; &lt;br /&gt;워크플로우에서 특정 이벤트에 따라 처리하는 프로세스를 구분하고 정의할 수 있습니다.프로세스는 각각의 step으로 나뉘고 이 step은 shell에서 동작하는 CLI와 동일하게 실행이 됩니다.각각의 step들 정의한 순서대로 실행되며, step 별로 동일한 환경변수를 지정할 수 있어 데이터를 공유할 수 있습니다. &lt;span style=&quot;background-color: #ffffff; color: #1e1f21; text-align: left;&quot;&gt;기본적으로 하나의 Workflow 내의 여러 Job은 독립적으로 실행되지만, 필요에 따라 의존 관계를 설정하여 순서를 지정해줄 수 있습니다.&lt;/span&gt; &lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Actions&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; color: #1e1f21; text-align: left;&quot;&gt;Action이란 Job을 만들기 위해 Step을 결합한 독립적인 커맨드로, 재사용이 가능한 Workflow의 가장 작은 단위의 블럭입니다.&lt;/span&gt; 반복되는 코드를 모듈이나 함수로 관리하는 것처럼 복잡하고 자주 사용되는 작업을 정의할 수 있습니다.워크플로우 내에서 자주 반복되는 스크립트를 미리 정의하여 좀 더 효율적으로 관리할 수 있습니다.이미 많은 사용자들이 불편함을 느껴 GitHub 마켓플레이스에 퍼블릭하게 배포해 놓은 action들이 많이 있으니, 참고하여 각자 개발 프로세스에 맞는 CI/CD를 구축할 수 있겠네요!&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;env&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;환경변수가 반드시 필요한 구성요소는 아니지만, 노출되어서는 안되는 민감한 정보를 환경변수로 설정하여 사용할 수 있습니다. Repository별로 환경변수를 독립적으로 설정할 수 있고, Organization을 사용한다면, 모든 Repository에 적용되는 환경변수를 관리할 수 있습니다.&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Step&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Step이란 커맨드를 실행할 수 있는 각각의 Task를 의미하는데, Shell 커맨드가 될 수도 있고, 하나의 Action이 될 수도 있습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하나의 Job 내에서 각각의 Step은 다양한 Task로 인해 생성된 데이터를 공유할 수 있습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Runner&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Runner란 Github Actions Workflow 내에 있는 Job을 실행시키기 위한 애플리케이션입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Runner Application은 Github에서 호스팅하는 가상 환경 또는 직접 호스팅하는 가상 환경에서 실행 가능하며, Github에서 호스팅하는 가상 인스턴스의 경우에는 메모리 및 용량 제한이 존재합니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아래 화면과 같이&lt;span&gt;&amp;nbsp;&lt;/span&gt;Settings -&amp;gt; Secrets and variables (Actions) -&amp;gt; New Repository secret&lt;span&gt;&amp;nbsp;&lt;/span&gt;순으로 이동합니다.&lt;br /&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rumZb/btsKLc9VK9l/X0fPyXdKPnCkzQGnvWvgUK/img.png&quot; /&gt;&lt;/li&gt;
&lt;li&gt;이후 아래와 같이 환경변수로 사용할 변수명과 실제 값을 기입해줍니다.&lt;br /&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyB7nD/btsKMfEHG5d/67cIh8yzZKvGbEPKB8uMh1/img.png&quot; /&gt;&lt;/li&gt;
&lt;li&gt;사용방법은 다음과 같습니다:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;dockerfile&quot; style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;code&gt;- name: Environment Setup
  run: ${{ secrets.등록한_환경변수_이름 }}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;출력값:&lt;/p&gt;
&lt;pre class=&quot;haxe&quot; style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;code&gt;# in Linux Terminal
실제_등록한_환경변수_값이 출력됩니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;-with-aws&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;with AWS&lt;/b&gt;&lt;/h3&gt;
&lt;h4 id=&quot;️-aws-certification&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;✔️ AWS Certification&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Github Action이 실행되는 repository에 환경변수를 직접 추가해주었기 때문에, 이제 환경변수에 손쉽게 접근할 수 있습니다. 노출에 민감한 값을 적용할 때 권장되는 방법입니다. 환경변수를 워크플로우 내부에서 지정하여 사용하는 방법에 대해서는 Slack API 단락을 확인해주세요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;환경변수 사용 예시 아래 예시 코드는 AWS credential 인증을 위한 action 코드입니다. 이 때 필요한 값은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;access-key-id&lt;/b&gt;와&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;secret-access-key&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;값입니다. 하지만 외부 제 3자가 이 두가지 값을 안다면, 내부 리소스에 접근할 수 있기 때문에 환경변수로 관리해야합니다. repository에 등록한 환경변수에는&lt;span&gt;&amp;nbsp;&lt;/span&gt;{{ secrets.Name }}&lt;span&gt;&amp;nbsp;&lt;/span&gt;과 같은 방식으로 접근할 수 있습니다.&lt;br /&gt;Name에는 직접 입력한 환경변수의 Key 값을 입력하여 사용할 수 있습니다.
&lt;pre class=&quot;sql&quot; style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;code&gt;- name: Configure AWS Credentials
  uses: aws-actions/configure-aws-credentials@v1
  with:
      aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
      aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
      aws-region: ap-northeast-2&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;️-frontend-deployment-s3&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;✔️ Frontend Deployment (S3)&lt;/h4&gt;
&lt;p id=&quot;deploy-to-s3&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;Deploy to S3&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;S3 버킷에 build 파일을 업로드 하여 Frontend 코드를 배포하고 해당 S3 스토리지에 저장된 파일을 CloudFront에서 전달하는 배포 프로세스를 따르고 있습니다. 우리는 build 파일을 S3에 업로드만 하면 되기 때문에 해당 워크플로우를 들여다보겠습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;마찬가지로 name은 원하는 워크플로우 이름을 지정해줍시다.&lt;/li&gt;
&lt;li&gt;어떤 폴더를 빌드 폴더로 지정할 지 정해줍니다. 여기서는 build 폴더로 지정하겠습니다.&lt;/li&gt;
&lt;li&gt;S3에 접근할 때 사용되는&lt;span&gt;&amp;nbsp;&lt;/span&gt;Action인 lbertenasco/s3-deploy@v1을 사용해줍니다.&lt;/li&gt;
&lt;li&gt;bucket의 실제 이름과&lt;span&gt;&amp;nbsp;&lt;/span&gt;cloudfront의 dist-id 값을 repository 환경변수에 등록을 해주고, 필요한 필드에 값을 치환해주면 됩니다.&lt;/li&gt;
&lt;li&gt;배포가 될 때마다 새로운 컨텐츠를 제공할 수 있도록 invalidation 설정을 해줍니다. 캐시 무효화 작업을 통해 배포가 되면 캐싱 데이터를 전달하지 않고 새로운 데이터를 전달합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;yaml&quot; style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;code&gt;- name: Deploy
    uses: lbertenasco/s3-deploy@v1
    with:
      folder: build
      bucket: ${{ secrets.S3_BUCKET }}
      dist-id: ${{ secrets.CLOUDFRONT_DISTRIBUTION_ID }}
      invalidation: / *&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;cache-invalidation&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 id=&quot;️-backend-deployment-ec2&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;✔️ Backend Deployment (EC2)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;inbound-control-ip4v&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;Inbound Control IP4V&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;EC2 인스턴스에 소스 코드를 내려 받고 pm2를 활용하여 서버를 배포하고 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;마찬가지로 step 별로 뜯어보겠습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Github Action IP 주소 받기&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;haythem/public-ip@v1.2&lt;span&gt;&amp;nbsp;&lt;/span&gt;액션을 통해 ip 값을 id에 지정해줍니다.&lt;br /&gt;이 값은 이후 스텝에서 사용됩니다.
&lt;pre class=&quot;routeros&quot; style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;code&gt;- name: Get GitHub Actions IP
  id: ip
  uses: haythem/public-ip@v1.2&lt;/code&gt;&lt;/pre&gt;
&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인바운드 규칙에 IP주소 화이트리스트 등록하기&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;SSH에 직접 접근하는 방식으로 배포를 하고 있습니다.&lt;br /&gt;만약 외부에서 SSH 접속을 통해 API 내부에 침투한다면 굉장히 위험하기 때문에 인바운드 규칙에서 접속 가능한 IP 리스트를 제한하고 있습니다.&lt;br /&gt;로컬 뿐만이 아니라, Github Action에서 SSH 접속을 허용해야 하기 때문에 아래와 같은 스크립트를 작성할 수 있습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보안그룹 ID 값이 필요합니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;--group-id&lt;span&gt;&amp;nbsp;&lt;/span&gt;플래그에 대한 값에 지정해줍니다.&lt;/li&gt;
&lt;li&gt;tcp port는 SSH접속 목적이기 때문에 22port로 지정해줍니다.&lt;/li&gt;
&lt;li&gt;cidr은 Github Action의 IPv4 대역을 받아옵니다. 1번에서 id에 ip 값을 할당하고 있는데 그 값을 사용할 수 있습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;steps.ip.output.ipv4&lt;span&gt;&amp;nbsp;&lt;/span&gt;라는 값을 사용할 수 있습니다.&lt;/li&gt;
&lt;li style=&quot;color: #000000; text-align: left;&quot;&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;name: Add Github Actions IP to Security group&lt;br /&gt;run: |&lt;br /&gt;aws ec2 authorize-security-group-ingress \&lt;br /&gt;--group-id ${{ secrets.PROD_AWS_SG_ID }} \&lt;br /&gt;--protocol tcp --port 22 \&lt;br /&gt;--cidr ${{ steps.ip.outputs.ipv4 }}/32&lt;/li&gt;
&lt;li style=&quot;color: #000000; text-align: left;&quot;&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;deploy-to-ec2&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Deploy to EC2&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Github Action의 CIDR이 인바운드 규칙에 등록이 되었다면, CI/CD가 실행되는 네트워크에서 우리 서버 EC2로 접속할 수 있게 됩니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;EC2에 접속하기 위해&lt;span&gt;&amp;nbsp;&lt;/span&gt;appleboy/ssh-action@master&lt;span&gt;&amp;nbsp;&lt;/span&gt;액션을 사용하며, 필요한 값은 다음과 같습니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AW_SSH_KEY:&lt;span&gt;&amp;nbsp;&lt;/span&gt;*.pem&lt;span&gt;&amp;nbsp;&lt;/span&gt;값을 환경변수로 지정해줍니다.&lt;/li&gt;
&lt;li&gt;AWS_HOST: 호스트는 EC2의 인스턴스의 퍼블릭 CIDR을 가리킵니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;실제로 Github Action이 실행되는 터미널을 확인해보면, 로컬에서 접속하는 것과 동일하게 EC2 인스턴스에 접속해있는 것을 확인할 수 있습니다. 이제 EC2 인스턴스 내부에서 리눅스 명령어를 사용하여 Backend 소스 코드를 받아오고 pm2 매니저를 활용하여 서비스를 중단하지 않고 배포를 해보겠습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;git pull origin &amp;ldquo;branch&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Install Dependencies (mecab-ko 설치 필요!)&lt;/li&gt;
&lt;li&gt;pm2 reload&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;properties&quot; style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;code&gt;- name: EC2 Production Server Deploy
    uses: appleboy/ssh-action@master
    with:
      key: ${{ secrets.PROD_AWS_SSH_KEY }}
      host: ${{ secrets.PROD_AWS_HOST }}
      username: ubuntu
      script: |
        export NVM_DIR=~/.nvm
        source ~/.nvm/nvm.sh
        pm2 stop 0
        pm2 stop 1
        pm2 save
        cd 2minutes
        git checkout main
        git pull origin main
        npm ci &amp;amp;&amp;amp; node_modules/mecab-ya/bin/install-mecab ko
        pm2 start 0
        pm2 start 1
        pm2 save&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;-with-cache-node_modules&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;with Cache node_modules&lt;/b&gt;&lt;/h3&gt;
&lt;h4 id=&quot;️-github-action은-cache를-제공한다&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;✔️ GitHub Action은 cache를 제공한다&lt;/h4&gt;
&lt;blockquote style=&quot;color: #212529; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mecab-ko-dic을 OS에 설치하는 방법이 반드시 필요하다!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;GitHub Actiond에서는 특정 파일을 해시값으로 바꾸어 해당 파일을 캐싱할 수 있습니다.&lt;br /&gt;아래 소스 코드를 살펴보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot; style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;code&gt; - name: Cache Dependencies
     id: dependency-cache
     uses: actions/cache@v3
     with:
   		# 캐시 대상이 되는 파일입니다.
        # node_module 디렉토리의 하위 내용을 모두 캐시하겠다는 의미입니다.
        path: &quot;**/node_modules&quot;
    	
        # 캐시를 식별할 때 사용하느 옵션입니다.
    	# npm-package 대신 저장하고 싶은 캐시 키 값을 사용할 수 있습니다.
    	# ${{ hashFiles('**/package-lock.json') }}은 package-lock.json 파일 내용을 해시값으로 저장합니다.
    	# 여기서 해싱이 되어 저장된 package-lock.json 파일과 새로운 commit 코드의 package-lock.json 파일이 일치하는지 확인합니다.
    	key: npm-package-${{ hashFiles('**/package-lock.json') }}
    
    	# 캐싱이 되어있는 해시 파일을 찾습니다.
    	# 해시 파일을 찾는 기준은 restore-keys에 등록된 순으로 찾습니다.
    	# 예를 들어, Caches에 npm-package-1, npm-package-2, npm-package-3 이라는 파일이 있다고 가정해봅시다.
    	# 이 때 package-lock.json의 해싱 파일이 npm-package-1로 되어 있다면, npm-package-1을 기준 캐시 데이터로 지정합니다.
    	# 지정된 캐시 파일은 commit의 package-lock.json 파일을 비교하는 작업을 하게됩니다.
    	#  *** PR이 달라도 기존 캐시 파일을 찾기 때문에 local-build &amp;amp; test 속도를 향상시킬 수 있습니다. ***
    	retore-keys: |
      	  npm-package-${{ hashFiles('**/package-lock.json') }}
          npm-package-&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;만약 새로 개발한 작업에서 써드파티 라이브러리를 사용하는 경우 새로운 디펜던시가 추가가 될 것입니다.&lt;br /&gt;그럼 새로운 작업 소스 코드의&lt;span&gt;&amp;nbsp;&lt;/span&gt;package-lock.json&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일과 캐싱된 파일을 비교하여, 변동 사항이 없다면 굳이 디펜던시를 다시 설치하여 사용할 필요가 없다고 판단하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;-with-slack-message&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;with Slack Message&lt;/h3&gt;
&lt;h4 id=&quot;️-slack-수신웹후크-incoming-webhook&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;✔️&amp;nbsp;Slack 수신웹후크 (Incoming Webhook)&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Github Action에서 Slack 메시지를 보내는 방법은 이 포스팅에서 소개하는 방식 외에도 다양한 방법이 이습니다. 그 중 Slack API의 수신웹후크를 사용하여 CI/CD의 결과를 Slack 메시지로 보내는 방법에 대해 소개해보겠습니다.&lt;/p&gt;
&lt;blockquote style=&quot;color: #212529; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱 생성 방식이 아닌&lt;span&gt;&amp;nbsp;&lt;/span&gt;앱 추가 방식을 우선 소개합니다.&lt;br /&gt;만약 회사 공용 slack 계정으로 추가할 경우 앱 추가 방식이 문제가 되진 않지만,&lt;br /&gt;팀을 떠날 가능성이 있다면 개인 계정을 사용할 경우 앱 생성 방식을 권장합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&quot;앱-추가-절차&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;앱 추가 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;앱 관리 &amp;gt; Incoming Webhook 검색 &amp;gt; 원하는 채널에 추가&lt;/li&gt;
&lt;li&gt;구성 편집의&lt;span&gt;&amp;nbsp;&lt;/span&gt;웹훅 URL&lt;span&gt;&amp;nbsp;&lt;/span&gt;정보 확인.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;(Github Repository의 환경변수로 지정해줍니다.)&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;️-github-action에서-슬랙-메시지-전송하기&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;✔️&amp;nbsp;Github Action에서 슬랙 메시지 전송하기&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;슬랙메시지 전송 job 구성하기&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;local 테스트 및 staging &amp;amp; production에 코드를 배포하는 job이 종료가 되면, CI/CD의 결과를 슬랙 메시지로 전송하기 위한 job을 추가해보겠습니다. 슬랙 메시지는 결과가 어떻든 항상 보내져야 하는 작업이기 때문에 조건을 추가해줍니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;always()함수를 통해 위에서 실행된 CI/CD의 결과가 어떻든 해당 job은 항상 실행이 되도록 지정할 수 있습니다. 선행 결과를 고려하지는 않아도 반드시 필요한 선행 결과를 지정해주어야 그 결과를 슬랙 채널에 전달할 수 있기 때문에&lt;span&gt;&amp;nbsp;&lt;/span&gt;needs&lt;span&gt;&amp;nbsp;&lt;/span&gt;옵션을 사용하여 반드시 선행되어야 하는 job의 이름을 지정해줍니다.
&lt;pre class=&quot;yaml&quot; style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;code&gt;jobs:
  slack_notification:
	  if: ${{ always() }}
    needs: [ 로컬, 스테이징, 프로덕션 ]
    runs-on: ubuntu-latest&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;슬랙메시지 커스터마이즈&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;로컬테스트, staging &amp;amp; production 서버 배포의 결과에 따라 상태메시지 (STATUS)와 슬랙에서 사용될 이모지 (IMOJI)를 커스터마이즈 할 수 있습니다. run 옵션에 아래와 같은 리눅스 명령어를 작성해줍니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;if &amp;hellip; then &amp;hellip; elif &amp;hellip; then fi&lt;span&gt;&amp;nbsp;&lt;/span&gt;구문은 조건절을 나타냅니다. 조건절은 항상&lt;span&gt;&amp;nbsp;&lt;/span&gt;fi&lt;span&gt;&amp;nbsp;&lt;/span&gt;를 작성하여 구문을 종료합니다. 우선, github.ref라는 변수에 접근하여 Github Action이 실행될 때 저장되는 branch의 이름을 받아올 수 있습니다. 해당 값에 따라 슬랙 메시지에 보여질&lt;span&gt;&amp;nbsp;&lt;/span&gt;BUILD_NAME&lt;span&gt;&amp;nbsp;&lt;/span&gt;변수에 값을 동적으로 지정해줄 수 있습니다.
&lt;pre class=&quot;routeros&quot; style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;code&gt;... slack_notification jobs ...

steps:
  - name: CUSTOM_STATUS SET UP
    run: |
      if [ &quot;${{ github.ref }}&quot; = &quot;refs/heads/develop&quot; ];
      then
        BUILD_NAME=&quot;Staging Deploy&quot;
      elif [ &quot;${{ github.ref }}&quot; = &quot;refs/heads/main&quot; ];
      then
        BUILD_NAME=&quot;Production Deploy&quot;
      else
        BUILD_NAME=&quot;Local Build &amp;amp; Test&quot;
      fi&lt;/code&gt;&lt;/pre&gt;
다음으로 needs 옵션에 추가했던 선행 job들의 결과에 따라 슬랙메시지에 보여질 상태메시지와 이모지를 지정해주는 스크립트입니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;needs.지정한_job_이름.result&lt;span&gt;&amp;nbsp;&lt;/span&gt;을 통해 해당 job의 실행결과를 받아올 수 있습니다.&lt;br /&gt;실행 결과 값은 아래와 같습니다:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;success: 성공&lt;/li&gt;
&lt;li&gt;failure: 테스트 또는 빌드 실패, 내부 네트워크 에러 등&lt;/li&gt;
&lt;li&gt;cancelled: 의도적 중단 혹은 내부 네트워크 에러 등해당 job에서 사용될 환경변수를 GITHUB_ENV에 추가하여 실제로 그 값을 호출하고 사용할 수 있도록 지정해줍니다.
&lt;pre class=&quot;routeros&quot; style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;code&gt;... slack_notification jobs ...

steps:
  - name: CUSTOM_STATUS SET UP
    run: |
      ... BUILD_NAME Set up...
      ... STATUS &amp;amp; IMOJI Set up...
      echo &quot;CUSTOM_STATUS=${CUSTOM_STATUS}&quot; &amp;gt;&amp;gt; $GITHUB_ENV
      echo &quot;BUILD_NAME=${BUILD_NAME}&quot; &amp;gt;&amp;gt; $GITHUB_ENV
      echo &quot;SLACK_EMOJI=${SLACK_EMOJI}&quot; &amp;gt;&amp;gt; $GITHUB_ENV&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;echo &quot;key: value&quot; &amp;gt;&amp;gt; 환경변수_등록_파일&lt;span&gt;&amp;nbsp;&lt;/span&gt;을 통해 환경변수를 지정해줄 수 있습니다:&lt;/li&gt;
&lt;li style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;...&lt;/span&gt; slack_notification jobs &lt;span style=&quot;color: #000000;&quot;&gt;...&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;steps&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;-&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;:&lt;/span&gt; CUSTOM_STATUS SET UP &lt;span style=&quot;color: #000000;&quot;&gt;run&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; ... BUILD_NAME Set up... if [ &quot;${{ needs.local_build_test.result }}&quot; = &quot;failure&quot; ] || \ [ &quot;${{ needs.deploy_staging.result }}&quot; = &quot;failure&quot; ] || \ [ &quot;${{ needs.deploy_production.result }}&quot; = &quot;failure&quot; ]; then CUSTOM_STATUS=&quot;Failure&quot; SLACK_EMOJI=&quot;:boom:&quot; elif [ &quot;${{ needs.local_build_test.result }}&quot; = &quot;cancelled&quot; ] || \ [ &quot;${{ needs.deploy_staging.result }}&quot; = &quot;cancelled&quot; ] || \ [ &quot;${{ needs.deploy_production.result }}&quot; = &quot;cancelled&quot; ]; then CUSTOM_STATUS=&quot;Aborted&quot; SLACK_EMOJI=&quot;:exclamation:&quot; else CUSTOM_STATUS=&quot;Success&quot; SLACK_EMOJI=&quot;:rocket:&quot; fi&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;️-webhook을-이용하여-슬랙메시지-보내기&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;✔️&amp;nbsp;Webhook을 이용하여 슬랙메시지 보내기&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;슬랙 메시지 전송 옵션은 아래와 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용 Action&lt;span&gt;&amp;nbsp;&lt;/span&gt;uses
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;rtCamp/action-slack-notify@v2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;슬랙 메시지에 전달 되는 변수&lt;span&gt;&amp;nbsp;&lt;/span&gt;env
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SLACK_WEBHOOK&lt;br /&gt;첫번째 단계에서 Github Repository에 지정한 환경변수를 불러옵니다.&lt;/li&gt;
&lt;li&gt;MSG_MINIMAL&lt;br /&gt;웹훅에서 기본값으로 보내주는 값들입니다. 불필요한 값은 해당 필드에 추가하여 제거해주고 더욱 깔끔한 슬랙 메시지로 커스터마이즈 할 수 있습니다.&lt;/li&gt;
&lt;li&gt;SLACK_CHNNEL&lt;br /&gt;슬랙 메시지가 전송 될 채널을 지정해줍니다.&lt;/li&gt;
&lt;li&gt;SLACK_COLOR&lt;br /&gt;job의 실행 결과의 색을 따르도록 지정합니다. 커스터마이즈 가능합니다.&lt;/li&gt;
&lt;li&gt;SLACK_ICON&lt;br /&gt;슬랙메시지가 보내질 때 프로필 사진을 지정할 수 있습니다. 커스터마이즈 가능합니다.&lt;/li&gt;
&lt;li&gt;SLACK_USERNAME&lt;br /&gt;슬랙메시지가 보내질 때 이름을 지정할 수 있습니다. 커스터마이즈 가능합니다.&lt;/li&gt;
&lt;li&gt;SLACK_TITLE&lt;br /&gt;${{ env.GITHUBENV에등록한_환경변수_key }} 구문을 활용하여 슬랙메시지가 보내질 때 타이틀을 지정할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;코드 예시&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;yaml&quot; style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;code&gt;# cicd.yml
- name: Send Slack Message
  uses: rtCamp/action-slack-notify@v2
  env:
    SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
    MSG_MINIMAL: ref,commit,actions url
    SLACK_CHANNEL: dev
    SLACK_COLOR: ${{ job.status }}
    SLACK_ICON: https://github.com/github.png
    SLACK_USERNAME: GitHub CI/CD
    SLACK_TITLE: '${{ env.SLACK_EMOJI }} ${{ env.BUILD_NAME }}: ${{ env.CUSTOM_STATUS }} ${{ env.SLACK_EMOJI }}'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CS/WEB</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>VHAL_</author>
      <guid isPermaLink="true">https://n1mss-e.tistory.com/40</guid>
      <comments>https://n1mss-e.tistory.com/40#entry40comment</comments>
      <pubDate>Sun, 17 Nov 2024 11:50:34 +0900</pubDate>
    </item>
    <item>
      <title>[CI/CD] 01. CI/CD란 무엇인가</title>
      <link>https://n1mss-e.tistory.com/39</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;CICD란?&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;CI/CD(Continuous Integration/Continuous Deployment or Delivery)는 코드 통합, 테스트, 빌드, 배포 과정을 자동화하여 개발 효율성을 높이고 품질을 유지하기 위한 소프트웨어 개발 방법론&lt;br /&gt;&lt;b&gt; &lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;1. CICD의 주요 개념&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;일반적인 앱의 개발 및 유지보수 단계는 아래와 같습니다. 여기서 지속적 통합 및 지속적 전달을 단계별로 자동화할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;843&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BB8jk/btsKLw0PjUe/b0Kj0O2mCGDOEEzNDoq7cK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BB8jk/btsKLw0PjUe/b0Kj0O2mCGDOEEzNDoq7cK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BB8jk/btsKLw0PjUe/b0Kj0O2mCGDOEEzNDoq7cK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBB8jk%2FbtsKLw0PjUe%2Fb0Kj0O2mCGDOEEzNDoq7cK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;369&quot; height=&quot;348&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;843&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BkR2c/btsKMGhgRjM/qtnZokvD5cOM0obTnSM6hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BkR2c/btsKMGhgRjM/qtnZokvD5cOM0obTnSM6hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BkR2c/btsKMGhgRjM/qtnZokvD5cOM0obTnSM6hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBkR2c%2FbtsKMGhgRjM%2FqtnZokvD5cOM0obTnSM6hk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;632&quot; height=&quot;222&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;427&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;CI (Continuous Integration) &lt;i&gt;'&lt;/i&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;i&gt; 지속적인 통합 '&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt; &lt;b&gt;개발자를 위한 자동화 프로세스라고 볼 수 있으며, Code - Build - Test 단계를 자동화할 수 있습니다.&lt;/b&gt; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;Code&lt;/b&gt; : 개발자가 코드를 원격 코드 저장소 (Ex. github repository)에 push하는 단계&lt;br /&gt;&lt;b&gt;Build&lt;/b&gt; : 원격 코드 저장소로부터 코드를 가져와 유닛 테스트 후 빌드하는 단계&lt;br /&gt;&lt;b&gt;Test&lt;/b&gt; : 코드 빌드의 결과물이 다른 컴포넌트와 잘 통합되는 지 확인하는 과정&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;애플리케이션에 대한 새로운 코드 변경 사항이 정기적으로 빌드 및 테스트되어 공유 리포지토리에 통합되므로 여러 명의 개발자가 동시에 애플리케이션 개발과 관련된 코드 작업을 할 경우 서로 충돌할 수 있는 문제를 해결할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;이전에는 각자 개발자가 작성한 코드를 합치고 난 후, 모두 모여서 빌드를 시작하고 나서야 문제점을 파악할 수 있었습니다. 지속적 통합이 적용된 개발팀은 코드를 머지하기 전, 이미 빌드 오류나 테스트 오류를 확인하여 훨씬 더 효율적인 개발을 할 수 있게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개발자가 작성한 코드를 자주(하루에도 여러 번) 저장소에 통합하는 프로세스.&lt;/li&gt;
&lt;li&gt;코드가 통합될 때마다 자동으로 테스트와 빌드를 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;CD (Continuous Delivery &amp;amp; Deployment) &lt;i&gt;'&lt;/i&gt;&lt;i&gt; 지속적인 제공 &amp;amp; 배포 '&lt;/i&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Release - Deploy - Operate 단계를 자동화할 수 있습니다. &lt;/b&gt;지&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;속적으로 통합된 코드를 자동으로 프로덕션 환경에 배포하는 프로세스이며 즉, 개발자가 원클릭으로 수작업 없이 빌드, 테스트, 배포까지의 자동화를 할 수 있습니다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;코드 변경 사항이 테스트 및 승인을 거쳐 자동으로 프로덕션 환경에 배포 (merge to main) 되고, 새로운 기능과 버그 수정 사항이 실제 사용자에게 빠르게 제공됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;Release&lt;/b&gt; : 배포 가능한 소프트웨어 패키지를 작성&lt;br /&gt;&lt;b&gt;Deploy&lt;/b&gt; : 프로비저닝을 실행하고 서비스를 사용자에게 노출 &amp;gt; 실질적인 배포&lt;br /&gt;&lt;b&gt;Operate&lt;/b&gt; : 서비스 현황을 파악하고 생길 수 있는 문제를 감지&lt;/blockquote&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Continuous Delivery: CI에서 생성된 빌드 결과물을 수동 승인 후 프로덕션 환경에 배포.&lt;/li&gt;
&lt;li&gt;Continuous Deployment: CI에서 생성된 결과물을 자동으로 프로덕션 환경에 배포.&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. CI/CD 파이프라인의 주요 구성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;개발자가 배포할 때마다 일일히 빌드하고 배포하는 과정을 진행하는 것은 한두 번이면 충분하겠지만, 이러한 과정이 수없이 진행된다면 일일히 이 과정을 수행하는 것이 번잡스럽고 지루할 것이다. 그래서 이 수없이 진행되는 배포 과정을 자동화시키는 방법을 구축하게 되는데, 그것을 CI/CD 파이프라인이라고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&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;1029&quot; data-origin-height=&quot;555&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpI58J/btsKMJ5Z6WG/fM7A7x4WZ4xtwLHvTsARJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpI58J/btsKMJ5Z6WG/fM7A7x4WZ4xtwLHvTsARJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpI58J/btsKMJ5Z6WG/fM7A7x4WZ4xtwLHvTsARJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpI58J%2FbtsKMJ5Z6WG%2FfM7A7x4WZ4xtwLHvTsARJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;506&quot; height=&quot;273&quot; data-origin-width=&quot;1029&quot; data-origin-height=&quot;555&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;1015&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kRKpX/btsKL5WixMI/6EMh1HjN2kzIBsYub6Wkv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kRKpX/btsKL5WixMI/6EMh1HjN2kzIBsYub6Wkv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kRKpX/btsKL5WixMI/6EMh1HjN2kzIBsYub6Wkv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkRKpX%2FbtsKL5WixMI%2F6EMh1HjN2kzIBsYub6Wkv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;454&quot; height=&quot;183&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2.1 소스 코드 관리 (Source)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;GitHub, GitLab, Bitbucket&lt;/b&gt;과 같은 플랫폼에서 소스 코드를 관리&lt;/li&gt;
&lt;li&gt;브랜치 전략(예: Git Flow, Trunk-Based)을 활용하여 작업 분리&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2.2 빌드 (Build)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드를 컴파일하고 의존성을 설치하여 실행 가능한 상태로 만드는 단계&lt;/li&gt;
&lt;li&gt;ex )
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FE : npm run build&lt;/li&gt;
&lt;li&gt;BE (Java): mvn clean package&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2.3 테스트 (Test)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;단위 테스트&lt;/b&gt;: 기능별 코드가 올바르게 동작하는지 확인&lt;/li&gt;
&lt;li&gt;&lt;b&gt;통합 테스트&lt;/b&gt;: 여러 컴포넌트 간 상호작용 테스트&lt;/li&gt;
&lt;li&gt;&lt;b&gt;E2E 테스트&lt;/b&gt;: 실제 사용자 환경에서의 테스트&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2.4 배포 (Deploy)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;스테이징 환경&lt;/b&gt;: 실제 배포 전에 테스트를 위한 환경&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로덕션 환경&lt;/b&gt;: 사용자에게 제공되는 환경&lt;/li&gt;
&lt;li&gt;배포 도구: Kubernetes, AWS ECS, Docker Swarm 등&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. CI/CD의 주요 도구&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3.1 CI/CD 플랫폼&lt;/b&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;GitHub Actions&lt;/b&gt;: GitHub 기반 CI/CD 워크플로우&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;GitLab CI/CD&lt;/b&gt;: GitLab 내장 CI/CD 기능&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Jenkins&lt;/b&gt;: 오픈소스 CI/CD 서버&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;CircleCI&lt;/b&gt;: 클라우드 기반 CI/CD 서비스&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Travis&lt;/b&gt; &lt;b&gt;CI&lt;/b&gt;: 간단한 설정으로 CI/CD 제공&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3.2 빌드 및 테스트 도구&lt;/b&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;FE&lt;/b&gt; : Jest, Mocha, Cypress (테스트), Webpack (빌드)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;BE (Java)&lt;/b&gt; : JUnit (테스트), Maven/Gradle (빌드)&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3.3 배포 도구&lt;/b&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Docker&lt;/b&gt;: 컨테이너 기반 애플리케이션 배포&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Kubernetes&lt;/b&gt; : 컨테이너 오케스트레이션 도구&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;AWS&lt;/b&gt; &lt;b&gt;ECS/EKS&lt;/b&gt; : AWS의 컨테이너 관리 서비스&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Google&lt;/b&gt; &lt;b&gt;Cloud&lt;/b&gt; &lt;b&gt;Build&lt;/b&gt; : Google Cloud의 CI/CD 서비스&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;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;</description>
      <category>CS/WEB</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>VHAL_</author>
      <guid isPermaLink="true">https://n1mss-e.tistory.com/39</guid>
      <comments>https://n1mss-e.tistory.com/39#entry39comment</comments>
      <pubDate>Fri, 15 Nov 2024 20:26:34 +0900</pubDate>
    </item>
    <item>
      <title>[API] 01. Restful API란?</title>
      <link>https://n1mss-e.tistory.com/38</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Restful API란?&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;REST API란 두 컴퓨터 시스템이 인터넷을 통해 정보를 안전하게 교환하기 위해 사용하는 인터페이스이며 REST를 기반으로 만들어진 API를 의미합니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;span style=&quot;text-align: left;&quot;&gt;REST API를 알기 위해 REST와 API에 대하여 먼저 알아보겠습니다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;API란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fbfbfb; color: #333333; text-align: start;&quot;&gt;API는 &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt;정의 및 프로토콜 집합을 사용하여 두 소프트웨어 구성 요소가 서로 통신할 수 있게 하는 메커니즘&lt;/b&gt;이며 &lt;span style=&quot;background-color: #fbfbfb; color: #333333; text-align: start;&quot;&gt;&lt;i&gt;Application Programming Interface(애플리케이션 프로그램 인터페이스)&lt;/i&gt;의 줄임말입니다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fbfbfb; color: #333333; text-align: start;&quot;&gt;다른 소프트웨어 시스템과 통신하기 위해 따라야 하는 규칙을 정의하며 웹 API는 클라이언트와 웹 리소스 사이의 게이트웨이라고 생각할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fbfbfb; color: #333333; text-align: start;&quot;&gt;REST란?&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fbfbfb; color: #333333; text-align: start;&quot;&gt;REST는 &lt;b&gt;API 작동 방식에 대한 조건을 부과하는 소프트웨어 아키텍처&lt;/b&gt;이며 &lt;i&gt;Representational State Transfer(REST)&lt;/i&gt;의 줄임말입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;REST 아키텍처 스타일 원칙&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Uniform Interface (균일한 인터페이스) : 클라이언트와 서버가 동일한 인터페이스를 통해 소통할 수 있도록 하며, 주로 HTTP 프로토콜을 사용합니다. &lt;/li&gt;
&lt;li&gt;Stateless (무상태성) : 각 요청이 독립적으로 처리되며, 서버는 클라이언트의 상태를 저장하지 않습니다.&lt;/li&gt;
&lt;li&gt;Layered System (계층화 시스템) : 요청과 응답은 여러 계층을 거쳐 전달되며, 이를 통해 보안과 확장성을 강화합니다.&lt;/li&gt;
&lt;li&gt;Cacheable (캐시 가능성) : 클라이언트는 응답을 캐싱할 수 있습니다. 이를 통해 성능을 개선할 수 있습니다.&lt;/li&gt;
&lt;li&gt;Code on Demand (온디맨드 코드) : 서버는 필요에 따라 클라이언트에 코드를 전송해 동적으로 기능을 확장할 수 있습니다 (선택적 원칙).&lt;/li&gt;
&lt;li&gt;Client-Server Architecture (클라이언트-서버 구조): 클라이언트와 서버의 책임을 분리하여 각각 독립적으로 발전할 수 있도록 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;즉, Rest란&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #333333; text-align: left;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: unset; color: #000000;&quot;&gt;&lt;span&gt;HTTP URI(Uniform Resource Identifier)를 통해 자원(Resource)을 명시하고&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: unset; color: #000000;&quot;&gt;HTTP Method(POST, GET, PUT, DELETE, PATCH 등)를 통해&lt;/li&gt;
&lt;li style=&quot;list-style-type: unset; color: #000000;&quot;&gt;해당 자원(URI)에 대한 CRUD Operation을 적용하는 것을 의미합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;CRUD Operation이란&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;CRUD는 대부분의 컴퓨터 소프트웨어가 가지는 기본적인 데이터 처리 기능인 &lt;br /&gt;Create(생성), Read(읽기), Update(갱신), Delete(삭제)를 묶어서 일컫는 말&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Create : 데이터 생성(POST)&lt;br /&gt;Read : 데이터 조회(GET)&lt;br /&gt;Update : 데이터 수정(PUT, PATCH)&lt;br /&gt;Delete : 데이터 삭제(DELETE)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;REST 구성 요소&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #333333; text-align: left;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;자원(Resource) : HTTP URI&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;자원에 대한 행위(Verb) : HTTP&lt;span&gt;&amp;nbsp;&lt;/span&gt;Method&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;자원에 대한 행위의 내용 (Representations) : HTTP Message Pay Load&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;REST의 장단점&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;장점&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;HTTP 프로토콜의 인프라를 그대로 사용하므로 REST API 사용을 위한 별도의 인프라를 구출할 필요가 없다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;HTTP 프로토콜의 표준을 최대한 활용하여 여러 추가적인 장점을 함께 가져갈 수 있게 해 준다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span&gt;HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용이 가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span&gt;Hypermedia API의 기본을 충실히 지키면서 범용성을 보장한다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span&gt;REST API 메시지가 의도하는 바를 명확하게 나타내므로 의도하는 바를 쉽게 파악할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span&gt;여러 가지 서비스 디자인에서 생길 수 있는 문제를 최소화한다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span&gt;서버와 클라이언트의 역할을 명확하게 분리한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단점&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;표준이 자체가 존재하지 않아 정의가 필요하다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span&gt;HTTP Method 형태가 제한적이다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span&gt;브라우저를 통해 테스트할 일이 많은 서비스라면 쉽게 고칠 수 있는 URL보다 Header 정보의 값을 처리해야 하므로 전문성이 요구된다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span&gt;구형 브라우저에서 호환이 되지 않아 지원해주지 못하는 동작이 많다.(익스폴로어)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;그럼 다시 돌아와서, RESFUL&amp;nbsp; API란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&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;1123&quot; data-origin-height=&quot;415&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lzzBp/btsKJjGVZtJ/LerhCYnlBqNCSvkIoiUugk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lzzBp/btsKJjGVZtJ/LerhCYnlBqNCSvkIoiUugk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lzzBp/btsKJjGVZtJ/LerhCYnlBqNCSvkIoiUugk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlzzBp%2FbtsKJjGVZtJ%2FLerhCYnlBqNCSvkIoiUugk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1123&quot; height=&quot;415&quot; data-origin-width=&quot;1123&quot; data-origin-height=&quot;415&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;1004&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcdq7Q/btsKIPe32xM/y02Ep5JwrkLavps6mN4hpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcdq7Q/btsKIPe32xM/y02Ep5JwrkLavps6mN4hpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcdq7Q/btsKIPe32xM/y02Ep5JwrkLavps6mN4hpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbcdq7Q%2FbtsKIPe32xM%2Fy02Ep5JwrkLavps6mN4hpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1004&quot; height=&quot;454&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;RESPT API란 REST의 원리를 따르는 API를 의미합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 REST API를 올바르게 설계하기 위해서는 지켜야 하는 몇가지 규칙이 있으며 HTTP 메서드와 함께 해당 규칙을 알아 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;HTTP 메서드&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;RESTful API에서 사용하는 주요 HTTP 메서드와 역할을 설명합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;GET&lt;/b&gt;: 자원의 조회에 사용됩니다. 리소스를 가져올 때 주로 사용하며, 데이터 변경을 일으키지 않습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;POST&lt;/b&gt;: 자원의 생성에 사용됩니다. 클라이언트에서 서버로 데이터를 전송해 새 리소스를 만듭니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PUT&lt;/b&gt;: 자원의 전체 수정을 위해 사용됩니다. 기존 리소스를 업데이트합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PATCH&lt;/b&gt;: 자원의 부분 수정을 위해 사용됩니다. 일부분만 변경할 때 사용됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DELETE&lt;/b&gt;: 자원의 삭제에 사용됩니다. 클라이언트가 특정 자원을 삭제할 때 사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;RESTful API 설계 예시&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;명사형 URI 사용&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RESTful API는 &lt;b&gt;동사 대신 명사&lt;/b&gt;를 사용하여 리소스를 표현합니다.&lt;/li&gt;
&lt;li&gt;예시:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;올바른 사용: /users, /products, /orders&lt;/li&gt;
&lt;li&gt;잘못된 사용: /getUsers, /createProduct, /deleteOrder&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;리소스의 상태나 액션은 HTTP 메서드로 전달하고, URI에는 리소스만 표시합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;소문자 URI와 일관성 유지&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URI에서는 &lt;b&gt;대문자보다는 소문자를 사용&lt;/b&gt;하며, 일관성 있는 표기를 유지합니다.&lt;/li&gt;
&lt;li&gt;예시:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;올바른 사용: /users, /products, /orders&lt;/li&gt;
&lt;li&gt;잘못된 사용: /Users, /PRODUCTS&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;마지막에 슬래시 (/) 포함하지 않기&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URI 끝에 슬래시를 추가하지 않는 것이 REST 설계 규칙입니다. 대부분의 RESTful API에서는 URI 마지막에 슬래시가 없는 것을 표준으로 권장합니다.&lt;/li&gt;
&lt;li&gt;예시:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;올바른 사용: /products/123&lt;/li&gt;
&lt;li&gt;잘못된 사용: /products/123/&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언더바(_) 대신 하이픈(-) 사용&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URI에서 여러 단어를 조합할 때는 **하이픈(-)**을 사용하여 단어를 구분합니다. 언더바는 가독성이 떨어지기 때문에 REST 설계에서는 하이픈을 권장합니다.&lt;/li&gt;
&lt;li&gt;예시:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;올바른 사용: /user-accounts, /order-details&lt;/li&gt;
&lt;li&gt;잘못된 사용: /user_accounts, /order_details&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;파일 확장자를 포함하지 않기&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RESTful API에서는 자원 형식을 나타내기 위해 파일 확장자를 사용하지 않습니다. 대신 클라이언트가 요청 시 &lt;b&gt;Accept 헤더&lt;/b&gt;를 사용하여 원하는 응답 형식을 지정합니다.&lt;/li&gt;
&lt;li&gt;예시:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;올바른 사용: /products&lt;/li&gt;
&lt;li&gt;잘못된 사용: /products.json, /products.xml&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;행위를 URI에 포함하지 않기&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URI는 자원만 나타내며, 동작은 HTTP 메서드로 전달합니다. 예를 들어, 조회, 생성, 수정, 삭제 등의 행위는 각각 GET, POST, PUT, DELETE와 같은 메서드로 표현됩니다.&lt;/li&gt;
&lt;li&gt;예시:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;올바른 사용:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GET /users (사용자 목록 조회)&lt;/li&gt;
&lt;li&gt;POST /users (사용자 생성)&lt;/li&gt;
&lt;li&gt;PUT /users/{id} (특정 사용자 정보 수정)&lt;/li&gt;
&lt;li&gt;DELETE /users/{id} (특정 사용자 삭제)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;잘못된 사용:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;/getAllUsers, /deleteUser/{id}, /updateUser/{id}&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HTTP 상태 코드 사용&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RESTful API는 클라이언트에게 응답 시, 요청의 결과를 HTTP 상태 코드로 전달합니다. 각 상태 코드는 요청 성공, 실패, 잘못된 입력 등의 상황을 나타내며 클라이언트가 적절한 후속 조치를 취할 수 있게 도와줍니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;200 OK&lt;/b&gt;: 요청이 성공적으로 처리되었습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;201 Created&lt;/b&gt;: 리소스가 성공적으로 생성되었습니다 (주로 POST 요청 후 사용).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;204 No Content&lt;/b&gt;: 요청이 성공적으로 처리되었으나 반환할 내용이 없습니다 (DELETE 요청 후 주로 사용).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;400 Bad Request&lt;/b&gt;: 잘못된 요청이 전달되었습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;404 Not Found&lt;/b&gt;: 요청한 리소스를 찾을 수 없습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;500 Internal Server Error&lt;/b&gt;: 서버에서 요청을 처리하는 중에 오류가 발생했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;예시:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GET /users/123 요청이 성공하면 &lt;b&gt;200 OK&lt;/b&gt;와 사용자 데이터를 반환&lt;/li&gt;
&lt;li&gt;POST /users 요청으로 사용자 생성 시 &lt;b&gt;201 Created&lt;/b&gt;와 새 사용자 정보를 반환&lt;/li&gt;
&lt;li&gt;DELETE /users/123 요청이 성공하면 &lt;b&gt;204 No Content&lt;/b&gt; 응답&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;RESTFUL이란 REST의 원리를 따르는 시스템을 의미합니다. 하지만 REST를 사용했다 하여 모두가 RESTful 한 것은 아닙니다.&amp;nbsp;&amp;nbsp;REST API의 설계 규칙을 올바르게 지킨 시스템을 RESTful하다 말할 수 있습니다.&lt;/blockquote&gt;</description>
      <category>CS/WEB</category>
      <author>VHAL_</author>
      <guid isPermaLink="true">https://n1mss-e.tistory.com/38</guid>
      <comments>https://n1mss-e.tistory.com/38#entry38comment</comments>
      <pubDate>Thu, 14 Nov 2024 14:41:16 +0900</pubDate>
    </item>
    <item>
      <title>[Image Processing] 3. Intensity Transformations and Spatial Filtering</title>
      <link>https://n1mss-e.tistory.com/37</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;** 해당 시리즈는 타블로그의 글을 참고하여 공부용으로 기록해놓은 글입니다 **&lt;/span&gt;&lt;/p&gt;
&lt;blockquote id=&quot;-basics&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Basics&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;h3 id=&quot;1-intensity-trasnform-밝기값-변환&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1. Intensity Trasnform (밝기값 변환)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원본 이미지f의 밝기를 변환하여 출력 이미지g를 내보내는 함수T&amp;nbsp;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;238&quot; data-origin-height=&quot;31&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KuMPP/btsKIAolISp/qqdQPVKxBQZfh11FDulnc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KuMPP/btsKIAolISp/qqdQPVKxBQZfh11FDulnc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KuMPP/btsKIAolISp/qqdQPVKxBQZfh11FDulnc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKuMPP%2FbtsKIAolISp%2FqqdQPVKxBQZfh11FDulnc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;238&quot; height=&quot;31&quot; data-origin-width=&quot;238&quot; data-origin-height=&quot;31&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote style=&quot;color: #212529; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;h4 id=&quot;-intensity-trasnform-funtion-t&quot; data-ke-size=&quot;size20&quot;&gt;◾ Intensity Trasnform funtion&lt;span&gt;&amp;nbsp;&lt;/span&gt;T&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(aka. grey-level function, mapping function)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존 이미지의 픽셀값r을&lt;span&gt;&amp;nbsp;&lt;/span&gt;s로 변환하는 함수T&lt;br /&gt;(T의 종류는 여러가지)&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;80&quot; data-origin-height=&quot;24&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S3UKA/btsKHxF81J2/oxbVk1Q5MzC0D9rdSJlbJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S3UKA/btsKHxF81J2/oxbVk1Q5MzC0D9rdSJlbJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S3UKA/btsKHxF81J2/oxbVk1Q5MzC0D9rdSJlbJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS3UKA%2FbtsKHxF81J2%2FoxbVk1Q5MzC0D9rdSJlbJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;80&quot; height=&quot;24&quot; data-origin-width=&quot;80&quot; data-origin-height=&quot;24&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;499&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dRZftd/btsKHIuakXV/RQT9jUSdFuNOM6vedC5P8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dRZftd/btsKHIuakXV/RQT9jUSdFuNOM6vedC5P8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dRZftd/btsKHIuakXV/RQT9jUSdFuNOM6vedC5P8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdRZftd%2FbtsKHIuakXV%2FRQT9jUSdFuNOM6vedC5P8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;499&quot; height=&quot;247&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;247&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;2-spatial-domain-operator-공간-영역-연산&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. Spatial domain Operator (공간 영역 연산)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 픽셀을 계산할 때 주변(neighbor,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;window&lt;/b&gt;)을 고려하는 것&lt;/li&gt;
&lt;li&gt;neighbor pixels의 평균으로 출력 이미지g를 얻음&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;229&quot; data-origin-height=&quot;39&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nBBPa/btsKHIHH8Ec/1BkJwHCCkzKw7XcJJggIY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nBBPa/btsKHIHH8Ec/1BkJwHCCkzKw7XcJJggIY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nBBPa/btsKHIHH8Ec/1BkJwHCCkzKw7XcJJggIY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnBBPa%2FbtsKHIHH8Ec%2F1BkJwHCCkzKw7XcJJggIY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;229&quot; height=&quot;39&quot; data-origin-width=&quot;229&quot; data-origin-height=&quot;39&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;356&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7La7L/btsKH6uwEON/0U7Ty3IIuuMozLKvxXCkaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7La7L/btsKH6uwEON/0U7Ty3IIuuMozLKvxXCkaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7La7L/btsKH6uwEON/0U7Ty3IIuuMozLKvxXCkaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7La7L%2FbtsKH6uwEON%2F0U7Ty3IIuuMozLKvxXCkaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;356&quot; height=&quot;310&quot; data-origin-width=&quot;356&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;1-4-neighbor-averaging&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1. 4-neighbor Averaging&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자신 포함 4이웃의 픽셀 값 평균으로 자신의 새로운 픽셀 값 얻음&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;42&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6milx/btsKJmpAKnH/kZ968HtTnaGTvwAC85Sx51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6milx/btsKJmpAKnH/kZ968HtTnaGTvwAC85Sx51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6milx/btsKJmpAKnH/kZ968HtTnaGTvwAC85Sx51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6milx%2FbtsKJmpAKnH%2FkZ968HtTnaGTvwAC85Sx51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;772&quot; height=&quot;42&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;42&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;2-8-neighbor-averaging&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2. 8-neighbor Averaging&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자신 포함 8이웃의 픽셀 값 평균으로 자신의 새로운 픽셀 값 얻음&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;319&quot; data-origin-height=&quot;41&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r3TiD/btsKHJmjXg9/5guT0KAh0UGk4S6kyXLnx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r3TiD/btsKHJmjXg9/5guT0KAh0UGk4S6kyXLnx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r3TiD/btsKHJmjXg9/5guT0KAh0UGk4S6kyXLnx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr3TiD%2FbtsKHJmjXg9%2F5guT0KAh0UGk4S6kyXLnx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;319&quot; height=&quot;41&quot; data-origin-width=&quot;319&quot; data-origin-height=&quot;41&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-filtering&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3. Filtering&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Spatial domain operator를 filtering이라고 함&lt;/li&gt;
&lt;li&gt;위의 Averaging을 한 값들의 집합&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;blockquote id=&quot; -intensity-transformation-functions-종류&quot; data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Intensity Transformation Functions 종류&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;h3 id=&quot;1-image-negatives&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1. Image Negatives&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원본 이미지의 범위 [0, L-1]&amp;nbsp;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;139&quot; data-origin-height=&quot;34&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/00w5U/btsKHJs56Vk/GzNFR53sNmBV7pgjIduPe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/00w5U/btsKHJs56Vk/GzNFR53sNmBV7pgjIduPe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/00w5U/btsKHJs56Vk/GzNFR53sNmBV7pgjIduPe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F00w5U%2FbtsKHJs56Vk%2FGzNFR53sNmBV7pgjIduPe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;139&quot; height=&quot;34&quot; data-origin-width=&quot;139&quot; data-origin-height=&quot;34&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;454&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/utJ1z/btsKI5uFmuL/ieGKohO6fIElaXQKCyLjI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/utJ1z/btsKI5uFmuL/ieGKohO6fIElaXQKCyLjI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/utJ1z/btsKI5uFmuL/ieGKohO6fIElaXQKCyLjI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FutJ1z%2FbtsKI5uFmuL%2FieGKohO6fIElaXQKCyLjI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;454&quot; height=&quot;270&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-log-transformation&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. Log Transformation&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원본이미지가 0일 때 0이 나옴&lt;/li&gt;
&lt;li&gt;상수&lt;span&gt;&amp;nbsp;&lt;/span&gt;c&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;152&quot; data-origin-height=&quot;30&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwbGaK/btsKIeeLAQ9/ObJN9pLfaNGe4tZSppkEYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwbGaK/btsKIeeLAQ9/ObJN9pLfaNGe4tZSppkEYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwbGaK/btsKIeeLAQ9/ObJN9pLfaNGe4tZSppkEYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwbGaK%2FbtsKIeeLAQ9%2FObJN9pLfaNGe4tZSppkEYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;152&quot; height=&quot;30&quot; data-origin-width=&quot;152&quot; data-origin-height=&quot;30&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;0은 0이고, 조금이라도 밝으면 밝게 나타남&lt;/li&gt;
&lt;li&gt;어두운 부분의 디테일을 살리지만 밝은 부분의 디테일은 감소&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PUdJA/btsKIVMw4B6/HHR2nJPU90kRYeMSTRTrl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PUdJA/btsKIVMw4B6/HHR2nJPU90kRYeMSTRTrl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PUdJA/btsKIVMw4B6/HHR2nJPU90kRYeMSTRTrl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPUdJA%2FbtsKIVMw4B6%2FHHR2nJPU90kRYeMSTRTrl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;414&quot; height=&quot;215&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;215&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-pow-law-gamma-transformation&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3. Pow-Law (Gamma) Transformation&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Log Transformaion보다 자주 사용&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;202&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/phCaJ/btsKJABbauN/eFc85MoW843LzIsfAoFTP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/phCaJ/btsKJABbauN/eFc85MoW843LzIsfAoFTP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/phCaJ/btsKJABbauN/eFc85MoW843LzIsfAoFTP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FphCaJ%2FbtsKJABbauN%2FeFc85MoW843LzIsfAoFTP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;202&quot; height=&quot;57&quot; data-origin-width=&quot;202&quot; data-origin-height=&quot;57&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;403&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mNhbL/btsKJB7TyBo/79gaOanjbkKNWPbWgRr6NK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mNhbL/btsKJB7TyBo/79gaOanjbkKNWPbWgRr6NK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mNhbL/btsKJB7TyBo/79gaOanjbkKNWPbWgRr6NK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmNhbL%2FbtsKJB7TyBo%2F79gaOanjbkKNWPbWgRr6NK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;403&quot; height=&quot;369&quot; data-origin-width=&quot;403&quot; data-origin-height=&quot;369&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote style=&quot;color: #212529; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;gamma;=1 -&amp;gt; 입력값 = 출력값&lt;/li&gt;
&lt;li&gt;&amp;gamma;&amp;lt;1 -&amp;gt; 어두운 부분의 디테일 살아남&lt;/li&gt;
&lt;li&gt;&amp;gamma;&amp;gt;1 -&amp;gt; 밝은 부분의 디테일 살아남&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;기울기가 클수록 디테일이 크게 살아남 (input이 작아도 대비(변화)가 높아진다)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;gamma;가 점점 감소하는 경우와 / 점점 증가하는 경우&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ejflU0/btsKJEDx17o/7VFTCakexkMca2VCWkZKIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ejflU0/btsKJEDx17o/7VFTCakexkMca2VCWkZKIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ejflU0/btsKJEDx17o/7VFTCakexkMca2VCWkZKIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FejflU0%2FbtsKJEDx17o%2F7VFTCakexkMca2VCWkZKIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;917&quot; height=&quot;532&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;532&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❗감마가 낮아질 때 / 높아질 때의 기울기, 계수 등 그래프와의 관계 생각해보기&lt;/p&gt;
&lt;blockquote style=&quot;color: #212529; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;h4 id=&quot;-monitor-response&quot; data-ke-size=&quot;size20&quot;&gt;◾ Monitor response&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모니터에서 가장 밝은 값은 대략 L = c^2.2&lt;/li&gt;
&lt;li&gt;보통 실제 이미지들은 감마 연산을 거쳐서 저장된다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;156&quot; data-origin-height=&quot;39&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csipBK/btsKJBth7bo/d23g1EC8XztgJK2bkJOWy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csipBK/btsKJBth7bo/d23g1EC8XztgJK2bkJOWy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csipBK/btsKJBth7bo/d23g1EC8XztgJK2bkJOWy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsipBK%2FbtsKJBth7bo%2Fd23g1EC8XztgJK2bkJOWy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;156&quot; height=&quot;39&quot; data-origin-width=&quot;156&quot; data-origin-height=&quot;39&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;Linearization&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;238&quot; data-origin-height=&quot;34&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R80dO/btsKIT8237W/qSbxr9JbiMKHjPHvsvc5p0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R80dO/btsKIT8237W/qSbxr9JbiMKHjPHvsvc5p0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R80dO/btsKIT8237W/qSbxr9JbiMKHjPHvsvc5p0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR80dO%2FbtsKIT8237W%2FqSbxr9JbiMKHjPHvsvc5p0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;238&quot; height=&quot;34&quot; data-origin-width=&quot;238&quot; data-origin-height=&quot;34&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;4-piecewise-linear-transformation-부분선형변환함수&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;4. Piecewise-Linear Transformation (부분선형변환함수)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좀 더 복잡한 변환 기능을 형성하기 위해 임의로 함수를 정의할 수 있음&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t1zfy/btsKHfMxbDA/E1ZCpR3FfEEtaS4EJf5Rt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t1zfy/btsKHfMxbDA/E1ZCpR3FfEEtaS4EJf5Rt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t1zfy/btsKHfMxbDA/E1ZCpR3FfEEtaS4EJf5Rt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft1zfy%2FbtsKHfMxbDA%2FE1ZCpR3FfEEtaS4EJf5Rt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;619&quot; height=&quot;346&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;346&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote style=&quot;color: #212529; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;a&lt;span&gt;&amp;nbsp;&lt;/span&gt;- 기울기, 기울기가 가파를수록 대비가 높아져 어두움과 밝음의 구분이 쉬워짐 -&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Contrast&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;b&lt;span&gt;&amp;nbsp;&lt;/span&gt;- b가 양수면 전체 이미지가 밝아지고, 음수면 어두워짐 -&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Brightness&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h4 id=&quot;ex-intensity-slicing&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ex) Intensity Slicing&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정한 밝기 범위만 밝게하고 나머지는 억제&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bN2R3Q/btsKJyXE1Rs/7D3ibok7ILCWjEV8XGbXm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bN2R3Q/btsKJyXE1Rs/7D3ibok7ILCWjEV8XGbXm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bN2R3Q/btsKJyXE1Rs/7D3ibok7ILCWjEV8XGbXm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbN2R3Q%2FbtsKJyXE1Rs%2F7D3ibok7ILCWjEV8XGbXm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;710&quot; height=&quot;506&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;506&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;blockquote id=&quot; -histogram-processing&quot; data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;Histogram Processing&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;h3 id=&quot;1-image-intensity-histogram&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1. Image Intensity Histogram&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 밝기마다 해당하는 픽셀 수를 나타낸 그래프 (특정한 픽셀 값을이 존재할 확률)&amp;nbsp;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;431&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dr9ze/btsKHbDChx4/ljScEDEftBDBIDzQ4bakN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dr9ze/btsKHbDChx4/ljScEDEftBDBIDzQ4bakN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dr9ze/btsKHbDChx4/ljScEDEftBDBIDzQ4bakN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDr9ze%2FbtsKHbDChx4%2FljScEDEftBDBIDzQ4bakN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;902&quot; height=&quot;431&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;431&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;어두울 수록 왼쪽에 몰려있고, 밝으면 오른쪽에 몰려있다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgRmfL/btsKIDL8Hhr/3L6KkYvqBdhwtYr7pLg181/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgRmfL/btsKIDL8Hhr/3L6KkYvqBdhwtYr7pLg181/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgRmfL/btsKIDL8Hhr/3L6KkYvqBdhwtYr7pLg181/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgRmfL%2FbtsKIDL8Hhr%2F3L6KkYvqBdhwtYr7pLg181%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;286&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;낮은 대비를 가지면 가운데 몰려있고, 대비가 높으면 고르게 잘 퍼져있다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8bmsi/btsKGUPpZRb/qbuDCSuFan2KkoP1xzNNzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8bmsi/btsKGUPpZRb/qbuDCSuFan2KkoP1xzNNzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8bmsi/btsKGUPpZRb/qbuDCSuFan2KkoP1xzNNzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8bmsi%2FbtsKGUPpZRb%2FqbuDCSuFan2KkoP1xzNNzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;264&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;264&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;고르게 잘 퍼진 히스토그램을 만드는 것이 목표 (평탄화)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-probability-distribution-function-pdf-확률분포&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. Probability distribution function (PDF, 확률분포)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;r의 밝기일 확률 = 특정&lt;span&gt;&amp;nbsp;&lt;/span&gt;r의 밝기를 가진 픽셀의 수 / 전체&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;161&quot; data-origin-height=&quot;54&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5obFG/btsKIQdpvTO/9jyaiFiYSknn5mxefrnb70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5obFG/btsKIQdpvTO/9jyaiFiYSknn5mxefrnb70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5obFG/btsKIQdpvTO/9jyaiFiYSknn5mxefrnb70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5obFG%2FbtsKIQdpvTO%2F9jyaiFiYSknn5mxefrnb70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;161&quot; height=&quot;54&quot; data-origin-width=&quot;161&quot; data-origin-height=&quot;54&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;누적분포 = 0~r 까지의 확률의 합&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;218&quot; data-origin-height=&quot;33&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgllBO/btsKIR4rCc2/KP0X0aKCZYiAYExmLFRVC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgllBO/btsKIR4rCc2/KP0X0aKCZYiAYExmLFRVC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgllBO/btsKIR4rCc2/KP0X0aKCZYiAYExmLFRVC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgllBO%2FbtsKIR4rCc2%2FKP0X0aKCZYiAYExmLFRVC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;218&quot; height=&quot;33&quot; data-origin-width=&quot;218&quot; data-origin-height=&quot;33&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;평탄화(좋은 대비를 가지는 이미지)가 되려면 모든 히스토그램의 값이 상수면 좋겠다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;181&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJetvu/btsKIPZRFTK/OUKhthUnx4kkTypfrkj7Nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJetvu/btsKIPZRFTK/OUKhthUnx4kkTypfrkj7Nk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJetvu/btsKIPZRFTK/OUKhthUnx4kkTypfrkj7Nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJetvu%2FbtsKIPZRFTK%2FOUKhthUnx4kkTypfrkj7Nk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;586&quot; height=&quot;181&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;181&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-histogram-equalization-히스토그램-평탄화&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3. Histogram Equalization (히스토그램 평탄화)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;평탄화되는 intensity transformation 함수&lt;/li&gt;
&lt;li&gt;x커지면 y도 커지는 단조함수(monotonically increasing)&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;265&quot; data-origin-height=&quot;43&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpIwne/btsKIxFanYN/XAhXwkYxtpc9TK76FHkkO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpIwne/btsKIxFanYN/XAhXwkYxtpc9TK76FHkkO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpIwne/btsKIxFanYN/XAhXwkYxtpc9TK76FHkkO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpIwne%2FbtsKIxFanYN%2FXAhXwkYxtpc9TK76FHkkO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;265&quot; height=&quot;43&quot; data-origin-width=&quot;265&quot; data-origin-height=&quot;43&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;181&quot; data-origin-height=&quot;31&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ehYjbx/btsKHZ3n8er/H7hkZYfEpoMWlmBTBRZKXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ehYjbx/btsKHZ3n8er/H7hkZYfEpoMWlmBTBRZKXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ehYjbx/btsKHZ3n8er/H7hkZYfEpoMWlmBTBRZKXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FehYjbx%2FbtsKHZ3n8er%2FH7hkZYfEpoMWlmBTBRZKXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;181&quot; height=&quot;31&quot; data-origin-width=&quot;181&quot; data-origin-height=&quot;31&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;545&quot; data-origin-height=&quot;292&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/laDO9/btsKIajnBUh/Oajd4drqlrS2BiH0mwCKW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/laDO9/btsKIajnBUh/Oajd4drqlrS2BiH0mwCKW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/laDO9/btsKIajnBUh/Oajd4drqlrS2BiH0mwCKW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlaDO9%2FbtsKIajnBUh%2FOajd4drqlrS2BiH0mwCKW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;545&quot; height=&quot;292&quot; data-origin-width=&quot;545&quot; data-origin-height=&quot;292&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;-implementation&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;◾ Implementation&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;r의 밝기일 확률의 누적분포와&lt;span&gt;&amp;nbsp;&lt;/span&gt;s의 밝기일 확률의 누적분포가 같다&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;119&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/laoK5/btsKH7UyoH4/hmnP0RAYQzAhLSK5XCePEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/laoK5/btsKH7UyoH4/hmnP0RAYQzAhLSK5XCePEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/laoK5/btsKH7UyoH4/hmnP0RAYQzAhLSK5XCePEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlaoK5%2FbtsKH7UyoH4%2FhmnP0RAYQzAhLSK5XCePEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;743&quot; height=&quot;119&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;119&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;-result&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;◾ Result&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어둡든 밝든 거의 일정한 값(밝기)을 가진다 라는 특징을 가진다.&lt;/li&gt;
&lt;li&gt;사람이 보기 좋다에 초점을 맞춘 것은 X&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bteyZo/btsKJnovGf0/cyjz1hbxt7RBOKZqpw7La1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bteyZo/btsKJnovGf0/cyjz1hbxt7RBOKZqpw7La1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bteyZo/btsKJnovGf0/cyjz1hbxt7RBOKZqpw7La1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbteyZo%2FbtsKJnovGf0%2Fcyjz1hbxt7RBOKZqpw7La1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1064&quot; height=&quot;405&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;405&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;4-localadaptive-histogram-equalization-ahe&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;4. Local(adaptive) histogram equalization (AHE)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;global 정규화는 local 대비를 조절할 수 없기 때문에 window에서의 정규화를 해서 local의 대비를 조절한다.&lt;/li&gt;
&lt;li&gt;구역마다 정규화 시 경계부분이 어색할 수 있기 때문에 옆 부분과 자연스럽게 섞어준다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctrQhT/btsKHHaZWPT/2k2T5A5rlKhIV1b5vbYxe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctrQhT/btsKHHaZWPT/2k2T5A5rlKhIV1b5vbYxe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctrQhT/btsKHHaZWPT/2k2T5A5rlKhIV1b5vbYxe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctrQhT%2FbtsKHHaZWPT%2F2k2T5A5rlKhIV1b5vbYxe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;291&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;291&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;blockquote id=&quot; -spatial-filtering-fundamentals&quot; data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Spatial Filtering Fundamentals&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;h3 id=&quot;1-spatial-filtering-공간-필터링&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1. Spatial Filtering (공간 필터링)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지를 공간적으로 필터링&lt;/li&gt;
&lt;li&gt;미리 정의된 Operationw&lt;span&gt;&amp;nbsp;&lt;/span&gt;(kernel, mask, ...)&lt;/li&gt;
&lt;li&gt;Outputg는 고정, Inputf는 유동적&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;219&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/by886B/btsKIeZ9Krj/dSHtd6m63VDdiKOa9HFxwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/by886B/btsKIeZ9Krj/dSHtd6m63VDdiKOa9HFxwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/by886B/btsKIeZ9Krj/dSHtd6m63VDdiKOa9HFxwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fby886B%2FbtsKIeZ9Krj%2FdSHtd6m63VDdiKOa9HFxwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;702&quot; height=&quot;219&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;219&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;1280&quot; data-origin-height=&quot;551&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Zmb8l/btsKIuhBang/PuZTqAelSt2o3zeq1jxJB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Zmb8l/btsKIuhBang/PuZTqAelSt2o3zeq1jxJB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Zmb8l/btsKIuhBang/PuZTqAelSt2o3zeq1jxJB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZmb8l%2FbtsKIuhBang%2FPuZTqAelSt2o3zeq1jxJB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;551&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;551&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;-similar-concept&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;◾ Similar concept&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Correlation(상관관계)&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 개의 독립적인 것들이 어떤 관계를 가지는가&lt;/li&gt;
&lt;li&gt;Spatial filtering과 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Convolution&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 함수를 서로 곱해 합친다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;39&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cm0zDe/btsKHXdzaU6/tm3JbjbYvlT1iIlIB9s37K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cm0zDe/btsKHXdzaU6/tm3JbjbYvlT1iIlIB9s37K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cm0zDe/btsKHXdzaU6/tm3JbjbYvlT1iIlIB9s37K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcm0zDe%2FbtsKHXdzaU6%2Ftm3JbjbYvlT1iIlIB9s37K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;676&quot; height=&quot;39&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;39&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-padding&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. Padding&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모서리 픽셀을 필터링하면 neighborhood가 존재하지 않는 부분도 생김.&lt;/li&gt;
&lt;li&gt;그래서 네 모서리에 임의로 픽셀을 추가한다&lt;br /&gt;(실제로 이미지를 키우는 것은 아니고, 필요한 위치에서 픽셀을 참조해서 해당하는 값을 전달)&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;449&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhujMv/btsKIRDp5SL/s3b7V60LwELKzadz3pRNYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhujMv/btsKIRDp5SL/s3b7V60LwELKzadz3pRNYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhujMv/btsKIRDp5SL/s3b7V60LwELKzadz3pRNYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhujMv%2FbtsKIRDp5SL%2Fs3b7V60LwELKzadz3pRNYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;449&quot; height=&quot;458&quot; data-origin-width=&quot;449&quot; data-origin-height=&quot;458&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;Constant padding의 경우, 보통 0으로 채운다. (zero padding)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;blockquote id=&quot;-smoothing-spatial-filters&quot; data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;Smoothing Spatial Filters&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위의 Spatial Filtering의 Operation&lt;span&gt;&amp;nbsp;&lt;/span&gt;w함수의 역할 중 하나&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;이미지를 부드럽게 만들기 위해 노이즈를 제거&lt;/li&gt;
&lt;li&gt;해상도가 낮아짐&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;1-averaging-filter-box-filter&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1. Averaging Filter (box filter)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;노이즈 제거를 위해 주변에서 좀 튀는 픽셀을 주변과 비슷하게 바꿔줌&lt;/li&gt;
&lt;li&gt;neighborhood의 평균&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bilXdv/btsKI5nR63z/iz4XbEker58rAlKkzKmluk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bilXdv/btsKI5nR63z/iz4XbEker58rAlKkzKmluk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bilXdv/btsKI5nR63z/iz4XbEker58rAlKkzKmluk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbilXdv%2FbtsKI5nR63z%2Fiz4XbEker58rAlKkzKmluk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;247&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;247&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;479&quot; data-origin-height=&quot;785&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bptUpV/btsKGTJI3pD/x1AQ7kprDuztwCGlWg9kqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bptUpV/btsKGTJI3pD/x1AQ7kprDuztwCGlWg9kqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bptUpV/btsKGTJI3pD/x1AQ7kprDuztwCGlWg9kqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbptUpV%2FbtsKGTJI3pD%2Fx1AQ7kprDuztwCGlWg9kqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;479&quot; height=&quot;785&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;785&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-weighted-averaging-filter-gaussian&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. Weighted Averaging Filter (Gaussian)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위의 이미지처럼 averaging filtering을 많이 하면 보이는 경계를 보완하기 위한 방법&lt;/li&gt;
&lt;li&gt;가까운 이웃의 비중을 살려서 평균을 구함&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;218&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/raTAk/btsKIERMTja/TaXpQmK2dvY1FMS1uOCcX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/raTAk/btsKIERMTja/TaXpQmK2dvY1FMS1uOCcX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/raTAk/btsKIERMTja/TaXpQmK2dvY1FMS1uOCcX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FraTAk%2FbtsKIERMTja%2FTaXpQmK2dvY1FMS1uOCcX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;218&quot; height=&quot;182&quot; data-origin-width=&quot;218&quot; data-origin-height=&quot;182&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;더 정교한 box(kernel)은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Gaussian&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote style=&quot;color: #212529; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;◾ Guassian&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가우스 분포는 정규분포로 평균이 0, 표준편차가 &amp;sigma;이다.&lt;/li&gt;
&lt;li&gt;&amp;sigma;가 크면 납작하고, &amp;sigma;가 작으면 뾰족한 정규분포이다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qcDOA/btsKH62p4Wy/zFD9VLJHhXjEHBAmoEq8J0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qcDOA/btsKH62p4Wy/zFD9VLJHhXjEHBAmoEq8J0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qcDOA/btsKH62p4Wy/zFD9VLJHhXjEHBAmoEq8J0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqcDOA%2FbtsKH62p4Wy%2FzFD9VLJHhXjEHBAmoEq8J0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;341&quot; height=&quot;287&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;421&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tkYtu/btsKGWzE3bY/XbPL2VfAhR1XlUL6GkbCm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tkYtu/btsKGWzE3bY/XbPL2VfAhR1XlUL6GkbCm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tkYtu/btsKGWzE3bY/XbPL2VfAhR1XlUL6GkbCm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtkYtu%2FbtsKGWzE3bY%2FXbPL2VfAhR1XlUL6GkbCm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;903&quot; height=&quot;421&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;421&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;393&quot; data-origin-height=&quot;221&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YnLmY/btsKHLkaMxZ/Pr8xRLDjPfMjFd7rpw2KV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YnLmY/btsKHLkaMxZ/Pr8xRLDjPfMjFd7rpw2KV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YnLmY/btsKHLkaMxZ/Pr8xRLDjPfMjFd7rpw2KV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYnLmY%2FbtsKHLkaMxZ%2FPr8xRLDjPfMjFd7rpw2KV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;393&quot; height=&quot;221&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;221&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id=&quot;3-separable-filter-linear&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3. Separable Filter (linear)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;kernel이 큰 Operation은 시간이 오래걸린다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;mxn&lt;/li&gt;
&lt;li&gt;몇몇 Operator은 Separable한데, 이것은 가로 세로 커널로 분해 가능한 것을 의미한다.&lt;/li&gt;
&lt;li&gt;separable하면 시간은&lt;span&gt;&amp;nbsp;&lt;/span&gt;m+n으로 줄어든다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;세로/가로 필터링을 따로 했을 때와, 전체 필터링 했을 때 결과가 같으면 Separable&lt;/li&gt;
&lt;li&gt;ex) box filter, Guassian filter는 Separable&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;623&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zNfbB/btsKJAVrWRv/61TFW7UKaXHE2c42k7Eq4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zNfbB/btsKJAVrWRv/61TFW7UKaXHE2c42k7Eq4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zNfbB/btsKJAVrWRv/61TFW7UKaXHE2c42k7Eq4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzNfbB%2FbtsKJAVrWRv%2F61TFW7UKaXHE2c42k7Eq4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;623&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;623&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;4-order-statisticmedian-filters-non-linear&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;4. Order-Statistic(median) Filters (Non-linear)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이웃 픽셀들을 정렬하여 찾은 중앙값으로 filtering&lt;/li&gt;
&lt;li&gt;중심에서 멀리 벗어난 outlier를 삭제할 수 있다. (원본 이미지와 상관없이 noise가 큰 이미지) -&amp;gt; Gaussian과의 차이점&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;337&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWqWq9/btsKJzWzj0U/JHhXvZ4KQQEwkq5Z7Rhx20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWqWq9/btsKJzWzj0U/JHhXvZ4KQQEwkq5Z7Rhx20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWqWq9/btsKJzWzj0U/JHhXvZ4KQQEwkq5Z7Rhx20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWqWq9%2FbtsKJzWzj0U%2FJHhXvZ4KQQEwkq5Z7Rhx20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;884&quot; height=&quot;337&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;337&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;blockquote id=&quot; -sharpening-spatial-filters&quot; data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Sharpening Spatial Filters&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;h3 id=&quot;1-derivatives-미분&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1. Derivatives (미분)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지도 함수니까 미분이 가능하고, Finite difference라는 방식으로 이미지를 미분한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;-finite-difference-discretized-version&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;◾ Finite difference (Discretized version)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;바로 옆 픽셀과의 차이f(x-1)-f(x)가 미분값&lt;/li&gt;
&lt;li&gt;오른쪽, 왼쪽 둘 다 가능하다.&amp;nbsp;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;46&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CjldJ/btsKH7mETQg/kwLzVacnklpPToJmUcdOJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CjldJ/btsKH7mETQg/kwLzVacnklpPToJmUcdOJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CjldJ/btsKH7mETQg/kwLzVacnklpPToJmUcdOJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCjldJ%2FbtsKH7mETQg%2FkwLzVacnklpPToJmUcdOJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;706&quot; height=&quot;46&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;46&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;미분을 한번 더 하는 경우는, 옆 픽셀과의 한번 미분한 값의 차이이다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;185&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Zeb3R/btsKJmb5lzn/8T00GnnHjaKa5tMLpPru5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Zeb3R/btsKJmb5lzn/8T00GnnHjaKa5tMLpPru5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Zeb3R/btsKJmb5lzn/8T00GnnHjaKa5tMLpPru5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZeb3R%2FbtsKJmb5lzn%2F8T00GnnHjaKa5tMLpPru5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;677&quot; height=&quot;185&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;185&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote style=&quot;color: #212529; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;h4 id=&quot;edge-밝기가-변하는-부분&quot; data-ke-size=&quot;size20&quot;&gt;◾Edge (밝기가 변하는 부분)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ramp: 이미지 밝기가 서서히 변하는 edge&lt;/li&gt;
&lt;li&gt;Step: 이미지 밝기가 급격히 변하는 계단 형태의 edge&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;841&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HiYsm/btsKITBbiuA/pMtM4L0SKMyf6CaucMgpL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HiYsm/btsKITBbiuA/pMtM4L0SKMyf6CaucMgpL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HiYsm/btsKITBbiuA/pMtM4L0SKMyf6CaucMgpL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHiYsm%2FbtsKITBbiuA%2FpMtM4L0SKMyf6CaucMgpL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;924&quot; height=&quot;841&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;841&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 id=&quot;1번-미분&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;◾1번 미분&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;접선의 기울기 (이미지의 밝기 변화 정도)&lt;/li&gt;
&lt;li&gt;0이면 일정한 밝기&lt;/li&gt;
&lt;li&gt;0이 아니면 Edge&lt;br /&gt;(절댓값이 작은 부분은 Ramp, 큰 부분은 Step Edge)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;극대점(미분값이 큰 부분)으로 Edge 검출&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;-2번-미분&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;◾ 2번 미분&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;접선의 기울기의 증감 (이미지가 천천히 또는 빠르게 밝기 변화하는 정도)&lt;/li&gt;
&lt;li&gt;0이면 일정한 정도로 밝기 변화&lt;/li&gt;
&lt;li&gt;0이 아니면 갑자기 꺾어지는 Intensity trnasition 부분&lt;/li&gt;
&lt;li&gt;&lt;b&gt;zero crossing가 발생하는 지점으로 명확한 Edge 검출&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❗ 실제 영상에서는 Ramp Edge가 많기 때문에 1차로는 정확한 Edge 검출이 어려워서 2번 미분으로 명확한 Edge를 검출하는 것이다.&lt;/p&gt;
&lt;h3 id=&quot;2-laplacian&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. Laplacian&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2차 미분의 zero crossing으로 엣지를 검출할 때 사용하는 연산&lt;/li&gt;
&lt;li&gt;이미지 방향에 독립적이다. (Isotropic)&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;179&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlLY2N/btsKHtX7WJw/kkRKdQIj6QLiNKb3pQe2O0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlLY2N/btsKHtX7WJw/kkRKdQIj6QLiNKb3pQe2O0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlLY2N/btsKHtX7WJw/kkRKdQIj6QLiNKb3pQe2O0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlLY2N%2FbtsKHtX7WJw%2FkkRKdQIj6QLiNKb3pQe2O0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;179&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;179&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;484&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4long/btsKHLRIhhf/stEfy4KqXuNf56Z9fnIkFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4long/btsKHLRIhhf/stEfy4KqXuNf56Z9fnIkFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4long/btsKHLRIhhf/stEfy4KqXuNf56Z9fnIkFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4long%2FbtsKHLRIhhf%2FstEfy4KqXuNf56Z9fnIkFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;484&quot; height=&quot;230&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;밝기의 불연속성을 강조하고, 느리게 변화하는 부분은 강조X&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;음수가 나올 수 있지만 0 이하는 전부 검정이다. 음수 부분을 확인하기 위해 Laplacian에 전체 상수를 더하면(곱하면?) 색 바뀌는 부분을 더 잘 확인할 수 있다.&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;845&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vNFXG/btsKIWkmRGm/KksxR3o7QZaImNbfaOT5S0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vNFXG/btsKIWkmRGm/KksxR3o7QZaImNbfaOT5S0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vNFXG/btsKIWkmRGm/KksxR3o7QZaImNbfaOT5S0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvNFXG%2FbtsKIWkmRGm%2FKksxR3o7QZaImNbfaOT5S0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;296&quot; data-origin-width=&quot;845&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-image-sharpening-with-laplacian-샤프닝1&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3. Image Sharpening with Laplacian (샤프닝1)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상수c를 더한(곱한?) Laplacian 이미지를 원본에 더해 선명하게 만든다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;304&quot; data-origin-height=&quot;33&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDL3Ze/btsKIe6WJq5/2TqXoVyeql4Wy9eg06qKDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDL3Ze/btsKIe6WJq5/2TqXoVyeql4Wy9eg06qKDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDL3Ze/btsKIe6WJq5/2TqXoVyeql4Wy9eg06qKDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDL3Ze%2FbtsKIe6WJq5%2F2TqXoVyeql4Wy9eg06qKDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;304&quot; height=&quot;33&quot; data-origin-width=&quot;304&quot; data-origin-height=&quot;33&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;1043&quot; data-origin-height=&quot;330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boE2OO/btsKH8lAQQi/LafaMq5FhX5YArQ0kdKUx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boE2OO/btsKH8lAQQi/LafaMq5FhX5YArQ0kdKUx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boE2OO/btsKH8lAQQi/LafaMq5FhX5YArQ0kdKUx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboE2OO%2FbtsKH8lAQQi%2FLafaMq5FhX5YArQ0kdKUx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1043&quot; height=&quot;330&quot; data-origin-width=&quot;1043&quot; data-origin-height=&quot;330&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;4-unsharp-masking-and-highboost-filtering-샤프닝2&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;4. Unsharp Masking and Highboost Filtering (샤프닝2)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;box filter 또는 Gausian을 활용해 블러한 이미지f-를 원본 이미지f에서 빼서 세부 디테일 값Unsharp mask만 얻는다.&lt;/li&gt;
&lt;li&gt;그 값을 원본에 더해 선명하게 만들어 최종 이미지g를 얻는다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;771&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5jEwR/btsKIfSh4Ld/gwsFF0ElJszVPvGRmza4q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5jEwR/btsKIfSh4Ld/gwsFF0ElJszVPvGRmza4q1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5jEwR/btsKIfSh4Ld/gwsFF0ElJszVPvGRmza4q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5jEwR%2FbtsKIfSh4Ld%2FgwsFF0ElJszVPvGRmza4q1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;771&quot; height=&quot;466&quot; data-origin-width=&quot;771&quot; data-origin-height=&quot;466&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote style=&quot;color: #212529; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;h4 id=&quot;-상수-k&quot; data-ke-size=&quot;size20&quot;&gt;◾ 상수 k&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;k=1 : Unsharp masking&lt;/li&gt;
&lt;li&gt;k&amp;gt;1 : Highboost filtering (더 선명하게)&lt;/li&gt;
&lt;li&gt;k&amp;lt;1 : Unsharp masking의 강조 감소 (선명해지긴 함)&lt;/li&gt;
&lt;li&gt;k&amp;lt;0 : blur와 비슷&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;5-gradient&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;5. Gradient&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기울기, 증감, 변화도 와 같은 변화하는 정도를 나타냄&lt;/li&gt;
&lt;li&gt;변화하는 정도가 가장 큰 부분은 일반적으로 edge와 모서리 부분이며, 이를 찾기 위해 gradient를 활용한다.&lt;/li&gt;
&lt;li&gt;이미지(x, y)에서의 Gradient의 벡터값(방향, 크기)을 통해 해당 픽셀에서 edge까지 얼마나 가까운지, 방향이 어디인지 알 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;-방향gradient&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;◾ 방향(gradient)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;f(x, y)에서의 최대 변화율의 방향 (이미지가 가장 밝아지는 방향)&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qxlB8/btsKGWGrPjn/qGaxsDDkCa86rTj3Nqbslk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qxlB8/btsKGWGrPjn/qGaxsDDkCa86rTj3Nqbslk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qxlB8/btsKGWGrPjn/qGaxsDDkCa86rTj3Nqbslk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqxlB8%2FbtsKGWGrPjn%2FqGaxsDDkCa86rTj3Nqbslk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;695&quot; height=&quot;129&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;129&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;-크기magnitude&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;◾ 크기(magnitude)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;벡터 방향으로 얼마나 밝아지는지의 정도 (이미지가 밝아지는 픽셀까지의 거리)&lt;/li&gt;
&lt;li&gt;linear하지 않다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;51&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhhK8F/btsKHefLL4Z/m7GfCUksJkKZfQEd4U9yU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhhK8F/btsKHefLL4Z/m7GfCUksJkKZfQEd4U9yU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhhK8F/btsKHefLL4Z/m7GfCUksJkKZfQEd4U9yU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhhK8F%2FbtsKHefLL4Z%2Fm7GfCUksJkKZfQEd4U9yU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;324&quot; height=&quot;51&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;51&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;6-gradient--sobel-operator&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;6. Gradient &amp;amp; Sobel Operator&lt;/h3&gt;
&lt;h4 id=&quot;-basic-gradient&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;◾ Basic gradient&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;중심 대칭이 아님&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;245&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JaZVf/btsKItweood/L3yKGYZSng7KQk0tm54kKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JaZVf/btsKItweood/L3yKGYZSng7KQk0tm54kKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JaZVf/btsKItweood/L3yKGYZSng7KQk0tm54kKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJaZVf%2FbtsKItweood%2FL3yKGYZSng7KQk0tm54kKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;497&quot; height=&quot;245&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;245&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;-symmetric-gradient&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;◾ Symmetric gradient&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;중심 대칭 (basic말고 이렇게 쓸 수도 있다~)&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;251&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwFcPH/btsKICzH1il/76ManDKJLmWY84NTeXmG6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwFcPH/btsKICzH1il/76ManDKJLmWY84NTeXmG6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwFcPH/btsKICzH1il/76ManDKJLmWY84NTeXmG6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwFcPH%2FbtsKICzH1il%2F76ManDKJLmWY84NTeXmG6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;504&quot; height=&quot;251&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;251&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;-sobel-operator-3x3-version&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;◾ Sobel Operator (3x3 version)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;noise의 영향을 줄이기 위해 주변 픽셀값도 섞어서 미분&lt;/li&gt;
&lt;li&gt;중심이랑 가까운 부분z8,z2,z6,z4은 비중을 더 주기위해 더 많이 섞음&lt;/li&gt;
&lt;li&gt;오른쪽 표에 있는 수의 합이 0이다.&lt;/li&gt;
&lt;li&gt;왼쪽 식의 뜻 - 오른쪽 표에 있는 수를 각 픽셀에 곱하고 다 더한 값이 미분값이다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MmR5u/btsKHXq3vwW/lGWu6LkqkJZpHwyRBjDbb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MmR5u/btsKHXq3vwW/lGWu6LkqkJZpHwyRBjDbb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MmR5u/btsKHXq3vwW/lGWu6LkqkJZpHwyRBjDbb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMmR5u%2FbtsKHXq3vwW%2FlGWu6LkqkJZpHwyRBjDbb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;322&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;322&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;706&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CicP5/btsKHcCfqiP/DlaSmqhKID3KvgfQt0XzZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CicP5/btsKHcCfqiP/DlaSmqhKID3KvgfQt0XzZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CicP5/btsKHcCfqiP/DlaSmqhKID3KvgfQt0XzZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCicP5%2FbtsKHcCfqiP%2FDlaSmqhKID3KvgfQt0XzZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;706&quot; height=&quot;360&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;Laplacian은 2차 미분의 zero crossing으로 edge를 찾았고,&lt;/li&gt;
&lt;li&gt;Sobel(Gradient)은 x, y 방향의 1차 미분의 극대값으로 edge를 찾는다.&lt;/li&gt;
&lt;li&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote id=&quot; -combining-spatial-enhancement&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;Combining Spatial Enhancement&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결국 지금까지 배운 공간 필터링을 조합해보면,, 이런 이미지를 만들어낼 수 있다. 잘 조합해서 쓰면 된다..?&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;409&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMiNb0/btsKH7NQfLM/k1OKDQrKnTSqRjF0AB4EIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMiNb0/btsKH7NQfLM/k1OKDQrKnTSqRjF0AB4EIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMiNb0/btsKH7NQfLM/k1OKDQrKnTSqRjF0AB4EIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMiNb0%2FbtsKH7NQfLM%2Fk1OKDQrKnTSqRjF0AB4EIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;918&quot; height=&quot;409&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;409&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;915&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOAiTu/btsKJzoJj9I/uDnRfZiV6AZVcWvOaWKr3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOAiTu/btsKJzoJj9I/uDnRfZiV6AZVcWvOaWKr3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOAiTu/btsKJzoJj9I/uDnRfZiV6AZVcWvOaWKr3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOAiTu%2FbtsKJzoJj9I%2FuDnRfZiV6AZVcWvOaWKr3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;915&quot; height=&quot;418&quot; data-origin-width=&quot;915&quot; data-origin-height=&quot;418&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Image Processing</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>VHAL_</author>
      <guid isPermaLink="true">https://n1mss-e.tistory.com/37</guid>
      <comments>https://n1mss-e.tistory.com/37#entry37comment</comments>
      <pubDate>Thu, 14 Nov 2024 12:47:50 +0900</pubDate>
    </item>
    <item>
      <title>[Image Processing] 2. Digital Image</title>
      <link>https://n1mss-e.tistory.com/36</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;** 해당 시리즈는 타블로그의 글을 참고하여 공부용으로 기록해놓은 글입니다 **&lt;/blockquote&gt;
&lt;h2 id=&quot;-human-vision&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Human Vision&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Image Formation in the Eye&amp;nbsp;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GtrMN/btsKzSRpxIJ/DNIc1YUTX5wEqrohSi6KCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GtrMN/btsKzSRpxIJ/DNIc1YUTX5wEqrohSi6KCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GtrMN/btsKzSRpxIJ/DNIc1YUTX5wEqrohSi6KCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGtrMN%2FbtsKzSRpxIJ%2FDNIc1YUTX5wEqrohSi6KCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;789&quot; height=&quot;192&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;192&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;blockquote id=&quot; -lights&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;Lights&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;h4 id=&quot;1-human-vision&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1. Human Vision&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Light Source (광원)&lt;/li&gt;
&lt;li&gt;오브젝트로 향하는 광원 (Decay - 광원에서 멀어질수록 어두워짐)&lt;/li&gt;
&lt;li&gt;오브젝트에 도착한 빛
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Absorption (흡수)&lt;/li&gt;
&lt;li&gt;Reflection(표면에서 반사) / Scarttering(내부로 흡수했다가 나옴)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;오브젝트에서 눈으로 가는 빛 (&lt;b&gt;No decay&lt;/b&gt;&lt;span style=&quot;color: #212529; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; letter-spacing: 0px;&quot;&gt;- 공기 저항 무시, 각 시세포가 받는 E는 일정)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;눈에 도착한 빛 (Sensing Energy)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;2-light&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2. Light&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 유형의 전자파인 Visible Spectrum(가시광선)만 사람 눈에 감지된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;color&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;◾Color&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다양한 wavelength(파장)의 light wave(광파) 혼합된 것이며 그 혼합물에 대한 사람의 반응, 느낌&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;-achromatic-light-무채색&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;◾ Achromatic light (무채색)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파장을 무시하는 빛으로 색은 없고 intensity(밝기)만 존재&lt;br /&gt;(aka. monochromatic, gray level, Luminace(휘도), birightness)&lt;br /&gt;&lt;br /&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;blockquote id=&quot; -image-acquisition&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Image Acquisition&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;h4 id=&quot;1-sensor-element&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1. Sensor Element&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;빛 E가 들어오면 전류가 흐른다. (빛 신호 -&amp;gt; 전기 신호)&amp;nbsp;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/94vqi/btsKBcVwtUi/MelhGFEKXBgu9sfJVa4BVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/94vqi/btsKBcVwtUi/MelhGFEKXBgu9sfJVa4BVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/94vqi/btsKBcVwtUi/MelhGFEKXBgu9sfJVa4BVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F94vqi%2FbtsKBcVwtUi%2FMelhGFEKXBgu9sfJVa4BVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;679&quot; height=&quot;304&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;304&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;1-single-element-sensing&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1-1. Single Element Sensing&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;sensor 하나가 좌우로 이동하고, 필름은 회전한다.&lt;/li&gt;
&lt;li&gt;센서를 천천히 움직이면 해상도가 올라간다. (픽셀 개수가 정해지지 않음)&lt;/li&gt;
&lt;li&gt;ex) 잉크프린터, 필름 고해상도 현상&amp;nbsp;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2t36v/btsKA9YMXdr/cxkOYvZhuAkGGJTKkJ6VI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2t36v/btsKA9YMXdr/cxkOYvZhuAkGGJTKkJ6VI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2t36v/btsKA9YMXdr/cxkOYvZhuAkGGJTKkJ6VI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2t36v%2FbtsKA9YMXdr%2FcxkOYvZhuAkGGJTKkJ6VI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;482&quot; height=&quot;327&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;2-sensor-strip-sensing&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1-2. Sensor Strip Sensing&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Sensor strip (여러개의 sensor)&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;329&quot; data-origin-height=&quot;34&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMvMO2/btsKAMQpDIw/orAvCtlixcCmhhhOTMFUc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMvMO2/btsKAMQpDIw/orAvCtlixcCmhhhOTMFUc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMvMO2/btsKAMQpDIw/orAvCtlixcCmhhhOTMFUc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMvMO2%2FbtsKAMQpDIw%2ForAvCtlixcCmhhhOTMFUc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;329&quot; height=&quot;34&quot; data-origin-width=&quot;329&quot; data-origin-height=&quot;34&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;Sensor strip이 좌우로 이동한다.&lt;/li&gt;
&lt;li&gt;Sensor strip의 센서 개수가 해상도를 결정한다. (움직이는 방향의 해상도는 속도로 조절 가능)&lt;/li&gt;
&lt;li&gt;ex) 스캐너&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;315&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TNdFT/btsKArsmyjL/Buq6eIFj5Xf0x0e9FzlPt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TNdFT/btsKArsmyjL/Buq6eIFj5Xf0x0e9FzlPt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TNdFT/btsKArsmyjL/Buq6eIFj5Xf0x0e9FzlPt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTNdFT%2FbtsKArsmyjL%2FBuq6eIFj5Xf0x0e9FzlPt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;315&quot; height=&quot;178&quot; data-origin-width=&quot;315&quot; data-origin-height=&quot;178&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;3-sensor-ring-sensing&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1-3. Sensor Ring Sensing&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동그란 모양의 Sensor Ring 사이로 3D오브젝트가 통과되며 이미지를 인식한다.&lt;/li&gt;
&lt;li&gt;속도가 빠르다.&lt;/li&gt;
&lt;li&gt;ex) X-ray, CT&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;290&quot; data-origin-height=&quot;349&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zXxmd/btsKAJ7dtk3/JHKVBCenYsgVkNdXHb0JA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zXxmd/btsKAJ7dtk3/JHKVBCenYsgVkNdXHb0JA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zXxmd/btsKAJ7dtk3/JHKVBCenYsgVkNdXHb0JA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzXxmd%2FbtsKAJ7dtk3%2FJHKVBCenYsgVkNdXHb0JA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;290&quot; height=&quot;349&quot; data-origin-width=&quot;290&quot; data-origin-height=&quot;349&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;4-2d-image-array-sensing&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1-4. 2D Image Array Sensing&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2D Sensor Array(센서가 이차원 배열로 존재)&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;201&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9GYev/btsKA44pBO5/EL09rolU0wLwbKHh0Wix3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9GYev/btsKA44pBO5/EL09rolU0wLwbKHh0Wix3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9GYev/btsKA44pBO5/EL09rolU0wLwbKHh0Wix3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9GYev%2FbtsKA44pBO5%2FEL09rolU0wLwbKHh0Wix3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;201&quot; height=&quot;199&quot; data-origin-width=&quot;201&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;렌즈(카메라) 필요&lt;/li&gt;
&lt;li&gt;한 순간의 데이터를 저장할 수 있다. (snapshot)&lt;/li&gt;
&lt;li&gt;ex) CCD array&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;351&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KgU1Q/btsKAFKF7pX/1PH48GZGN37yQnvFa2H8ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KgU1Q/btsKAFKF7pX/1PH48GZGN37yQnvFa2H8ok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KgU1Q/btsKAFKF7pX/1PH48GZGN37yQnvFa2H8ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKgU1Q%2FbtsKAFKF7pX%2F1PH48GZGN37yQnvFa2H8ok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;513&quot; height=&quot;351&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;351&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-image-formation-model&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. Image Formation Model&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지가 디지털로 바뀌는 방법&lt;/li&gt;
&lt;li&gt;Image의 밝기:&lt;span&gt;&amp;nbsp;&lt;/span&gt;f(x, y)&lt;br /&gt;(밝기의 범위는 한계가 없다. 0 &amp;lt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;f(x, y)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt; &amp;infin;)&lt;/li&gt;
&lt;li&gt;Formation model
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Illumination (광원에서 나온 빛) :&lt;span&gt;&amp;nbsp;&lt;/span&gt;i(x, y)&lt;/li&gt;
&lt;li&gt;Reflectance (반사율) :&lt;span&gt;&amp;nbsp;&lt;/span&gt;r(x, y)&lt;/li&gt;
&lt;li&gt;반사율 예시&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;319&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cESyL6/btsKBeeHUbo/lvY6EQEiSEm6sNSPguue20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cESyL6/btsKBeeHUbo/lvY6EQEiSEm6sNSPguue20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cESyL6/btsKBeeHUbo/lvY6EQEiSEm6sNSPguue20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcESyL6%2FbtsKBeeHUbo%2FlvY6EQEiSEm6sNSPguue20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;319&quot; height=&quot;202&quot; data-origin-width=&quot;319&quot; data-origin-height=&quot;202&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;광원에서 나온 빛과 반사율을 곱해 이미지의 밝기를 구한다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MJPp3/btsKzJNNB0b/QWgChixccZKk4s8FOkJd1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MJPp3/btsKzJNNB0b/QWgChixccZKk4s8FOkJd1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MJPp3/btsKzJNNB0b/QWgChixccZKk4s8FOkJd1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMJPp3%2FbtsKzJNNB0b%2FQWgChixccZKk4s8FOkJd1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;335&quot; height=&quot;57&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;57&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;391&quot; data-origin-height=&quot;292&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btcd98/btsKBUNBZMG/0v56Jbk3mKnvGUckkrdSZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btcd98/btsKBUNBZMG/0v56Jbk3mKnvGUckkrdSZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btcd98/btsKBUNBZMG/0v56Jbk3mKnvGUckkrdSZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbtcd98%2FbtsKBUNBZMG%2F0v56Jbk3mKnvGUckkrdSZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;391&quot; height=&quot;292&quot; data-origin-width=&quot;391&quot; data-origin-height=&quot;292&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;3-intensity-range-밝기의-범위&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3. Intensity Range (밝기의 범위)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 픽셀의 값&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;110&quot; data-origin-height=&quot;28&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcshVT/btsKzTpbWfl/PYPRkvIkul2gKJWcyvRGV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcshVT/btsKzTpbWfl/PYPRkvIkul2gKJWcyvRGV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcshVT/btsKzTpbWfl/PYPRkvIkul2gKJWcyvRGV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcshVT%2FbtsKzTpbWfl%2FPYPRkvIkul2gKJWcyvRGV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;110&quot; height=&quot;28&quot; data-origin-width=&quot;110&quot; data-origin-height=&quot;28&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;이론에 따르면 밝기의 범위는 한계가 없어 0 &amp;lt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;f(x, y)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt; &amp;infin; 이지만, 센서가 받아낼 수 있는 최소, 최대가 정해져있다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;181&quot; data-origin-height=&quot;31&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0PYYj/btsKBdz7LMZ/db9jRlOFqlhmNOg3Mmxmok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0PYYj/btsKBdz7LMZ/db9jRlOFqlhmNOg3Mmxmok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0PYYj/btsKBdz7LMZ/db9jRlOFqlhmNOg3Mmxmok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0PYYj%2FbtsKBdz7LMZ%2Fdb9jRlOFqlhmNOg3Mmxmok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;181&quot; height=&quot;31&quot; data-origin-width=&quot;181&quot; data-origin-height=&quot;31&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;그래서 Intensity Range(Gray scale)는 보통 0에서 L-1까지의 값을 가진다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;293&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgmdjf/btsKzyMvFol/wAedoKAqnwBB0Q7kpxkHxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgmdjf/btsKzyMvFol/wAedoKAqnwBB0Q7kpxkHxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgmdjf/btsKzyMvFol/wAedoKAqnwBB0Q7kpxkHxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcgmdjf%2FbtsKzyMvFol%2FwAedoKAqnwBB0Q7kpxkHxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;293&quot; height=&quot;124&quot; data-origin-width=&quot;293&quot; data-origin-height=&quot;124&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;&lt;br /&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;blockquote id=&quot; -sampling-and-quantization&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Sampling and Quantization&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;h4 id=&quot;1-digitization&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1. Digitization&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지를 디지털(정수 형태)로 바꾸는 과정&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote style=&quot;color: #212529; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;h4 id=&quot;sampling&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;◾Sampling&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;연속적의 데이터를 다 알 수 없어서 이미지의 특정 공간만 Sampling해서 전체를 알기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;x, y방향으로 이미지를 작은 픽셀로 쪼개기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;픽셀값으로 이미지를 나타냄 (각 픽셀마다 색, 밝기 등)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;-quantization-양자화&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;◾ Quantization (양자화)&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Sampling 값을 디지털화(정수화) 한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;이미지의 경우 0-255 범위에 픽셀 정도가 저장된다. (사람이 구분할 수 있는 정도의 기준)&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vKtYE/btsKAX5ncmi/S4e6NIBAUwNKTaJGOegZoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vKtYE/btsKAX5ncmi/S4e6NIBAUwNKTaJGOegZoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vKtYE/btsKAX5ncmi/S4e6NIBAUwNKTaJGOegZoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvKtYE%2FbtsKAX5ncmi%2FS4e6NIBAUwNKTaJGOegZoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1140&quot; height=&quot;1000&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;1000&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;541&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L1A4O/btsKBmRfRC8/MWjolV5dmmBk9Qab1rgRf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L1A4O/btsKBmRfRC8/MWjolV5dmmBk9Qab1rgRf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L1A4O/btsKBmRfRC8/MWjolV5dmmBk9Qab1rgRf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL1A4O%2FbtsKBmRfRC8%2FMWjolV5dmmBk9Qab1rgRf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;541&quot; height=&quot;390&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;390&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
❗ Sampling과 Quantization 둘 다 무조건 많이 하는게 좋지만, 시간과 같은 자원의 한계가 있다.&lt;/blockquote&gt;
&lt;h3 id=&quot;2-sampling&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. Sampling&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정수의 값을 갖는 몇개의 점xi&lt;span&gt;&amp;nbsp;&lt;/span&gt;yi에 대한 함수값&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;55&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6FRQD/btsKAz4QytR/pMoawS8wJVhTpVNrhmQvV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6FRQD/btsKAz4QytR/pMoawS8wJVhTpVNrhmQvV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6FRQD/btsKAz4QytR/pMoawS8wJVhTpVNrhmQvV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6FRQD%2FbtsKAz4QytR%2FpMoawS8wJVhTpVNrhmQvV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;532&quot; height=&quot;55&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;55&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;이차원 배열 / 행렬 형태&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;221&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/er3ynh/btsKCfjFFjJ/XRg4xWmPTDdqhtoovWkTOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/er3ynh/btsKCfjFFjJ/XRg4xWmPTDdqhtoovWkTOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/er3ynh/btsKCfjFFjJ/XRg4xWmPTDdqhtoovWkTOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fer3ynh%2FbtsKCfjFFjJ%2FXRg4xWmPTDdqhtoovWkTOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;221&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;221&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-quantization-양자화&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3. Quantization (양자화)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[0~최대 밝기]의 범위를 정수로 쪼갬&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5HZJl/btsKA8yT5G5/ik11lebA94hsNsKGQnLtX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5HZJl/btsKA8yT5G5/ik11lebA94hsNsKGQnLtX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5HZJl/btsKA8yT5G5/ik11lebA94hsNsKGQnLtX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5HZJl%2FbtsKA8yT5G5%2Fik11lebA94hsNsKGQnLtX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;541&quot; height=&quot;194&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;194&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;b와&lt;span&gt;&amp;nbsp;&lt;/span&gt;k는 비례&lt;/li&gt;
&lt;li&gt;수준이 높아질수록 자원이 많이 들고, 낮아지면 밝기 구분이 어려워짐&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;4-saturation-색의-포화도&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;4. Saturation (색의 포화도)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RGB가 전부 255를 넘은 Saturation 상태에서 다시 밝기를 낮추면 색이 복구되지 않고 회색이 나온다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;327&quot; data-origin-height=&quot;361&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HgB4F/btsKAXxwO5B/LLgukg7rGiUD95Pl9GKdK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HgB4F/btsKAXxwO5B/LLgukg7rGiUD95Pl9GKdK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HgB4F/btsKAXxwO5B/LLgukg7rGiUD95Pl9GKdK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHgB4F%2FbtsKAXxwO5B%2FLLgukg7rGiUD95Pl9GKdK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;327&quot; height=&quot;361&quot; data-origin-width=&quot;327&quot; data-origin-height=&quot;361&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;clipping&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;◾Clipping&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모니터마다 가장 밝은 부분255의 밝기가 다 다르다.&lt;/li&gt;
&lt;li&gt;카메라에서 밝기가 전체적으로 어두워지는 것은 기존의 255 밝기보다 낮은 밝기를 255로 Quantization하기 때문&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;5-resolution-해상도&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;5. Resolution (해상도)&lt;/h3&gt;
&lt;h4 id=&quot;1-spatial-resolution-공간해상도&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1. spatial resolution (공간해상도)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지 구성에 사용되는&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;픽셀 수&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(구별가능한 최소 단위)&lt;/li&gt;
&lt;li&gt;Dots per inch (DPI): 기준 크기에 단위(픽셀)가 몇개 들어가는지&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;590&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceJaDj/btsKBhoYtBW/wQIMbaZsmT7XAaVnGBlZ61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceJaDj/btsKBhoYtBW/wQIMbaZsmT7XAaVnGBlZ61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceJaDj/btsKBhoYtBW/wQIMbaZsmT7XAaVnGBlZ61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceJaDj%2FbtsKBhoYtBW%2FwQIMbaZsmT7XAaVnGBlZ61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;452&quot; height=&quot;590&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;590&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;2-intensity-resolution&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2. Intensity resolution&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Intensity LevelL의 구별 가능한 최소 변화&lt;/li&gt;
&lt;li&gt;&lt;b&gt;각 픽셀이 가질 수 있는 값의 개수&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;8비트(가장 많이 사용), 12비트, 16비트 등&lt;/li&gt;
&lt;li&gt;Intensity level에 따른 이미지&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;319&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JM380/btsKzMDRD8W/910xCYO7pxPPmo5C2UhE20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JM380/btsKzMDRD8W/910xCYO7pxPPmo5C2UhE20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JM380/btsKzMDRD8W/910xCYO7pxPPmo5C2UhE20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJM380%2FbtsKzMDRD8W%2F910xCYO7pxPPmo5C2UhE20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;319&quot; height=&quot;384&quot; data-origin-width=&quot;319&quot; data-origin-height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;isopreference-curves&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;◾Isopreference Curves&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ResolutionN이 높으면 Intensity Levelk이 낮아도 괜찮고, Resolution이 낮으면 Intensity Level이 높아지는 것이 좋다.&lt;/li&gt;
&lt;li&gt;얼굴 이미지는 낮은 디테일, 군중 이미지는 높은 디테일을 가진다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diJnJO/btsKALDYkmH/iiU2IekowY4Vl6qirIWQZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diJnJO/btsKALDYkmH/iiU2IekowY4Vl6qirIWQZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diJnJO/btsKALDYkmH/iiU2IekowY4Vl6qirIWQZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiJnJO%2FbtsKALDYkmH%2FiiU2IekowY4Vl6qirIWQZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;556&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;556&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;6-image-interpolation&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;6. Image Interpolation&lt;/h3&gt;
&lt;blockquote style=&quot;color: #212529; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;h4 id=&quot;interpolation&quot; data-ke-size=&quot;size20&quot;&gt;◾Interpolation&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;알고 있는 데이터로 모르는 부분을 추정한다. (ex-내적)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;픽셀 사이의 값을 추정하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;더 높은 해상도&lt;/b&gt;를 만든다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;179&quot; data-origin-height=&quot;33&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nL12y/btsKAEE1mrt/hEJYBHi2PzSed1NMLeQhlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nL12y/btsKAEE1mrt/hEJYBHi2PzSed1NMLeQhlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nL12y/btsKAEE1mrt/hEJYBHi2PzSed1NMLeQhlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnL12y%2FbtsKAEE1mrt%2FhEJYBHi2PzSed1NMLeQhlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;179&quot; height=&quot;33&quot; data-origin-width=&quot;179&quot; data-origin-height=&quot;33&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;1-nearest-neighbor-interpolation&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1. Nearest neighbor Interpolation&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;근처에 알고 있는 픽셀값으로 보간&lt;/li&gt;
&lt;li&gt;경계선이 깨지며 해상도 낮아짐&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;314&quot; data-origin-height=&quot;40&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A19ye/btsKA8Tf31A/BeyI1NrFkhMKaoV65ZFjX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A19ye/btsKA8Tf31A/BeyI1NrFkhMKaoV65ZFjX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A19ye/btsKA8Tf31A/BeyI1NrFkhMKaoV65ZFjX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA19ye%2FbtsKA8Tf31A%2FBeyI1NrFkhMKaoV65ZFjX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;314&quot; height=&quot;40&quot; data-origin-width=&quot;314&quot; data-origin-height=&quot;40&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;924&quot; data-origin-height=&quot;479&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAYizk/btsKzGwXf8o/8ckejMUbAbc2HKVZkbwO3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAYizk/btsKzGwXf8o/8ckejMUbAbc2HKVZkbwO3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAYizk/btsKzGwXf8o/8ckejMUbAbc2HKVZkbwO3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAYizk%2FbtsKzGwXf8o%2F8ckejMUbAbc2HKVZkbwO3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;924&quot; height=&quot;479&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;479&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;2-bilinear-interpolation&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2. Bilinear Interpolation&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;근처에 알고 있는 4개의 픽셀값을 적당히 섞은 새로운 값으로 보간&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;309&quot; data-origin-height=&quot;30&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O0DUw/btsKB59h4rq/CDu4DyKY8YrB6sd917rmjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O0DUw/btsKB59h4rq/CDu4DyKY8YrB6sd917rmjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O0DUw/btsKB59h4rq/CDu4DyKY8YrB6sd917rmjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO0DUw%2FbtsKB59h4rq%2FCDu4DyKY8YrB6sd917rmjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;309&quot; height=&quot;30&quot; data-origin-width=&quot;309&quot; data-origin-height=&quot;30&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;575&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b84Uhf/btsKzHP8zFt/NA5VkliZN2kZNsbfAFFN1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b84Uhf/btsKzHP8zFt/NA5VkliZN2kZNsbfAFFN1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b84Uhf/btsKzHP8zFt/NA5VkliZN2kZNsbfAFFN1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb84Uhf%2FbtsKzHP8zFt%2FNA5VkliZN2kZNsbfAFFN1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;575&quot; height=&quot;274&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;274&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;854&quot; data-origin-height=&quot;32&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4Kf3n/btsKAMCQYHm/kzOc8DDNZCuMA1pzDqfkJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4Kf3n/btsKAMCQYHm/kzOc8DDNZCuMA1pzDqfkJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4Kf3n/btsKAMCQYHm/kzOc8DDNZCuMA1pzDqfkJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4Kf3n%2FbtsKAMCQYHm%2FkzOc8DDNZCuMA1pzDqfkJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;854&quot; height=&quot;32&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;32&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;3-bicubic-interpolation&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;3. Bicubic Interpolation&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;근처의 16개의 픽셀값으로 3차 곡선을 만들어서 새로운 값으로 보간&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;296&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RIoio/btsKzVN8l95/sDJVmuh83LshOTKKobk7rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RIoio/btsKzVN8l95/sDJVmuh83LshOTKKobk7rk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RIoio/btsKzVN8l95/sDJVmuh83LshOTKKobk7rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRIoio%2FbtsKzVN8l95%2FsDJVmuh83LshOTKKobk7rk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;296&quot; height=&quot;38&quot; data-origin-width=&quot;296&quot; data-origin-height=&quot;38&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;399&quot; data-origin-height=&quot;359&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uXGHf/btsKBb3lNda/UeYqVgrfS4yFn9fbqOCTOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uXGHf/btsKBb3lNda/UeYqVgrfS4yFn9fbqOCTOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uXGHf/btsKBb3lNda/UeYqVgrfS4yFn9fbqOCTOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuXGHf%2FbtsKBb3lNda%2FUeYqVgrfS4yFn9fbqOCTOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;399&quot; height=&quot;359&quot; data-origin-width=&quot;399&quot; data-origin-height=&quot;359&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;✔️ 왼쪽부터 Nearest neighbor, Bilinear, Bicubic&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1141&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6FCRP/btsKBcnD4i6/Gmb5xqOxdDf2HAoXstjPP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6FCRP/btsKBcnD4i6/Gmb5xqOxdDf2HAoXstjPP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6FCRP/btsKBcnD4i6/Gmb5xqOxdDf2HAoXstjPP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6FCRP%2FbtsKBcnD4i6%2FGmb5xqOxdDf2HAoXstjPP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1141&quot; height=&quot;502&quot; data-origin-width=&quot;1141&quot; data-origin-height=&quot;502&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;h2 id=&quot;-basic-relationship-between-pixels&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  Basic Relationship between Pixels&lt;/h2&gt;
&lt;h3 id=&quot;1-neighborhood&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1. Neighborhood&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(x, y) 좌표를 가지는 픽셀p의 이웃&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1. 4-neighborhood&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;649&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2tw0P/btsKBPMpJRL/lTfTUgb6n4gMDkRTqJvOsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2tw0P/btsKBPMpJRL/lTfTUgb6n4gMDkRTqJvOsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2tw0P/btsKBPMpJRL/lTfTUgb6n4gMDkRTqJvOsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2tw0P%2FbtsKBPMpJRL%2FlTfTUgb6n4gMDkRTqJvOsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;649&quot; height=&quot;263&quot; data-origin-width=&quot;649&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2. 4 diagonal neighborhood&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boPYC5/btsKADzsT1N/gJQgArlWklchQFsjceRfk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boPYC5/btsKADzsT1N/gJQgArlWklchQFsjceRfk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boPYC5/btsKADzsT1N/gJQgArlWklchQFsjceRfk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboPYC5%2FbtsKADzsT1N%2FgJQgArlWklchQFsjceRfk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;744&quot; height=&quot;272&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;272&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;3. 8-neighborhood&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;330&quot; data-origin-height=&quot;273&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qnq6m/btsKz1gnKJq/RDNF8ZUKP5mt7nrF3eBvLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qnq6m/btsKz1gnKJq/RDNF8ZUKP5mt7nrF3eBvLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qnq6m/btsKz1gnKJq/RDNF8ZUKP5mt7nrF3eBvLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqnq6m%2FbtsKz1gnKJq%2FRDNF8ZUKP5mt7nrF3eBvLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;330&quot; height=&quot;273&quot; data-origin-width=&quot;330&quot; data-origin-height=&quot;273&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id=&quot;2-adjacency&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. Adjacency&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;픽셀 간 인접관계를 나타내기위한 Intensity valuse&lt;span&gt;&amp;nbsp;&lt;/span&gt;V&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;1-4-adjacency&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1. 4-adjacency&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;픽셀&lt;span&gt;&amp;nbsp;&lt;/span&gt;q가&lt;span&gt;&amp;nbsp;&lt;/span&gt;p의 4이웃이고, 두 픽셀 모두&lt;span&gt;&amp;nbsp;&lt;/span&gt;V의 값을 가짐&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;46&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o50Q1/btsKBMbc0uj/iubunzKuk5tDzTXLkmAGA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o50Q1/btsKBMbc0uj/iubunzKuk5tDzTXLkmAGA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o50Q1/btsKBMbc0uj/iubunzKuk5tDzTXLkmAGA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo50Q1%2FbtsKBMbc0uj%2FiubunzKuk5tDzTXLkmAGA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;252&quot; height=&quot;46&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;46&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;2-8-adjacency&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2. 8-adjacency&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;픽셀&lt;span&gt;&amp;nbsp;&lt;/span&gt;q가&lt;span&gt;&amp;nbsp;&lt;/span&gt;p의 8이웃이고, 두 픽셀 모두&lt;span&gt;&amp;nbsp;&lt;/span&gt;V의 값을 가짐&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;356&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s0J91/btsKzx08Ubx/g15oFH4UAT53sKEaJk3lOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s0J91/btsKzx08Ubx/g15oFH4UAT53sKEaJk3lOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s0J91/btsKzx08Ubx/g15oFH4UAT53sKEaJk3lOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs0J91%2FbtsKzx08Ubx%2Fg15oFH4UAT53sKEaJk3lOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;356&quot; height=&quot;38&quot; data-origin-width=&quot;356&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;3-m-adjacency&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;3. M-adjacency&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 픽셀 모두&lt;span&gt;&amp;nbsp;&lt;/span&gt;V의 값을 가지는데,
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;픽셀&lt;span&gt;&amp;nbsp;&lt;/span&gt;q가&lt;span&gt;&amp;nbsp;&lt;/span&gt;p의 4이웃 이거나&lt;/li&gt;
&lt;li&gt;픽셀&lt;span&gt;&amp;nbsp;&lt;/span&gt;q가&lt;span&gt;&amp;nbsp;&lt;/span&gt;p의 D이웃 이고&lt;span&gt;&amp;nbsp;&lt;/span&gt;p의 4이웃과&lt;span&gt;&amp;nbsp;&lt;/span&gt;qD이웃의 교집합에&lt;span&gt;&amp;nbsp;&lt;/span&gt;V값을 가지는 픽셀이 없는 경우&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;81&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgYkrC/btsKzU9uNpM/X6iVjJkZVC7hAkKzdlnq30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgYkrC/btsKzU9uNpM/X6iVjJkZVC7hAkKzdlnq30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgYkrC/btsKzU9uNpM/X6iVjJkZVC7hAkKzdlnq30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgYkrC%2FbtsKzU9uNpM%2FX6iVjJkZVC7hAkKzdlnq30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;860&quot; height=&quot;81&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;81&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;932&quot; data-origin-height=&quot;332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MCjyn/btsKALxhSfD/jjI3DWD75q2UeQ8zKvjpw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MCjyn/btsKALxhSfD/jjI3DWD75q2UeQ8zKvjpw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MCjyn/btsKALxhSfD/jjI3DWD75q2UeQ8zKvjpw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMCjyn%2FbtsKALxhSfD%2FjjI3DWD75q2UeQ8zKvjpw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;932&quot; height=&quot;332&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;332&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id=&quot;3-path-or-curve&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3. Path (or Curve)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;adjacency한 애들 따라가서 다른 픽셀로 가는 길 (n&lt;span&gt;&amp;nbsp;&lt;/span&gt;- path의 길이)&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;48&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tu0EC/btsKAD7gt7I/fqYbzN5kSMEVTg12STTj4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tu0EC/btsKAD7gt7I/fqYbzN5kSMEVTg12STTj4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tu0EC/btsKAD7gt7I/fqYbzN5kSMEVTg12STTj4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftu0EC%2FbtsKAD7gt7I%2FfqYbzN5kSMEVTg12STTj4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;486&quot; height=&quot;48&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;48&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;closed path - 시작해서 제자리로 돌아오는 path&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;167&quot; data-origin-height=&quot;31&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUDiWQ/btsKAXYBH8I/gYUwWfj3WqYdav4VUDiKfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUDiWQ/btsKAXYBH8I/gYUwWfj3WqYdav4VUDiKfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUDiWQ/btsKAXYBH8I/gYUwWfj3WqYdav4VUDiKfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUDiWQ%2FbtsKAXYBH8I%2FgYUwWfj3WqYdav4VUDiKfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;167&quot; height=&quot;31&quot; data-origin-width=&quot;167&quot; data-origin-height=&quot;31&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;두 픽셀사이 path가 있다 -&amp;gt; 두 픽셀이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;connected&lt;/b&gt;&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PP08l/btsKAskwBXr/GzFdVSBsACnWA0fvn8EO71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PP08l/btsKAskwBXr/GzFdVSBsACnWA0fvn8EO71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PP08l/btsKAskwBXr/GzFdVSBsACnWA0fvn8EO71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPP08l%2FbtsKAskwBXr%2FGzFdVSBsACnWA0fvn8EO71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;238&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;238&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;4-region&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;4. Region&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Path로 연결된 픽셀 덩어리 (connected set)&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;212&quot; data-origin-height=&quot;235&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l2QGs/btsKAtX8FSU/yfgmjA8IncoZOFV5KGrPr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l2QGs/btsKAtX8FSU/yfgmjA8IncoZOFV5KGrPr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l2QGs/btsKAtX8FSU/yfgmjA8IncoZOFV5KGrPr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl2QGs%2FbtsKAtX8FSU%2FyfgmjA8IncoZOFV5KGrPr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;212&quot; height=&quot;235&quot; data-origin-width=&quot;212&quot; data-origin-height=&quot;235&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;5-boundary&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;5. Boundary&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Region의 한 픽셀의 이웃 중, Region에 포함되지 않는 픽셀들&lt;br /&gt;(Region 픽셀 이웃의 여집합complement에 포함되는 픽셀)&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1226&quot; data-origin-height=&quot;551&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r53bJ/btsKCfcTW5r/pxQbSGyYqUHO1W1Pp002c0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r53bJ/btsKCfcTW5r/pxQbSGyYqUHO1W1Pp002c0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r53bJ/btsKCfcTW5r/pxQbSGyYqUHO1W1Pp002c0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr53bJ%2FbtsKCfcTW5r%2FpxQbSGyYqUHO1W1Pp002c0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1226&quot; height=&quot;551&quot; data-origin-width=&quot;1226&quot; data-origin-height=&quot;551&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;6-distance-measure-두-픽셀-사이-거리&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;6. Distance Measure (두 픽셀 사이 거리)&lt;/h3&gt;
&lt;h4 id=&quot;-metric&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;◾ Metric&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;거리를 재는 방법이 Metric하다는 것은
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;거리가 양수&lt;/li&gt;
&lt;li&gt;p -&amp;gt; q,&lt;span&gt;&amp;nbsp;&lt;/span&gt;q -&amp;gt; p&lt;span&gt;&amp;nbsp;&lt;/span&gt;거리가 동일&lt;/li&gt;
&lt;li&gt;p -&amp;gt; q&lt;span&gt;&amp;nbsp;&lt;/span&gt;+&lt;span&gt;&amp;nbsp;&lt;/span&gt;q -&amp;gt; p&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ge;&lt;span&gt;&amp;nbsp;&lt;/span&gt;p -&amp;gt; z&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;77&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMYCtn/btsKBapSB07/KjYdJxALnaeKjZKmLN0ws1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMYCtn/btsKBapSB07/KjYdJxALnaeKjZKmLN0ws1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMYCtn/btsKBapSB07/KjYdJxALnaeKjZKmLN0ws1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMYCtn%2FbtsKBapSB07%2FKjYdJxALnaeKjZKmLN0ws1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;77&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;77&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1. 직선거리&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;36&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BnXLp/btsKzU2I3b9/DiIttRdX84zBQMqx3hcfKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BnXLp/btsKzU2I3b9/DiIttRdX84zBQMqx3hcfKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BnXLp/btsKzU2I3b9/DiIttRdX84zBQMqx3hcfKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBnXLp%2FbtsKzU2I3b9%2FDiIttRdX84zBQMqx3hcfKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;537&quot; height=&quot;36&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;36&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 id=&quot;2-x축의-거리차--y축의-거리차&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2. x축의 거리차 + y축의 거리차&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;4neighbor을 통해서만 측정하는 거리&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;27&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYzVKb/btsKAAQgOMj/DQfFgHzWMDXwW6NjaBKkek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYzVKb/btsKAAQgOMj/DQfFgHzWMDXwW6NjaBKkek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYzVKb/btsKAAQgOMj/DQfFgHzWMDXwW6NjaBKkek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYzVKb%2FbtsKAAQgOMj%2FDQfFgHzWMDXwW6NjaBKkek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;404&quot; height=&quot;27&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;27&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;3-x축-차이-y축-차이의-최대값&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;3. x축 차이, y축 차이의 최대값&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;8neighbor을 통해서만 측정하는 거리&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;545&quot; data-origin-height=&quot;35&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTlNuS/btsKCfDXzdi/S3p7MkAi8Zm87a2Bw7za8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTlNuS/btsKCfDXzdi/S3p7MkAi8Zm87a2Bw7za8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTlNuS/btsKCfDXzdi/S3p7MkAi8Zm87a2Bw7za8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTlNuS%2FbtsKCfDXzdi%2FS3p7MkAi8Zm87a2Bw7za8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;545&quot; height=&quot;35&quot; data-origin-width=&quot;545&quot; data-origin-height=&quot;35&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1033&quot; data-origin-height=&quot;333&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYJ49W/btsKBT2dyOg/AhOKWcLijKHphtDXaviye1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYJ49W/btsKBT2dyOg/AhOKWcLijKHphtDXaviye1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYJ49W/btsKBT2dyOg/AhOKWcLijKHphtDXaviye1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYJ49W%2FbtsKBT2dyOg%2FAhOKWcLijKHphtDXaviye1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1033&quot; height=&quot;333&quot; data-origin-width=&quot;1033&quot; data-origin-height=&quot;333&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 id=&quot; -mathematical-tools-basic&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  Mathematical Tools Basic&lt;/h2&gt;
&lt;h3 id=&quot;1-array-operation&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1. Array Operation&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지끼리 곱할 때에는 아래 방법을 주로 사용 (기존의 행렬 곱셈이 아님)&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dZgD0W/btsKzNQebOa/pkcsuPLQllRa82eLOba6V1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dZgD0W/btsKzNQebOa/pkcsuPLQllRa82eLOba6V1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dZgD0W/btsKzNQebOa/pkcsuPLQllRa82eLOba6V1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdZgD0W%2FbtsKzNQebOa%2FpkcsuPLQllRa82eLOba6V1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;510&quot; height=&quot;104&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-linear-vs-nonlinear-operation&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. Linear vs Nonlinear Operation&lt;/h3&gt;
&lt;h4 id=&quot;operation&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;◾Operation&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;f이미지를 넣어서&lt;span&gt;&amp;nbsp;&lt;/span&gt;g이미지가 나오는 영상처리 함수H&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;206&quot; data-origin-height=&quot;37&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zazrV/btsKAB9vABd/qzpk6xG6UZUTOOGpTmLadk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zazrV/btsKAB9vABd/qzpk6xG6UZUTOOGpTmLadk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zazrV/btsKAB9vABd/qzpk6xG6UZUTOOGpTmLadk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzazrV%2FbtsKAB9vABd%2Fqzpk6xG6UZUTOOGpTmLadk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;206&quot; height=&quot;37&quot; data-origin-width=&quot;206&quot; data-origin-height=&quot;37&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;1-linear-operation&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1. Linear Operation&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;H함수를 한 번에 적용한 것과 두 번에 나눠서 적용한 것의 결과값이 같으면 Linear&lt;/li&gt;
&lt;li&gt;1번 적용한 것이 더 효율적&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;70&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pdcvt/btsKBhWM0WX/FNd528IpTyKhU8qAS8gAL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pdcvt/btsKBhWM0WX/FNd528IpTyKhU8qAS8gAL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pdcvt/btsKBhWM0WX/FNd528IpTyKhU8qAS8gAL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpdcvt%2FbtsKBhWM0WX%2FFNd528IpTyKhU8qAS8gAL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;695&quot; height=&quot;70&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;70&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;2-nonlinear-example&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2. Nonlinear example&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Linear하지 않고 함수의 결과값이 다른 경우&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OnMmj/btsKBRcfFi1/7F9QYd6GkfJkl4E5wVhyF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OnMmj/btsKBRcfFi1/7F9QYd6GkfJkl4E5wVhyF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OnMmj/btsKBRcfFi1/7F9QYd6GkfJkl4E5wVhyF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOnMmj%2FbtsKBRcfFi1%2F7F9QYd6GkfJkl4E5wVhyF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;613&quot; height=&quot;156&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;156&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-arithmetic-operation-산수-연산&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3. Arithmetic Operation (산수 연산)&lt;/h3&gt;
&lt;h4 id=&quot;1-addition&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1. Addition&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지를 픽셀별로 더하기&lt;/li&gt;
&lt;li&gt;[0, L-1]+[0, L-1]=[0, 2L-2] -&amp;gt; 범위가 달라진다.&lt;/li&gt;
&lt;li&gt;보통&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;원본이미지f&lt;span&gt;&amp;nbsp;&lt;/span&gt;+ Noise&amp;eta;&lt;/b&gt;를 이미지라고 함&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;276&quot; data-origin-height=&quot;67&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RAL4O/btsKzMwZsQK/AuEdh61ukweiMFDg77wbjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RAL4O/btsKzMwZsQK/AuEdh61ukweiMFDg77wbjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RAL4O/btsKzMwZsQK/AuEdh61ukweiMFDg77wbjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRAL4O%2FbtsKzMwZsQK%2FAuEdh61ukweiMFDg77wbjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;276&quot; height=&quot;67&quot; data-origin-width=&quot;276&quot; data-origin-height=&quot;67&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;465&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEEzT5/btsKBdUnOYl/048P5IUM6iJcsmsatNXyJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEEzT5/btsKBdUnOYl/048P5IUM6iJcsmsatNXyJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEEzT5/btsKBdUnOYl/048P5IUM6iJcsmsatNXyJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEEzT5%2FbtsKBdUnOYl%2F048P5IUM6iJcsmsatNXyJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;465&quot; height=&quot;206&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;2-subtraction&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2. Subtraction&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지를 픽셀별로 빼기&lt;/li&gt;
&lt;li&gt;[0, L-1]+[0, L-1]=[-L+1, L-1] -&amp;gt; 음수가 등장할 수 있음&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;263&quot; data-origin-height=&quot;37&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lwZha/btsKBapSB1h/xva88Lq5sxsVr1hzMn5Jwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lwZha/btsKBapSB1h/xva88Lq5sxsVr1hzMn5Jwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lwZha/btsKBapSB1h/xva88Lq5sxsVr1hzMn5Jwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlwZha%2FbtsKBapSB1h%2Fxva88Lq5sxsVr1hzMn5Jwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;263&quot; height=&quot;37&quot; data-origin-width=&quot;263&quot; data-origin-height=&quot;37&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;694&quot; data-origin-height=&quot;244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ncGyc/btsKAvatKVh/XAzzSilCnZG02pkLD6FaI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ncGyc/btsKAvatKVh/XAzzSilCnZG02pkLD6FaI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ncGyc/btsKAvatKVh/XAzzSilCnZG02pkLD6FaI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FncGyc%2FbtsKAvatKVh%2FXAzzSilCnZG02pkLD6FaI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;694&quot; height=&quot;244&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;244&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;3-multiplication&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;3. Multiplication&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지를 픽셀별로 곱하기 (행렬 곱하기 X)&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;36&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgfh48/btsKzADwJ8K/lj3ZCIKGk1wOzwmrpcH4WK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgfh48/btsKzADwJ8K/lj3ZCIKGk1wOzwmrpcH4WK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgfh48/btsKzADwJ8K/lj3ZCIKGk1wOzwmrpcH4WK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbgfh48%2FbtsKzADwJ8K%2Flj3ZCIKGk1wOzwmrpcH4WK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;234&quot; height=&quot;36&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;36&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;574&quot; data-origin-height=&quot;147&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b34xRi/btsKBohcVGB/pCdoS7Wt0b5squrQFZBTb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b34xRi/btsKBohcVGB/pCdoS7Wt0b5squrQFZBTb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b34xRi/btsKBohcVGB/pCdoS7Wt0b5squrQFZBTb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb34xRi%2FbtsKBohcVGB%2FpCdoS7Wt0b5squrQFZBTb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;574&quot; height=&quot;147&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;147&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;4-division&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;4. Division&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지를 픽셀별로 나누기&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;226&quot; data-origin-height=&quot;30&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EQZW1/btsKAfZUloL/IUYnkMsUbu5k27VIdJbk30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EQZW1/btsKAfZUloL/IUYnkMsUbu5k27VIdJbk30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EQZW1/btsKAfZUloL/IUYnkMsUbu5k27VIdJbk30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEQZW1%2FbtsKAfZUloL%2FIUYnkMsUbu5k27VIdJbk30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;226&quot; height=&quot;30&quot; data-origin-width=&quot;226&quot; data-origin-height=&quot;30&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;545&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W63J2/btsKBc2joaK/VSUMlT8EZIww8kUS7totd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W63J2/btsKBc2joaK/VSUMlT8EZIww8kUS7totd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W63J2/btsKBc2joaK/VSUMlT8EZIww8kUS7totd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW63J2%2FbtsKBc2joaK%2FVSUMlT8EZIww8kUS7totd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;545&quot; height=&quot;206&quot; data-origin-width=&quot;545&quot; data-origin-height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;4. Logical Operation&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgiNeh/btsKB4vOhQp/5ZdefMOqSe0oeUoVlKno40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgiNeh/btsKB4vOhQp/5ZdefMOqSe0oeUoVlKno40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgiNeh/btsKB4vOhQp/5ZdefMOqSe0oeUoVlKno40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgiNeh%2FbtsKB4vOhQp%2F5ZdefMOqSe0oeUoVlKno40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;414&quot; height=&quot;314&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id=&quot;5-pixel-wise-logical-operation-픽셀-단위-논리연산&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;5. Pixel-wise Logical Operation (픽셀 단위 논리연산)&lt;/h3&gt;
&lt;h4 id=&quot;1-complement-여집합&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1. Complement (여집합)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가장 큰 것K에서 뺀 것&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;197&quot; data-origin-height=&quot;29&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmH6cR/btsKABVViRT/S2RORrQMm5FzYblfDCqra0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmH6cR/btsKABVViRT/S2RORrQMm5FzYblfDCqra0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmH6cR/btsKABVViRT/S2RORrQMm5FzYblfDCqra0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmH6cR%2FbtsKABVViRT%2FS2RORrQMm5FzYblfDCqra0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;197&quot; height=&quot;29&quot; data-origin-width=&quot;197&quot; data-origin-height=&quot;29&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;2-union-합집합&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2. Union (합집합)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 이미지의 최대값을 취함&lt;/li&gt;
&lt;li&gt;ex) max(검정0, 회색160) -&amp;gt; 회색이 합집합&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;255&quot; data-origin-height=&quot;30&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dqwvf/btsKBbvweOK/LIBdHuVAyiQV2aLzMtKLCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dqwvf/btsKBbvweOK/LIBdHuVAyiQV2aLzMtKLCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dqwvf/btsKBbvweOK/LIBdHuVAyiQV2aLzMtKLCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDqwvf%2FbtsKBbvweOK%2FLIBdHuVAyiQV2aLzMtKLCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;255&quot; height=&quot;30&quot; data-origin-width=&quot;255&quot; data-origin-height=&quot;30&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;3. others&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;527&quot; data-origin-height=&quot;530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1nWMn/btsKBUz3ZZW/H3wD8IZlV2DAkH5Mz7SYEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1nWMn/btsKBUz3ZZW/H3wD8IZlV2DAkH5Mz7SYEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1nWMn/btsKBUz3ZZW/H3wD8IZlV2DAkH5Mz7SYEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1nWMn%2FbtsKBUz3ZZW%2FH3wD8IZlV2DAkH5Mz7SYEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;527&quot; height=&quot;530&quot; data-origin-width=&quot;527&quot; data-origin-height=&quot;530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Image Processing</category>
      <author>VHAL_</author>
      <guid isPermaLink="true">https://n1mss-e.tistory.com/36</guid>
      <comments>https://n1mss-e.tistory.com/36#entry36comment</comments>
      <pubDate>Fri, 8 Nov 2024 12:06:53 +0900</pubDate>
    </item>
  </channel>
</rss>