<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[RSS Feed of Wonyu]]></title><description><![CDATA[Hello :) I'm Wonyu]]></description><link>https://choiwonyu.github.io</link><generator>GatsbyJS</generator><lastBuildDate>Fri, 23 May 2025 12:07:10 GMT</lastBuildDate><item><title><![CDATA[HTTP]]></title><description><![CDATA[✅ 웹 브라우저와 서버 간의 통신을 위한 응용 계층 프로토콜   📌 특징 무상태성(Stateless…]]></description><link>https://choiwonyu.github.io/HTTP/</link><guid isPermaLink="false">https://choiwonyu.github.io/HTTP/</guid><pubDate>Sun, 23 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;✅ 웹 브라우저와 서버 간의 통신을 위한 응용 계층 프로토콜&lt;/strong&gt;  &lt;/p&gt;
&lt;h2 id=&quot;-특징&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%ED%8A%B9%EC%A7%95&quot; aria-label=&quot; 특징 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 특징&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;무상태성Stateless&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%AC%B4%EC%83%81%ED%83%9C%EC%84%B1Stateless&quot; aria-label=&quot;무상태성Stateless permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;무상태성(Stateless)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;각 요청이 독립적이고, 서버는 이전 상태를 기억하지 않는다.  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 장점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;많은 요청을 효율적으로 처리 가능&lt;/li&gt;
&lt;li&gt;구현 단순  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🔹 단점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;로그인 등 상태 유지가 필요한 경우 별도 구현 필요
ex) 쿠키, 세션, 토큰 등&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;클라이언트-서버-구조&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8-%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%A1%B0&quot; aria-label=&quot;클라이언트 서버 구조 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;클라이언트-서버 구조&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;요청자와 응답자가 명확하게 나뉘는 구조&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;텍스트-기반-프로토콜&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%85%8D%EC%8A%A4%ED%8A%B8-%EA%B8%B0%EB%B0%98-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C&quot; aria-label=&quot;텍스트 기반 프로토콜 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;텍스트 기반 프로토콜&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;사람이 직접 읽고 이해할 수 있는 텍스트 형식으로 구성  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 장점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;디버깅이나 테스트 간편&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🔹 단점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;binary 형식보다 비효율적
-&gt; HTTP/2에서는 binary framing 도입  &lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-기본-구조-요청---응답&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EA%B8%B0%EB%B3%B8-%EA%B5%AC%EC%A1%B0-%EC%9A%94%EC%B2%AD---%EC%9D%91%EB%8B%B5&quot; aria-label=&quot; 기본 구조 요청   응답 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 기본 구조: 요청 - 응답&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;요청&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9A%94%EC%B2%AD&quot; aria-label=&quot;요청 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;요청&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;클라이언트가 서버에 리소스를 요청할 때 보내는 메세지  &lt;/p&gt;
&lt;p&gt;🔹 &lt;strong&gt;구성 요소&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;요청 라인: &lt;code class=&quot;language-text&quot;&gt;GET /page.html HTTP/1.1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;헤더: 요청에 대한 추가 정보&lt;/li&gt;
&lt;li&gt;본문: 주로 POST/PUT 요청에서 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;요청 예시&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;응답&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9D%91%EB%8B%B5&quot; aria-label=&quot;응답 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;응답&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;서버가 요청을 처리한 후 클라이언트에게 돌려주는 메세지  &lt;/p&gt;
&lt;p&gt;🔹 &lt;strong&gt;구성 요소&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;상태 라인: &lt;code class=&quot;language-text&quot;&gt;HTTP/1.1 200 OK&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;헤더: 응답에 대한 정보&lt;/li&gt;
&lt;li&gt;본문: 요청한 데이터  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;응답 예시&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234

&amp;lt;html&gt;
  &amp;lt;body&gt;Hello, world!&amp;lt;/body&gt;
&amp;lt;/html&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-버전별-비교&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EB%B2%84%EC%A0%84%EB%B3%84-%EB%B9%84%EA%B5%90&quot; aria-label=&quot; 버전별 비교 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 버전별 비교&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;HTTP10&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#HTTP10&quot; aria-label=&quot;HTTP10 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;HTTP/1.0&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;🔹 특징&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;요청마다 새로운 TCP 연결 필요 -&gt; 비효율적 (매번 3-way handshake)
-&gt; Keep-Alive&lt;/li&gt;
&lt;li&gt;헤더 전송 시 중복이 많고 압축이 없어 비효율적&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🔹 Keep-Alive&lt;/strong&gt;&lt;br&gt;
HTTP 연결을 끊지 않고 재사용해서 성능을 높이는 기술&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTP/1.0에서는 명시적으로 Keep-Alive를 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;HTTP/1.1은 기본 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;HTTP11&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#HTTP11&quot; aria-label=&quot;HTTP11 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;HTTP/1.1&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;🔹 주요 개선점&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;지속 연결 &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;기본적으로 연결 유지(keep-alive 필요 없음)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;파이프라인 지원&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;요청은 순차 전송, 응답도 순차 도착이 기본 원칙이라 브라우저들이 사용을 꺼림&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;❌ 한계&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;멀티 요청/응답 병렬 처리 불가능&lt;br&gt;
-&gt; 여전히 Head-of-Line Blocking 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;HTTP2&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#HTTP2&quot; aria-label=&quot;HTTP2 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;HTTP/2&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;🔹 주요 개선점&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;멀티 플렉싱
-&gt; 하나의 TCP 연결로 동시에 여러 요청과 응답 전송 가능&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;헤더 압축&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;중복 제거 + 압축 -&gt; 대역폭 절약, 속도 향상&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;서버 푸시&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;클라이언트의 요청 없이 서버가 미리 리소스 전송 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;바이너리  프레이밍&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;텍스트가 아닌 바이너리 기반&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🔹 Head-of-Line Blocking&lt;/strong&gt;&lt;br&gt;
앞줄에 있는 하나의 요청이 지연되면, 그 뒤의 요청들까지 기다려야 하는 상황  &lt;/p&gt;
&lt;h2 id=&quot;-HTTP--REST&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-HTTP--REST&quot; aria-label=&quot; HTTP  REST permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;📌 &lt;strong&gt;HTTP &amp;#x26; REST&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;✅ HTTP는 프로토콜(통신 방법)이고, REST는 아키텍처 스타일(설계 원칙)이다.&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;HTTP&lt;/th&gt;
&lt;th&gt;REST&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;개념&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;프로토콜&lt;/strong&gt; (통신을 위한 약속)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;아키텍처 스타일&lt;/strong&gt; (설계 방식)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;목적&lt;/td&gt;
&lt;td&gt;클라이언트 ↔ 서버 간 &lt;strong&gt;데이터 전송&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;웹 리소스를 &lt;strong&gt;명확하고 일관되게 설계&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;내용&lt;/td&gt;
&lt;td&gt;요청/응답 포맷, 상태 코드, 메서드 등&lt;/td&gt;
&lt;td&gt;자원 중심 URI 설계, 메서드에 따라 의미를 부여&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;관계&lt;/td&gt;
&lt;td&gt;REST는 HTTP 위에서 주로 사용됨&lt;/td&gt;
&lt;td&gt;HTTP를 기반으로 동작하는 경우가 많음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;따라서 REST는 HTTP 뿐만 아니라 WebSocket, gRPC 등 다른 프로토콜 위에서도 적용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;RESTRepresentational-State-Transfer&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#RESTRepresentational-State-Transfer&quot; aria-label=&quot;RESTRepresentational State Transfer permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;REST(Representational State Transfer)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;✅ 자원을 중심으로 설계하는 방식&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ &quot;자원의 표현(Representation)&quot;을 이용해 상태(State)를 전달(Transfer)&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 핵심 설계 원칙&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Client-Server 구조&lt;/strong&gt;: 클라이언트와 서버를 명확하게 분리해야 한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stateless&lt;/strong&gt;: 각 요청은 독립적이며, 서버는 이전 요청의 상태를 저장하지 않는다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cacheable&lt;/strong&gt;: 응답은 캐시가 가능한지 여부를 명확히 나타내야 한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Uniform Interface&lt;/strong&gt;: 자원 접근은 표준 HTTP 메서드와 URI 사용을 지켜 일관된 인터페이스를 통해 이뤄져야 한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Layered System&lt;/strong&gt;: 클라이언트는 REST 서버와 상호작용할 뿐, 중간 서버에 대해서는 모른다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Code on Demand&lt;/strong&gt;: 서버는 클라이언트로 실행 가능한 코드(JavaScript 등)를 전송할 수 있다&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[Acceptance Test]]></title><description><![CDATA[✅ 사용자 스토리(시나리오)에 맞춰 수행하는 테스트 ✅ 개발자와 이해관계자들 간의 토의를 통해 만들어진 시나리오에 기반해 테스트 ✅ 실제 HTTP…]]></description><link>https://choiwonyu.github.io/Acceptance Test/</link><guid isPermaLink="false">https://choiwonyu.github.io/Acceptance Test/</guid><pubDate>Fri, 14 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;✅ 사용자 스토리(시나리오)에 맞춰 수행하는 테스트&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ 개발자와 이해관계자들 간의 토의를 통해 만들어진 시나리오에 기반해 테스트&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ 실제 HTTP 요청을 보내고 응답을 확인하는 최상위 레벨의 테스트&lt;/strong&gt;  &lt;/p&gt;
&lt;h2 id=&quot;-특징&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%ED%8A%B9%EC%A7%95&quot; aria-label=&quot; 특징 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 특징&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;사용자-관점에서-동작-검증&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%82%AC%EC%9A%A9%EC%9E%90-%EA%B4%80%EC%A0%90%EC%97%90%EC%84%9C-%EB%8F%99%EC%9E%91-%EA%B2%80%EC%A6%9D&quot; aria-label=&quot;사용자 관점에서 동작 검증 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;사용자 관점에서 동작 검증&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;단순한 코드 실행이 아니라, &lt;strong&gt;실제 사용자의 시나리오를 검증&lt;/strong&gt;함.&lt;/li&gt;
&lt;li&gt;예: &quot;사용자가 회원 가입을 하면, 로그인할 수 있어야 한다.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;전체-시스템을-테스트-E2E-포함&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A0%84%EC%B2%B4-%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%9D%84-%ED%85%8C%EC%8A%A4%ED%8A%B8-E2E-%ED%8F%AC%ED%95%A8&quot; aria-label=&quot;전체 시스템을 테스트 E2E 포함 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;전체 시스템을 테스트 (E2E 포함)&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;REST API, 데이터베이스, 보안 설정 등 &lt;strong&gt;전체 애플리케이션의 동작을 포함한 검증&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;단순한 API 응답뿐만 아니라, &lt;strong&gt;비즈니스 로직, DB 반영 여부까지 확인 가능&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;REST-API-기반의-테스트가-일반적&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#REST-API-%EA%B8%B0%EB%B0%98%EC%9D%98-%ED%85%8C%EC%8A%A4%ED%8A%B8%EA%B0%80-%EC%9D%BC%EB%B0%98%EC%A0%81&quot; aria-label=&quot;REST API 기반의 테스트가 일반적 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;REST API 기반의 테스트가 일반적&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;RestAssured&lt;/code&gt;를 사용하여 &lt;strong&gt;HTTP 요청-응답을 기반으로 검증&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spring Boot에서는 &lt;code class=&quot;language-text&quot;&gt;@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)&lt;/code&gt;를 사용&lt;/strong&gt;하여 서버를 띄워 테스트&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-REST-assured&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-REST-assured&quot; aria-label=&quot; REST assured permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;📌 &lt;strong&gt;REST-assured&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅ &lt;strong&gt;REST API를 테스트하기 위한 Java 기반의 라이브러리&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;HTTP 요청을 보내고, 응답을 검증하는 기능을 제공&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Spring Boot, JUnit과 함께 API 테스트를 수행할 때 많이 사용됨&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;REST Assured는 2.0 버전 이후로 &lt;strong&gt;BDD 스타일&lt;/strong&gt;(&lt;code class=&quot;language-text&quot;&gt;Given-When-Then&lt;/code&gt;)을 기반으로 API 테스트를 작성하도록 설계되었다.  &lt;/p&gt;
&lt;h3 id=&quot;Given설정-요청-준비&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Given%EC%84%A4%EC%A0%95-%EC%9A%94%EC%B2%AD-%EC%A4%80%EB%B9%84&quot; aria-label=&quot;Given설정 요청 준비 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Given(설정-요청 준비)&lt;/strong&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;예제&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;baseUri()&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;기본 URL 설정&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;given().baseUri(&quot;http://localhost:8080&quot;)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;basePath()&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;기본 경로 설정&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;given().basePath(&quot;/users&quot;)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;port()&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;포트 설정&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;given().port(8080)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;header()&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;요청 헤더 설정&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;given().header(&quot;Authorization&quot;, &quot;Bearer token&quot;)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;contentType()&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;요청 데이터 타입 설정&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;given().contentType(&quot;application/json&quot;)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;body()&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;요청 본문 (JSON, XML 등) 설정&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;given().body(&quot;{ \&quot;name\&quot;: \&quot;Alice\&quot; }&quot;)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;pathParam()&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;경로 변수 설정&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;given().pathParam(&quot;id&quot;, 1)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;queryParam()&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;쿼리 파라미터 설정&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;given().queryParam(&quot;sort&quot;, &quot;name&quot;)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;API 요청을 보낼 때 필요한 정보(헤더, 파라미터, 본문 등)을 설정한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🔹 Default Values&lt;/strong&gt;&lt;br&gt;
REST-assured는 기본적으로 host를 localhost, port를 8080으로 지정하지만, 메서드나 설정 파일을 통해 값을 변경할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;메서드&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token function&quot;&gt;given&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;80&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;설정 파일&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;properties&quot;&gt;&lt;pre class=&quot;language-properties&quot;&gt;&lt;code class=&quot;language-properties&quot;&gt;&lt;span class=&quot;token key attr-name&quot;&gt;RestAssured.baseURI&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;&quot;http://myhost.org&quot;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;When행위-요청-실행&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#When%ED%96%89%EC%9C%84-%EC%9A%94%EC%B2%AD-%EC%8B%A4%ED%96%89&quot; aria-label=&quot;When행위 요청 실행 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;When(행위-요청 실행)&lt;/strong&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;예제&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;get()&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GET 요청 전송&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;when().get(&quot;/users/{id}&quot;)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;post()&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;POST 요청 전송&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;when().post(&quot;/users&quot;)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;put()&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PUT 요청 전송&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;when().put(&quot;/users/{id}&quot;)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;delete()&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DELETE 요청 전송&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;when().delete(&quot;/users/{id}&quot;)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;patch()&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PATCH 요청 전송&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;when().patch(&quot;/users/{id}&quot;)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;설정된 요청을 실행해 실제 HTTP 요청을 보낸다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;Then검증-응답-확인&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Then%EA%B2%80%EC%A6%9D-%EC%9D%91%EB%8B%B5-%ED%99%95%EC%9D%B8&quot; aria-label=&quot;Then검증 응답 확인 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Then(검증-응답 확인)&lt;/strong&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;예제&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;statusCode()&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HTTP 상태 코드 검증&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;then().statusCode(200)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;body()&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;응답 본문(JSON, XML 등) 값 검증&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;then().body(&quot;name&quot;, equalTo(&quot;Alice&quot;))&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;header()&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;응답 헤더 값 검증&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;then().header(&quot;Content-Type&quot;, &quot;application/json&quot;)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;time()&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;응답 시간 검증&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;then().time(lessThan(2000L))&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;extract()&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;응답 값 추출&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;then().extract().jsonPath().getString(&quot;token&quot;)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;응답이 예상한 값과 일치하는지 검증한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🔹 ExtractableResponse&lt;/strong&gt;&lt;br&gt;
extract() 메서드를 통해 응답 정보를 담은 객체를 반환받아 AssertJ로 테스트할 수 있다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; 회원가입_검증&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;ExtractableResponse&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
    &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; code &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;statusCode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
    &lt;span class=&quot;token function&quot;&gt;assertThat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;code&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isEqualTo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;HttpStatus&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;CREATED&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;vs-MockMVC&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#vs-MockMVC&quot; aria-label=&quot;vs MockMVC permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;vs MockMVC&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ REST Assured와 MockMvc는 &lt;strong&gt;둘 다 API 테스트를 수행할 수 있지만, 사용하는 환경이 다름&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;MockMvc는 실제 HTTP 요청을 보내지 않고, Controller 계층을 Mock으로 테스트하는 반면, RestAssured는 실제 서버에서 테스트를 수행&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;테스트 방식&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;실제 네트워크 요청&lt;/th&gt;
&lt;th&gt;Spring 컨텍스트 필요 여부&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MockMvc&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Controller 계층만 테스트&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;⭕&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rest Assured&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;전체 애플리케이션을 실행하고 API 테스트 수행&lt;/td&gt;
&lt;td&gt;⭕&lt;/td&gt;
&lt;td&gt;⭕&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-참고&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%B0%B8%EA%B3%A0&quot; aria-label=&quot; 참고 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 참고&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://tecoble.techcourse.co.kr/post/2021-05-25-unit-test-vs-integration-test-vs-acceptance-test/&quot;&gt;https://tecoble.techcourse.co.kr/post/2021-05-25-unit-test-vs-integration-test-vs-acceptance-test/&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://github.com/rest-assured/rest-assured/wiki/Usage&quot;&gt;https://github.com/rest-assured/rest-assured/wiki/Usage&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://www.baeldung.com/rest-assured-tutorial&quot;&gt;https://www.baeldung.com/rest-assured-tutorial&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Slice Test]]></title><description><![CDATA[✅ Slice Test는 Spring에서 특정 레이어(Controller, Repository 등)만 테스트하는 방식 ✅ 애플리케이션 전체를 로드하는 것이 아니라, 필요한 빈(Bean…]]></description><link>https://choiwonyu.github.io/Slice Test/</link><guid isPermaLink="false">https://choiwonyu.github.io/Slice Test/</guid><pubDate>Sun, 09 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;✅ &lt;strong&gt;Slice Test는 Spring에서 특정 레이어(Controller, Repository 등)만 테스트하는 방식&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;애플리케이션 전체를 로드하는 것이 아니라, 필요한 빈(Bean)만 로드하여 테스트 속도를 향상&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;각 레이어별로 독립적인 단위 테스트를 수행할 수 있도록 도움&lt;/strong&gt;  &lt;/p&gt;
&lt;h2 id=&quot;-필요성&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%ED%95%84%EC%9A%94%EC%84%B1&quot; aria-label=&quot; 필요성 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 필요성&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;vs-Unit-Test&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#vs-Unit-Test&quot; aria-label=&quot;vs Unit Test permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;vs Unit Test&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Unit Test는 특정 클래스만 테스트하기 때문에 Spring Context를 사용하지 않는다. 따라서 &lt;strong&gt;다른 Spring Bean과의 연동 테스트가 어렵다.&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;반면, Slice Test는 &lt;strong&gt;각 레이어의 필요한 빈을 로드하기 때문에 특정 레이어의 연동 테스트가 가능&lt;/strong&gt;하다.&lt;/p&gt;
&lt;h3 id=&quot;vs-SpringBootTest&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#vs-SpringBootTest&quot; aria-label=&quot;vs SpringBootTest permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;vs SpringBootTest&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;SpringBootTest는 Spring Context를 사용하고, 다른 Spring Bean과의 연동 테스트가 가능하다. 하지만 &lt;strong&gt;애플리케이션 전체를 로드하기 때문에 시간이 오래걸리고 무겁다.&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;반면, Slice Test는 &lt;strong&gt;특정 레이어의 빈들만 로드하기 때문에 비교적 가볍다.&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-Web-Layer-Slice-Test&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Web-Layer-Slice-Test&quot; aria-label=&quot; Web Layer Slice Test permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Web Layer Slice Test&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅ &lt;strong&gt;Web Layer Bean들만 로드하여 테스트하는 방법&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Service 및 Repository는 로드되지 않으며, Service는 Mock으로 주입해야 함&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;WebMvcTest&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#WebMvcTest&quot; aria-label=&quot;WebMvcTest permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;@WebMvcTest&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;@WebMvcTest&lt;/code&gt; 어노테이션을 이용하면 웹 레이어 테스트를 하는 데 필요한 &lt;code class=&quot;language-text&quot;&gt;@Controller&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;@ControllerAdvice&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;Filter&lt;/code&gt; 등만 Bean으로 등록된다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;예시 코드&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@ExtendWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;SpringExtension&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token annotation punctuation&quot;&gt;@WebMvcTest&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;UserController&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserControllerTest&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Autowired&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MockMvc&lt;/span&gt; mockMvc&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@MockBean&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserService&lt;/span&gt; userService&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Test&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;shouldReturnUser&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// Given&lt;/span&gt;
        &lt;span class=&quot;token class-name&quot;&gt;Long&lt;/span&gt; userId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1L&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token class-name&quot;&gt;UserDto&lt;/span&gt; mockUser &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserDto&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;John Doe&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;john@example.com&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;when&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUserById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;thenReturn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mockUser&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;// When &amp;amp; Then&lt;/span&gt;
        mockMvc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;perform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/users/{id}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; userId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;andExpect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isOk&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;andExpect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;jsonPath&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;$.name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;John Doe&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;andExpect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;jsonPath&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;$.email&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;john@example.com&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;MockMvc를 사용하여 위처럼 &lt;strong&gt;REST API를 실제로 호출하는 것처럼 테스트 가능&lt;/strong&gt;하다.  &lt;/p&gt;
&lt;h3 id=&quot;MockBean&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#MockBean&quot; aria-label=&quot;MockBean permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;@MockBean&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;위 예시 코드에서 UserService는 왜 @Mock이 아닌 @MockBean으로 등록되었을까?&lt;br&gt;
위 코드는 &lt;strong&gt;Web Layer 내 Spring Bean과의 연동을 테스트하는 것이므로 Service 객체도 일반 Mock 객체가 아닌 Spring Bean인 Mock 객체가 필요&lt;/strong&gt;하다. 따라서 @MockBean으로 Spring Bean인 Mock 객체를 주입한 것이다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-Repository-Layer-Test&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Repository-Layer-Test&quot; aria-label=&quot; Repository Layer Test permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Repository Layer Test&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅ &lt;strong&gt;JPA 관련 Bean(&lt;code class=&quot;language-text&quot;&gt;@Repository&lt;/code&gt;)만 로드하여 테스트&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;예시 코드&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@DataJpaTest&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserRepositoryTest&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Autowired&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserRepository&lt;/span&gt; userRepository&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Test&lt;/span&gt;  
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; 멤버_저장_테스트&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
    &lt;span class=&quot;token comment&quot;&gt;// given  &lt;/span&gt;
    &lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;choi&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
    &lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; nickname &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;phillip&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
    &lt;span class=&quot;token class-name&quot;&gt;Member&lt;/span&gt; member &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Member&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; nickname&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
  
    &lt;span class=&quot;token comment&quot;&gt;// when  &lt;/span&gt;
    myJpaRepository&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;save&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;member&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
    &lt;span class=&quot;token class-name&quot;&gt;Optional&lt;/span&gt;&lt;span class=&quot;token generics&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Member&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt; foundResult &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; myJpaRepository&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;findById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1L&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
  
    &lt;span class=&quot;token comment&quot;&gt;// then  &lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;assertSoftly&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;softly &lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
        softly&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;assertThat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;foundResult&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  
              &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isNotEmpty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
        &lt;span class=&quot;token class-name&quot;&gt;Member&lt;/span&gt; foundMember &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; foundResult&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
        softly&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;assertThat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;foundMember&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isEqualTo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
        softly&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;assertThat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;foundMember&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getNickname&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isEqualTo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;nickname&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;@DataJpaTest를 사용하면 &lt;strong&gt;기본적으로 인메모리 데이터베이스인 H2를 기반으로 테스트용 데이터베이스를 구축&lt;/strong&gt;한다. 또한 &lt;strong&gt;테스트가 끝나면 롤백&lt;/strong&gt;을 해준다. &lt;/p&gt;
&lt;p&gt;레포지토리 계층은 실제 DB와 통신 없이 Mock 객체를 사용하는 것이 의미가 없기 때문에 &lt;strong&gt;직접 DB와 통신하는 @DataJpaTest를 사용&lt;/strong&gt;해야 한다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-참고&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%B0%B8%EA%B3%A0&quot; aria-label=&quot; 참고 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 참고&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://jojoldu.tistory.com/226&quot;&gt;https://jojoldu.tistory.com/226&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://tecoble.techcourse.co.kr/post/2021-05-18-slice-test/&quot;&gt;https://tecoble.techcourse.co.kr/post/2021-05-18-slice-test/&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://mangkyu.tistory.com/145&quot;&gt;https://mangkyu.tistory.com/145&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Mockito]]></title><description><![CDATA[✅ Java에서 가장 널리 사용되는 Mocking 프레임워크 ✅ 객체의 동작을 사전에 정의하여 단위 테스트를 쉽게 수행할 수 있도록 지원 ✅ 실제 객체를 사용하지 않고 Mock 객체를 생성하여 독립적인 테스트를 가능하게 함 📌 사용 방법 JUnit…]]></description><link>https://choiwonyu.github.io/Mockito/</link><guid isPermaLink="false">https://choiwonyu.github.io/Mockito/</guid><pubDate>Sat, 08 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;✅ Java에서 가장 널리 사용되는 Mocking 프레임워크&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ 객체의 동작을 사전에 정의하여 단위 테스트를 쉽게 수행할 수 있도록 지원&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ 실제 객체를 사용하지 않고 Mock 객체를 생성하여 독립적인 테스트를 가능하게 함&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;-사용-방법&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%82%AC%EC%9A%A9-%EB%B0%A9%EB%B2%95&quot; aria-label=&quot; 사용 방법 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 사용 방법&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;JUnit과-함께-사용&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#JUnit%EA%B3%BC-%ED%95%A8%EA%BB%98-%EC%82%AC%EC%9A%A9&quot; aria-label=&quot;JUnit과 함께 사용 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;JUnit과 함께 사용&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;✅ Mockito와 JUnit 모두 테스트 프레임워크이기 때문에 같이 사용하기 위해선 설정이 필요하다.&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@ExtendWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;MockitoExtension&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MockitoAnnotationUnitTest&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;위와 같이 설정하면, Mockito를 이용해 Mock 객체를 생성하고, JUnit을 통해 테스트할 수 있다.&lt;/p&gt;
&lt;h3 id=&quot;주요-기능&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A3%BC%EC%9A%94-%EA%B8%B0%EB%8A%A5&quot; aria-label=&quot;주요 기능 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;주요 기능&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;🔹 Mock 객체 생성&lt;/strong&gt;  &lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token import static&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;org&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;mockito&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Mockito&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token class-name&quot;&gt;UserRepository&lt;/span&gt; userRepository &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;mock&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;UserRepository&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;🔹 Stub 설정&lt;/strong&gt;  &lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token function&quot;&gt;when&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userRepository&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;findById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1L&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;thenReturn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1L&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;John Doe&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;john@example.com&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Mockito의 &lt;code class=&quot;language-text&quot;&gt;when().thenReturn()&lt;/code&gt;을 사용하면, Stub처럼 특정 입력값에 대해 미리 정의된 값을 반환하도록 설정할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 예외 발생 시뮬레이션&lt;/strong&gt;  &lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token function&quot;&gt;when&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userRepository&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;findById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2L&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;thenThrow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserNotFoundException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;User not found&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Mockito는 예외 상황을 시뮬레이션할 수 있도록 &lt;code class=&quot;language-text&quot;&gt;thenThrow()&lt;/code&gt;를 제공한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 메서드 호출 검증(행위 검증)&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token function&quot;&gt;verify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userRepository&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;findById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1L&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 메서드가 호출되었는지 확인&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;verify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userRepository&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;times&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;findById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1L&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 정확히 1번 호출되었는지 확인&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;verify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userRepository&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;never&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;findById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2L&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 특정 메서드가 호출되지 않았는지 확인&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Mockito의 행위 검증 기능을 활용하면, 코드가 예상대로 동작했는지를 명확히 검증할 수 있다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-어노테이션&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98&quot; aria-label=&quot; 어노테이션 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 어노테이션&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;Mock&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Mock&quot; aria-label=&quot;Mock permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;@Mock&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;🔹 &lt;strong&gt;Mockito.mock() 사용&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Test&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;whenNotUseMockAnnotation_thenCorrect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token class-name&quot;&gt;List&lt;/span&gt; mockList &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Mockito&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;mock&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;ArrayList&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    
    mockList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;one&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token class-name&quot;&gt;Mockito&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;verify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mockList&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;one&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;assertEquals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; mockList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token class-name&quot;&gt;Mockito&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;when&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mockList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;thenReturn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;assertEquals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; mockList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;🔹 &lt;strong&gt;@Mock 사용&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Mock&lt;/span&gt;
&lt;span class=&quot;token class-name&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;token generics&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt; mockedList&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token annotation punctuation&quot;&gt;@Test&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;whenUseMockAnnotation_thenMockIsInjected&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    mockedList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;one&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token class-name&quot;&gt;Mockito&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;verify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mockedList&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;one&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;assertEquals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; mockedList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token class-name&quot;&gt;Mockito&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;when&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mockedList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;thenReturn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;assertEquals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; mockedList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;위처럼 @Mock 어노테이션을 사용하면, static 메서드 없이 mock 객체를 생성할 수 있다.&lt;/p&gt;
&lt;h3 id=&quot;InjectMocks&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#InjectMocks&quot; aria-label=&quot;InjectMocks permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;@InjectMocks&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;✅ 생성된 Mock 객체를 자동으로 테스트 객체에 주입한다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 @InjectMocks를 사용하지 않을 때&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@ExtendWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;MockitoExtension&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserServiceTest&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Mock&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserRepository&lt;/span&gt; userRepository&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserService&lt;/span&gt; userService&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// @InjectMocks 없이 직접 생성&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@BeforeEach&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;setUp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        userService &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserService&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userRepository&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 생성자를 통해 수동으로 주입&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;🔹 @InjectMocks 사용할 때&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@ExtendWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;MockitoExtension&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserServiceTest&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Mock&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Mock 객체 생성&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserRepository&lt;/span&gt; userRepository&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@InjectMocks&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// userRepository를 자동으로 주입하여 UserService 생성&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserService&lt;/span&gt; userService&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;@InjectMocks는 &lt;strong&gt;하나의 SUT에 대해서만 사용&lt;/strong&gt;해야 한다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-참고&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%B0%B8%EA%B3%A0&quot; aria-label=&quot; 참고 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 참고&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.baeldung.com/mockito-series&quot;&gt;https://www.baeldung.com/mockito-series&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Test Double]]></title><description><![CDATA[📌 Test Double이란? ✅ 테스트 코드에서 실제 객체를 대체하는 가짜 객체 ✅ 독립적인 테스트를 수행할 수 있게 함   필요성 🔹 독립성 보장 실제 객체가 외부 DB…]]></description><link>https://choiwonyu.github.io/Test Double/</link><guid isPermaLink="false">https://choiwonyu.github.io/Test Double/</guid><pubDate>Fri, 07 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;-Test-Double이란&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Test-Double%EC%9D%B4%EB%9E%80&quot; aria-label=&quot; Test Double이란 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;📌 &lt;strong&gt;Test Double이란?&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;✅ 테스트 코드에서 실제 객체를 대체하는 가짜 객체&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ 독립적인 테스트를 수행할 수 있게 함&lt;/strong&gt;  &lt;/p&gt;
&lt;h3 id=&quot;필요성&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%95%84%EC%9A%94%EC%84%B1&quot; aria-label=&quot;필요성 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;필요성&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;🔹 독립성 보장&lt;/strong&gt;&lt;br&gt;
실제 객체가 외부 DB, 네트워크, 파일 시스템 등 외부 시스템에 의존성을 가지면 테스트가 영향을 받을 수 있다.&lt;br&gt;
Test Double을 사용하면 외부 요소와 분리해 단위 테스트를 수행할 수 있다.  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 속도 향상&lt;/strong&gt;&lt;br&gt;
외부 시스템 호출이 필요한 테스트는 실행 속도가 느리다.&lt;br&gt;
Test Double을 사용하면 빠르게 실행할 수 있는 가짜 객체를 활용해 빠르게 테스트를 수행할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 특정 상황 쉽게 재현&lt;/strong&gt;&lt;br&gt;
네트워크 오류, 응답 지연 등의 상황을 쉽게 재현하여 시뮬레이션할 수 있다.  &lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-Test-Double의-종류&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Test-Double%EC%9D%98-%EC%A2%85%EB%A5%98&quot; aria-label=&quot; Test Double의 종류 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Test Double의 종류&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Test Double은 크게 다섯 가지 유형으로 분류된다.&lt;br&gt;
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/f7a9a454048dfa1508bd31f65b2e709a/38915/test-double.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 21.764705882352942%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAoklEQVR42m1O2QqAMAzb/3+h4gmec8NbBK9IAr45KE3aJKvBz7vvW33bNuR5jizLEEUR+r7HcRyq53n+rDDneYLVdR289zK1bYsgCBRWFAWSJEEcx0jTFGEYitd1LV3TNNKs64rrumDKstSwqipYa9U5o4Hh4zhqP88zpmnCMAzi1BBTw0AWseFV32+fwTkn/HFeTzH5sizak+/7Lk4N/Qx8AXhaLpj4yqmTAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;test double&apos; title=&apos;&apos; src=&apos;/static/f7a9a454048dfa1508bd31f65b2e709a/ca1dc/test-double.png&apos; srcset=&apos;/static/f7a9a454048dfa1508bd31f65b2e709a/e7570/test-double.png 170w,
/static/f7a9a454048dfa1508bd31f65b2e709a/f46e7/test-double.png 340w,
/static/f7a9a454048dfa1508bd31f65b2e709a/ca1dc/test-double.png 680w,
/static/f7a9a454048dfa1508bd31f65b2e709a/02d09/test-double.png 1020w,
/static/f7a9a454048dfa1508bd31f65b2e709a/9d567/test-double.png 1360w,
/static/f7a9a454048dfa1508bd31f65b2e709a/38915/test-double.png 2182w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;Dummy&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Dummy&quot; aria-label=&quot;Dummy permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Dummy&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;✅ 단순히 파라미터를 채우기 위해 사용&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ 필수적으로 요구되지만, 실제 사용하지 않는 객체&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;예시 코드&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;DummyUser&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;User&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getUsername&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 아무 동작도 하지 않음&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 테스트 코드&lt;/span&gt;
&lt;span class=&quot;token annotation punctuation&quot;&gt;@Test&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;testDummy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token class-name&quot;&gt;NotificationService&lt;/span&gt; notificationService &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;NotificationService&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    notificationService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;sendNotification&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;DummyUser&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 실제 사용 X&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;Stub&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Stub&quot; aria-label=&quot;Stub permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Stub&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;✅ 미리 정해진 값을 반환하는 객체&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ 복잡한 로직 없이 테스트에 필요한 최소한의 동작만 수행&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;예시 코드&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PaymentServiceStub&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PaymentService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;boolean&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;processPayment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;double&lt;/span&gt; amount&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 항상 성공 반환&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 테스트 코드&lt;/span&gt;
&lt;span class=&quot;token annotation punctuation&quot;&gt;@Test&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;testStub&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token class-name&quot;&gt;PaymentServiceStub&lt;/span&gt; paymentStub &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PaymentServiceStub&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token class-name&quot;&gt;OrderService&lt;/span&gt; orderService &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;OrderService&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;paymentStub&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token function&quot;&gt;assertTrue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;orderService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;placeOrder&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;100.0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 항상 성공&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;Fake&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Fake&quot; aria-label=&quot;Fake permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Fake&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;✅ 실제 객체와 비슷하지만, 간단한 인메모리 저장소 등을 활용해 테스트 수행&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ 실제 구현에 가깝지만, 완전한 기능을 제공하지 않음&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;예시 코드&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;FakeUserRepository&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserRepository&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;token generics&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt; database &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;HashMap&lt;/span&gt;&lt;span class=&quot;token generics&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;save&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;User&lt;/span&gt; user&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        database&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;put&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUsername&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; user&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;User&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;findByUsername&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; username&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; database&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;username&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 테스트 코드&lt;/span&gt;
&lt;span class=&quot;token annotation punctuation&quot;&gt;@Test&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;testFake&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token class-name&quot;&gt;FakeUserRepository&lt;/span&gt; fakeRepo &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;FakeUserRepository&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token class-name&quot;&gt;User&lt;/span&gt; user &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;testUser&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    fakeRepo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;save&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token function&quot;&gt;assertEquals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; fakeRepo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;findByUsername&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;testUser&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 저장된 객체 반환&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;Spy&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Spy&quot; aria-label=&quot;Spy permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Spy&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;✅ 실제 객체를 감싸 호출 정보를 감시하는 객체&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ 실제 객체의 메서드를 실행하면서 호출 여부, 횟수 등의 정보 검증 가능&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;예시 코드&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;SpyList&lt;/span&gt;&lt;span class=&quot;token generics&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ArrayList&lt;/span&gt;&lt;span class=&quot;token generics&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; addCallCount &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;boolean&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;T&lt;/span&gt; element&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        addCallCount&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;element&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getAddCallCount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; addCallCount&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 테스트 코드&lt;/span&gt;
&lt;span class=&quot;token annotation punctuation&quot;&gt;@Test&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;testSpy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token class-name&quot;&gt;SpyList&lt;/span&gt;&lt;span class=&quot;token generics&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt; spyList &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;SpyList&lt;/span&gt;&lt;span class=&quot;token generics&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    spyList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;hello&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    spyList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;world&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token function&quot;&gt;assertEquals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; spyList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getAddCallCount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// add()가 몇 번 호출되었는지 검증&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;🔹 Mock과의 차이점&lt;/strong&gt;&lt;br&gt;
Mock은 모든 동작을 가로채지만, Spy는 실제 메서드 실행한다. 따라서 사이드 이펙트를 주의해야 한다.  &lt;/p&gt;
&lt;h3 id=&quot;Mock&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Mock&quot; aria-label=&quot;Mock permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Mock&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;✅ 호출에 대한 기대를 명세하고, 해당 내용에 따라 동작하도록 프로그래밍 된 객체&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;예시 코드&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@ExtendWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;MockitoExtension&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserServiceTest&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Mock&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserRepository&lt;/span&gt; userRepository&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@InjectMocks&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserService&lt;/span&gt; userService&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Test&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;shouldReturnUserWhenUserIdIsProvided&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// Given&lt;/span&gt;
        &lt;span class=&quot;token class-name&quot;&gt;Long&lt;/span&gt; userId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1L&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token class-name&quot;&gt;User&lt;/span&gt; mockUser &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;John Doe&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;john@example.com&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;when&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userRepository&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;findById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;thenReturn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mockUser&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;// When&lt;/span&gt;
        &lt;span class=&quot;token class-name&quot;&gt;User&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; userService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUserById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;// Then&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;assertNotNull&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;assertEquals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;John Doe&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;verify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userRepository&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;findById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Test&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;shouldThrowExceptionWhenUserNotFound&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// Given&lt;/span&gt;
        &lt;span class=&quot;token class-name&quot;&gt;Long&lt;/span&gt; userId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2L&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;when&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userRepository&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;findById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;thenThrow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserNotFoundException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;User not found&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;// When &amp;amp; Then&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;assertThrows&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;UserNotFoundException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt; userService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUserById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;verify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userRepository&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;findById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-행위-검증--상태-검증&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%ED%96%89%EC%9C%84-%EA%B2%80%EC%A6%9D--%EC%83%81%ED%83%9C-%EA%B2%80%EC%A6%9D&quot; aria-label=&quot; 행위 검증  상태 검증 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 행위 검증 &amp;#x26; 상태 검증&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;행위-검증&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%96%89%EC%9C%84-%EA%B2%80%EC%A6%9D&quot; aria-label=&quot;행위 검증 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;행위 검증&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;테스트 대상(SUT)이 &lt;strong&gt;예상대로 다른 객체와 상호작용하는지(특정 동작을 수행하는지)&lt;/strong&gt; 확인  &lt;/p&gt;
&lt;h3 id=&quot;상태-검증&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%83%81%ED%83%9C-%EA%B2%80%EC%A6%9D&quot; aria-label=&quot;상태 검증 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;상태 검증&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;특정 작업 수행 후 &lt;strong&gt;반환값이 예상대로 나오는지&lt;/strong&gt; 확인&lt;/p&gt;
&lt;h3 id=&quot;비교&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B9%84%EA%B5%90&quot; aria-label=&quot;비교 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;비교&lt;/strong&gt;&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token function&quot;&gt;when&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userRepository&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;findById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;thenReturn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mockUser&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Mock 객체인 userRepository를 Stub처럼 행동하게 한다.&lt;br&gt;
하지만, &quot;사전 정의된 기대&quot;를 기반으로 한다는 점에서 Mock 객체이다. &lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token function&quot;&gt;assertNotNull&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;assertEquals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;John Doe&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;상태 검증이지만, 그 상태가 특정 행위(UserRepository의 호출)에 의해 만들어진 것이므로, 간접적으로 행위 검증의 의미도 포함될 수 있다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token function&quot;&gt;verify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userRepository&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;findById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;실제 상호 작용이 수행되었는지 확인하는 행위 검증이다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 Mock vs Stub&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stub은 단순히 입력값에 대해 고정된 값을 반환한다. (상태 검증)&lt;/li&gt;
&lt;li&gt;Mock은 명세대로 행동한다. 따라서 반환값 뿐만 아니라 상호 작용이 예상대로 수행되었는지 검증할 수 있게 한다. (상태 검증, 행위 검증)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-참고&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%B0%B8%EA%B3%A0&quot; aria-label=&quot; 참고 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 참고&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/3459287/whats-the-difference-between-a-mock-stub&quot;&gt;https://stackoverflow.com/questions/3459287/whats-the-difference-between-a-mock-stub&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[JUnit & AssertJ]]></title><description><![CDATA[📌 JUnit이란? ✅ Java 진영에서 가장 많이 사용되는 유닛 테스트 프레임워크 ✅ Java 애플리케이션에서 유닛 테스트와 통합 테스트를 실행하는 데 사용 구성요소 JUnit 5는 다음 3가지 모듈로 구성된다. 모듈 설명 JUnit…]]></description><link>https://choiwonyu.github.io/JUnit &amp; AssertJ/</link><guid isPermaLink="false">https://choiwonyu.github.io/JUnit &amp; AssertJ/</guid><pubDate>Thu, 06 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;-JUnit이란&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-JUnit%EC%9D%B4%EB%9E%80&quot; aria-label=&quot; JUnit이란 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 JUnit이란?&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;✅ Java 진영에서 가장 많이 사용되는 유닛 테스트 프레임워크&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ Java 애플리케이션에서 유닛 테스트와 통합 테스트를 실행하는 데 사용&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;구성요소&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B5%AC%EC%84%B1%EC%9A%94%EC%86%8C&quot; aria-label=&quot;구성요소 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;구성요소&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;JUnit 5는 다음 &lt;strong&gt;3가지 모듈&lt;/strong&gt;로 구성된다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;모듈&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;JUnit Platform&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;다양한 테스트 엔진을 실행할 수 있는 기반 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;JUnit Jupiter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JUnit 5의 테스트 엔진 제공 (&lt;code class=&quot;language-text&quot;&gt;@Test&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;@BeforeEach&lt;/code&gt; 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;JUnit Vintage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JUnit 3, 4 기반의 테스트 실행 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-JUnit-라이프사이클-어노테이션&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-JUnit-%EB%9D%BC%EC%9D%B4%ED%94%84%EC%82%AC%EC%9D%B4%ED%81%B4-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98&quot; aria-label=&quot; JUnit 라이프사이클 어노테이션 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 JUnit 라이프사이클 어노테이션&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;✅ 테스트 실행 전/후 설정 및 정리를 수행하는 메서드를 정의할 수 있게 한다.&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;어노테이션&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;@BeforeEach&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;각 테스트 전에 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;@AfterEach&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;각 테스트 후에 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;@BeforeAll&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;모든 테스트 실행 전에 1번 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;@AfterAll&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;모든 테스트 실행 후 1번 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token import&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;org&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;junit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;jupiter&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;api&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;LifecycleTest&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@BeforeAll&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;beforeAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;📌 모든 테스트 시작 전 (1회 실행)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@BeforeEach&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;beforeEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;🔹 개별 테스트 실행 전&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Test&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;test1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;✅ 실행: test1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Test&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;test2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;✅ 실행: test2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@AfterEach&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;afterEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;🔹 개별 테스트 실행 후&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@AfterAll&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;afterAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;📌 모든 테스트 종료 후 (1회 실행)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;h3 id=&quot;-JUnit-단언-Assertions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-JUnit-%EB%8B%A8%EC%96%B8-Assertions&quot; aria-label=&quot; JUnit 단언 Assertions permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 JUnit 단언 (Assertions)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;✅ 테스트 결과를 검증하는 다양한 Assertions를 제공&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ 모두 &lt;code class=&quot;language-text&quot;&gt;org.junit.jupiter.api.Assertions&lt;/code&gt; 클래스의 &lt;code class=&quot;language-text&quot;&gt;static&lt;/code&gt; 메서드로 제공&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;메서드&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;assertEquals(expected, actual)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;기대값과 실제값 비교&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;assertTrue(condition)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;조건이 &lt;code class=&quot;language-text&quot;&gt;true&lt;/code&gt;인지 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;assertFalse(condition)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;조건이 &lt;code class=&quot;language-text&quot;&gt;false&lt;/code&gt;인지 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;assertNotNull(object)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;객체가 &lt;code class=&quot;language-text&quot;&gt;null&lt;/code&gt;이 아님을 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;assertThrows(Exception.class, () -&gt; {...})&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;예외 발생 여부 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Assertions 예시&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Test&lt;/span&gt;  
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;addAssertions&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
    &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; sum &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
    &lt;span class=&quot;token class-name&quot;&gt;Assertions&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;assertEquals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sum&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;예외 처리 Assertions 예제&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Test&lt;/span&gt;  
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;exceptionAssertions&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
    &lt;span class=&quot;token class-name&quot;&gt;Assertions&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;assertThrows&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;ArithmeticException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
        &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;문제점&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%AC%B8%EC%A0%9C%EC%A0%90&quot; aria-label=&quot;문제점 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;문제점&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;❌ 가독성이 떨어지는 검증&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;❌ 메서드 체이닝을 지원하지 않아 여러 검증을 수행하기 어려움&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;❌ 예외 검증이 제한적&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;AssertJ는 위와 같은 JUnit의 문제점을 해결한다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-AssertJ란&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-AssertJ%EB%9E%80&quot; aria-label=&quot; AssertJ란 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 AssertJ란?&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;✅ Java에서 테스트를 작성할 때 필요한 직관적인 단언을 제공하는 라이브러리&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ 테스트 코드의 가독성을 향상&lt;/strong&gt;  &lt;/p&gt;
&lt;h3 id=&quot;구성요소-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B5%AC%EC%84%B1%EC%9A%94%EC%86%8C-1&quot; aria-label=&quot;구성요소 1 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;구성요소&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;✅ 여러 모듈로 구성되어 있으며, 각 모듈은 특정한 타입에 대한 단언을 제공&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AssertJ Core&lt;/strong&gt;: JDK 타입(String, Iterable, Stream, Path, File, Map 등)에 대한 단언을 제공&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AssertJ Guava&lt;/strong&gt;: Guava 라이브러리의 타입(Multimap, Optional 등)에 대한 단언을 제공&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AssertJ Joda-Time&lt;/strong&gt;: Joda-Time 라이브러리의 타입(DateTime, LocalDateTime 등)에 대한 단언을 제공&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AssertJ Neo4j&lt;/strong&gt;: Neo4j 데이터베이스의 타입(Path, Node, Relationship 등)에 대한 단언을 제공&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AssertJ DB&lt;/strong&gt;: 관계형 데이터베이스의 타입(Table, Row, Column 등)에 대한 단언을 제공&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AssertJ Swing&lt;/strong&gt;: Swing 사용자 인터페이스의 기능적 테스트를 위한 API를 제공  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;⭐️ &lt;code class=&quot;language-text&quot;&gt;AssertJ Core&lt;/code&gt;가 가장 널리 사용되며, 나머지 모듈은 특정 환경(Guava, Joda-Time, DB 등)에서 사용됨&lt;/p&gt;
&lt;h3 id=&quot;특징&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8A%B9%EC%A7%95&quot; aria-label=&quot;특징 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;특징&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;향상된 가독성&lt;/strong&gt;: &lt;code class=&quot;language-text&quot;&gt;assertThat()&lt;/code&gt; 메서드를 중심으로 자연스러운 언어 구조를 제공&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;풍부한 단언 메서드&lt;/strong&gt;: 문자열, 컬렉션, 예외, 파일 등 다양한 타입에 대한 단언을 지원&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;메서드 체이닝&lt;/strong&gt;: 여러 단언을 체이닝하여 가독성 향상&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IDE 친화적&lt;/strong&gt;: 코드 자동 완성 기능을 통해 개발 생산성을 향상&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-AssertJ-단언-Assertions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-AssertJ-%EB%8B%A8%EC%96%B8-Assertions&quot; aria-label=&quot; AssertJ 단언 Assertions permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 AssertJ 단언 (Assertions)&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;기본-단언&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B8%B0%EB%B3%B8-%EB%8B%A8%EC%96%B8&quot; aria-label=&quot;기본 단언 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;기본 단언&lt;/strong&gt;&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Test&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;basicAssertions&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Frodo&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;assertThat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isEqualTo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Frodo&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;startsWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Fro&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;endsWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;do&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isEqualToIgnoringCase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;frodo&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;컬렉션-단언&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%BB%AC%EB%A0%89%EC%85%98-%EB%8B%A8%EC%96%B8&quot; aria-label=&quot;컬렉션 단언 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;컬렉션 단언&lt;/strong&gt;&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Test&lt;/span&gt;  
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;collectionAssertions&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
    &lt;span class=&quot;token class-name&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;token generics&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt; fellowship &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Frodo&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Sam&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Gandalf&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
    &lt;span class=&quot;token function&quot;&gt;assertThat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fellowship&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hasSize&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  
                          &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;contains&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Frodo&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Sam&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  
                          &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doesNotContain&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Sauron&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;예외-단언&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%98%88%EC%99%B8-%EB%8B%A8%EC%96%B8&quot; aria-label=&quot;예외 단언 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;예외 단언&lt;/strong&gt;&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token import static&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;org&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;assertj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;core&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;api&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Assertions&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token annotation punctuation&quot;&gt;@Test&lt;/span&gt;  
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;exceptionAssertions&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
    &lt;span class=&quot;token function&quot;&gt;assertThatThrownBy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
        &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Exception&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;boom!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isInstanceOf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Exception&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  
      &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hasMessageContaining&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;boom&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;객체-단언&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B0%9D%EC%B2%B4-%EB%8B%A8%EC%96%B8&quot; aria-label=&quot;객체 단언 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;객체 단언&lt;/strong&gt;&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Member&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token class-name&quot;&gt;Long&lt;/span&gt; id&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; nickname&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token annotation punctuation&quot;&gt;@Test&lt;/span&gt;  
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fieldsAssertions&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
    &lt;span class=&quot;token class-name&quot;&gt;Member&lt;/span&gt; member1 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Member&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1L&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;choi&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;phillip&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
    &lt;span class=&quot;token class-name&quot;&gt;Member&lt;/span&gt; member2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Member&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;choi&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;phillip&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
  
    &lt;span class=&quot;token function&quot;&gt;assertThat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;member1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;usingRecursiveComparison&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  
                       &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ignoringFields&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  
                       &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isEqualTo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;member2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-JUnit과-AssertJ의-관계&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-JUnit%EA%B3%BC-AssertJ%EC%9D%98-%EA%B4%80%EA%B3%84&quot; aria-label=&quot; JUnit과 AssertJ의 관계 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 JUnit과 AssertJ의 관계&lt;/strong&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;JUnit은 테스트 실행을 담당&lt;/strong&gt; (테스트 라이프사이클 관리, &lt;code class=&quot;language-text&quot;&gt;@Test&lt;/code&gt; 제공)  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AssertJ는 직관적이고 강력한 검증을 담당&lt;/strong&gt; (&lt;code class=&quot;language-text&quot;&gt;assertThat()&lt;/code&gt;으로 가독성 개선)  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AssertJ는 JUnit이 없으면 테스트를 실행할 수 없음&lt;/strong&gt;  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JUnit만 사용하면 검증 코드가 불편하므로, AssertJ를 추가하면 가독성이 향상됨&lt;/strong&gt;  &lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-참고&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%B0%B8%EA%B3%A0&quot; aria-label=&quot; 참고 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 참고&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://junit.org/junit5/docs/current/user-guide&quot;&gt;https://junit.org/junit5/docs/current/user-guide&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://assertj.github.io/doc&quot;&gt;https://assertj.github.io/doc&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[TDD 개요]]></title><description><![CDATA[📌 TDD란? ✅ 테스트를 먼저 작성한 후에 실제 코드를 작성하는 개발 방법론 ✅ 요구사항을 기반으로 테스트 케이스를 먼저 만들고, 그 테스트를 통과할 수 있도록 최소한의 코드를 작성한 후, 이를 점진적으로 개선하는 방식   3단계 사이클  RED…]]></description><link>https://choiwonyu.github.io/TDD 개요/</link><guid isPermaLink="false">https://choiwonyu.github.io/TDD 개요/</guid><pubDate>Tue, 04 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;-TDD란&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-TDD%EB%9E%80&quot; aria-label=&quot; TDD란 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 TDD란?&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;✅ 테스트를 먼저 작성한 후에 실제 코드를 작성하는 개발 방법론&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ 요구사항을 기반으로 테스트 케이스를 먼저 만들고, 그 테스트를 통과할 수 있도록 최소한의 코드를 작성한 후, 이를 점진적으로 개선하는 방식&lt;/strong&gt;  &lt;/p&gt;
&lt;h3 id=&quot;3단계-사이클&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3%EB%8B%A8%EA%B3%84-%EC%82%AC%EC%9D%B4%ED%81%B4&quot; aria-label=&quot;3단계 사이클 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;3단계 사이클&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/e6f8eaffd6d749563f279306aa63f280/545d7/cycle.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 73.52941176470587%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB80lEQVR42p2TiWrbQBCG9f4v1BJKqaGHIQ2OW9tVfUWyLuuoblnSHvozWsUmxgl1MmJZGEbf/HOshtes6yDLEsw0wTYbcNuCzHP8z7SXQL3JNAW3LIDzwS8EQW3lfx53NZDtdugIIqIIzDAGkJRKcX9fr/DJFJDgPaCZ3oM7jvLz/R5d07y9ZOG66Iriog0yCN5XcpFl+HVzA75eg3sehO+jJrUh3UPYlcBj4JfRCD/GY9UvWdfo2lb5TYImSXKK7b8L4DHZEWbQEGaz+YtKGIEXfxaoKcmZkCewdoyvmUBNGxLEOX7eTZ6FXKrXFzo+fPqICjXc3EfJShV/UmjHDRZuCTtpsfUL6G6OspUEoHKlHErrF70b1qWHjJbfER7+qbOOH+BX4QDMSdbMLs7UNExiYuYQ8rLxTDKsk4ezMnvbJtTbJoMWFQxJxbEJDkrlnZEhO3BEJcdoPMF89ht7mqxFr8R1XOjGEn4ZYhVv8dn8hq/WLe79GeI6hVcG0EIC+lmLqhVw4hpO0oBTmW7KcDudY/lXRxhGcGkvHduBYZswUnrX/dILhpaOalvuqURay6VSVzTiNO0gb7HcV6++hv7noKInKTkBW9XHFfVRdGIYSkPQlV9huitgRDUsUspEdzGU06EvbXI1CK/wKYFLVQk1lEeWeosnWRaOEwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;cycle&apos; title=&apos;&apos; src=&apos;/static/e6f8eaffd6d749563f279306aa63f280/ca1dc/cycle.png&apos; srcset=&apos;/static/e6f8eaffd6d749563f279306aa63f280/e7570/cycle.png 170w,
/static/e6f8eaffd6d749563f279306aa63f280/f46e7/cycle.png 340w,
/static/e6f8eaffd6d749563f279306aa63f280/ca1dc/cycle.png 680w,
/static/e6f8eaffd6d749563f279306aa63f280/02d09/cycle.png 1020w,
/static/e6f8eaffd6d749563f279306aa63f280/9d567/cycle.png 1360w,
/static/e6f8eaffd6d749563f279306aa63f280/545d7/cycle.png 1562w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;RED (실패하는 테스트 작성)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;기능을 구현하기 전, 먼저 테스트를 작성한다.&lt;/li&gt;
&lt;li&gt;처음에는 당연히 실패한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;GREEN (테스트가 통과하도록 최소한의 코드 작성)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;테스트가 통과할 수 있도록 최소한의 코드를 작성한다.&lt;/li&gt;
&lt;li&gt;복잡한 최적화 없이 &lt;strong&gt;가장 단순한 해결책&lt;/strong&gt;을 적용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;BLUE (리팩토링)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;중복을 제거하고, 더 나은 코드 구조로 개선한다.&lt;/li&gt;
&lt;li&gt;테스트를 다시 실행하여 리팩토링 과정에서 기능이 깨지지 않았는지 확인한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;TDD의-필요성&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#TDD%EC%9D%98-%ED%95%84%EC%9A%94%EC%84%B1&quot; aria-label=&quot;TDD의 필요성 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;TDD의 필요성&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;🔹 설계 개선&lt;/strong&gt;&lt;br&gt;
테스트를 먼저 작성하면서 시스템의 구조와 인터페이스를 고민하게 되어 더 나은 설계를 유도한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 장기적인 관점에서 개발 비용 감소&lt;/strong&gt;&lt;br&gt;
코드의 안정성이 증가하고, 리팩토링에 용이한 코드가 되므로 장기적으로 개발 속도를 향상시킨다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-테스트-종류&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%A2%85%EB%A5%98&quot; aria-label=&quot; 테스트 종류 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 테스트 종류&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;단위-테스트-Unit-Test&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%8B%A8%EC%9C%84-%ED%85%8C%EC%8A%A4%ED%8A%B8-Unit-Test&quot; aria-label=&quot;단위 테스트 Unit Test permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;단위 테스트 (Unit Test)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;✅ 가장 많은 비율을 차지하는 테스트&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ 개별 함수, 클래스, 모듈을 독립적으로 테스트&lt;/strong&gt;  &lt;/p&gt;
&lt;h3 id=&quot;통합-테스트-Integration-Test&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%86%B5%ED%95%A9-%ED%85%8C%EC%8A%A4%ED%8A%B8-Integration-Test&quot; aria-label=&quot;통합 테스트 Integration Test permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;통합 테스트 (Integration Test)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;✅ 여러 모듈이 결합되었을 때 정상적으로 작동하는지 테스트&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ 테스트 격리 전략이 필요&lt;/strong&gt;  &lt;/p&gt;
&lt;h3 id=&quot;E2E-테스트-End-to-End-Test&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#E2E-%ED%85%8C%EC%8A%A4%ED%8A%B8-End-to-End-Test&quot; aria-label=&quot;E2E 테스트 End to End Test permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;E2E 테스트 (End-to-End Test)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;✅ 애플리케이션의 전체적인 흐름 테스트&lt;/strong&gt;  &lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-FIRST-원칙&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-FIRST-%EC%9B%90%EC%B9%99&quot; aria-label=&quot; FIRST 원칙 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 FIRST 원칙&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;✅ 테스트 코드가 갖추어야 할 5가지 원칙&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;F&lt;/strong&gt;ast (빠르게 실행)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I&lt;/strong&gt;solated (독립적으로 실행 가능)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;R&lt;/strong&gt;epeatable (반복 실행 가능)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;S&lt;/strong&gt;elf-validating (결과를 스스로 검증 가능)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;T&lt;/strong&gt;imely (적시에 작성, 코드 작성 전에 먼저 테스트 작성)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-Testability&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Testability&quot; aria-label=&quot; Testability permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Testability&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;✅ 테스트를 얼마나 쉽고, 효과적으로 수행할 수 있는지 나타내는 정도&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ 얼마나 쉽게 입력을 변경(Controllability)하고, 출력을 검증(Observability)할 수 있는가?&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;DIP--DI&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#DIP--DI&quot; aria-label=&quot;DIP  DI permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;DIP &amp;#x26; DI&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;객체가 하위 모듈이 아닌 &lt;strong&gt;추상화된 상위 모듈에 의존하게 함(DIP)으로써 쉽게 입력(input)을 변경&lt;/strong&gt;할 수 있게 한다. 테스트 시 &lt;strong&gt;대역을 객체에 주입(DI)해 쉽게 출력(output)을 검증&lt;/strong&gt;할 수 있도록 한다.&lt;/p&gt;
&lt;p&gt;이는 &lt;strong&gt;변경 사항에 유연하게 대응할 수 있는 코드를 유도&lt;/strong&gt;한다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Spring AOP]]></title><description><![CDATA[✅ AOP(Aspect Oriented Programming)은 핵심 비즈니스 로직이 아닌 공통적인 부가적인 관심사(로깅, 보안, 트랜잭션 관리 등)를 분리하여 코드의 유지보수성을 높이는 프로그래밍 기법 📌 핵심 개념 용어 설명 Aspect…]]></description><link>https://choiwonyu.github.io/Spring AOP/</link><guid isPermaLink="false">https://choiwonyu.github.io/Spring AOP/</guid><pubDate>Mon, 03 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;✅ &lt;strong&gt;AOP(Aspect Oriented Programming)은 핵심 비즈니스 로직이 아닌 공통적인 부가적인 관심사(로깅, 보안, 트랜잭션 관리 등)를 분리하여 코드의 유지보수성을 높이는 프로그래밍 기법&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;-핵심-개념&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%ED%95%B5%EC%8B%AC-%EA%B0%9C%EB%85%90&quot; aria-label=&quot; 핵심 개념 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 핵심 개념&lt;/strong&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;용어&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;설명&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Aspect&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;공통 관심사(로깅, 트랜잭션, 보안 등)를 &lt;strong&gt;모듈화한 객체&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Advice&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;특정 JoinPoint에서 &lt;strong&gt;실행될 코드&lt;/strong&gt; (Before, After, Around 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;JoinPoint&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Advice가 &lt;strong&gt;실행될 수 있는 지점&lt;/strong&gt; (메서드 실행 시점 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pointcut&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JoinPoint 중에서 &lt;strong&gt;Advice를 적용할 대상을 정의하는 표현식&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Weaving&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Advice를 실제 대상 객체에 적용하는 과정&lt;/strong&gt; (컴파일 타임, 런타임 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-Spring-AOP의-주요-Advice-종류&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Spring-AOP%EC%9D%98-%EC%A3%BC%EC%9A%94-Advice-%EC%A2%85%EB%A5%98&quot; aria-label=&quot; Spring AOP의 주요 Advice 종류 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Spring AOP의 주요 Advice 종류&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;✅ 오류 확률 감소와 간결한 코드를 위해 최소한의 유형 선택 권장&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Advice 유형&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;설명&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;예제&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Before&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;대상 메서드 실행 &lt;strong&gt;전&lt;/strong&gt; 실행&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;@Before(&quot;execution(* com.example..*(..))&quot;)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;After Returning&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;대상 메서드 실행 &lt;strong&gt;후&lt;/strong&gt; (예외 발생 X) 실행&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;@AfterReturning(&quot;execution(* com.example..*(..))&quot;)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;After Throwing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;대상 메서드 실행 중 예외 발생 시 실행&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;@AfterThrowing(&quot;execution(* com.example..*(..))&quot;)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;After (Finally)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;대상 메서드 실행 &lt;strong&gt;완료 후&lt;/strong&gt; (성공/실패 상관없음) 실행&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;@After(&quot;execution(* com.example..*(..))&quot;)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Around&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;대상 메서드 실행 &lt;strong&gt;전/후&lt;/strong&gt; 모두 실행 (가장 강력함)&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;@Around(&quot;execution(* com.example..*(..))&quot;)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;🔹 AOP 동작 순서&lt;/strong&gt;  &lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;1️⃣ @Around 실행 (메서드 실행 전)  
2️⃣ @Before 실행  
3️⃣ 대상 메서드 실행  
4️⃣ @AfterReturning 실행 (정상 종료 시)  
5️⃣ @AfterThrowing 실행 (예외 발생 시)  
6️⃣ @After 실행 (무조건 실행)  
7️⃣ @Around 실행 (메서드 실행 후)  &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-Spring-AOP-적용-방식&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Spring-AOP-%EC%A0%81%EC%9A%A9-%EB%B0%A9%EC%8B%9D&quot; aria-label=&quot; Spring AOP 적용 방식 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Spring AOP 적용 방식&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;✅ 프록시 기반 방식과 AspectJ 기반 방식이 있다.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;프록시-기반-방식&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%94%84%EB%A1%9D%EC%8B%9C-%EA%B8%B0%EB%B0%98-%EB%B0%A9%EC%8B%9D&quot; aria-label=&quot;프록시 기반 방식 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;프록시 기반 방식&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;Spring이 기본적으로 제공하는 AOP 방식&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;런타임에 프록시 객체를 생성하여 AOP 기능을 적용&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;스프링 컨테이너에서 관리하는 빈에만 적용 가능&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 동작 방식&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JDK 동적 프록시: 인터페이스가 있는 경우, &lt;code class=&quot;language-text&quot;&gt;java.lang.reflect.Proxy&lt;/code&gt;를 이용해 프록시 생성&lt;/li&gt;
&lt;li&gt;CGLIB 프록시(클래스 기반): 인터페이스가 없는 경우, CGLIB 라이브러리를 사용해 바이트코드 조작으로 프록시 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🔹 프록시 동작 방식&lt;/strong&gt;&lt;br&gt;
AOP 없이 Spring 빈을 실행시키면, 아래와 같이 실행될 것이다.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/a8a8cf9c231a2cbf88a4c4ce179885cf/77dcf/without-proxy.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 40.588235294117645%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABYlAAAWJQFJUiTwAAABX0lEQVR42m2STU/CQBCG+x+NxqMXf4WJJ4wn/4InPegFE028UeBWDaLYlPQTBS39oKVCgH7tvnYXShCZ5M1sZ3ae3dmpkCYZ3j6u0NROIXbOUXuvoKFUIMpnaKgnMIY1kAxIkhhpmiKOY4RhiMlkwv18PkeWZTzHJFAKSNYFqq09XD4e4KZ5hGvxEHfSMe47++h+V8GMUsJ9kiQYDAYcZts2B25aAaR8wU40LQskp/C9cAWhO1Xmdu0RCFkmop8QhqEjzzP4vsdjedFrebPNIkLIWv+AlCwLxlEEwzSR5jk8318Bi6IdkBK0HWNaA6PxGLqm8Y3BaPSnrU3bbnl7LZDiRoo9hKiouK3ViynLeJCeUFe6kD6/8Kxq0FQVuq5DluXiOXw4jsOHwuS6Lo/1+30EQcDekKDneugOHbyaPbRNCy+agbZh8oN6RTH7VZhmsxn3bLJlbLFYcE2nU/79C94AXEHSmDHVAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;without proxy&apos; title=&apos;&apos; src=&apos;/static/a8a8cf9c231a2cbf88a4c4ce179885cf/ca1dc/without-proxy.png&apos; srcset=&apos;/static/a8a8cf9c231a2cbf88a4c4ce179885cf/e7570/without-proxy.png 170w,
/static/a8a8cf9c231a2cbf88a4c4ce179885cf/f46e7/without-proxy.png 340w,
/static/a8a8cf9c231a2cbf88a4c4ce179885cf/ca1dc/without-proxy.png 680w,
/static/a8a8cf9c231a2cbf88a4c4ce179885cf/77dcf/without-proxy.png 930w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
만약 AOP를 활용하면, Spring 빈은 아래와 같이 실행된다.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/dbac84cda5778c5ee7212297a69191ff/5cfe2/with-proxy.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 37.64705882352941%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABYlAAAWJQFJUiTwAAABv0lEQVR42o2PS28SYRSGP7uwC5d272/QlbZL/ROuanFd46WNiUKURNEEL0tdmC5qNcGk2oBIBRpTa0Ex2FJENK3cBmoGZwoFwzA6zOPMGGdhovEkT86b853znvOJSO448eJJohvjPH7tYT7tYeHtBE8yHmKFCZ7lx623E6idKnYMBgNM0/wrYrXkJZyZZPXzZcLpaeLvfCTWfcTXLrKy6SVd9pMq+dn99uX/DO2mYvGT06gqLVpqn/aOjvrVyq0+Vptr9C9cw/LMQV4ED1GbPcL7mWPU50aR7o/SeDhGZXaM3N3D5O8d5Xuv5Rib5q/hP8M13L4meDo5xPI5Qfz8CK+mhcOKxcupPSyfFcROD5PPplB22tTrEqqq0mw2LV1HkiSq1ap7qahdtQZODVG6LsgFRqhYuWwtKQcEtRvDNG7vZevWfrRd2bnEMH64w4ZhuPwOEVvw82j+JqEHPkKhAKE5L9FIkETyDslLB0idESxN7eND7g2K2mK70UBRFIdOp4Msy45uWHX7alHIhvmYT7CRjVrfirKeiVBYW6SYX2IzGaSyeIGt51doqzJaX6fb7aJpmoOu6/R6PUfbdVv/BJbDHbX3dQ2bAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;with proxy&apos; title=&apos;&apos; src=&apos;/static/dbac84cda5778c5ee7212297a69191ff/ca1dc/with-proxy.png&apos; srcset=&apos;/static/dbac84cda5778c5ee7212297a69191ff/e7570/with-proxy.png 170w,
/static/dbac84cda5778c5ee7212297a69191ff/f46e7/with-proxy.png 340w,
/static/dbac84cda5778c5ee7212297a69191ff/ca1dc/with-proxy.png 680w,
/static/dbac84cda5778c5ee7212297a69191ff/5cfe2/with-proxy.png 1006w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
POJO를 구현한 AOP 프록시 객체가 클라이언트 요청을 받아 foo() 실행 전/후 advice를 실행하는 것이다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 프록시 생성 방식&lt;/strong&gt;&lt;br&gt;
Spring AOP는 &lt;code class=&quot;language-text&quot;&gt;AnnotationAwareAspectJAutoProxyCreator&lt;/code&gt;라는 &lt;strong&gt;BeanProcessor의&lt;/strong&gt; 구현체를 사용해 AOP 프록시를 생성한다.&lt;/p&gt;
&lt;p&gt;&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/f5827a367374763565460575f8971332/0f09d/post-processor.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 43.529411764705884%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAABJ0lEQVR42n2Sh46CUBBF+f//s7tRQKlBRGpAuOZMwi7rliET5rVb5j3HK65Km0xlV2noBz0eD4VhqCzLFMexbreb+r7XMAzquk7P59P+dV2raRqrybZtbY/zkbsKykh+flXXtIqTWOfzWUEQ6HK5GDgkAJRlqaqqlOe5kiQxQt/3rY6iyPY4eotpmkzFOI6WjP8KlBVF8W3OmfT1LUFRgiUSZajE+hyQMQc5+2fiT4UscJCEdbPZaL/f63Q6abfbWZ2mqRHQL9d1zep7ODMybFhg/G6Vmh4dDgcjIOkt5BD8Csji0tLSBvPH49FUkVwErwAwWjPv/xdwGTwHz/NMJWDcPjXWfwDOh1ikd1jn7dEvngXJYRSu12utVittt1ubv9/vRra0/AIjwba74kZrogAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;post processor&apos; title=&apos;&apos; src=&apos;/static/f5827a367374763565460575f8971332/ca1dc/post-processor.png&apos; srcset=&apos;/static/f5827a367374763565460575f8971332/e7570/post-processor.png 170w,
/static/f5827a367374763565460575f8971332/f46e7/post-processor.png 340w,
/static/f5827a367374763565460575f8971332/ca1dc/post-processor.png 680w,
/static/f5827a367374763565460575f8971332/02d09/post-processor.png 1020w,
/static/f5827a367374763565460575f8971332/9d567/post-processor.png 1360w,
/static/f5827a367374763565460575f8971332/0f09d/post-processor.png 1652w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
1️⃣ Spring 컨테이너가 Spring 빈을 생성&lt;br&gt;
2️⃣ &lt;code class=&quot;language-text&quot;&gt;BeanPostProcessor&lt;/code&gt; (&lt;code class=&quot;language-text&quot;&gt;AnnotationAwareAspectJAutoProxyCreator&lt;/code&gt;)가 빈을 감지&lt;br&gt;
3️⃣ AOP 적용 대상이면 프록시 객체를 생성하여 빈으로 등록&lt;br&gt;
4️⃣ 클라이언트가 Spring 빈을 호출하면 프록시가 먼저 실행됨&lt;br&gt;
5️⃣ 프록시가 AOP Advice(Before, After 등)를 실행한 후, 원래 메서드를 실행  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;테스트 코드&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@SpringBootTest&lt;/span&gt;  
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MyServiceTest&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
  
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Autowired&lt;/span&gt;  
    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MyService&lt;/span&gt; myService&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
  
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Test&lt;/span&gt;  
    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;testAopProxyType&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
        &lt;span class=&quot;token function&quot;&gt;assertThat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;myService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isEqualTo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;MyService&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;  
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;결과&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;필요:com.example.my.MyService
실제:com.example.my.MyService$$SpringCGLIB$$0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Spring AOP가 적용된 MyService의 빈 객체를 확인해보면, 프록시 객체가 감싸진 것을 확인할 수 있다.&lt;/p&gt;
&lt;h3 id=&quot;AspectJ-기반-방식&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#AspectJ-%EA%B8%B0%EB%B0%98-%EB%B0%A9%EC%8B%9D&quot; aria-label=&quot;AspectJ 기반 방식 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;AspectJ 기반 방식&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;Spring AOP보다 더 강력한 AOP 방식&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;컴파일 타임 또는 로드 타임에 바이트코드를 수정하여 AOP 적용&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Spring Bean이 아닌 일반 객체에도 AOP 적용 가능&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-예제&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%98%88%EC%A0%9C&quot; aria-label=&quot; 예제 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 예제&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;🔹 기본적인 Aspect 모듈&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Aspect&lt;/span&gt;
&lt;span class=&quot;token annotation punctuation&quot;&gt;@Component&lt;/span&gt;
&lt;span class=&quot;token annotation punctuation&quot;&gt;@Slf4j&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;LoggingAspect&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// Aspect&lt;/span&gt;
    
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@AfterReturning&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;execution(* com.example.my..*(..))&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// Pointcut&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;afterMethodExecution&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;JoinPoint&lt;/span&gt; joinPoint&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// Advice&lt;/span&gt;
        log&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;✅ service 실행 완료: &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;🔹 포인트컷 분리&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Aspect&lt;/span&gt;
&lt;span class=&quot;token annotation punctuation&quot;&gt;@Component&lt;/span&gt;
&lt;span class=&quot;token annotation punctuation&quot;&gt;@Slf4j&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;LoggingAspect&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// Aspect&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Pointcut&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;execution(* com.example.my..*(..))&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// Pointcut&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;myMethods&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@AfterReturning&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;myMethods()&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;afterMethodExecution&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;JoinPoint&lt;/span&gt; joinPoint&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// Advice&lt;/span&gt;
        log&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;✅ service 실행 완료: &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-참고&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%B0%B8%EA%B3%A0&quot; aria-label=&quot; 참고 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 참고&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.spring.io/spring-framework/reference/core/aop.html&quot;&gt;https://docs.spring.io/spring-framework/reference/core/aop.html&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Spring 예외 처리]]></title><description><![CDATA[📌 Spring 기본 예외 처리 방식 Spring Boot에서 별도의 핸들링 없이 예외가 발생하면, DispatchServlet이 엔드포인트로 요청을 위임하고, 가 실행되고, 상태 코드 50…]]></description><link>https://choiwonyu.github.io/Spring 예외 처리/</link><guid isPermaLink="false">https://choiwonyu.github.io/Spring 예외 처리/</guid><pubDate>Fri, 28 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;-Spring-기본-예외-처리-방식&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Spring-%EA%B8%B0%EB%B3%B8-%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%AC-%EB%B0%A9%EC%8B%9D&quot; aria-label=&quot; Spring 기본 예외 처리 방식 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Spring 기본 예외 처리 방식&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Spring Boot에서 별도의 핸들링 없이 예외가 발생하면, DispatchServlet이 &lt;code class=&quot;language-text&quot;&gt;/error&lt;/code&gt;엔드포인트로 요청을 위임하고, &lt;code class=&quot;language-text&quot;&gt;BasicErrorController&lt;/code&gt;가 실행되고, 상태 코드 500 에러가 발생한다.&lt;/p&gt;
&lt;p&gt;이때, &lt;code class=&quot;language-text&quot;&gt;BasicErrorController&lt;/code&gt;는 &lt;code class=&quot;language-text&quot;&gt;ErrorAttributes&lt;/code&gt;를 이용해 예외 정보를 가져와 JSON 또는 HTML로 응답한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BasicErrorController.java&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Controller&lt;/span&gt;  
&lt;span class=&quot;token annotation punctuation&quot;&gt;@RequestMapping&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;${server.error.path:${error.path:/error}}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;BasicErrorController&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;AbstractErrorController&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

	&lt;span class=&quot;token annotation punctuation&quot;&gt;@RequestMapping&lt;/span&gt;  
	&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ResponseEntity&lt;/span&gt;&lt;span class=&quot;token generics&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;HttpServletRequest&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
	    &lt;span class=&quot;token class-name&quot;&gt;HttpStatus&lt;/span&gt; status &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getStatus&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;request&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
		    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;status &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;HttpStatus&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;NO_CONTENT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
		       &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ResponseEntity&lt;/span&gt;&lt;span class=&quot;token generics&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;status&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
		    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;  
	    &lt;span class=&quot;token class-name&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;token generics&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt; body &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getErrorAttributes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getErrorAttributeOptions&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MediaType&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;ALL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
	    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ResponseEntity&lt;/span&gt;&lt;span class=&quot;token generics&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;body&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; status&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Response&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;timestamp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2025-02-27T05:28:50.861+00:00&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;500&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;error&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Internal Server Error&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;단점&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%8B%A8%EC%A0%90&quot; aria-label=&quot;단점 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;단점&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;사용자 친화적인 메시지를 제공할 수 없음&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;클라이언트가 에러에 대한 핸들링을 하기 힘듦&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;특정 예외 별 다른 응답을 제공하기 힘듦&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;위 단점을 해결하기 위해 Spring은 에러를 유연하게 처리할 수 있는 방법을 제공한다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-ExceptionHandler&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-ExceptionHandler&quot; aria-label=&quot; ExceptionHandler permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;📌 &lt;strong&gt;@ExceptionHandler&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;✅ Exception 클래스 별 처리할 응답을 지정할 수 있다.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ 에러 응답의 payload를 자유롭게 다룰 수 있다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MyController.java&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@RestController&lt;/span&gt;
&lt;span class=&quot;token annotation punctuation&quot;&gt;@RequestMapping&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MyController&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@GetMapping&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;throwError&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CustomException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token annotation punctuation&quot;&gt;@ExceptionHandler&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;CustomException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  
	&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ResponseEntity&lt;/span&gt;&lt;span class=&quot;token generics&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;handleCustomException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CustomException&lt;/span&gt; exception&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ResponseEntity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;HttpStatus&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;BAD_REQUEST&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;bad request&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Response&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;string&quot;&gt;&lt;pre class=&quot;language-string&quot;&gt;&lt;code class=&quot;language-string&quot;&gt;bad request&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;동작-과정&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%8F%99%EC%9E%91-%EA%B3%BC%EC%A0%95&quot; aria-label=&quot;동작 과정 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;동작 과정&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;1️⃣ 컨트롤러 실행 중 예외 발생 (&lt;code class=&quot;language-text&quot;&gt;throw new CustomException();&lt;/code&gt;)&lt;br&gt;
2️⃣ DispatcherServlet이 예외를 감지하고 &lt;code class=&quot;language-text&quot;&gt;@ExceptionHandler&lt;/code&gt; 탐색&lt;br&gt;
3️⃣ &lt;code class=&quot;language-text&quot;&gt;@ExceptionHandler(CustomException.class)&lt;/code&gt; 메서드가 실행됨&lt;br&gt;
4️⃣ 예외가 &lt;code class=&quot;language-text&quot;&gt;ResponseEntity&amp;lt;String&gt;&lt;/code&gt;로 변환되어 클라이언트에게 응답됨  &lt;/p&gt;
&lt;h3 id=&quot;장점&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9E%A5%EC%A0%90&quot; aria-label=&quot;장점 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;장점&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;사용자 친화적인 메시지를 전달할 수 있다.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;에러 코드나 payload를 통해 클라이언트가 에러 별 핸들링을 할 수 있다.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;예외 별로 다른 응답을 제공할 수 있다.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-Spring-Filter-예외-처리&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Spring-Filter-%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%AC&quot; aria-label=&quot; Spring Filter 예외 처리 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Spring Filter 예외 처리&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;문제점&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%AC%B8%EC%A0%9C%EC%A0%90&quot; aria-label=&quot;문제점 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;문제점&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Spring Filter는 서블릿 컨테이너 영역에서 관리되지 않기 때문에&lt;/strong&gt;
Filter에서 발생한 에러는 ExceptionHandler가 감지할 수 없다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CustomFilter.java&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Component&lt;/span&gt;  
&lt;span class=&quot;token annotation punctuation&quot;&gt;@Slf4j&lt;/span&gt;  
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CustomFilter&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Filter&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
  
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;  
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;doFilter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ServletRequest&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ServletResponse&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;  
        &lt;span class=&quot;token keyword&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;FilterChain&lt;/span&gt; chain&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  
        &lt;span class=&quot;token keyword&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;IOException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ServletException&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
        &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CustomException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;  
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Response&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;timestamp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2025-02-27T05:49:57.566+00:00&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;500&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;error&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Internal Server Error&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Filter에서 발생한 CustomException이 위에서 봤던 BasiErrorController로 전달된 것이다.&lt;/p&gt;
&lt;h3 id=&quot;해결-방법&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95&quot; aria-label=&quot;해결 방법 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;해결 방법&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;따라서 FIlter의 예외의 경우, 다음과 같이 따로 처리해줘야 한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CustomFilter.java&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Component&lt;/span&gt;  
&lt;span class=&quot;token annotation punctuation&quot;&gt;@Slf4j&lt;/span&gt;  
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CustomFilter&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Filter&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
  
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;  
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;doFilter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ServletRequest&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ServletResponse&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;  
        &lt;span class=&quot;token keyword&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;FilterChain&lt;/span&gt; chain&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  
        &lt;span class=&quot;token keyword&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;IOException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ServletException&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
        &lt;span class=&quot;token class-name&quot;&gt;HttpServletResponse&lt;/span&gt; httpResponse &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;HttpServletResponse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
        httpResponse&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;sendError&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;HttpServletResponse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;SC_BAD_REQUEST&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bad request&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;  
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Response&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;timestamp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2025-02-27T05:57:10.784+00:00&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;400&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;error&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Bad Request&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;동작-과정-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%8F%99%EC%9E%91-%EA%B3%BC%EC%A0%95-1&quot; aria-label=&quot;동작 과정 1 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;동작 과정&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;1️⃣ Filter 내부에서 &lt;code class=&quot;language-text&quot;&gt;httpResponse.sendError(HttpServletResponse.SC_BAD_REQUEST, &quot;bad request&quot;)&lt;/code&gt; 호출&lt;br&gt;
2️⃣ 서블릿 컨테이너가 400 상태 코드와 메시지를 포함한 요청을 다시 &lt;code class=&quot;language-text&quot;&gt;/error&lt;/code&gt; 엔드포인트로 전달&lt;br&gt;
3️⃣ Spring Boot의 &lt;code class=&quot;language-text&quot;&gt;BasicErrorController&lt;/code&gt;가 &lt;code class=&quot;language-text&quot;&gt;/error&lt;/code&gt; 요청을 받아 JSON 응답 생성&lt;br&gt;
4️⃣ 클라이언트가 JSON 응답을 받음&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-참고&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%B0%B8%EA%B3%A0&quot; aria-label=&quot; 참고 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 참고&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc&quot;&gt;https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://mangkyu.tistory.com/173&quot;&gt;https://mangkyu.tistory.com/173&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Filter & Interceptor]]></title><description><![CDATA[✅ Filter와 Interceptor는 Spring에서 요청을 가로채 처리할 수 있는 두 가지 주요 컴포넌트 ✅ 두 컴포넌트 모두 요청(Request)과 응답(Response…]]></description><link>https://choiwonyu.github.io/Spring Filter &amp; Interceptor/</link><guid isPermaLink="false">https://choiwonyu.github.io/Spring Filter &amp; Interceptor/</guid><pubDate>Thu, 27 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;✅ &lt;strong&gt;Filter와 Interceptor는 Spring에서 요청을 가로채 처리할 수 있는 두 가지 주요 컴포넌트&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;두 컴포넌트 모두 요청(Request)과 응답(Response)에 대해 사전/사후 처리를 수행할 수 있지만, 동작 시점과 적용되는 범위가 다름&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;-Spring-Filter&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Spring-Filter&quot; aria-label=&quot; Spring Filter permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Spring Filter&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;✅ WAS 레벨에서 동작&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ DispatcherServlet 요청 전 실행&lt;/strong&gt;
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/d240c475d141aec2250e2f00c53216a8/b79fc/filter.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 51.17647058823529%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABQ0lEQVR42l2Sya6DMAxF+f9vY8cGFhWIocxTKWOhro6fXD01khXHvrm+juOc5ynbtsm+73Icx9eIkcuyTIIg0LzhbP9vxK7rEqdpGum6TqZpEvyqqqRtWz0/n095PB4yjqP6Zuu6yrIsMs+zGueyLGUYhj9ClEBAgL0oCq2GkXu/3989jmO53W5aiPzr9dIcKinscJlg3/faKgsfEADyaZpq62EYSpIkmqc4pJidlRAglwmSpAV81NR1rYQWp937/a6530XLdOsAQCHviE9LELI4o87zPHFdV3zflzzPtVVIzTjz9ghwYIYQdt6BhXwjBIg62mEQFIbgdzFIJcQBwM5F86mMUggAmnHmre2b2UC4A14JGTuqUGsXUc2bkUcpA4miSIfDYNhpH6x9PR0KZDDbv2O3LwQAYyjE7E+aGcbwKP0AxIr96zgYI38AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;filter&apos; title=&apos;&apos; src=&apos;/static/d240c475d141aec2250e2f00c53216a8/ca1dc/filter.png&apos; srcset=&apos;/static/d240c475d141aec2250e2f00c53216a8/e7570/filter.png 170w,
/static/d240c475d141aec2250e2f00c53216a8/f46e7/filter.png 340w,
/static/d240c475d141aec2250e2f00c53216a8/ca1dc/filter.png 680w,
/static/d240c475d141aec2250e2f00c53216a8/02d09/filter.png 1020w,
/static/d240c475d141aec2250e2f00c53216a8/9d567/filter.png 1360w,
/static/d240c475d141aec2250e2f00c53216a8/b79fc/filter.png 1538w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;주요-메서드&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A3%BC%EC%9A%94-%EB%A9%94%EC%84%9C%EB%93%9C&quot; aria-label=&quot;주요 메서드 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;주요 메서드&lt;/strong&gt;&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Filter&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;FilterConfig&lt;/span&gt; filterConfig&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ServletException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;doFilter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;ServletRequest&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ServletResponse&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;FilterChain&lt;/span&gt; chain&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;IOException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ServletException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;destroy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;🔹 doFilter()&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;모든 요청을 가로채어 특정 처리를 수행&lt;/li&gt;
&lt;li&gt;chain.doFilter(request, response)를 호출하지 않으면 요청이 DispatcherServlet으로 전달되지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🔹 init()&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;필터가 처음 생성될 때 한 번만 실행되는 초기화 메서드&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🔹 destroy()&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;필터가 제거될 때 한 번 실행되는 정리 작업 메서드&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;Filter--Bean&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Filter--Bean&quot; aria-label=&quot;Filter  Bean permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Filter &amp;#x26; Bean&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;✅ Filter는 WAS에 의해 관리되는 서블릿 컴포넌트였기 때문에 Bean으로 등록할 수 없었음&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ Filter에서도 Spring 기술을 필요로 하는 상황이 많아지면서 Bean으로 등록 가능해짐&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 DelegatingFilterProxy&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ Spring Application Context의 Filter 클래스를 Servlet Filter에 등록할 수 있도록 해주는 객체&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CustomFilter.java&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Component&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;loggingFilter&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CustomFilter&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Filter&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Logger&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;LOGGER&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;LoggerFactory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getLogger&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;CustomFilter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;FilterConfig&lt;/span&gt; config&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ServletException&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// initialize something&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;doFilter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;token class-name&quot;&gt;ServletRequest&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ServletResponse&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
      &lt;span class=&quot;token class-name&quot;&gt;FilterChain&lt;/span&gt; chain&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;IOException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ServletException&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
 
        &lt;span class=&quot;token class-name&quot;&gt;HttpServletRequest&lt;/span&gt; req &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;HttpServletRequest&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token constant&quot;&gt;LOGGER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Request Info : &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        chain&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doFilter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;destroy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// cleanup code, if necessary&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;ApplicationInitializer.java&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ApplicationInitializer&lt;/span&gt; 
  &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;AbstractAnnotationConfigDispatcherServletInitializer&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// some other methods here&lt;/span&gt;
 
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getServletFilters&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token class-name&quot;&gt;DelegatingFilterProxy&lt;/span&gt; delegateFilterProxy &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;DelegatingFilterProxy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        delegateFilterProxy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setTargetBeanName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;loggingFilter&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;delegateFilterProxy&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;🔹 Spring Boot 등장&lt;/strong&gt;&lt;br&gt;
Spring Boot 등장 이후, &lt;strong&gt;Spring Boot가 내장 웹서버를 지원하면서 ServletContext를 직접 제어할 수 있기 때문에 위와 같은 과정 없이도 Filter 빈을 Filter Chain에 등록할 수 있게 되었다.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;-Spring-Interceptor&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Spring-Interceptor&quot; aria-label=&quot; Spring Interceptor permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Spring Interceptor&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;✅ Spring MVC에서 DispatcherServlet 이후, 컨트롤러로 요청이 가기 전후에 실행되는 컴포넌트&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ Handler(Controller)를 실행하기 전/후에 특정 로직을 수행할 수 있도록 도움&lt;/strong&gt;
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/8633bda7d6dd70f1f6d202fb0abe44c8/54ba6/interceptor.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 38.82352941176471%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA/0lEQVR42k2R2YqFQAxE/f8PFMQXwet+3VdcyMypIYNC0elUulKJwXVd9jyPcN+3cT/PU+A+TZOlaarY4Ty1b8AF67paXdd61LatzfNsy7IIcNzHcbRt28QPw6B433eBGLhOYL8fLvh4TGdOcn3fC4hQHIahRVEk4aqqlIOjHndN01jAqBQg5M4giqKwsiz1sOs61eAIAWIaIUSMO0CtHBIAkgh+v19LksTiOFY+z/P/lWRZJmc05YTzqeAkyI74fGc+BnkacILjOMThjpWwO2LyxJ/P508QRxQAujEiDoBz7zuivkNquSOqn0Ix3f0HAB4BH8sfvwHPChB0x0zzA6xmYs+y5nPPAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;interceptor&apos; title=&apos;&apos; src=&apos;/static/8633bda7d6dd70f1f6d202fb0abe44c8/ca1dc/interceptor.png&apos; srcset=&apos;/static/8633bda7d6dd70f1f6d202fb0abe44c8/e7570/interceptor.png 170w,
/static/8633bda7d6dd70f1f6d202fb0abe44c8/f46e7/interceptor.png 340w,
/static/8633bda7d6dd70f1f6d202fb0abe44c8/ca1dc/interceptor.png 680w,
/static/8633bda7d6dd70f1f6d202fb0abe44c8/02d09/interceptor.png 1020w,
/static/8633bda7d6dd70f1f6d202fb0abe44c8/9d567/interceptor.png 1360w,
/static/8633bda7d6dd70f1f6d202fb0abe44c8/54ba6/interceptor.png 1634w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;필요한-상황&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%95%84%EC%9A%94%ED%95%9C-%EC%83%81%ED%99%A9&quot; aria-label=&quot;필요한 상황 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;필요한 상황&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;API 요청 감사 또는 로깅&lt;/li&gt;
&lt;li&gt;인증/인가 체크&lt;/li&gt;
&lt;li&gt;요청 데이터 가공
&lt;strong&gt;컨트롤러 실행 전후에 필요한 공통 로직&lt;/strong&gt;을 구현할 때 유용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;주요-메서드-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A3%BC%EC%9A%94-%EB%A9%94%EC%84%9C%EB%93%9C-1&quot; aria-label=&quot;주요 메서드 1 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;주요 메서드&lt;/strong&gt;&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;HandlerInterceptor&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;boolean&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;preHandle&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;HttpServletRequest&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;HttpServletResponse&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt; handler&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;postHandle&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;HttpServletRequest&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;HttpServletResponse&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt; handler&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ModelAndView&lt;/span&gt; modelAndView&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;afterCompletion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;HttpServletRequest&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;HttpServletResponse&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt; handler&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Exception&lt;/span&gt; ex&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;🔹 preHandle()&lt;/strong&gt;&lt;br&gt;
요청을 가로채 컨트롤러 실행 전에 수행&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 postHandle()&lt;/strong&gt;&lt;br&gt;
컨트롤러 실행 후, View 렌더링 전에 작업 수행&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 afterCompletion()&lt;/strong&gt;&lt;br&gt;
요청 처리가 완료된 후 실행(예외가 발생하더라도 실행)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-참고&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%B0%B8%EA%B3%A0&quot; aria-label=&quot; 참고 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 참고&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.baeldung.com/spring-delegating-filter-proxy&quot;&gt;https://www.baeldung.com/spring-delegating-filter-proxy&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://mangkyu.tistory.com/221&quot;&gt;https://mangkyu.tistory.com/221&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://www.baeldung.com/spring-mvc-handlerinterceptor&quot;&gt;https://www.baeldung.com/spring-mvc-handlerinterceptor&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://mangkyu.tistory.com/173&quot;&gt;https://mangkyu.tistory.com/173&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[DNS]]></title><description><![CDATA[📌 개요 DNS 필요성 ✅ DNS는 사람이 이해하기 쉬운 도메인(www.google.com)을 IP 주소로 변환하는 역할 ✅ DNS가 없을 땐, IP 주소와 도메인 이름을 매핑한 파일을 관리   🔹 주소 변환 명령 DNS…]]></description><link>https://choiwonyu.github.io/DNS/</link><guid isPermaLink="false">https://choiwonyu.github.io/DNS/</guid><pubDate>Wed, 26 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;-개요&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EA%B0%9C%EC%9A%94&quot; aria-label=&quot; 개요 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 개요&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;DNS-필요성&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#DNS-%ED%95%84%EC%9A%94%EC%84%B1&quot; aria-label=&quot;DNS 필요성 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;DNS 필요성&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;DNS는 사람이 이해하기 쉬운 도메인(www.google.com)을 IP 주소로 변환하는 역할&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;DNS가 없을 땐, IP 주소와 도메인 이름을 매핑한 파일을 관리&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;🔹 &lt;strong&gt;주소 변환 명령&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;nslookup&lt;/span&gt; google.com&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;Server:		&lt;span class=&quot;token number&quot;&gt;182.172&lt;/span&gt;.255.180
Address:	&lt;span class=&quot;token number&quot;&gt;182.172&lt;/span&gt;.255.180&lt;span class=&quot;token comment&quot;&gt;#53&lt;/span&gt;

Non-authoritative answer:
Name:	google.com
Address: &lt;span class=&quot;token number&quot;&gt;142.251&lt;/span&gt;.42.142&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;DNS를 이용하면 위처럼 도메인 이름으로 IP 주소를 얻을 수 있다.&lt;/p&gt;
&lt;h3 id=&quot;DNS의-구성-요소&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#DNS%EC%9D%98-%EA%B5%AC%EC%84%B1-%EC%9A%94%EC%86%8C&quot; aria-label=&quot;DNS의 구성 요소 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;DNS의 구성 요소&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;🔹 네임 스페이스&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;트리 구조의 네임 스페이스를 비롯해 데이터에 대한 이름 관련 규칙 정의&lt;/li&gt;
&lt;li&gt;네임 스페이스의 트리에 연결된 호스트는 &lt;strong&gt;자원 레코드라는 정보 집합체로 표현&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🔹 네임 서버&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;네임 스페이스의 트리 구조와 트리에 보관된 정보 집합체를 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🔹 해석기(Resolver)&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;네임 서버로부터 클라이언트의 요청 정보를 얻어 내는 프로그램&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-네임-스페이스&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EB%84%A4%EC%9E%84-%EC%8A%A4%ED%8E%98%EC%9D%B4%EC%8A%A4&quot; aria-label=&quot; 네임 스페이스 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 네임 스페이스&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;네임-스페이스의-구조&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%84%A4%EC%9E%84-%EC%8A%A4%ED%8E%98%EC%9D%B4%EC%8A%A4%EC%9D%98-%EA%B5%AC%EC%A1%B0&quot; aria-label=&quot;네임 스페이스의 구조 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;네임 스페이스의 구조&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;DNS 네임 스페이스는 계층적인 트리 구조&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;상위 도메인에서 하위 도메인으로 내려가는 계층적 구조를 가지고 있어 효율적으로 관리&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;. &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;루트 도메인&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
├── com
│   ├── google.com
│   │   ├── www.google.com
│   │   ├── mail.google.com
├── org
│   ├── wikipedia.org
│   ├── openai.org&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;🔹 TLD(Top Level Domain)&lt;/strong&gt;&lt;br&gt;
최상위 도메인을 뜻하며, 위에선 com, org가 TLD&lt;/p&gt;
&lt;h3 id=&quot;데이터베이스-서비스&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%84%9C%EB%B9%84%EC%8A%A4&quot; aria-label=&quot;데이터베이스 서비스 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;데이터베이스 서비스&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;DNS 서버는 분산된 데이터베이스 시스템으로, 특정 도메인 정보를 저장하고 관리&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;계층 구조로 관리함으로써, 하위 도메인 관리 권한 위임을 하부 구조 전체에 대해 재귀적으로 적용&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 존(Zone)&lt;/strong&gt;&lt;br&gt;
임의의 네임 서버가 관리하는 영역&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 도메인과 존&lt;/strong&gt;&lt;br&gt;
특정 네임 서버 하부에 새로운 도메인 네임 서버가 추가되면, 도메인과 존 영역이 달라진다.&lt;/p&gt;
&lt;h3 id=&quot;자원-레코드&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9E%90%EC%9B%90-%EB%A0%88%EC%BD%94%EB%93%9C&quot; aria-label=&quot;자원 레코드 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;자원 레코드&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;DNS는 다양한 정보(도메인 이름, IP 주소 등)를 자원 레코드(Resource Record) 형태로 저장&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 자원 레코드 필드&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt;: 찾고자 하는 가변 길이의 도메인 이름&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type&lt;/strong&gt;: 레코드의 종류&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Class&lt;/strong&gt;: 프로토코 패밀리, 인터넷에서는 IN 값 사용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TTL(Time To Live)&lt;/strong&gt;: 자원 레코드의 유효시간을 표시, 캐시의 만료 시간을 정한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RD Length&lt;/strong&gt;: 자원 데이터의 길이&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RD(Resource Data)&lt;/strong&gt;: 자원 데이터, 자원 레코드의 유형 값에 따라 내용의 구성과 크기가 달라진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🔹 자원 레코드 종류&lt;/strong&gt;  &lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;레코드 타입&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;설명&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;도메인 → IPv4 주소 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AAAA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;도메인 → IPv6 주소 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CNAME&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;도메인 → 별칭(alias) 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MX&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;메일 서버 정보&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;특정 도메인의 네임 서버 정보&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-네임-서버와-해석기&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EB%84%A4%EC%9E%84-%EC%84%9C%EB%B2%84%EC%99%80-%ED%95%B4%EC%84%9D%EA%B8%B0&quot; aria-label=&quot; 네임 서버와 해석기 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 네임 서버와 해석기&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;해석기-Resolver&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%95%B4%EC%84%9D%EA%B8%B0-Resolver&quot; aria-label=&quot;해석기 Resolver permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;해석기 (Resolver)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;해석기는 사용자가 입력한 도메인 이름을 IP 주소로 변환하는 과정의 시작점&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 인증 데이터와 캐시 데이터&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;인증 데이터&lt;/strong&gt;: 해당 데이터를 직접 관리하는 네임 서버로부터 받은 정보&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;캐시 데이터&lt;/strong&gt;: 이전 요청에 의해 호스트가 보관하던 데이터&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;요청의-처리&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9A%94%EC%B2%AD%EC%9D%98-%EC%B2%98%EB%A6%AC&quot; aria-label=&quot;요청의 처리 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;요청의 처리&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;DNS 질의는 두 가지 방식으로 수행&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 재귀적 질의&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;클라이언트가 로컬 네임 서버에 질의하면, 로컬 네임 서버가 &lt;strong&gt;스스로 최종 응답을 찾아서 반환&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;클라이언트는 중간 과정을 알 필요 없이 최종 결과만 받음&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;Resolver &amp;lt;-&gt; Local Name Server &amp;lt;-&gt; Name Server1 
                           &amp;lt;-&gt; Name Server2 
                           &amp;lt;-&gt; Target Name Server &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;최종 응답 반환&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🔹 반복적 질의&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;클라이언트가 직접 여러 개의 네임 서버에 질의&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;네임 서버는 &lt;strong&gt;최종 IP 주소를 주는 것이 아니라, 다음 질의할 네임 서버를 안내&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;Resolver &amp;lt;-&gt; Local Name Server 
     &amp;lt;-&gt; Name Server1 
     &amp;lt;-&gt; Name Server2 
     &amp;lt;-&gt; Target Name Server &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;최종 응답 반환&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-DNS-프로토콜&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-DNS-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C&quot; aria-label=&quot; DNS 프로토콜 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 DNS 프로토콜&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;DNS-메시지&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#DNS-%EB%A9%94%EC%8B%9C%EC%A7%80&quot; aria-label=&quot;DNS 메시지 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;DNS 메시지&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;UDP 53번 포트를 사용하며, 메시지는 요청(Request)과 응답(Response)으로 구성&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 DNS 메시지 구조&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;less&quot;&gt;&lt;pre class=&quot;language-less&quot;&gt;&lt;code class=&quot;language-less&quot;&gt;| Header | Question | Answer | Authority | Additional |&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Header:&lt;/strong&gt; 요청 ID, 플래그, 질의 수 등 포함&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Question:&lt;/strong&gt; 클라이언트가 요청한 도메인 정보&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Answer:&lt;/strong&gt; 질의에 대한 응답 (IP 주소 등)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Authority:&lt;/strong&gt; 권한 있는 네임 서버 정보&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Additional:&lt;/strong&gt; 추가 정보 (예: CNAME 레코드)&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[IoC Container]]></title><description><![CDATA[IoC Container는 객체의 생성, 관리 및 DI(Dependency Injection)을 담당하는 핵심 요소이다. 📌 IoC(Inversion of Control…]]></description><link>https://choiwonyu.github.io/IoC Container/</link><guid isPermaLink="false">https://choiwonyu.github.io/IoC Container/</guid><pubDate>Wed, 26 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;IoC Container는 객체의 생성, 관리 및 DI(Dependency Injection)을 담당하는 핵심 요소이다.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;-IoCInversion-of-Control&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-IoCInversion-of-Control&quot; aria-label=&quot; IoCInversion of Control permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 IoC(Inversion of Control)&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅ &lt;strong&gt;객체의 생성 및 제어 흐름을 개발자가 직접 관리하지 않고, 외부에서(컨테이너가) 관리하는 디자인 패턴&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;Bean&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Bean&quot; aria-label=&quot;Bean permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Bean&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;Spring에서 IoC Container에 의해 관리되는 객체&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;핵심-개념&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%95%B5%EC%8B%AC-%EA%B0%9C%EB%85%90&quot; aria-label=&quot;핵심 개념 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;핵심 개념&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;✅ IoC Container는 DI를 통해 객체 간 의존 관계를 느슨하게 만든다.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;🔹 전통적인 방식&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Car&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Engine&lt;/span&gt; engine&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Car&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;engine &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Engine&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Car 객체에 필요한 Engine() 객체를 직접 생성해 &lt;strong&gt;Car 객체가 Engine 객체에 강결합&lt;/strong&gt;되어있다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 IoC 방식&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Component&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Engine&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Engine Started!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token annotation punctuation&quot;&gt;@Component&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Car&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Engine&lt;/span&gt; engine&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Autowired&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Car&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Engine&lt;/span&gt; engine&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; 
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;engine &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; engine&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;IoC Container가 Car 객체에 Engine 객체를 &lt;strong&gt;주입(DI)해 결합을 느슨하게 만든다.&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 장점&lt;/strong&gt;  &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;결합도 감소&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;객체 관리 자동화&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;유지보수성 증가&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;Bean-등록-방법&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Bean-%EB%93%B1%EB%A1%9D-%EB%B0%A9%EB%B2%95&quot; aria-label=&quot;Bean 등록 방법 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Bean 등록 방법&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Spring IoC 컨테이너에서 Bean을 등록하는 방법은 크게 &lt;strong&gt;세 가지&lt;/strong&gt;가 있다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;방법&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;사용 예시&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;XML 기반 설정&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;beans.xml&lt;/code&gt; 파일을 사용하여 Bean을 정의&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;lt;bean id=&quot;myBean&quot; class=&quot;com.example.MyBean&quot;/&gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Spring의 초창기 방식으로 최근 거의 사용되지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Java 기반 설정&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;@Configuration&lt;/code&gt; + &lt;code class=&quot;language-text&quot;&gt;@Bean&lt;/code&gt; 사용&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;@Bean public MyBean myBean() { return new MyBean(); }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Java 코드만으로 설정 가능해 가독성이 좋아 일부 경우 사용됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Annotation 기반 설정 (자동 스캔)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;@Component&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;@Service&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;@Repository&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;@Controller&lt;/code&gt; 사용&lt;/td&gt;
&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;@Component public class MyBean {}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;가장 많이 사용됨&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;DI-방식&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#DI-%EB%B0%A9%EC%8B%9D&quot; aria-label=&quot;DI 방식 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;DI 방식&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;🔹 생성자 주입&lt;/strong&gt;  &lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Component&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Car&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Engine&lt;/span&gt; engine&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Autowired&lt;/span&gt; 
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Car&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Engine&lt;/span&gt; engine&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;engine &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; engine&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;불변성 보장: final 필드를 사용해 값이 변경되지 않도록 함&lt;/li&gt;
&lt;li&gt;의존성 누락 방지: Bean 생성 시 주입이 강제됨&lt;/li&gt;
&lt;li&gt;순환 의존성 감지 가능: 애플리케이션 실행 시 순환 의존성을 바로 감지해 예외 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🔹 필드 주입&lt;/strong&gt;  &lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Component&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Car&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Autowired&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Engine&lt;/span&gt; engine&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;코드가 간결&lt;/li&gt;
&lt;li&gt;테스트 시 쉽게 Mocking 가능(&lt;code class=&quot;language-text&quot;&gt;@MockBean&lt;/code&gt; 사용 가능)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;단점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;불변성 보장X&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DI가 강제되지 않음&lt;/strong&gt;: 객체가 생성된 후에도 null일 가능성이 있음&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;순환 의존성 감지 어려움&lt;/strong&gt;: 실행 중 예외가 발생할 수 있음
필드 주입은 권장되지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🔹 세터 주입&lt;/strong&gt;  &lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Component&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Car&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Engine&lt;/span&gt; engine&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Autowired&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;setEngine&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Engine&lt;/span&gt; engine&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;engine &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; engine&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;선택적 의존성 주입 가능&lt;/strong&gt;: 필요할 때만 의존성을 변경할 수 있음&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spring 컨텍스트 없이도 객체 생성 가능&lt;/strong&gt;: 테스트에 용이&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;단점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;필드가 null일 수 있음&lt;/strong&gt;: 주입하지 않으면 런타임 오류 발생 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;객체의 일관성을 유지하기 어려움&lt;/strong&gt;: 생성 후에도 값이 변경될 가능성이 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;⭐️ Spring Boot 공식 문서에도 생성자 주입을 권장&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-Container의-종류&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Container%EC%9D%98-%EC%A2%85%EB%A5%98&quot; aria-label=&quot; Container의 종류 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Container의 종류&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;BeanFactory&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#BeanFactory&quot; aria-label=&quot;BeanFactory permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;BeanFactory&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;✅  가장 기본적인 IoC 컨테이너 인터페이스&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 Bean 생성 시점&lt;/strong&gt;&lt;br&gt;
getBean() 호출 시 생성&lt;/p&gt;
&lt;h3 id=&quot;ApplicationContext&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ApplicationContext&quot; aria-label=&quot;ApplicationContext permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;ApplicationContext&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;✅ BeanFactory를 확장한 형태로, 보다 다양한 기능 제공&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 Bean 생성 시점&lt;/strong&gt;&lt;br&gt;
컨테이너 초기화 시점에서 미리 생성&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 장점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AOP 지원 (Transaction, Security와 쉽게 결합 가능)&lt;/li&gt;
&lt;li&gt;Event 시스템과 통합&lt;/li&gt;
&lt;li&gt;국제화(i18n) 지원을 통한 다국어 메시지 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Spring Boot에서는 &lt;strong&gt;자동으로 ApplicationContext를 IoC 컨테이너로 사용&lt;/strong&gt;한다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-동작-과정&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EB%8F%99%EC%9E%91-%EA%B3%BC%EC%A0%95&quot; aria-label=&quot; 동작 과정 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 동작 과정&lt;/strong&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;설정 파일(XML, Java Config, Annotation) 읽기&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bean 등록 (Bean Definition 생성)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bean 객체 생성 및 초기화 (&lt;code class=&quot;language-text&quot;&gt;@PostConstruct&lt;/code&gt;, InitializingBean 등)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;의존성 주입 (DI 적용)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;애플리케이션 실행 후 Bean 사용&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;애플리케이션 종료 시 Bean 소멸 (&lt;code class=&quot;language-text&quot;&gt;@PreDestroy&lt;/code&gt;, DisposableBean 등)&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-참고&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%B0%B8%EA%B3%A0&quot; aria-label=&quot; 참고 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 참고&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.spring.io/spring-framework/reference/core/beans.html&quot;&gt;https://docs.spring.io/spring-framework/reference/core/beans.html&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Structured Logging]]></title><description><![CDATA[📌 Spring Logging 개요 ✅ Log는 애플리케이션의 동작을 추적하고 문제를 진단하는 중요한 기능 ✅ Spring은 다양한 로깅 프레임워크를 지원하며, 기본적으로 SLF4J를 권장 📌 SLF4J(Simple Logging Facade…]]></description><link>https://choiwonyu.github.io/Structured Logging/</link><guid isPermaLink="false">https://choiwonyu.github.io/Structured Logging/</guid><pubDate>Tue, 25 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;-Spring-Logging-개요&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Spring-Logging-%EA%B0%9C%EC%9A%94&quot; aria-label=&quot; Spring Logging 개요 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Spring Logging 개요&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅ Log는 애플리케이션의 동작을 추적하고 문제를 진단하는 중요한 기능&lt;br&gt;
✅ Spring은 다양한 로깅 프레임워크를 지원하며, 기본적으로 SLF4J를 권장&lt;/p&gt;
&lt;h2 id=&quot;-SLF4JSimple-Logging-Facade-For-Java&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-SLF4JSimple-Logging-Facade-For-Java&quot; aria-label=&quot; SLF4JSimple Logging Facade For Java permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 SLF4J(Simple Logging Facade For Java)&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅ SLF4J는 다양한 구현체(Logback, Log4j 등)과 연동 가능한 추상화 계층 제공&lt;/p&gt;
&lt;h3 id=&quot;주요-특징&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A3%BC%EC%9A%94-%ED%8A%B9%EC%A7%95&quot; aria-label=&quot;주요 특징 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;주요 특징&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;🔹 &lt;strong&gt;로깅 구현체에 대한 의존성 제거&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;인터페이스를 제공해 실제 로그 처리 구현을 위임&lt;/li&gt;
&lt;li&gt;런타임에 원하는 로깅 프레임워크로 변경 가능  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🔹 &lt;strong&gt;유연한 로깅 프레임워크 변경 가능&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;설정만 변경하면 SLF4J API만 사용해 구현체 변경 가능  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🔹 &lt;strong&gt;바인딩 개념을 사용해 로깅 프레임워크 연결&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;로깅 구현체의 바인딩을 추가해 로그 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;구조&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B5%AC%EC%A1%B0&quot; aria-label=&quot;구조 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;구조&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;🔹 &lt;strong&gt;SLF4J API&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;로깅을 위한 공통 인터페이스&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🔹 &lt;strong&gt;SLF4J 바인딩&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SLF4J와 실제 로깅 구현체를 연결하는 역할&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🔹 &lt;strong&gt;로깅 구현체&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;실제 로그를 출력하는 엔진&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;주요-인터페이스&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A3%BC%EC%9A%94-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4&quot; aria-label=&quot;주요 인터페이스 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;주요 인터페이스&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Logger.java&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;token namespace&quot;&gt;org&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;slf4j&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Logger&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;boolean&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isTraceEnabled&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;trace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; msg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;trace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; format&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt; arg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;trace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; format&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt; arg1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt; arg2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;trace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; format&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; arguments&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;trace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; msg&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Throwable&lt;/span&gt; t&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;boolean&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isDebugEnabled&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;debug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; msg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;boolean&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isInfoEnabled&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; msg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;boolean&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isWarnEnabled&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;warn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; msg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;boolean&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isErrorEnabled&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; msg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;위 인터페이스는 &lt;strong&gt;로깅을 위한 기본 메서드들을 정의&lt;/strong&gt;하며, 모든 구현체는 위 인터페이스를 구현해야 한다.&lt;br&gt;
&lt;strong&gt;팩토리 패턴&lt;/strong&gt;으로 실제 Logger 구현체가 생성된다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-Log-Level&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Log-Level&quot; aria-label=&quot; Log Level permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Log Level&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅ &lt;strong&gt;애플리케이션에서 로깅할 메시지의 중요도를 나타내는 설정&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;필요하지 않은 로그를 줄이고, 중요한 정보를 쉽게 확인 가능&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;로그 레벨&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;사용 예시&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TRACE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;가장 상세한 로그, 디버깅용&lt;/td&gt;
&lt;td&gt;내부 흐름 추적 (잘 사용되지 않음)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DEBUG&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;디버깅을 위한 상세 로그&lt;/td&gt;
&lt;td&gt;개발 시 코드 흐름 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;INFO&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;일반적인 실행 정보&lt;/td&gt;
&lt;td&gt;서비스 실행, 주요 이벤트 로깅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WARN&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;잠재적인 문제 경고&lt;/td&gt;
&lt;td&gt;성능 저하, 예상치 못한 동작&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ERROR&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;심각한 오류 로그&lt;/td&gt;
&lt;td&gt;예외 발생, 시스템 장애&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;🔹 &lt;strong&gt;Spring Boot의 기본 로그 레벨은 &lt;code class=&quot;language-text&quot;&gt;INFO&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
🔹 &lt;code class=&quot;language-text&quot;&gt;application.properties&lt;/code&gt;에서 로그 레벨 설정 가능&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;properties&quot;&gt;&lt;pre class=&quot;language-properties&quot;&gt;&lt;code class=&quot;language-properties&quot;&gt;&lt;span class=&quot;token key attr-name&quot;&gt;logging.level.root&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;DEBUG&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;🔹 &lt;strong&gt;운영 환경에서는 &lt;code class=&quot;language-text&quot;&gt;INFO&lt;/code&gt;, 개발 환경에서는 &lt;code class=&quot;language-text&quot;&gt;DEBUG&lt;/code&gt; 권장&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-SLF4J의-구현체&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-SLF4J%EC%9D%98-%EA%B5%AC%ED%98%84%EC%B2%B4&quot; aria-label=&quot; SLF4J의 구현체 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 SLF4J의 구현체&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;Logback&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Logback&quot; aria-label=&quot;Logback permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Logback&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;Spring Boot의 기본 로깅 구현체&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 특징&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SLF4J의 공식 구현체&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;XML 및 Groovy 기반 설정 가능&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RollingFileAppender를 통한 로그 롤링 지원&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;Log4j2&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Log4j2&quot; aria-label=&quot;Log4j2 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Log4j2&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;✅ Log4j2는 Log4j의 개선된 버전으로, 성능과 확장성이 뛰어난 로깅 프레임워크&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ Logback보다 성능이 더 좋고 비동기 로깅 가능&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 특징&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;비동기 로깅 지원&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JSON, YAML, XML 설정 파일 지원&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Garbage-Free(GC-Free) 로깅으로 메모리 사용 최적화&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🔹 Spring Boot에서 Log4j2 사용&lt;/strong&gt;&lt;br&gt;
기존 Logback을 제외시키고, Log4j2를 추가해야 한다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;gradle&quot;&gt;&lt;pre class=&quot;language-gradle&quot;&gt;&lt;code class=&quot;language-gradle&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;dependencies&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;implementation&lt;/span&gt; &lt;span class=&quot;token interpolation-string&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;org.springframework.boot:spring-boot-starter-log4j2&quot;&lt;/span&gt;&lt;/span&gt;
	modules &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token function&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token interpolation-string&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;org.springframework.boot:spring-boot-starter-logging&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token function&quot;&gt;replacedBy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token interpolation-string&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;org.springframework.boot:spring-boot-starter-log4j2&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token interpolation-string&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Use Log4j2 instead of Logback&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-MDCMapped-Diagnostic-Context&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-MDCMapped-Diagnostic-Context&quot; aria-label=&quot; MDCMapped Diagnostic Context permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 MDC(Mapped Diagnostic Context)&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅ &lt;strong&gt;각 요청마다 관련된 데이터를 유지하고 로그에 자동으로 포함할 수 있도록 도와주는 Key-Value 저장소&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;내부적으로 ThreadLocal을 사용해 각 쓰레드마다 저장소를 유지&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;특징&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8A%B9%EC%A7%95&quot; aria-label=&quot;특징 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;특징&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;🔹 요청 단위 로그 추적 가능&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;같은 요청에서 발생하는 모든 로그에 공통된 정보를 자동으로 추가 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🔹 key-value 기반 저장&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;🔹 로그 자동 출력&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MDC에 저장된 값들을 로깅 구현체 설정을 통해 자동으로 로그에 포함 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-Structured-Log&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Structured-Log&quot; aria-label=&quot; Structured Log permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Structured Log&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;✅ 단순한 문자열 형태가 아닌 JSON이나 key-value 형식으로 기록하는 로깅 기법&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;로그 분석, 검색, 필터링에 최적화됨 (ELK, Grafana와 연동 가능)&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;장점&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9E%A5%EC%A0%90&quot; aria-label=&quot;장점 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;장점&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;🔹 검색 및 필터링 용이&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;🔹 로그 데이터 시각화 가능&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ELK(Elasticsearch, Logstash, Kibana), Grafana 등의 &lt;strong&gt;로그 분석 도구와 쉽게 연동&lt;/strong&gt; 가능&lt;/li&gt;
&lt;li&gt;로그 데이터를 &lt;strong&gt;차트, 그래프 형태로 분석&lt;/strong&gt; 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🔹 JSON 포맷을 사용한 머신러닝 분석 가능&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;빅데이터 분석이나 머신러닝 모델 학습에 활용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🔹 검색 및 필터링 용이&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MSA에서 각 서비스와 로그를 공통된 JSON 포맷으로 통합 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🔹 검색 및 필터링 용이&lt;/strong&gt;  &lt;/p&gt;
&lt;h3 id=&quot;Format&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Format&quot; aria-label=&quot;Format permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Format&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;✅ 기본적으로 출력되는 JSON 로그는, 설정된 포맷에 맞게 MDC 값을 활용하여 자동으로 생성&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 ECS&lt;/strong&gt;&lt;br&gt;
ElasticSearch와 호환되는 표준 로그 형식
&lt;strong&gt;설정&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;properties&quot;&gt;&lt;pre class=&quot;language-properties&quot;&gt;&lt;code class=&quot;language-properties&quot;&gt;&lt;span class=&quot;token key attr-name&quot;&gt;logging.structured.format.console&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;ecs&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;logging.structured.format.file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;ecs&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;예시&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;@timestamp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2025-02-25T12:00:00.123Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;log.level&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;INFO&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;message&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;User login successful&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;event.category&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;authentication&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;event.action&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;user_login&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;user.id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;567&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;user.name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;john_doe&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;http.request.method&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;POST&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;http.response.status_code&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;🔹 GELF&lt;/strong&gt;&lt;br&gt;
Graylog에 최적화된 로그 형식
&lt;strong&gt;설정&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;properties&quot;&gt;&lt;pre class=&quot;language-properties&quot;&gt;&lt;code class=&quot;language-properties&quot;&gt;&lt;span class=&quot;token key attr-name&quot;&gt;logging.structured.format.console&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;gelf&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;logging.structured.format.file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;gelf&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;예시&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;version&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1.1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;host&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;server-1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;short_message&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;User login successful&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;full_message&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;User john_doe logged in from IP 192.168.1.100&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;timestamp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1708886400.123&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;level&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;_user_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;567&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;_ip_address&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;192.168.1.100&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;_http_method&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;POST&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;🔹 Logstash&lt;/strong&gt;&lt;br&gt;
Logstash에서 수집하고 처리하기 최적화된 로그 형식&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;properties&quot;&gt;&lt;pre class=&quot;language-properties&quot;&gt;&lt;code class=&quot;language-properties&quot;&gt;&lt;span class=&quot;token key attr-name&quot;&gt;logging.structured.format.console&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;logstash&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;logging.structured.format.file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;logstash&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;예시&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;timestamp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2025-02-25T12:00:00.123Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;level&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;INFO&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;message&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;User login successful&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;service&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;UserService&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;user_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;567&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;ip_address&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;192.168.1.100&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;http_method&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;POST&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;-궁금한-점&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EA%B6%81%EA%B8%88%ED%95%9C-%EC%A0%90&quot; aria-label=&quot; 궁금한 점 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 궁금한 점&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;Structured-Logging은-어떻게-활용할까&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Structured-Logging%EC%9D%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%ED%99%9C%EC%9A%A9%ED%95%A0%EA%B9%8C&quot; aria-label=&quot;Structured Logging은 어떻게 활용할까 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Structured Logging은 어떻게 활용할까?&lt;/strong&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;아래는 개인적인 의견입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;먼저, Logging에 대한 응집도와 핵심 로직 분리를 위해 아래와 같은 방법을 사용하는 것이 좋을 것 같다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Spring Filter 이용&lt;/li&gt;
&lt;li&gt;Spring AOP에서 자동 설정&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;요청이 &lt;strong&gt;시작될 때부터 끝날 때까지 가져야할 공통 필드는 Filter&lt;/strong&gt;에서부터 처리하고,&lt;br&gt;
&lt;strong&gt;특정 Layer의 메서드를 호출할 때와 같이 로깅 부가 기능을 분리할 때는 AOP&lt;/strong&gt;를 사용하는 것이 좋을 것 같다.&lt;/p&gt;
&lt;p&gt;user.id를 filter를 활용해 공통 필드로 추가해보자.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;application.properties&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;properties&quot;&gt;&lt;pre class=&quot;language-properties&quot;&gt;&lt;code class=&quot;language-properties&quot;&gt;&lt;span class=&quot;token key attr-name&quot;&gt;logging.structured.format.console&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;logstash&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;JsonLogFilter.java&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Component&lt;/span&gt;  
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;JsonLogFilter&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Filter&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
  
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;  
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;doFilter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ServletRequest&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ServletResponse&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;  
        &lt;span class=&quot;token keyword&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;FilterChain&lt;/span&gt; chain&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  
        &lt;span class=&quot;token keyword&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;IOException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ServletException&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
  
        &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
            &lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; userId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;example userId&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
            &lt;span class=&quot;token constant&quot;&gt;MDC&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;put&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;user.id&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; userId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
            chain&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doFilter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;finally&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
            &lt;span class=&quot;token constant&quot;&gt;MDC&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;clear&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;  
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;  
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;log&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;@timestamp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;2025-02-25T23:26:59.796577+09:00&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;@version&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;message&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;test log&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;logger_name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;com.example.javacicdpractice.member.MemberController&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;thread_name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;http-nio-8080-exec-1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;level&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;INFO&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;level_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;user.id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;example userId&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;user.id가 로그에 정상적으로 추가되었다.&lt;/p&gt;
&lt;h2 id=&quot;-참고&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%B0%B8%EA%B3%A0&quot; aria-label=&quot; 참고 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 참고&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.spring.io/spring-boot/how-to/logging.html&quot;&gt;https://docs.spring.io/spring-boot/how-to/logging.html&lt;/a&gt;
&lt;a href=&quot;https://docs.spring.io/spring-boot/reference/features/logging.html#features.logging.log-levels&quot;&gt;https://docs.spring.io/spring-boot/reference/features/logging.html#features.logging.log-levels&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[기존 Layered Architecture에 대한 고민]]></title><description><![CDATA[이 글은 이전에 기록한 글을 바탕으로 작성된 글입니다. 📌 배경 처음 개발을 시작했을 때, 3-tier Layered Architecture…]]></description><link>https://choiwonyu.github.io/기존 Layered Architecture에 대한 고민/</link><guid isPermaLink="false">https://choiwonyu.github.io/기존 Layered Architecture에 대한 고민/</guid><pubDate>Sun, 23 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;이 글은 &lt;a href=&quot;https://choi-records.tistory.com/entry/Architecture-%EB%A0%88%EC%9D%B4%EC%96%B4%EB%93%9C-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EB%AF%BC#toc3&quot;&gt;이전에 기록한 글&lt;/a&gt;을 바탕으로 작성된 글입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;-배경&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EB%B0%B0%EA%B2%BD&quot; aria-label=&quot; 배경 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 배경&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;처음 개발을 시작했을 때, 3-tier Layered Architecture를 많이 사용했다. 그러나 프로젝트 규모가 커질수록 애플리케이션의 복잡성이 증가했고, 기능을 수정하거나 확장하는 것이 점점 어려워졌다.  &lt;/p&gt;
&lt;p&gt;이 문제를 해결하기 위해 객체지향의 본질에 대해 공부하며 고민하기 시작했다. 그리고 가장 중요한 도메인 로직에 집중하지 못하고 있다는 점을 깨달았고, 이를 해결하기 위해 아키텍처를 개선하게 되었다.  &lt;/p&gt;
&lt;h2 id=&quot;-3-tier-LayeredArchitecture&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-3-tier-LayeredArchitecture&quot; aria-label=&quot; 3 tier LayeredArchitecture permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 3-tier Layered Architecture&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;3-tier Layered Architecture는 서버 개발을 처음 시작할 때 많이 사용하는 구조다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Controller&lt;/strong&gt;: 클라이언트 요청을 처리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Service&lt;/strong&gt;: 비즈니스 로직을 담당&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repository&lt;/strong&gt;: 데이터를 영속화
이 아키텍처의 가장 큰 장점은 &lt;strong&gt;쉽고 빠르게 애플리케이션을 개발할 수 있다는 점&lt;/strong&gt;이다. 그러나 복잡한 애플리케이션을 구현하기에는 한계가 있다.  &lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-tier-Layered-Architecture의-단점&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3-tier-Layered-Architecture%EC%9D%98-%EB%8B%A8%EC%A0%90&quot; aria-label=&quot;3 tier Layered Architecture의 단점 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;3-tier Layered Architecture의 단점&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;🔹 &lt;strong&gt;낮은 확장성과 유지보수성&lt;/strong&gt;&lt;br&gt;
이 구조에서 애플리케이션을 개발할 때, 일반적으로 다음 두 가지 접근 방식을 택한다.  &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Controller부터 개발&lt;/strong&gt; → 프레임워크와 API 설계 아키텍처에 의존하게 된다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Entity와 Repository부터 개발&lt;/strong&gt; → DB 중심의 사고방식이 형성된다.
어떤 접근을 택하든, Service 계층이 모든 핵심 로직을 담당하게 되고, 결국 &lt;strong&gt;절차지향적이고 DB 중심적인 애플리케이션&lt;/strong&gt;이 만들어진다. 이는 확장성과 유지보수성을 저해하는 핵심적인 문제점이다.  &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;🔹 &lt;strong&gt;낮은 Testablility&lt;/strong&gt;&lt;br&gt;
Service 계층은 복잡한 의존성을 가지며, 단위 테스트가 어렵다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;테스트를 진행하더라도 인수 테스트나 슬라이스 테스트와 같은 중간 규모 테스트가 많아지고, 시간이 오래 걸린다.&lt;/li&gt;
&lt;li&gt;핵심 로직을 효과적으로 검증하기 어려워 디버깅이 힘들어진다.
이러한 문제 역시 DB 중심적이고 절차지향적인 설계 때문이라고 볼 수 있다.  &lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;개선-방향&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B0%9C%EC%84%A0-%EB%B0%A9%ED%96%A5&quot; aria-label=&quot;개선 방향 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;개선 방향&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;이 문제를 해결하려면 &lt;strong&gt;객체 간의 협력 관계를 고려한 설계&lt;/strong&gt;가 필요하다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;각 도메인의 &lt;strong&gt;책임을 명확히 정의&lt;/strong&gt;하고,&lt;/li&gt;
&lt;li&gt;각 책임이 &lt;strong&gt;어떤 행동을 수행할지 고민&lt;/strong&gt;해야 한다.
즉, &lt;strong&gt;도메인 로직에 집중하는 아키텍처&lt;/strong&gt;를 설계해야 한다.  &lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-개선된-Layered-Architecture&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EA%B0%9C%EC%84%A0%EB%90%9C-Layered-Architecture&quot; aria-label=&quot; 개선된 Layered Architecture permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 개선된 Layered Architecture&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/f764df6616d6cd778ff158d3744cfeda/bbbf7/layered-architecture.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 80.58823529411765%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAAACXBIWXMAAAsTAAALEwEAmpwYAAABW0lEQVR42o2Ti46DIBBF+//fWMUKImi11RZ8td09lizJJm7diSHM48K9M3j4+rHn8/l4PJZlYcUdx/FyubRt670n9fptAXKIYEJN0yilAOD2fZ9leZIIrc353MRDQ+UGOBj34FJaVZXWWqmCb5pG51xIbYPneZ6miRUkpcMwwKWu6/v9TuR2uxEJEjbAUXzTtFIqbrbWQhgMcdbAfBtsjMnznCKldJpmaSrYcC10Qgv3aYduSSmNsWVp2EN4Hwyr+W3c1q/WXa9XRkX/SeHva6aOCXMENyOefdSM/k+aaW+o67rudJLrqI9JUeh92vEloDzMScpCa8ucx3GAyz81O3pHBM1MixZ47xD/SXN8t6jlSYKEPNXI1rrktXAu+W0waSEEvwMihWDOWVGUzvk8l+yPx8TaKszyT9rvt+mrqi7Ldc4MGb7AVlcbyG+Ao5iw4qKQDocWskY30v4GTn2hbFsNZ/AAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;layered architecture&apos; title=&apos;&apos; src=&apos;/static/f764df6616d6cd778ff158d3744cfeda/ca1dc/layered-architecture.png&apos; srcset=&apos;/static/f764df6616d6cd778ff158d3744cfeda/e7570/layered-architecture.png 170w,
/static/f764df6616d6cd778ff158d3744cfeda/f46e7/layered-architecture.png 340w,
/static/f764df6616d6cd778ff158d3744cfeda/ca1dc/layered-architecture.png 680w,
/static/f764df6616d6cd778ff158d3744cfeda/02d09/layered-architecture.png 1020w,
/static/f764df6616d6cd778ff158d3744cfeda/bbbf7/layered-architecture.png 1280w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
새로운 아키텍처에서는 표현 계층의 역할은 기존 3-tier 구조와 유사하다. 하지만 &lt;strong&gt;Application 계층과 Infrastructure 계층의 역할을 재정립&lt;/strong&gt;하여 확장성과 유지보수성을 높였다.&lt;/p&gt;
&lt;h3 id=&quot;Application-계층&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Application-%EA%B3%84%EC%B8%B5&quot; aria-label=&quot;Application 계층 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Application 계층&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;기존 3-tier 구조의 가장 큰 문제는 &lt;strong&gt;Service 객체가 핵심 로직을 직접 처리한다는 점&lt;/strong&gt;이다.&lt;br&gt;
이로 인해 &lt;strong&gt;도메인 객체 간의 유기적인 협력 관계를 구성하지 못한다&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;🔹 &lt;strong&gt;개선된 Application 계층의 역할&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Service 객체는 &lt;strong&gt;비즈니스 로직을 직접 수행하지 않는다&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;대신, &lt;strong&gt;도메인 객체들이 협력할 수 있도록 조정하는 역할&lt;/strong&gt;만 담당한다.&lt;br&gt;
즉, Service 계층은 &lt;strong&gt;도메인 객체 간 협력의 장을 만들어주는 역할&lt;/strong&gt;을 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;Infrastructure-계층&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Infrastructure-%EA%B3%84%EC%B8%B5&quot; aria-label=&quot;Infrastructure 계층 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Infrastructure 계층&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Infrastructure 계층은 구현 기술을 담당하며, 이를 통해 &lt;a href=&quot;https://ko.wikipedia.org/wiki/%EC%9D%98%EC%A1%B4%EA%B4%80%EA%B3%84_%EC%97%AD%EC%A0%84_%EC%9B%90%EC%B9%99&quot;&gt;DIP&lt;/a&gt;를 적용하여 상위 계층(도메인 및 서비스 계층)이 특정 기술에 직접 의존하지 않도록 한다.&lt;/p&gt;
&lt;p&gt;기존 구조에서는 Service 계층이 특정 구현체에 강하게 결합되어 있었다. 따라서 구현이 변경될 경우, Service 계층도 함께 수정해야 하므로 유지보수 비용이 증가했다. 이를 해결하기 위해 &lt;strong&gt;도메인 객체의 역할을 추상화&lt;/strong&gt;한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 DIP 적용 방식&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Service 계층은 &lt;strong&gt;구현체가 아니라, 추상화된 역할(인터페이스)에 의존&lt;/strong&gt;한다.&lt;/li&gt;
&lt;li&gt;구현체는 &lt;strong&gt;Infrastructure 계층에서 구현&lt;/strong&gt;하여 Service 계층과의 의존성을 느슨하게 만든다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;예를 들어, Service 객체에서 교통수단 도메인을 이용한다고 해보자.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/d4e94b3941efcd3e180005c32300baa9/55991/before.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 29.411764705882355%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA0UlEQVR42o1RyQqDUAz0/z/KqyfRm/u+4oYHcQOddgJCa1vowPB4eckkk6fgifM8P3jHFa/rGlmWIQxDeJ6HKIpQFIXE8jyH8kvgLkYMw4A4jrHvO5ZlkZPctg3rusJxHCi6rsM0TekUBIEEu66TpHmepZBnkiSwbRtN04g4c3zfR1mW8k60bQuFApqmSWfXdWEYhhRXVSVWSN5VVRWyiGAjinGQN0H8gcty3/ciQJvTNInNVyccSnZ4HMfXj7mTebTKienMsixZA5ukaYpxHPEA0xXJOedgIrcAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;before&apos; title=&apos;&apos; src=&apos;/static/d4e94b3941efcd3e180005c32300baa9/ca1dc/before.png&apos; srcset=&apos;/static/d4e94b3941efcd3e180005c32300baa9/e7570/before.png 170w,
/static/d4e94b3941efcd3e180005c32300baa9/f46e7/before.png 340w,
/static/d4e94b3941efcd3e180005c32300baa9/ca1dc/before.png 680w,
/static/d4e94b3941efcd3e180005c32300baa9/02d09/before.png 1020w,
/static/d4e94b3941efcd3e180005c32300baa9/9d567/before.png 1360w,
/static/d4e94b3941efcd3e180005c32300baa9/55991/before.png 1390w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;기존 구조에서는 위처럼 Service 객체가 구현체에 &lt;strong&gt;강결합&lt;/strong&gt;되어 있었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/064de173a6d6f64024cc6909d5ab8b65/04dd0/after.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 59.411764705882355%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAABYklEQVR42m2SWauDQAyF/f8/S/pQCn0Q9MEKbUGrdl9cutpcvnAjY9tA0MlMTk5O4sm/vd/v/mv/z+dT1uu1HI9H2e12st1u9YtvNhv5ZR5Jr9dL3QXFmqaRsiwV+PF4yO12U7/f75Lnuca/AIMgkCiK1JMkkTRNlUEcxzKdTvW8Wq30vFwuZbFYqGdZpsA/GVKdS9eJ7fd7bRn2bdtq/Hq9KsuiKDT+Bei2+GkkHA4HBZ7NZjIajSQMQ9WSuKv3ANAdjOsYrGCJDHTDMNDV2v3M8T5ZGRBJtHU+n6XrusEb5DidTqol925eD0h1WMAGIN/3dSCsDC27YLAEcDwey2Qy0eK2Xj0gDy6XiyawLrBCQ85M2VjWda3J7ioxMHvnGVXYVVXV/8/nc50oxs7ZRCkGEwwCdOHKNADEOVPd1gQglyFFSSRu7Chsw+tb5pJlpbqtCuuBXnxdDTnbO9OdGAP6A1YVner3pwcoAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;after&apos; title=&apos;&apos; src=&apos;/static/064de173a6d6f64024cc6909d5ab8b65/ca1dc/after.png&apos; srcset=&apos;/static/064de173a6d6f64024cc6909d5ab8b65/e7570/after.png 170w,
/static/064de173a6d6f64024cc6909d5ab8b65/f46e7/after.png 340w,
/static/064de173a6d6f64024cc6909d5ab8b65/ca1dc/after.png 680w,
/static/064de173a6d6f64024cc6909d5ab8b65/02d09/after.png 1020w,
/static/064de173a6d6f64024cc6909d5ab8b65/9d567/after.png 1360w,
/static/064de173a6d6f64024cc6909d5ab8b65/04dd0/after.png 1826w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;개선된 구조에서는 위처럼 &lt;strong&gt;유연한 구조&lt;/strong&gt;가 된다.   &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Infrastructure 계층은 이처럼 상위 계층이 특정 구현체에 강결합되는 것을 방지해준다.&lt;/p&gt;
&lt;h3 id=&quot;장점&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9E%A5%EC%A0%90&quot; aria-label=&quot;장점 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;장점&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;🔹 &lt;strong&gt;확장성과 유지보수성 향상&lt;/strong&gt;    &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DIP를 적용함으로써 OCP(개방-폐쇄 원칙)와 DIP(의존성 역전 원칙)를 만족한다.&lt;/li&gt;
&lt;li&gt;결과적으로 &lt;strong&gt;도메인의 확장과 변경이 용이해진다&lt;/strong&gt;.  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🔹 &lt;strong&gt;테스트 용이성(Testability) 증가&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;도메인 객체의 가짜(Fake) 구현체를 사용하여 &lt;strong&gt;Service 계층을 단위 테스트&lt;/strong&gt;할 수 있다.&lt;/li&gt;
&lt;li&gt;핵심 로직을 도메인 계층에서 담당하므로 &lt;strong&gt;소규모 단위 테스트가 가능&lt;/strong&gt;해진다.  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🔹 &lt;strong&gt;도메인 중심 설계 가능&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;도메인 객체 간의 협력 관계를 먼저 고려하여 애플리케이션을 설계할 수 있다.&lt;/li&gt;
&lt;li&gt;이는 결과적으로 &lt;strong&gt;비즈니스 로직을 더 효과적으로 모델링할 수 있도록 돕는다&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[DispatcherServlet의 동작 과정]]></title><description><![CDATA[✅ Spring MVC에서 프론트 컨트롤러 역할을 하는 핵심 서블릿 ✅ 모든 HTTP 요청을 받아 적절한 컨트롤러로 전달하고, 응답을 생성하여 클라이언트에게 반환 📌 Front Controller…]]></description><link>https://choiwonyu.github.io/DispatcherServlet의 동작 과정/</link><guid isPermaLink="false">https://choiwonyu.github.io/DispatcherServlet의 동작 과정/</guid><pubDate>Sat, 22 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;✅ &lt;strong&gt;Spring MVC에서 프론트 컨트롤러 역할을 하는 핵심 서블릿&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;모든 HTTP 요청을 받아 적절한 컨트롤러로 전달하고, 응답을 생성하여 클라이언트에게 반환&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;-Front-Controller-패턴&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Front-Controller-%ED%8C%A8%ED%84%B4&quot; aria-label=&quot; Front Controller 패턴 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;📌 &lt;strong&gt;Front Controller 패턴&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅ &lt;strong&gt;모든 요청을 한 곳에서 처리하고, 이후 적절한 컨트롤러로 위임하는 패턴&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;만약 DispatcherServlet이 없다면,
Servlet 컨테이너가 요청에 맞는 핸들러를 찾아야하며, &lt;strong&gt;모든 요청마다 개별 서블릿을 사용해야 한다.&lt;/strong&gt;
따라서 &lt;strong&gt;모든 요청을 DispatcherServlet이 처리&lt;/strong&gt;하도록 하는 프론트 컨트롤러 패턴이 적용된다.&lt;/p&gt;
&lt;h3 id=&quot;장점&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9E%A5%EC%A0%90&quot; aria-label=&quot;장점 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;장점&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;모든 요청을 프론트 컨트롤러에서 관리하여 중복을 줄일 수 있음&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;컨트롤러 별로 로직을 분리하면서도, 공통 작업(예: 보안, 로깅)을 프론트 컨트롤러에서 처리 가능&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;-요청-처리-과정&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%9A%94%EC%B2%AD-%EC%B2%98%EB%A6%AC-%EA%B3%BC%EC%A0%95&quot; aria-label=&quot; 요청 처리 과정 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 요청 처리 과정&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/6a9c823d3a32b84d23df5542da06cd48/1c0b8/dispatcherServlet.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 24.705882352941178%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAp0lEQVR42oWQbQ+DIAyE+f//kkQjRlR8QQWjXZ5mms19WJOj9Lj2ACPvWJZF2rYV773M8yw5ZznPU47j+MK/MCw0btumw6qq0v2+7z9IKd1Gz7g4cxG4T9MkwzDcN0F0CT+5dV0VcM/hJsYo4zhKCEHKslQwmOc3TaNnzjn9Bmr4vu/FWqvm9KGB42U6EDdIxF3XaTN/ChAWRaEmaNDC1XWtmRo9veQX1oyE1SGxjQAAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;dispatcherServlet&apos; title=&apos;&apos; src=&apos;/static/6a9c823d3a32b84d23df5542da06cd48/ca1dc/dispatcherServlet.png&apos; srcset=&apos;/static/6a9c823d3a32b84d23df5542da06cd48/e7570/dispatcherServlet.png 170w,
/static/6a9c823d3a32b84d23df5542da06cd48/f46e7/dispatcherServlet.png 340w,
/static/6a9c823d3a32b84d23df5542da06cd48/ca1dc/dispatcherServlet.png 680w,
/static/6a9c823d3a32b84d23df5542da06cd48/02d09/dispatcherServlet.png 1020w,
/static/6a9c823d3a32b84d23df5542da06cd48/9d567/dispatcherServlet.png 1360w,
/static/6a9c823d3a32b84d23df5542da06cd48/1c0b8/dispatcherServlet.png 2104w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;DispatcherServlet에 요청이 전달&lt;/li&gt;
&lt;li&gt;DispatcherServlet이 HandlerMapping를 활용해 &lt;strong&gt;적절한 핸들러를 조회&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;DispatcherServlet이 &lt;strong&gt;HandlerAdapter를 활용해&lt;/strong&gt; 해당 &lt;strong&gt;핸들러를 실행&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;핸들러가 작성된 &lt;strong&gt;비즈니스 로직&lt;/strong&gt;대로 요청을 처리&lt;/li&gt;
&lt;li&gt;핸들러가 반환값 반환&lt;/li&gt;
&lt;li&gt;핸들러 어댑터가 반환값 처리&lt;/li&gt;
&lt;li&gt;DispatcherServlet이 응답 반환&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;HandlerMapping&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#HandlerMapping&quot; aria-label=&quot;HandlerMapping permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;HandlerMapping&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;요청을 분석하여 어떤 컨트롤러가 처리할지 결정&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;적절한 컨트롤러를 찾아 반환&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HandlerMapping.class&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;HandlerMapping&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Nullable&lt;/span&gt;  
    &lt;span class=&quot;token class-name&quot;&gt;HandlerExecutionChain&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getHandler&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;HttpServletRequest&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Exception&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;🔹 &lt;strong&gt;getHandler(request)&lt;/strong&gt;&lt;br&gt;
요청을 분석해 적절한 HandlerExecutionChain를 반환&lt;/p&gt;
&lt;p&gt;🔹 &lt;strong&gt;HandlerExecutionChain&lt;/strong&gt;&lt;br&gt;
HandlerMapping이 찾은 핸들러(컨트롤러)와 해당 핸들러에 적용할 HandlerInterceptor(인터셉터)들을 함께 관리하는 객체&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DispatcherServlet.class&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;HandlerExecutionChain&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getHandler&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;HttpServletRequest&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;handlerMappings &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
        &lt;span class=&quot;token class-name&quot;&gt;Iterator&lt;/span&gt; var2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;handlerMappings&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;iterator&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
  
        &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;var2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hasNext&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
            &lt;span class=&quot;token class-name&quot;&gt;HandlerMapping&lt;/span&gt; mapping &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;HandlerMapping&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;var2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
            &lt;span class=&quot;token class-name&quot;&gt;HandlerExecutionChain&lt;/span&gt; handler &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; mapping&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getHandler&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;request&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;handler &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
                &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; handler&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;  
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;  
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;  
  
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;HandlerAdapter&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#HandlerAdapter&quot; aria-label=&quot;HandlerAdapter permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;HandlerAdapter&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;HandlerMapping이 찾아준 컨트롤러를 실행하는 역할&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HandlerAdapter.class&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;HandlerAdapter&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
    &lt;span class=&quot;token keyword&quot;&gt;boolean&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;supports&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt; handler&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
  
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Nullable&lt;/span&gt;  
    &lt;span class=&quot;token class-name&quot;&gt;ModelAndView&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;handle&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;HttpServletRequest&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;HttpServletResponse&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt; handler&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Exception&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;   
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;🔹 &lt;strong&gt;supports(handler)&lt;/strong&gt;&lt;br&gt;
해당 핸들러(컨트롤러)가 이 HandlerAdapter에서 실행할 수 있는지 확인하는 메서드&lt;/p&gt;
&lt;p&gt;🔹 &lt;strong&gt;handle(request, response, handler)&lt;/strong&gt;&lt;br&gt;
HandlerMapping이 반환한 컨트롤러를 실행하는 메서드&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DispatcherServlet.class&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;HandlerAdapter&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getHandlerAdapter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt; handler&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ServletException&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;handlerAdapters &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
        &lt;span class=&quot;token class-name&quot;&gt;Iterator&lt;/span&gt; var2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;handlerAdapters&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;iterator&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
  
        &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;var2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hasNext&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
            &lt;span class=&quot;token class-name&quot;&gt;HandlerAdapter&lt;/span&gt; adapter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;HandlerAdapter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;var2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;adapter&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;supports&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;handler&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
                &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; adapter&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;  
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;  
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;  
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;-궁금했던-점&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EA%B6%81%EA%B8%88%ED%96%88%EB%8D%98-%EC%A0%90&quot; aria-label=&quot; 궁금했던 점 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 궁금했던 점&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;어떻게-다양한-타입의-응답-데이터를-처리할까&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%8B%A4%EC%96%91%ED%95%9C-%ED%83%80%EC%9E%85%EC%9D%98-%EC%9D%91%EB%8B%B5-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%EC%B2%98%EB%A6%AC%ED%95%A0%EA%B9%8C&quot; aria-label=&quot;어떻게 다양한 타입의 응답 데이터를 처리할까 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;어떻게 다양한 타입의 응답 데이터를 처리할까?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;RequestMappingHandlerAdapter.class&lt;/strong&gt;
핸들러의 반환 &lt;strong&gt;응답 형식에 따라 분기하여 반환값을 처리&lt;/strong&gt;한다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;token generics&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;HandlerMethodReturnValueHandler&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getDefaultReturnValueHandlers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
    &lt;span class=&quot;token class-name&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;token generics&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;HandlerMethodReturnValueHandler&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt; handlers &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ArrayList&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
    handlers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ModelAndViewMethodReturnValueHandler&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
    handlers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;RequestResponseBodyMethodProcessor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getMessageConverters&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;contentNegotiationManager&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;requestResponseBodyAdvice&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; handlers&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;DispatcherServlet이-다양한-응답-형식을-어떻게-추상화해서-반환하는가&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#DispatcherServlet%EC%9D%B4-%EB%8B%A4%EC%96%91%ED%95%9C-%EC%9D%91%EB%8B%B5-%ED%98%95%EC%8B%9D%EC%9D%84-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%B6%94%EC%83%81%ED%99%94%ED%95%B4%EC%84%9C-%EB%B0%98%ED%99%98%ED%95%98%EB%8A%94%EA%B0%80&quot; aria-label=&quot;DispatcherServlet이 다양한 응답 형식을 어떻게 추상화해서 반환하는가 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;DispatcherServlet이 다양한 응답 형식을 어떻게 추상화해서 반환하는가?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;DispatcherServlet은 실제로는 응답을 반환하는 것이 아닌 &lt;strong&gt;HttpServletResponse에 응답 데이터가 기록되도록 한다.&lt;/strong&gt; 따라서 다양한 HandlerMethodReturnValueHandler가 HttpServletResponse에 응답 데이터를 기록한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DispatcherServlet.class&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;doDispatch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;HttpServletRequest&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;HttpServletResponse&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token class-name&quot;&gt;HandlerExecutionChain&lt;/span&gt; mappedHandler &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getHandler&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;request&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mappedHandler &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;noHandlerFound&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token class-name&quot;&gt;HandlerAdapter&lt;/span&gt; ha &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getHandlerAdapter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mappedHandler&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getHandler&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    
    &lt;span class=&quot;token comment&quot;&gt;// 🚀 컨트롤러 실행&lt;/span&gt;
    &lt;span class=&quot;token class-name&quot;&gt;ModelAndView&lt;/span&gt; mv &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ha&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;handle&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; mappedHandler&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getHandler&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// 🚀 반환된 결과를 처리&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;processDispatchResult&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; mappedHandler&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; mv&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;-참고&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%B0%B8%EA%B3%A0&quot; aria-label=&quot; 참고 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 참고&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-servlet.html&quot;&gt;https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-servlet.html&lt;/a&gt;
&lt;a href=&quot;https://mangkyu.tistory.com/18&quot;&gt;https://mangkyu.tistory.com/18&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[WAS와 Servlet]]></title><description><![CDATA[📌 WAS(Web Application Server) ✅ Servlet을 실행하고 관리하는 서버 (Servlet 컨테이너 역할) ✅ HTTP 요청을 처리하고, Servlet을 통해 동적인 웹 페이지를 생성하여 클라이언트에게 응답 ✅ 대표적인 WAS…]]></description><link>https://choiwonyu.github.io/WAS와 Servlet/</link><guid isPermaLink="false">https://choiwonyu.github.io/WAS와 Servlet/</guid><pubDate>Fri, 21 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;-WASWeb-Application-Server&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-WASWeb-Application-Server&quot; aria-label=&quot; WASWeb Application Server permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 WAS(Web Application Server)&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅ Servlet을 실행하고 관리하는 서버 (Servlet 컨테이너 역할)&lt;br&gt;
✅ HTTP 요청을 처리하고, Servlet을 통해 동적인 웹 페이지를 생성하여 클라이언트에게 응답&lt;br&gt;
✅ 대표적인 WAS: &lt;strong&gt;Apache Tomcat&lt;/strong&gt;  &lt;/p&gt;
&lt;h3 id=&quot;배경&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B0%B0%EA%B2%BD&quot; aria-label=&quot;배경 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;배경&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;🔹 기존 솔루션의 한계&lt;/strong&gt;&lt;br&gt;
과거에는 단순한 HTML, CSS, 이미지 등의 정적 파일을 제공하는 웹 서버(Apache, Nginx) 만 존재했다.&lt;br&gt;
웹이 발전함에 따라 &lt;strong&gt;사용자의 요청에 따른 동적인 처리&lt;/strong&gt;가 필요해졌다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 기존 솔루션의 한계 해결&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WAS = 웹 서버 + 웹 컨테이너&lt;/li&gt;
&lt;li&gt;정적 컨텐츠는 웹 서버가 제공하고, 동적 컨텐츠는 웹 컨테이너가 제공&lt;/li&gt;
&lt;li&gt;웹 컨테이너는 서블릿을 실행하고 관리&lt;/li&gt;
&lt;li&gt;웹 컨테이너에서 &lt;strong&gt;동적인 데이터를 처리하는 역할을 하는 것이 서블릿&lt;/strong&gt;  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/0ba25d4333aadc51f8839eccf7d15b3f/45416/WAS.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 34.705882352941174%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAABYlAAAWJQFJUiTwAAABJUlEQVR42m1R2W6DQAzk/78voamCBIFAuO+bBXfGDVEfasmy12vPzngt+ceWZZG2baVpGsnzXGMYhuI4jhRFoTU686qq9H4YBun7XqzjOOT009gwTZNs26YxCALxPE9BDGp8cDdG+3zfV4+iSB+wThCDhnmeNa/rWtZ1/dSzLFMmHFhxNvuuj5WodV2nzDhDUIuNaZrK8/mU79tNvMdDvq5XicGoAJD7lknrwKjC0AyGyeslEWY0TxIlQBUWWVGK67pi27YCRpDQ3+8yXi7SQW5Zlsq0QlzjWAzuFgy3OBOQDInD1Xwkc4c7pNB6LHjD7g4w2/tfSVw6/QDwDgIH2BJkgs9vp1rrBPv7KeM46i8TuMWOuCeeuSeyLRALDDNn7fxl9vwAtCoYMYJAfZoAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;WAS&apos; title=&apos;&apos; src=&apos;/static/0ba25d4333aadc51f8839eccf7d15b3f/ca1dc/WAS.png&apos; srcset=&apos;/static/0ba25d4333aadc51f8839eccf7d15b3f/e7570/WAS.png 170w,
/static/0ba25d4333aadc51f8839eccf7d15b3f/f46e7/WAS.png 340w,
/static/0ba25d4333aadc51f8839eccf7d15b3f/ca1dc/WAS.png 680w,
/static/0ba25d4333aadc51f8839eccf7d15b3f/02d09/WAS.png 1020w,
/static/0ba25d4333aadc51f8839eccf7d15b3f/9d567/WAS.png 1360w,
/static/0ba25d4333aadc51f8839eccf7d15b3f/45416/WAS.png 2080w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;동작-흐름&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%8F%99%EC%9E%91-%ED%9D%90%EB%A6%84&quot; aria-label=&quot;동작 흐름 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;동작 흐름&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;클라이언트 → HTTP 요청 (GET /hello)&lt;/li&gt;
&lt;li&gt;WAS → 요청을 받아 Servlet 실행 (HelloServlet)&lt;/li&gt;
&lt;li&gt;Servlet → 동적 응답을 생성하여 응답 (Hello, Servlet!)&lt;/li&gt;
&lt;li&gt;WAS → 클라이언트에게 최종 응답 전달&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;-Servlet&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Servlet&quot; aria-label=&quot; Servlet permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Servlet&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅ HTTP 요청을 받아 동적인 처리를 수행하고, HTML 또는 JSON 등의 응답을 생성&lt;br&gt;
✅ 대표적인 Servlet: &lt;strong&gt;DispatcherServlet&lt;/strong&gt;  &lt;/p&gt;
&lt;h3 id=&quot;동작-흐름-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%8F%99%EC%9E%91-%ED%9D%90%EB%A6%84-1&quot; aria-label=&quot;동작 흐름 1 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;동작 흐름&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;클라이언트 요청을 받아 동적 데이터 생성&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;비즈니스 로직, 외부 시스템과 연동 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;동적인 HTML 또는 JSON을 생성하여 클라이언트에게 반환&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;라이프사이클-메서드&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%9D%BC%EC%9D%B4%ED%94%84%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%A9%94%EC%84%9C%EB%93%9C&quot; aria-label=&quot;라이프사이클 메서드 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;라이프사이클 메서드&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;🔹 init()&lt;/strong&gt;&lt;br&gt;
Servlet이 처음 생성될 때 한 번 실행 (초기화 작업 수행)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 service()&lt;/strong&gt;&lt;br&gt;
HTTP 요청이 들어올 때마다 실행 (요청 처리)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 destroy()&lt;/strong&gt;&lt;br&gt;
Servlet이 제거될 때 한 번 실행 (자원 해제)&lt;/p&gt;
&lt;h2 id=&quot;-Spring-MVC&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Spring-MVC&quot; aria-label=&quot; Spring MVC permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Spring MVC&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅ &lt;strong&gt;WAS 내에서 서블릿을 기반으로 동작하는 웹 프레임워크&lt;/strong&gt;&lt;br&gt;
✅  &lt;code class=&quot;language-text&quot;&gt;DispatcherServlet&lt;/code&gt;이라는 서블릿을 기반으로 동작  &lt;/p&gt;
&lt;h2 id=&quot;-참고&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%B0%B8%EA%B3%A0&quot; aria-label=&quot; 참고 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 참고&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.spring.io/spring-framework/reference/web/webmvc.html&quot;&gt;https://docs.spring.io/spring-framework/reference/web/webmvc.html&lt;/a&gt;
&lt;a href=&quot;https://www.youtube.com/watch?v=F_vBAbjj4Pk&quot;&gt;https://www.youtube.com/watch?v=F_vBAbjj4Pk&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Service Discovery]]></title><description><![CDATA[✅ 서비스 인스턴스를 자동으로 등록하고 검색 가능 ✅ IP 주소가 동적으로 변경되어도 항상 최신 정보를 제공 
Netflix Eureka는 Netflix OSS(Open Source Software)에서 제공하는 Service Discovery…]]></description><link>https://choiwonyu.github.io/Service Discovery/</link><guid isPermaLink="false">https://choiwonyu.github.io/Service Discovery/</guid><pubDate>Tue, 18 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;✅ &lt;strong&gt;서비스 인스턴스를 자동으로 등록하고 검색 가능&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;IP 주소가 동적으로 변경되어도 항상 최신 정보를 제공&lt;/strong&gt;&lt;br&gt;
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/093e10fe58e2ea2e471311615ed618f1/79f3a/service-discovery-server.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 55.294117647058826%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAABF0lEQVR42qWT266CQAxF5/9/j/iAErkICJGbQkCuPVlNIETPEzZpOlPaPXt2ByMHbVkWjXmey/P5lKZppCgKMb+ApWkq1+tVHo+HJEmibvZFq382/gcIqziO5X6/y+v1UnYAfzEchkHGcdQ4TdMGQG6eZ127rit1Xeu39/ut12Xftq0YGkl2XafJ9SRiVVUKikdRJJZlyeVykTAMpe977ePaZVlqrWpIM9Rvt5ue7DiOnE4nbSLH3rZtOZ/PGj3P0zV9gHEAEf8aClcCnA8UcCoGGwBoBtD3/U0OamCIo6v5HAigq++Hst8HQaASsEcytEMyJDBHngvGIJAEh+Wm4ZF3CFuM54KeXJXnA6j59U/JskyZAY6Of/31VZYf+xUKAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;service discovery server&apos; title=&apos;&apos; src=&apos;/static/093e10fe58e2ea2e471311615ed618f1/ca1dc/service-discovery-server.png&apos; srcset=&apos;/static/093e10fe58e2ea2e471311615ed618f1/e7570/service-discovery-server.png 170w,
/static/093e10fe58e2ea2e471311615ed618f1/f46e7/service-discovery-server.png 340w,
/static/093e10fe58e2ea2e471311615ed618f1/ca1dc/service-discovery-server.png 680w,
/static/093e10fe58e2ea2e471311615ed618f1/02d09/service-discovery-server.png 1020w,
/static/093e10fe58e2ea2e471311615ed618f1/9d567/service-discovery-server.png 1360w,
/static/093e10fe58e2ea2e471311615ed618f1/79f3a/service-discovery-server.png 1622w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
&lt;strong&gt;Netflix Eureka&lt;/strong&gt;는 Netflix OSS(Open Source Software)에서 제공하는 &lt;strong&gt;Service Discovery(서비스 디스커버리) 서버 및 클라이언트 라이브러리&lt;/strong&gt;&lt;br&gt;
마이크로서비스 환경에서 &lt;strong&gt;동적으로 서비스 인스턴스를 등록하고 검색&lt;/strong&gt;할 수 있도록 도움&lt;/p&gt;
&lt;h3 id=&quot;-Netflix-Eureka-구성-요소&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Netflix-Eureka-%EA%B5%AC%EC%84%B1-%EC%9A%94%EC%86%8C&quot; aria-label=&quot; Netflix Eureka 구성 요소 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Netflix Eureka 구성 요소&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Eureka는 &lt;strong&gt;클라이언트/서버 아키텍처&lt;/strong&gt;로 구성되며, &lt;code class=&quot;language-text&quot;&gt;Eureka Server&lt;/code&gt;와 &lt;code class=&quot;language-text&quot;&gt;Eureka Client&lt;/code&gt;로 구분&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구성 요소&lt;/th&gt;
&lt;th&gt;역할&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Eureka Server&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;서비스 등록 및 검색을 관리하는 중앙 서버&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Eureka Client&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Eureka Server에 서비스 등록 및 조회하는 클라이언트&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;✅ &lt;strong&gt;Eureka Server는 독립적인 서비스로 실행되며, Eureka Client가 이를 사용하여 서비스를 등록하고 조회&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;Eureka-Server&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Eureka-Server&quot; aria-label=&quot;Eureka Server permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Eureka Server&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅ Netflix에서 제공하는 &lt;strong&gt;Servcie Discovery Server 라이브러리&lt;/strong&gt;&lt;br&gt;
✅ MSA에서 &lt;strong&gt;서비스 등록 및 검색 기능&lt;/strong&gt; 제공&lt;/p&gt;
&lt;h3 id=&quot;-Netflix-Eureka-Server의-역할&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Netflix-Eureka-Server%EC%9D%98-%EC%97%AD%ED%95%A0&quot; aria-label=&quot; Netflix Eureka Server의 역할 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Netflix Eureka Server의 역할&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;서비스 등록&lt;/strong&gt;: 마이크로서비스가 실행되면서 Eureka Server에 자신을 등록&lt;br&gt;
✅ &lt;strong&gt;서비스 검색&lt;/strong&gt;: 마이크로서비스가 Eureka Server에서 &lt;strong&gt;다른 서비스의 위치(IP, 포트)를 조회&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;헬스 체크&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;서비스가 정상적으로 실행되고 있는지 주기적으로 상태를 체크(heartbeat)&lt;/li&gt;
&lt;li&gt;일정 시간 응답이 없으면 자동으로 해당 서비스 제거&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-Netflix-Eureka-Server-설정-및-실행&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Netflix-Eureka-Server-%EC%84%A4%EC%A0%95-%EB%B0%8F-%EC%8B%A4%ED%96%89&quot; aria-label=&quot; Netflix Eureka Server 설정 및 실행 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Netflix Eureka Server 설정 및 실행&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;build.gradle&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;gradle&quot;&gt;&lt;pre class=&quot;language-gradle&quot;&gt;&lt;code class=&quot;language-gradle&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;implementation&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;org.springframework.cloud:spring-cloud-starter-netflix-eureka-server&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;✅ .java&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@SpringBootApplication&lt;/span&gt;  
&lt;span class=&quot;token annotation punctuation&quot;&gt;@EnableEurekaServer&lt;/span&gt;  
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;DiscoveryserviceApplication&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
  
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
        &lt;span class=&quot;token class-name&quot;&gt;SpringApplication&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;DiscoveryserviceApplication&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;  
  
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;@EnableEurekaServer&lt;/strong&gt;: 해당 서버를 discovery service로 지정&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅ 설정 파일&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;server&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  
  &lt;span class=&quot;token key atrule&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8761&lt;/span&gt;  
&lt;span class=&quot;token key atrule&quot;&gt;spring&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  
  &lt;span class=&quot;token key atrule&quot;&gt;application&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  
    &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; discoveryservice  
&lt;span class=&quot;token key atrule&quot;&gt;eureka&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  
  &lt;span class=&quot;token key atrule&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  
    &lt;span class=&quot;token key atrule&quot;&gt;register-with-eureka&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;false&lt;/span&gt;  
    &lt;span class=&quot;token key atrule&quot;&gt;fetch-registry&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;false&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;application.name&lt;/strong&gt;: 해당 애플리케이션 서버의 이름(고유한 id)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;register-with-eureka&lt;/strong&gt;: discovery service에 client로 등록할 것인지에 대한 설정값&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fetch-registry&lt;/strong&gt;: 다른 서비스의 정보를 가져오는지 여부&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;✅ 서버 실행&lt;/strong&gt;
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/15fafae5bcfbde70e24a0ca8b3784787/9ad8b/1.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 42.35294117647059%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABYlAAAWJQFJUiTwAAABd0lEQVR42nWRW0/CQBCF+w8hIJcgGBPe1BB/ggZBQOXyojEKv4iLxJBwaS0taGlpodweKCTHnUUQYnz4cvacnczMtkIocITL2DliF2eIRsMIhl3w+93weVzweX/xe90HnoiEAjgJB3EaCeE46EPQ74Ggqirkjw8YuoH5fIHZbM6ZTme788ZPOYvFgtVRNoNt2xiPba5UQ7kgiiJkWcZwOGQYHMPQoShdruRNcwiJDVUUBZqm8azXUyFJEtMe+v3+rlagqTRtMpkcQFP3vdztotVqg15kmiZvrOs6LMvinhYiFSxzE4xGI7b++F+oEW05YE2o0WAw2OiPJwyDbfip9aDpX3AcB+v1mrNarXa6xXE27GfbfHteLpcQGo131Os1vNVqqJTLnFq1imqljFazCYl9Y0kSIYodiJ2/0D1pp91Gl/0LoVR8Rfz6ipNKJpC8ieM+k8ZdJoV0KolCLovnp0fksw/IpG95voV8IZ9Fjt0lE3GUii/4BhJHHiDnpiOLAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;1&apos; title=&apos;&apos; src=&apos;/static/15fafae5bcfbde70e24a0ca8b3784787/ca1dc/1.png&apos; srcset=&apos;/static/15fafae5bcfbde70e24a0ca8b3784787/e7570/1.png 170w,
/static/15fafae5bcfbde70e24a0ca8b3784787/f46e7/1.png 340w,
/static/15fafae5bcfbde70e24a0ca8b3784787/ca1dc/1.png 680w,
/static/15fafae5bcfbde70e24a0ca8b3784787/02d09/1.png 1020w,
/static/15fafae5bcfbde70e24a0ca8b3784787/9d567/1.png 1360w,
/static/15fafae5bcfbde70e24a0ca8b3784787/9ad8b/1.png 2940w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Eureka Server에서 제공하는 &lt;strong&gt;대시보드&lt;/strong&gt; 조회 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;어떤 인스턴스가 등록되었는지 확인&lt;/strong&gt; 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;Netflix-Eureka-Client&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Netflix-Eureka-Client&quot; aria-label=&quot;Netflix Eureka Client permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Netflix Eureka Client&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅ Eureka Server에 자신을 등록하고, 다른 서비스의 위치를 조회 가능&lt;/p&gt;
&lt;h3 id=&quot;-Netflix-Eureka-Client-설정-및-실행&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Netflix-Eureka-Client-%EC%84%A4%EC%A0%95-%EB%B0%8F-%EC%8B%A4%ED%96%89&quot; aria-label=&quot; Netflix Eureka Client 설정 및 실행 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Netflix Eureka Client 설정 및 실행&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;build.gradle&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;implementation &apos;org.springframework.boot:spring-boot-starter-web&apos;  
implementation &apos;org.springframework.cloud:spring-cloud-starter-netflix-eureka-client&apos;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;✅ &lt;strong&gt;설정 파일&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yml&quot;&gt;&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;server&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  
  &lt;span class=&quot;token key atrule&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;9001&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;spring&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  
  &lt;span class=&quot;token key atrule&quot;&gt;application&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  
    &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; user&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;service
  
&lt;span class=&quot;token key atrule&quot;&gt;eureka&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  
    &lt;span class=&quot;token key atrule&quot;&gt;fetch-registry&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;  
    &lt;span class=&quot;token key atrule&quot;&gt;register-with-eureka&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;  
    &lt;span class=&quot;token key atrule&quot;&gt;service-url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  
      &lt;span class=&quot;token key atrule&quot;&gt;defaultZone&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; http&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;//localhost&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;8761/eureka&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;application.name&lt;/strong&gt;: 해당 애플리케이션 서버의 이름(고유한 id)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;register-with-eureka&lt;/strong&gt;: discovery service에 client로 등록&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fetch-registry&lt;/strong&gt;: 다른 서비스의 정보를 가져올 것&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;✅ &lt;strong&gt;서버 실행&lt;/strong&gt;
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/defb750a77ee7fe4a927fa382213c97a/caa30/2.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 42.35294117647059%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABYlAAAWJQFJUiTwAAABdElEQVR42nXR207CQBAG4D6gErGCgkRjvNHEwwuo4VAPQCDeqNH4ToqoYCj0RGiBHsCrtpD87ixp4caLLzO7s5nZbYWddBLnZ8c4PTnCwWEG6dwaUqkExOQ6xM2lLTGBLYorctkUcrtp7O9lkN0RsZ3agKAoCuROB6ZpYjr9xWQy5TxvEufEcVy4DF+zmud6sG0H9tjmkfaI8N1qof3zg36/HzMMAx02hCKtaZiiqHw9HA4xHo953uv1FueZ0WjEGtsQXJdNZhziODEqRjnVNU1jQ2TousFrAzbEYs2jszRk0ZA9gxLP89hzJv9SVQ2yLMOyLH5LujXFCO1TU6E/0GFaA4RhiPl8jtlsFqO9iO/78AMfQRCsCBGES3RGaLe/8fX1ic9mE433NzQ/GswH1+12QT+N0JM1dUll3zSqEfqeuq5DeHp8wNXlBUqFPKRiIVavVXFfr6F8e8NVK2WUpCsUSxcoMJKUj2uVu1tcl4p4fXnGH/krG4xhDY63AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;2&apos; title=&apos;&apos; src=&apos;/static/defb750a77ee7fe4a927fa382213c97a/ca1dc/2.png&apos; srcset=&apos;/static/defb750a77ee7fe4a927fa382213c97a/e7570/2.png 170w,
/static/defb750a77ee7fe4a927fa382213c97a/f46e7/2.png 340w,
/static/defb750a77ee7fe4a927fa382213c97a/ca1dc/2.png 680w,
/static/defb750a77ee7fe4a927fa382213c97a/02d09/2.png 1020w,
/static/defb750a77ee7fe4a927fa382213c97a/9d567/2.png 1360w,
/static/defb750a77ee7fe4a927fa382213c97a/caa30/2.png 2938w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;인스턴스가 정상적으로 등록&lt;/li&gt;
&lt;li&gt;현재는 &lt;strong&gt;port가 명시적으로 지정&lt;/strong&gt;되어 있기 때문에 &lt;strong&gt;Scale Out 시 여러 User Service 인스턴스를 등록할 수 없다.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-Random-Port-설정&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Random-Port-%EC%84%A4%EC%A0%95&quot; aria-label=&quot; Random Port 설정 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Random Port 설정&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;✅ 설정 파일&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;server&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  
  &lt;span class=&quot;token key atrule&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;  
&lt;span class=&quot;token key atrule&quot;&gt;spring&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  
  &lt;span class=&quot;token key atrule&quot;&gt;application&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  
    &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; user&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;service  
  
&lt;span class=&quot;token key atrule&quot;&gt;eureka&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  
  &lt;span class=&quot;token key atrule&quot;&gt;instance&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  
    &lt;span class=&quot;token key atrule&quot;&gt;instance-id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;spring.application.name&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;$&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;spring.application.instance_id&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;$&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;random.value&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;  
  &lt;span class=&quot;token key atrule&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  
    &lt;span class=&quot;token key atrule&quot;&gt;fetch-registry&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;  
    &lt;span class=&quot;token key atrule&quot;&gt;register-with-eureka&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;  
    &lt;span class=&quot;token key atrule&quot;&gt;service-url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  
      &lt;span class=&quot;token key atrule&quot;&gt;defaultZone&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; http&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;//localhost&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;8761/eureka&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;server.port : 0&lt;/strong&gt;: &lt;strong&gt;사용 가능한 포트를 자동 할당&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;instance-id&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Eureka는 기본적으로 &lt;code class=&quot;language-text&quot;&gt;host ip : service name : port&lt;/code&gt;를 기준으로 서비스 인스턴스를 등록&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;동일한 &lt;strong&gt;User Service를 여러 개 실행하면 위 값이 동일하여 문제 발생 가능&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;이를 해결하기 위해 &lt;code class=&quot;language-text&quot;&gt;instance-id&lt;/code&gt;를 고유한 값으로 설정하여 &lt;strong&gt;각 인스턴스를 개별적으로 인식&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;✅ 서버 실행&lt;/strong&gt;
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/aa3ec5da30d753116302cdd5c751450c/9ad8b/3.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 41.76470588235294%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABYlAAAWJQFJUiTwAAABbUlEQVR42nWRy07CUBCG+3q4wAoIYkhMXLCBF4BAaEFiNG4V44NBb0gpvdAr7NrC4vdcoOjCxZd/5p9zZk6nwm2tjG63jU6njYfHOmrNEirVK4jXJYjihRvx6sQlbt5VcN+sotWqo9EQUauWISwNA6qqwLZt7HY7xHHCiKK4iClhEDLiOGa1MIwQ+AF8AtU44r6gKApUTYPjOAW0ua4bTGnueVuY5hobkgekKb1o2w6+VyumjuOSAdwXkiRhU/nkqIAf4DGtrS0LhrGEZW2IF8JzPWy3fnHvfF5IYt6Qfu5+v/8X0zSh6Tp5rUde6TP1ff8PQRBAsF0L3tZBnuc4Ho+MA+VwYN6ZNEuRpimyPONk2SUmsDOkLuiGxn6KqqpYzOcMRVkwtdYWXLIfh+7JdtmuePwb7m3ISlzXhTD7eMew38NYHmE6kfH2+oLn6RMkaYCR1IM07mMkcySCPB6cvB7LqU4mQ0xkCV+fM/wAkwcaOa5alBcAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;3&apos; title=&apos;&apos; src=&apos;/static/aa3ec5da30d753116302cdd5c751450c/ca1dc/3.png&apos; srcset=&apos;/static/aa3ec5da30d753116302cdd5c751450c/e7570/3.png 170w,
/static/aa3ec5da30d753116302cdd5c751450c/f46e7/3.png 340w,
/static/aa3ec5da30d753116302cdd5c751450c/ca1dc/3.png 680w,
/static/aa3ec5da30d753116302cdd5c751450c/02d09/3.png 1020w,
/static/aa3ec5da30d753116302cdd5c751450c/9d567/3.png 1360w,
/static/aa3ec5da30d753116302cdd5c751450c/9ad8b/3.png 2940w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;두 user-service 인스턴스가 정상적으로 등록&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[상위 계층]]></title><description><![CDATA[상위 계층의 이해 OSI 7계층 모델에서 상위 계층인 세션 계층, 표현 계층, 응용 계층은 사용자 프로그램으로 구현되는데, 일반적으로 세 계층의 기능이 하나의 프로그램으로 묶여 구현된다. 계층 역할 세션 계층 (Session Layer,…]]></description><link>https://choiwonyu.github.io/상위 계층/</link><guid isPermaLink="false">https://choiwonyu.github.io/상위 계층/</guid><pubDate>Mon, 17 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;상위-계층의-이해&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%83%81%EC%9C%84-%EA%B3%84%EC%B8%B5%EC%9D%98-%EC%9D%B4%ED%95%B4&quot; aria-label=&quot;상위 계층의 이해 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;상위 계층의 이해&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;OSI 7계층 모델에서 &lt;strong&gt;상위 계층&lt;/strong&gt;인 세션 계층, 표현 계층, 응용 계층은 사용자 프로그램으로 구현되는데, 일반적으로 세 계층의 기능이 하나의 프로그램으로 묶여 구현된다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;계층&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;역할&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;세션 계층 (Session Layer, 5계층)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;통신 세션 관리 (연결 설정, 유지, 해제)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;표현 계층 (Presentation Layer, 6계층)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;데이터 변환, 압축, 암호화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;응용 계층 (Application Layer, 7계층)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;사용자와 네트워크 간 인터페이스 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&quot;세션-계층&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%84%B8%EC%85%98-%EA%B3%84%EC%B8%B5&quot; aria-label=&quot;세션 계층 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;세션 계층&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅ &lt;strong&gt;통신 세션을 설정, 유지, 해제하는 기능을 담당한다.&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;데이터 송수신 시 동기화를 수행하여, 중단 시 다시 연결할 수 있도록 지원한다.&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;응용 계층 간의 데이터 교환을 관리하며, 송수신 흐름을 제어한다.&lt;/strong&gt;  &lt;/p&gt;
&lt;h3 id=&quot;-세션-연결&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%84%B8%EC%85%98-%EC%97%B0%EA%B2%B0&quot; aria-label=&quot; 세션 연결 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 세션 연결&lt;/strong&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;기능&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;설명&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;세션 설정 (Session Establishment)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;응용 프로세스 간 통신 세션을 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;세션 유지 (Session Maintenance)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;오류 발생 시 재전송을 통해 연결 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;세션 해제 (Session Termination)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;통신이 끝나면 세션을 정상적으로 종료&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;-동기&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EB%8F%99%EA%B8%B0&quot; aria-label=&quot; 동기 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 동기&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;동기 기능은 통신 양단에서 서로 동의하는 논리적인 공통 처리 지점, 즉 동기점을 지정하기 위해 사용한다.&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;메시지 전송 과정에서 발생하는 오류를 복구하기 위해 동기점을 설정한다.&lt;/strong&gt;  &lt;/p&gt;
&lt;h3 id=&quot;-토큰&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%ED%86%A0%ED%81%B0&quot; aria-label=&quot; 토큰 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 토큰&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;세션 계층은 두 응용 프로세스의 대화를 관리하기 위해 토큰이라는 특수 메시지를 사용한다.&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 토큰의 종류&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;종류&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;역할&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;데이터 토큰&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;데이터를 전송할 수 있는 권리를 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;해제 토큰&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;통신 양단 간의 연결 해제 과정을 제어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;동기 토큰&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;동기 처리가 필요한 지점에 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;-동기-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EB%8F%99%EA%B8%B0-1&quot; aria-label=&quot; 동기 1 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 동기&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;세션 계층에서는 통신 중 오류가 발생할 경우를 대비해 동기화 지점을 설정한다.&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;동기화를 통해 중단된 데이터 전송을 특정 지점부터 다시 시작할 수 있다.&lt;/strong&gt;  &lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;동기화 방식&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;설명&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;일반 동기 (Minor Synchronization)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;작은 단위의 데이터 복구용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;주 동기 (Major Synchronization)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;전체 데이터 복구용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;-세션-연결-Session-Connection&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%84%B8%EC%85%98-%EC%97%B0%EA%B2%B0-Session-Connection&quot; aria-label=&quot; 세션 연결 Session Connection permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 세션 연결 (Session Connection)&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅ &lt;strong&gt;세션 계층에서 제공하는 연결은 응용 프로세스가 다른 응용 프로세스에 세션을 설정하기 위해 사용한다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 다중 세션 연결 서버&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;다수의 클라이언트 프로세스에 동시에 여러 세션 연결&lt;/strong&gt;을 설정할 수 있는 서버&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;멀티스레딩 또는 비동기 I/O 방식&lt;/strong&gt;을 사용해 다중 연결을 처리&lt;br&gt;
ex) 웹 서버, 게임 서버, 채팅 서버 등&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🔹 단일 세션 연결 서버&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;한 번에 하나의 클라이언트만 연결&lt;/strong&gt;할 수 있는 서버&lt;/li&gt;
&lt;li&gt;새로운 클라이언트가 연결 요청 시, 기존 연결을 종료하거나 대기&lt;br&gt;
ex) 텔넷, FTP 등&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;표현-계층&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%91%9C%ED%98%84-%EA%B3%84%EC%B8%B5&quot; aria-label=&quot;표현 계층 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;표현 계층&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅ &lt;strong&gt;응용 프로세스 사이 전송되는 메시지의 표현 방법을 다룬다.&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;송신 프로세스가 전달하는 의미를 수신 프로세스에서 정확히 이해할 수 있도록 한다.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;-데이터-표현&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%91%9C%ED%98%84&quot; aria-label=&quot; 데이터 표현 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 데이터 표현&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;네트워크에서 송수신되는 데이터를 응용 프로그램이 이해할 수 있도록 변환한다.&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;데이터 변환 작업을 수행하여, 서로 다른 시스템 간 호환성을 유지한다.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;-주요-변환-방식&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%A3%BC%EC%9A%94-%EB%B3%80%ED%99%98-%EB%B0%A9%EC%8B%9D&quot; aria-label=&quot; 주요 변환 방식 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;🔹 주요 변환 방식&lt;/strong&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;변환 방식&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;설명&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;예시&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;문자 인코딩 변환&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ASCII ↔ Unicode 변환&lt;/td&gt;
&lt;td&gt;다국어 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;파일 형식 변환&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JPEG ↔ PNG 변환&lt;/td&gt;
&lt;td&gt;이미지 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;데이터 구조 변환&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Big-endian ↔ Little-endian 변환&lt;/td&gt;
&lt;td&gt;CPU 구조 차이 해결&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;-데이터-압축&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%95%95%EC%B6%95&quot; aria-label=&quot; 데이터 압축 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 데이터 압축&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅ &lt;strong&gt;네트워크 대역폭을 절약하고 전송 속도를 향상시키기 위해 데이터를 압축한다.&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;압축 방식&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;설명&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;예시&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;무손실 압축&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;데이터 손실 없이 크기 축소&lt;/td&gt;
&lt;td&gt;ZIP, PNG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;손실 압축&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;품질 저하를 허용하며 크기 축소&lt;/td&gt;
&lt;td&gt;MP3, JPEG&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;손실 압축을 사용하는 이유는 &lt;strong&gt;비손실 압축에 비해 압축 데이터의 크기가 작기 때문&lt;/strong&gt;이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;응용-계층&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9D%91%EC%9A%A9-%EA%B3%84%EC%B8%B5&quot; aria-label=&quot;응용 계층 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;응용 계층&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;✅ &lt;strong&gt;하부 계층을 이용해 사용자에게 편리한 응용 환경을 제공한다.&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;운영체제에서 제공되는 계층 4의 인터페이스를 사용해 통신 기능을 구현한다.&lt;/strong&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[MSA 개요]]></title><description><![CDATA[소프트웨어 아키텍처 현재 많은 시스템이 탄력적이고 Cloud Native 환경으로 구축되어 있다.   📌 주요 특징 ✅ Auto scailing: 자동 확장성을 갖는다. 자동으로 인스턴스를 증가할 수 있는 환경이다. ✅ Microservices…]]></description><link>https://choiwonyu.github.io/MSA 개요/</link><guid isPermaLink="false">https://choiwonyu.github.io/MSA 개요/</guid><pubDate>Fri, 14 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;소프트웨어-아키텍처&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98&quot; aria-label=&quot;소프트웨어 아키텍처 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;소프트웨어 아키텍처&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;현재 많은 시스템이 탄력적이고 Cloud Native 환경으로 구축되어 있다.  &lt;/p&gt;
&lt;h3 id=&quot;-주요-특징&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%A3%BC%EC%9A%94-%ED%8A%B9%EC%A7%95&quot; aria-label=&quot; 주요 특징 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 주요 특징&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;Auto scailing&lt;/strong&gt;: 자동 확장성을 갖는다. 자동으로 인스턴스를 증가할 수 있는 환경이다.&lt;br&gt;
✅ &lt;strong&gt;Microservices&lt;/strong&gt;: 전체 서비스를 구축하고 있는 개별적인모듈이나 기능을 독립적으로 개발하고 배포하고 운영할 수 있도록 세분화된 서비스&lt;br&gt;
✅ &lt;strong&gt;Chaos engineering&lt;/strong&gt;: 시스템에 어떤 변동이나 불확실성에 대해서도 안정적인 서비스 제공&lt;br&gt;
✅ &lt;strong&gt;Continuous deployments&lt;/strong&gt;: 수많은 마이크로 서비스를 비리드하고 배포함에 있어 자동화된 시스템을 구축하고 하나의 작업에서 다른 작업으로 연계되는 과정을 파이프라인으로 연결&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;Cloud-Native&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Cloud-Native&quot; aria-label=&quot;Cloud Native permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Cloud Native&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;클라우드 환경을 최대한 활용하도록 설계된 시스템 아키텍처&lt;/strong&gt;를 의미한다.&lt;br&gt;
전통적인 온프레미스 환경과 달리, 클라우드 네이티브 아키텍처는 확장성, 탄력성, 자동화, 장애 복구 등을 중심으로 설계된다.&lt;/p&gt;
&lt;h3 id=&quot;-Architecture&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Architecture&quot; aria-label=&quot; Architecture permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Architecture&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;확장 가능한 아키텍쳐&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;시스템의 &lt;strong&gt;수평적 확정&lt;/strong&gt;에 유연&lt;/li&gt;
&lt;li&gt;확장된 서버로 &lt;strong&gt;시스템의 부하 분산, 가용성&lt;/strong&gt; 보장&lt;/li&gt;
&lt;li&gt;시스템 또는 서비스 애플리케이션 단위의 패키지&lt;/li&gt;
&lt;li&gt;모니터링&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;✅ &lt;strong&gt;탄력적 아키텍쳐&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;서비스 생성 - 통합 - 배포, 비즈니스 &lt;strong&gt;환경 변화에 대응 시간 단축&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;분할된 서비스 구조&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;서비스의 추가와 삭제 자동 감지&lt;/li&gt;
&lt;li&gt;변경된 서비스 요청에 따라 사용자 요청 처리(동적 처리)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;✅ &lt;strong&gt;장애 격리&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;특정 서비스에 오류가 발생해도 다른 서비스에 영향 주지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;Monolithic-vs-Microservice&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Monolithic-vs-Microservice&quot; aria-label=&quot;Monolithic vs Microservice permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Monolithic vs Microservice&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;-Monolithic&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Monolithic&quot; aria-label=&quot; Monolithic permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Monolithic&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;아키텍쳐&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;모든 업무로직이 하나의 애플리케이션 형태로 패키지 되어 서비스&lt;/li&gt;
&lt;li&gt;애플리케이션에서 사용하는 데이터가 한 곳에 모여 참조되어 서비스되는 형태&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;✅ &lt;strong&gt;장점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;개발의 간소화&lt;/li&gt;
&lt;li&gt;쉬운 테스트와 디버깅&lt;/li&gt;
&lt;li&gt;직관적인 배포&lt;/li&gt;
&lt;li&gt;운영의 단순성&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;✅ &lt;strong&gt;단점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;확장성의 한계&lt;/li&gt;
&lt;li&gt;유연성 부족&lt;/li&gt;
&lt;li&gt;유지 보수 어려움&lt;/li&gt;
&lt;li&gt;배포 주기 지연&lt;/li&gt;
&lt;li&gt;기술 선택의 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-Microservice&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Microservice&quot; aria-label=&quot; Microservice permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Microservice&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;아키텍쳐&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;애플리케이션을 여러 개의 독립적인 서비스로 나누어 개발, 배포, 운영&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;✅ &lt;strong&gt;장점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;확장성&lt;/li&gt;
&lt;li&gt;유지보수 용이&lt;/li&gt;
&lt;li&gt;빠른 배포&lt;/li&gt;
&lt;li&gt;기술 스택 유연성&lt;/li&gt;
&lt;li&gt;장애 격리&lt;/li&gt;
&lt;li&gt;분산 개발&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;✅ &lt;strong&gt;단점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;운영 복잡성&lt;/li&gt;
&lt;li&gt;데이터 일관성 유지 어려움&lt;/li&gt;
&lt;li&gt;네트워크 오버헤드&lt;/li&gt;
&lt;li&gt;분산 시스템 설계 필요&lt;/li&gt;
&lt;li&gt;테스트 및 디버깅 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;Microservice-Architecture란&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Microservice-Architecture%EB%9E%80&quot; aria-label=&quot;Microservice Architecture란 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Microservice Architecture란?&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;-특징&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%ED%8A%B9%EC%A7%95&quot; aria-label=&quot; 특징 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 특징&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ 서비스 간 독립성을 유지하여 &lt;strong&gt;개별 배포 및 확장이 가능&lt;/strong&gt;&lt;br&gt;
✅ API 통신 방식으로 &lt;strong&gt;REST API, gRPC, 메시지 큐(Kafka, RabbitMQ) 등 사용 가능&lt;/strong&gt;&lt;br&gt;
✅ 부하 분산(Load Balancing) 및 스케일링 자동화 지원  &lt;/p&gt;
&lt;h3 id=&quot;-언제-도입해야-하나&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%96%B8%EC%A0%9C-%EB%8F%84%EC%9E%85%ED%95%B4%EC%95%BC-%ED%95%98%EB%82%98&quot; aria-label=&quot; 언제 도입해야 하나 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 언제 도입해야 하나?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ MSA로 전환할만큼 시간과 비용이 있는가?&lt;br&gt;
✅ 서비스들이 독립적으로 개발, 운영될 수 있는 경계가 잘 만들어져 있는가?&lt;br&gt;
✅ 각 서비스들이 다른 서비스의 에러로부터 독립적인가?&lt;br&gt;
✅ 서비스들마다 최적화된 언어가 다른가?&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;SOA-vs-MSA&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#SOA-vs-MSA&quot; aria-label=&quot;SOA vs MSA permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;SOA vs MSA&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;-SOAService-Oriented-Architecture&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-SOAService-Oriented-Architecture&quot; aria-label=&quot; SOAService Oriented Architecture permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 SOA(Service-Oriented Architecture)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ 여러 개의 독립된 서비스를 상호작용하는 방식으로 구성&lt;br&gt;
✅ 각 서비스는 특정 비즈니스 기능을 수행하며, 이 서비스들을 조합하여 더 큰 시스템이나 애플리케이션을 구성&lt;/p&gt;
&lt;h3 id=&quot;-차이점&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%B0%A8%EC%9D%B4%EC%A0%90&quot; aria-label=&quot; 차이점 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 차이점&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;서비스의 공유 지향점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SOA: &lt;strong&gt;재사용을 통한 비용 절감&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;MSA: 서비스 간의 결합도를 낮춰 &lt;strong&gt;변화에 능동적으로 대응&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;✅ &lt;strong&gt;기술 방식&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SOA: &lt;strong&gt;공통의 서비스를 ESB(Enterprise Service Bus)에 모아&lt;/strong&gt; 사업 측면에서 공통 서비스 형식으로 서비스 제공&lt;/li&gt;
&lt;li&gt;MSA: 각 독립된 서비스가 노출된 REST API, gRPC 등을 사용해 통신&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;✅ &lt;strong&gt;서비스 크기&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SOA: 비교적 크고 통합된 서비스&lt;/li&gt;
&lt;li&gt;MSA: 작은 단위의 독립적인 서비스&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;MSA-구성요소&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#MSA-%EA%B5%AC%EC%84%B1%EC%9A%94%EC%86%8C&quot; aria-label=&quot;MSA 구성요소 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;MSA 구성요소&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;-External-GatewayAPI-Gateway&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-External-GatewayAPI-Gateway&quot; aria-label=&quot; External GatewayAPI Gateway permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 External Gateway(API Gateway)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;외부 클라이언트와 내부 마이크로서비스 간의 중간 관문 역할&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;클라이언트는 서비스로 직접 접근하지 않고 API Gateway를 통해 요청&lt;/strong&gt;
ex) Spring Cloud Gateway, AWS API Gateway&lt;/p&gt;
&lt;h3 id=&quot;-Service-Mesh&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Service-Mesh&quot; aria-label=&quot; Service Mesh permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Service Mesh&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;마이크로서비스 간 통신을 관리하는 인프라 계층&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;내부 서비스 간 통신을 관리&lt;/strong&gt;&lt;br&gt;
ex) AWS App Mesh&lt;/p&gt;
&lt;h3 id=&quot;-Runtime-Platform&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Runtime-Platform&quot; aria-label=&quot; Runtime Platform permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Runtime Platform&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;마이크로서비스를 실행하고 운영하는 환경으로, 컨테이너 오케스트레이션과 배포 담당&lt;/strong&gt;&lt;br&gt;
ex) Docker, K8s&lt;/p&gt;
&lt;h3 id=&quot;-CICD-Automation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-CICD-Automation&quot; aria-label=&quot; CICD Automation permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 CI/CD Automation&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;마이크로서비스의 지속적 빌드, 배포를 자동화하는 시스템&lt;/strong&gt;&lt;br&gt;
ex) Jenkins, Github Actions&lt;/p&gt;
&lt;h3 id=&quot;-Backing-Services&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Backing-Services&quot; aria-label=&quot; Backing Services permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Backing Services&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;마이크로서비스가 의존하는 외부 데이터 저장소, 메시지 큐, 캐시, 인증 서비스 등 모든 인프라 서비스&lt;/strong&gt;&lt;br&gt;
ex) MySQL, DynamoDB, Kafka, Redis&lt;/p&gt;
&lt;h3 id=&quot;-Telemetry&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-Telemetry&quot; aria-label=&quot; Telemetry permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 Telemetry&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;마이크로서비스의 상태를 추적하고 모니터링&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;로그 분석, 분산 트레이싱, 성능 모니터링 등&lt;/strong&gt;&lt;br&gt;
ex) ELK Stack, Zipkin, Prometheus + Grafana&lt;/p&gt;</content:encoded></item><item><title><![CDATA[전송 계층]]></title><description><![CDATA[📌 전송 계층의 기능 주요 기능 전송 계층은 프로세스 간(end-to-end) 통신을 지원하며, 주요 기능은 다음과 같다. 기능 설명 세그먼트화(Segmentation) 및 재조립(Reassembly…]]></description><link>https://choiwonyu.github.io/전송 계층/</link><guid isPermaLink="false">https://choiwonyu.github.io/전송 계층/</guid><pubDate>Thu, 13 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;-전송-계층의-기능&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%A0%84%EC%86%A1-%EA%B3%84%EC%B8%B5%EC%9D%98-%EA%B8%B0%EB%8A%A5&quot; aria-label=&quot; 전송 계층의 기능 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 전송 계층의 기능&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;주요-기능&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A3%BC%EC%9A%94-%EA%B8%B0%EB%8A%A5&quot; aria-label=&quot;주요 기능 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;주요 기능&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;전송 계층은 &lt;strong&gt;프로세스 간(end-to-end) 통신을 지원&lt;/strong&gt;하며, 주요 기능은 다음과 같다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;세그먼트화(Segmentation) 및 재조립(Reassembly)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;데이터를 작은 단위(세그먼트)로 나누고, 수신 측에서 원래 데이터로 복원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;오류 제어(Error Control)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;데이터 손상 및 손실을 감지하고 필요 시 재전송 수행 (TCP)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;흐름 제어(Flow Control)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;송신 속도를 조절하여 수신 측 과부하 방지 (TCP 슬라이딩 윈도우)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;서비스 프리미티브&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;전송 계층 사용자가 전송 계층 서비스를 사용하기 위한 인터페이스&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;전송 계층은 신뢰성이 필요한 경우 TCP, 빠른 전송이 필요한 경우 UDP를 사용한다.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;설계-시-고려-사항&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%84%A4%EA%B3%84-%EC%8B%9C-%EA%B3%A0%EB%A0%A4-%EC%82%AC%ED%95%AD&quot; aria-label=&quot;설계 시 고려 사항 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;설계 시 고려 사항&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;전송 계층 설계 시 다음 요소를 고려해야 한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(1) 주소 표현&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TSAP(Transport Service Access Point)는 &lt;strong&gt;전송 계층에서 프로세스를 식별하는 주소&lt;/strong&gt;이다.&lt;/li&gt;
&lt;li&gt;TSAP는 일반적으로 &lt;strong&gt;호스트의 IP 주소와 포트 번호의 조합&lt;/strong&gt;으로 표현되며, 특정 애플리케이션으로 데이터를 전달하는 역할을 한다.&lt;br&gt;
ex) 웹 서버의 IP가 203.0.113.10이고, 포트가 443(HTTPS)이라면, 이 조합이 TSAP를 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;(2) 멀티플렉싱&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;여러 개의 애플리케이션 프로세스가 하나의 네트워크 연결을 공유&lt;/strong&gt;하도록 하는 기술이다.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;상방향 멀티플렉싱&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;여러 클라이언트(송신 호스트)가 하나의 서버(수신 호스트)에게 데이터 전송&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;하방향 멀티플렉싱&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;하나의 서버(송신 호스트)가 여러 클라이언트(수신 호스트)에게 데이터 전송&lt;br&gt;
ex) 서버가 여러 클라이언트에 비디오 스트리밍 전송&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;(3) 연결 설정&lt;/strong&gt;    &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;연결 설정&lt;/strong&gt;&lt;br&gt;
1️⃣ &lt;strong&gt;클라이언트 → 서버 : SYN(x) 전송 (연결 요청)&lt;/strong&gt;&lt;br&gt;
2️⃣ &lt;strong&gt;서버 → 클라이언트 : SYN(y) + ACK(x+1) 응답 (연결 수락 및 확인)&lt;/strong&gt;&lt;br&gt;
3️⃣ &lt;strong&gt;클라이언트 → 서버 : ACK(y+1) 전송 (연결 완료)&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;이 과정에서 오류가 발생하면 재전송이 수행되며, 네트워크 상태에 따라 여러 번 반복될 수 있다.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;연결 해제&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;일방적 연결 해제&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;한쪽 프로세스&lt;/strong&gt;에서 연결을 해제&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;점진적 연결 해제&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;양쪽 프로세스&lt;/strong&gt; 모두에서 연결을 해제&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;✅ &lt;strong&gt;인터넷에서 네트워크 계층의 기능을 제공하는 프로토콜은 IP이다.&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;IP 프로토콜 위에서 실행되는 전송 계층 프로토콜은 서비스의 유형에 따라 TCP와 UDP로 구분된다.&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;TCP는 연결형 서비스를 지원하는 프로토콜이고, UDP는 비연결형 서비스를 지원하는 프로토콜이다.&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;TCP와 UDP를 선택할 때는 단순히 신뢰성이나 연결 유무의 차이 뿐만 아니라 응용 프로그램의 구축에 어떤 영향을 끼치는지 이해해야 한다.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;-TCP의-헤더-구조&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-TCP%EC%9D%98-%ED%97%A4%EB%8D%94-%EA%B5%AC%EC%A1%B0&quot; aria-label=&quot; TCP의 헤더 구조 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 TCP의 헤더 구조&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;🔹 &lt;strong&gt;TCP 주요 기능&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;연결형 서비스&lt;/strong&gt; 제공&lt;/li&gt;
&lt;li&gt;전이중 방식의 &lt;strong&gt;양방향 가상 회선&lt;/strong&gt; 제공&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;신뢰성 있는 데이터 전송&lt;/strong&gt;을 보장&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;TCP-헤더-구조&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#TCP-%ED%97%A4%EB%8D%94-%EA%B5%AC%EC%A1%B0&quot; aria-label=&quot;TCP 헤더 구조 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;TCP 헤더 구조&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;TCP는 신뢰성을 보장하기 위해 &lt;strong&gt;20~60바이트의 헤더를 포함&lt;/strong&gt;하며, 주요 필드는 다음과 같다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;| Source Port | Destination Port |
| Sequence Number |
| Acknowledgment Number |
| Data Offset | Reserved | Flags | Window Size |
| Checksum | Urgent Pointer |
| Options (Optional) | Data |&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;🔹 &lt;strong&gt;TCP 헤더 필드 설명&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;필드&lt;/th&gt;
&lt;th&gt;크기&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Source/Destination Port&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;16비트&lt;/td&gt;
&lt;td&gt;송신자/수신자의 포트 번호&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sequence Number&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;32비트&lt;/td&gt;
&lt;td&gt;데이터 순서 보장을 위한 순서 번호&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Acknowledgment Number&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;32비트&lt;/td&gt;
&lt;td&gt;수신 확인(ACK)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Flags&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;9비트&lt;/td&gt;
&lt;td&gt;SYN, ACK, FIN 등 제어 플래그&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Window Size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;16비트&lt;/td&gt;
&lt;td&gt;흐름 제어를 위한 윈도우 크기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Checksum&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;16비트&lt;/td&gt;
&lt;td&gt;오류 검출&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;-포트-번호&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%ED%8F%AC%ED%8A%B8-%EB%B2%88%ED%98%B8&quot; aria-label=&quot; 포트 번호 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 포트 번호&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;포트 번호는 &lt;strong&gt;프로세스를 구분하는 주소 역할을 수행&lt;/strong&gt;한다.&lt;/p&gt;
&lt;p&gt;🔹 &lt;strong&gt;Well-known 포트 예시&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;프로토콜&lt;/th&gt;
&lt;th&gt;포트 번호&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HTTP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;웹 페이지 전송&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HTTPS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;443&lt;/td&gt;
&lt;td&gt;보안 웹 페이지 전송&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FTP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;파일 전송&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SSH&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;원격 로그인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DNS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;53&lt;/td&gt;
&lt;td&gt;도메인 이름 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;🔹 &lt;strong&gt;포트 번호 범위&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;0~1023: &lt;strong&gt;Well-known 포트&lt;/strong&gt; (HTTP, FTP 등)&lt;/li&gt;
&lt;li&gt;1024~49151: &lt;strong&gt;Registered 포트&lt;/strong&gt; (앱 개발자가 등록 가능)&lt;/li&gt;
&lt;li&gt;49152~65535: &lt;strong&gt;Dynamic 포트&lt;/strong&gt; (임시 포트)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-TCP의-동작-원리&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-TCP%EC%9D%98-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC&quot; aria-label=&quot; TCP의 동작 원리 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 TCP의 동작 원리&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;연결-설정-3-Way-Handshake&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%97%B0%EA%B2%B0-%EC%84%A4%EC%A0%95-3-Way-Handshake&quot; aria-label=&quot;연결 설정 3 Way Handshake permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;연결 설정 (3-Way Handshake)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/4b3bb1ce93e38a67fc1c938a9373774e/9bae8/3-way-handshake.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 62.35294117647059%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAACEElEQVR42o2TXY+aQBSG9///hvqVbdpue7VpetO9aJrNJtuq66qAoEEEEQUXBkS+1bdnJmvUTZt0ksPADDycc953rkBjt9vjYbzCveYhihO+hMPhgOl0iuVyKWK1WkHXdTEfh+0xfJFifJN95Fkq1q74JcsLvGsz1IY79EZT2HMT1nwuAKZpwnVdOI6DxWIh5iVBTWOKm6/fURsBH5UMmyi8BLZ6IVpSBX3h4Zg1z/Jvwff4GIxnqEt7fJZTRCE7AVMCNroMzWEJ3XbFxp4+/Nc47vU1QwA/SSlYEJwBsxz1DqMMS2gzG/tdhbwokCQJitc5z3MR2+0WaZqhoJ61hxoa8oGACYLAPwETeqHWDvB+dMCPhzaen7qiX6qqwjAMMXueB8uyoGka9dXCWFVwd/8LLd7DIQH9N8A6Aa+VPX4+duEs5vCpBMaYiCiKEMexCJ5hFG2QJVv8HqinDP2XE3DLgV0mRDGc9X/3cDAxUX8FsouSqYcN3kP5BDxX9fz5HCjptgDekMohC96o3AkE0HQZqrKg0hJUVSWE4KKUZUlipMgy8twm5r+AZrlUMtlGIduc+5ADm0+UobKD7rzAtkxIsiyEmJPBJ5OJuOcm5yLxvZBK7I1NYewPlOGFsfOixHXHQ7Of4FnV4a2WdDo8rNdrskMgxNhsNgjDED6pyddmdCwfu33cSgx3ikcVFAL4B62ugTZJ4mVsAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;3 way handshake&apos; title=&apos;&apos; src=&apos;/static/4b3bb1ce93e38a67fc1c938a9373774e/ca1dc/3-way-handshake.png&apos; srcset=&apos;/static/4b3bb1ce93e38a67fc1c938a9373774e/e7570/3-way-handshake.png 170w,
/static/4b3bb1ce93e38a67fc1c938a9373774e/f46e7/3-way-handshake.png 340w,
/static/4b3bb1ce93e38a67fc1c938a9373774e/ca1dc/3-way-handshake.png 680w,
/static/4b3bb1ce93e38a67fc1c938a9373774e/02d09/3-way-handshake.png 1020w,
/static/4b3bb1ce93e38a67fc1c938a9373774e/9bae8/3-way-handshake.png 1330w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
1️⃣ &lt;strong&gt;클라이언트 → 서버 : SYN 전송&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP 헤더의 SYN 플래그를 지정&lt;/li&gt;
&lt;li&gt;임의의 순서 번호(10) 설정  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2️⃣ &lt;strong&gt;서버 → 클라이언트 : SYN-ACK 응답&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;다음 수신에 대한 데이터의 순서 번호&lt;/strong&gt;(10 + 1)를 Acknowledgment Number에 표시&lt;/li&gt;
&lt;li&gt;임의의 순서 번호 설정(50)&lt;/li&gt;
&lt;li&gt;이때 전송 &lt;strong&gt;데이터와 응답 데이터를 함께 전송하는 피기배킹&lt;/strong&gt; 기능 사용   &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3️⃣ &lt;strong&gt;클라이언트 → 서버 : ACK 전송 (연결 완료)&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;Fast-Open&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Fast-Open&quot; aria-label=&quot;Fast Open permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Fast Open&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;TCP 연결이 완전히 열리기 전 데이터를 전송할 수 있게 해주는 기능&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🔹 동작 방식&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;서버는 클라이언트에게 TFO 쿠키 발급&lt;/li&gt;
&lt;li&gt;클라이언트는 쿠기 저장&lt;/li&gt;
&lt;li&gt;다음 서버 연결 시 SYN 패킷에 TFO 쿠키와 데이터를 함께 실어 전송&lt;/li&gt;
&lt;li&gt;서버는 쿠키를 확인하고, handshake 도중에 데이터를 수신/처리 가능&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;흐름 요약&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[최초 연결]
클라이언트 → 서버: SYN
서버 → 클라이언트: SYN-ACK + TFO 쿠키 발급

[이후 연결]
클라이언트 → 서버: SYN + DATA + TFO 쿠키
서버 → 클라이언트: SYN-ACK
(서버는 쿠키 확인 후 DATA 즉시 수신/처리 시작)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;데이터-전송&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%86%A1&quot; aria-label=&quot;데이터 전송 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;데이터 전송&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/203606acdbe9306cc9bf221909ddcea3/e7c3c/data.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 64.70588235294117%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAACE0lEQVR42m1T207bQBDl/9+qvkAlpCKh0ucWVMoXtKVUIim5kDRxHGIlvu7Nie21fbqzxsRBWJrM7mx0dM6cmSOYL5QZ/jwpuPEO3a+qKmitbRRF8VKv6yZHcocvA4GbMUeWN+9H9PNzofDuTuNyJMFZgiiKwRiH7/twXRee52G5XCJNUyilwDiHEgy/Rw5OHyqcDzUSofaAt0uFD39rfHtUKHUBXZbI89wyK825m5t6aWhWmHoJPg4qXAxzxFzuAX8tBE76NS6HHDyJkWWZZbdery07OodhiM1mgyAIjHxt+qHxb81wNqjxaZAjSkRHssNx0qtxNRQQRnJmWBAT6htFy7C903tZZHj04g4gPwQ87lVWMkkhgCRJwE2v4jg2PY0sO2JJdyGITYWJlWwAH3KEbwKOFQRnxhBmpREAZZJMgJQpAlNncYS70QJnQ1jANxleT7aWYTsyr6M280JRls1/nEA1DAfFYQ9bU67GEqG/sbJmsxkcx8F8PrejQ2eq0Xm18szYcIyfooYhAbLXgD0amxS7VL2YQKza3A16R1Vi7gtryoUBPBibW1cZwArfp3vJJK11mHLrspX+vDFulBqGNT6PNJhM94A/zKa8v6/x9dkUIaU1hrajO4t0J6Ok2RbalPvpEqd9jfP+Dlxu94CLUOFmItFfCTOvhd0EYkQsu2a0d3on5irdYuorzANp6wT4HzSP1mb8puPuAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;data&apos; title=&apos;&apos; src=&apos;/static/203606acdbe9306cc9bf221909ddcea3/ca1dc/data.png&apos; srcset=&apos;/static/203606acdbe9306cc9bf221909ddcea3/e7570/data.png 170w,
/static/203606acdbe9306cc9bf221909ddcea3/f46e7/data.png 340w,
/static/203606acdbe9306cc9bf221909ddcea3/ca1dc/data.png 680w,
/static/203606acdbe9306cc9bf221909ddcea3/02d09/data.png 1020w,
/static/203606acdbe9306cc9bf221909ddcea3/9d567/data.png 1360w,
/static/203606acdbe9306cc9bf221909ddcea3/e7c3c/data.png 1448w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
TCP는 &lt;strong&gt;시퀀스 번호와 ACK를 통해 패킷 순서를 유지&lt;/strong&gt;한다.  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;세 번째 세그먼트부터 데이터 전송이 이뤄진다.&lt;/li&gt;
&lt;li&gt;A 프로세스는 순서 번호 11번부터 5바이트의 데이터를 전송하고, B 프로세스는 순서 번호 51부터 10바이트의 데이터를 전송한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TCP는 &lt;strong&gt;NAK를 사용하지 않는다.&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;다음에 수신할 데이터 번호를 Acknowledgment Number로 하여 ACK을 보낸다.&lt;/li&gt;
&lt;li&gt;ACK을 받지 못한 송신자는 해당 데이터의 세그먼트를 재전송한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;연결-해제-4-Way-Handshake&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%97%B0%EA%B2%B0-%ED%95%B4%EC%A0%9C-4-Way-Handshake&quot; aria-label=&quot;연결 해제 4 Way Handshake permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;연결 해제 (4-Way Handshake)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/6042cdf1f3cb84914ec1cd20d4b37cdf/84e61/4-way-handshake.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 66.47058823529413%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAACEElEQVR42o1TTW/TQBTs/7/2UFH1hopAQdwKKFwaEBLigOo4bWhLEydx7Pgj/tj1V+LYw3ubbNJCkVjpybtre3bmzewRaPzyJbq3CYaupFXLW6hWK5Rliaqq1HNF6zzPVbXt9pu63uDTvcRLI8Odl6m9I2CDy1GGYwO4uBUQaYw0FXAcB9PpFLZtYzabYT6fw7IsjMdjhGGIJElgTaZ4dRXjxGzRd/ID4NdJjrMh0KXT0GzUCykllsslgaf7p+d5aJpGFY+S2L+9FnjRb2C6GrDd4Ms4U4DvhzFEQiXknhUzXCwWas57rusijmPU6zUEHdoxd4DOI8DPowNgFAYKUAiBLMsUU927oijUmvd5HsUJ3vSTHaDuYVujN5I4uwE+/kwJv96aQnI0iAbkQ+p6+55HQWYpQPOJ5BqXD1Ix/ECAaRwpFtx4lhpFEYIgUMVrlsv95G+syQTnP0KckimPJBOgZkguozkw+Ndod8+yrJ5jSLF50D1MkCaRksuxYSN0dNhhjgxHh9lxNmOKTsdM/3a5tzPlggBD34OkpnPOWJ6uJ2uas+yA2tIZPBubXEnu3mf7HP6P5Gq1xrubHKcEOFgUh2D3CPDkmky5y1AVubpmzIAlc+50Flm+7/vkfImS3Pf9AK9NieOrBsZ8f1NaGLbAuSHw3UoVYEYR0Rnk4rj8WeomkeSBneAb/ReKUgH+BrQh0HPGkWtXAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;4 way handshake&apos; title=&apos;&apos; src=&apos;/static/6042cdf1f3cb84914ec1cd20d4b37cdf/ca1dc/4-way-handshake.png&apos; srcset=&apos;/static/6042cdf1f3cb84914ec1cd20d4b37cdf/e7570/4-way-handshake.png 170w,
/static/6042cdf1f3cb84914ec1cd20d4b37cdf/f46e7/4-way-handshake.png 340w,
/static/6042cdf1f3cb84914ec1cd20d4b37cdf/ca1dc/4-way-handshake.png 680w,
/static/6042cdf1f3cb84914ec1cd20d4b37cdf/02d09/4-way-handshake.png 1020w,
/static/6042cdf1f3cb84914ec1cd20d4b37cdf/9d567/4-way-handshake.png 1360w,
/static/6042cdf1f3cb84914ec1cd20d4b37cdf/84e61/4-way-handshake.png 1566w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
1️⃣ &lt;strong&gt;클라이언트 → 서버 : FIN 전송&lt;/strong&gt;&lt;br&gt;
2️⃣ &lt;strong&gt;서버 → 클라이언트 : ACK, 데이터 전송&lt;/strong&gt;&lt;br&gt;
3️⃣ &lt;strong&gt;클라이언트 → 서버 : ACK 전송&lt;/strong&gt;&lt;br&gt;
4️⃣ &lt;strong&gt;서버 → 클라이언트 : FIN 전송&lt;/strong&gt;&lt;br&gt;
5️⃣ &lt;strong&gt;클라이언트 → 서버 : ACK 전송(연결 종료)&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;연결 해제는 양쪽 프로세스의 동의하에 진행된다.&lt;/p&gt;
&lt;h3 id=&quot;TIME_WAIT&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#TIME_WAIT&quot; aria-label=&quot;TIME_WAIT permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;TIME_WAIT&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;✅ TCP 연결을 종료할 때, 연결이 잠시 기다리는 상태&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 종료 과정&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;클라이언트 → 서버 : &lt;code class=&quot;language-text&quot;&gt;FIN&lt;/code&gt;    &lt;/li&gt;
&lt;li&gt;서버 → 클라이언트 : &lt;code class=&quot;language-text&quot;&gt;ACK&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;서버 → 클라이언트 : &lt;code class=&quot;language-text&quot;&gt;FIN&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;클라이언트 → 서버 : &lt;code class=&quot;language-text&quot;&gt;ACK&lt;/code&gt; → 여기서 클라이언트는 &lt;strong&gt;TIME_WAIT&lt;/strong&gt; 상태 진입해 일정 시간 기다렸다가 연결 종료&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🔹 목적&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;지연된 패킷이 네트워크 상에 떠돌 경우 대비
-&gt; 다른 연결로 진행될 경우 지연 패킷이 뒤늦게 도달해 문제 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🔹 TIME_WAIT 짧을 경우 문제&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이전 연결이 완전히 종료되지 않은 상태에서 새 연결 요청이 갈 수 있다.
-&gt; RST 오류  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이러한 경우, 연결 재사용 방식을 개선하거나 커널 설정 조절이 필요하다.&lt;/p&gt;
&lt;h3 id=&quot;Keep-Alive&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Keep-Alive&quot; aria-label=&quot;Keep Alive permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;Keep-Alive&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;✅ TCP 연결이 끊겼는지 확인하기 위해, 유휴 상태에서도 주기적으로 &quot;확인 메시지&quot;를 보내는 메커니즘&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ 애플리케이션 레벨이 아니라, 운영체제(OS)와 소켓 레벨에서 동작&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 필요성&lt;/strong&gt;&lt;br&gt;
다음과 같은 상황에선 연결을 끊어버린다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;네트워크 연결 끊김&lt;/li&gt;
&lt;li&gt;상대방 프로세스가 죽음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;연결을 끊지 않으면, 응답이 없는 채로 무한정 대기가 발생&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔹 동작 방식&lt;/strong&gt;  &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;소켓이 유휴 상태로 일정 시간 동안 아무 데이터도 주고받지 않으면&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;OS가 &lt;strong&gt;Keep-Alive probe&lt;/strong&gt;라는 패킷을 상대방에게 보냄&lt;/li&gt;
&lt;li&gt;상대방이 응답하면 → 연결 유지&lt;/li&gt;
&lt;li&gt;응답이 없으면 → 일정 횟수 후 연결 종료&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;🔹 HTTP와 비교&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ HTTP의 Keep-Alive는 연결을 재사용하기 위함&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ TCP의 Keep-Alive는 OS 수준에서, 연결이 끊어졌는지 확인하기 위함&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;HTTP Keep-Alive&lt;/th&gt;
&lt;th&gt;TCP Keep-Alive&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;레벨&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;애플리케이션 계층&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;전송 계층 (OS/커널)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;목적&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;연결 재사용 (성능 향상)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;연결 생존 여부 확인 (오류 감지)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;유지 시간&lt;/td&gt;
&lt;td&gt;짧음 (몇 초~분)&lt;/td&gt;
&lt;td&gt;김 (기본 2시간)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;설정 위치&lt;/td&gt;
&lt;td&gt;HTTP 헤더 / 웹 서버&lt;/td&gt;
&lt;td&gt;커널 / 소켓 옵션&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;대상&lt;/td&gt;
&lt;td&gt;브라우저 ↔ 서버 등&lt;/td&gt;
&lt;td&gt;모든 TCP 연결 (DB, HTTP 등 포함)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-UDP-프로토콜&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-UDP-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C&quot; aria-label=&quot; UDP 프로토콜 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 UDP 프로토콜&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;UDP-헤더-구조&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#UDP-%ED%97%A4%EB%8D%94-%EA%B5%AC%EC%A1%B0&quot; aria-label=&quot;UDP 헤더 구조 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;UDP 헤더 구조&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;🔹 UDP 주요 기능&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;비연결형 서비스를 제공&lt;/strong&gt;  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;헤더와 전송 데이터에 대한 체크섬 기능 제공&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Best Effort 전달 방식 지원&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;전송한 데이터그램이 목적지까지 제대로 도착했는지 확인하지 않는다.&lt;/li&gt;
&lt;li&gt;데이터 전송 시간에 민감한 응용 환경에서 유리하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;| Source Port | Destination Port | 
| Length | Checksum | 
| Data |&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;필드&lt;/th&gt;
&lt;th&gt;크기&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Source/Destination Port&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;16비트&lt;/td&gt;
&lt;td&gt;송신자/수신자의 포트 번호&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Length&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;16비트&lt;/td&gt;
&lt;td&gt;UDP 데이터그램의 전체 길이&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Checksum&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;16비트&lt;/td&gt;
&lt;td&gt;오류 검출&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;UDP의-데이터그램-전송&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#UDP%EC%9D%98-%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B7%B8%EB%9E%A8-%EC%A0%84%EC%86%A1&quot; aria-label=&quot;UDP의 데이터그램 전송 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;UDP의 데이터그램 전송&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;흐름 제어 및 오류 검출 없이 패킷을 빠르게 전송&lt;/strong&gt;한다.&lt;br&gt;
&lt;strong&gt;✅ 흐름 제어 및 오류 검출 기능이 없으므로, 응용 프로그램에서 다음과 같은 기능을 직접 구현해야 한다.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;데이터그램 분실 감지:&lt;/strong&gt; 수신 측에서 응답을 보내거나, 별도의 확인 메시지를 통해 패킷 손실 여부를 확인&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;데이터그램 순서 관리:&lt;/strong&gt; 각 패킷에 순서 번호를 추가하여, 수신 측에서 올바른 순서로 데이터를 정렬&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;단계&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1️⃣&lt;/td&gt;
&lt;td&gt;송신자가 데이터그램을 전송&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2️⃣&lt;/td&gt;
&lt;td&gt;수신자가 데이터그램을 수신&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3️⃣&lt;/td&gt;
&lt;td&gt;패킷 손실 발생 시 재전송 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-RTP-프로토콜&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-RTP-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C&quot; aria-label=&quot; RTP 프로토콜 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 RTP 프로토콜&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;실시간-요구-사항&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%8B%A4%EC%8B%9C%EA%B0%84-%EC%9A%94%EA%B5%AC-%EC%82%AC%ED%95%AD&quot; aria-label=&quot;실시간 요구 사항 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;실시간 요구 사항&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;RTP(Real-time Transport Protocol)는 오디오/비디오 전송을 위한 프로토콜&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;기존 UDP에 데이터그램의 순서 번호 기능을 추가&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;실시간 데이터 전송에서 가장 중요한 것은 전송 시간&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;🔹 &lt;strong&gt;버퍼&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;RTP에서 버퍼는 패킷 간격을 일정하게 유지하여 안정적인 스트리밍을 가능하게 한다.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;패킷이 네트워크에서 불규칙한 간격으로 도착할 경우, 일정한 간격으로 데이터를 재생하기 위해 버퍼를 사용&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;버퍼 크기가 클수록 안정성이 증가하지만, 초기 지연(latency)이 증가할 수 있음&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;실시간성이 중요한 경우, 버퍼 크기를 최소화해야 한다.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🔹 &lt;strong&gt;지터(Jitter)&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Jitter(지터)는 패킷 도착 시간의 변동을 의미하며, 네트워크 혼잡이나 경로 변경으로 인해 발생한다.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;지터가 심하면 오디오/비디오 끊김 현상이 발생할 수 있다.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RTP는 지터 버퍼(jitter buffer)를 사용하여 안정적인 재생을 지원한다.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;RTP의-데이터-전송&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#RTP%EC%9D%98-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%86%A1&quot; aria-label=&quot;RTP의 데이터 전송 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;RTP의 데이터 전송&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;UDP 기반으로 동작하여 빠른 전송 속도를 보장&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ 데이터그램 분실이나 도착 순서 변경과 같은 전송 오류를 해결&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;믹서&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;여러 RTC 데이터 그램을 하나로 결합&lt;/li&gt;
&lt;li&gt;다중 사용자 오디오/비디오 스트림 결합&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;장점&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;대역폭 절약, 다중 사용자 처리 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;단점&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;믹싱으로 인해 지연 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;트랜슬레이터&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RTP 데이터그램을 하나 이상의 출력용 RTP 데이터그램으로 만들어주는 장치&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;RTP-헤더-구조&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#RTP-%ED%97%A4%EB%8D%94-%EA%B5%AC%EC%A1%B0&quot; aria-label=&quot;RTP 헤더 구조 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;RTP 헤더 구조&lt;/strong&gt;&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;| Version | Padding | Extension | CC | Marker | Payload Type | 
| Sequence Number | Timestamp | 
| SSRC | CSRC (Optional) |&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;필드&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Version&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;RTP의 버전 번호이며, 현재 2로 지정된다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sequence Number&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;패킷의 순서를 유지하고, 손실된 패킷을 감지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Timestamp&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;RTP 페이로드에 포함된 데이터의 생성 시기를 나타낸다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;RTP-제어-프로토콜-RTCP&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#RTP-%EC%A0%9C%EC%96%B4-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C-RTCP&quot; aria-label=&quot;RTP 제어 프로토콜 RTCP permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;RTP 제어 프로토콜 (RTCP)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;RTCP는 RTP 스트림을 모니터링하고, 품질을 보장하기 위해 사용된다.&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;주요 기능&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;QoS와 혼잡 제어: 송수신 프로세스가 관련 보고서를 작성한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;송신 프로세스: 전송률 등의 정보&lt;/li&gt;
&lt;li&gt;수신 프로세스: 수신 과정에서 발생하는 패킷 분실이나 지터 등의 정보&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;세션 크기: 세션 참가자들 사이에 RTCP 패킷이 주기적으로 전송된다.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[네트워크 계층]]></title><description><![CDATA[네트워크 계층은 패킷을 목적지까지 전달하는 역할을 담당한다.
이를 위해 IP 주소 체계, 이동 중 IP 유지, 네트워크 상태를 제어하는 다양한 프로토콜을 사용한다. IPv6 프로토콜 ✅ IPv6는 기존 IPv…]]></description><link>https://choiwonyu.github.io/네트워크 계층/</link><guid isPermaLink="false">https://choiwonyu.github.io/네트워크 계층/</guid><pubDate>Tue, 11 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;네트워크 계층은 패킷을 목적지까지 전달하는 역할을 담당한다.
이를 위해 IP 주소 체계, 이동 중 IP 유지, 네트워크 상태를 제어하는 다양한 프로토콜을 사용한다.&lt;/p&gt;
&lt;h2 id=&quot;IPv6-프로토콜&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#IPv6-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C&quot; aria-label=&quot;IPv6 프로토콜 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;IPv6 프로토콜&lt;/h2&gt;
&lt;p&gt;✅ &lt;strong&gt;IPv6는 기존 IPv4의 한계를 해결하기 위해 등장한 차세대 인터넷 프로토콜&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;128비트 주소 체계를 사용하여 주소 고갈 문제 해결&lt;/strong&gt;
[[IP 프로토콜]]&lt;/p&gt;
&lt;h3 id=&quot;-주요-특징&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%A3%BC%EC%9A%94-%ED%8A%B9%EC%A7%95&quot; aria-label=&quot; 주요 특징 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;📌 주요 특징&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;128비트 주소 체계: IPv4(32비트)보다 확장된 주소 공간을 제공한다.&lt;/li&gt;
&lt;li&gt;주소 자동 구성: DHCP 없이 자동으로 IP 주소 할당이 가능하다.&lt;/li&gt;
&lt;li&gt;패킷 크기 고정: 패킷 크기를 고정해 QoS를 개선한다.&lt;/li&gt;
&lt;li&gt;보안 강화&lt;/li&gt;
&lt;li&gt;멀티캐스트 지원: 브로드캐스트를 제거하고 멀티 캐스트로 대체한다.&lt;/li&gt;
&lt;li&gt;헤더 단순화: IPv4 대비 헤더 구조가 간소화된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-패킷-헤더-구조&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%ED%8C%A8%ED%82%B7-%ED%97%A4%EB%8D%94-%EA%B5%AC%EC%A1%B0&quot; aria-label=&quot; 패킷 헤더 구조 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;📌 패킷 헤더 구조&lt;/h3&gt;
&lt;p&gt;IPv6는 고정된 40바이트 헤더를 사용하며, IPv4보다 단순화된 구조다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;| Version | DS | ECN | Flow Label |
| Payload Length | Next Header | Hop Limit |
| Source Address | Destination Address |&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Version&lt;/strong&gt;: IPv6(6)인지 표시&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Traffic Class&lt;/strong&gt;: QoS 및 우선순위 설정, DS(6비트)와 ECN(2비트)로 구성&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DS: 패킷의 우선순위를 결정하는 6비트 코드
-&gt; 긴급 트래픽, 온라인 게임 패킷 같은 우선 순위가 높은 패킷이 우선 처리됨&lt;/li&gt;
&lt;li&gt;ECN: 네트워크 혼잡을 감지하는 기능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flow Label&lt;/strong&gt;: 패킷 흐름을 구분하여 QoS 향상&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Next Header&lt;/strong&gt;: 다음에 올 프로토콜(TCP, UDP 등)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hop Limit&lt;/strong&gt;: TTL(Time to Live)과 유사, 패킷 생명 주기 관리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Source/Destination Address&lt;/strong&gt;: 송신지 및 목적지 IPv6 주소&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;이동-IP-프로토콜-Mobile-IP&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9D%B4%EB%8F%99-IP-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C-Mobile-IP&quot; aria-label=&quot;이동 IP 프로토콜 Mobile IP permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;이동 IP 프로토콜 (Mobile IP)&lt;/h2&gt;
&lt;p&gt;✅ &lt;strong&gt;사용자가 이동 중에도 동일한 IP 주소를 유지할 수 있도록 지원하는 프로토콜&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;스마트폰, 노트북 등 모바일 장치가 네트워크를 이동해도 IP 주소가 유지&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;-핵심-개념&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%ED%95%B5%EC%8B%AC-%EA%B0%9C%EB%85%90&quot; aria-label=&quot; 핵심 개념 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 핵심 개념&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;홈 네트워크&lt;/strong&gt;: 장치가 원래 등록된 네트워크&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;외부 네트워크&lt;/strong&gt;: 장치가 이동한 네트워크&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;홈 에이전트&lt;/strong&gt;: 원래 네트워크에서 패킷을 전달하는 역할&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;외부 에이전트&lt;/strong&gt;: 이동한 네트워크에서 장치를 지원&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Care-of-Address(CoA)&lt;/strong&gt;: 장치가 이동한 네트워크에서 임시로 부여받는 IP&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Mobile IP는 장치가 이동해도 기존 IP 주소를 유지하여 지속적인 연결을 보장&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;VPN, 5G 네트워크, 원격 근무 환경에서 많이 사용&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;-동작-과정&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EB%8F%99%EC%9E%91-%EA%B3%BC%EC%A0%95&quot; aria-label=&quot; 동작 과정 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 동작 과정&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;1️⃣ &lt;strong&gt;모바일 장치가 원래 네트워크(Home Network)에 있음&lt;/strong&gt;&lt;br&gt;
2️⃣ &lt;strong&gt;외부 네트워크(Foreign Network)로 이동하면, Foreign Agent(FA)가 Care-of Address(CoA)를 할당&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CoA는 이동 호스트의 HA에 등록되어 FA와 HA 사이에 터널을 형성하는 데 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3️⃣ &lt;strong&gt;홈 에이전트(HA)가 외부 네트워크로 패킷을 터널링(Tunneling)하여 전달&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HA는 이동 호스트의 원래 네트워크에서 패킷을 수신하고, 터널링을 통해 외부 네트워크로 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;4️⃣ &lt;strong&gt;모바일 장치는 기존 IP를 유지하며 인터넷 사용 가능&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;즉, Mobile IP는 사용자가 이동 중에도 끊김 없이 네트워크를 사용할 수 있도록 해주는 핵심 기술&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;제어용-프로토콜-Control-Protocols&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A0%9C%EC%96%B4%EC%9A%A9-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C-Control-Protocols&quot; aria-label=&quot;제어용 프로토콜 Control Protocols permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;제어용 프로토콜 (Control Protocols)&lt;/h2&gt;
&lt;p&gt;✅ &lt;strong&gt;네트워크 계층에서 패킷 전달을 효율적으로 수행하기 위해 다양한 제어용 프로토콜이 사용됨&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;ICMP, ARP, IGMP 등은 네트워크 상태 관리, 오류 감지, 주소 변환 등의 역할을 수행함.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;-ARPAddress-Resolution-Protocol&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-ARPAddress-Resolution-Protocol&quot; aria-label=&quot; ARPAddress Resolution Protocol permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;📌 ARP(Address Resolution Protocol)&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;IP 주소를 MAC 주소로 변환하는 프로토콜&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;LAN에서 통신할 때 IP 주소를 MAC 주소로 변환하여 패킷을 전달함.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MAC 주소&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;송신 호스트가 물리 계층을 통해 데이터를 전송하는 과정에서 필요한 주소&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IP → MAC 주소 변환&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;네트워크에서 패킷을 전달하기 위해 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ARP 요청(Request)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;특정 IP 주소에 대한 MAC 주소 요청&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ARP 응답(Reply)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MAC 주소 응답&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;캐시 사용&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;변환된 MAC 주소를 일정 시간 동안 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;ARP요청은 네트워크의 모든 노드에 브로드캐스트로 전송되며, 대상 IP를 가진 장치는 자신의 MAC 주소를 ARP 응답으로 유니캐스트 전송&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;ICMPInternet-Control-Message-Protocol&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ICMPInternet-Control-Message-Protocol&quot; aria-label=&quot;ICMPInternet Control Message Protocol permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;ICMP(Internet Control Message Protocol)&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;네트워크에서 오류 메시지를 전송하는 프로토콜&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;네트워크 문제를 감지하고 진단하는 데 사용&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;전송 과정에 문제가 발생하면 라우터에 의해 ICMP 메시지 발생&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;오류 보고 메시지&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DESTINATION UNREACHABLE&lt;/strong&gt;: 수신 호스트가 존재하지 않거나 접근이 불가한 경우&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TIME EXCEEDED&lt;/strong&gt;: 패킷의 TTL 필드 값이 0이 되어 버려진 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;질의 메시지&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ECHO REQUEST, ECHO REPLY&lt;/strong&gt;: 특정 호스트가 인터넷에 활성화되어 동작하는지 확인&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TIMESTAMP REQUEST, TIMESTAMP REPLY&lt;/strong&gt;: 두 호스트 간의 네트워크 지연을 계산&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-IGMP-Internet-Group-Management-Protocol&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-IGMP-Internet-Group-Management-Protocol&quot; aria-label=&quot; IGMP Internet Group Management Protocol permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;📌 IGMP (Internet Group Management Protocol)&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;멀티캐스트 그룹을 관리하는 프로토콜&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;여러 장치가 동시에 같은 데이터를 받을 때 사용&lt;/strong&gt;&lt;br&gt;
ex) IPTV, 화상회의&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;멀티캐스트 그룹 가입&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;그룹 가입 요청&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;그룹 유지 관리&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;네트워크에서 그룹 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;그룹 탈퇴&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;그룹 탈퇴 요청&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;IGMP는 방송(Broadcast) 대신 멀티캐스트를 사용하여 네트워크 효율성을 높이는 데 도움을 준다&lt;/strong&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[IP 프로토콜]]></title><description><![CDATA[…]]></description><link>https://choiwonyu.github.io/IP 프로토콜/</link><guid isPermaLink="false">https://choiwonyu.github.io/IP 프로토콜/</guid><pubDate>Thu, 06 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;네트워크-계층의-기능&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B3%84%EC%B8%B5%EC%9D%98-%EA%B8%B0%EB%8A%A5&quot; aria-label=&quot;네트워크 계층의 기능 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;네트워크 계층의 기능&lt;/h2&gt;
&lt;p&gt;네트워크 계층의 핵심 기능은 패킷을 출발지에서 목적지까지 전달하는 것이다.&lt;/p&gt;
&lt;h3 id=&quot;주요-기능&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A3%BC%EC%9A%94-%EA%B8%B0%EB%8A%A5&quot; aria-label=&quot;주요 기능 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;주요 기능&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;패킷 전달&lt;/strong&gt;: 출발지에서 목적지까지 데이터 전송&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;라우팅&lt;/strong&gt;: 최적의 경로를 찾아 패킷 전달&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;네트워크의 구성 형태에 대한 정보는 라우팅 테이블에 보관&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;혼잡 제어&lt;/strong&gt;: 네트워크에 패킷 수가 급증하는 혼잡 현상을 예방하거나 제거&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;단편화 및 재조립&lt;/strong&gt;: 패킷이 네트워크 MTU보다 클 경우 나누어 전송 후 다시 조립&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;연결형-서비스와-비연결형-서비스&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%97%B0%EA%B2%B0%ED%98%95-%EC%84%9C%EB%B9%84%EC%8A%A4%EC%99%80-%EB%B9%84%EC%97%B0%EA%B2%B0%ED%98%95-%EC%84%9C%EB%B9%84%EC%8A%A4&quot; aria-label=&quot;연결형 서비스와 비연결형 서비스 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;연결형 서비스와 비연결형 서비스&lt;/h3&gt;
&lt;p&gt;네트워크 계층이 전송 계층에 제공하는 서비스는 크게 두 가지다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;연결형 서비스&lt;/strong&gt;: 패킷을 전송하기 전 송수신 호스트 사이에 연결 설정&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;경로가 최초 설정 시 고정 -&gt; 모든 패킷이 같은 경로로 따라감 -&gt; 도착 순서 보장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;비연결형 서비스&lt;/strong&gt;: 연결 설정없이 데이터를 패킷 단위로 전송&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;전송 계층에서 네트워크의 비연결형 서비스를 이용할 때는 자체적으로 오류 제어와 흐름 제어 기능을 더 많이 수행해야 한다.&lt;/p&gt;
&lt;p&gt;비연결형 서비스를 이용해 패킷을 전송하면 패킷이 서로 다른 경로를 통해 수신 호스트로 전달되어 순서가 일정하지 않을 수 있다.
-&gt; 상위 계층인 전송 계층은 수신한 패킷의 순서를 재조정하는 기능이 필요하다.&lt;/p&gt;
&lt;h3 id=&quot;혼잡-제어&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%98%BC%EC%9E%A1-%EC%A0%9C%EC%96%B4&quot; aria-label=&quot;혼잡 제어 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;혼잡 제어&lt;/h3&gt;
&lt;p&gt;흐름 제어가 송신 호스트와 수신 호스트의 논리적인 점대점 전송 속도를 다룬다면, 혼잡 제어는 더 넓은 관점에서 네트워크의 전송 능력 문제를 다룬다.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/094a76270ee78d171c2f6e1f4c4dee59/566b8/flowcontrol-congestioncontrol.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 74.70588235294117%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAAsTAAALEwEAmpwYAAABtElEQVR42pVU2W7CMBD0/38ZvBSpRRziJkBCDgI5yJ2pZ1VXgabXSkNs73o8u16j2rZFlmUIwxBlWeK/dr/fYVkWbNuWueLPdDrFYDAQYhoPoVV1Cy+pkVVAlDcI7w2ysn2ICYIAo9EI8/kcVVVBua6LJEnEud1usVwucb1eEV4u8PwAb2sH852LyfaMl4UDywmQxBGiKBJlq9VK9nqeJ+RCSOR5LgEkpPzT6QRbw3UIG97Zhu86OOsx/Y7jCNnxeJS0SUgOVdc1brcbdrudyO6m85OZmMPhIOViulxTxkHixWIh5LSmaQT090FqrEnG4/FnyYTQDAw2mw3SNH1Q0iXpqmfKrHd3XT2nwFOHw6EEFkUhp8dxLJdgQOVMdTabfTlE9dWFl+T7PkpN+FxPloYHib+nb9XzAoNMyk3TCiqN+uNb1Y18qZLKfyVkc+d5pjcBazfF2yHGq8Y+yGBdMkxOiYxpvMDnDHoVmptmbKlfixak0crc7GfqrOevCmlsUKZTFLlsZHqmxpyzken/Uw27F8SNqYarXwFfB3HV6nkp+Kb51V/+UfjM2CL7/f6hifsI3wEgp47jpD9isAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;flowcontrol congestioncontrol&apos; title=&apos;&apos; src=&apos;/static/094a76270ee78d171c2f6e1f4c4dee59/ca1dc/flowcontrol-congestioncontrol.png&apos; srcset=&apos;/static/094a76270ee78d171c2f6e1f4c4dee59/e7570/flowcontrol-congestioncontrol.png 170w,
/static/094a76270ee78d171c2f6e1f4c4dee59/f46e7/flowcontrol-congestioncontrol.png 340w,
/static/094a76270ee78d171c2f6e1f4c4dee59/ca1dc/flowcontrol-congestioncontrol.png 680w,
/static/094a76270ee78d171c2f6e1f4c4dee59/566b8/flowcontrol-congestioncontrol.png 876w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;혼잡 발생의 가장 큰 원인은 &lt;strong&gt;네트워크 용량에 비해 전송 패킷이 많기 때문&lt;/strong&gt;이다.
해결 방법&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;트래픽 관리(Traffic Shaping): 송신자가 전송 속도를 조절하여 네트워크의 부하를 줄이는 방식&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Leaky Bucket 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;혼잡이 발생한 경로를 피해 패킷을 전송&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;라우팅-프로토콜&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%9D%BC%EC%9A%B0%ED%8C%85-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C&quot; aria-label=&quot;라우팅 프로토콜 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;라우팅 프로토콜&lt;/h2&gt;
&lt;p&gt;라우팅은 패킷이 네트워크를 통해 &lt;strong&gt;이동하는 최적의 과정을 결정하는 과정&lt;/strong&gt;
라우팅을 수행하는 장치가 라우터이며, 라우터는 라우팅 프로토콜을 이용해 경로를 설정&lt;/p&gt;
&lt;h3 id=&quot;라우팅-방식&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%9D%BC%EC%9A%B0%ED%8C%85-%EB%B0%A9%EC%8B%9D&quot; aria-label=&quot;라우팅 방식 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;라우팅 방식&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;정적 라우팅&lt;/strong&gt;: 관리자가 수동으로 경로 설정
-&gt; 운영 중인 네트워크의 구성에 변화가 생기면 이에 적절하게 대처할 수 없다.
-&gt; 실시간 혼잡도를 반영할 수 없다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;동적 라우팅&lt;/strong&gt;: 라우팅 프로토콜을 사용해 자동으로 경로 설정
-&gt; 현재 네트워크 상황을 고려해 최적의 정보를 선택할 수 있다.
-&gt; 네트워크에 새로운 부하를 주어 성능에 부정적인 영향을 미친다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;동적 라우팅 방식을 사용하기 위해선 &lt;strong&gt;현재의 네트워크 링크 상태를 점검해 이를 새로운 경로 배정 시 적용&lt;/strong&gt;해야 한다.&lt;/p&gt;
&lt;h3 id=&quot;라우팅-테이블&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%9D%BC%EC%9A%B0%ED%8C%85-%ED%85%8C%EC%9D%B4%EB%B8%94&quot; aria-label=&quot;라우팅 테이블 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;라우팅 테이블&lt;/h3&gt;
&lt;p&gt;패킷 전송 과정에서 &lt;strong&gt;라우터들이 적절한 경로를 쉽게 찾을 수 있도록 가장 기본적인 도구&lt;/strong&gt;로 라우팅 테이블을 사용한다.&lt;/p&gt;
&lt;p&gt;라우팅 테이블에 포함해야 하는 필수 정보는 &lt;strong&gt;(목적지 호스트, 다음 홉)의 조합&lt;/strong&gt;이다. &apos;목적지 호스트&apos;까지 패킷을 전달하기 위해 어떤 이웃 호스트(&apos;다음 홉&apos;)으로 가야 하는지 알려주는 정보이다. 따라서 &lt;strong&gt;라우팅 테이블 정보는 네트워크에 연결된 모든 라우터에 존재&lt;/strong&gt;한다.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/5e999085463fa756fc2ca9285ffd4159/912c7/routing-table.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 47.64705882352941%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAABRElEQVR42o2Si26CQBBF/f8ftNTGRDAK8pCXIM9bzjSLxDRNJ9kMy86euXNhp03M86xhGCy7fd/3634YRk3TqLTuFRa98mZQWHaKq17RkrPl/W4L5HIURSrL0iBFUeh8Plsex1FhGCpaVtsNSvNS2bLIeVmrbjsN0/wCcuFyudi63W5qmkZxHOt6vSpJEuV5bs14R20Q+Pr0PHneh74OB6shdl3XicUF8vP5tLFdUIhy19SdPR4Pg8dxIt/3db/ff4AoYKwsy2ykIAgMgsKqqqyYMyxwXhKcUw/0dDqZegPykKbpYvZk3jEyRShmD7yua70HCrGGc5quIwOim5P8roTz7d6Fa44YFJIN6IoZjy5t266/zm+gdyBCDstHYXwDOlXuAxyPx7XbX0AEAOSX2u/3Lw+3RSjDOyz4D5DGAPEQ3wF+A33/BUlvMKyJAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;routing table&apos; title=&apos;&apos; src=&apos;/static/5e999085463fa756fc2ca9285ffd4159/ca1dc/routing-table.png&apos; srcset=&apos;/static/5e999085463fa756fc2ca9285ffd4159/e7570/routing-table.png 170w,
/static/5e999085463fa756fc2ca9285ffd4159/f46e7/routing-table.png 340w,
/static/5e999085463fa756fc2ca9285ffd4159/ca1dc/routing-table.png 680w,
/static/5e999085463fa756fc2ca9285ffd4159/02d09/routing-table.png 1020w,
/static/5e999085463fa756fc2ca9285ffd4159/912c7/routing-table.png 1228w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;최단-경로-라우팅&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%B5%9C%EB%8B%A8-%EA%B2%BD%EB%A1%9C-%EB%9D%BC%EC%9A%B0%ED%8C%85&quot; aria-label=&quot;최단 경로 라우팅 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;최단 경로 라우팅&lt;/h3&gt;
&lt;p&gt;패킷이 목적지에 도달할 때까지 거치는 라우터 수, 즉 홉(hop)의 수가 최소화될 수 있도록 경로를 선택하는 방식&lt;/p&gt;
&lt;p&gt;홉 수 외 거리 기준이 될 수 있는 요소&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;전송 지연 시간&lt;/li&gt;
&lt;li&gt;전송 대역폭&lt;/li&gt;
&lt;li&gt;통신 비용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;거리-벡터-라우팅&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B1%B0%EB%A6%AC-%EB%B2%A1%ED%84%B0-%EB%9D%BC%EC%9A%B0%ED%8C%85&quot; aria-label=&quot;거리 벡터 라우팅 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;거리 벡터 라우팅&lt;/h3&gt;
&lt;p&gt;라우터가 이웃 라우터와 라우팅 정보를 교환하는 방식&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;필수 정보&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;링크 벡터: 이웃 네트워크에 대한 연결 정보&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;각 네트워크와 연결하기 위해 할당한 라우터 포트 번호&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;링크 벡터 L(x) = [포트(1), 포트(2), 포트(3), ... , 포트(n)]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;거리 벡터: 개별 네트워크까지의 거리 정보&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;일반적으로 최소 전송 지연 시간&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;거리 벡터 D(x) = [거리(1), 거리(2), 거리(3), ... , 거리(n)]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;다음 홉 벡터: 개별 네트워크로 가기 위한 다음 홉 정보&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;다음 홉 벡터 H(x) = [홉(1), 홉(2), 홉(3), ... , 홉(n)]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;IP-프로토콜&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#IP-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C&quot; aria-label=&quot;IP 프로토콜 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;IP 프로토콜&lt;/h2&gt;
&lt;p&gt;IP 프로토콜은 네트워크 계층에서 데이터를 패킷으로 나누어 전달하는 핵심 프로토콜이다.
모든 장치는 고유한 IP 주소를 가지고 있으며, 패킷은 송신지에서 목적지까지 IP 주소를 기반으로 전달된다.&lt;/p&gt;
&lt;h3 id=&quot;특징&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8A%B9%EC%A7%95&quot; aria-label=&quot;특징 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;특징&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;비연결형 서비스 제공&lt;/li&gt;
&lt;li&gt;패킷을 분할/병합하는 기능 수행&lt;/li&gt;
&lt;li&gt;Best Effort 원칙에 따른 전송 기능 제공
-&gt; 전송 패킷이 수신 호스트에 100% 도착하는 것을 보장하지 않는다.
-&gt; 상위 계층에서 전송 오류 문제를 고려해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;패킷-구조&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8C%A8%ED%82%B7-%EA%B5%AC%EC%A1%B0&quot; aria-label=&quot;패킷 구조 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;패킷 구조&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;| Version | Header Length | Type of Service | Total Length |
| Identification | Flags | Fragment Offset |
| Time to Live (TTL) | Protocol | Header Checksum |
| Source IP Address | Destination IP Address |
| Options | Data |&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Version&lt;/strong&gt;: IPv4(4) 또는 IPv6(6) 여부&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TTL(Time to Live)&lt;/strong&gt;: 패킷의 생존 시간 (0이 되면 폐기)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Protocol&lt;/strong&gt;: 상위 계층 프로토콜 (예: TCP=6, UDP=17)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Source/Destination IP Address&lt;/strong&gt;: 송신지 및 목적지 IP&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Header Checksum&lt;/strong&gt;: 오류 검출&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;패킷-분할&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8C%A8%ED%82%B7-%EB%B6%84%ED%95%A0&quot; aria-label=&quot;패킷 분할 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;패킷 분할&lt;/h3&gt;
&lt;p&gt;데이터 링크 계층 프로토콜의 &lt;strong&gt;프레임은 크기가 프로토콜마다 다르다.&lt;/strong&gt; 따라서 상위 계층에서 내려온 데이터를 데이터 링크 계층의 프레임 틀에 담을 수 있도록 분할하고, 수신 호스트에서는 이를 다시 재조립하는 작업을 수행한다.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/c7b45976bd2c7c4bc68c35e569d18a1c/52c6a/fragment.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 28.235294117647058%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAABG0lEQVR42m1Qy1LDMAzM//8NR7jBAYZzLwy0DbRJncaJncSPPJxksVQIFzSjsazHalfJuq4gG8cRxhhoreCcY6d/13Vo25Zfaw3HWusYW8zzjGVZuEY45AmBTdMEKSWK4opcVLhcihgXEELwS16WErrxqJVGVVVQ6rbYe899v5YQOgESuu0k3nd3EPkhNl0jmybmF5AI7zSy/QNqeUbbmY1tXdfIsmxTkvR9jxACo1ujcD2/oFFFlNWgHwZeFMIMZzXE1zMqmXPNOcsnIZYESCcbYj8zHMcBpfjAZ/oGFWWRHJKfHnYxv0cXB42xcD5EZp7vZzhnGOh0Ov1JJobzHCCO98jSVx5wUY6xA/L0EeX56ad1xX92UxA2wG+qPcs3ilWTegAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;fragment&apos; title=&apos;&apos; src=&apos;/static/c7b45976bd2c7c4bc68c35e569d18a1c/ca1dc/fragment.png&apos; srcset=&apos;/static/c7b45976bd2c7c4bc68c35e569d18a1c/e7570/fragment.png 170w,
/static/c7b45976bd2c7c4bc68c35e569d18a1c/f46e7/fragment.png 340w,
/static/c7b45976bd2c7c4bc68c35e569d18a1c/ca1dc/fragment.png 680w,
/static/c7b45976bd2c7c4bc68c35e569d18a1c/02d09/fragment.png 1020w,
/static/c7b45976bd2c7c4bc68c35e569d18a1c/9d567/fragment.png 1360w,
/static/c7b45976bd2c7c4bc68c35e569d18a1c/52c6a/fragment.png 1452w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;IP 프로토콜의 분할 기능은 &lt;strong&gt;라우터의 좌우에 연결된 LAN이 서로 다를 수 있기 때문&lt;/strong&gt;에 전송 경로에 위치한 라우터에 의해 수행된다. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;분할 과정&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;송신지에서 패킷을 생성 → MTU(Maximum Transmission Unit)보다 크면 분할 필요&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;라우터가 패킷의 크기를 검사&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;패킷이 MTU보다 크면 분할&lt;/strong&gt; 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;패킷을 여러 개의 조각으로 나누어 전송&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;분할된 패킷은 각각 독립적인 IP 패킷으로 전달됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;목적지에서 패킷을 재조립&lt;/strong&gt;하여 원래의 데이터 복원&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;DHCP-프로토콜&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#DHCP-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C&quot; aria-label=&quot;DHCP 프로토콜 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;DHCP 프로토콜&lt;/h3&gt;
&lt;p&gt;네트워크에 연결된 장치에게 자동으로 IP 주소와 기타 네트워크 설정을 제공하는 프로토콜
-&gt; 자동으로 IP 주소 할당&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;동작 과정&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;단계&lt;/th&gt;
&lt;th&gt;DHCP 메시지&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1. Discovery&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DHCPDISCOVER&lt;/td&gt;
&lt;td&gt;클라이언트 → 네트워크로 &lt;strong&gt;IP 요청&lt;/strong&gt; 브로드캐스트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2. Offer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DHCPOFFER&lt;/td&gt;
&lt;td&gt;DHCP 서버 → &lt;strong&gt;IP 주소 제안&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3. Request&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DHCPREQUEST&lt;/td&gt;
&lt;td&gt;클라이언트 → &lt;strong&gt;제안된 IP 주소 요청&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4. Acknowledgment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DHCPACK&lt;/td&gt;
&lt;td&gt;DHCP 서버 → &lt;strong&gt;IP 주소 최종 할당&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</content:encoded></item><item><title><![CDATA[데이터 링크 계층]]></title><description><![CDATA[데이터 링크 계층은 장치 간 신뢰성 있는 데이터 전송을 담당하는 계층이다.
이 계층은 MAC(Media Access Control) 계층과 LLC(Logical Link Control) 계층으로 나뉜다. MAC…]]></description><link>https://choiwonyu.github.io/데이터 링크 계층/</link><guid isPermaLink="false">https://choiwonyu.github.io/데이터 링크 계층/</guid><pubDate>Mon, 03 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;데이터 링크 계층은 장치 간 신뢰성 있는 데이터 전송을 담당하는 계층이다.
이 계층은 MAC(Media Access Control) 계층과 LLC(Logical Link Control) 계층으로 나뉜다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MAC 계층&lt;/strong&gt;: 물리적인 데이터 전송 및 접근 제어&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LLC 계층&lt;/strong&gt;: 논리적인 연결 및 프레임 흐름 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;MAC-계층&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#MAC-%EA%B3%84%EC%B8%B5&quot; aria-label=&quot;MAC 계층 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;MAC 계층&lt;/h2&gt;
&lt;h3 id=&quot;역할&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%97%AD%ED%95%A0&quot; aria-label=&quot;역할 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;역할&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;네트워크의 물리적 매체(유선/무선)에 대한 접근 제어&lt;/li&gt;
&lt;li&gt;MAC 주소를 사용해 송수신 장치 식별&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;MAC-주소&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#MAC-%EC%A3%BC%EC%86%8C&quot; aria-label=&quot;MAC 주소 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;MAC 주소&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;네트워크 인터페이스 카드(NIC)에 할당&lt;/strong&gt;된 고유한 48비트 주소&lt;/li&gt;
&lt;li&gt;Source와 Destination MAC 주소를 포함해 프레임 전송&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;MAC-프레임-구조&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#MAC-%ED%94%84%EB%A0%88%EC%9E%84-%EA%B5%AC%EC%A1%B0&quot; aria-label=&quot;MAC 프레임 구조 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;MAC 프레임 구조&lt;/h3&gt;
&lt;p&gt;MAC 계층 프로토콜에 정의된 MAC 헤더와 트레일러 정보를 추가한 것을 MAC 프레임이라 하며, IEEE 802.3 표준안의 이더넷 프로토콜에서는 이더넷 프레임이라고 한다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;| Preamble | Destination MAC | Source MAC | Type/Length | Data | Checksum |&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Preamble&lt;/strong&gt;: 동기화 신호&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;수신 호스트가 송신 호스트의 클록과 동기를 맞출 수 있도록 시간을 제공하는 것이 목적&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Destination MAC, Source MAC&lt;/strong&gt;: 목적지와 송신지 MAC 주소&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type/Length&lt;/strong&gt;: 상위 프로토콜 식별/전송 데이터의 크기&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Checksum&lt;/strong&gt;: 데이터 변형 오류의 여부를 확인할 수 있는 값&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;CSMACD&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#CSMACD&quot; aria-label=&quot;CSMACD permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;CSMA/CD&lt;/h3&gt;
&lt;p&gt;전송 매체의 신호를 감지해 프레임의 전송 여부를 결정하는 프로토콜을 신호 감지(Carrier Sense) 프로토콜이라고 한다.&lt;/p&gt;
&lt;p&gt;신호 감지 프로토콜은 신호 감지 방식에 따라 분류된다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1-persistent CSMA&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;신호 감지 프로토콜 중 가장 간단한 형태는 1-persistent CSMA 방식이다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;기본 원리&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;송신 노드가 먼저 채널 감지&lt;/li&gt;
&lt;li&gt;채널이 비어 있으면, 즉시 데이터 전송&lt;/li&gt;
&lt;li&gt;채널이 사용 중이면, 계속 감지하고 대기&lt;/li&gt;
&lt;li&gt;채널이 다시 비어지면 즉시 전송&lt;/li&gt;
&lt;li&gt;충돌이 발생하면 백오프(Backoff, 랜덤 대기 후 재시도) 과정 수행&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;한계&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;충돌 발생 확률이 높음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Non-persistent CSMA&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;동작 과정&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;송신 노드가 채널 감지&lt;/li&gt;
&lt;li&gt;채널이 비어 있으면 즉시 데이터 전송&lt;/li&gt;
&lt;li&gt;채널이 사용 중이면 일정 시간 랜덤 대기&lt;/li&gt;
&lt;li&gt;랜덤 대기 후 다시 감지하고, 비어 있으면 전송, 사용 중이면 다시 대기&lt;/li&gt;
&lt;li&gt;충돌이 발생하면 백오프(Backoff) 과정 수행&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;장점&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;충돌 발생 확률이 낮음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;단점&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;채널 사용률이 낮음(효율이 떨어짐)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;p-persistent CSMA&lt;/strong&gt;
위 두 CSMA 방식의 절충형&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;동작 과정&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;송신 노드가 채널 감지&lt;/li&gt;
&lt;li&gt;채널이 비어 있으면 p의 확률로 즉시 전송&lt;/li&gt;
&lt;li&gt;(1-p)의 확률로 랜덤 대기 후 다시 감지&lt;/li&gt;
&lt;li&gt;채널이 사용 중이면 랜덤 대기 후 다시 감지&lt;/li&gt;
&lt;li&gt;충돌 발생 시, 백오프(Backoff) 과정 수행&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;장점&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;네트워크 부하에 따라 유연하게 조정 가능&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;p가 높을 수록 빠른 전송, p가 낮을 수록 충돌 방지 효과 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;단점&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;적절한 p 값 설정이 중요&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;LLC-계층&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#LLC-%EA%B3%84%EC%B8%B5&quot; aria-label=&quot;LLC 계층 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;LLC 계층&lt;/h2&gt;
&lt;h3 id=&quot;역할-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%97%AD%ED%95%A0-1&quot; aria-label=&quot;역할 1 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;역할&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;MAC 계층과 상위 계층(네트워크) 간의 인터페이스 &lt;/li&gt;
&lt;li&gt;프레임의 흐름 제어 및 오류 제어&lt;/li&gt;
&lt;li&gt;다양한 네트워크 프로토콜과 MAC 계층 간의 통신 조정&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;LLC-프레임-구조&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#LLC-%ED%94%84%EB%A0%88%EC%9E%84-%EA%B5%AC%EC%A1%B0&quot; aria-label=&quot;LLC 프레임 구조 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;LLC 프레임 구조&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;| DSAP | SSAP | Control | Data |&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DSAP(Destination Service Access Point)&lt;/strong&gt;: 목적지 서비스 액세스 포인트 (예: IP, ARP 식별)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSAP(Source Service Access Point)&lt;/strong&gt;: 송신 측의 서비스 액세스 포인트&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Control&lt;/strong&gt;: 오류 제어, 흐름 제어 정보 포함&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data&lt;/strong&gt;: 상위 계층에서 전송한 실제 데이터&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;데이터-링크-계층&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%A7%81%ED%81%AC-%EA%B3%84%EC%B8%B5&quot; aria-label=&quot;데이터 링크 계층 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;데이터 링크 계층&lt;/h2&gt;
&lt;h3 id=&quot;프로토콜-기초&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C-%EA%B8%B0%EC%B4%88&quot; aria-label=&quot;프로토콜 기초 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;프로토콜 기초&lt;/h3&gt;
&lt;p&gt;데이터 링크 계층은 프레임 단위로 데이터를 전송한다.
&lt;strong&gt;프레임 종류&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;정보 프레임: 상위 계층이 전송을 요구한 데이터를 수신 호스트에 전송하는 용도로 사용&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;프레임의 순서 번호, 주소 정보, 오류 검출 코드 등을 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;긍정 응답 프레임: 정보를 수신한 호스트는 오류 검출 코드를 확인하고, 변형 오류가 없다면 송신 호스트에 바르게 수신했다는 의미로 ACK(Positive Acknowledgement) 프레임을 전송&lt;/li&gt;
&lt;li&gt;부정 응답 프레임: 만약 변형 오류가 발생했다면 송신 호스트에 NAK(Negative Acknowledgement)을 회신한다. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;주요 기능&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;프레임화&lt;/li&gt;
&lt;li&gt;주소 지정&lt;/li&gt;
&lt;li&gt;오류 제어&lt;/li&gt;
&lt;li&gt;흐름 제어&lt;/li&gt;
&lt;li&gt;매체 접근 제어
위 기능을 수행하기 위해 슬라이딩 윈도우 프로토콜과 HDLC 프로토콜이 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;슬라이딩-윈도우-프로토콜&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%94%A9-%EC%9C%88%EB%8F%84%EC%9A%B0-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C&quot; aria-label=&quot;슬라이딩 윈도우 프로토콜 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;슬라이딩 윈도우 프로토콜&lt;/h3&gt;
&lt;p&gt;두 호스트 간의 프레임 전송을 위한 일반적인 통신 프로토콜로,
&lt;strong&gt;오류 제어와 흐름 제어 기능을 함께 지원&lt;/strong&gt;한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;특징&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Stop-and-Wait 프로토콜보다 효율적&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;여러 개의 프레임을 동시에 전송 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;수신 측에서 확인 응답(ACK)을 보내며 흐름 제어 수행&lt;/li&gt;
&lt;li&gt;Selective Repeat 사용 시, 손실된 프레임만 선택적으로 재전송 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Go-Back-N ARQ&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;특징&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;송신 측이 N개의 프레임을 한 번에 전송 가능&lt;/li&gt;
&lt;li&gt;오류 발생 시 해당 프레임 이후의 모든 프레임을 다시 전송&lt;/li&gt;
&lt;li&gt;수신 측이 순차적으로 데이터 수신&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;동작 방식&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;송신 측이 윈도우 크기 N만큼 프레임 전송&lt;/li&gt;
&lt;li&gt;수신 측이 ACK을 순서대로 응답&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;특정 프레임이 손실되거나 오류 발생 시, 해당 프레임 이후 모든 프레임 재전송&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;장단점&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;장점: 구현이 단순하고 안정적&lt;/li&gt;
&lt;li&gt;단점: 오류 발생 시 불필요한 재전송이 많음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Selective Repeat ARQ(SR-ARQ)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;특징&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;오류가 발생한 프레임만 선택적으로 재전송&lt;/li&gt;
&lt;li&gt;수신 측이 순서를 유지하며 개별 프레임을 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;동작 방식&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;송신 측이 윈도우 크기만큼 프레임 전송&lt;/li&gt;
&lt;li&gt;수신 측이 개별 프레임에 대해 ACK 전송&lt;/li&gt;
&lt;li&gt;오류가 발생한 프레임만 재전송&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;장단점&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;장점: 불필요한 재전송 최소화 -&gt; 네트워크 대역폭 절약&lt;/li&gt;
&lt;li&gt;단점: 수신 측에서 패킷을 정렬하는 버퍼 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;HDLC-프로토콜&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#HDLC-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C&quot; aria-label=&quot;HDLC 프로토콜 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;HDLC 프로토콜&lt;/h3&gt;
&lt;p&gt;비트 지향형 프로토콜로 데이터 전송의 신뢰성을 높이기 위해
오류 제어와 흐름 제어 기능을 포함하는 표준 데이터 링크 계층 프로토콜&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;특징&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;비트 프레임 방식 사용&lt;/li&gt;
&lt;li&gt;오류 검출을 위한 CRC 포함&lt;/li&gt;
&lt;li&gt;슬라이딩 윈도우 기반의 흐름 제어 및 오류 복구 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;프레임 구조&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;| Flag (01111110) | Address | Control | Data | CRC | Flag (01111110) |&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Flag&lt;/strong&gt;: 프레임의 시작과 끝&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Address&lt;/strong&gt;: 송신 및 수신 주소 지정 &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Control&lt;/strong&gt;: 프레임 유형 및 오류 제어&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data&lt;/strong&gt;: 실제 전송되는 데이터&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CRC&lt;/strong&gt;: 오류 검출&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;프레임 유형&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Control 필드 값에 따라 세 종류로 구분된다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I(정보)-프레임: 데이터 전송을 위한 프레임(순서 번호 포함)&lt;/li&gt;
&lt;li&gt;S(감독)-프레임: 흐름 제어 및 오류 제어 프레임(ACK 포함)&lt;/li&gt;
&lt;li&gt;U(비번호)-프레임: 링크 제어 및 관리&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[데이터 전송]]></title><description><![CDATA[전송 방식 데이터 전송 방식은 어떻게 목적지에 도달하는지에 따라 분류할 수 있다. 점대점(Point-to-Point) 방식 한 장치에서 다른 특정 장치로 데이터를 전송하는 방식 특징 두 개의 노드 사이 직접적인 연결 필요 LAN에서는 MAC…]]></description><link>https://choiwonyu.github.io/데이터 전송/</link><guid isPermaLink="false">https://choiwonyu.github.io/데이터 전송/</guid><pubDate>Sun, 02 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;전송-방식&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A0%84%EC%86%A1-%EB%B0%A9%EC%8B%9D&quot; aria-label=&quot;전송 방식 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;전송 방식&lt;/h2&gt;
&lt;p&gt;데이터 전송 방식은 &lt;strong&gt;어떻게 목적지에 도달하는지&lt;/strong&gt;에 따라 분류할 수 있다.&lt;/p&gt;
&lt;h3 id=&quot;점대점Point-to-Point-방식&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A0%90%EB%8C%80%EC%A0%90Point-to-Point-%EB%B0%A9%EC%8B%9D&quot; aria-label=&quot;점대점Point to Point 방식 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;점대점(Point-to-Point) 방식&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;한 장치에서 다른 특정 장치로 데이터를 전송&lt;/strong&gt;하는 방식&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;특징&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;두 개의 노드 사이 직접적인 연결 필요&lt;/li&gt;
&lt;li&gt;LAN에서는 MAC 주소를 기반, WAN에서는 전용선 또는 VPN을 이용한 논리적 연결을 통해 이루어진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ex) 전화 통신, VPN&lt;/p&gt;
&lt;h3 id=&quot;브로드캐스팅BroadCasting-방식&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B8%8C%EB%A1%9C%EB%93%9C%EC%BA%90%EC%8A%A4%ED%8C%85BroadCasting-%EB%B0%A9%EC%8B%9D&quot; aria-label=&quot;브로드캐스팅BroadCasting 방식 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;브로드캐스팅(BroadCasting) 방식&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;네트워크에 연결된 모든 장치에게 데이터를 전송&lt;/strong&gt;하는 방식&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;특징&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;일대다 방식으로 동작&lt;/li&gt;
&lt;li&gt;동일 네트워크(LAN) 내에서는 라우터 없이 전송할 수 있지만, WAN에서는 브로드캐스트 트래픽이 제한되며, 라우터가 이를 필터링할 수도 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ex) DHCP 요청, IPv4 브로드캐스트 패킷(255.255.255.255)&lt;/p&gt;
&lt;h3 id=&quot;멀티포인트Multipoint-방식&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%A9%80%ED%8B%B0%ED%8F%AC%EC%9D%B8%ED%8A%B8Multipoint-%EB%B0%A9%EC%8B%9D&quot; aria-label=&quot;멀티포인트Multipoint 방식 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;멀티포인트(Multipoint) 방식&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;하나의 송신자가 여러 개의 수신자에게 데이터를 전송&lt;/strong&gt;하는 방식&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;특징&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;브로드캐스트와 달리 특정 그룹만 데이터를 받을 수 있도록 제한 가능&lt;/li&gt;
&lt;li&gt;일대다 또는 다대다 통신 가능&lt;/li&gt;
&lt;li&gt;주로 멀티캐스트 기술을 이용해 구현&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ex) IPTV, 온라인 게임 서버&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;멀티캐스팅 vs 유니캐스팅&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;멀티캐스팅: 한 번의 전송으로 다수의 수신 호스트에 데이터 전송 가능&lt;/li&gt;
&lt;li&gt;유니캐스팅: 한 번의 전송으로 수신 호스트 하나에만 데이터 전송 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;오류-제어&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%98%A4%EB%A5%98-%EC%A0%9C%EC%96%B4&quot; aria-label=&quot;오류 제어 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;오류 제어&lt;/h2&gt;
&lt;p&gt;네트워크에서 발생하는 &lt;strong&gt;오류를 감지&lt;/strong&gt;하고, &lt;strong&gt;복구하여 데이터의 신뢰성을 유지&lt;/strong&gt;하는 과정&lt;/p&gt;
&lt;h3 id=&quot;전송-오류-유형&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A0%84%EC%86%A1-%EC%98%A4%EB%A5%98-%EC%9C%A0%ED%98%95&quot; aria-label=&quot;전송 오류 유형 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;전송 오류 유형&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;비트 오류&lt;/strong&gt;: 한 개 이상의 비트가 바뀌는 오류&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;패리티 체크를 통해 오류 검출 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;패킷 손실&lt;/strong&gt;: 네트워크 혼잡, 신호 감쇠로 인해 패킷이 유실&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;송신 호스트의 타임아웃 기능으로 오류 검출 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;중복 패킷&lt;/strong&gt;: 같은 패킷이 여러 번 도착&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;패킷 순서 오류&lt;/strong&gt;: 패킷이 올바른 순서로 도착하지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;순서-번호&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%88%9C%EC%84%9C-%EB%B2%88%ED%98%B8&quot; aria-label=&quot;순서 번호 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;순서 번호&lt;/h3&gt;
&lt;p&gt;각 프레임의 &lt;strong&gt;고유 번호&lt;/strong&gt;로 부여한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;역할&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;패킷이 유실되었는지 확인: 특정 순서 번호의 패킷이 오지 않으면 재전송 요청&lt;/li&gt;
&lt;li&gt;중복 패킷 식별 가능: 동일한 패킷이 여러 번 도착하면 중복 패킷 무시&lt;/li&gt;
&lt;li&gt;패킷 순서를 올바르게 정렬 가능: 경로 변경으로 순서가 뒤죽박죽일 수 있지만, 재정렬 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;흐름-제어&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%9D%90%EB%A6%84-%EC%A0%9C%EC%96%B4&quot; aria-label=&quot;흐름 제어 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;흐름 제어&lt;/h3&gt;
&lt;p&gt;송신 속도를 제어해 수신 호스트 측 과부하 방지&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;기법&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Stop-and-Wait: 한 번에 하나의 패킷을 보내고 응답(Ack)을 기다림&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;느리지만 신뢰성 높음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sliding-Window: 일정 개수의 패킷을 보내고 수신 측이 처리 가능한 만큼 수락&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;효율적&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;기본 원리&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;수신 호스트가 다음에 수신할 데이터 프레임의 개수를 통지&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;수신 호스트의 버퍼 수&lt;/strong&gt;에 직접적인 영향을 받는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;송신 호스트는 위 수에 근거해 연속해서 데이터 프레임 전송&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;프레임-구조&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%94%84%EB%A0%88%EC%9E%84-%EA%B5%AC%EC%A1%B0&quot; aria-label=&quot;프레임 구조 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;프레임 구조&lt;/h2&gt;
&lt;p&gt;프레임은 네트워크에서 데이터를 일정 크기로 나누어 전송하는 기본 단위&lt;/p&gt;
&lt;p&gt;각 프레임은 &lt;strong&gt;헤더, 데이터, 트레일러&lt;/strong&gt;로 구성되며, &lt;strong&gt;프레임의 시작과 끝을 어떻게 구분할지&lt;/strong&gt;에 따라 문자 프레임 방식과 비트 프레임 방식으로 나뉜다.&lt;/p&gt;
&lt;h3 id=&quot;문자-프레임&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%AC%B8%EC%9E%90-%ED%94%84%EB%A0%88%EC%9E%84&quot; aria-label=&quot;문자 프레임 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;문자 프레임&lt;/h3&gt;
&lt;p&gt;문자 프레임 방식은 &lt;strong&gt;특정 문자(Character)를 사용해 프레임의 시작과 끝을 구분&lt;/strong&gt;하는 방식&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;| STX(Start of Text) | 데이터 | ETX(End of Text) |&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;STX: 프레임의 시작을 나타내는 문자&lt;/li&gt;
&lt;li&gt;ETX: 프레임의 끝을 나타내는 문자&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;문제점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;데이터 부분에 ETX와 동일한 문자가 포함&lt;/em&gt;되면 수신 측에서 프레임 종료로 착각할 수 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;문자 스터핑&lt;/strong&gt;을 사용해 해결: DLE(Data Link Escape) 문자를 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;비트-프레임&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B9%84%ED%8A%B8-%ED%94%84%EB%A0%88%EC%9E%84&quot; aria-label=&quot;비트 프레임 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;비트 프레임&lt;/h3&gt;
&lt;p&gt;비트 프레임 방식은 &lt;strong&gt;특정한 비트 패턴&lt;/strong&gt;을 사용해 프레임의 시작과 끝을 구분하는 방식&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;| 플래그(Flag, 01111110) | 데이터 | 오류 검사(CRC) | 플래그(01111110) |&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;플래그: 시작과 끝을 나타내는 비트 패턴&lt;/li&gt;
&lt;li&gt;CRC: 데이터가 손상되지 않았는지 검증&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;문제점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;플래그와 동일한 비트 패턴이 포함되어 수신 측에서 착각할 수 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;비트 스터핑을 통해 강제로 0을 삽입
두 방식에서 스터핑을 사용할 때 &lt;strong&gt;수신 호스트는 강제로 추가된 문자나 비트를 상위 계층인 네트워크 계층에 전달하기 전 제거해야 한다.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;오류-검출-기법&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%98%A4%EB%A5%98-%EA%B2%80%EC%B6%9C-%EA%B8%B0%EB%B2%95&quot; aria-label=&quot;오류 검출 기법 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;오류 검출 기법&lt;/h2&gt;
&lt;p&gt;오류 검출은 데이터가 손상되거나 변조되지 않았는지 확인하는 과정이다.
일반적으로는 오류 복구 코드를 이용한 순방향 오류 복구 방식은 사용하지 않고, &lt;strong&gt;재전송 방식을 이용해 오류를 복구한다. 이를 ARQ(Automatic Repeat reQuest) 방식&lt;/strong&gt;이라 한다.&lt;/p&gt;
&lt;p&gt;이를 위해선 송신 호스트가 오류를 검출하기 위한 코드를 전송 데이터와 함께 송신해야 한다.
오류 검출 코드는 패리티 비트, 블록 검사, 다항 코드 등을 이용해 생성할 수 있다.&lt;/p&gt;
&lt;h3 id=&quot;패리티-비트&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8C%A8%EB%A6%AC%ED%8B%B0-%EB%B9%84%ED%8A%B8&quot; aria-label=&quot;패리티 비트 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;패리티 비트&lt;/h3&gt;
&lt;p&gt;데이터에 1비트를 추가해 오류를 감지한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;문제점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;간단하지만, 검출 능력이 낮다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;블록-검사&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B8%94%EB%A1%9D-%EA%B2%80%EC%82%AC&quot; aria-label=&quot;블록 검사 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;블록 검사&lt;/h3&gt;
&lt;p&gt;여러 개의 바이트를 하나의 블록으로 구성한 후 교차 검사를 한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;문제점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;전송되는 데이터의 양과 비교해 오류 검출을 위한 오버헤드가 크다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;다항-코드&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%8B%A4%ED%95%AD-%EC%BD%94%EB%93%9C&quot; aria-label=&quot;다항 코드 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;다항 코드&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;다항식을 이용해 오류를 검출&lt;/strong&gt;하는 네트워크 프로토콜에서 가장 많이 사용하는 검출 기법이다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;과정&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;데이터를 이진수로 간주하고 다항식으로 표현&lt;/li&gt;
&lt;li&gt;모듈로 연산을 통해 나머지 값을 오류 검출 코드(FCS)를 생성&lt;/li&gt;
&lt;li&gt;수신 측에서 동일한 연산을 통해 데이터 손상 확인&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;연속된 비트 오류를 효과적으로 감지&lt;/li&gt;
&lt;li&gt;하드웨어 및 소프트웨어 구현 간단&lt;/li&gt;
&lt;li&gt;버스트 오류(특정 위치에 집중적으로 발생하는 오류) 검출 능력이 뛰어남&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[라우팅과 인터네트워킹]]></title><description><![CDATA[…]]></description><link>https://choiwonyu.github.io/라우팅과 인터네트워킹/</link><guid isPermaLink="false">https://choiwonyu.github.io/라우팅과 인터네트워킹/</guid><pubDate>Sat, 01 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;라우팅&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%9D%BC%EC%9A%B0%ED%8C%85&quot; aria-label=&quot;라우팅 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;라우팅&lt;/h2&gt;
&lt;p&gt;라우팅은 네트워크에서 데이터를 목적지까지 최적의 경로로 전달하는 기능을 의미한다.
라우팅 시스템은 라우터와 스위치 같은 네트워크 장비들이 패킷을 전달하는 방식을 결정하는 역할을 한다.&lt;/p&gt;
&lt;h3 id=&quot;회선-교환&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%9A%8C%EC%84%A0-%EA%B5%90%ED%99%98&quot; aria-label=&quot;회선 교환 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;회선 교환&lt;/h3&gt;
&lt;p&gt;데이터를 &lt;strong&gt;전송하기 전 두 장치 간에 물리적인 전용 회선을 설정&lt;/strong&gt;하는 방식&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;특징&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;전용 경로가 설정되며, 데이터 전송이 끝날 때까지 경로가 유지&lt;/li&gt;
&lt;li&gt;패킷 단위의 라우팅이 없음&lt;/li&gt;
&lt;li&gt;한 번 회선이 설정되면, 다른 트래픽이 그 대역폭을 사용할 수 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;라우팅 방식&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;경로 설정: 데이터 전송 전 경로 설정&lt;/li&gt;
&lt;li&gt;고정 경로 유지: 한 번 설정도니 경로는 끝까지 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;예시&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;공중 전화망&lt;/p&gt;
&lt;h3 id=&quot;프레임-릴레이&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%94%84%EB%A0%88%EC%9E%84-%EB%A6%B4%EB%A0%88%EC%9D%B4&quot; aria-label=&quot;프레임 릴레이 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;프레임 릴레이&lt;/h3&gt;
&lt;p&gt;프레임 릴레이 방식은 패킷 교환 방식의 일종으로 &lt;strong&gt;고정된 경로를 설정한 후 데이터 프레임을 빠르게 전송하는 방식&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;특징&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;가상 회선 방식 사용 -&gt; 회선 교환과 패킷 교환의 중간 형태&lt;/li&gt;
&lt;li&gt;패킷마다 새로운 경로를 찾지 않고, 설정된 가상 경로를 사용&lt;/li&gt;
&lt;li&gt;전송 속도가 빠르고 효율적&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;예시&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;기업 네트워크에서 WAN 연결&lt;/p&gt;
&lt;h3 id=&quot;패킷-교환&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8C%A8%ED%82%B7-%EA%B5%90%ED%99%98&quot; aria-label=&quot;패킷 교환 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;패킷 교환&lt;/h3&gt;
&lt;p&gt;패킷 교환은 데이터를 &lt;strong&gt;작은 패킷으로 나누어, 각각 독립적으로 목적지까지 전달&lt;/strong&gt;하는 방식&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;특징&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;각 패킷이 독립적으로 경로를 선택&lt;/strong&gt;: 동일한 데이터라도 여러 패킷이 서로 다른 경로로 갈 수 있음&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;라우팅 알고리즘이 매우 중요&lt;/strong&gt;: 최적의 경로를 실시간으로 찾아야 함&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;혼잡 제어 및 흐름 제어 필요&lt;/strong&gt;: 패킷이 서로 다른 경로로 가므로, 도착 순서를 맞추는 과정 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;라우팅 방식&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;동적 라우팅: 실시간으로 최적 경로 찾음&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;라우팅 프로토콜을 사용해 네트워크 상태 학습, 경로 결정&lt;/p&gt;
&lt;p&gt;ex) RIP, OSPF 등&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;예시&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;인터넷(IP 네트워크)&lt;/li&gt;
&lt;li&gt;LAN/WAN 기반 데이터 통신&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;네트워크의-분류&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC%EC%9D%98-%EB%B6%84%EB%A5%98&quot; aria-label=&quot;네트워크의 분류 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;네트워크의 분류&lt;/h2&gt;
&lt;p&gt;네트워크는 범위나 용도에 따라 LAN, MAN, WAN으로 분류된다.&lt;/p&gt;
&lt;h3 id=&quot;LANLOcal-Area-Network&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#LANLOcal-Area-Network&quot; aria-label=&quot;LANLOcal Area Network permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;LAN(LOcal Area Network)&lt;/h3&gt;
&lt;p&gt;LAN은 &lt;strong&gt;작은 범위(한 건물, 사무실, 학교 등) 내에서 장치들을 연결&lt;/strong&gt;하는 네트워크다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;특징&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;좁은 지역에서 운영&lt;/li&gt;
&lt;li&gt;데이터 &lt;strong&gt;전송 속도가 높음&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;일반적으로 &lt;strong&gt;이더넷 기반&lt;/strong&gt;으로 구축&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;주요 기술&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이더넷: 유선 LAN의 표준 기술&lt;/li&gt;
&lt;li&gt;Wi-Fi: 무선 LAN의 표준 기술&lt;/li&gt;
&lt;li&gt;스위치, 라우터 등의 네트워크 장비 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;예시&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;가정 내 Wi-Fi 네트워크&lt;/li&gt;
&lt;li&gt;기업 사무실에서 사용되는 내부 네트워크&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;MANMetropolitan-Area-Network&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#MANMetropolitan-Area-Network&quot; aria-label=&quot;MANMetropolitan Area Network permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;MAN(Metropolitan Area Network)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;하나의 도시 또는 특정 지역을 연결하는 네트워크&lt;/strong&gt;다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;특징&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;도시 수준의 광역 네트워크&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;여러 개의 LAN을 연결&lt;/strong&gt;하는 역할&lt;/li&gt;
&lt;li&gt;인터넷 제공업체가 관리하는 경우가 많음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;예시&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;도시 전체를 연결하는 공공 Wi-Fi 네트워크&lt;/li&gt;
&lt;li&gt;지역 ISP 네트워크&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;WANWide-Area-Network&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#WANWide-Area-Network&quot; aria-label=&quot;WANWide Area Network permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;WAN(Wide Area Network)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;전 세계적으로 데이터를 주고받는&lt;/strong&gt; 대규모 네트워크&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;특징&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;광범위한 지역 연결&lt;/li&gt;
&lt;li&gt;일반적으로 ISP(인터넷 서비스 제공자, KT, SKT 등)가 관리&lt;/li&gt;
&lt;li&gt;속도는 네트워크 장비, 회선, 거리 등에 따라 다름&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;주요 기술&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IP: 대규모 트래픽을 효율적으로 관리&lt;/li&gt;
&lt;li&gt;위성 네트워크: 지리적으로 떨어진 지역 연결&lt;/li&gt;
&lt;li&gt;5G: 모바일 WAN 네트워크&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;예시&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;인터넷&lt;/li&gt;
&lt;li&gt;기업용 WAN&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;인터네트워킹&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9D%B8%ED%84%B0%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%82%B9&quot; aria-label=&quot;인터네트워킹 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;인터네트워킹&lt;/h2&gt;
&lt;p&gt;인터네트워킹은 &lt;strong&gt;여러 개의 독립적인 네트워크를 상호 연결해 하나의 통합된 네트워크를 구축&lt;/strong&gt;하는 기술이다. 이를 위해 브리지, IP 인터네트워킹, 인터넷 라우팅 같은 기술이 사용된다.&lt;/p&gt;
&lt;h3 id=&quot;브리지&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B8%8C%EB%A6%AC%EC%A7%80&quot; aria-label=&quot;브리지 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;브리지&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;특징&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;서로 다른 LAN을 연결해 하나의 논리적인 네트워크로 통합&lt;/li&gt;
&lt;li&gt;브로드캐스트 도메인을 확장해 같은 네트워크처럼 동작할 수 있도록 만듦&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;동작 방식&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;네트워크에 연결된 장치들의 MAC 주소 테이블 유지&lt;/li&gt;
&lt;li&gt;패킷이 들어오면 MAC 주소를 확인하고, 목적지가 같은 네트워크 내에 있으면 필터링해 불필요한 전송을 방지&lt;/li&gt;
&lt;li&gt;목적지가 다른 네트워크에 있다면 브리지를 통해 전달&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;브리지를 이용한 인터네트워킹 예시&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이더넷 LAN을 확장해 여러 개의 사무실을 하나의 네트워크로 연결&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;IP-인터네트워킹&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#IP-%EC%9D%B8%ED%84%B0%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%82%B9&quot; aria-label=&quot;IP 인터네트워킹 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;IP 인터네트워킹&lt;/h3&gt;
&lt;p&gt;IP 인터네트워킹은 &lt;strong&gt;IP 주소를 사용해 서로 다른 네트워크를 연결&lt;/strong&gt;하는 기술
이는 &lt;strong&gt;네트워크 계층(OSI 3계층)&lt;/strong&gt; 에서 이뤄지며, &lt;strong&gt;라우터&lt;/strong&gt;가 핵심적인 역할을 한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;특징&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IP 주소를 사용해 네트워크 식별&lt;/li&gt;
&lt;li&gt;서로 다른 LAN과 WAN을 연결해 데이터가 목적지까지 갈 수 있도록 함&lt;/li&gt;
&lt;li&gt;라우팅 프로토콜을 사용해 최적의 경로를 결정&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;동작 방식&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;패킷이 LAN을 벗어나면, &lt;strong&gt;라우터가 IP 주소를 기반으로 최적 경로를 찾음&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;라우터는 IP 패킷을 네트워크 계층에서 포워딩&lt;/li&gt;
&lt;li&gt;목적지 네트워크로 가는 가장 효율적인 경로를 선택해 전송&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;핵심 기술&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IP 주소 체계: 네트워크 식별을 위해 사용&lt;/li&gt;
&lt;li&gt;서브넷팅: 네트워크를 효율적으로 나누는 기술&lt;/li&gt;
&lt;li&gt;NAT: 사설 IP를 공인 IP로 변환해 인터넷에 연결&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;예시&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;가정이나 회사의 LAN을 ISP의 WAN과 연결해 인터넷 사용&lt;/li&gt;
&lt;li&gt;기업 네트워크에서 여러 지사를 연결해 동일한 네트워크 환경 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;인터넷-라우팅&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9D%B8%ED%84%B0%EB%84%B7-%EB%9D%BC%EC%9A%B0%ED%8C%85&quot; aria-label=&quot;인터넷 라우팅 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;인터넷 라우팅&lt;/h3&gt;
&lt;p&gt;인터넷 라우팅은 인터넷에서 데이터 패킷을 최적의 경로로 전달하는 과정을 의미&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;핵심 개념&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;라우터&lt;/strong&gt;: 네트워크 계층에서 패킷을 전달하는 장비&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;라우팅 테이블&lt;/strong&gt;: 목적지 네트워크에 대한 정보 저장&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;라우팅 프로토콜&lt;/strong&gt;: 최적의 경로를 동적으로 결정하는 알고리즘&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;라우팅 방식&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;정적 라우팅&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;네트워크 관리자가 수동으로 경로 설정&lt;/li&gt;
&lt;li&gt;트래픽이 적거나 변동이 거의 없는 네트워크에서 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;동적 라우팅&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;라우터가 자동으로 최적의 경로를 결정하고 업데이트&lt;/li&gt;
&lt;li&gt;네트워크 상태 변화에 따라 경로를 자동으로 수정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[네트워크 개요]]></title><description><![CDATA[…]]></description><link>https://choiwonyu.github.io/네트워크 개요/</link><guid isPermaLink="false">https://choiwonyu.github.io/네트워크 개요/</guid><pubDate>Mon, 13 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;용어-정리&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9A%A9%EC%96%B4-%EC%A0%95%EB%A6%AC&quot; aria-label=&quot;용어 정리 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;용어 정리&lt;/h2&gt;
&lt;h3 id=&quot;네트워크-기초-용어&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B8%B0%EC%B4%88-%EC%9A%A9%EC%96%B4&quot; aria-label=&quot;네트워크 기초 용어 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;네트워크 기초 용어&lt;/h3&gt;
&lt;p&gt;네트워크를 이해하려면 시스템, 인터페이스 전송 매체, 프로토콜, 네트워크, 인터넷과 같은 용어를 먼저 이해해야 한다. &lt;/p&gt;
&lt;p&gt;네트워크는 하드웨어적 &lt;strong&gt;전송 매체를 매개&lt;/strong&gt;로 서로 연결되어 &lt;strong&gt;데이터를 교환하는 시스템의 모음&lt;/strong&gt;이며, 시스템과 전송 매체의 &lt;strong&gt;연결 지점에 대한 규격이 인터페이스&lt;/strong&gt;다. 시스템이 데이터를 교환할 때는 &lt;strong&gt;통신 규칙인 프로토콜&lt;/strong&gt;이 필요하다. 위 개념들을 도식화 해보면 다음과 같다.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/3a3dc4a63c34e39b73ddaf5bd8d2dfb4/b72ad/Network.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 54.11764705882353%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAABjElEQVR42mVSaXOCQAz1//+09kOd6diKSJUbll05ZcAFXpNVLNjMhCPHy8uxGYYBZVkiyzJ0fY+laPLlRYGyqsBxS+kpVimFpmlW9o0QAqwMqpIUtm/hlPvYxxaSKERFYKwijiGqDFVfw5M+PNc1YJfLxeSyTNOEDTMLggBhGKKUCo5zgCwU2VykZPdJEwJLPBdfpx3SIsNut4WMIni+jzRJIKX8Y1jXNRRVKYil6/1gpCqzSCo2Myio9Vm4fSZimFMev58M+aEHDd12eDu+o9Etee7OcRxxu92gtTb/RjE9fUymbdv1DOdAlkSkOAnXfHPCtGB7B3t8Y1qBLOM2S8eoB3xYW6SN+Bc4A80EuG0uyrpi+FrFtr6xP3wiV/lzNrO4ZYCgjuGXES0qwfl8Rp7nfx3wDFe3RfOSIkNG5yOVNINf3l9zbZDRWHhJvFkGdBzHxB2PR8R0DSvArusQkTGlJA7iDS4Bp4FavF4xUZue58G2bQPKi5sXtQJk4a0xA273dYOPm1m1+DrnXwpQUsueKAvpAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;Network&apos; title=&apos;&apos; src=&apos;/static/3a3dc4a63c34e39b73ddaf5bd8d2dfb4/ca1dc/Network.png&apos; srcset=&apos;/static/3a3dc4a63c34e39b73ddaf5bd8d2dfb4/e7570/Network.png 170w,
/static/3a3dc4a63c34e39b73ddaf5bd8d2dfb4/f46e7/Network.png 340w,
/static/3a3dc4a63c34e39b73ddaf5bd8d2dfb4/ca1dc/Network.png 680w,
/static/3a3dc4a63c34e39b73ddaf5bd8d2dfb4/02d09/Network.png 1020w,
/static/3a3dc4a63c34e39b73ddaf5bd8d2dfb4/b72ad/Network.png 1242w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;시스템&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;내부 규칙에 따라 &lt;strong&gt;자율적으로 동작하는 대상&lt;/strong&gt;을 가리킨다. 시스템의 동작에는 외부 입력이 있을 수 있으며, 내부 정보와 외부 입력의 조합에 따른 출력이 있을 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;인터페이스&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;시스템과 시스템을 연결하기 위한 &lt;strong&gt;표준화된 접촉 지점&lt;/strong&gt;을 의미한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;하드웨어적 관점: 물리적 규격&lt;/li&gt;
&lt;li&gt;소프트웨어적 관점: 함수 이름, 인수 지정&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;전송 매체&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;시스템 간 &lt;strong&gt;데이터 전달을 위한 물리적 전송 수단&lt;/strong&gt;을 가리킨다.&lt;/p&gt;
&lt;p&gt;ex) 공기, 무선 신호 등&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;프로토콜&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;논리적으로 상호 연동되는 시스템이 전송 매체를 통해 &lt;strong&gt;데이터를 교환할 때 따르는 규칙&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;인터페이스와 차이
프로토콜과 인터페이스가 비교될 때는 &lt;strong&gt;상하 개념&lt;/strong&gt;이 적용된다.
프로토콜은 동등 계층 사이의 관계를 다루지만, 인터페이스는 상하 계층 사이 관계를 다룬다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;인터넷&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;전 세계의 모든 네트워크가 유기적으로 연결되어 동작하는 &lt;strong&gt;통합 네트워크&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;표준화&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;서로 다른 시스템이 상호 연동해 동작하려면 &lt;strong&gt;표준화를 통한 형식의 통일&lt;/strong&gt;이 필요하다.&lt;/p&gt;
&lt;h3 id=&quot;시스템-기초-용어&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%8B%9C%EC%8A%A4%ED%85%9C-%EA%B8%B0%EC%B4%88-%EC%9A%A9%EC%96%B4&quot; aria-label=&quot;시스템 기초 용어 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;시스템 기초 용어&lt;/h3&gt;
&lt;p&gt;네트워크 시스템은 수행 기능에 따라 다음과 같이 다양한 명칭으로 부를 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;노드&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;컴퓨터 이론 분야에서 &lt;strong&gt;특정 시스템을 가리키는 가장 일반적인 용어&lt;/strong&gt;로 사용된다.
모든 시스템을 통칭하며, &lt;strong&gt;인터넷 내부를 구성하는 라우터&lt;/strong&gt;와 &lt;strong&gt;인터넷 바깥쪽에 연결되어 데이터를 주고받는 호스트로 구분&lt;/strong&gt;된다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;라우터&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;인터넷 내부를 구성하며, 기본적으로 &lt;strong&gt;데이터 전송 기능&lt;/strong&gt;을 포함한다. 라우터의 &lt;strong&gt;주요 역할은 데이터 중개 기능&lt;/strong&gt;이며, 호스트들 사이 데이터 전송이 인터넷 내부에서 최적의 경로를 통해 이루어지도록 한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;호스트&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;인터넷 바깥쪽에 연결되어 일반 사용자들의 네트워크 접속 창구 역할을 한다.
응용 프로그램을 실행할 수 있고, 이를 통해 사용자들은 다양한 서비스를 제공받는다. &lt;/p&gt;
&lt;p&gt;좀 더 정확하게 말하자면, &lt;strong&gt;호스트는 인터넷이 가장자리&lt;/strong&gt;에서 사용자와 직접 상호작용하거나 데이터를 생성, 소비하는 시스템이고 &lt;strong&gt;라우터는 인터넷의 중심부&lt;/strong&gt;에서 데이터의 중계와 경로 최적화를 담당한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;클라이언트와 서버&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;클라이언트는 임의의 인터넷 &lt;strong&gt;서비스를 이용&lt;/strong&gt;하는 프로세스고, 서버는 &lt;strong&gt;서비스를 제공&lt;/strong&gt;하는 프로세스다. 클라이언트와 서버의 개념은 &lt;strong&gt;서비스 단위&lt;/strong&gt;이므로 고정되지 않는다. 따라서 기준이 되는 서비스에 따라 클라이언트가 서버가 될 수도, 서버가 클라이언트가 될 수도 &lt;strong&gt;상대적 개념&lt;/strong&gt;이다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;구조적-모델&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B5%AC%EC%A1%B0%EC%A0%81-%EB%AA%A8%EB%8D%B8&quot; aria-label=&quot;구조적 모델 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;구조적 모델&lt;/h2&gt;
&lt;h3 id=&quot;OSI-7계층-모델&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#OSI-7%EA%B3%84%EC%B8%B5-%EB%AA%A8%EB%8D%B8&quot; aria-label=&quot;OSI 7계층 모델 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;OSI 7계층 모델&lt;/h3&gt;
&lt;p&gt;호스트가 제공하는 복잡한 네트워크 기능을 연관된 그룹으로 묶어 계층 모델로 설명할 수 있다.
다수의 시스템을 서로 연결해 통신하려면 &lt;strong&gt;전체 시스템 구조를 표준화&lt;/strong&gt;해야 한다. 표준화된 구조가 바로 OSI 7계층 모델이다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;물리 계층(Physical Layer)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;호스트를 전송 매체와 연결하기 위한 인터페이스 규칙과 전송 매체의 특성을 다루며, &lt;strong&gt;데이터가 전송 매체를 통해 신호로 전달되도록&lt;/strong&gt; 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;데이터 링크 계층(Data Link Layer)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;주로 물리 계층이 감지한 &lt;strong&gt;오류를 제어&lt;/strong&gt;하는 기능을 수행한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;네트워크 계층(Network Layer)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;데이터가 목적지까지 안전하게 도착하기 위해선 여러 라우터를 거쳐야 한다. 주로 이 과정에서 &lt;strong&gt;올바른 경로를 선택할 수 있도록 지원&lt;/strong&gt;한다. 네트워크 부하가 증가하면 특정 지역에 혼잡이 발생할 수 있는데 &lt;strong&gt;혼잡 제어&lt;/strong&gt; 또한 네트워크 계층이 담당한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;전송 계층(Transport Layer)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;최종적인 경로상의 양 끝단 사이의 연결이 완성되는 계층으로 주로 &lt;strong&gt;데이터 신뢰성과 정확성을 보장&lt;/strong&gt;한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;세션 계층(Session Layer)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;통신 세션의 설정, 유지, 종료를 담당하며, 주로 세션 연결과 연결 복구 작업을 수행한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;표현 계층(Presentation Layer)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;전송되는 데이터의 의미를 잃지 않도록 올바르게 표현하고, 호스트들이 표준화된 방법으로 데이터를 인식할 수 있게 해준다.
ex) 압축, 암호화&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;응용 계층&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;일반 사용자를 위한 다양한 네트워크 &lt;strong&gt;응용 서비스를 지원&lt;/strong&gt;한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/c57454d359ea264666ec676c343081ff/23a6b/OSI.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 58.82352941176471%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAAB0klEQVR42l2T2a7iMAyG+/4vxtVodLgAsQgGaOnpTptudMGTz1U4zERKU8f2799LPLHr9XpxSFVVcjwe5XK5yOf953J3h8NBVquV7Pf7f+w8J0zTJFEUyWazkdPpJMMwqOH/e55naZpG8jyXMAz1fD6fP4B8cE6SVNq2tQ6Tghtj1PFzAZYkiTweD2vbqJ6N3HXdAogRzIqikCSOZL1ei+/7Gnm328ntdtN/9OfzWbbbrXRtJzc/kD9WLiwYgBAYx1E8Y2qpyoeUdSffWamgZVkqW1IhGCcb4Nmyb7pBctNbgEFZUwr0sPWyLFPkySpMO9j0+V/SZgGOE7IrQVbWYupaA8AMMPQw9XBYHB+axq/fa00zTVO5Xq9yv9+1+6QcBL5c/bukeWHl3MqB1g49oAqIADosiRZGqVS2DBhyDwt07DTLpR9nbSJ6GPd9//avLWsPhSto09TKLEoLNSRiHMcane4TDFAc8aG+nGCQAYF0bDAACLakFYTfUpTGdvzLOsU6IqZuJC1KHXxGh1JRGoKSOpm85xB2NIfOLunZucxt583ShNnOfj+6BzAqG5cVwIDSuDege1JQB5Ta0Olhekn7nKQfZgV1r4WFHWBuGtxL+QvXKJyEZSKCzAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;OSI&apos; title=&apos;&apos; src=&apos;/static/c57454d359ea264666ec676c343081ff/ca1dc/OSI.png&apos; srcset=&apos;/static/c57454d359ea264666ec676c343081ff/e7570/OSI.png 170w,
/static/c57454d359ea264666ec676c343081ff/f46e7/OSI.png 340w,
/static/c57454d359ea264666ec676c343081ff/ca1dc/OSI.png 680w,
/static/c57454d359ea264666ec676c343081ff/02d09/OSI.png 1020w,
/static/c57454d359ea264666ec676c343081ff/9d567/OSI.png 1360w,
/static/c57454d359ea264666ec676c343081ff/23a6b/OSI.png 1766w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
한 호스트를 기준으로 데이터 전송은 위아래 양방향으로 모두 가능하며, 두 호스트 사이에서는 좌우 양방향으로 모두 가능하다.
다만, 좌우 간 물리적 데이터 전송은 반드시 아래 물리 계층을 통해 이루어진다.&lt;/p&gt;
&lt;h3 id=&quot;인터네트워킹&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9D%B8%ED%84%B0%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%82%B9&quot; aria-label=&quot;인터네트워킹 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;인터네트워킹&lt;/h3&gt;
&lt;p&gt;네트워크와 네트워크의 연결을 인터네트워킹이라고 한다. 인터네트워킹 시스템은 수 많은 &lt;strong&gt;네트워크를 연결해 데이터를 중개&lt;/strong&gt;할 수 있어야 한다.&lt;/p&gt;
&lt;p&gt;연결된 모든 네트워크에 대해 물리적이고 논리적인 인터페이스를 지원해 둘 이상의 네트워크를 유기적으로 연동할 수 있어야 한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gateway&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;인터네트워킹 기능을 수행하는 시스템을 일반적으로 Gateway라고 한다.
Gateway는 서로 다른 네트워크 간의 데이터 통신을 가능하게 한다. &lt;strong&gt;프로토콜 변환&lt;/strong&gt; 역할을 수행하고, OSI 7계층 중 &lt;strong&gt;응용 계층까지 동작&lt;/strong&gt;할 수 있는 고급 장치이다.&lt;/p&gt;
&lt;h3 id=&quot;프로토콜&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C&quot; aria-label=&quot;프로토콜 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;프로토콜&lt;/h3&gt;
&lt;p&gt;프로토콜은 시스템이 데이터를 교환하기 위해 사용하는 통신 규칙이다. OSI 7 계층 모델에서는 각 계층에서 수행하는 프로토콜이 서로 역할을 분담해 독립적으로 동작한다. 따라서 계층 2에는 계층 2끼리 통신할 수 있는 프로토콜이 존재한다.&lt;/p&gt;
&lt;p&gt;ex) RPC, HTTP, IP 등&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;데이터 단위&lt;/strong&gt;
데이터를 프로토콜에서 정의된 규격에 맞춰야 한다. 이와 같은 &lt;strong&gt;한 단위의 규격으로 묶인 전송 데이터를 데이터 단위&lt;/strong&gt;라고 한다.&lt;/p&gt;
&lt;p&gt;OSI 7계층 모델의 각 계층에 규격화된 데이터에는 고유 명칭이 있다. 계층에 상관 없이 사용할 때는 PDU(Protocol Data Unit)라고 부른다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;계층&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;PDU 이름&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;역할 및 주요 정보&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;물리 계층&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Bits&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;데이터를 비트 단위로 전송 (0과 1).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;데이터 링크 계층&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Frame&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MAC 주소 및 오류 검출 정보(CRC)를 포함한 프레임 단위로 데이터 처리.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;네트워크 계층&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Packet&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IP 주소(출발지/목적지)를 포함한 패킷 단위로 라우팅 수행.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;전송 계층&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Segment/Datagram&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;포트 번호를 포함하여 신뢰성(TCP) 또는 비신뢰성(UDP) 전송.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;세션 계층&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Data&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;세션 설정 및 데이터 흐름 제어.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;표현 계층&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Data&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;데이터 압축, 암호화, 형식 변환.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;응용 계층&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Data&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;최종 사용자 응용 프로그램에서 사용하는 데이터.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&quot;주소의-표현&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A3%BC%EC%86%8C%EC%9D%98-%ED%91%9C%ED%98%84&quot; aria-label=&quot;주소의 표현 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;주소의 표현&lt;/h2&gt;
&lt;p&gt;일반적으로 주소의 개념은 단순히 서로를 구분한다는 고유 목적을 넘어 주소가 가리키는 대상의 특징을 표현할 수 있다.&lt;/p&gt;
&lt;p&gt;시스템을 지칭하는 구분자는 &lt;strong&gt;내부에서 처리되는 숫자 기반의 주소&lt;/strong&gt;와 함께 사용자의 이해와 편리성을 도모하는 &lt;strong&gt;문자로된 이름&lt;/strong&gt;을 제공해야 한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IP 주소&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;IP 프로토콜이 호스트를 구분하기 위해 사용하는 주소 체계이다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IPv4: 32비트의 이진 숫자로 구성된다.&lt;/li&gt;
&lt;li&gt;IPv6: 128비트의 이진 숫자로 구성된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;IP 주소는 임의로 할당되는 것이 아닌 특정 규칙에 따라 인접한 주소들을 그룹으로 묶어 관리한다. 이는 네트워크 계층에서 경로를 선택할 때 중요한 기준이 된다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;호스트 이름&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;위에서 언급한 사용자들의 이해와 편리성을 위한 문자로된 주소가 호스트 이름이다.
이는 DNS를 통해 IP 주소로 변환된다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DNS&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;DNS는 &lt;strong&gt;주소와 이름 정보를 자동으로 유지하고 관리&lt;/strong&gt;하는 분산 데이터베이스 시스템이다.
네트워크가 커지면 DNS에 저장되는 정보의 양이 과도하게 많아지기 때문에 하나의 집중화된 네임 서버가 전체 호스트를 관리하는 것이 아닌 &lt;strong&gt;여러 영역에 분산되어 해당 영역에 위치한 호스트 정보를 관리&lt;/strong&gt;한다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[파일시스템]]></title><description><![CDATA[파일 시스템 컴퓨터에는 다양한 종류의 파일이 있고, 이들은 하드디스크 같은 제…]]></description><link>https://choiwonyu.github.io/파일시스템/</link><guid isPermaLink="false">https://choiwonyu.github.io/파일시스템/</guid><pubDate>Fri, 10 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;파일-시스템&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8C%8C%EC%9D%BC-%EC%8B%9C%EC%8A%A4%ED%85%9C&quot; aria-label=&quot;파일 시스템 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;파일 시스템&lt;/h2&gt;
&lt;p&gt;컴퓨터에는 다양한 종류의 파일이 있고, 이들은 하드디스크 같은 제 2저장장치에 보관된다.
보관 과정에 사용자가 개입하게 되면, 다른 파일들이 훼손되거나 저장장치 내부가 어지럽혀질 수 있다. 따라서 운영체제는 &lt;strong&gt;파일 관리자를 두어 저장장치의 전체 관리를 맡기는데 이를 파일 시스템&lt;/strong&gt;이라고 한다.&lt;/p&gt;
&lt;h3 id=&quot;주요-개념&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A3%BC%EC%9A%94-%EA%B0%9C%EB%85%90&quot; aria-label=&quot;주요 개념 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;주요 개념&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;파일 테이블&lt;/strong&gt;: 파일 시스템에서 파일의 메타데이터와 상태 정보를 관리하는 구조&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;주로 운영체제가 파일과 관련된 정보를 효율적으로 추적하고 접근하기 위해 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;블록&lt;/strong&gt;: 저장장치에서 파일을 관리하는 단위&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;일반적으로 4KB, 8KB&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;파일-종류&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8C%8C%EC%9D%BC-%EC%A2%85%EB%A5%98&quot; aria-label=&quot;파일 종류 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;파일 종류&lt;/h3&gt;
&lt;p&gt;파일은 운영체제 입장에서 다음과 같이 나뉜다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;실행 파일&lt;/strong&gt;: CPU를 이용해 작업하는 파일로 메모리에 올라가 프로세스가 되는 파일&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;데이터 파일&lt;/strong&gt;: 실행 파일이 작업하는 데 필요한 데이터를 모아놓은 파일&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;파일-속성&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8C%8C%EC%9D%BC-%EC%86%8D%EC%84%B1&quot; aria-label=&quot;파일 속성 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;파일 속성&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;파일 이름&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;파일의 논리적 이름으로 파일을 식별하기 위해 사용됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;파일 크기&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;파일의 총 크기(바이트 단위).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;생성/수정/접근 시간&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;파일이 생성된 시간, 마지막으로 수정된 시간, 마지막으로 접근한 시간.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;파일의 위치 정보&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;파일이 디스크에 저장된 블록(또는 클러스터)의 위치.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;접근 권한&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;읽기, 쓰기, 실행 권한 등 파일의 접근 제어를 위한 정보.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;파일 속성 정보&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;숨김 파일, 시스템 파일, 읽기 전용 여부와 같은 속성.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;파일 상태&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;파일이 열려 있는지, 닫혀 있는지 등.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;파일 소유자 및 그룹&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;파일을 소유한 사용자 및 그룹 정보.
파일 속성은 파일의 파일 헤더에 기록되며, 파일 헤더는 각 파일의 맨 앞부분에 저장된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;저장장치-관리-기법&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A0%80%EC%9E%A5%EC%9E%A5%EC%B9%98-%EA%B4%80%EB%A6%AC-%EA%B8%B0%EB%B2%95&quot; aria-label=&quot;저장장치 관리 기법 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;저장장치 관리 기법&lt;/h2&gt;
&lt;h3 id=&quot;파티션&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8C%8C%ED%8B%B0%EC%85%98&quot; aria-label=&quot;파티션 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;파티션&lt;/h3&gt;
&lt;p&gt;저장장치를 2개 이상의 묶음으로 나누는 것을 파티션을 나눈다고 하며, 파티션은 &lt;strong&gt;논리적으로 구분된 저장장치 영역을 의미&lt;/strong&gt;한다. 분리된 파티션마다 파일 시스템을 탑재해 논리적으로 구분하는 방식으로 구현된다. 하지만 파티션 확장성 부족과 자원 분배가 비효율적인 문제가 있어 유닉스에서는 &lt;strong&gt;여러 개의 파티션을 하나로 통합하는 기능&lt;/strong&gt;을 제공하는데 이를 마운트라고 한다.&lt;/p&gt;
&lt;h3 id=&quot;포맷&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8F%AC%EB%A7%B7&quot; aria-label=&quot;포맷 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;포맷&lt;/h3&gt;
&lt;p&gt;포맷은 &lt;strong&gt;저장장치의 파일 시스템을 초기화하는 작업&lt;/strong&gt;이다.&lt;/p&gt;
&lt;h3 id=&quot;조각-모음&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A1%B0%EA%B0%81-%EB%AA%A8%EC%9D%8C&quot; aria-label=&quot;조각 모음 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;조각 모음&lt;/h3&gt;
&lt;p&gt;조각 모음은 디스크에 저장된 &lt;strong&gt;조각난 파일 데이터를 재배치하여 데이터 접근 속도를 최적화하는 과정&lt;/strong&gt;이다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;데이터 접근 속도 향상&lt;/strong&gt;: 디스크의 읽기/쓰기 속도 증가&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;디스크 수명 연장&lt;/strong&gt;: 헤드의 이동이 줄어들어 디스크 마모 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;단점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;시간 소모&lt;/strong&gt;: 시간이 오래 걸림&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSD 비효율&lt;/strong&gt;: SSD에서 조각 모음을 수행하면 오히려 불필요한 쓰기로 수명이 단축될 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;파일-구조&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8C%8C%EC%9D%BC-%EA%B5%AC%EC%A1%B0&quot; aria-label=&quot;파일 구조 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;파일 구조&lt;/h2&gt;
&lt;p&gt;파일은 하나의 데이터 덩어리다. 파일 구조는 이 &lt;strong&gt;덩어리를 어떻게 구성하느냐&lt;/strong&gt;에 따라 다음과 같이 구분된다.&lt;/p&gt;
&lt;h3 id=&quot;순차-파일-구조&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%88%9C%EC%B0%A8-%ED%8C%8C%EC%9D%BC-%EA%B5%AC%EC%A1%B0&quot; aria-label=&quot;순차 파일 구조 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;순차 파일 구조&lt;/h3&gt;
&lt;p&gt;가장 기본적인 파일구조다. 순차 파일 구조는 파일 내용이 하나의 긴 줄로 늘어선 형태다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;단순성&lt;/strong&gt;: 구현이 쉽고, 데이터가 정렬되어 있어 검색과 처리가 직관적이다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;효율적 일괄 처리&lt;/strong&gt;: 데이터를 순차적으로 처리하는 작업에 적합하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;단점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;랜덤 접근 비효율&lt;/strong&gt;: 특정 데이터를 검색하려면 순차적으로 읽어야 하므로 시간이 오래 걸린다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;삽입/삭제의 비효율&lt;/strong&gt;: 중간에 데이터를 삽입/삭제 하려면 데이터를 재구성해야 한다.
&lt;strong&gt;사용 사례&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;거래 내역, 로그 파일 등 &lt;strong&gt;순차적으로 추가되고 전체를 자주 처리하는 데이터에 적합&lt;/strong&gt;하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;인덱스-파일-구조&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9D%B8%EB%8D%B1%EC%8A%A4-%ED%8C%8C%EC%9D%BC-%EA%B5%AC%EC%A1%B0&quot; aria-label=&quot;인덱스 파일 구조 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;인덱스 파일 구조&lt;/h3&gt;
&lt;p&gt;순차 파일 구조의 단점을 해결한 파일 구조다. &lt;strong&gt;데이터 파일과 별도로 키 값과 해당 데이터 위치를 저장한 인덱스 파일을 사용&lt;/strong&gt;한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;빠른 검색&lt;/strong&gt;: 순차 파일보다 특정 데이터를 빠르게 검색 가능하다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;효율적 수정&lt;/strong&gt;: 데이터를 수정해도 전체 파일을 재구성할 필요 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;단점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;추가 저장 공간 필요&lt;/strong&gt;: 인덱스 파일을 유지하기 위한 추가 공간이 필요하다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;인덱스 유지 비용&lt;/strong&gt;: 데이터가 변경될 때마다 인덱스 파일을 업데이트해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;사용 사례&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;데이터베이스처럼 &lt;strong&gt;데이터가 많고 특정 키 값으로 자주 검색되는 경우에 적합&lt;/strong&gt;하다.&lt;/p&gt;
&lt;h3 id=&quot;직접-파일-구조&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A7%81%EC%A0%91-%ED%8C%8C%EC%9D%BC-%EA%B5%AC%EC%A1%B0&quot; aria-label=&quot;직접 파일 구조 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;직접 파일 구조&lt;/h3&gt;
&lt;p&gt;저장하려는 &lt;strong&gt;데이터의 특정 값에 어떤 관계를 정의해 물리적인 주소로 바로 변환하는 파일 구조&lt;/strong&gt;다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;빠른 검색 속도&lt;/strong&gt;: 데이터 위치를 직접 계산하여 접근하므로 검색 속도가 매우 빠르다.
&lt;strong&gt;단점&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;충돌 문제&lt;/strong&gt;: 서로 다른 키 값이 동일한 해시 주소로 계산되는 경우 충돌 발생&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;복잡한 구현&lt;/strong&gt;: 해시 함수 설계와 충돌 처리 메커니즘이 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;사용 사례&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;빠른 검색이 중요한&lt;/strong&gt; 캐시 등에 적합하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;경로&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B2%BD%EB%A1%9C&quot; aria-label=&quot;경로 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;경로&lt;/h2&gt;
&lt;p&gt;경로는 전체 디렉터리 중 &lt;strong&gt;파일이 어디에 있는지를 나타내는 정보&lt;/strong&gt;다. &lt;/p&gt;
&lt;h3 id=&quot;절대-경로&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A0%88%EB%8C%80-%EA%B2%BD%EB%A1%9C&quot; aria-label=&quot;절대 경로 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;절대 경로&lt;/h3&gt;
&lt;p&gt;파일 시스템의 루트 디렉터리를 기준으로 파일이나 디렉터리의 위치를 나타내는 경로&lt;/p&gt;
&lt;p&gt;ex) &lt;code class=&quot;language-text&quot;&gt;/home/user/documents/file.txt&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;상대-경로&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%83%81%EB%8C%80-%EA%B2%BD%EB%A1%9C&quot; aria-label=&quot;상대 경로 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;상대 경로&lt;/h3&gt;
&lt;p&gt;현재 있는 위치를 기준으로 파일의 위치를 나타내는 경로&lt;/p&gt;
&lt;p&gt;ex) &lt;code class=&quot;language-text&quot;&gt;.\file.txt&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;할당-방식&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%95%A0%EB%8B%B9-%EB%B0%A9%EC%8B%9D&quot; aria-label=&quot;할당 방식 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;할당 방식&lt;/h2&gt;
&lt;h3 id=&quot;연결-할당&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%97%B0%EA%B2%B0-%ED%95%A0%EB%8B%B9&quot; aria-label=&quot;연결 할당 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;연결 할당&lt;/h3&gt;
&lt;p&gt;파일에 속한 데이터를 &lt;strong&gt;연결 리스트로 관리하는 방식&lt;/strong&gt;이다. 파일 테이블에는 시작 블록에 대한 정보만 저장하고, 나머지 데이터는 시작 블록부터 연결하여 저장한다. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;외부 단편화 방지&lt;/strong&gt;: 연속적인 물리 배치가 필요 없으므로 빈 블록을 효율적으로 활용 가능하다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;동적 파일 크기 증가 가능&lt;/strong&gt;: 필요한 만큼 블록을 추가할 수 있어 크기 제한이 상대적으로 적다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;블록 삽입 및 삭제 용이&lt;/strong&gt;: 중간에 블록을 추가하거나 삭제해도 다른 블록에 영향을 미치지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;단점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;랜덤 접근 어려움&lt;/strong&gt;: 데이터 블록이 물리적으로 연속되지 않아 순차 접근만 가능하다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;추가 저장 공간 필요&lt;/strong&gt;: 다음 블록의 포인터를 저장해야 하므로, 일부 공간이 낭비된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;인덱스-할당&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9D%B8%EB%8D%B1%EC%8A%A4-%ED%95%A0%EB%8B%B9&quot; aria-label=&quot;인덱스 할당 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;인덱스 할당&lt;/h3&gt;
&lt;p&gt;이 할당 방식에서 &lt;strong&gt;파일 제어 테이블은 인덱스 블록을 연결&lt;/strong&gt;한다. &lt;strong&gt;인덱스 블록 안에는 실제 데이터의 위치 정보(블록 정보)가 순서대로 보관&lt;/strong&gt;되어 있다. 유닉스는 인덱스 할당 방식을 사용해 크기에 제한이 없다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;인덱스 블록&lt;/strong&gt;: 데이터 블록들의 주소를 저장한 테이블&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;데이터 블록&lt;/strong&gt;: 실제 데이터가 저장된 블록들&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;빈-블록-관리&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B9%88-%EB%B8%94%EB%A1%9D-%EA%B4%80%EB%A6%AC&quot; aria-label=&quot;빈 블록 관리 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;빈 블록 관리&lt;/h2&gt;
&lt;p&gt;파일 시스템은 빈 블록의 정보만 모아놓은 &lt;strong&gt;빈 공간 리스트&lt;/strong&gt;를 사용해 빈 공간을 효율적으로 관리한다.
파일이 삭제되면 &lt;strong&gt;해당 파일의 데이터 블록들 주소를 빈 공간 리스트에 등록하는 방식&lt;/strong&gt;이다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;디스크 복구 가능&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;시간이 오래 걸리는 공간을 비우는 작업 생략 가능&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[입출력 시스템과 저장장치]]></title><description><![CDATA[입출력 버스 ✅ 컴퓨터는 필수 장치인 CPU…]]></description><link>https://choiwonyu.github.io/입출력 시스템과 저장장치/</link><guid isPermaLink="false">https://choiwonyu.github.io/입출력 시스템과 저장장치/</guid><pubDate>Thu, 09 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;입출력-버스&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9E%85%EC%B6%9C%EB%A0%A5-%EB%B2%84%EC%8A%A4&quot; aria-label=&quot;입출력 버스 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;입출력 버스&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;✅ 컴퓨터는 필수 장치인 CPU와 메모리, 주변장치인 입출력장치와 저장장치로 구성&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ 각 장치는 메인보드에 있는 버스로 연결된다.&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;여러 입출력 작업을 병렬적으로 처리할 수 있도록 여러 데이터 전송 경로를 두는데 이를 채널&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;✅ &lt;strong&gt;주변 장치&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;저속 주변장치&lt;/strong&gt;: 메모리와 주변장치 사이에 오고 가는 데이터 양이 적어 데이터 전송률이 낮다.
ex) 키보드, 마우스, 프린터 등&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;고속 주변장치&lt;/strong&gt;: 대용량의 데이터가 오고 가기 때문에 데이터 전송률이 높다.
ex) 그래픽카드, 하드디스크, SSD 등
고속 주변장치가 저속 주변장치와 입출력 버스를 공유하면 입출력 속도가 현저히 저하되므로, &lt;strong&gt;고속 입출력 버스와 저속 입출력 버스로 분리하여 운영&lt;/strong&gt;한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;✅ 입출력 버스가 구분되기 때문에 입출력 장치에 대한 관리를 I/O Controller가 수행한다.&lt;/strong&gt; &lt;/p&gt;
&lt;h3 id=&quot;-DMA직접-메모리-접근&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-DMA%EC%A7%81%EC%A0%91-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%A0%91%EA%B7%BC&quot; aria-label=&quot; DMA직접 메모리 접근 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 DMA(직접 메모리 접근)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;CPU의 개입 없이 I/O Controller가 메모리에 직접 접근할 수 있는 기술&lt;/strong&gt;이다.&lt;br&gt;
✅ &lt;strong&gt;CPU의 작업 공간과 DMA Controller의 작업 공간이 겹치는 것을 방지하기 위해 메인메모리의 일부를 DMA Controller에 할당&lt;/strong&gt;한다.&lt;br&gt;
✅ I/O 작업이 완료되면, I/O Controller는 &lt;strong&gt;CPU에 인터럽트를 보내 작업 완료를 알린다.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;-폴링-방식&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%ED%8F%B4%EB%A7%81-%EB%B0%A9%EC%8B%9D&quot; aria-label=&quot; 폴링 방식 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 폴링 방식&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;✅ CPU가 일정한 간격으로 IO 장치를 확인하며 데이터가 준비되었는지 직접 검사하는 방식&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ 특징&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;소프트웨어 기반&lt;/strong&gt;: CPU가 직접 장치를 확인&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CPU 부하 증가&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;비효율적, 성능 저하 초래&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-인터럽트-방식&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8-%EB%B0%A9%EC%8B%9D&quot; aria-label=&quot; 인터럽트 방식 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 인터럽트 방식&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;✅ IO 장치에서 데이터가 준비되었을 때 CPU에 신호(인터럽트)를 보내 작업을 요청하는 방식&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;✅ 특징&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;하드웨어 기반&lt;/strong&gt;: 인터럽트 컨트롤러와 같은 추가 하드웨어 필요&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CPU 부하 감소&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;구현이 복잡함&lt;/strong&gt;: 인터럽트 핸들러를 운영체제에서 구현해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-인터럽트-종류&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8-%EC%A2%85%EB%A5%98&quot; aria-label=&quot; 인터럽트 종류 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 인터럽트 종류&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;인터럽트는 입출력 장치에서만 발생하는 것이 아닌 &lt;strong&gt;CPU가 시스템을 효율적으로 운영하는 데 필수적인 메커니즘&lt;/strong&gt;이다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;구분&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;설명&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;예시&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;하드웨어 인터럽트&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;외부 장치(입출력 장치, 타이머, 전원 등)에서 발생하는 인터럽트&lt;/td&gt;
&lt;td&gt;키보드 입력, 디스크 데이터 전송 완료, 타이머&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;소프트웨어 인터럽트&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;프로그램이 명령어를 실행하여 발생하는 인터럽트&lt;/td&gt;
&lt;td&gt;시스템 콜, 예외 처리 (ex. &lt;code class=&quot;language-text&quot;&gt;INT 0x80&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;예외 인터럽트&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;프로그램 실행 중 오류가 발생할 때 발생하는 인터럽트&lt;/td&gt;
&lt;td&gt;0으로 나누기 오류, 페이지 폴트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;비동기 인터럽트&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;현재 실행 중인 코드와 무관하게 발생하는 인터럽트&lt;/td&gt;
&lt;td&gt;키보드 입력, 네트워크 데이터 수신&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;동기 인터럽트&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;실행 중인 명령어의 결과로 발생하는 인터럽트&lt;/td&gt;
&lt;td&gt;시스템 콜, 잘못된 명령어 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;✅ &lt;strong&gt;인터럽트 처리 과정&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I/O 장치나 시스템 이벤트가 &lt;strong&gt;인터럽트를 발생&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;CPU는 &lt;strong&gt;현재 실행 중인 작업을 중단&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;인터럽트 벡터를 이용해 &lt;strong&gt;적절한 인터럽트 핸들러를 호출&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;인터럽트 핸들러가 인터럽트를 처리한 후 &lt;strong&gt;CPU가 원래 작업으로 복귀&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;✅ &lt;strong&gt;인터럽트 벡터와 인터럽트 핸들링&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;인터럽트 벡터&lt;/strong&gt;: &lt;strong&gt;각 인터럽트 신호의 핸들러 주소를 저장한 테이블&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;인터럽트 핸들러&lt;/strong&gt;: 특정 인터럽트 발생 시 실행되는 코드&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;✅ &lt;strong&gt;다중 인터럽트 발생 시 처리 방식&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;우선순위 기반 처리&lt;/strong&gt; → 중요한 인터럽트를 먼저 처리 (ex: 타이머 인터럽트)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;중첩 인터럽트(Nested Interrupts)&lt;/strong&gt; → 높은 우선순위 인터럽트가 낮은 우선순위 인터럽트를 중단하고 먼저 실행&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;인터럽트 큐(Interrupt Queue)&lt;/strong&gt; → 우선순위가 같은 경우 FIFO(First-In-First-Out)로 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;저장장치&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A0%80%EC%9E%A5%EC%9E%A5%EC%B9%98&quot; aria-label=&quot;저장장치 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;저장장치&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;--하드디스크&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#--%ED%95%98%EB%93%9C%EB%94%94%EC%8A%A4%ED%81%AC&quot; aria-label=&quot;  하드디스크 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌  하드디스크&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;섹터는 하드디스크의 가장 작은 저장 단위&lt;/strong&gt;다. 하나의 섹터에는 한 덩어리의 데이터가 저장된다.
트랙은 플래터에서 회전축을 중심으로 데이터가 기록되는 동일한 동심원상에 있는 섹터의 집합이다. 여러 개의 플래터에 있는 같은 트랙의 집합을 실린더라고 부른다.&lt;/p&gt;
&lt;p&gt;하드디스크에서 &lt;strong&gt;데이터를 가져오는 데 걸리는 총시간은 탐색 시간 + 회전 지연 시간 + 전송 시간이다. 이 중 가장 오래 걸리는 것이 탐색 시간&lt;/strong&gt;이다.&lt;/p&gt;
&lt;h3 id=&quot;-SSD&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-SSD&quot; aria-label=&quot; SSD permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 SSD&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;하드디스크는 모터로 헤드를 이동시키기 때문에 느리다. &lt;strong&gt;반면 SSD는 전자의 이동으로 작동하기 때문에 하드디스크보다 훨씬 속도가 빠르고&lt;/strong&gt; 소음을 발생시키지 않는다. 하지만 가격이 훨씬 비싸다는 단점이 있다.&lt;/p&gt;
&lt;p&gt;SS의 가장 큰 장점은 빠른 데이터 입출력 속도다. 현재는 하드디스크의 전송 속도를 수십 배 뛰어넘고 있다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;디스크-스케줄링-알고리즘&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%94%94%EC%8A%A4%ED%81%AC-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98&quot; aria-label=&quot;디스크 스케줄링 알고리즘 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;디스크 스케줄링 알고리즘&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;디스크의 데이터 전송 시간 중 탐색 시간이 가장 느리다.
따라서 &lt;strong&gt;디스크 스케줄링을 통해 탐색을 위한 트랙의 이동을 최소화&lt;/strong&gt;한다. &lt;/p&gt;
&lt;h3 id=&quot;-FCSFS-디스크-스케줄링&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-FCSFS-%EB%94%94%EC%8A%A4%ED%81%AC-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81&quot; aria-label=&quot; FCSFS 디스크 스케줄링 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 FCSFS 디스크 스케줄링&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;가장 단순한 디스크 스케줄링 방식으로 요청이 들어온 트랙 순서대로 서비스한다.&lt;/p&gt;
&lt;h3 id=&quot;-SSTF-디스크-스케줄링&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-SSTF-%EB%94%94%EC%8A%A4%ED%81%AC-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81&quot; aria-label=&quot; SSTF 디스크 스케줄링 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 SSTF 디스크 스케줄링&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;현재 헤드가 있는 위치에서 가장 가까운 트랙부터 서비스한다.&lt;/p&gt;
&lt;h3 id=&quot;-블록-SSTF-디스크-스케줄링&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EB%B8%94%EB%A1%9D-SSTF-%EB%94%94%EC%8A%A4%ED%81%AC-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81&quot; aria-label=&quot; 블록 SSTF 디스크 스케줄링 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 블록 SSTF 디스크 스케줄링&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;큐에 있는 트랙 요청을 일정한 블록 형태로 묶은 후 블록으로 묶인 트랙들만 순서를 변경한다.&lt;/p&gt;
&lt;h3 id=&quot;-SCAN-디스크-스케줄링&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-SCAN-%EB%94%94%EC%8A%A4%ED%81%AC-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81&quot; aria-label=&quot; SCAN 디스크 스케줄링 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 SCAN 디스크 스케줄링&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;헤드가 움직이기 시작하면 맨 마지막 트랙에 도착할 때까지 되돌아 가지 않고 계속 앞으로만 전진하면서 요청받은 트랙을 서비스한다.&lt;/p&gt;
&lt;h3 id=&quot;-C-SCAN-디스크-스케줄링&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-C-SCAN-%EB%94%94%EC%8A%A4%ED%81%AC-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81&quot; aria-label=&quot; C SCAN 디스크 스케줄링 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 C-SCAN 디스크 스케줄링&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;SCAN 기법을 변형한 것으로, 헤드가 한쪽 방향으로 움직일 때는 요청받은 트랙을 서비스하고 반대 방향으로 돌아올 때는 서비스하지 않는다.&lt;/p&gt;
&lt;h3 id=&quot;-LOOK-디스크-스케줄링&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-LOOK-%EB%94%94%EC%8A%A4%ED%81%AC-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81&quot; aria-label=&quot; LOOK 디스크 스케줄링 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 LOOK 디스크 스케줄링&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;더 이상 서비스할 트랙이 없으면 헤드가 끝까지 가지 않고 중간에서 방향을 바꾼다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;RAID&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#RAID&quot; aria-label=&quot;RAID permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;RAID&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;저장장치에는 최대 사용 횟수가 정해져 있다. 따라서 &lt;strong&gt;중요한 데이터는 수시로 백업해야 하는데 이를 자동으로 수행하는 시스템이 RAID(Redundant Array of Independant Disks)&lt;/strong&gt;이다.&lt;/p&gt;
&lt;p&gt;RAID는 동일한 규격의 디스크를 여러 개 모아 구성하며, 장애가 발생했을 때 데이터를 복구하는 데 사용된다. 이는 &lt;strong&gt;하나의 원본 디스크와 같은 크기의 백업 디스크에 같은 내용을 동시에 저장하고, 한 디스크가 고장 났을 때 다른 디스크를 사용해 복구하는 방식으로 동작하며, 이를 미러링&lt;/strong&gt;이라고 한다.&lt;/p&gt;
&lt;p&gt;RAID에는 여러 디스크에 데이터를 동시에 저장해 데이터의 입출력 속도를 높이는 방식도 있다. 이렇게 &lt;strong&gt;데이터를 여러 조각으로 나눠 보내는 방식을 스트라이핑&lt;/strong&gt;이라고 한다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[가상 메모리]]></title><description><![CDATA[…]]></description><link>https://choiwonyu.github.io/가상 메모리/</link><guid isPermaLink="false">https://choiwonyu.github.io/가상 메모리/</guid><pubDate>Tue, 07 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;가상-메모리&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B0%80%EC%83%81-%EB%A9%94%EB%AA%A8%EB%A6%AC&quot; aria-label=&quot;가상 메모리 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;가상 메모리&lt;/h2&gt;
&lt;p&gt;물리 메모리의 크기와 상관없이 프로세스에 커다란 메모리 공간을 제공하는 기술이다.
프로세스는 운영체제가 어디에 있는지, 물리 메모리의 크기가 어느 정도인지 신경 쓰지 않고 메모리를 마음대로 사용할 수 있다. 이러한 &lt;strong&gt;가상 메모리 시스템은 메모리 관리자가 운영&lt;/strong&gt;한다.&lt;/p&gt;
&lt;p&gt;가상 메모리에서 메모리 관리자가 사용할 수 있는 메모리의 전체 크기는 &lt;strong&gt;물리 메모리(실제 메모리)와 스왑 영역을 합한 크기&lt;/strong&gt;다. 메모리 관리자는 물리 메모리와 스왑 영역을 합쳐 프로세스가 사용하는 가상 주소를 실제 메모리의 물리 주소로 변환하는데 이러한 작업을 동적 주소 변환(DAT)라고 한다.&lt;/p&gt;
&lt;h3 id=&quot;매핑-테이블&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%A7%A4%ED%95%91-%ED%85%8C%EC%9D%B4%EB%B8%94&quot; aria-label=&quot;매핑 테이블 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;매핑 테이블&lt;/h3&gt;
&lt;p&gt;메모리 관리자는 가상 주소와 물리 주소를 일대일로 매핑한 테이블로 관리한다.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/94cd0f6fa3c9eab8bf82c6bb832bd31a/fc0cd/table.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 47.05882352941176%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAABFUlEQVR42nWSiY6FMAhF+/8/qrEutbWuVaaHGczLS4aEgCyXC9WVUmRZFokxSkpJjuOQ53lk33fxIYkfg6Saa4dZhvpdyiUIteM4St/3qvjbtonLOWszoIADfJ6n2jhXkGHQBv2Os8x/MSyDu64TMBDqHGCwogHLFGRd1zokazxMk6w1nmsMIHqwvzWLWvqodbAhSWKqjQZIjInee2ma5l3NasyGELT3BYQuE6BOAjXG5LgVoPgoPrXc7L7vt++6Lj2F424UEsQaQyw3QsiZDyMIwJDV2ZBaBqN6Q9iwFkX2KIDDwF7UfADtdalr21ZjdjoH1e/jwuYb8JMtQxnOduSMqQLKP2JnQGFjK9lJ8AEGBLV/+AeRJLe7ZoxoowAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;table&apos; title=&apos;&apos; src=&apos;/static/94cd0f6fa3c9eab8bf82c6bb832bd31a/ca1dc/table.png&apos; srcset=&apos;/static/94cd0f6fa3c9eab8bf82c6bb832bd31a/e7570/table.png 170w,
/static/94cd0f6fa3c9eab8bf82c6bb832bd31a/f46e7/table.png 340w,
/static/94cd0f6fa3c9eab8bf82c6bb832bd31a/ca1dc/table.png 680w,
/static/94cd0f6fa3c9eab8bf82c6bb832bd31a/02d09/table.png 1020w,
/static/94cd0f6fa3c9eab8bf82c6bb832bd31a/9d567/table.png 1360w,
/static/94cd0f6fa3c9eab8bf82c6bb832bd31a/fc0cd/table.png 1624w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
위 매핑 테이블은 세그먼테이션 매핑 테이블 예시이다. 프로세스 A의 어떤 값이 필요하다면, 물리 메모리의 세그먼트 0에서 원하는 데이터를 가져오면 된다.&lt;/p&gt;
&lt;h3 id=&quot;페이징과-세그먼테이션&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8E%98%EC%9D%B4%EC%A7%95%EA%B3%BC-%EC%84%B8%EA%B7%B8%EB%A8%BC%ED%85%8C%EC%9D%B4%EC%85%98&quot; aria-label=&quot;페이징과 세그먼테이션 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;페이징과 세그먼테이션&lt;/h3&gt;
&lt;p&gt;메모리 관리 방식은 크게 &lt;strong&gt;고정 분할 방식인 페이징&lt;/strong&gt;과 &lt;strong&gt;가변 분할 방식인 세그먼테이션&lt;/strong&gt;으로 나뉜다. 페이징은 페이지 매핑 테이블을 사용해 주소를 변환하고, 세그먼테이션은 세그멘테이션 매핑 테이블을 사용해 주소를 변환한다.&lt;/p&gt;
&lt;h3 id=&quot;지역성&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A7%80%EC%97%AD%EC%84%B1&quot; aria-label=&quot;지역성 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;지역성&lt;/h3&gt;
&lt;p&gt;기억장치에 접근하는 패턴이 메모리 전체에 고루 분포되는 것이 아닌 특정 영역에 집중되는 성질을 나타낸다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;공간의 지역성: 현재 위치에서 가까운 데이터에 접근할 확률이 먼 거리에 있는 데이터에 접근할 확률보다 높음&lt;/li&gt;
&lt;li&gt;시간의 지역성: 현재를 기준으로 가장 가까운 시간에 접근한 데이터가 더 먼 시간에 접근한 데이터보다 사용될 확률이 높음&lt;/li&gt;
&lt;li&gt;순차적 지역성: 작업이 순서대로 진행됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;지역성 이론은 특히 캐시에서 이용되는 이론이다. 캐시는 시간적으로나 지역적으로 가까이 있는 데이터를 가져옴으로써 &lt;strong&gt;캐시 적중률을 높인다.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;논리-주소-가상-주소-물리-주소&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%85%BC%EB%A6%AC-%EC%A3%BC%EC%86%8C-%EA%B0%80%EC%83%81-%EC%A3%BC%EC%86%8C-%EB%AC%BC%EB%A6%AC-%EC%A3%BC%EC%86%8C&quot; aria-label=&quot;논리 주소 가상 주소 물리 주소 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;논리 주소, 가상 주소, 물리 주소&lt;/h3&gt;
&lt;p&gt;가상 메모리 시스템은 프로세스가 물리 메모리를 직접 사용하는 대신 논리 주소(Logical Address)와 가상 주소(Virtual Address)를 사용하여 메모리에 접근하도록 설계되어 있다. 이러한 주소를 물리 주소(Physical Address)로 변환하는 역할은 메모리 관리 유닛(MMU)이 담당한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;논리 주소 (Logical Address)&lt;/strong&gt;: CPU가 생성하는 주소로, 프로그램의 관점에서 사용하는 주소&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;가상 주소 (Virtual Address)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;운영체제가 정의한 가상 메모리 공간의 주소로, 논리 주소와 1:1 매핑&lt;/li&gt;
&lt;li&gt;논리 주소와 가상 주소는 사실상 동일한 경우가 많음&lt;/li&gt;
&lt;li&gt;논리 주소는 사용자 관점, 가상 주소는 운영체제 관점에서 표현된다는 점이 주요 차이&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;물리 주소 (Physical Address)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;실제 메모리(RAM)의 주소로, 하드웨어가 메모리에 접근할 때 사용하는 주소&lt;/li&gt;
&lt;li&gt;가상 주소는 메모리 관리 유닛(MMU)에 의해 물리 주소로 변환&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;페이징-기법&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8E%98%EC%9D%B4%EC%A7%95-%EA%B8%B0%EB%B2%95&quot; aria-label=&quot;페이징 기법 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;페이징 기법&lt;/h2&gt;
&lt;p&gt;고정 분할 방식으로 메모리를 관리하는 기법이다. 가상 주소 공간과 물리 주소 공간을 같은 크기로 나누어 사용한다. 가상 주소 공간에서 분할된 각 영역을 페이지, 물리 주소 공간의 각 영역을 프레임이라 부른다.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/1c022537df5a5a297aba32e6c6c10592/598cb/paging.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 85.29411764705883%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAABYlAAAWJQFJUiTwAAAB7klEQVR42p2UiY6qUBBE/f/PMsZkNOoY931DRNzYZa+hGnGeL5JJvAleiM3p6u66VJAtx3FwPp+x3+9xOp1gWRbiOEbZStMUhmFIrKqq0HUdruvKfxX+XC4XbLdbtNttTKdTCfJ9H2EYCjhJkhfY/X7HcrnEcDhEq9VCt9vF8Xj8BTLDbDZDrVZDr9fDarUSGK8oigTCnZVQPXfGENrpdEQEGS8KFUWRjOv1Wu6pMAgCuWzblpjr9QrP8wTKuPl8LgImk8krkA/MVq1WJYjPfJEg9vZ2u8lzoZj3u90Om80GjUYDg8FA4p5AZmbfqLAYDF9io8MwL5l9DB5tYCIKGI/HaDab6Pf78s4TeDgcRHa9XpedcJb6bhHMRCyZcaPRSHZW8QRqmiYZC6CuH+GHMZSrD9uPJNBwI+hWiCDKJ84e/zskKn8CmZFZimmxJFFuBnCDBKZxw0ZR8dUdQ9V0WKZZ6tFK4S1e/987fm5utkTPfLZeLjK/aTKQIvYt8B1Uygrz8jhN+vQ7M/BisZDB/Ql8t5ysf+mjx4UTuBeeKy25bJlehDgjUlEB4jTZgo8UetmkkzQ3PoFUamYD+RjIofAVnlv6jv3jQAj+CGjfY4RRLAr5NeKJ4FeFaj/qYZw87JMZlx8Hnlcamee5DPgDgXIbelJc+fcAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;paging&apos; title=&apos;&apos; src=&apos;/static/1c022537df5a5a297aba32e6c6c10592/ca1dc/paging.png&apos; srcset=&apos;/static/1c022537df5a5a297aba32e6c6c10592/e7570/paging.png 170w,
/static/1c022537df5a5a297aba32e6c6c10592/f46e7/paging.png 340w,
/static/1c022537df5a5a297aba32e6c6c10592/ca1dc/paging.png 680w,
/static/1c022537df5a5a297aba32e6c6c10592/02d09/paging.png 1020w,
/static/1c022537df5a5a297aba32e6c6c10592/598cb/paging.png 1230w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
&lt;strong&gt;가상 주소의 분할된 각 영역을 페이지&lt;/strong&gt;라고 부르며 &lt;strong&gt;물리 메모리의 각 영역은 가상 주소의 페이지와 구분하기 위해 프레임&lt;/strong&gt;이라고 부른다. &lt;strong&gt;페이지와 프레임의 크기는 같다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;페이지 5의 프레임과 같이 invalid로 표시된 부분은 스왑 영역에 있다는 의미이다.&lt;/p&gt;
&lt;h3 id=&quot;주소-변환-과정&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A3%BC%EC%86%8C-%EB%B3%80%ED%99%98-%EA%B3%BC%EC%A0%95&quot; aria-label=&quot;주소 변환 과정 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;주소 변환 과정&lt;/h3&gt;
&lt;p&gt;&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/b1deaf3fb84130ca32d699854ccbc113/f97d7/page-address.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 36.47058823529412%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAABYlAAAWJQFJUiTwAAABgUlEQVR42m2RW4/aMBBG+f+/p1IfK5UuXXYLKoXNjUtIAgHnAiEkcW5w1k772JHGI4/Hx575Rs/nk77vaZqG+72glhXPRwcqn8uea9nRti1BnFPJBm36vK0lRVGQXa9DlFIOdSPP8zFNC8/zeP054feHw/SPg2NbFKWklAoWBNjOmu1up2k4vsD0BHEkMAyDMDyRXq7EcayAuw3uZk2cJFjGkncn5Mtsj20a3PKcummJoog0TQlPJ/JLwtepybfVgXMYsFyuVDySZymJYoxerSM/PgJOB4+XyQR3t2Xj2KxWSwW8k5cNkRDD62EYclJQf++SxtHw4/mvN14Wa76bgkuqgG/2kal1wHe3jMdjvL2H6+6xLGtoo6xbxPk8gDSw6zoFTxAiwvd95rN3ZsaW+TZSwJTRTbUgi3xoZ7FYqEJBrlq93TK6/oFse8LjcZiVnqUWUQ9fi6i9qiq6tuHR/82NarWUZaUUvpNl2VCgFdOH6i4Ptei9VrKua/5nz3+u7RPc4wvG5QVTXwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;page address&apos; title=&apos;&apos; src=&apos;/static/b1deaf3fb84130ca32d699854ccbc113/ca1dc/page-address.png&apos; srcset=&apos;/static/b1deaf3fb84130ca32d699854ccbc113/e7570/page-address.png 170w,
/static/b1deaf3fb84130ca32d699854ccbc113/f46e7/page-address.png 340w,
/static/b1deaf3fb84130ca32d699854ccbc113/ca1dc/page-address.png 680w,
/static/b1deaf3fb84130ca32d699854ccbc113/02d09/page-address.png 1020w,
/static/b1deaf3fb84130ca32d699854ccbc113/9d567/page-address.png 1360w,
/static/b1deaf3fb84130ca32d699854ccbc113/f97d7/page-address.png 2000w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
편의를 위해 가상 주소 공간과 물리 주소 공간을 똑같이 10B로 나눴다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;가상 주소 30번의 주소 변환 과정&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;페이지를 찾는다. 30번은 페이지 3의 0번 위치에 있다.&lt;/li&gt;
&lt;li&gt;페이지 3의 실제 물리 주소는 프레임 1에 있다.&lt;/li&gt;
&lt;li&gt;최종적으로 프레임 1의 0번 위치에 접근한다. 이 주소가 가상 주소 30번의 물리 주소다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;가상 주소 18번의 주소 변환 과정&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;페이지를 찾는다. 18번은 페이지 1의 8번 위치에 있다.&lt;/li&gt;
&lt;li&gt;페이지 1의 실제 물리 주소는 프레임 3에 있다.&lt;/li&gt;
&lt;li&gt;최종적으로 프레임 3의 8번 위치에 접근한다. 이 주소가 가상 주소 18번의 물리 주소다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;정형화된-주소-변환&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A0%95%ED%98%95%ED%99%94%EB%90%9C-%EC%A3%BC%EC%86%8C-%EB%B3%80%ED%99%98&quot; aria-label=&quot;정형화된 주소 변환 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;정형화된 주소 변환&lt;/h3&gt;
&lt;p&gt;이제 주소 변환 과정을 정형화해 보자. 페이징 기법에서는
가상 주소를 VA(Virtual Address) = &amp;#x3C;P, D&gt;로 표현한다. P는 page, D는 distance를 의미한다.
위 예시에서 가상 주소 30번을 정형화하면, VA = &amp;#x3C;3, 0&gt;으로 작성할 수 있다.&lt;/p&gt;
&lt;p&gt;물리 주소는 PA(Physical Address) = &amp;#x3C;F, D&gt;로 표현한다. F는 frame을 의미한다.
위 예시에서 프레임 1의 0번 위치를 정형화하면 PA = &amp;#x3C;1, 0&gt;으로 작성할 수 있다.&lt;/p&gt;
&lt;p&gt;실제 컴퓨터는 2진법을 사용하므로 한 페이지의 크기는 2의 지수승이다.
따라서 주소는 다음과 같이 변환된다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;P = (VA) / (page size)
D = (VA) % (page size)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;TLB&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#TLB&quot; aria-label=&quot;TLB permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;TLB&lt;/h3&gt;
&lt;p&gt;가상 주소를 물리 주소로 변환하는 작업은 CPU 내 MMU가 담당한다. 작업은 다음과 같은 과정을 거친다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;MMU가 메모리에 있는 페이지 매핑 테이블에 접근해 물리 주소로 변환한다.&lt;/li&gt;
&lt;li&gt;변환된 물리 주소를 이용해 필요한 데이터를 가져온다.
위 과정에서 메모리에 접근하기 때문에 CPU 안에 있는 레지스터나 캐시에 접근할 때보다 시간이 오래걸린다. 이는 CPU 성능 저하로 이어진다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;위 문제를 해결하기 위해 &lt;strong&gt;페이지 매핑 테이블의 일부를 CPU 안쪽으로 가져오는데 이를 변환 색인 버퍼(TLB: Translation Look-ahead Buffer)라고 한다.&lt;/strong&gt; TLB는 &lt;strong&gt;캐시된 페이지 매핑 테이블&lt;/strong&gt;로 지역성 이론에 근거해 현재 사용 중이거나 사용이 예상되는 페이지 테이블의 일부를 CPU 안쪽으로 가져온다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;세그먼테이션-기법&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%84%B8%EA%B7%B8%EB%A8%BC%ED%85%8C%EC%9D%B4%EC%85%98-%EA%B8%B0%EB%B2%95&quot; aria-label=&quot;세그먼테이션 기법 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;세그먼테이션 기법&lt;/h2&gt;
&lt;p&gt;세그먼테이션에서는 하나의 연속된 공간을 세그먼트라고 한다.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/e1b1ccebc4d843a915ab7efc317f1b77/064ff/segmentation.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 64.70588235294117%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAABtklEQVR42pWT226DMAyGef9n2+WknqjUbuUMpeFYDsHL545OmrqLRTIhJP792Q7esiwyz/PTpmkSa60ae68Ge13XSdM0an3fq+HvDcMgbdvK7XaTPM8lSRIpikKu16uwx/gtXFadZO4sfsYYqapKyrJUcY8HCwTv97u+M7PmnagIj+OoZu0scZq7gKUG8n1f6rrWzJ6C4BMNsjRNlY53Dq4p4mztgzS+1vJxCeXmAl4uF8myTP2g9XCChAVkiBGAbxhikEHAvLh1mBYu5ULJN5uNZgMYqXuQcZiZGgZBoNHWmiC4NmycZiU8xaWcPgMl5DwQUCohQnzAIESUjhENW+yj89g8T7RIwiSXNCtk/CYkOD5aQw6yIHU6TCREq8o4IlfowcowQWclqwbpRitNP0jhmtK2jYJARtqUyluLTko/8yKm6fTg+9bXegVRIm/vBzkHybPrgJAVa2b8vVcXl16Wpna1TGS/2zryWM6nk/iHvcRxpCSv7ifjT0FTN9qc/eGgcxiGeudiVxbIVsHfoi8FuW5JYSRzQrvd7tn94/Godf43IaPt+VuMRFGktaT4UK5/z1/jC7RT7L60T7LWAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;segmentation&apos; title=&apos;&apos; src=&apos;/static/e1b1ccebc4d843a915ab7efc317f1b77/ca1dc/segmentation.png&apos; srcset=&apos;/static/e1b1ccebc4d843a915ab7efc317f1b77/e7570/segmentation.png 170w,
/static/e1b1ccebc4d843a915ab7efc317f1b77/f46e7/segmentation.png 340w,
/static/e1b1ccebc4d843a915ab7efc317f1b77/ca1dc/segmentation.png 680w,
/static/e1b1ccebc4d843a915ab7efc317f1b77/02d09/segmentation.png 1020w,
/static/e1b1ccebc4d843a915ab7efc317f1b77/9d567/segmentation.png 1360w,
/static/e1b1ccebc4d843a915ab7efc317f1b77/064ff/segmentation.png 1776w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;주소-변환-과정-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A3%BC%EC%86%8C-%EB%B3%80%ED%99%98-%EA%B3%BC%EC%A0%95-1&quot; aria-label=&quot;주소 변환 과정 1 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;주소 변환 과정&lt;/h3&gt;
&lt;p&gt;세그먼테이션 기법에선 가상 주소를 VA = &amp;#x3C;S, D&gt;로 표현한다. S는 Segment number, D는 distance를 의미한다.&lt;/p&gt;
&lt;p&gt;주소 변환 과정은 다음과 같다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;프로세스 A는 세그먼트 0으로 분할되었으므로 S는 0, D는 32다. 따라서 가상 주소 VA = &amp;#x3C;0,32&gt; 다.&lt;/li&gt;
&lt;li&gt;세그먼트 0의 시작주소 120을 알아낸 후 거리 32를 더해 물리 주소 152를 구한다. 이때 &lt;strong&gt;메모리 관리자는 거리가 세그먼트의 크기보다 큰지 점검한다. 크다면 메모리를 벗어나는 것이므로 해당 프로세스를 강제 종료&lt;/strong&gt;한다.&lt;/li&gt;
&lt;li&gt;물리 주소 152번에 접근해 원하는 데이터를 읽거나 쓴다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;세그먼테이션 테이블에는 물리 메모리의 시작 주소를 나타내는 주소와 세그먼트의 크기를 나타내는 limit가 있다. 물리 메모리에 접근할 때마다 거리 D의 크기가 limit보다 작은지 매번 확인한다.&lt;/p&gt;
&lt;h2 id=&quot;페이징-기법과-세그먼테이션-기법-비교&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8E%98%EC%9D%B4%EC%A7%95-%EA%B8%B0%EB%B2%95%EA%B3%BC-%EC%84%B8%EA%B7%B8%EB%A8%BC%ED%85%8C%EC%9D%B4%EC%85%98-%EA%B8%B0%EB%B2%95-%EB%B9%84%EA%B5%90&quot; aria-label=&quot;페이징 기법과 세그먼테이션 기법 비교 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;페이징 기법과 세그먼테이션 기법 비교&lt;/strong&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;구분&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;페이징 기법&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;세그먼테이션 기법&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;기본 개념&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;고정 크기(페이지)로 메모리를 분할하여 가상 주소와 물리 주소를 매핑&lt;/td&gt;
&lt;td&gt;가변 크기(세그먼트)로 메모리를 분할하여 가상 주소와 물리 주소를 매핑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;단편화&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;내부 단편화 발생: 페이지 크기보다 작은 데이터를 저장하면 남는 공간 낭비&lt;/td&gt;
&lt;td&gt;외부 단편화 발생: 가변 크기 때문에 빈 공간이 단편적으로 발생&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;주소 변환&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;가상 주소를 &lt;code class=&quot;language-text&quot;&gt;&amp;lt;P, D&gt;&lt;/code&gt;(Page, Offset) 형태로 표현, 페이지 매핑 테이블을 통해 물리 주소로 변환&lt;/td&gt;
&lt;td&gt;가상 주소를 &lt;code class=&quot;language-text&quot;&gt;&amp;lt;S, D&gt;&lt;/code&gt;(Segment, Offset) 형태로 표현, 세그먼트 매핑 테이블을 통해 물리 주소로 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;관리 테이블&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;페이지 매핑 테이블(Page Mapping Table) 사용&lt;/td&gt;
&lt;td&gt;세그먼트 매핑 테이블(Segment Mapping Table) 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;단점&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;- 프로그램의 논리적 구조를 무시하고 고정 크기로 나눠져 관리 복잡성 증가  &lt;br&gt;- 페이지 크기 결정이 중요&lt;/td&gt;
&lt;td&gt;- 메모리 단편화 심화 가능  &lt;br&gt;- 세그먼트의 크기를 동적으로 조정하기 어려움&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;장점&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;- 메모리 관리가 단순  &lt;br&gt;- 고정 크기 때문에 관리 효율적&lt;/td&gt;
&lt;td&gt;- 프로그램의 논리적 구조(코드, 데이터, 스택 등)를 반영하여 메모리를 유연하게 관리 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;사용 사례&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;현대 시스템에서 주로 사용됨&lt;/td&gt;
&lt;td&gt;일부 특수 목적 시스템에서 사용됨 (예: 특정 임베디드 시스템, 레거시 소프트웨어)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;단편화 해결 방법&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;- 내부 단편화 최소화를 위해 적절한 페이지 크기 선택  &lt;br&gt;- 페이지 교체 알고리즘 사용&lt;/td&gt;
&lt;td&gt;- 외부 단편화를 해결하기 위해 압축(compaction) 또는 페이징과 혼합 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&quot;요구-페이징&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9A%94%EA%B5%AC-%ED%8E%98%EC%9D%B4%EC%A7%95&quot; aria-label=&quot;요구 페이징 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;요구 페이징&lt;/h2&gt;
&lt;p&gt;운영체제는 &lt;strong&gt;필요한 모듈만 메모리에 올려 실행하고 나머지 모듈은 필요하다고 판단될 때 메모리로 불러오는데 이를 요구 페이징&lt;/strong&gt;이라고 한다.&lt;/p&gt;
&lt;p&gt;프로세스의 일부만 메모리로 가져오는 이유는 다음과 같다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;메모리를 효율적으로 관리&lt;/strong&gt;: 메모리가 꽉 차면 관리하기 어려우므로 가능하면 적은 양의 프로세스만 유지한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;응답 속도 향상&lt;/strong&gt;: 용량이 큰 프로세스를 전부 메모리로 가져와 실행하면 응답이 늦어질 수 있으므로 필요한 모듈만 올려 실행한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;가상 메모리 시스템에서 프로세스는 물리 메모리와 스왑 영역 중 한 곳에 있다. 페이지가 스왑 영역에 있는 경우는 크게 두 가지다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;요구 페이징으로 인해 처음부터 물리 메모리에 올라가지 못한 경우&lt;/li&gt;
&lt;li&gt;메모리가 꽉 차서 스왑 영역으로 옮겨 온 경우
어떤 것이든 &lt;strong&gt;스왑 영역에 있는 모듈은 물리 메모리로 가져오는 스왑인 과정을 거쳐야 사용 가능&lt;/strong&gt;하기 때문에 페이지 매핑 테이블에는 &lt;strong&gt;페이지가 메모리에 있는지, 스왑 영역에 있는지 표시&lt;/strong&gt;해야 한다. 이때 사용하는 비트가 유효 비트다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;페이지-매핑-테이블-엔트리-구성&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8E%98%EC%9D%B4%EC%A7%80-%EB%A7%A4%ED%95%91-%ED%85%8C%EC%9D%B4%EB%B8%94-%EC%97%94%ED%8A%B8%EB%A6%AC-%EA%B5%AC%EC%84%B1&quot; aria-label=&quot;페이지 매핑 테이블 엔트리 구성 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;페이지 매핑 테이블 엔트리 구성&lt;/h3&gt;
&lt;p&gt;페이지 매핑 테이블의 각 엔트리 구성은 다음과 같다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;페이지 번호&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;플래그 비트&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;접근 비트(access bit)&lt;/strong&gt;: 페이지가 메모리에 올라온 후 사용한 적이 있느지 알려준다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;변경 비트(modified bit)&lt;/strong&gt;: 페이지가 메모리에 올라온 후 데이터 변경이 있었는지 알려준다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;유효 비트(valid bit)&lt;/strong&gt;: 페이지가 실제 메모리에 있는지 나타낸다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;읽기 비트, 쓰기 비트, 실행 비트(read bit, write bit, execute bit)&lt;/strong&gt;: 각 작업에 대한 실행 권한을 나타낸다. 권한이 없는 작업 접근을 차단하는 데 사용된다. 따라서 위 3 비트를 합쳐 접근 권한 비트라고도 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;주소 필드&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;페이징-부재&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8E%98%EC%9D%B4%EC%A7%95-%EB%B6%80%EC%9E%AC&quot; aria-label=&quot;페이징 부재 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;페이징 부재&lt;/h2&gt;
&lt;p&gt;프로세스가 &lt;strong&gt;페이지를 요청했을 때 해당 페이지가 메모리에 없는 상황을 페이지 부재&lt;/strong&gt;라고 한다.
페이지 부재가 발생하면 프로세스가 해당 페이지를 사용할 수 있도록 스왑 영역에서 물리 메모리로 옮겨야 한다.&lt;/p&gt;
&lt;p&gt;만약 메모리에 빈 프레임이 있다면, 그곳에 페이지를 올리고 페이지 매핑 테이블을 갱신하면 된다.
하지만 &lt;strong&gt;빈 프레임이 없다면 메모리에 있는 프레임 중 하나를 스왑 영역으로 내보낸 후 해당 페이지를 가져와야 한다.&lt;/strong&gt; 이때 &lt;strong&gt;어떤 페이지를 스왑 영역으로 내보낼지 결정하는 알고리즘을 페이지 교체 알고리즘&lt;/strong&gt;이라고 하며, 페이지 교체 알고리즘에 의해 스왑 영역으로 보낼 페이지를 대상 페이지(victim page)라고 한다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;페이지-교체-알고리즘&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8E%98%EC%9D%B4%EC%A7%80-%EA%B5%90%EC%B2%B4-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98&quot; aria-label=&quot;페이지 교체 알고리즘 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;페이지 교체 알고리즘&lt;/h2&gt;
&lt;p&gt;메모리가 꽉 차서 &lt;strong&gt;메모리에 있는 페이지를 스왑 영역으로 보내야할 때 보낼 페이지를 결정하는 알고리즘&lt;/strong&gt;이다.&lt;/p&gt;
&lt;h3 id=&quot;무작위-페이지-교체-알고리즘&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%AC%B4%EC%9E%91%EC%9C%84-%ED%8E%98%EC%9D%B4%EC%A7%80-%EA%B5%90%EC%B2%B4-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98&quot; aria-label=&quot;무작위 페이지 교체 알고리즘 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;무작위 페이지 교체 알고리즘&lt;/h3&gt;
&lt;p&gt;스왑 영역으로 보낼 페이지를 특별한 로직 없이 무작위로 선정한다.
지역성을 전혀 고려하지 않기 때문에 성능이 좋지 않아 거의 사용되지 않는다.&lt;/p&gt;
&lt;h3 id=&quot;FIFO-페이지-교체-알고리즘&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#FIFO-%ED%8E%98%EC%9D%B4%EC%A7%80-%EA%B5%90%EC%B2%B4-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98&quot; aria-label=&quot;FIFO 페이지 교체 알고리즘 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;FIFO 페이지 교체 알고리즘&lt;/h3&gt;
&lt;p&gt;큐를 이용해 시간상 메모리에 가장 먼저 들어온 페이지를 대상 페이지로 선정하여 스왑 영역으로 쫓아낸다. &lt;/p&gt;
&lt;p&gt;무조건 오래된 페이지를 대상 페이지로 선정하기 때문에 성능이 떨어진다.&lt;/p&gt;
&lt;h3 id=&quot;최적-페이지-교체-알고리즘&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%B5%9C%EC%A0%81-%ED%8E%98%EC%9D%B4%EC%A7%80-%EA%B5%90%EC%B2%B4-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98&quot; aria-label=&quot;최적 페이지 교체 알고리즘 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;최적 페이지 교체 알고리즘&lt;/h3&gt;
&lt;p&gt;앞으로 사용하지 않을 페이지를 스왑 영역으로 보내는 이상적인 알고리즘이다.
실제로 미래의 접근 패턴을 안다는 것은 불가능하기 때문에 구현이 불가능한 이론적인 알고리즘이다.&lt;/p&gt;
&lt;h3 id=&quot;LRULeast-Recently-Used-페이지-교체-알고리즘&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#LRULeast-Recently-Used-%ED%8E%98%EC%9D%B4%EC%A7%80-%EA%B5%90%EC%B2%B4-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98&quot; aria-label=&quot;LRULeast Recently Used 페이지 교체 알고리즘 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;LRU(Least Recently Used) 페이지 교체 알고리즘&lt;/h3&gt;
&lt;p&gt;페이지에 접근한 시간을 기준으로 대상 페이지를 선정한다. 메모리에 올라온 후 &lt;strong&gt;가장 오랫동안 사용되지 않은 페이지를 스왑 영역으로&lt;/strong&gt; 옮긴다. &lt;/p&gt;
&lt;p&gt;접근 시간이나 참조 비트를 유지하기 위한 메모리가 추가로 필요하기 때문에 낭비되는 메모리 공간이 많다는 것이 단점이다.&lt;/p&gt;
&lt;h3 id=&quot;LFULeast-Frequently-Used-페이지-교체-알고리즘&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#LFULeast-Frequently-Used-%ED%8E%98%EC%9D%B4%EC%A7%80-%EA%B5%90%EC%B2%B4-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98&quot; aria-label=&quot;LFULeast Frequently Used 페이지 교체 알고리즘 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;LFU(Least Frequently Used) 페이지 교체 알고리즘&lt;/h3&gt;
&lt;p&gt;페이지가 &lt;strong&gt;몇 번 사용되었는지를 기준&lt;/strong&gt;으로 대상 페이지를 선정한다. 일반적인 경우 위 LRU 알고리즘과 성능이 비슷하다고 알려져 있다.&lt;/p&gt;
&lt;p&gt;페이지 접근 횟수를 표시하는 데 추가 공간이 필요하므로 낭비되는 메모리 공간이 많다는 것이 단점이다.&lt;/p&gt;
&lt;h3 id=&quot;NURNot-Used-Recently-페이지-교체-알고리즘&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#NURNot-Used-Recently-%ED%8E%98%EC%9D%B4%EC%A7%80-%EA%B5%90%EC%B2%B4-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98&quot; aria-label=&quot;NURNot Used Recently 페이지 교체 알고리즘 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;NUR(Not Used Recently) 페이지 교체 알고리즘&lt;/h3&gt;
&lt;p&gt;LRU나 LFU와 성능이 비슷하면서도 불필요한 공간 낭비 문제를 해결한 알고리즘이다. 추가 비트 2개만 사용하여 미래를 추정한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;참조 비트&lt;/strong&gt;: 페이지에 접근하면 1이 된다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;변경 비트&lt;/strong&gt;: 페이지가 변경되면 1이 된다.
모든 페이지의 초기 상태는 (0, 0)이다. 이 상태에서 페이지에 읽기 또는 실행 같은 접근이 발생하면 (1, 0)으로 바뀐다. 만약 쓰기 또는 추가 같은 변경이 일어나면 (0, 1)이 된다. 두 연산이 모두 발생하면 (1, 1)이 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;페이지마다 접근 비트와 변경 비트를 두고 (0, 0), (0, 1), (1, 0), (1, 1)의 순서대로 대상 페이지를 선정한다.&lt;/p&gt;
&lt;p&gt;흔한 경우는 아니지만 모든 페이지의 비트가 (1, 1)일 때는 NUR 페이지 교체 알고리즘을 정상적으로 적용할 수 없기 때문에 모든 페이지 비트를 (0, 0)으로 초기화한다.&lt;/p&gt;
&lt;h3 id=&quot;2차-기회-페이지-교체-알고리즘&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2%EC%B0%A8-%EA%B8%B0%ED%9A%8C-%ED%8E%98%EC%9D%B4%EC%A7%80-%EA%B5%90%EC%B2%B4-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98&quot; aria-label=&quot;2차 기회 페이지 교체 알고리즘 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;2차 기회 페이지 교체 알고리즘&lt;/h3&gt;
&lt;p&gt;FIFO 페이지 알고리즘과 마찬가지로 큐를 사용하지만, 특정 페이지에 접근해 페이지 부재 없이 성공할 경우 해당 페이지를 큐의 맨 뒤로 이동하여 대상 페이지에서 제외한다는 차이점이 있다.&lt;/p&gt;
&lt;p&gt;성능은 LRU, LFU, NUR 페이지 교체 알고리즘보다 약간 낮고 FIFO 페이지 교체 알고리즘보다 약간 높은 것으로 알려져있다. 그러나 &lt;strong&gt;큐를 유지하는 비용이&lt;/strong&gt; 높고, 큐의 &lt;strong&gt;중간에 있는 값을 뒤로 이동하는 작업이 추가&lt;/strong&gt;된다는 단점이 있다.&lt;/p&gt;
&lt;h3 id=&quot;시계-페이지-교체-알고리즘&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%8B%9C%EA%B3%84-%ED%8E%98%EC%9D%B4%EC%A7%80-%EA%B5%90%EC%B2%B4-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98&quot; aria-label=&quot;시계 페이지 교체 알고리즘 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;시계 페이지 교체 알고리즘&lt;/h3&gt;
&lt;p&gt;시계 페이지 교체 알고리즘은 &lt;strong&gt;원형 큐&lt;/strong&gt;를 사용한다.&lt;/p&gt;
&lt;p&gt;대상 페이지를 선정하는 포인터와 접근 비트가 있다. 대상 포인터가 가리키는 페이지가 스왑으로 옮겨지고, 해당 포인터는 아래쪽으로 이동한다. 접근 비트가 1이면 0으로 만들고 다시 한 칸 밑으로 이동한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NUR 페이지 교체 알고리즘보다 추가 공간이 적게 들지만 알고리즘이 복잡하고 계산량이 많다&lt;/strong&gt;는 것이 단점이다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;스레싱&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%8A%A4%EB%A0%88%EC%8B%B1&quot; aria-label=&quot;스레싱 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;스레싱&lt;/h2&gt;
&lt;p&gt;여러 프로세스를 동시에 실행하게 되어 메모리가 꽉 찬 후에는 새로운 프로그램을 메모리에 올리기 위해 새로운 프로그램을 메모리에 올리기 위해 기존 프로그램을 스왑 영역으로 옮기는 횟수가 잦아진다. &lt;/p&gt;
&lt;p&gt;이와 같이 &lt;strong&gt;프로세스가 많이 실행되고 하드디스크 입출력이 너무 많아져 작업이 멈춘 것 같은 상태를 스레싱&lt;/strong&gt;이라 한다.&lt;/p&gt;
&lt;p&gt;스레싱은 각 프로세스에 프레임을 할당하는 문제와도 연결된다. &lt;strong&gt;실행 중인 여러 프로세스에 프레임을 얼마나 나누어 주느냐에 따라 시스템의 성능이 달라진다.&lt;/strong&gt; 너무 적은 프레임을 할당한다면 페이지 부재가 빈번하게 일어날 것이고, 너무 많은 프레임을 할당한다면 메모리를 낭비해 전반적인 시스템 성능이 낮아질 것이다.&lt;/p&gt;
&lt;h2 id=&quot;프레임-할당-방식&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%94%84%EB%A0%88%EC%9E%84-%ED%95%A0%EB%8B%B9-%EB%B0%A9%EC%8B%9D&quot; aria-label=&quot;프레임 할당 방식 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;프레임 할당 방식&lt;/h2&gt;
&lt;p&gt;위에서 언급한 문제를 최소화하기 위해 남아 있는 프레임을 실행 중인 프로세스에 적절히 나누어 주는 정책이 필요하다. 프로세스에 프레임을 할당하는 방식은 크게 정적 할당과 동적 할당으로 구분된다.&lt;/p&gt;
&lt;h3 id=&quot;정적-할당&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A0%95%EC%A0%81-%ED%95%A0%EB%8B%B9&quot; aria-label=&quot;정적 할당 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;정적 할당&lt;/h3&gt;
&lt;p&gt;프로세스 실행 초기에 프레임을 나누어 준 후 그 크기를 고정하는 방식이다. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;균등 할당&lt;/strong&gt;: 프로세스의 크기와 상관없이 &lt;strong&gt;사용 가능한 프레임을 모든 프로세스에 동일하게 할당&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;한계&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;크기가 큰 프로세스의 경우 페이지 부재가 빈번하게 발생&lt;/li&gt;
&lt;li&gt;크기가 작은 프로세스의 경우 메모리 낭비가 발생한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;비례 할당&lt;/strong&gt;: &lt;strong&gt;프로세스의 크기에 비례&lt;/strong&gt;하여 프레임을 할당&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;한계&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;프로세스가 실행 중에 필요로 하는 프레임을 유동적으로 반영하지 못함&lt;/li&gt;
&lt;li&gt;사용하지 않을 메모리를 처음부터 미리 확보해 공간을 낭비&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;동적-할당&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%8F%99%EC%A0%81-%ED%95%A0%EB%8B%B9&quot; aria-label=&quot;동적 할당 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;동적 할당&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;프로세스를 실행하는 중에 시시각각 변하는 요청에 따라 프레임을 나누어 주기도 하고 회수하기도 하는 방식&lt;/strong&gt;이다. 작업 집합 모델을 사용하는 방식과 페이지 부재를 사용하는 방식이 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;작업집합 모델&lt;/strong&gt;: 지역성 이론을 기반으로 가장 최근 접근한 프레임이 이후에도 참조될 가능성이 높다는 가정에서 출발해 최근 일정 시간 동안 참조된 페이지들을 집합으로 만들고, 집합에 있는 페이지들을 물리 메모리에 유지하여 프로세스의 실행을 돕는다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;페이지 부재 빈도&lt;/strong&gt;: 페이지 부재 횟수를 기록하여 페이지 부재 비율을 계산하는 방식으로 상한선과 하한선을 설정한다. 상한선을 초과하면 프레임을 늘리고, 하한선 밑으로 내려가면 프레임을 회수한다.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[물리 메모리 관리]]></title><description><![CDATA[논리 주소와 물리 주소 논리 주소: 프로세스 입장에서 바라본 시작점을 0으로 놓았을 때 주소 물리 주소: 메모리의 입장에서 바라본 실제 저장되는 주소
논리 주소와 물리 주소의 변환은 메모리 관리 유닛(MMU)이 담당한다. 주소 변환 과정:
 CPU…]]></description><link>https://choiwonyu.github.io/물리 메모리 관리/</link><guid isPermaLink="false">https://choiwonyu.github.io/물리 메모리 관리/</guid><pubDate>Mon, 06 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;논리-주소와-물리-주소&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%85%BC%EB%A6%AC-%EC%A3%BC%EC%86%8C%EC%99%80-%EB%AC%BC%EB%A6%AC-%EC%A3%BC%EC%86%8C&quot; aria-label=&quot;논리 주소와 물리 주소 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;논리 주소와 물리 주소&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;논리 주소&lt;/strong&gt;: 프로세스 입장에서 바라본 시작점을 0으로 놓았을 때 주소&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;물리 주소&lt;/strong&gt;: 메모리의 입장에서 바라본 실제 저장되는 주소
논리 주소와 물리 주소의 변환은 &lt;strong&gt;메모리 관리 유닛(MMU)이 담당&lt;/strong&gt;한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;주소 변환 과정&lt;/strong&gt;:
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/a159b1cdeca6bed7ed0beba6a72b3ea4/23a6b/address.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 58.82352941176471%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAABdUlEQVR42qVTy07CQBSd//8Ew47EhTEmrlywUjcajYkQfCAEgoX0Sel7Oo8ee6cUCaILnOS2zZ17ztx75pTFXOPFkxg6Bd58CS41/rPYNJTo9AVOnhJ0hxJBJs1GVR1JqHSFVSbgRjniQkHvMSmlIKU8CK7qWiEEtP6eitGDEnme/SimfBzHiNaRIaZoF+0JIWHbDtI0NXuEYTQblwp+uK47aU6ijtogoK40lFbbXFmWW4L6aPNuJ2FWpNAdcHTuXZy/KyzDDJ5rIwkTjLMZLv0eLj6v0ItuEfEI4SqEZS3qrgN40zM4k9OaVBjNpRRgQa5wMxe4nha4W2pYToDJ+ANFxmGXHh7iPh7XAzynr8hEjoVlYTQa1RLlkMUcZTojATaEstGQ2m4C4JzDdV0D0CSBoMo6VANIkgS+75ux9zWnsdkuXXXgFrUJbb6rjQPa2931V5tjv9nhr9XcsDhoIXaMeVtway2K1lbs2F+MwLtEpC/58Ashc6meEjW37AAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;address&apos; title=&apos;&apos; src=&apos;/static/a159b1cdeca6bed7ed0beba6a72b3ea4/ca1dc/address.png&apos; srcset=&apos;/static/a159b1cdeca6bed7ed0beba6a72b3ea4/e7570/address.png 170w,
/static/a159b1cdeca6bed7ed0beba6a72b3ea4/f46e7/address.png 340w,
/static/a159b1cdeca6bed7ed0beba6a72b3ea4/ca1dc/address.png 680w,
/static/a159b1cdeca6bed7ed0beba6a72b3ea4/02d09/address.png 1020w,
/static/a159b1cdeca6bed7ed0beba6a72b3ea4/9d567/address.png 1360w,
/static/a159b1cdeca6bed7ed0beba6a72b3ea4/23a6b/address.png 1766w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;CPU가 논리 주소를 생성&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MMU&lt;/strong&gt;가 논리 주소를 변환하여 물리 주소를 생성&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;논리 주소에 &lt;strong&gt;베이스 레지스터(Base Register)&lt;/strong&gt; 값을 더함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;변환된 물리 주소를 통해 메모리에 접근&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&quot;메모리-오버레이&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%98%A4%EB%B2%84%EB%A0%88%EC%9D%B4&quot; aria-label=&quot;메모리 오버레이 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;메모리 오버레이&lt;/h2&gt;
&lt;p&gt;과거엔 메모리가 값비싼 저장장치였기 때문에 개인용 컴퓨터에 큰 메모리를 사용할 수 없었다. 그렇다면 물리 메모리보다 큰 프로그램이 어떻게 작동했을까?&lt;/p&gt;
&lt;p&gt;프로그램의 크기가 물리 메모리보다 클 때 전체 프로그램을 메모리에 가져오는 대신 적당한 크기로 잘라 가져오는 기법을 &lt;strong&gt;메모리 오버레이&lt;/strong&gt;라고 한다. &lt;/p&gt;
&lt;p&gt;메모리 오버레이는 프로그램을 몇 개의 모듈로 나눠 필요할 때마다 모듈을 가져와 사용한다.
메모리 오버레이에서 다음과 같은 중요한 의미를 찾을 수 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;한정된 메모리에서 &lt;strong&gt;메모리보다 큰 프로그램을 실행할 수 있다.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;프로그램 전체가 아닌 &lt;strong&gt;일부만 메모리에 올라와도 실행할 수 있다.&lt;/strong&gt;
-&gt; 메모리를 여러 조각으로 나눠 여러 프로세스에 할당할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;하지만 프로그래머가 직접 프로세스를 작은 모듈로 나누고, 메모리 적재 및 교체 작업을 관리해야 했기 때문에 작업 부담이 크다. &lt;/p&gt;
&lt;p&gt;현대의 &lt;strong&gt;가상 메모리 시스템&lt;/strong&gt;이 등장하면서, 메모리 오버레이 방식은 더 이상 사용되지 않게 되었고, 운영체제가 자동으로 메모리와 스왑을 관리하는 방식이 자리 잡게 되었다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;스왑&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%8A%A4%EC%99%91&quot; aria-label=&quot;스왑 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;스왑&lt;/h2&gt;
&lt;p&gt;메모리가 모자라 쫓겨난 프로세스를 저장장치의 특별한 공간에 모아두는데 이러한 영역을 스왑 영역이라고 한다. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;동작 원리&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;운영체제가 메모리 관리의 주체&lt;/strong&gt;가 되어, 메모리에 공간이 부족한 경우 사용하지 않는 프로세스의 데이터를 &lt;strong&gt;디스크의 스왑 영역으로 이동(스왑 아웃)&lt;/strong&gt;시킨다&lt;/li&gt;
&lt;li&gt;필요할 때 스왑 영역에 있는 데이터를 다시 메모리로 가져온다(스왑 인)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;스왑 영역은 메모리에 쫓겨났다가 다시 돌아가는 데이터가 머무는 곳이기 때문에 저장장치는 장소만 빌려주고 메모리 관리자가 관리한다.&lt;/p&gt;
&lt;p&gt;스왑을 이용하면 운영체제는 &lt;strong&gt;물리 메모리의 확장&lt;/strong&gt;으로 간주한다.
예를 들어, 8GB의 RAM과 4GB의 스왑 영역이 있으면, 운영체제는 &lt;strong&gt;12GB의 메모리를 사용할 수 있는 것처럼 인식&lt;/strong&gt;한다. 하지만 &lt;strong&gt;디스크는 RAM보다 속도가 훨씬 느리기 때문에 성능 저하가 발생&lt;/strong&gt;한다. 따라서 스왑은 메모리 부족 상황을 보조하기 위한 용도로만 사용되며, &lt;strong&gt;물리 메모리를 대체할 수는 없다.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;메모리-오버레이와-관계&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%98%A4%EB%B2%84%EB%A0%88%EC%9D%B4%EC%99%80-%EA%B4%80%EA%B3%84&quot; aria-label=&quot;메모리 오버레이와 관계 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;메모리 오버레이와 관계&lt;/h3&gt;
&lt;p&gt;스왑은 프로그램의 전체 구조를 관리하지 않고, &lt;strong&gt;운영체제의 메모리 관리 방식&lt;/strong&gt;으로 동작한다. 따라서, 메모리 오버레이 방식과 무관하게 작동할 수 있다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;메모리-가변-분할-방식&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B0%80%EB%B3%80-%EB%B6%84%ED%95%A0-%EB%B0%A9%EC%8B%9D&quot; aria-label=&quot;메모리 가변 분할 방식 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;메모리 가변 분할 방식&lt;/h2&gt;
&lt;p&gt;프로세스의 &lt;strong&gt;크기에 맞게 메모리를 분할&lt;/strong&gt;하는 연속 메모리 할당 방식이며 &lt;strong&gt;세그멘테이션 메모리 관리 기법&lt;/strong&gt;이라고 부른다. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;프로세스를 하나의 연속된 주소로 다룬다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;단점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;작은 빈 공간이 생기는 외부 단편화가 발생
외부 단편화 문제를 해결하기 위한 메모리 배치 방식은 다음과 같이 크게 세 가지로 나뉜다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;최초-배치&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%B5%9C%EC%B4%88-%EB%B0%B0%EC%B9%98&quot; aria-label=&quot;최초 배치 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;최초 배치&lt;/h3&gt;
&lt;p&gt;단편화를 고려하지 않는 방식으로 프로세스를 메모리의 빈 공간에 배치할 때 &lt;strong&gt;메모리에서 적재 가능한 공간을 순서대로 찾다가 첫 번째로 발견한 공간에 프로세스를 배치&lt;/strong&gt;한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;특징&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;구현이 간단하고 속도가 빠르지만, 외부 단편화가 증가할 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;최적-배치&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%B5%9C%EC%A0%81-%EB%B0%B0%EC%B9%98&quot; aria-label=&quot;최적 배치 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;최적 배치&lt;/h3&gt;
&lt;p&gt;메모리의 빈 공간을 모두 확인한 후 &lt;strong&gt;크기가 가장 비슷한 곳에 프로세스를 배치&lt;/strong&gt;한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;특징&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;외부 단편화를 줄이지만, 빈 공간을 모두 확인해야 하므로 속도가 느림.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;최악-배치&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%B5%9C%EC%95%85-%EB%B0%B0%EC%B9%98&quot; aria-label=&quot;최악 배치 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;최악 배치&lt;/h3&gt;
&lt;p&gt;빈 공간을 모두 확인한 후 &lt;strong&gt;가장 큰 공간에 프로세스를 배치&lt;/strong&gt;하는 것으로 최적 배치와 정반대되는 방법이다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;특징&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;가장 큰 빈 공간을 선택하여 자원을 낭비할 가능성이 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;메모리-고정-분할-방식&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B3%A0%EC%A0%95-%EB%B6%84%ED%95%A0-%EB%B0%A9%EC%8B%9D&quot; aria-label=&quot;메모리 고정 분할 방식 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;메모리 고정 분할 방식&lt;/h2&gt;
&lt;p&gt;프로세스의 크기에 상관 없이 &lt;strong&gt;메모리를 같은 크기로 나눠 관리&lt;/strong&gt;한다. 고정 분할 방식을 사용하여 물리 메모리를 나누는 방식을 &lt;strong&gt;페이징 메모리 관리 기법&lt;/strong&gt;이라고 한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;메모리 관리가 편하다.&lt;/p&gt;
&lt;p&gt;-&gt; 현대 메모리 관리는 페이징을 기본으로 한다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;단점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;프로세스를 배치하고 공간이 남는 내부 단편화가 발생한다.&lt;/p&gt;
&lt;p&gt;ex) 20KB로 메모리를 나눴을 때, 18KB 프로세스를 실행하면, 2KB의 단편화 발생
내부 단편화를 줄이기 위해선 &lt;strong&gt;메모리를 어떤 크기로 나눌지 신중하게 결정&lt;/strong&gt;해야 한다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;외부-단편화와-내부-단편화-비교&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%99%B8%EB%B6%80-%EB%8B%A8%ED%8E%B8%ED%99%94%EC%99%80-%EB%82%B4%EB%B6%80-%EB%8B%A8%ED%8E%B8%ED%99%94-%EB%B9%84%EA%B5%90&quot; aria-label=&quot;외부 단편화와 내부 단편화 비교 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;외부 단편화와 내부 단편화 비교&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;외부 단편화&lt;/strong&gt;: &lt;strong&gt;가변 분할 방식&lt;/strong&gt;에서 발생하며, 메모리의 빈 공간이 작아서 새로운 프로세스를 배치할 수 없는 경우.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;내부 단편화&lt;/strong&gt;: &lt;strong&gt;고정 분할 방식&lt;/strong&gt;에서 발생하며, 프로세스가 메모리에 배치되었지만, 할당된 공간보다 작은 크기를 사용할 때 남는 공간.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[교착 상태]]></title><description><![CDATA[개요 교착 상태(Deadlock…]]></description><link>https://choiwonyu.github.io/교착 상태/</link><guid isPermaLink="false">https://choiwonyu.github.io/교착 상태/</guid><pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;개요&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B0%9C%EC%9A%94&quot; aria-label=&quot;개요 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;개요&lt;/h2&gt;
&lt;p&gt;교착 상태(Deadlock)는 &lt;strong&gt;두 개 이상의 프로세스가 서로의 작업을 완료하기 위해 필요한 자원을 기다리며 영원히 진행되지 못하는 상태&lt;/strong&gt;를 말한다.&lt;/p&gt;
&lt;p&gt;교착 상태 발생 예시는 다음과 같다.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/12640ffc5d4519a8d3619aca273c08ea/ebd6b/printer-scanner-process.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 51.17647058823529%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABLElEQVR42o1S206EMBDlx33xF/wGP8FsfNQ3E+OTEMQFL1wStmDYhgKltEemEbJsll0nmVCmM2fOmamDFTN/3x2XuPcYtjuxiK+ZcxLMGFs4yAYbt8DVJsbtSwmjB3snhEDTNP8HJFNK4evzA0mxx1OqELIGg+rBOUcYhsiy7DwgddZa23PXdSjLcv4H9Cx2GAa0bWsZ0r1VY8wS8DAopUSe57bwUP5hDgHFcWylH9dbwDRN4Xme9aqq5qTJtCE3iziBua6LKIrg+/5MwJnmRTLqukZRFGCMLRZ0bCSXRkJ1NB7y1aVQEgETA+pK8rZMIK1aqF7ahuQTo4tbJoAgCPA9zsiMW3WTCtd3AW4eEzy/vuOnZKvMTwJO72xisBfjw37jeAg5WtmfBSPAXyUHC6ZxBaGWAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;printer scanner process&apos; title=&apos;&apos; src=&apos;/static/12640ffc5d4519a8d3619aca273c08ea/ca1dc/printer-scanner-process.png&apos; srcset=&apos;/static/12640ffc5d4519a8d3619aca273c08ea/e7570/printer-scanner-process.png 170w,
/static/12640ffc5d4519a8d3619aca273c08ea/f46e7/printer-scanner-process.png 340w,
/static/12640ffc5d4519a8d3619aca273c08ea/ca1dc/printer-scanner-process.png 680w,
/static/12640ffc5d4519a8d3619aca273c08ea/02d09/printer-scanner-process.png 1020w,
/static/12640ffc5d4519a8d3619aca273c08ea/9d567/printer-scanner-process.png 1360w,
/static/12640ffc5d4519a8d3619aca273c08ea/ebd6b/printer-scanner-process.png 1820w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
위와 같이 임계구역으로 보호되는 프린터와 스캐너가 필요한 &lt;strong&gt;두 프로세스 P1과 P2가 각각 프린터와 스캐너를 할당받은 후 양보하지 않는 경우&lt;/strong&gt;를 예로 들 수 있다.&lt;/p&gt;
&lt;p&gt;위와 같이 두 프로세스가 자원을 점유하고 서로 추가 자원을 기다리며 대기하는 상황에 교착 상태가 발생한다. &lt;/p&gt;
&lt;p&gt;좀 더 구체적으로 어떤 조건이 충족되어야 교착 상태가 발생했다고 할 수 있는지 알아보자.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;교착-상태-필요조건&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B5%90%EC%B0%A9-%EC%83%81%ED%83%9C-%ED%95%84%EC%9A%94%EC%A1%B0%EA%B1%B4&quot; aria-label=&quot;교착 상태 필요조건 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;교착 상태 필요조건&lt;/h2&gt;
&lt;p&gt;교착 상태의 네 가지 필요 조건이 있다. 이를 모두 만족해야 교착 상태가 발생했다고 할 수 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;상호 배제&lt;/strong&gt;: 한 프로세스가 사용하는 자원은 다른 프로세스와 공유할 수 없는 배타적인 자원이어야 한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;비선점&lt;/strong&gt;: 한 프로세스가 사용 중인 자원은 다른 프로세스가 빼앗을 수 없다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;점유와 대기&lt;/strong&gt;: 프로세스가 어떤 자원을 점유한 상태에서 추가 자원을 요청하며 기다려야 한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;순환 대기&lt;/strong&gt;: 점유와 대기를 하는 프로세스 간 관계가 원을 이뤄야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;위에서 본 예시로 네 가지 조건을 살펴보자.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/12640ffc5d4519a8d3619aca273c08ea/ebd6b/printer-scanner-process.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 51.17647058823529%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABLElEQVR42o1S206EMBDlx33xF/wGP8FsfNQ3E+OTEMQFL1wStmDYhgKltEemEbJsll0nmVCmM2fOmamDFTN/3x2XuPcYtjuxiK+ZcxLMGFs4yAYbt8DVJsbtSwmjB3snhEDTNP8HJFNK4evzA0mxx1OqELIGg+rBOUcYhsiy7DwgddZa23PXdSjLcv4H9Cx2GAa0bWsZ0r1VY8wS8DAopUSe57bwUP5hDgHFcWylH9dbwDRN4Xme9aqq5qTJtCE3iziBua6LKIrg+/5MwJnmRTLqukZRFGCMLRZ0bCSXRkJ1NB7y1aVQEgETA+pK8rZMIK1aqF7ahuQTo4tbJoAgCPA9zsiMW3WTCtd3AW4eEzy/vuOnZKvMTwJO72xisBfjw37jeAg5WtmfBSPAXyUHC6ZxBaGWAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;printer scanner process&apos; title=&apos;&apos; src=&apos;/static/12640ffc5d4519a8d3619aca273c08ea/ca1dc/printer-scanner-process.png&apos; srcset=&apos;/static/12640ffc5d4519a8d3619aca273c08ea/e7570/printer-scanner-process.png 170w,
/static/12640ffc5d4519a8d3619aca273c08ea/f46e7/printer-scanner-process.png 340w,
/static/12640ffc5d4519a8d3619aca273c08ea/ca1dc/printer-scanner-process.png 680w,
/static/12640ffc5d4519a8d3619aca273c08ea/02d09/printer-scanner-process.png 1020w,
/static/12640ffc5d4519a8d3619aca273c08ea/9d567/printer-scanner-process.png 1360w,
/static/12640ffc5d4519a8d3619aca273c08ea/ebd6b/printer-scanner-process.png 1820w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;상호 배제&lt;/strong&gt;: 프린터와 스캐너는 한 프로세스가 사용하면 다른 프로세스가 사용할 수 없는 배타적인 자원이다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;비선점&lt;/strong&gt;: P1이 P2가 점유한 스캐너를 빼앗을 수 없다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;점유와 대기&lt;/strong&gt;: 두 프로세스는 모두 하나의 자원을 점유한 상태에서 다른 프로세스의 자원을 기다리고 있다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;순환 대기&lt;/strong&gt;: 프린터, 스캐너 그리고 두 프로세스의 관계가 원을 이루고 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;기아Starvation-상태와-교착Deadlock-상태의-차이점&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B8%B0%EC%95%84Starvation-%EC%83%81%ED%83%9C%EC%99%80-%EA%B5%90%EC%B0%A9Deadlock-%EC%83%81%ED%83%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90&quot; aria-label=&quot;기아Starvation 상태와 교착Deadlock 상태의 차이점 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;기아(Starvation) 상태와 교착(Deadlock) 상태의 차이점&lt;/h3&gt;
&lt;p&gt;기아 상태는 &lt;strong&gt;잘못된 정책으로 인해 특정 프로세스의 우선 순위가 계속해서 미뤄져 작업이 수행되지 않는 것&lt;/strong&gt;이다. 따라서 Aging 기법으로 해결할 수 있다.&lt;/p&gt;
&lt;p&gt;교착 상태는 잘못된 정책이 아니어도 자연적으로 발생한다. 따라서 Aging 기법이나 정책의 수정으로도 해결할 수 없다. &lt;/p&gt;
&lt;p&gt;그렇다면 교착 상태는 어떻게 해결해야 할까?&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;교착-상태-해결-방법&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B5%90%EC%B0%A9-%EC%83%81%ED%83%9C-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95&quot; aria-label=&quot;교착 상태 해결 방법 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;교착 상태 해결 방법&lt;/h2&gt;
&lt;p&gt;교착 상태를 해결하는 방법은 &lt;strong&gt;예방(preventation), 회피(avoidance), 검출(detection)이며, 추가적으로 상태가 발견된 후 자원을 회복(recovery)하는 방법&lt;/strong&gt;이 있다.&lt;/p&gt;
&lt;h3 id=&quot;예방preventation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%98%88%EB%B0%A9preventation&quot; aria-label=&quot;예방preventation permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;예방(preventation)&lt;/h3&gt;
&lt;p&gt;위에서 언급한 &lt;strong&gt;교착 상태를 유발하는 네 가지 조건이 발생하지 않도록 무력화하는 방식&lt;/strong&gt;이다.
하지만 자원을 얼마만큼 할당해야 교착 상태가 발생하지 않는다는 보장이 없기 때문에 실효성이 적다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;상호 배제 예방&lt;/strong&gt;: 독점적으로 사용할 수 있는 자원을 없애버린다. 하지만 현실적으로는 모든 자원을 공유할 수 없기 때문에 상호 배제를 무력화하긴 어렵다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;비선점 예방&lt;/strong&gt;: 모든 자원을 빼앗을 수 있도록 만든다. 이 또한 현실적으로 모든 자원에 대해 적용할 수 없기 때문에 무력화하기 어렵다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;점유와 대기 예방&lt;/strong&gt;: 자원을 요청할 때 전부 할당받거나 아예 할당받지 않는다. 이 방법은 자원에 대한 권한이 아닌 프로세스의 자원 사용 방식을 바꾼다는 점에서 위 두 예방 방식과는 다르지만, &lt;em&gt;작업 방식이 제한되고 자원이 낭비된다는 단점&lt;/em&gt;이 있다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;순환 대기 예방&lt;/strong&gt;: 자원에 순서를 부여하고, 순서대로 자원을 요청하도록 한다. 이 방법 또한 점유와 대기 예방과 마찬가지로 작업 방식이 제한되고 자원이 낭비될 수 있다는 단점이 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;회피Avoidance&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%9A%8C%ED%94%BCAvoidance&quot; aria-label=&quot;회피Avoidance permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;회피(Avoidance)&lt;/h3&gt;
&lt;p&gt;교착 상태가 발생하지 않는 범위 내에서만 자원을 할당하고, 교착 상태가 발생하는 범위에 있으면 할당을 취소하고 프로세스를 대기시키는 방법이다.&lt;/p&gt;
&lt;p&gt;이 방법에선 &lt;strong&gt;자원의 총수와 현재 할당된 자원의 수를 기준으로 시스템을 안정 상태와 불안정 상태로 나눈다.&lt;/strong&gt;  그리고 시스템이 안정 상태를 유지하도록 자원을 할당한다.&lt;/p&gt;
&lt;p&gt;이 방법의 대표적인 구현 방식은 &lt;strong&gt;은행원 알고리즘&lt;/strong&gt;이다. 대출 금액이 가능한 범위 내이면(안정 상태이면) 대출이 허용되지만 그렇지 않으면(불안정 상태) 거부되는 방식의 알고리즘이다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;문제점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;모든 프로세스가 자신이 사용할 자원을 미리 선언해야 하지만 현실적으로 쉬운 일이 아니다.&lt;/li&gt;
&lt;li&gt;시스템의 전체 자원수는 일시적인 고장이나 추가가 빈번하기 때문에 &lt;strong&gt;고정된 시스템 전체 자원 수를 계산하기 쉽지 않다.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;불안정 상태가 되면 반드시 교착 상태가 발생하는 것이 아닌데도&lt;/strong&gt; 자원을 할당하지 않기 때문에 자원 낭비가 발생한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;검출Detection&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B2%80%EC%B6%9CDetection&quot; aria-label=&quot;검출Detection permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;검출(Detection)&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;타임아웃: 일정 시간 동안 작업이 진행되지 않은 프로세스를 교착 상태가 발생했다고 간주하는 방법&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;구현이 쉽다.
-&gt; 가벼운 교착 상태 검출이라고 불림&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;단점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;교착 상태가 발생하지 않은 프로세스가 강제 종료될 수 있다.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;모든 시스템에 적용할 수 없다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DB와 같은 프로세스는 데이터 일관성을 처리해야 하는 등 중요 조건이 있기 때문에 롤백과 같은 추가 작업이 필요하다.&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;p&gt;자원 할당 그래프: 시스템 내 프로세스가 어떤 자원을 사용하고 있는지를 알 수 있어 사이클을 통해 교착 상태를 감지할 수 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;작업 방식을 제한하지 않으면서 교착 상태를 정확하게 파악할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;단점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;구현이 어렵다.
-&gt; 무거운 교착 상태 검출이라고 불림&lt;/li&gt;
&lt;li&gt;그래프 유지 보수와 사이클 검사 작업으로 인한 오버헤드가 발생한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;회복Recovery&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%9A%8C%EB%B3%B5Recovery&quot; aria-label=&quot;회복Recovery permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;회복(Recovery)&lt;/h3&gt;
&lt;p&gt;교착 상태가 검출된 후 프로세스를 강제 종료하거나 자원을 회수해 교착 상태를 해결하는 방법이다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;교착 상태를 일으킨 모든 프로세스 종료&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;교착 상태를 일으킨 프로세스 중 하나를 골라 순서대로 종료&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;각 프로세스의 &lt;strong&gt;우선순위, 작업 시간, 사용하는 자원의 수를 고려&lt;/strong&gt;해 종료 순서를 정해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[프로세스 동기화]]></title><description><![CDATA[…]]></description><link>https://choiwonyu.github.io/프로세스 동기화/</link><guid isPermaLink="false">https://choiwonyu.github.io/프로세스 동기화/</guid><pubDate>Fri, 03 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;프로세스-간-통신&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EA%B0%84-%ED%86%B5%EC%8B%A0&quot; aria-label=&quot;프로세스 간 통신 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;프로세스 간 통신&lt;/h2&gt;
&lt;p&gt;프로세스 혹은 스레드는 독립적으로 실행된다.
한 프로세스 내 스레드끼리는 같은 메모리 영역을 공유하기 때문에 어렵지 않지만 프로세스 간 통신은 다르다. 서로 다른 프로세스는 메모리 영역이 다르기 때문에 공유된 메모리를 통해 통신하는 것이 쉽지 않다. 운영체제는 &lt;strong&gt;프로세스 간 통신 방법을 제공하는데 이를 IPC(Inter Process Communication)&lt;/strong&gt; 라고 한다.&lt;/p&gt;
&lt;h3 id=&quot;대표적인-프로세스-간-통신-종류&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%8C%80%ED%91%9C%EC%A0%81%EC%9D%B8-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EA%B0%84-%ED%86%B5%EC%8B%A0-%EC%A2%85%EB%A5%98&quot; aria-label=&quot;대표적인 프로세스 간 통신 종류 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;대표적인 프로세스 간 통신 종류&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;공유 메모리나 공유 파일을 이용한 통신&lt;/strong&gt;: 일정한 메모리 영역이나 파일을 공유하고 이를 통해 데이터를 주고 받는다. 데이터를 주고 받는 방법을 프로세스끼리 결정해야 하기 때문에 가장 원시적인 방법이다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;파이프를 이용한 통신&lt;/strong&gt;: 하나의 컴퓨터 내 프로세스 간 통신에 많이 사용하는 수단이다. 파이프는 프로세스 간 통신을 위해 &lt;strong&gt;운영체제가 제공하는 통신 기법&lt;/strong&gt;이다. 보통 fork()로 만들어진 부모-자식 간 통신에 사용된다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;소켓을 이용한 통신&lt;/strong&gt;: &lt;strong&gt;네트워크로 연결된 컴퓨터에서 데이터를 주고받기 위한 통신 기법&lt;/strong&gt;이다. 파이프와 비교했을 때 초기화할 내용도 많고 시스템 자원도 많이 사용하기 때문에 같은 컴퓨터 내 통신에선 비효율적이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;통신-방향에-따른-분류&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%86%B5%EC%8B%A0-%EB%B0%A9%ED%96%A5%EC%97%90-%EB%94%B0%EB%A5%B8-%EB%B6%84%EB%A5%98&quot; aria-label=&quot;통신 방향에 따른 분류 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;통신 방향에 따른 분류&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;양방향 통신&lt;/strong&gt;: 데이터를 양쪽 방향으로 동시에 전송할 수 있는 구조
ex) 소켓 이용 통신, 전화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;반양방향 통신&lt;/strong&gt;: 데이터를 양쪽 방향으로 전송 가능하지만, 동시 전송은 불가능한 구조
ex) 무전기&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;단방향 통신&lt;/strong&gt;: 한쪽 방향으로만 데이터를 전송할 수 있는 구조
ex) 파이프 이용 통신&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;통신-구현-방식에-따른-분류&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%86%B5%EC%8B%A0-%EA%B5%AC%ED%98%84-%EB%B0%A9%EC%8B%9D%EC%97%90-%EB%94%B0%EB%A5%B8-%EB%B6%84%EB%A5%98&quot; aria-label=&quot;통신 구현 방식에 따른 분류 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;통신 구현 방식에 따른 분류&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;공유 메모리를 사용하는 통신 방식의 가장 큰 문제는 &lt;strong&gt;상대방이 데이터를 언제 보낼지 받는 쪽에서 모른다는 것&lt;/strong&gt;이다. 따라서 데이터를 받는 쪽에서 반복적으로 공유 메모리를 점검하는 수밖에 없다.
이렇게 &lt;strong&gt;수시로 점검하며 기다리는 상태를 busy waiting&lt;/strong&gt;이라고 한다.
busy waiting은 시스템 자원 낭비가 크다. 이를 해결하기 위해 데이터가 도착했음을 알려주는 &lt;strong&gt;동기화&lt;/strong&gt;를 사용한다. &lt;/p&gt;
&lt;p&gt;프로세스 간 통신은 &lt;strong&gt;동기화 기능 여부&lt;/strong&gt;에 따라 대기가 있는 통신과 없는 통신으로 구분된다.
대기가 있는 통신(blocking communication)을 동기화 통신(synchronous communication), 대기가 없는 통신(non-blocking communication)을 비동기화 통신(asynchronous communication)이라고 한다.&lt;/p&gt;
&lt;p&gt;파이프를 이용한 통신과 소켓을 이용한 통신은 대기가 있는 통신이므로 바쁜 대기를 사용하지 않고도 통신이 가능하다.&lt;/p&gt;
&lt;h3 id=&quot;파이프를-이용한-통신&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8C%8C%EC%9D%B4%ED%94%84%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%ED%86%B5%EC%8B%A0&quot; aria-label=&quot;파이프를 이용한 통신 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;파이프를 이용한 통신&lt;/h3&gt;
&lt;p&gt;&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/bac00439514ebbc08d1cc51a0ee1864e/3e79e/pipe.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 28.82352941176471%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAvklEQVR42pWRRw7FMAhEff/rZZV1ipTee+HnjeQs/i5IFngGBrCdPXbft13XZV+Nmn3f7TiOF3PLsljf9zbPs/y2bUoYx1EYfNu28tzP85QQ8TAMtq6r6oglWNe1dV33gmVZSiyKIsuyTCcMQ6uqyoqiUC55SZLIg9EQHRo5gGmaBCKKANPQGS6OYwuCwPI8F5emqdZEuGkaTUpMvSakEAACkGQ6sRrr+5X8+ry3f3cwP4z/A+dJBL6YF/6//wBUJtJm5ZuZlAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;pipe&apos; title=&apos;&apos; src=&apos;/static/bac00439514ebbc08d1cc51a0ee1864e/ca1dc/pipe.png&apos; srcset=&apos;/static/bac00439514ebbc08d1cc51a0ee1864e/e7570/pipe.png 170w,
/static/bac00439514ebbc08d1cc51a0ee1864e/f46e7/pipe.png 340w,
/static/bac00439514ebbc08d1cc51a0ee1864e/ca1dc/pipe.png 680w,
/static/bac00439514ebbc08d1cc51a0ee1864e/02d09/pipe.png 1020w,
/static/bac00439514ebbc08d1cc51a0ee1864e/9d567/pipe.png 1360w,
/static/bac00439514ebbc08d1cc51a0ee1864e/3e79e/pipe.png 1550w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
만약 프로세스 B가 파이프1에 대해 읽기 연산을 수행했는데 프로세스 A가 파이프 1에 대해 쓰기 작업 중이라면, 프로세스 B는 대기 상태가 된다. 이러한 대기 상태는 프로세스 A의 쓰기 작업이 끝나는 순간 자동으로 풀려 동기화가 이뤄진다. 따라서 &lt;strong&gt;프로세스 B는 busy waiting를 하지 않아도 된다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;위처럼 파이프 통신 방식은 단방향 통신이기 때문에 &lt;strong&gt;양방향 통신을 하기 위해선 2개의 파이프가 필요&lt;/strong&gt;하다.&lt;/p&gt;
&lt;h3 id=&quot;소켓을-이용한-통신&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%86%8C%EC%BC%93%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%ED%86%B5%EC%8B%A0&quot; aria-label=&quot;소켓을 이용한 통신 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;소켓을 이용한 통신&lt;/h3&gt;
&lt;p&gt;서버 쪽 웹 데몬(HTTPD) 포트에 여러 클라이언트가 요청을 보냈다고 해보자. 만약 소켓을 사용하지 않는다면 한 클라이언트가 포트를 장악하고 나머지 클라이언트들은 하염없이 기다려야 한다. &lt;strong&gt;하나의 포트에 여러 클라이언트를 연결하려면 소켓이 필요&lt;/strong&gt;하다. 클라이언트들은 포트에 연결된 멀티 소켓에 하나씩 연결된다.&lt;/p&gt;
&lt;p&gt;네트워킹 상황에서 통신할 때는 연결 프로시저 호출이나 소켓을 이용한다. 원격 프로시저 호출은 다른 컴퓨터에 있는 함수를 호출하는 것을 말한다. 이는 일반적으로 소켓으로 구현된다.&lt;/p&gt;
&lt;p&gt;소켓을 이용한 통신에서는 소켓 1개만 사용해도 양방향 통신이 가능하다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;공유-자원과-임계구역&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B3%B5%EC%9C%A0-%EC%9E%90%EC%9B%90%EA%B3%BC-%EC%9E%84%EA%B3%84%EA%B5%AC%EC%97%AD&quot; aria-label=&quot;공유 자원과 임계구역 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;공유 자원과 임계구역&lt;/h2&gt;
&lt;h3 id=&quot;공유-자원&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B3%B5%EC%9C%A0-%EC%9E%90%EC%9B%90&quot; aria-label=&quot;공유 자원 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;공유 자원&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;정의&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;여러 프로세스나 스레드가 동시에 접근하거나 사용할 수 있는 자원&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ex) 메모리, 파일, 데이터베이스, 프린터 등&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;문제점&lt;/strong&gt;:
여러 프로세스 또는 스레드가 동시에 공유 자원에 접근하면 &lt;strong&gt;데이터 충돌, 불일치, 손상&lt;/strong&gt; 등의 문제가 발생할 수 있다.&lt;/p&gt;
&lt;h3 id=&quot;임계구역&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9E%84%EA%B3%84%EA%B5%AC%EC%97%AD&quot; aria-label=&quot;임계구역 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;임계구역&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;정의&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;공유 자원에 접근하는 &lt;strong&gt;코드 영역&lt;/strong&gt;으로, &lt;strong&gt;하나의 프로세스나 스레드만이 진입 가능&lt;/strong&gt;해야 한다.&lt;/li&gt;
&lt;li&gt;임계 구역은 공유 자원을 안전하게 사용하기 위해 &lt;strong&gt;동기화 기법&lt;/strong&gt;을 필요로 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;경쟁-조건race-condition&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B2%BD%EC%9F%81-%EC%A1%B0%EA%B1%B4race-condition&quot; aria-label=&quot;경쟁 조건race condition permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;경쟁 조건(race condition)&lt;/h3&gt;
&lt;p&gt;여러 프로세스나 스레드가 &lt;strong&gt;동시에 공유 자원에 접근&lt;/strong&gt;하면서, 실행 결과가 접근 순서에 따라 달라지는 상태&lt;/p&gt;
&lt;h3 id=&quot;생산자-소비자-문제&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%83%9D%EC%82%B0%EC%9E%90-%EC%86%8C%EB%B9%84%EC%9E%90-%EB%AC%B8%EC%A0%9C&quot; aria-label=&quot;생산자 소비자 문제 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;생산자-소비자 문제&lt;/h3&gt;
&lt;p&gt;생산자-소비자 문제는 Race condition의 전통적인 예시다. 생산자는 물건의 수를 증가시키고, 소비자는 물건의 수를 감소시킨다. 만약 생산자 코드와 소비자 코드가 동시에 실행될 경우 문제가 발생한다. 현재 총합(sum)이 3이라고 해보자.&lt;/p&gt;
&lt;p&gt;생산자 코드 먼저 실행&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;생산자 sum = 4
소비자 sum = 2
결과 sum = 2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;소비자 코드 먼저 실행&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;소비자 sum = 2
생산자 sum = 4
결과 sum = 4&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;임계구역-문제-해결-조건&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9E%84%EA%B3%84%EA%B5%AC%EC%97%AD-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0-%EC%A1%B0%EA%B1%B4&quot; aria-label=&quot;임계구역 문제 해결 조건 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;임계구역 문제 해결 조건&lt;/h3&gt;
&lt;p&gt;임계구역 문제를 해결하는 데 있어 가장 중요한 조건은 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;상호 배제(mutual exclusion)&lt;/strong&gt;: 한 번에 하나의 프로세스만 임계 구역에 진입할 수 있도록 보장&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;한정 대기(bounded waiting)&lt;/strong&gt;: 어떤 프로세스도 임계구역에 진입하지 못해 무한 대기하지 않아야 함&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;진행의 융통성(progress flexibility)&lt;/strong&gt;: 한 프로세스가 다른 프로세스의 진행을 방해해서는 안 됨&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;임계구역-문제-해결-방법&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9E%84%EA%B3%84%EA%B5%AC%EC%97%AD-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95&quot; aria-label=&quot;임계구역 문제 해결 방법 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;임계구역 문제 해결 방법&lt;/h2&gt;
&lt;h3 id=&quot;문제-예시&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%AC%B8%EC%A0%9C-%EC%98%88%EC%8B%9C&quot; aria-label=&quot;문제 예시 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;문제 예시&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;동시 진입 상황&lt;/strong&gt;: 상호 배제 조건이 충족되지 않아 두 프로세스 이상이 임계구역에 접근&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;한정 대기 문제&lt;/strong&gt;: 락을 풀지 못해 작업이 진행되지 못하는 Deadlock 발생&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;진행의 융통성 문제&lt;/strong&gt;: 한 프로세스의 진행이 다른 프로세스로 인해 방해받는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;세마포어&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%84%B8%EB%A7%88%ED%8F%AC%EC%96%B4&quot; aria-label=&quot;세마포어 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;세마포어&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;공유 자원의 접근을 제어하기 위한 동기화 도구&lt;/strong&gt;로 자원을 사용할 수 있는 상태를 나타내는 정수 값을 유지하며, 프로세스나 스레드가 자원에 접근할 때 값을 변경하여 동기화를 구현한다&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;구성&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;정수 값&lt;/strong&gt; (&lt;code class=&quot;language-text&quot;&gt;S&lt;/code&gt;):&lt;/li&gt;
&lt;li&gt;자원의 상태를 나타낸다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;초기 값&lt;/strong&gt;은 사용할 수 있는 자원의 개수로 설정된다&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;두 가지 기본 연산&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;wait()&lt;/strong&gt; (또는 &lt;code class=&quot;language-text&quot;&gt;P()&lt;/code&gt;): 자원을 요청&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;자원을 사용할 수 있으면 값을 감소시키고, 사용 권한을 부여&lt;/li&gt;
&lt;li&gt;자원을 사용할 수 없으면 대기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;signal()&lt;/strong&gt; (또는 &lt;code class=&quot;language-text&quot;&gt;V()&lt;/code&gt;): 자원을 해제&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;자원의 사용이 끝났음을 알리고, 값을 증가시킴&lt;/li&gt;
&lt;li&gt;대기 중인 프로세스가 있으면, 자원 사용 권한 부여
&lt;strong&gt;wait() 연산&lt;/strong&gt;
자원을 요청하며 다음과 같이 작동한다&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;p&gt;세마포어 값 &lt;code class=&quot;language-text&quot;&gt;S&lt;/code&gt;가 1 이상이면:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;S&lt;/code&gt;를 1 감소시킨다&lt;/li&gt;
&lt;li&gt;요청 프로세스는 자원을 사용한다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;세마포어 값 &lt;code class=&quot;language-text&quot;&gt;S&lt;/code&gt;가 0이면:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;요청 프로세스는 &lt;strong&gt;대기 큐&lt;/strong&gt;에 들어가며, 자원 사용 대기
&lt;strong&gt;signal() 연산&lt;/strong&gt;
자원을 해제하며 다음과 같이 작동합니다:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;세마포어 값 &lt;code class=&quot;language-text&quot;&gt;S&lt;/code&gt;가 대기 중인 프로세스가 없다면:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;S&lt;/code&gt;를 1 증가시킨다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;세마포어 값 &lt;code class=&quot;language-text&quot;&gt;S&lt;/code&gt;가 대기 중인 프로세스가 있다면:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;대기 중인 프로세스 하나를 깨워 자원을 사용하게 한다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;다음은 2개의 공유 자원에 대해 3개의 프로세스가 작업하는 상황을 나타낸다.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/c0004d798aeb74df6c3a07602461c121/309ad/semaphore.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 82.94117647058825%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAABYlAAAWJQFJUiTwAAACPklEQVR42p1UW2/aMBjl/7/sQjVtD6vWaVrf1ql73KSijWlSoeqqTiAgXAqEkEASk4SYxI7PbDfhslF2+STLjhMfn/N950sJv0SWZWCMIU1TvXZdF7ZtIwxDcM71UPtCCOyL0vaDAvE8D6Zpotfrod/vo9VqodFo6NkwDL03mUzg+74G3gtY3BZFkWakGCpG6lmF7TjI5DfqnbpQsVSgisBBhkmSwJGHlUTLsjRT0xzDHA5gjkcYDO40Q7U/m80eZqhZ5kyzfKzXbAUez+VMUWRN5O8P5pClCThL9RAiw//GGnDk+OhYBG3LR0iTnY9EPv4aMOUZ3nVSvG5mOP7BcTlh9xaSsjjjWh7nG6vcz2KvdA0YM4G3t0uUK3d4XBmjOkr0ASarOZVFIkEIV1aX5VUVf2JI0wynLY6jbx6O6ktUx0wfMwOOM4PjvAecGwwLyvUhsgjg+UTbyXZmu4CKMqUUtdESX4YrXPRjdOwQ4ClurBWeVB08rQxR/urICxgSiRmTOrzeMczmS1DnTMpmG0BlUkII4mWIZRQgIB7c+QwLyeLaSvHsMkD5s4nnVxG6bgI/Yrg1p7joGPjU7qIuPbrtx9K+PBR5Vozedzg+9IWWTHLJlcEK5RrFi+sUr26oLKr4vfW2K1isVQvOJVsi+5bSeF2M6jCRxRvh0cc2Tr4vsMoBxUMMsdURSk7xdykAaxbDibTYm6ayG5NuEIclH7pAhR9EaI/n6E4Jpl6wydG/Aq6BM65bNdP/Rr5jm58fJx9aLHz98AAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;semaphore&apos; title=&apos;&apos; src=&apos;/static/c0004d798aeb74df6c3a07602461c121/ca1dc/semaphore.png&apos; srcset=&apos;/static/c0004d798aeb74df6c3a07602461c121/e7570/semaphore.png 170w,
/static/c0004d798aeb74df6c3a07602461c121/f46e7/semaphore.png 340w,
/static/c0004d798aeb74df6c3a07602461c121/ca1dc/semaphore.png 680w,
/static/c0004d798aeb74df6c3a07602461c121/02d09/semaphore.png 1020w,
/static/c0004d798aeb74df6c3a07602461c121/309ad/semaphore.png 1198w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
&lt;strong&gt;문제점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;복잡성&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;다수의 프로세스가 세마포어를 사용할 경우 설계가 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;데드락(Deadlock)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;프로세스 간의 자원 요청 순서가 꼬일 경우, 데드락이 발생할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;기아 상태(Starvation)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;우선순위가 낮은 프로세스가 계속 대기하게 될 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;휴먼 에러&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;프로그래머가 직접 구현해야 하므로 이를 잘못 사용하거나 사용하지 않을 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;모니터&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%AA%A8%EB%8B%88%ED%84%B0&quot; aria-label=&quot;모니터 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;모니터&lt;/h3&gt;
&lt;p&gt;프로세스나 스레드가 공유 자원에 안전하게 접근할 수 있도록 &lt;strong&gt;동기화와 상호 배제를 보장하는 고수준의 동기화 도구&lt;/strong&gt;로 &lt;strong&gt;공유 자원과 이를 사용하는 코드(임계 구역)를 캡슐화&lt;/strong&gt;하여 동시성 문제를 해결한다.&lt;/p&gt;
&lt;p&gt;위 세마포어 알고리즘이 모든 프로세스에서 자동으로 처리된다면, 굳이 따로 wait(), signal()를 사용할 필요가 없다. 모니터는 이를 실제로 구현한 것으로 &lt;strong&gt;공유 자원을 내부적으로 숨기고 접근하기 위한 인터페이스만 제공&lt;/strong&gt;한다.&lt;/p&gt;
&lt;p&gt;모니터는 시스템 자원을 사용자로부터 숨기고 사용자 요구 사항을 처리할 수 있는 인터페이스만을 제공한다는 점에서 system call과 같은 개념이라고 볼 수 있다.
&lt;strong&gt;장점&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;캡슐화&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;공유 자원과 연산을 하나의 단위로 관리하여 코드 가독성과 유지보수성 향상&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;안전성&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;동기화 오류 가능성 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&quot;궁금했던-부분&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B6%81%EA%B8%88%ED%96%88%EB%8D%98-%EB%B6%80%EB%B6%84&quot; aria-label=&quot;궁금했던 부분 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;궁금했던 부분&lt;/h2&gt;
&lt;h3 id=&quot;non-blocking-communication의-발전&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#non-blocking-communication%EC%9D%98-%EB%B0%9C%EC%A0%84&quot; aria-label=&quot;non blocking communication의 발전 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;non-blocking communication의 발전&lt;/h3&gt;
&lt;p&gt;위에서 언급한 대로 non-blocking communication의 busy waiting을 blocking communication이 동기화를 통해 해결했다. 하지만 동기화 방식은 &lt;strong&gt;대기 상태가 길어질 경우 전체 응답성이 떨어지고 성능이 저하될 수 있다&lt;/strong&gt;는 단점을 가지고 있다.&lt;/p&gt;
&lt;p&gt;현대 non-blocking communication은 busy waiting과 동기화 방식의 대기 상태 문제를 해결한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;고안된 방식&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;데이터를 수신할 준비가 되었는지 상태를 반복적으로 확인하지 않고, &lt;strong&gt;이벤트 기반 처리&lt;/strong&gt;나 &lt;strong&gt;콜백 메커니즘&lt;/strong&gt;을 사용&lt;/li&gt;
&lt;li&gt;CPU는 데이터 송수신을 기다리지 않고 다른 작업을 계속 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;동작 원리&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;이벤트 기반 처리&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;데이터가 준비되면 이벤트를 발생시켜 관련 작업을 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;콜백 메커니즘&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;데이터 송수신이 완료되었을 때, 사전에 등록된 콜백 함수 호출&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;응답 시간을 개선하고, 다수의 작업을 동시에 처리 가능&lt;/li&gt;
&lt;li&gt;CPU 자원을 최대한 활용하여 병렬성을 높임&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;원격-프로시저-호출RPC&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9B%90%EA%B2%A9-%ED%94%84%EB%A1%9C%EC%8B%9C%EC%A0%80-%ED%98%B8%EC%B6%9CRPC&quot; aria-label=&quot;원격 프로시저 호출RPC permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;원격 프로시저 호출(RPC)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;개념&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;원격 프로시저 호출(RPC)은 &lt;strong&gt;네트워크 상의 다른 시스템(서버)에 있는 함수를 로컬 함수처럼 호출&lt;/strong&gt;할 수 있게 해주는 기술
&lt;strong&gt;예시&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Server&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; xmlrpc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;server &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; SimpleXMLRPCServer

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; b

&lt;span class=&quot;token comment&quot;&gt;# 서버 생성&lt;/span&gt;
server &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; SimpleXMLRPCServer&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;localhost&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8080&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Server is running on port 8080...&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
server&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;register_function&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;add&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;add&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# 함수 등록&lt;/span&gt;
server&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;serve_forever&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Client&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; xmlrpc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;client

&lt;span class=&quot;token comment&quot;&gt;# 서버 연결&lt;/span&gt;
client &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; xmlrpc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;client&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ServerProxy&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;http://localhost:8080&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 원격 함수 호출&lt;/span&gt;
result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; client&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;add&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;Result from server: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[CPU 스케줄링]]></title><description><![CDATA[개요 CPU 스케줄러는 여러 프로세스의 상황을 고려해 CPU와 시스템 자원을 어떻게 배분할지 결정한다. 즉, 프로세스의 모든 상태 변화를 조정하는 것이다. 종류 CPU…]]></description><link>https://choiwonyu.github.io/CPU 스케줄링/</link><guid isPermaLink="false">https://choiwonyu.github.io/CPU 스케줄링/</guid><pubDate>Sun, 29 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;개요&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B0%9C%EC%9A%94&quot; aria-label=&quot;개요 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;개요&lt;/h2&gt;
&lt;p&gt;CPU 스케줄러는 여러 프로세스의 상황을 고려해 CPU와 시스템 자원을 어떻게 배분할지 결정한다. 즉, &lt;strong&gt;프로세스의 모든 상태 변화를 조정&lt;/strong&gt;하는 것이다.&lt;/p&gt;
&lt;h3 id=&quot;종류&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A2%85%EB%A5%98&quot; aria-label=&quot;종류 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;종류&lt;/h3&gt;
&lt;p&gt;CPU 스케줄러는 프로세스 관리의 범주를 나누어 스케줄링한다. 규모에 따라 장기 스케줄러, 중기 스케줄러, 단기 스케줄러로 구분된다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;장기 스케줄러: 시스템 내 전체 작업 수를 조절한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;현대 OS에선 사용 빈도가 낮다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;중기 스케줄러: 시스템 내 부하를 조절하기 위해 과부하 전 프로세스를 보류 상태로 보내거나 보류 상태의 프로세스를 활성화한다.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;단기 스케줄러: 어떤 프로세스에 CPU를 할당할 것인지 결정한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU 스케줄링에서 가장 중요한 역할 담당&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;목적&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%AA%A9%EC%A0%81&quot; aria-label=&quot;목적 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;목적&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;공평성&lt;/strong&gt;: 모든 프로세스가 자원을 공평하게 배정받아야 한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;효율성&lt;/strong&gt;: 시스템 자원이 유휴 시간 없이 사용되도록 스케줄링 해야 한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;안정성&lt;/strong&gt;: 우선순위를 사용해 중요 프로세스가 먼저 작동되도록 함으로써 시스템 자원을 점유하거나 파괴하려는 프로세스로부터 자원을 보호해야 한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;확장성&lt;/strong&gt;: 프로세스가 증가해도 시스템이 안정적으로 작동하도록 해야 한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;반응 시간 보장&lt;/strong&gt;: 시스템이 적절한 시간 안에 프로세스의 요구에 반응해야 한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;무한 연기 방지&lt;/strong&gt;: 특정 프로세스의 작업이 무한하게 연기되어선 안 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;스케줄링-시-고려-사항&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81-%EC%8B%9C-%EA%B3%A0%EB%A0%A4-%EC%82%AC%ED%95%AD&quot; aria-label=&quot;스케줄링 시 고려 사항 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;스케줄링 시 고려 사항&lt;/h2&gt;
&lt;p&gt;스케줄러가 어떤 프로세스에 우선적으로 CPU를 할당할지 결정할 때 고려해야할 사항이 있다.&lt;/p&gt;
&lt;h3 id=&quot;선점형-스케줄러와-비선점형-스케줄러&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%84%A0%EC%A0%90%ED%98%95-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%9F%AC%EC%99%80-%EB%B9%84%EC%84%A0%EC%A0%90%ED%98%95-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%9F%AC&quot; aria-label=&quot;선점형 스케줄러와 비선점형 스케줄러 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;선점형 스케줄러와 비선점형 스케줄러&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;구분&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;선점형 스케줄러&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;비선점형 스케줄러&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;작업 방식&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;실행 중인 프로세스가 끝나기 전에, 우선순위가 높은 프로세스가 CPU를 점유할 수 있다&lt;/td&gt;
&lt;td&gt;실행 중인 프로세스가 끝날 때까지 CPU 점유를 유지하며, 다른 프로세스는 대기한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;장점&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;- 응답 시간이 짧아 사용자 작업의 응답성이 향상된다&lt;br&gt;- 긴 작업을 대기시키고 짧은 작업을 우선 처리 가능하다&lt;br&gt;- 동적 우선순위 변경이 가능하다&lt;/td&gt;
&lt;td&gt;- 구현이 단순하고, 컨텍스트 스위칭 비용이 적다&lt;br&gt;- CPU가 특정 작업에 집중할 수 있어 처리량(Throughput)이 증가한다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;단점&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;- 잦은 컨텍스트 스위칭으로 CPU 오버헤드 발생한다&lt;/td&gt;
&lt;td&gt;- 프로세스 간 공정성이 떨어질 수 있다&lt;br&gt;- 긴 작업이 완료되기 전까지 다른 작업이 계속 대기(컨보이 효과)할 가능성이 있다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;사용 사례&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;- 시분할 방식 스케줄링에 사용된다&lt;/td&gt;
&lt;td&gt;- 일괄 작업 방식 스케줄링에 사용된다&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;프로세스-우선순위&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84&quot; aria-label=&quot;프로세스 우선순위 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;프로세스 우선순위&lt;/h3&gt;
&lt;p&gt;프로세스에 우선순위가 있다는 것은 중요도가 다르다는 것이다.
프로세스는 크게 커널 프로세스와 일반 프로세스로 나뉘며, 커널 프로세스가 일반 프로세스보다 우선순위가 높다.&lt;/p&gt;
&lt;p&gt;일반 프로세스도 중요도가 각각 다르기 때문에 우선순위가 다르다. 이 우선순위는 사용자가 조절이 가능하다. 하지만 특정 프로세스에 우선순위를 너무 높이면, 다른 프로세스 처리에 영향이 가기 때문에 유닉스에선 관리자에게만 해당 권한을 부여한다.&lt;/p&gt;
&lt;h3 id=&quot;CPU-집중-프로세스와-IO-집중-프로세스&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#CPU-%EC%A7%91%EC%A4%91-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-IO-%EC%A7%91%EC%A4%91-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4&quot; aria-label=&quot;CPU 집중 프로세스와 IO 집중 프로세스 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;CPU 집중 프로세스와 I/O 집중 프로세스&lt;/h3&gt;
&lt;p&gt;프로세스는 CPU를 사용해 작업하는 실행 상태 또는 I/O를 요청해 완료되기까지 기다리는 대기 상태에 있다. 이때 CPU를 할당받아 실행하는 작업을 CPU burst, I/O 작업을 I/O burst라고 한다.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/a91023b0216803f39da172101c9585d5/60106/bound-process.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 71.17647058823529%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAABg0lEQVR42o1Ti46cMAzk/3+wuqrLtfviGUICIZCQTGOvOG1b2K0lK8bIk7E9yZxzkFKibVsIIdjnecY7W5YFfd9jGAZ2iqdpQqaU4p9VVeF+vzOY1pqLYoz/AG05qhvHEZfLBXmeMyDlMmJHAJTYYgLfA4xPudvt9tVZWZZomoaZZiEEDug2YwzTruv6C3SP4fl8xul0AtWu68qn957/ZUcz6nuJbx/fMVqHfvIPNwuDUWtHlm23Pjv4BH6WHRptIY2Hsh6FnCC0wXPNLuCezS6gUgt8iCj7GbV2HLejTy3G1wz3TKUlCWXQJXZicCgS+K9a4+PHZ1pEA9F1PGtSyCHg1sK2JLKQcmt4OMVVVaIoClhreZa0lLeAm2D3pEM6JfEf6TT7mxnrKWkxzz/Rdy3gNIKViLNEmBq0TQWXJEKqfLsU0iC1QfORnYCq8vTGFIKpEW2Xzharur58kodLQXCAbRG9RRiuCPrKOWKJGP4P8E89pm9nmFmc1cOtQFyXlwx/A2eJR1ALjEZ6AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;bound process&apos; title=&apos;&apos; src=&apos;/static/a91023b0216803f39da172101c9585d5/ca1dc/bound-process.png&apos; srcset=&apos;/static/a91023b0216803f39da172101c9585d5/e7570/bound-process.png 170w,
/static/a91023b0216803f39da172101c9585d5/f46e7/bound-process.png 340w,
/static/a91023b0216803f39da172101c9585d5/ca1dc/bound-process.png 680w,
/static/a91023b0216803f39da172101c9585d5/02d09/bound-process.png 1020w,
/static/a91023b0216803f39da172101c9585d5/9d567/bound-process.png 1360w,
/static/a91023b0216803f39da172101c9585d5/60106/bound-process.png 1522w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
프로세스는 위 작업 형태에 따라 &lt;strong&gt;CPU 집중 프로세스와 I/O 집중 프로세스&lt;/strong&gt;로 나눌 수 있다.
CPU 집중 프로세스는 CPU burst가 많고, I/O 집중 프로세스는 I/O burst가 많다.&lt;/p&gt;
&lt;p&gt;두 프로세스가 있다고 할 때 어떤 프로세스의 우선순위를 높이는 것이 효율적일까?
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/5267c7e666c42ffebbba0f9ea0043ac5/a1898/io-cpu-priority.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 43.529411764705884%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAABRklEQVR42nVSa2+DMBDr//+P/dCKtvQBhJCQJ3i+22irdYtk3YEOY5+zS2VBqgRrXVaEEOC9h3NOe8E4jpjnWXtrLXLO+O/sxlBgQ0XvC1zIGIYefd/jcrkocdd1OBwOOJ/PuN1uaJoGxhgsy6JY11XxIpwLBJ3LiFkGNnwPphRxPB6VSJTe73ftp2nC4/HA9dqqiCehkETaDayF1heSVAHtLxxImT+0E8xo4fwMR+uOykOMsCSdnKeTmWopQAjlQ0H5hVyJ5zN0hq+0L2wEMvOaF1ckdKlSXVW7KWVMXLoZBt1fjIHWrNqWasyAme/fd/YRio9VdzgyGB+i7qhtW62n0wn7/V53JWj4LCGllFBrpepFSdYfKOHAdI1/hSKnlKJJC6kEsoUhyW91C+lD4fsONytS5a4JsVSBqNruZWQgspK/7uMXlKW8TuL1n9cAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;io cpu priority&apos; title=&apos;&apos; src=&apos;/static/5267c7e666c42ffebbba0f9ea0043ac5/ca1dc/io-cpu-priority.png&apos; srcset=&apos;/static/5267c7e666c42ffebbba0f9ea0043ac5/e7570/io-cpu-priority.png 170w,
/static/5267c7e666c42ffebbba0f9ea0043ac5/f46e7/io-cpu-priority.png 340w,
/static/5267c7e666c42ffebbba0f9ea0043ac5/ca1dc/io-cpu-priority.png 680w,
/static/5267c7e666c42ffebbba0f9ea0043ac5/02d09/io-cpu-priority.png 1020w,
/static/5267c7e666c42ffebbba0f9ea0043ac5/9d567/io-cpu-priority.png 1360w,
/static/5267c7e666c42ffebbba0f9ea0043ac5/a1898/io-cpu-priority.png 1674w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
위에서 볼 수 있듯 &lt;strong&gt;I/O 집중 프로세스를 먼저 실행 상태로 옮기는 것이 효율적&lt;/strong&gt;이다. I/O 집중 프로세스가 CPU 집중 프로세스보다 실행 상태에 먼저 들어가는 경우를 &lt;strong&gt;사이클 훔치기&lt;/strong&gt; 라고 한다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;다중-큐&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%8B%A4%EC%A4%91-%ED%81%90&quot; aria-label=&quot;다중 큐 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;다중 큐&lt;/h2&gt;
&lt;h3 id=&quot;준비-상태의-다중-큐&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A4%80%EB%B9%84-%EC%83%81%ED%83%9C%EC%9D%98-%EB%8B%A4%EC%A4%91-%ED%81%90&quot; aria-label=&quot;준비 상태의 다중 큐 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;준비 상태의 다중 큐&lt;/h3&gt;
&lt;p&gt;프로세스는 저마다 중요도가 다르며 중요도는 PCB에 표시된다. 스케줄러가 모든 프로세스의 PCB를 뒤져 우선순위가 높은 프로세스를 찾으려면 상당히 번거로울 것이다.&lt;/p&gt;
&lt;p&gt;따라서 우선순위에 따라 여러 개의 큐를 만들어 프로세스를 분리한다. 이를 간단히 도식화하면 다음과 같다.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/1fb9e443d2b021ecd619a27ba7f64554/cc6c5/pending-queue.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 43.529411764705884%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAABKElEQVR42nWS2a6CUAxF+f+f48EnDGMUGWSQSQbRmtWkxuR6mzTtOafd3d3gyJe9Xi/puk6GYVAnxx6PhzRNo2di3/fynzlt2wp+v9+1sKoqbbzdbppjgHOu61ojoAz/CZimqTZmWSae58n1epXz+SxJkuigPM/FdV0FOp1OH6aw/gnII8z2fdciAGA0jqPmMAG4KApZlkVzQE2iP4Df+uE0McCGYM/nU6Zp+mhr98R5ntXpo9/Ztk0PJj46oScMTUPAYLauqw5ifQx5uKefDRjmXC4XfTCNACSiKTlgURRJWZbi+76guX2cMAw1D4JAMah1aKSYhziOlRUPMLFBh8NBdeOeM/XUHY9H3cZ0ZSsHfXDThA9ha9n/xkrGimY0w4jUsCrvyPcGfFuzqNKYBMYAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;pending queue&apos; title=&apos;&apos; src=&apos;/static/1fb9e443d2b021ecd619a27ba7f64554/ca1dc/pending-queue.png&apos; srcset=&apos;/static/1fb9e443d2b021ecd619a27ba7f64554/e7570/pending-queue.png 170w,
/static/1fb9e443d2b021ecd619a27ba7f64554/f46e7/pending-queue.png 340w,
/static/1fb9e443d2b021ecd619a27ba7f64554/ca1dc/pending-queue.png 680w,
/static/1fb9e443d2b021ecd619a27ba7f64554/02d09/pending-queue.png 1020w,
/static/1fb9e443d2b021ecd619a27ba7f64554/9d567/pending-queue.png 1360w,
/static/1fb9e443d2b021ecd619a27ba7f64554/cc6c5/pending-queue.png 1552w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;프로세스의 우선순위를 배정하는 방식은 고정 우선순위 방식과 변동 우선순위 방식이 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;고정 우선순위 방식&lt;/strong&gt;: 프로세스에 부여된 우선순위가 프로세스가 종료될 때까지 바뀌지 않는다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;장점: 구현이 쉽다.&lt;/li&gt;
&lt;li&gt;단점: 시스템 변화에 대응하기 어려워 효율이 떨어진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;변동 우선순위 방식&lt;/strong&gt;: 프로세스 생성 시 부여받은 우선순위가 작업 중간에 변한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;장점: 시스템 효율을 높인다.&lt;/li&gt;
&lt;li&gt;단점: 구현이 어렵다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;대기-상태의-다중-큐&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%8C%80%EA%B8%B0-%EC%83%81%ED%83%9C%EC%9D%98-%EB%8B%A4%EC%A4%91-%ED%81%90&quot; aria-label=&quot;대기 상태의 다중 큐 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;대기 상태의 다중 큐&lt;/h3&gt;
&lt;p&gt;대기 상태는 입출력이 완료되기를 기다리는 프로세스가 모인 곳이다. 여기선 같은 I/O를 요구한 프로세스들끼리 모아놓는다.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/738515b828881b5f40e36b58e989aa27/526f1/io-queue.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 45.294117647058826%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAABI0lEQVR42nWR6aqDQAyFff9n819RVASlBde6172ayxeYUop3IJrJcnJyxpKfcxyHDMMgXdep7fuu8XEcpe97zc3zLP8d6zxPaZpG6rqWZVk+QDQTw3+/39K2rcZMnL5LQBj5vi+e50me5+q/Xi+J41iez6cCBEEgaZpKVVWSZZmC03cJyAcWsKQIMBiwIgDct21Tf5omNfKcK5bW94UCQL/1MkyQAzBy67pqjEHEuZuYasiFBD4NMIBRURTKEA3LstRVMcOQP7JQizHA4hVvt5vYti33+10cx1FmURRpMea6riRJovo9Hg8FQuswDHUAfcjGcH0U87KwREt81jNFDIAhMXwAIcIQNqLvw/BXVLM2GgJmNEQW2DCQRg5SUMsQQNHwD/5Ptj9jql1cAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;io queue&apos; title=&apos;&apos; src=&apos;/static/738515b828881b5f40e36b58e989aa27/ca1dc/io-queue.png&apos; srcset=&apos;/static/738515b828881b5f40e36b58e989aa27/e7570/io-queue.png 170w,
/static/738515b828881b5f40e36b58e989aa27/f46e7/io-queue.png 340w,
/static/738515b828881b5f40e36b58e989aa27/ca1dc/io-queue.png 680w,
/static/738515b828881b5f40e36b58e989aa27/02d09/io-queue.png 1020w,
/static/738515b828881b5f40e36b58e989aa27/9d567/io-queue.png 1360w,
/static/738515b828881b5f40e36b58e989aa27/526f1/io-queue.png 1702w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
I/O 작업이 끝나고 인터럽트가 도착하면, 준비 상태가 된다. &lt;/p&gt;
&lt;p&gt;준비 상태의 다장 큐는 한 번에 하나의 프로세스를 꺼내 CPU에게 할당하지만, 대기큐는 여러 개의
PCB를 동시에 꺼내 준비 상태로 옮긴다. 이렇게 동시에 끝나는 &lt;strong&gt;인터럽트를 처리하기 위해 인터럽트 벡터라는 자료구조&lt;/strong&gt;를 사용한다.&lt;/p&gt;
&lt;h2 id=&quot;스케줄링-알고리즘&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98&quot; aria-label=&quot;스케줄링 알고리즘 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;스케줄링 알고리즘&lt;/h2&gt;
&lt;h3 id=&quot;스케줄링-알고리즘의-선택-기준&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%9D%98-%EC%84%A0%ED%83%9D-%EA%B8%B0%EC%A4%80&quot; aria-label=&quot;스케줄링 알고리즘의 선택 기준 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;스케줄링 알고리즘의 선택 기준&lt;/h3&gt;
&lt;p&gt;어떤 스케줄링 알고리즘이 효율적인지 파악하려면 그 기준이 있어야 한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CPU 사용률&lt;/strong&gt;: 전체 시스템의 동작 시간 중 CPU가 사용된 시간&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;처리량&lt;/strong&gt;: 단위 시간당 작업을 마친 프로세스의 수&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;대기 시간&lt;/strong&gt;: 작업을 요청한 프로세스가 대기하는 시간&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;응답 시간&lt;/strong&gt;: 프로세스 시작 후 첫 번째 출력 또는 응답이 나올 때까지 걸리는 시간&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;반환 시간&lt;/strong&gt;: 대기 시간 + 실행 시간&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;비선점형-알고리즘&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B9%84%EC%84%A0%EC%A0%90%ED%98%95-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98&quot; aria-label=&quot;비선점형 알고리즘 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;비선점형 알고리즘&lt;/h3&gt;
&lt;p&gt;프로세스가 CPU를 할당받으면 작업이 끝날 때까지 CPU를 놓지 않는다. 이 경우 효율이 떨어져 지금은 거의 사용되지 않는다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;FCFS (First Come, First Served)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;도착 순서대로 프로세스를 처리&lt;/li&gt;
&lt;li&gt;장점: 구현이 간단&lt;/li&gt;
&lt;li&gt;단점: 앞의 긴 작업으로 인해 뒤의 작업이 지연되는 &lt;strong&gt;컨보이 효과&lt;/strong&gt; 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SJF (Shortest Job First)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;실행 시간이 가장 짧은 프로세스를 우선 처리&lt;/li&gt;
&lt;li&gt;장점: 평균 대기 시간 최소화&lt;/li&gt;
&lt;li&gt;단점: 우선순위에 밀려 작업이 계속 연기되는 기아 상태 발생 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;선점형-알고리즘&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%84%A0%EC%A0%90%ED%98%95-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98&quot; aria-label=&quot;선점형 알고리즘 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;선점형 알고리즘&lt;/h3&gt;
&lt;p&gt;시분할 시스템을 고려하여 만들어진 알고리즘으로, 어떤 프로세스가 CPU를 할당받아 실행 중이라도 운영체제가 CPU를 빼앗을 수 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Round Robin (RR)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;모든 프로세스에 동일한 타임 슬라이스를 할당
-&gt; 우선순위가 적용되지 않음&lt;/li&gt;
&lt;li&gt;장점: 공정성 보장, 짧은 응답 시간&lt;/li&gt;
&lt;li&gt;단점: 타임 슬라이스가 적절하지 않으면 성능 저하&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SRTF (Shortest Remaining Time First)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SJF 스케줄링과 RR 스케줄링을 혼합한 방식&lt;/li&gt;
&lt;li&gt;실행 중인 작업보다 남은 실행 시간이 짧은 작업이 도착하면 CPU를 빼앗김&lt;/li&gt;
&lt;li&gt;장점: 평균 대기 시간 최소화&lt;/li&gt;
&lt;li&gt;단점: 작업의 실행 시간을 예측하기 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Priority Scheduling (선점형)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;높은 우선순위의 작업이 도착하면 실행 중인 작업을 중단&lt;/li&gt;
&lt;li&gt;장점: 중요한 작업을 빠르게 처리&lt;/li&gt;
&lt;li&gt;단점: 기아 상태 발생 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;프로세스의 우선순위는 시스템의 효율성이 아닌 프로세스의 중요도를 기준으로 결정된다.&lt;/p&gt;
&lt;h3 id=&quot;다단계-큐-스케줄링&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%8B%A4%EB%8B%A8%EA%B3%84-%ED%81%90-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81&quot; aria-label=&quot;다단계 큐 스케줄링 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;다단계 큐 스케줄링&lt;/h3&gt;
&lt;p&gt;다단계 큐 스케줄링은 &lt;strong&gt;우선순위에 따라 준비 큐를 여러 개 사용&lt;/strong&gt;하는 방식이다.
각각의 큐는 RR방식으로 운영되며, 상단 큐에 있는 모든 프로세스의 작업이 끝나야 다음 우선순위 큐의 작업이 시작된다.&lt;/p&gt;
&lt;p&gt;장점&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;단순성&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;큐를 분리하여 처리하므로 구조가 명확하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;단점&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;유연성 부족&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;큐 간 이동이 불가능하므로, 동적으로 프로세스 우선순위를 변경하기 어렵다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;기아 상태(Starvation)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;우선순위가 낮은 큐에 있는 프로세스가 오랫동안 실행되지 않을 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;다단계-피드백-큐-스케줄링&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%8B%A4%EB%8B%A8%EA%B3%84-%ED%94%BC%EB%93%9C%EB%B0%B1-%ED%81%90-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81&quot; aria-label=&quot;다단계 피드백 큐 스케줄링 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;다단계 피드백 큐 스케줄링&lt;/h3&gt;
&lt;p&gt;다단계 피드백 큐 스케줄링은 우선순위가 낮은 프로세스에 불리한 다단계 큐 스케줄링의 문제점을 보완한 방식이다. 이 방식에서 &lt;strong&gt;프로세스는 CPU를 사용한 후 원래 큐로 되돌아가지 않고 우선순위가 하나 낮은 큐의 끝으로 들어간다.&lt;/strong&gt; 때문에 우선순위가 낮은 프로세스의 실행이 연기되는 문제를 완화할 수 있다.&lt;/p&gt;
&lt;p&gt;물론 프로세스의 우선순위가 낮아진다고 해도 커널 프로세스가 일반 프로세스의 큐에 삽입되지는 않는다.&lt;/p&gt;
&lt;p&gt;또한 이 방식에서는 우선순위에 따라 타임 슬라이스의 크기가 다르다.
프로세스의 우선순위가 낮아질 수록 타임 슬라이스의 크기가 커진다. 따라서 어렵게 얻은 CPU를 좀 더 오랫동안 사용할 수 있도록 한다.&lt;/p&gt;
&lt;p&gt;장점&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;유연성&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;프로세스 특성에 따라 큐 간 이동이 가능하다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;기아 상태 방지&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;우선순위가 낮은 프로세스도 시간이 지나면 실행될 기회를 얻는다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;성능 최적화&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;짧은 작업은 빠르게 처리하고, 긴 작업은 낮은 우선순위 큐로 이동한다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;단점&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;복잡성 증가&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;큐 이동 조건과 알고리즘 설계가 복잡하다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;컨텍스트 스위칭 비용 증가&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;프로세스가 큐를 이동할 때 잦은 컨텍스트 스위칭 발생한다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[프로세스와 스레드]]></title><description><![CDATA[…]]></description><link>https://choiwonyu.github.io/프로세스와 스레드/</link><guid isPermaLink="false">https://choiwonyu.github.io/프로세스와 스레드/</guid><pubDate>Sat, 28 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;프로세스란&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EB%9E%80&quot; aria-label=&quot;프로세스란 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;프로세스란?&lt;/h2&gt;
&lt;h3 id=&quot;프로그램과-프로세스의-차이&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EA%B3%BC-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%9D%98-%EC%B0%A8%EC%9D%B4&quot; aria-label=&quot;프로그램과 프로세스의 차이 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;프로그램과 프로세스의 차이&lt;/h3&gt;
&lt;p&gt;프로그램은 어떤 데이터를 사용하여 어떤 작업을 할지 그 절차를 정의한 것이다. 따라서 &lt;strong&gt;저장장치에 저장되는 정적인 상태&lt;/strong&gt;다.&lt;/p&gt;
&lt;p&gt;반면 프로세스는 정의된 절차를 실행에 옮기는 것으로 &lt;strong&gt;메모리에 올라온 동적인 상태&lt;/strong&gt;다.
그렇다면 프로그램이 프로세스로 전환되려면 어떤 과정을 거쳐야할까?&lt;/p&gt;
&lt;h3 id=&quot;프로그램에서-프로세스로의-전환&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%97%90%EC%84%9C-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EB%A1%9C%EC%9D%98-%EC%A0%84%ED%99%98&quot; aria-label=&quot;프로그램에서 프로세스로의 전환 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;프로그램에서 프로세스로의 전환&lt;/h3&gt;
&lt;p&gt;가장 먼저 운영체제는 프로그램을 메모리의 적당한 위치로 가져온다. 그와 동시에 프로세스 제어 블록(PCB)을 만든다. PCB에는 프로세스를 처리하는 데 필요한 다양한 정보가 들어있어 프로그램이 프로세스로 전환되는 데 꼭 필요하다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;프로세스 제어 블록&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;개념: 운영체제가 각 프로세스를 관리하기 위해 사용하는 데이터 구조&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;주요 정보&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PID: 프로세스를 구분하는 ID&lt;/li&gt;
&lt;li&gt;메모리 관련 정보: 프로세스의 메모리 위치 정보&lt;/li&gt;
&lt;li&gt;각종 중간값: 시분할 시스템에서는 여러 프로세스가 번갈아 가며 실행되기 때문에 &lt;strong&gt;다음에 작업해야할 코드의 위치가 담긴 프로그램 카운터가 저장&lt;/strong&gt;된다.&lt;/li&gt;
&lt;li&gt;우선순위 정보: 프로세스의 스케줄링 순서를 결정한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;주요 역할&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;프로세스 상태 관리&lt;/li&gt;
&lt;li&gt;스케줄링 지원&lt;/li&gt;
&lt;li&gt;Context Switching&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;프로세스의-상태&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%9D%98-%EC%83%81%ED%83%9C&quot; aria-label=&quot;프로세스의 상태 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;프로세스의 상태&lt;/h3&gt;
&lt;p&gt;이전 기록에서 다룬 일괄 작업 시스템의 경우 하나의 작업이 모두 끝난 후 다른 작업이 수행된다. 따라서 프로세스 상태는 &lt;strong&gt;생성, 실행, 완료 중 하나&lt;/strong&gt;가 된다.&lt;/p&gt;
&lt;p&gt;하지만 시분할 시스템은 좀 더 복잡하다. 프로세스의 작업이 끝나지 않아도 CPU를 넘겨주는 일이 빈번하기 때문이다.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/386264d4ac68cbe056de476fc2fd38f8/ec056/process-status.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 55.294117647058826%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAABBElEQVR42pWS6W7EMAiE/f7PmJ+57/tOqD4kVla67bZIFhDDMIzjtm2TYRikbVv15H816y3LUuq6lmmaxI3jKH3fS5ZlekmM3fetxzfLzQNAPYBVVWm/O89T5nmWZVnU53n+AjU7jkPWdf02AMAwDAWMfd/lui5xfgFNTImiSKeSU0QcBIE0TaPNDAfMVvUHued6NECfYpjGcaxAGLKkaap68w3/ZO2eQsOI6TSzPjIkSaIxerNB13WvR/gIaAU0w9SkILY7ANH1nbl3vwLrmD4w9g39YEuNP+RXhugIA5phyhDWI0cK7ji87EeGT4MpjPBFUeij+NL8GxAWrM6B7U/aGeAXUv5celWA4L8AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;process status&apos; title=&apos;&apos; src=&apos;/static/386264d4ac68cbe056de476fc2fd38f8/ca1dc/process-status.png&apos; srcset=&apos;/static/386264d4ac68cbe056de476fc2fd38f8/e7570/process-status.png 170w,
/static/386264d4ac68cbe056de476fc2fd38f8/f46e7/process-status.png 340w,
/static/386264d4ac68cbe056de476fc2fd38f8/ca1dc/process-status.png 680w,
/static/386264d4ac68cbe056de476fc2fd38f8/02d09/process-status.png 1020w,
/static/386264d4ac68cbe056de476fc2fd38f8/9d567/process-status.png 1360w,
/static/386264d4ac68cbe056de476fc2fd38f8/ec056/process-status.png 1840w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
&lt;strong&gt;생성 상태&lt;/strong&gt;
생성 상태는 프로그램이 올라오고 PCB를 할당받은 상태다. 생성된 프로세스는 바로 실행되는 것이 아닌 준비 상태에서 본인 순서를 기다린다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;준비 상태&lt;/strong&gt;
준비 상태는 실행 순서를 기다리는 상태다. PCB는 Ready Queue에서 기다리며 CPU 스케줄러에 의해 관리된다. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;실행 상태&lt;/strong&gt;
실행 상태는 프로세스가 CPU를 할당받아 실행되는 상태다. 자신에게 주어진 시간, 즉 &lt;strong&gt;타임 슬라이스 동안만 작업이 가능&lt;/strong&gt;하다. 타임 슬라이스 동안 작업이 완료되면 정상 종료되고, 작업을 끝내지 못하면 클록이 보낸 인터럽트에 의해 timeout이 발생해 다시 준비 상태로 돌아간다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;대기 상태&lt;/strong&gt;
대기 상태는 실행 상태에서 입출력을 요청한 프로세스가 입출력 완료를 기다리는 상태다. 입출력이 완료되면 인터럽트가 발생해 준비 상태로 전환된다	.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;완료 상태&lt;/strong&gt;
완료 상태는 프로세스가 종료되는 상태다. 코드와 사용한 데이터를 메모리에서 삭제하고 PCB는 폐기한다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;Context-Switching&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Context-Switching&quot; aria-label=&quot;Context Switching permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;Context Switching&lt;/h2&gt;
&lt;p&gt;Context Switcing은 CPU가 현재 실행 중인 프로세스의 상태(Context)를 저장하고, 다음에 실행할 프로세스의 상태를 복원하여 작업을 전환하는 과정이다.&lt;/p&gt;
&lt;h3 id=&quot;절차&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A0%88%EC%B0%A8&quot; aria-label=&quot;절차 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;절차&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;실행 중인 프로세스 상태 저장&lt;/li&gt;
&lt;li&gt;실행 중인 프로세스의 상태(Context)를 PCB(Process Control Block)에 저장한다.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;저장되는 정보:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;프로그램 카운터(PC)&lt;/strong&gt;: 다음에 실행할 명령어의 주소.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CPU 레지스터 상태&lt;/strong&gt;: 계산 중이던 데이터, 연산 상태 등.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;메모리 관리 정보&lt;/strong&gt;: 프로세스가 사용하는 메모리 주소 정보.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;새 프로세스의 상태 복원&lt;/li&gt;
&lt;li&gt;실행할 프로세스의 PCB에서 상태(Context)를 복원한다.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;복원되는 정보:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;프로그램 카운터(PC).&lt;/li&gt;
&lt;li&gt;CPU 레지스터 값.&lt;/li&gt;
&lt;li&gt;메모리 정보.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;프로세스 전환&lt;/li&gt;
&lt;li&gt;CPU가 새 프로세스의 명령어 실행을 시작한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Context Switching은 위처럼 일반적으로 타임 슬라이스가 만료되었을 때 발생한다. 하지만 다음과 같은 상황에서도 발생한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;입출력 요청&lt;/li&gt;
&lt;li&gt;우선순위 스케줄링&lt;/li&gt;
&lt;li&gt;인터럽트 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;타임-슬라이스의-크기&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%83%80%EC%9E%84-%EC%8A%AC%EB%9D%BC%EC%9D%B4%EC%8A%A4%EC%9D%98-%ED%81%AC%EA%B8%B0&quot; aria-label=&quot;타임 슬라이스의 크기 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;타임 슬라이스의 크기&lt;/h3&gt;
&lt;p&gt;위 Context Switching이 너무 빈번하게 일어나면, 시스템 성능이 떨어질 것이다. 따라서 타임 슬라이스의 크기를 정하는 것도 중요하다.&lt;/p&gt;
&lt;p&gt;만약 타임 슬라이스 크기가 너무 크다면, 작업 전환까지 시간이 너무 오래 걸려 끊겨 보일 것이다.
비디오 플레이어와 워드프로세서를 동시에 실행한다고 해보자. 타임 슬라이스가 너무 크다면, 비디오가 끊겨 보이고, 워드프로세서의 반응 속도도 매우 느릴 것이다. &lt;/p&gt;
&lt;p&gt;타임 슬라이스를 너무 작게 설정한다면, 위에서 말한 대로 시스템의 성능이 떨어진다. Context Switching에 5ms가 걸린다고 가정해보자. 만약 타임 슬라이스를 1ms로 설정한다면, 실제 작업을 못 하는 문제가 발생할 것이다.&lt;/p&gt;
&lt;p&gt;결론적으로 &lt;strong&gt;타임 슬라이스는 되도록 작게 설정하되 Context Switching에 걸리는 시간을 고려해 적당한 크기로 설정하는 것이 중요&lt;/strong&gt;하다. &lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;프로세스의-연산&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%9D%98-%EC%97%B0%EC%82%B0&quot; aria-label=&quot;프로세스의 연산 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;프로세스의 연산&lt;/h2&gt;
&lt;p&gt;이번엔 프로세스가 어떻게 생성되고 분리되는지 알아보자. &lt;/p&gt;
&lt;h3 id=&quot;프로세스의-구조&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%9D%98-%EA%B5%AC%EC%A1%B0&quot; aria-label=&quot;프로세스의 구조 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;프로세스의 구조&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;코드 영역&lt;/strong&gt;: 프로그램의 실행 코드(명령어)가 저장되는 영역으로 CPU가 실행할 기계어로 번역된 명령어들이 포함&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;읽기 전용으로 처리된다.
&lt;strong&gt;데이터 영역&lt;/strong&gt;: 코드가 실행되면서 사용하는 변수나 파일 등 각종 데이터가 저장되는 영역&lt;/li&gt;
&lt;li&gt;읽기/쓰기로 처리된다.
&lt;strong&gt;스택 영역&lt;/strong&gt;: 함수 호출 시 지역 변수, 매개변수, 반환 주소 등이 저장되는 영역&lt;/li&gt;
&lt;li&gt;사용자에게는 보이지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;fork-시스템-호출&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#fork-%EC%8B%9C%EC%8A%A4%ED%85%9C-%ED%98%B8%EC%B6%9C&quot; aria-label=&quot;fork 시스템 호출 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;fork() 시스템 호출&lt;/h3&gt;
&lt;p&gt;개념: fork()는 &lt;strong&gt;실행중인 프로세스(부모 프로세스)로부터 새로운 프로세스(자식 프로세스)를 생성&lt;/strong&gt;한다.&lt;/p&gt;
&lt;p&gt;동작 방식: &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;프로세스 복사:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;부모 프로세스의 메모리 공간(텍스트, 데이터, 힙, 스택)을 그대로 복사하여 자식 프로세스를 생성.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;프로세스 ID(PID):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;fork()&lt;/code&gt;는 자식 프로세스에서는 0을 반환, 부모 프로세스에서는 자식의 PID(Process ID)를 반환.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;독립적인 실행:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;부모와 자식 프로세스는 서로 독립적으로 실행되며, 서로 영향을 미치지 않음.&lt;/li&gt;
&lt;li&gt;각 프로세스는 자신만의 PCB(Process Control Block)를 가짐.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;장점&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;프로세스의 생성 속도: 새로 생성하는 것보다 생성 속도가 빠르다.&lt;/li&gt;
&lt;li&gt;추가 작업 없이 자원 상속: 부모 프로세스가 사용하던 모든 자원을 추가 작업 없이 상속할 수 있다.&lt;/li&gt;
&lt;li&gt;시스템 관리 효율: 부모 프로세스와 자식 프로세스가 구분자로 연결되어 있기 때문에 자식 프로세스를 종료하면 부모 프로세스가 정리할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;exec-시스템-호출&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#exec-%EC%8B%9C%EC%8A%A4%ED%85%9C-%ED%98%B8%EC%B6%9C&quot; aria-label=&quot;exec 시스템 호출 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;exec() 시스템 호출&lt;/h3&gt;
&lt;p&gt;개념: exec()는 기존 프로세스를 새로운 프로세스로 전환하는 함수다.&lt;/p&gt;
&lt;p&gt;동작 방식:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;현재 프로세스 대체&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;exec()&lt;/code&gt;는 호출된 프로세스의 기존 코드, 데이터, 힙, 스택을 모두 제거하고, 새로 지정된 프로그램으로 메모리 내용을 교체합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;프로세스 ID 유지&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;exec()&lt;/code&gt;는 새로운 프로그램을 실행하지만, &lt;strong&gt;프로세스 ID(PID)&lt;/strong&gt;는 변경되지 않습니다.&lt;/li&gt;
&lt;li&gt;즉, 프로세스의 껍데기는 그대로 유지된 상태에서 실행 코드만 변경됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;새로운 프로그램 실행&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;새로운 프로그램의 실행이 시작되며, 기존 프로그램의 흐름은 완전히 종료됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;exec()를 호출하면, fork()와 같이 새로운 프로세스가 생성되는 것이 아닌 기존 프로세스가 새로운 프로세스로 대체된다. 따라서 기존 프로세스의 PID를 유지한다.&lt;/p&gt;
&lt;h3 id=&quot;fork와-exec&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#fork%EC%99%80-exec&quot; aria-label=&quot;fork와 exec permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;fork()와 exec()&lt;/h3&gt;
&lt;p&gt;위 내용을 요약하면, fork()는 부모 프로세스를 복사해 효율적으로 새로운 프로세스를 생성하고, exec()는 기존 프로세스와 다른 새로운 프로세스로 전환할 수 있게 한다. &lt;/p&gt;
&lt;p&gt;이러한 프로세스의 복사와 전환은 프로세스의 생성 과정과 계층 구조를 이해하는 데 큰 도움이 된다.&lt;/p&gt;
&lt;h3 id=&quot;프로세스의-계층-구조&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%9D%98-%EA%B3%84%EC%B8%B5-%EA%B5%AC%EC%A1%B0&quot; aria-label=&quot;프로세스의 계층 구조 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;프로세스의 계층 구조&lt;/h3&gt;
&lt;p&gt;유닉스의 예를 통해 프로세스의 계층 구조를 살펴보자.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/d14475c4ad4c127d56864445d4fcb0b4/bac97/process-hierarchy.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 92.94117647058823%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAABYlAAAWJQFJUiTwAAACOUlEQVR42o1UiXKqQBD0/39OS8sgniiICqKI3Fdnel4w+hI1W0Ut7M72dPfM0sObEccxLMvCdruF53mIouhlfK97adv2x2ZVVdjtdlgsFhgMBtjv93AcB3VdvwfkYCAZ5XmONE1RFAUulws2mw1ms5kChmF420+TRJ9aEv8ALMtSJY3HY51PpxOCINAEnAmYyOHz+Yzj8QjP9+HL7EqSg8R3KhWQ2SjFdV3Ytq1M7mURgD4SsLpjI1RR71xEizla2bsxJAAz9/t9rFYrZed9ZaVc0zSV+XA41G+6XUmSSmIq8bgWBbUwbsQOBWTleGg+n2O5XOoh+sdBDw+HgxZmvV4rSwI2sk+gUvYiYd8KWCuqbh4S4Hq96oGmaR4qR29+64LunCM2PXj4LPi++vSWDGkJVZAxfTWnU917AHzGhExZLPYg526NMWydyWSiSWjJr4D/Dwaw7+gtmdHPLMtuwATiOvdZVHbAS0D6Qzl8RqMRfKkkGXXF4jqZUzrB2S29d3eZRWIgWRCEF+C7DXPdo3QWlKzfAlIGG5t9yHvdSe7s4BoBKbm+b5tngx7x0MfHh7IxDEOZXMILlrJHyVOptONs9aa9BSxEli83wjAmOmfpvyvGXuD7Tq7eamX9rSj605AeP6UtxpaHfSh/mYpyv/wtW9hBCtMO4McNivpF23SH3HOuj3lIYJ8yGG6MOK/RSMDCS+BfS8wOKfyogHXM/sBQsoZJhSAuFDi4flc5E/pH+eZaKNSLqsEnjYC6LPSriV4AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;process hierarchy&apos; title=&apos;&apos; src=&apos;/static/d14475c4ad4c127d56864445d4fcb0b4/ca1dc/process-hierarchy.png&apos; srcset=&apos;/static/d14475c4ad4c127d56864445d4fcb0b4/e7570/process-hierarchy.png 170w,
/static/d14475c4ad4c127d56864445d4fcb0b4/f46e7/process-hierarchy.png 340w,
/static/d14475c4ad4c127d56864445d4fcb0b4/ca1dc/process-hierarchy.png 680w,
/static/d14475c4ad4c127d56864445d4fcb0b4/02d09/process-hierarchy.png 1020w,
/static/d14475c4ad4c127d56864445d4fcb0b4/bac97/process-hierarchy.png 1128w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
유닉스에서 커널이 처음 부팅되면, 커널 관련 프로세스를 여러 개 만드는데 그 중 &lt;strong&gt;init 프로세스는 전체 프로세스의 출발점&lt;/strong&gt;이 된다. fork()와 exec() 시스템 호출을 이용해 자식 프로세스를 만드는 것이다.&lt;/p&gt;
&lt;p&gt;장점&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;관리 용이성&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;트리 구조를 통해 프로세스의 부모-자식 관계를 명확히 하고, 고아 프로세스나 좀비 프로세스를 효율적으로 관리.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;계층적 접근&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;부모-자식 관계를 기반으로 프로세스 상태를 추적하거나 자원을 할당.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;자원 분리&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;부모와 자식 프로세스는 독립적인 메모리와 실행 흐름을 가지므로, 안전하고 안정적인 운영 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;유연한 작업 분배&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;부모 프로세스가 주요 작업을 관리하고, 자식 프로세스가 세부 작업을 분담.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;고아 프로세스&lt;/strong&gt;: 자식 프로세스가 종료되기 전 부모 프로세스가 먼저 종료될 경우 자식 프로세스는 고아 프로세스가 된다.
&lt;strong&gt;좀비 프로세스&lt;/strong&gt;: 자식 프로세스가 종료되었는데도 부모 프로세스가 뒤처리를 하지 않을 때 발생한다.&lt;/p&gt;
&lt;p&gt;위 고아 프로세스와 좀비 프로세스가 많아지면, 자원이 낭비되기 때문에 효율적인 운영에 방해가 된다. 따라서 운영체제는 주기적으로 반환되지 못한 자원을 회수해야 한다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;스레드&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%8A%A4%EB%A0%88%EB%93%9C&quot; aria-label=&quot;스레드 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;스레드&lt;/h2&gt;
&lt;p&gt;오늘날의 운영체제는 프로세스의 낭비 요소를 제거하고 프로세스 작업의 유연성을 얻기 위해 멀티스레드를 사용한다. &lt;/p&gt;
&lt;h3 id=&quot;개념&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B0%9C%EB%85%90&quot; aria-label=&quot;개념 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;개념&lt;/h3&gt;
&lt;p&gt;스레드는 &lt;strong&gt;프로세스의 코드에 정의된 절차에 따라 CPU에 작업 요청을 하는 실행 단위&lt;/strong&gt;다.
운영체제 입장에서 작업 단위는 프로세스이고, 프로세스가 생성되고 CPU 스케줄러가 CPU에게 전달하는 작업하나가 스레드다. 즉, CPU 입장에서 작업 단위는 스레드인 것이다.&lt;/p&gt;
&lt;h3 id=&quot;프로세스와-스레드의-차이&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4&quot; aria-label=&quot;프로세스와 스레드의 차이 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;프로세스와 스레드의 차이&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;구분&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;프로세스&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;스레드&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;실행 단위&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;독립적인 실행 단위.&lt;/td&gt;
&lt;td&gt;프로세스 내의 실행 단위.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;자원 관리&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;프로세스는 독립된 메모리 공간(코드, 데이터, 힙, 스택)을 가짐.&lt;/td&gt;
&lt;td&gt;같은 프로세스 내의 스레드끼리 메모리와 자원 공유.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;통신 방식&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;프로세스 간 통신(IPC) 필요.&lt;/td&gt;
&lt;td&gt;프로세스 내 스레드는 직접 메모리 접근 가능.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;오버헤드&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;생성 및 전환 시 오버헤드 큼.&lt;/td&gt;
&lt;td&gt;생성 및 전환 시 오버헤드 작음.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;독립성&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;프로세스는 서로 독립적.&lt;/td&gt;
&lt;td&gt;같은 프로세스 내 스레드는 독립적으로 실행되지만, 자원 공유로 인해 영향을 받음.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;스레드는 프로세스라는 개념이 만들어진 한참 후에 만들어진 개념이다. 초기의 운영체제에서는 작업의 단위가 프로세스 하나뿐이었다. 당시엔 1개의 스레드만 가진 프로세스만 있는 셈이었기 때문에 구분할 필요가 없던 것이다.&lt;/p&gt;
&lt;p&gt;CPU와 프로그래밍 기술이 발전하면서 여러 개의 코어를 가진 CPU가 생겨나 멀티스레드를 지원하기 시작했다. 따라서 프로세스를 다양한 스레드로 나눠 여러 코어에 배분함으로써 시스템의 효율을 높이게 된 것이다.&lt;/p&gt;
&lt;h3 id=&quot;멀티스레드&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%A9%80%ED%8B%B0%EC%8A%A4%EB%A0%88%EB%93%9C&quot; aria-label=&quot;멀티스레드 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;멀티스레드&lt;/h3&gt;
&lt;p&gt;멀티스레드는 &lt;strong&gt;하나의 프로세스에서 여러 스레드가 병렬로 실행&lt;/strong&gt;되도록 하는 기술이다.&lt;/p&gt;
&lt;p&gt;과거에는 프로세스 하나에 스레드가 하나였기 때문에 여러 작업을 하려면 fork() 시스템 호출로 여러 개의 프로세스를 만들어야 했다. 하지만 오늘날에는 하나의 프로세스에 여러 스레드를 만들어 사용한다.&lt;/p&gt;
&lt;p&gt;프로세스의 데이터는 정적인 영역과 동적인 영역으로 나뉜다. 동적인 영역의 대표적인 예는 레지스터 값, 스택 등이 있다. 멀티스레드 환경에선 여러 스레드들이 정적인 영역을 공유하고, 독립적으로 동적 영역을 가진다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;응답성 향상&lt;/strong&gt;: 여러 스레드를 활용하므로 사용자의 작업 요구에 빨리 응답할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;자원 공유&lt;/strong&gt;: 프로세스가 가진 자원을 모든 스레드가 공유하게 되어 원활하게 작업을 진행할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;효율성 향상&lt;/strong&gt;: 여러 개의 프로세스를 생성할 필요가 없어 불필요한 자원의 중복을 막는다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;다중 CPU 지원&lt;/strong&gt;: 2개 이상의 CPU를 가진 컴퓨터에서 효율적으로 CPU를 이용할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;단점&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;동기화 문제&lt;/strong&gt;: 여러 스레드가 동일한 자원(변수, 데이터 구조)에 접근할 때, 데이터 충돌이나 비정상 동작이 발생할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;디버깅의 어려움&lt;/strong&gt;: 스레드는 병렬로 실행되므로 실행 순서를 예측하기 어렵고, 디버깅 및 테스트가 복잡하다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;데드락&lt;/strong&gt;: 여러 스레드가 서로가 보유한 자원을 기다리며 영원히 정지 상태에 빠지는 문제가 발생할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;하나의 스레드 오류가 전체 프로세스에 영향&lt;/strong&gt;: 같은 프로세스 내의 스레드들은 메모리를 공유하므로, 하나의 스레드가 비정상 종료되면 다른 스레드와 프로세스 전체에 영향을 줄 수 있다.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[컴퓨터 구조와 성능]]></title><description><![CDATA[기본 구성 하드웨어는 기본적으로 필수 장치와 주변 장치로 나뉜다. CPU와 메인 메모리가 필수 장치이고, 입출력 장치나 저장 장치 등이 주변 장치로 분류된다. 메인 메모리는 제…]]></description><link>https://choiwonyu.github.io/컴퓨터 구조와 성능/</link><guid isPermaLink="false">https://choiwonyu.github.io/컴퓨터 구조와 성능/</guid><pubDate>Fri, 27 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;기본-구성&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B8%B0%EB%B3%B8-%EA%B5%AC%EC%84%B1&quot; aria-label=&quot;기본 구성 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;기본 구성&lt;/h2&gt;
&lt;p&gt;하드웨어는 기본적으로 필수 장치와 주변 장치로 나뉜다. CPU와 메인 메모리가 필수 장치이고, 입출력 장치나 저장 장치 등이 주변 장치로 분류된다.&lt;/p&gt;
&lt;p&gt;메인 메모리는 제 1 저장 장치라고도 불리며, 전력이 끊어지면 데이터를 잃어버린다. 따라서 영구적으로 데이터를 보관하기 위해선 별도의 작업이 필요하다. 이 역할을 해주는 것이 USB, 하드디스크 같은 저장 장치이고, 제 2 저장 장치라고도 불린다.&lt;/p&gt;
&lt;h3 id=&quot;왜-저장-장치는-메모리보다-느릴까&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%99%9C-%EC%A0%80%EC%9E%A5-%EC%9E%A5%EC%B9%98%EB%8A%94-%EB%A9%94%EB%AA%A8%EB%A6%AC%EB%B3%B4%EB%8B%A4-%EB%8A%90%EB%A6%B4%EA%B9%8C&quot; aria-label=&quot;왜 저장 장치는 메모리보다 느릴까 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;왜 저장 장치는 메모리보다 느릴까?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;설계 목적 차이&lt;/strong&gt;: 메인 메모리는 데이터를 빠르게 읽고 쓰기 위해 설계되었으며, CPU와 가까운 위치에서 데이터를 직접 주고받는다. 반면, 저장 장치는 데이터를 안정적으로 장기간 보존하는 데 중점을 둔다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;비용과 기술적 제약&lt;/strong&gt;: 메모리는 고속 처리를 위해 고급 반도체 기술을 사용하지만, 저장 장치는 비용 효율성을 중시하여 대량의 데이터를 저장할 수 있도록 설계된다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;데이터 접근 방식 차이&lt;/strong&gt;: 메모리는 랜덤 액세스 방식으로 동작하여 모든 위치에 균일한 시간으로 접근 가능하지만, 저장 장치는 블록 단위 접근으로 인해 속도가 느릴 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;폰노이만-구조&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%8F%B0%EB%85%B8%EC%9D%B4%EB%A7%8C-%EA%B5%AC%EC%A1%B0&quot; aria-label=&quot;폰노이만 구조 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;폰노이만 구조&lt;/h3&gt;
&lt;p&gt;폰노이만 구조는 CPU, 메모리, 입출력장치, 저장장치가 &lt;strong&gt;버스로 연결된 시스템 설계 모델&lt;/strong&gt;을 말한다.
이 구조는 오늘날 대부분의 컴퓨터 시스템에 적용된 기본 아키텍처다.&lt;/p&gt;
&lt;p&gt;이전 컴퓨터는 하드와이어링 형태였기 때문에 다른 용도로 컴퓨터를 사용하려면 전선의 연결을 바꿔야했다. 폰노이만 구조 덕분에 하드웨어를 바꾸지 않고도 프로그램을 교체할 수 있게 된 것이고, 컴퓨터로 다양한 작업을 할 수 있게 된 것이다.&lt;/p&gt;
&lt;p&gt;폰노이만 구조의 가장 중요한 특징은 &lt;strong&gt;모든 프로그램은 메모리에 올라와야 실행할 수 있다.&lt;/strong&gt; 는 것이다.&lt;/p&gt;
&lt;h3 id=&quot;시스템-버스와-CPU-버스&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%8B%9C%EC%8A%A4%ED%85%9C-%EB%B2%84%EC%8A%A4%EC%99%80-CPU-%EB%B2%84%EC%8A%A4&quot; aria-label=&quot;시스템 버스와 CPU 버스 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;시스템 버스와 CPU 버스&lt;/h3&gt;
&lt;p&gt;시스템 버스는 메모리와 주변장치를 연결하며, FSB(Front-Side Bus) 혹은 전면 버스라고 부른다.
CPU 버스는 CPU 내부 다양한 장치들을 연결하는 버스로 BSB(Back-Side Bus) 혹은 후면 버스라고 부른다. BSB의 속도는 CPU의 클록과 같으며 FSB보다 훨씬 빠르다.&lt;/p&gt;
&lt;h3 id=&quot;클록&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%81%B4%EB%A1%9D&quot; aria-label=&quot;클록 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;클록&lt;/h3&gt;
&lt;p&gt;컴퓨터에서 일정한 박자를 만들어내는 것을 클록이라고 한다. 클록에 의해 일정 간격으로 만들어진느 틱을 펄스 혹은 클록 틱이라고 부른다. 클록이 펄스를 만들면 거기에 맞춰 컴퓨터 안 부품들이 작업을 진행한다.&lt;/p&gt;
&lt;p&gt;이 펄스의 단위는 Hz다. &lt;strong&gt;1초 동안 몇 번의 작업이 이루어져 몇 번의 펄스가 발생했는지 의미&lt;/strong&gt;한다.
예를 들어 3GHz의 CPU가 있다면 해당 CPU는 1초 동안 약 30억 번의 작업이 가능한 CPU인 것이다.&lt;/p&gt;
&lt;h2 id=&quot;cpu와-메모리&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#cpu%EC%99%80-%EB%A9%94%EB%AA%A8%EB%A6%AC&quot; aria-label=&quot;cpu와 메모리 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;cpu와 메모리&lt;/h2&gt;
&lt;h3 id=&quot;CPU-구성&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#CPU-%EA%B5%AC%EC%84%B1&quot; aria-label=&quot;CPU 구성 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;CPU 구성&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;산술논리 연산장치(ALU)&lt;/strong&gt;: CPU에서 데이터를 연산하는 장치&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;제어장치&lt;/strong&gt;: CPU에서 작업을 지시하는 부분&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;레지스터&lt;/strong&gt;: 작업에 필요한 데이터를 CPU 내부에 보관하는 곳&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;레지스터-종류&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%A0%88%EC%A7%80%EC%8A%A4%ED%84%B0-%EC%A2%85%EB%A5%98&quot; aria-label=&quot;레지스터 종류 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;레지스터 종류&lt;/h3&gt;
&lt;p&gt;레지스터는 크게 일반 레지스터와 특수 레지스터로 구분된다. 일반 레지스터는 사용자 프로그램에 의해 변경되지만, 특수 레지스터는 사용자가 임의로 변경할 수 없다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;일반 레지스터&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;데이터 레지스터(DR)&lt;/strong&gt;: 메모리에서 가져온 데이터를 임시로 저장한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;주소 레지스터(AR)&lt;/strong&gt;: 데이터 또는 명령어가 저장된 메모리의 주소를 저장한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;특수 레지스터&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;프로그램 카운터(PC)&lt;/strong&gt;: 다음에 실행할 명령어의 주소를 기억하고 있다가 제어장치에 알려준다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;명령어 레지스터(IR)&lt;/strong&gt;: 현재 실행 중인 명령어를 저장한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;메모리 주소 레지스터(MAR)&lt;/strong&gt;: 메모리에서 데이터를 가져오거나 반대로 메모리로 데이터를 보낼 때 주소를 지정하는 데 사용된다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;메모리 버퍼 레지스터(MBR)&lt;/strong&gt;: 메모리에서 가져온 데이터나 메모리로 옮겨갈 데이터를 임시로 저장한다. 항상 메모리 주소 레지스터와 함께 동작한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;AR &amp;#x26; MAR&lt;/strong&gt;
둘 다 메모리 주소를 다루지만, AR은 CPU 내부 작업을 위한 주소 저장에 사용되며, MAR은 메모리 접근을 위한 주소를 관리한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DR &amp;#x26; MBR&lt;/strong&gt;
둘 다 데이터를 임시 저장하지만, DR은 CPU 연산 중 데이터를 저장하며, MBR은 메모리와 CPU 간 데이터 전송을 위한 버퍼 역할을 한다.&lt;/p&gt;
&lt;p&gt;그림을 통해 &lt;code class=&quot;language-text&quot;&gt;Load mem(100), register 2&lt;/code&gt;가 처리되는 과정을 살펴보자.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/790bb321c33deb0a23b3529985f11e0f/622c8/register-structure.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 79.41176470588235%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAABYlAAAWJQFJUiTwAAACD0lEQVR42o2UDW/TMBCG8/9/ymAMMWAfoqpggIBStpVOTEj9UNM0TT9IYydx4th58blKWKN19CIrkXN+fHfv2Q6MlY3nUMuzHIKlUFLVc47WGlmS7TiWZWnHPqs2nTAPrfEVrqM7/M5HkKWEk2uJTtTDj7iPruhjkE2gClWDnwJ2sz6O4rc4Zhd4Fp0h0swADbUjevjMu/iUfse9GGAxXyBJkv9GeJ3e4cXmHK9YC695G1wncB5bQGVYr9fwfR9KKTuKorDDlqOK0GR0HBHwnYUyHcMhp3W4hjZOqlTQpd4WPM/hui4YYwjDEJvNBlEUIcv+1ftG/MJzAzxhl3gTtxGXKRyuEpxF73E0PMXL+QU64S1m0xmGw6GFUKSe59k3AYUQNTDTOQK5wrIMMViOwbipYVEWmEofE+Fhks2wlH9sahRhEAR1hASjDWiOStIULeYx0jR9vIZkBCKHppFYq9Vqu6nIkfKteFQKCsIC/bm/m4r5Walc9eTD3iQYlaXr3eJq9Q09cY8O64FLIwo1Y5t/wYl7jtNlC1/ZDZbBYm8f1mCT9VhNcRl8QGv+EZ3sJxIt4Cijqlv4GAkXo9yFny9QyOLJI0dAyohvOFjIdvydfQuaRmlSKTjnteJVCz28A5xDLwdSmKIilWkQjIRrbu4cerPQYnsITHSkspTSzjXtYCAdP2ojag2C0Te9m8C/xSPVJmccl5YAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;register structure&apos; title=&apos;&apos; src=&apos;/static/790bb321c33deb0a23b3529985f11e0f/ca1dc/register-structure.png&apos; srcset=&apos;/static/790bb321c33deb0a23b3529985f11e0f/e7570/register-structure.png 170w,
/static/790bb321c33deb0a23b3529985f11e0f/f46e7/register-structure.png 340w,
/static/790bb321c33deb0a23b3529985f11e0f/ca1dc/register-structure.png 680w,
/static/790bb321c33deb0a23b3529985f11e0f/02d09/register-structure.png 1020w,
/static/790bb321c33deb0a23b3529985f11e0f/9d567/register-structure.png 1360w,
/static/790bb321c33deb0a23b3529985f11e0f/622c8/register-structure.png 1384w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;PC에는 실행할 코드의 행 번호가 저장된다. 이 코드는 제어장치(Control Unit)에서 실행된다. 실행된 코드는 IR에 저장된다.&lt;/li&gt;
&lt;li&gt;제어장치가 IR에 있는 명령어를 해석해 메모리 100에 있는 데이터를 가져오라는 신호를 보낸다.&lt;/li&gt;
&lt;li&gt;MAR에는 100이 저장된다. 메모리에 있는 데이터를 CPU로 옮기는 일은 메모리 컨트롤러가 담당한다. &lt;strong&gt;레지스터는 CPU가 관리하는 영역이기 때문에 메모리 컨트롤러는 숫자 2를 레지스터로 직접 옮기지 못한다.&lt;/strong&gt; 따라서 MBR로 보낸다.&lt;/li&gt;
&lt;li&gt;제어장치는 메모리 버퍼 레지스터에 저장된 값 2를 레지스터 2로 옮긴다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;버스의-종류&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B2%84%EC%8A%A4%EC%9D%98-%EC%A2%85%EB%A5%98&quot; aria-label=&quot;버스의 종류 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;버스의 종류&lt;/h3&gt;
&lt;p&gt;시스템 버스는 제어 버스, 주소 버스, 데이터 버스로 나뉜다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;제어 버스&lt;/strong&gt;: 제어 버스에는 다음에 어떤 작업을 할지 지시하는 제어 신호가 오고 간다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU, 메모리, 주변장치와 양방향으로 오고 간다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;주소 버스&lt;/strong&gt;: 메모리의 데이터를 읽거나 쓸 때 어느 위치에서 작업할 것인지를 알려주는 주소 정보가 오고 간다. 이 버스는 메모리 주소 레지스터와 연결되어 있으며 단방향이다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU에서 메모리나 주변장치로 나간다. 반면 주소 버스를 통해 CPU로 전달되는 정보는 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;데이터 버스&lt;/strong&gt;: 데이터가 목적지까지 이동할 수 있도록 한다. 이 버스는 메모리 버퍼 레지스터와 연결되어 있으며 양방향이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;버스의 &lt;strong&gt;대역폭은 한 번에 전달할 수 있는 데이터의 최대 크기&lt;/strong&gt;다. 이 버스의 대역폭은 CPU가 한 번에 처리할 수 있는 데이터의 크기와 같다. 흔히 32bit CPU, 64bit CPU라고 하는데 여기서 32bit, 64bit가 CPU가 한 번에 처리할 수 있는 데이터의 크기이며, 이는 버스의 대역폭, 레지스터의 크기와 같다.&lt;/p&gt;
&lt;h2 id=&quot;메모리&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%A9%94%EB%AA%A8%EB%A6%AC&quot; aria-label=&quot;메모리 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;메모리&lt;/h2&gt;
&lt;h3 id=&quot;종류&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A2%85%EB%A5%98&quot; aria-label=&quot;종류 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;종류&lt;/h3&gt;
&lt;p&gt;메모리는 읽거나 쓸 수 있는 RAM(Random Access Memory)과 읽기만 가능한 ROM(Read Only Memory)으로 구분된다.
&lt;strong&gt;RAM&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;휘발성&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DRAM&lt;/strong&gt;: 데이터가 일정 시간이 지나면 사라진다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SRAM&lt;/strong&gt;: 전력이 공급되는 동안 데이터를 저장할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SDRAM&lt;/strong&gt;: 펄스가 발생할 때마다 데이터를 저장한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;비휘발성&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;FRAM&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PRAM&lt;/strong&gt;
&lt;strong&gt;ROM&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PROM&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EPROM&lt;/strong&gt;
전력이 끊겨도 데이터를 보관할 수 있다. 하지만 읽기 전용이기 때문에 BIOS(Basic Input/Output System)를 ROM에 저장한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;보호&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B3%B4%ED%98%B8&quot; aria-label=&quot;보호 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;보호&lt;/h3&gt;
&lt;p&gt;운영체제 영역이나 다른 프로그램 영역으로 침범하려는 바이러스로부터 메모리를 보호하기 위해선 하드웨어의 도움이 필요하다.&lt;/p&gt;
&lt;p&gt;CPU는 현재 진행 중인 작업의 메모리 시작 주소를 경계 레지스터에 저장하고, 마지막 주소를 한계 레지스터에 저장한다. 작업이 진행되는 과정에서 두 주소 범위를 벗어나는지 점검해 보호한다.&lt;/p&gt;
&lt;p&gt;만약 주소 범위를 벗어난다면, &lt;strong&gt;인터럽트&lt;/strong&gt;가 발생한다.
이땐 운영체제가 해당 프로그램을 강제 종료시키게 된다.&lt;/p&gt;
&lt;h3 id=&quot;부팅&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B6%80%ED%8C%85&quot; aria-label=&quot;부팅 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;부팅&lt;/h3&gt;
&lt;p&gt;결국 운영체제도 CPU에 의해 실행되는 프로그램이다. 따라서 &lt;strong&gt;운영체제를 메모리에 올리는 과정&lt;/strong&gt;이 있어야 하고 이 과정을 부팅이라고 한다.&lt;/p&gt;
&lt;p&gt;사용자가 컴퓨터의 전원을 키면 ROM에 저장된 BIOS가 실행된다. &lt;strong&gt;BIOS는 하드웨어를 점검하고, 운영체제를 실행시키는 부트스트랩 코드를 실행&lt;/strong&gt;시킨다.&lt;/p&gt;
&lt;h2 id=&quot;컴퓨터-성능-향상-기술&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%BB%B4%ED%93%A8%ED%84%B0-%EC%84%B1%EB%8A%A5-%ED%96%A5%EC%83%81-%EA%B8%B0%EC%88%A0&quot; aria-label=&quot;컴퓨터 성능 향상 기술 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;컴퓨터 성능 향상 기술&lt;/h2&gt;
&lt;p&gt;현대 컴퓨터 구조의 가장 큰 문제는 CPU와 메모리, 주변장치의 작업 속도가 다르다는 것이다.
CPU는 내부 버스의 속도와 같다. 하지만 시스템 버스의 속도보다 빠르기 때문에 주변 장치의 속도가 따라가지 못한다.&lt;/p&gt;
&lt;p&gt;이를 해결하기 위해선 어떤 방법이 있을까?&lt;/p&gt;
&lt;h3 id=&quot;버퍼&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B2%84%ED%8D%BC&quot; aria-label=&quot;버퍼 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;버퍼&lt;/h3&gt;
&lt;p&gt;버퍼는 두 장치 사이의 속도 차이를 완화하는 역할을 한다.
일정량의 데이터를 모아 한꺼번에 전송하면 적은 작업량으로도 많은 양의 데이터를 옮길 수 있다.&lt;/p&gt;
&lt;h3 id=&quot;스풀&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%8A%A4%ED%92%80&quot; aria-label=&quot;스풀 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;스풀&lt;/h3&gt;
&lt;p&gt;버퍼와 유사한 용어로 스풀이 있다.
스풀은 CPU와 입출력장치가 독립적으로 동작하도록 고안된 소프트웨어적 버퍼이다.&lt;/p&gt;
&lt;p&gt;예를 들어 워드프로세서로 작업하고 프린터로 출력한다고 했을 때 스풀러가 없다면, 출력까지 워드프로세서가 알아서 처리해야 하므로 인쇄가 끝날 때까지 워드프로세서를 사용할 수 없게 되는 것이다.
-&gt; 인쇄 내용을 스풀러 공간에 저장하면 인쇄 동안에도 워드프로세서로 다른 작업을 할 수 있게 된다.&lt;/p&gt;
&lt;h3 id=&quot;캐시&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%BA%90%EC%8B%9C&quot; aria-label=&quot;캐시 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;캐시&lt;/h3&gt;
&lt;p&gt;캐시는 메모리와 CPU 간의 속도 차이를 완화하기 위해 메모리의 데이터를 미리 가져와 저장해 두는 임시 저장소라고 할 수 있다. 메모리는 시스템 버스의 속도로 작동하기 때문에 비교적 느리지만, 캐시는 CPU 내부 버스의 속도로 작동하기 때문에 빠르다.&lt;/p&gt;
&lt;p&gt;CPU는 메모리에 접근할 때 먼저 캐시를 방문한다. 원하는 데이터를 찾았을 때 캐시 히트라고 하며 그 데이터를 바로 사용한다. 하지만 원하는 데이터가 캐시에 없다면, 메모리로 가서 그 데이터를 찾아야 한다. 이를 캐시 미스라고 한다.&lt;/p&gt;
&lt;p&gt;컴퓨터의 성능을 향상하려면 캐시 적중률이 높아야 한다. &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;캐시의 크기를 늘린다.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;지역성 이론에 따라 데이터를 가져온다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;가까이 있는 데이터가 사용될 확률이 더 높다는 이론&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;만약 캐시에 있는 데이터가 변경되면, 이 변경 사항을 메모리에 반영해야 한다. 이때 두가지 방식이 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;즉시 쓰기&lt;/strong&gt;: 캐시의 변경 사항을 메모리에 즉시 반영한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;장점: 메모리와 캐시 사이 데이터 불일치가 발생하지 않음&lt;/li&gt;
&lt;li&gt;단점: 빈번한 데이터 전송으로 성능이 느려짐&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;지연 쓰기&lt;/strong&gt;: 캐시의 변경 사항을 모아서 주기적으로 반영한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;장점: 데이터 전송 횟수가 줄어 시스템 성능 향상&lt;/li&gt;
&lt;li&gt;단점: 메모리와 캐시 사이 데이터 불일치가 발생할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;저장장치의-계층-구조&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A0%80%EC%9E%A5%EC%9E%A5%EC%B9%98%EC%9D%98-%EA%B3%84%EC%B8%B5-%EA%B5%AC%EC%A1%B0&quot; aria-label=&quot;저장장치의 계층 구조 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;저장장치의 계층 구조&lt;/h3&gt;
&lt;p&gt;&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/94faab689cff6c5f77380353b8909adb/796eb/storage-structure.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 72.35294117647058%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAABUUlEQVR42n2TC4uDQAyE+///YEFQELVV8dn61naPbyVe9PQWVpvN7GQmpre+700URWaaJiPr+/3aNznHccz9fjdpmu4wGtd1ncmyzOZvPKqqMmfr8/lYIIRcWpblD0ZIX6+XGcdxJSzLcktosqZpLKHneeb9ftv4bFFoU0iAHQELMdU4AwQY+3VdX1p+Pp9mnudVoQCPKiFFveu6FgPplWXym2X8Hwk5p3JRFCYMQ0uGYs7+JUQmloZh2AEpQjvI8xtC4qNtFpjH47HvoajUhFQHjEqqs84mAkwcx79jc2UZi+SCIDBJktgvfezjqWWtDgCXZLdta8eGj0NMa/RMnhJSWSvDFm8uQwKQTSxnxzGjoCWUHrJJckErhljsahc6RpTv++sc8kCRNJ038vmnQKaVgkXAWd/5cLTnJhd1dQi5AIiRYud5bmPOpV+akBZQ+AfCZEUzCGK9LAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;storage structure&apos; title=&apos;&apos; src=&apos;/static/94faab689cff6c5f77380353b8909adb/ca1dc/storage-structure.png&apos; srcset=&apos;/static/94faab689cff6c5f77380353b8909adb/e7570/storage-structure.png 170w,
/static/94faab689cff6c5f77380353b8909adb/f46e7/storage-structure.png 340w,
/static/94faab689cff6c5f77380353b8909adb/ca1dc/storage-structure.png 680w,
/static/94faab689cff6c5f77380353b8909adb/02d09/storage-structure.png 1020w,
/static/94faab689cff6c5f77380353b8909adb/9d567/storage-structure.png 1360w,
/static/94faab689cff6c5f77380353b8909adb/796eb/storage-structure.png 1514w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
저장장치의 계층 구조는 사용자가 저렴한 가격으로 용량은 하드디스크처럼 사용하고 작업 속도는 레지스터처럼 빠르게 만들어준다. 하지만 중복되는 데이터의 일관성을 유지하는 것이 문제가 될 수 있다. &lt;/p&gt;
&lt;h3 id=&quot;인터럽트&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8&quot; aria-label=&quot;인터럽트 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;인터럽트&lt;/h3&gt;
&lt;p&gt;초기 컴퓨터는 주변장치가 많지 않았다. 따라서 CPU가 입출력장치에서 데이터를 가져오거나 보냈는데, 이렇게 CPU가 주변장치의 상태를 주기적으로 확인하며 처리하는 방식을 폴링(Polling) 방식이라고 한다.&lt;/p&gt;
&lt;p&gt;오늘날 주변장치가 많아지면서 CPU가 모든 입출력에 관여하면 작업 효율이 떨어진다. 이러한 문제를 해결하기 위해 등장한 것이 &lt;strong&gt;인터럽트 방식&lt;/strong&gt;이다.&lt;/p&gt;
&lt;p&gt;인터럽트 방식은 &lt;strong&gt;CPU의 작업과 저장장치의 데이터 이동을 독립적으로 운영&lt;/strong&gt;함으로써 시스템의 효율을 높인다. 즉 데이터의 입출력이 이루어지는 동안 CPU가 다른 작업을 할 수 있다.&lt;/p&gt;
&lt;p&gt;인터럽트 방식의 동작 과정을 살펴보자.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;CPU가 IO 컨트롤러에게 입출력 명령을 보낸다.&lt;/li&gt;
&lt;li&gt;IO 컨트롤러는 명령받은 데이터를 메모리에 가져다 놓거나 메모리에 있는 데이터를 저장장치로 옮긴다.&lt;/li&gt;
&lt;li&gt;데이터 전송이 완료되면 IO 컨트롤러는 CPU에게 완료 신호를 보낸다.&lt;/li&gt;
&lt;li&gt;CPU는 현재 작업을 중단하고, 데이터를 처리한다.
여기서 &lt;strong&gt;CPU에 전달되는 완료 신호를 인터럽트&lt;/strong&gt;라고 한다. 인터럽트가 전달되면, CPU는 하던 일을 중단하고 옮겨진 데이터를 처리한다. 이처럼 하던 작업을 중단하고 처리해야 하는 신호라는 의미에서 인터럽트라는 이름이 붙은 것이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;DMADirect-Memory-Access&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#DMADirect-Memory-Access&quot; aria-label=&quot;DMADirect Memory Access permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;DMA(Direct Memory Access)&lt;/h3&gt;
&lt;p&gt;인터럽트 방식으로 작업을 수행하기 위해선 IO 컨트롤러가 CPU의 허락 없이 메모리에 접근할 수 있는 권한이 필요하다. 이것을 직접 메모리 접근(DMA)라고 한다.&lt;/p&gt;
&lt;h3 id=&quot;MMIOMemory-Mapped-IO&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#MMIOMemory-Mapped-IO&quot; aria-label=&quot;MMIOMemory Mapped IO permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;MMIO(Memory Mapped I/O)&lt;/h3&gt;
&lt;p&gt;DMA 방식은  인터럽트 방식의 시스템을 구성하는 필수 요소다. 하지만 IO 컨트롤러가 메모리를 직접 사용하게 되면 메모리가 복잡해진다. 따라서 CPU가 사용하는 메모리 공간과 DMA를 통해 들어오고 나가는 데이터를 분리하는 것이 필요하다. 이렇게 메모리의 일정 공간을 입출력에 할당하는 기법을 MMIO라고 한다.&lt;/p&gt;
&lt;h3 id=&quot;사이클-훔치기&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%82%AC%EC%9D%B4%ED%81%B4-%ED%9B%94%EC%B9%98%EA%B8%B0&quot; aria-label=&quot;사이클 훔치기 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;사이클 훔치기&lt;/h3&gt;
&lt;p&gt;만약 CPU와 DMA가 동시에 메모리에 접근할 한다면 어떤 일이 발생할까? 이 경우엔 보통 CPU가 메모리 사용 권한을 양보한다. 그 이유는 CPU의 작업 속도가 더 빠르기 때문이다.
이렇게 DMA가 메모리에 접근하는 동안 CPU가 메모리를 사용하지 못하도록 잠시 대기하는 상황을 사이클 훔치기(Cycle Stealing)라고 한다.&lt;/p&gt;
&lt;h2 id=&quot;멀티-프로세싱&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%A9%80%ED%8B%B0-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8B%B1&quot; aria-label=&quot;멀티 프로세싱 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;멀티 프로세싱&lt;/h2&gt;
&lt;h3 id=&quot;단일-프로세서-시스템&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%8B%A8%EC%9D%BC-%ED%94%84%EB%A1%9C%EC%84%B8%EC%84%9C-%EC%8B%9C%EC%8A%A4%ED%85%9C&quot; aria-label=&quot;단일 프로세서 시스템 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;단일 프로세서 시스템&lt;/h3&gt;
&lt;p&gt;과거에는 컴퓨터 한 대에 프로세서(CPU)가 하나 있는 시스템이었다. 이를 단일 프로세서 시스템이라고 한다. 이런 시스템에서 성능을 향상하는 방법은 CPU의 클록을 높이거나 캐시의 크기를 늘리는 것이었다. 하지만 클록을 높이면 발열 문제가 생기고, 캐시의 크기를 늘리는 것은 비용적인 한계가 있다.&lt;/p&gt;
&lt;h3 id=&quot;멀티-프로세서-시스템&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%A9%80%ED%8B%B0-%ED%94%84%EB%A1%9C%EC%84%B8%EC%84%9C-%EC%8B%9C%EC%8A%A4%ED%85%9C&quot; aria-label=&quot;멀티 프로세서 시스템 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;멀티 프로세서 시스템&lt;/h3&gt;
&lt;p&gt;컴퓨터 성능을 높이기 위해 프로세서를 여러 개 설치하여 사용하는 시스템을 멀티 프로세서 시스템이라고 한다. 멀티 프로세서 시스템에선 프로세서마다 레지스터와 캐시를 가지며, 모든 프로세서가 시스템 버스를 통해 메인 메모리를 공유한다. &lt;/p&gt;
&lt;h3 id=&quot;멀티코어-시스템&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%A9%80%ED%8B%B0%EC%BD%94%EC%96%B4-%EC%8B%9C%EC%8A%A4%ED%85%9C&quot; aria-label=&quot;멀티코어 시스템 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;멀티코어 시스템&lt;/h3&gt;
&lt;p&gt;단일 프로세서 시스템을 멀티 프로세서 시스템으로 바꾸기 위해선 메인 보드의 설계 변경을 포함해 많은 변화가 필요하다. 그런데 기존 시스템을 유지한 채 멀티 프로세싱을 할 수 있게 하는 시스템이 있다. 바로 멀티코어 시스템이다. &lt;/p&gt;
&lt;p&gt;멀티코어 시스템은 하나의 칩에 CPU의 핵심이 되는 코어를 여러 개 만들어 여러 작업을 동시에 처리할 수 있게 한다.&lt;/p&gt;
&lt;h3 id=&quot;CPU-멀티스레드&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#CPU-%EB%A9%80%ED%8B%B0%EC%8A%A4%EB%A0%88%EB%93%9C&quot; aria-label=&quot;CPU 멀티스레드 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;CPU 멀티스레드&lt;/h3&gt;
&lt;p&gt;하나의 코어에서 2개 이상의 명령어를 처리하는 방법도 있다. 하나의 코어가 여러 개의 스레드를 이용하게 하는 것이다. 여기서 스레드란 CPU가 처리할 수 있는 작업의 단위를 말한다. 이렇게 여러 스레드를 동시에 처리하는 방법을 CPU 멀티스레드라고 한다.&lt;/p&gt;
&lt;h3 id=&quot;프로세서-vs-코어&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%94%84%EB%A1%9C%EC%84%B8%EC%84%9C-vs-%EC%BD%94%EC%96%B4&quot; aria-label=&quot;프로세서 vs 코어 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;프로세서 vs 코어&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;구분&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;프로세서(Processor)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;코어(Core)&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;개념&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;작업을 처리하는 CPU 전체 장치.&lt;/td&gt;
&lt;td&gt;프로세서 내부에서 작업을 처리하는 독립적인 명령어 처리 단위.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;구성&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;코어, 캐시, 메모리 컨트롤러, 버스 인터페이스 등으로 구성.&lt;/td&gt;
&lt;td&gt;명령어 처리 유닛(CU, ALU)로 구성.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;주요 역할&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;컴퓨터의 전체 작업 관리 및 처리.&lt;/td&gt;
&lt;td&gt;병렬 처리 및 작업 분산.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;병렬 처리 능력&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;코어 수에 따라 병렬 처리 능력이 결정.&lt;/td&gt;
&lt;td&gt;각 코어가 독립적으로 병렬 작업 수행.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;예시&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Intel Core i7 프로세서(다중 코어 포함).&lt;/td&gt;
&lt;td&gt;6코어, 8코어 등 단일 프로세서 내 여러 코어.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;각-시스템-비교&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B0%81-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EB%B9%84%EA%B5%90&quot; aria-label=&quot;각 시스템 비교 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;각 시스템 비교&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;개념&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;CPU/코어 수&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;예시 상황&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;단일 프로세서 시스템&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CPU 1개&lt;/td&gt;
&lt;td&gt;한 사람이 계산기를 하나 사용하여 계산&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;멀티 프로세서 시스템&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CPU 여러 개&lt;/td&gt;
&lt;td&gt;두 사람이 각각 계산기를 사용해 계산&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;멀티 코어 시스템&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;코어 여러 개&lt;/td&gt;
&lt;td&gt;한 사람이 손에 여러 계산기를 들고 계산&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;멀티 스레드&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;스레드 여러 개&lt;/td&gt;
&lt;td&gt;한 계산기에서 덧셈과 곱셈을 동시에 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</content:encoded></item><item><title><![CDATA[운영체제 개요]]></title><description><![CDATA[…]]></description><link>https://choiwonyu.github.io/운영체제 개요/</link><guid isPermaLink="false">https://choiwonyu.github.io/운영체제 개요/</guid><pubDate>Sat, 21 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;운영체제란&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EB%9E%80&quot; aria-label=&quot;운영체제란 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;운영체제란?&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;운영체제란 &lt;strong&gt;컴퓨터 자원을 효율적으로 관리하는 소프트웨어&lt;/strong&gt;를 말한다.
사용자나 응용 프로그램들은 운영체제를 통해서만 컴퓨터 자원에 접근할 수 있다. &lt;/p&gt;
&lt;h3 id=&quot;-역할&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%97%AD%ED%95%A0&quot; aria-label=&quot; 역할 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 역할&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;운영 체제의 주요 역할은 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅ 자원 관리&lt;/strong&gt;&lt;br&gt;
운영체제는 컴퓨터의 &lt;strong&gt;여러 자원들을 응용 프로그램에 나눠줌&lt;/strong&gt;으로써 사용자가 원활하게 작업할 수 있도록 돕는다. 만약 자원을 요청한 프로그램이 여러 개라면 적당한 순서로 자원을 배분하고 적절한 시점에 자원을 회수해 다른 응용 프로그램에 나눠준다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅ 자원 보호&lt;/strong&gt;&lt;br&gt;
운영체제는 악의적인 사용자나 미숙한 사용자로부터 자원을 보호하는 역할도 한다. 특정 응용 프로그램이 &lt;strong&gt;다른 응용 프로그램의 영역을 침범할 수 없도록 한다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅ 하드웨어 인터페이스 제공&lt;/strong&gt;&lt;br&gt;
운영체제는 CPU, 메모리, 키보드, 마우스와 같은 다양한 하드웨어를 일관된 방법으로 사용할 수 있는 인터페이스를 제공한다. 덕분에 어떤 회사에서 만든 하드웨어인지 신경 쓸 필요가 없다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅ 사용자 인터페이스 제공&lt;/strong&gt;&lt;br&gt;
운영체제는 사용자가 운영체제를 편리하게 사용할 수 있도록 사용자 인터페이스를 지원한다.&lt;br&gt;
ex) CLI, GUI&lt;/p&gt;
&lt;h2 id=&quot;운영체제의-구성&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EC%9D%98-%EA%B5%AC%EC%84%B1&quot; aria-label=&quot;운영체제의 구성 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;운영체제의 구성&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;-커널과-인터페이스&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%BB%A4%EB%84%90%EA%B3%BC-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4&quot; aria-label=&quot; 커널과 인터페이스 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 커널과 인터페이스&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;운영체제는 커널과 인터페이스로 구성되어 있다. 커널은 운영체제의 핵심 기능을 구현한 프로그램이고, 인터페이스는 사용자와 응용 프로그램에 인접해 커널에 명령을 전달하고 결과를 반환한다.&lt;/p&gt;
&lt;p&gt;운영체제 관점에서 본 컴퓨터 구조는 다음과 같다.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/6cdbef10b756b612182cdc10cfd8cf90/2d788/computer-architecture.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 68.23529411764706%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB6UlEQVR42o1TiXKjMBTr/39eNz3SLQUCIRwJdxIuo0pO6PTYza5n3mBjP1nS87vDP0aWZSjLEv877paJMQZN06CqKrRta79a73Y7RFFk/wm4rms7Px6PGMfx74Aah8PBAglgu90iYhRFgTzP4fu+/R+GoQVbr9fo+/42YEp5Zp7hOA5+v77CdV0UZNUSwOE84X6cJJahLhyGwebNzPkjYEs5ZZqiJStFQ7CSrIv9Hoc4RkXAnN+x6yzzaZp+MlzQA0pJXl5AYzCfz0RvYchGMRMQBFHM9FV7Ja2pGfJVFqgGHwwFmjEpe3vTAoag5nRCT+mKgf4ZAhl6Zpg8U8mezCXb8zxbuEW+BYz5Qwea9MJo4KGBHg6ee5nzop7sR85HgoAKYlpzU7KMr4IAvAqGCTPZTEwaaYWhX7Pkcm8iO2qES9ZLlb8UZVl4PLB7egKvvcjSO5MUMp1oh9bz+UTpBOx6rB4f0cnrK+CC81HljrelfGf+8zNCRsTYPDzAY/irFdz7e7irX/AIVKjyZN2pULfeod6ZhjogIHjOCob8pgTor10ha2oWyCHzgBbpocd8Sucr2x+d0vJwoyoSPGGBQiYFmw1SztVFBbtGyeqcpRUVX6r8uZ9PfC4KvS11hEI9vSRq77Nn3yW/AywMN0MV4DZIAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;computer architecture&apos; title=&apos;&apos; src=&apos;/static/6cdbef10b756b612182cdc10cfd8cf90/ca1dc/computer-architecture.png&apos; srcset=&apos;/static/6cdbef10b756b612182cdc10cfd8cf90/e7570/computer-architecture.png 170w,
/static/6cdbef10b756b612182cdc10cfd8cf90/f46e7/computer-architecture.png 340w,
/static/6cdbef10b756b612182cdc10cfd8cf90/ca1dc/computer-architecture.png 680w,
/static/6cdbef10b756b612182cdc10cfd8cf90/02d09/computer-architecture.png 1020w,
/static/6cdbef10b756b612182cdc10cfd8cf90/9d567/computer-architecture.png 1360w,
/static/6cdbef10b756b612182cdc10cfd8cf90/2d788/computer-architecture.png 1382w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
인터페이스를 통해 커널에 명령을 내리면 인터페이스가 그 결과를 전달해 주는 것이다.&lt;/p&gt;
&lt;p&gt;그림에서 볼 수 있듯 &lt;strong&gt;커널은 인터페이스와 분리&lt;/strong&gt;되어 있다. 따라서 같은 커널이라도 다른 인터페이스가 장착되면 사용자에겐는 다른 운영체제처럼 보인다. 대표적인 예시로 mac OS는 유닉스 계열 커널을 사용하면서도 직관적이고 미려한 GUI(인터페이스)를 사용해 많은 사람들이 이용하고 있다.&lt;/p&gt;
&lt;h3 id=&quot;-시스템-호출System-Call&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%8B%9C%EC%8A%A4%ED%85%9C-%ED%98%B8%EC%B6%9CSystem-Call&quot; aria-label=&quot; 시스템 호출System Call permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 시스템 호출(System Call)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;System Call은 커널과 응용 프로그램 간의 인터페이스다. 응용 프로그램은 System Call을 통해 하드웨어 자원이나 운영체제의 서비스를 요청할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅ 역할&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;운영체제와 응용 프로그램 간의 통신&lt;/strong&gt; : 사용자 프로그램은 직접 하드웨어에 접근할 수 없으므로, 커널을 통해 간접적으로 하드웨어 자원을 제어하거나 데이터를 처리한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;보안과 안정성 보장&lt;/strong&gt;: 시스템 호출은 커널 모드에서 실행되므로, 자원 접근을 제어하여 보안을 유지하고, 프로그램 간 간섭을 방지한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;운영체제 기능 제공&lt;/strong&gt;: 파일 읽기/쓰기, 프로세스 생성/종료, 메모리 할당 등과 같은 기능을 애플리케이션이 사용할 수 있도록 지원한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;✅ 주로 사용하는 System Call&lt;/strong&gt;&lt;br&gt;
🔹 &lt;strong&gt;프로세스 관리&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;fork(): 새로운 프로세스 생성&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;현재 실행 중인 프로세스를 복제해 자식 프로세스 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;exec(): 새로운 프로그램 실행&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;현재 프로세스를 새로운 프로그램으로 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;wait(): 자식 프로세스 종료 대기&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;부모 프로세스가 자식 프로세스가 종료될 때까지 대기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;_exit(): 프로세스 종료&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;프로세스를 강제 종료  &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🔹 &lt;strong&gt;파일 관리&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;open(): 파일 열기&lt;/li&gt;
&lt;li&gt;read(): 파일 읽기&lt;/li&gt;
&lt;li&gt;write(): 파일 쓰기&lt;/li&gt;
&lt;li&gt;close(): 파일 닫기  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🔹 &lt;strong&gt;네트워크 관리&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;socket(): 소켓 생성&lt;/li&gt;
&lt;li&gt;connect(): 서버에 연결  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;✅ 운영체제의 Dual Mode&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;🔹 &lt;strong&gt;사용자 모드&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;일반 애플리케이션 프로그램이 실행되는 모드&lt;/li&gt;
&lt;li&gt;운영체제의 핵심 기능이나 하드웨어에 직접 접근할 수 없음&lt;/li&gt;
&lt;li&gt;제한된 명령어만 실행 가능&lt;/li&gt;
&lt;li&gt;보호된 영역(메모리, 하드웨어 등)에 접근할 수 없음  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🔹 &lt;strong&gt;커널 모드&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;운영체제가 실행되는 모드 &lt;/li&gt;
&lt;li&gt;모든 하드웨어 자원(CPU, 메모리, 디스크 등)에 접근 가능&lt;/li&gt;
&lt;li&gt;모든 명령어 실행 가능&lt;/li&gt;
&lt;li&gt;프로세스 및 메모리 관리를 포함한 작업 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🔹 &lt;strong&gt;필요성&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;보안 강화&lt;/li&gt;
&lt;li&gt;안정성 유지&lt;/li&gt;
&lt;li&gt;자원 보호&lt;/li&gt;
&lt;li&gt;시스템 제어 및 효율적인 운영&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🔹 &lt;strong&gt;동작 과정&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;사용자가 실행한 일반 프로그램이 사용자 모드에서 실행&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;시스템 콜 또는 인터럽트 발생&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;사용자가 파일을 열거나 새로운 프로세스를 생성하는 등의 작업을 하면 운영체제의 서비스 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;커널 모드로 전환&lt;/li&gt;
&lt;li&gt;요청된 작업 수행 후 사용자 모드로 복귀  &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;응용 프로그램의 System Call 요청에 대한 흐름을 도식화하면 다음과 같다.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/5a078bf1764a2ede3011b79c8edcddfb/544f7/system-call.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 122.3529411764706%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAYCAYAAAD6S912AAAACXBIWXMAABYlAAAWJQFJUiTwAAACiUlEQVR42qWVWVMiQRCE+f+/xad9W8JQX0WQABRQQE45lENZzjk65Su3Ba+FWCui6aZ7Jjsr65iENhaGoe7v79XpdNRqtWzd7/c1GAxsZnA2Go30ak7fWYIfXphMJnLOKQgCLRYLrddrLZdLrVYruzCKIt3d3Slcz6U4kIvDDW4kRSu5YP4eEFa8GMexksmkjo+PVSgUlEqllE6n1W637eF6va5FL6ew9kvRqKRoUlVQ/62wkXxjbYC8MJ1ObQOmz8/Pxgq2fmDNZkvBemmsZAzjzbw2xu8Ywq7ZbJpO6MeADRd1u12ThPXj4+NWQ7ero3sPiOEurNCONRfMZjPTzmvo3PfB+AToH/bzycmJxuPxl2cHAXrX5/O5Mer1ehZt9tAVhodYYvdmtDo9PdXZ2ZkuLi5Mv3K5bJHmkoMBd0FhRVRhBQh6Mjj/kYb5fN7S57805EE0I20ajYYl+tHRkbLZrP33e5TiK3L8Oixd3M7/v4AEolqt2gZp41MEV31is769vbXzvQzRi7zzRtldXl4aw939TnegWScrN0grGpet/OI/bUW9lKJ+ZgtIAvt6xZ6envTw8GCVwZm3eqOp+agltwGLxxXF07biWU/RsKh4VN4C4sbNzY1phF50lUqlYinDwFU0vr6+3ps+b1FGN7SEEckMAO76dsZ4S24LgtvW8MegeECAeJEAZDIZnZ+f29pXjO86exkCRlpQKbgMMyTAdaoFtshRKpX2giZ8dZCDvjcSZSKMZoD4My792DC+BEQ7+h9Wq9UsZQgKe8wwxOiTvif+ExCGV1dXNuMi2qFhsVhULpezKKMh4Fx+UOmR3MPh0OqXSPNJ4CtHPvquTX7uq+dPzeGn9gKlwzvGmNO+rwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;system call&apos; title=&apos;&apos; src=&apos;/static/5a078bf1764a2ede3011b79c8edcddfb/ca1dc/system-call.png&apos; srcset=&apos;/static/5a078bf1764a2ede3011b79c8edcddfb/e7570/system-call.png 170w,
/static/5a078bf1764a2ede3011b79c8edcddfb/f46e7/system-call.png 340w,
/static/5a078bf1764a2ede3011b79c8edcddfb/ca1dc/system-call.png 680w,
/static/5a078bf1764a2ede3011b79c8edcddfb/544f7/system-call.png 684w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;커널&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%BB%A4%EB%84%90&quot; aria-label=&quot;커널 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;커널&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;-역할-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%97%AD%ED%95%A0-1&quot; aria-label=&quot; 역할 1 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 역할&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;✅ 프로세스 관리&lt;/strong&gt;: 다양한 종류의 프로세스에 CPU를 배분하고 작업할 수 있는 환경을 만들어준다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅ 메모리 관리&lt;/strong&gt;: 프로세스에 작업 공간을 배치하고 실제 메모리보다 큰 가상공간을 제공한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅ 파일 시스템 관리&lt;/strong&gt;: 데이터를 저장하고 접근할 수 있는 인터페이스를 제공한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅ 입출력 관리&lt;/strong&gt;: 필요한 입력과 출력 서비스를 제공한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅ 프로세스 간 통신 관리&lt;/strong&gt;: 공동 작업을 위한 각 프로세스 간 통신 환경을 지원한다.&lt;br&gt;
커널의 핵심 기능은 유기적으로 얽혀 있다. 기능들을 어떻게 구현했는가에 따라 종류가 구분된다.&lt;/p&gt;
&lt;h3 id=&quot;-종류&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-%EC%A2%85%EB%A5%98&quot; aria-label=&quot; 종류 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;📌 종류&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;✅ 단일형 구조 커널(Monolithic)&lt;/strong&gt;&lt;br&gt;
단일형 구조 커널은 초창기 운영체제의 구조로, 커널의 핵심 기능을 구현하는 모듈이 구분 없이 하나로 구성되어 있다.  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅ 계층형 구조 커널(layered)&lt;/strong&gt;&lt;br&gt;
계층형 구조 커널은 비슷한 기능을 가진 모듈을 묶어 하나의 계층으로 만들고 계층 간의 통신을 통해 운영체제를 구현하는 방식이다.  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅ 마이크로 구조 커널(Micro)&lt;/strong&gt;&lt;br&gt;
커널의 크기가 계속해서 커지고 필요한 하드웨어의 용량이 늘어남에 따라 커널 소스가 방대해졌다. 이러한 문제를 해결하기 위해 마이크로 구조 커널이 나오게 됐다.  &lt;/p&gt;
&lt;p&gt;마이크로 구조 커널의 운영체제는 프로세스 관리, 메모리 관리, 프로세스 간 통신 관리 등 가장 기본적인 기능만 제공한다. 그리고 많은 부분들이 사용자 영역에 구현되어 있다. 하지만 각 모듈이 독립적으로 동작하기 때문에 하나의 모듈이 실패하더라도 전체 운영체제에 영향을 주진 않는다. 또한 커널이 이식하기 쉽고 가벼워 CPU 용량이 작은 시스템에도 적용할 수 있다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[CS Study]]></title><description><![CDATA[배경 이전엔 CS가 단지 고리타분한 이론이라고 생각했다.
하지만 프로젝트를 진행하면서 의사결정의 타당한 근거를 위해 반드시 있어야 하는 기본기라는 것을 알게 되었다. CS…]]></description><link>https://choiwonyu.github.io/CS Study/</link><guid isPermaLink="false">https://choiwonyu.github.io/CS Study/</guid><pubDate>Fri, 20 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;배경&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B0%B0%EA%B2%BD&quot; aria-label=&quot;배경 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;배경&lt;/h2&gt;
&lt;p&gt;이전엔 CS가 단지 고리타분한 이론이라고 생각했다.
하지만 프로젝트를 진행하면서 &lt;strong&gt;의사결정의 타당한 근거를 위해 반드시 있어야 하는 기본기&lt;/strong&gt;라는 것을 알게 되었다.&lt;/p&gt;
&lt;p&gt;CS 지식이 부족했기 때문에 제시할 수 있는 솔루션의 근거가 빈약했고, 각 솔루션의 장단을 비교할 때도 어려움을 겪었다. 이와 같은 전문성 부족을 조금이라도 줄이고자 CS 공부를 꾸준히 하려고 한다.&lt;/p&gt;
&lt;p&gt;OS를 시작으로 Algorithm, DB, Network를 주변에서 추천받은 책과 여러 CS github repository를 참고해 기록하고, 비슷한 내용이 나올 때마다 복습과 업데이트를 반복하는 것이 목표다.&lt;/p&gt;
&lt;h2 id=&quot;OS&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#OS&quot; aria-label=&quot;OS permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;OS&lt;/h2&gt;
&lt;h3 id=&quot;참고한-서적&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%B0%B8%EA%B3%A0%ED%95%9C-%EC%84%9C%EC%A0%81&quot; aria-label=&quot;참고한 서적 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;참고한 서적&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://product.kyobobook.co.kr/detail/S000200716007&quot;&gt;https://product.kyobobook.co.kr/detail/S000200716007&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;참고한-레포&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%B0%B8%EA%B3%A0%ED%95%9C-%EB%A0%88%ED%8F%AC&quot; aria-label=&quot;참고한 레포 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;참고한 레포&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Seogeurim/CS-study&quot;&gt;https://github.com/Seogeurim/CS-study&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/VSFe/Tech-Interview&quot;&gt;https://github.com/VSFe/Tech-Interview&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Elastic Beanstalk에 애플리케이션 배포, 자동화(CD)]]></title><description><![CDATA[이전 기록에서 ECR에 Spring Boot application 이미지 push를 자동화하는 것까지 진행했다.
이젠 이미지를 Elastic Beanstalk에 반영하는 작업을 자동화할 차례다. 먼저 Elastic Beanstalk…]]></description><link>https://choiwonyu.github.io/Elastic Beanstalk에 애플리케이션 배포, 자동화(CD)/</link><guid isPermaLink="false">https://choiwonyu.github.io/Elastic Beanstalk에 애플리케이션 배포, 자동화(CD)/</guid><pubDate>Tue, 17 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;이전 기록에서 ECR에 Spring Boot application 이미지 push를 자동화하는 것까지 진행했다.
이젠 이미지를 Elastic Beanstalk에 반영하는 작업을 자동화할 차례다.&lt;/p&gt;
&lt;p&gt;먼저 Elastic Beanstalk를 실행해보자.
Elastic Beanstalk는 AWS 콘솔에서 간단한 설정만으로 이전에 봤던 아래 모든 인프라 아키텍처를 구성할 수 있다.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/1b89ca8bd52a8476fc04d7b4a10c5224/526f1/architecture.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 66.47058823529413%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAACFklEQVR42oWTO28TQRDH8xFoKPgIfAFEiYREQYVoEIKOAgFFiJBAPIpghSY1KAVFOkLBq04RGgQI2QFHspMo4PMzXHy5O9v38L5u/+ze3gMh2aw0mtu9md/M7Mwu4N8lOJJRBzKy1SYxIkX2M9vPWQvFl0wglYqsbQxWTiPYuAg+qYEHTaV3jIxrSKa93AFSSnAhwTjAVEy1LYGcM6hzhFYdradn4L26rgwpGJtmEmeaKluROuv1Yt3G0jMbj56HaB1KA9SRGGMGTBLUt/ZxdODPLEvbal4QTHBzsY47Dy1cvWdje5cZYJIkoNQArcYE9y/8wMayU5SWlyeztDjn6PV6aLct3F2q4dKVKi7f2MfO7rQEsgw4aMeo3Grg3VqZYQ7SOo5jdLtd9Pv99Gxvb4wvX11Uv08QRqIE8qxkGbmwN1dBmq8ziOkqIVP4vo/hcAjHcSCEmN1lkyFJD6KDb7AWT2D88jy4SoyqBjjHLlw/wPDYg+d5KUyXbXxlIUWX/86Qe7/xc/0BrPcroG4Hh+0maDjCqN+Af9RRY2JgOXBmhoWBKpEq1ap+ROfxKXhvr2GwuYbuk5MgnyrpaAk1YkL8B5iPjQbqWwusBn5VzsF/cxvO5w+wls8i2FqFvjlGaeoz96XoDPXdpDOpMqCEgKg5o1GQAkgwAolDNV60DD736elSFFAba0kdVRCq3lX5zWZ2Nwf+AT1e1tEh14z4AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;architecture&apos; title=&apos;&apos; src=&apos;/static/1b89ca8bd52a8476fc04d7b4a10c5224/ca1dc/architecture.png&apos; srcset=&apos;/static/1b89ca8bd52a8476fc04d7b4a10c5224/e7570/architecture.png 170w,
/static/1b89ca8bd52a8476fc04d7b4a10c5224/f46e7/architecture.png 340w,
/static/1b89ca8bd52a8476fc04d7b4a10c5224/ca1dc/architecture.png 680w,
/static/1b89ca8bd52a8476fc04d7b4a10c5224/02d09/architecture.png 1020w,
/static/1b89ca8bd52a8476fc04d7b4a10c5224/9d567/architecture.png 1360w,
/static/1b89ca8bd52a8476fc04d7b4a10c5224/526f1/architecture.png 1702w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Docker 이미지를 활용할 것이기 때문에 Elastic Beanstalk 플랫폼은 Docker를 선택한다.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/670cf724c7a2ccd7b0c6caccd0084a75/fe70a/platform.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 54.70588235294118%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAABT0lEQVR42o2R6U7CUBCF+w4KpV5KC13pTlsWsaloXDAxUX/5/k9yvDPcRoJW/PFlFui5M2e0+nqHl7dPjPwKl2MPA9P/wXASqDxQ+L1o+fYRu/0H/HzDjQvhsvAxXW8gnAM9D7PgOGtRN89o7vZIyhtYfg4rKDjaMhJuVMH0C+jzNYx4i1Gw7BXVBvJ1y8swm5fwkiXscIGJrE03xUSKmjIncdPNILyC0adx/4RuUsOJK/ZpZM8ZQ0XGCqFLDO6HXNN/f4MF07rBun3ij69m8YFp9J13ddc7/Y2RPdogKKWHcjValVYcqoueQlP9CzuCVqxucb9/x2Kz4wM48gDk51R6SVAtugn/YpZAOBk0Mp6uS14G2UqxRiih3E9X58WUDUKureXLFu3DK09iKB9PL6erw5yD7qAJJ+EpaMq0ahDLSD1BLxLHeS8RTzcOS3wBHZk3+YyTda0AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;platform&apos; title=&apos;&apos; src=&apos;/static/670cf724c7a2ccd7b0c6caccd0084a75/ca1dc/platform.png&apos; srcset=&apos;/static/670cf724c7a2ccd7b0c6caccd0084a75/e7570/platform.png 170w,
/static/670cf724c7a2ccd7b0c6caccd0084a75/f46e7/platform.png 340w,
/static/670cf724c7a2ccd7b0c6caccd0084a75/ca1dc/platform.png 680w,
/static/670cf724c7a2ccd7b0c6caccd0084a75/02d09/platform.png 1020w,
/static/670cf724c7a2ccd7b0c6caccd0084a75/fe70a/platform.png 1122w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
다른 환경 구성은 본인에 프로젝트에 맞게 설정한 후 환경을 생성하면, 샘플 앱이 정상적으로 실행되는 것을 확인할 수 있다.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/af14d99add3f7aed619bffd22e89bbf1/a12f4/sample-app.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 40.588235294117645%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABYlAAAWJQFJUiTwAAABQ0lEQVR42oWSy07CQBSGeQwvcYGAcSHqwoWXhTvjQ3hJfAOiceUruHFjDOlCWugMl07bSEIriCQqJvgk0FqID/B7WiqpUOPiy8lMcr45l0mkrAH+I2P1sWB7ODfeYOk1CMOE0DQwxsA4D+AhiWji8h+kSTgfChuGQJ4buFMFbotVSGoFMiv/Fv4kZuwBVmy/opDwvErCJRJemF3Ypg6mP0DhVSgqhxpXoZ/kx4OXTxz1hgHHxNnHCCcUT3seDrtfuKq/wyKhVDEhcT0QljmbyCbC7KODzaaDjZaDrScH+x0X220XO8Tes4vdNt13RrikCjVNQBF1yFWSliooRWQzLScb41bXSO6TJdb9h5rURWuInHhFvsBxXdBwI9dwT/NjccK4xSQjj6QafcxZXiA0WJHmNl5CeUoWK5wmHX6bRXtWGMc3ShvNs/8N1FcAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;sample app&apos; title=&apos;&apos; src=&apos;/static/af14d99add3f7aed619bffd22e89bbf1/ca1dc/sample-app.png&apos; srcset=&apos;/static/af14d99add3f7aed619bffd22e89bbf1/e7570/sample-app.png 170w,
/static/af14d99add3f7aed619bffd22e89bbf1/f46e7/sample-app.png 340w,
/static/af14d99add3f7aed619bffd22e89bbf1/ca1dc/sample-app.png 680w,
/static/af14d99add3f7aed619bffd22e89bbf1/02d09/sample-app.png 1020w,
/static/af14d99add3f7aed619bffd22e89bbf1/9d567/sample-app.png 1360w,
/static/af14d99add3f7aed619bffd22e89bbf1/a12f4/sample-app.png 2194w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;이슈&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9D%B4%EC%8A%88&quot; aria-label=&quot;이슈 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;이슈&lt;/h2&gt;
&lt;p&gt;환경이 생성될 때 겪은 이슈들은 다음과 같다.&lt;/p&gt;
&lt;h3 id=&quot;vpc-지정&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#vpc-%EC%A7%80%EC%A0%95&quot; aria-label=&quot;vpc 지정 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;vpc 지정&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Auto Scaling activity failed XX minutes ago with error: The parameter SecurityGroup is not recognized. Launching EC2 instance failed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Auto Scaling 그룹이 인스턴스를 생성하는 과정에서 보안 그룹을 제대로 식별하지 못하는 문제가 발생했다.
&lt;a href=&quot;https://stackoverflow.com/questions/77394170/elastic-beanstalk-auto-scaling-activity-failed-with-error-the-parameter-securi&quot;&gt;Stack Overflow&lt;/a&gt;를 참고해 &lt;strong&gt;VPC를 명시적으로 선택&lt;/strong&gt;하여 문제를 바로 해결할 수 있었다.
AWS의 &lt;a href=&quot;https://docs.aws.amazon.com/autoscaling/ec2/userguide/ts-as-instancelaunchfailure.html&quot;&gt;Troubleshoot EC2 Auto Scailing&lt;/a&gt; 에도 위 오류가 없어서 정확한 이유는 아직 확인하지 못했다.&lt;/p&gt;
&lt;h3 id=&quot;public-ip&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#public-ip&quot; aria-label=&quot;public ip permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;public ip&lt;/h3&gt;
&lt;p&gt;EC2 인스턴스를 public subnet에 생성하고, &lt;strong&gt;public ip를 허용&lt;/strong&gt;해줘야 인스턴스가 Elastic Beanstalk과 연결될 수 있다.&lt;/p&gt;
&lt;h3 id=&quot;EC2-권한&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#EC2-%EA%B6%8C%ED%95%9C&quot; aria-label=&quot;EC2 권한 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;EC2 권한&lt;/h3&gt;
&lt;p&gt;EC2가 &lt;strong&gt;ECR의 이미지를 pull&lt;/strong&gt;할 수 있어야 하기 때문에 EC2의 role에 &lt;code class=&quot;language-text&quot;&gt;AmazonEC2ContainerRegistryReadOnly&lt;/code&gt; 권한을 줘야 했다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;RDS-연결&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#RDS-%EC%97%B0%EA%B2%B0&quot; aria-label=&quot;RDS 연결 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;RDS 연결&lt;/h2&gt;
&lt;p&gt;Elastic Beanstalk에서 RDS를 같은 VPC 내에 생성해주는 것은 맞지만, Spring Boot Application이 RDS와 연결되기 위해선 추가로 해줘야 하는 것들이 있다.&lt;/p&gt;
&lt;h3 id=&quot;환경-변수&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%99%98%EA%B2%BD-%EB%B3%80%EC%88%98&quot; aria-label=&quot;환경 변수 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;환경 변수&lt;/h3&gt;
&lt;p&gt;애플리케이션이 처음 실행될 때 데이터베이스 연결 정보를 설정해야 하므로 Elastic Beanstalk 환경의 구성(Configuration) 탭에서 &lt;strong&gt;환경 변수(Environment Variables)&lt;/strong&gt;를 지정해야 한다. 생성된 RDS 정보를 기반으로 적절한 값을 입력한다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;jdbc:mysql://[RDS 엔드포인트]:[포트]/[데이터베이스명]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;DB_URL은 위와 같은 형식으로 작성하면 되고, USERNAME과 PASSWORD는 Elastic Beanstalk 환경을 생성할 때 지정한 값을 작성하면 된다.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/b95107053d5945259558afb0d85fa44b/f0faf/env.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 51.17647058823529%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAtklEQVR42q2SzQ6CMBCE+w7+YUBQhEKRP1EkKCoHE33/Fxp3e+Bu62GyzSb9OrNd0T/f6McPQtVg5kZYbKSx5l4MsfQTePtcN/hsKidI4UUFxHqXwZfV5I5f+RXG95gTZg3EisjZ8YriNOiqSEZxSWxKA+O8RVp1ujpbZTVHDZRlh0NzQ0KVI1sDGcRxj92ImmTvkKIy1KXf/ktknp0sL7phu4vCCRRU3aNsH2iHF4rzfVoFE+AXkogTNuxRZfUAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;env&apos; title=&apos;&apos; src=&apos;/static/b95107053d5945259558afb0d85fa44b/ca1dc/env.png&apos; srcset=&apos;/static/b95107053d5945259558afb0d85fa44b/e7570/env.png 170w,
/static/b95107053d5945259558afb0d85fa44b/f46e7/env.png 340w,
/static/b95107053d5945259558afb0d85fa44b/ca1dc/env.png 680w,
/static/b95107053d5945259558afb0d85fa44b/02d09/env.png 1020w,
/static/b95107053d5945259558afb0d85fa44b/9d567/env.png 1360w,
/static/b95107053d5945259558afb0d85fa44b/f0faf/env.png 1644w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;rds-연결-확인&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#rds-%EC%97%B0%EA%B2%B0-%ED%99%95%EC%9D%B8&quot; aria-label=&quot;rds 연결 확인 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;rds 연결 확인&lt;/h3&gt;
&lt;p&gt;EC2 인스턴스에 SSH로 접속한 뒤, RDS에 정상적으로 연결되는지 확인한다.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/abbf900364aa2578b7c0669800556ea1/5f301/db-connection.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 15.294117647058824%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAkklEQVR42nWOSw6CMAAFuQ4gtPRDC9G40BQQaECNqERZeP8zPLGJrmQxeZnN5Hlim0IZBblT0EWGvM5BJIMfxAhW5Icfxo6vhxH9i5eIFHqzhsg0uJ7DeQYmFWLKQZkESYTbD1xq5xFhy8HyYPGcXjieBhRVi8sw4jZO2JsKtjvDlDXqtkNje1zvj9kbJDxdfPkGtEVi9sqWyZ4AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;db connection&apos; title=&apos;&apos; src=&apos;/static/abbf900364aa2578b7c0669800556ea1/ca1dc/db-connection.png&apos; srcset=&apos;/static/abbf900364aa2578b7c0669800556ea1/e7570/db-connection.png 170w,
/static/abbf900364aa2578b7c0669800556ea1/f46e7/db-connection.png 340w,
/static/abbf900364aa2578b7c0669800556ea1/ca1dc/db-connection.png 680w,
/static/abbf900364aa2578b7c0669800556ea1/02d09/db-connection.png 1020w,
/static/abbf900364aa2578b7c0669800556ea1/5f301/db-connection.png 1146w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;데이터-삽입&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%82%BD%EC%9E%85&quot; aria-label=&quot;데이터 삽입 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;데이터 삽입&lt;/h3&gt;
&lt;p&gt;필요한 DB와 테이블을 생성해주고, 데이터를 추가한다.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/f1381e48bf00443f29cc09717efec43b/e584c/db.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 13.529411764705882%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAqUlEQVR42m3MSwuCQBQFYH+K5isdH4mGg69mJsWyMILoQRDt3Pf/4eTYpqDFt7nnnqOsRANRt2C8hhdEIP7iL5lJrheCBDHykiOlGaI4RVYwFBWfciVMCtBqi92+x5LmP+VvtkOgGxZm+odpzWHZ7vQfJxQu8aFpOhS2Hsf6E87XB273Jw7HC5jYgI93SdQdStaMRTkawLDIRDfdcdRBSDtE7QtqOkClA96VqWGNRV/2hAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;db&apos; title=&apos;&apos; src=&apos;/static/f1381e48bf00443f29cc09717efec43b/ca1dc/db.png&apos; srcset=&apos;/static/f1381e48bf00443f29cc09717efec43b/e7570/db.png 170w,
/static/f1381e48bf00443f29cc09717efec43b/f46e7/db.png 340w,
/static/f1381e48bf00443f29cc09717efec43b/ca1dc/db.png 680w,
/static/f1381e48bf00443f29cc09717efec43b/02d09/db.png 1020w,
/static/f1381e48bf00443f29cc09717efec43b/9d567/db.png 1360w,
/static/f1381e48bf00443f29cc09717efec43b/e584c/db.png 2070w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;배포-자동화&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B0%B0%ED%8F%AC-%EC%9E%90%EB%8F%99%ED%99%94&quot; aria-label=&quot;배포 자동화 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;배포 자동화&lt;/h2&gt;
&lt;h3 id=&quot;Github-Actions-스크립트-추가&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Github-Actions-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%B6%94%EA%B0%80&quot; aria-label=&quot;Github Actions 스크립트 추가 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;Github Actions 스크립트 추가&lt;/h3&gt;
&lt;p&gt;이제 기존 github actions 스크립트에 docker &lt;strong&gt;이미지를 실행 중인 Elastic Beanstalk에 반영하는 스크립트를 추가&lt;/strong&gt;해보자.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;workflow&quot;&gt;&lt;pre class=&quot;language-workflow&quot;&gt;&lt;code class=&quot;language-workflow&quot;&gt;name: CI/CD  
  
on:  
  push:  
    branches:  
      - master  
  
env:  
  ECR_REGISTRY: ${{ secrets.AWS_ECR_REGISTRY }}  
  ECR_REPOSITORY: ${{ secrets.AWS_PROD_ECR_REPOSITORY }}  
  IMAGE_TAG: ${{ github.sha }}-${{ github.run_number }}  
jobs:  
  build-and-push:  
    runs-on: ubuntu-latest  
  
    steps:  
      - name: Checkout repository  
        uses: actions/checkout@v3  
  
      - name: Configure AWS CLI  
        uses: aws-actions/configure-aws-credentials@v2  
        with:  
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}  
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}  
          aws-region: ap-northeast-2  
  
      - name: Log in to Amazon ECR  
        id: login-ecr  
        uses: aws-actions/amazon-ecr-login@v1  
  
      - name: Build and Push Docker Image  
        run: |  
          docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .  
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG  
  
      - name: Get current time  
        uses: 1466587594/get-current-time@v2  
        id: current-time  
        with:  
          format: YYYYMMDD_HH-mm-ss  
          utcOffset: &amp;quot;+09:00&amp;quot;  
  
      - name: Update Dockerrun.aws.json  
        run: |  
          sed -i &amp;quot;s|{{ECR_REGISTRY}}|${{ env.ECR_REGISTRY }}|g&amp;quot; environment/prod/Dockerrun.aws.json  
          sed -i &amp;quot;s|{{ECR_REPOSITORY}}|${{ env.ECR_REPOSITORY }}|g&amp;quot; environment/prod/Dockerrun.aws.json  
          sed -i &amp;quot;s|{{IMAGE_TAG}}|${{ env.IMAGE_TAG }}|g&amp;quot; environment/prod/Dockerrun.aws.json  
  
      - name: Beanstalk Deploy  
        uses: einaregilsson/beanstalk-deploy@v22  
        with:  
          aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }}  
          aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}  
          application_name: test-prod-app  
          environment_name: Test-prod-app-env  
          version_label: test-prod-${{steps.current-time.outputs.formattedTime}}  
          region: ap-northeast-2  
          deployment_package: environment/prod/Dockerrun.aws.json&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Elastic Beanstalk 배포에 필요한 Dockerrun.aws.json 파일은 environment 디렉토리에 환경 별로 작성했다. &lt;/p&gt;
&lt;h3 id=&quot;소스-코드-push&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%86%8C%EC%8A%A4-%EC%BD%94%EB%93%9C-push&quot; aria-label=&quot;소스 코드 push permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;소스 코드 push&lt;/h3&gt;
&lt;p&gt;이제 변경된 소스 코드를 push하면, Elastic Beanstalk에 자동으로 반영된다.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 578px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/13692002e543e0a0423c0b43754f2831/8c7b4/app.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 85.29411764705883%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAABYlAAAWJQFJUiTwAAAB7ElEQVR42q2UuYtyUQzFX+u477viiloo7tooCBYWKigo2FhY2ggWKvi/5+MXiLyB4WtmivDuvTnJTc7Jfc5wOJRgMCixWEwikcivzVkul+Lz+TTpnyTM5XISDoel3+9LIpHQw2g0+jH33oLcfjdGE4ZCId1st1tJpVJabSAQ0Ir9fr+uMdYEgLdzsOwNy9oxULFYVB673a40m03J5/NSrValUChIq9XSDugEHJhSqSSdTkey2ayUy2UZDAbqc6wNbqPSer0ux+NRHo+HPJ9Peb/fstlsNICLksmk9Ho92e/3crvd5HK5yG63k9FoJOl0WhxujcfjCqZ0r9erQY1GQ2+mSoB0QTVGARXSRaVSURzFEP+pcL1eS7vd1rbdPGHsjRoj386NbxNGE5KEeaQVqv1JyZ9UN3PPsGMAVOYLl9DgHhOrhDU+d9W25/tJiBMl4a5Wq+n40DIgvnAHl7SWyWRUODBGAXtmGPyHQwJx0vbpdJLr9Sr3+10NlefzuQaSfLFYyOFwkPP5LK/XS/n/lhDemDfWqEw1BE2nU5nNZprIZtBEYAomk4mMx2NNxpmKYlzAIeNBIM6vry/lkwtMRWvRRgQ/9u0tw4m1ilomyP/eq1tpYtznzmq1Eo/HozeaUr/62/CkKPuv/of/AE5ivsupzbG1AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;app&apos; title=&apos;&apos; src=&apos;/static/13692002e543e0a0423c0b43754f2831/8c7b4/app.png&apos; srcset=&apos;/static/13692002e543e0a0423c0b43754f2831/e7570/app.png 170w,
/static/13692002e543e0a0423c0b43754f2831/f46e7/app.png 340w,
/static/13692002e543e0a0423c0b43754f2831/8c7b4/app.png 578w&apos; sizes=&apos;(max-width: 578px) 100vw, 578px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
샘플 앱에서 Spring Boot 애플리케이션이 정상적으로 배포된 것을 확인할 수 있다.&lt;/p&gt;
&lt;h3 id=&quot;소스-코드-변경&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%86%8C%EC%8A%A4-%EC%BD%94%EB%93%9C-%EB%B3%80%EA%B2%BD&quot; aria-label=&quot;소스 코드 변경 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;소스 코드 변경&lt;/h3&gt;
&lt;p&gt;dto를 변경해보자.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// MemberDto.java&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;record&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MemberDto&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Long&lt;/span&gt; id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
  
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MemberDto&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;toDto&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Member&lt;/span&gt; member&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MemberDto&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;member&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; member&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;  
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 580px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/4112b255a6f7b2997fa36421f57efabd/12f38/changed-app.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 101.17647058823529%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAABYlAAAWJQFJUiTwAAACR0lEQVR42q2USWtiURCF3zqOcUKNA05xntGIggiSRUAiRkNCwGxduAgujPjrq/kKyjYS6EB6cXl1h3eq6pxzrzMajSQQCEgwGNTvb4czmUzk+vpavF7v/wEMh8MKOB6PJRqNaky1Ns4P/6QLh0N+v18eHh4kHo+Lx+MRn88nbrdbBzFJGMT/AlVADlMdwHd3d9LtdqXf78tsNpNWqyWRSERSqZQ0m01xuVxCV5cdWOzYglUBcK/Xk91uJ8PhUMrlsiSTSYnFYrJarXR+dXWl1QIO98TW2QkwFArpQrvdViCqqVarCkCCwWCgVVYqFe2CL2vZbFaKxaLGuVzuL6CpnE6n5fn5WT4+PuRwOMjxeJTlcimlUklqtZqeazQa8vLyItvtVtbrtby+vuoa3Z0A4YqWEQI+EomEtskw4YxnOkFAuOR7c3NzEk1FIUBlWqF12+RnYkvK3ASwPUtg644FgNXrdQW0NeLvlLwc5+snHz4+Pqo9UM6qMxXNBT/2IT/n83mtCGULhYJyiLqoCBg8cQaOzyu/9ONJFKvq9vZWuN+fn5+yWCzU4ICTBDUBthtkleNB49c554FNbIP3Op2OUoCSVIYLWMenWIhznGefOW5g7li5ZGDw4/v7u2w2G60SL+I1KsXAnJ1Op/L29qZn9vu9zOfz08PiGAdkhBuEgDdUp0ruNTeEZJlMRltFKG4F+xjabpnaxnz09PSkXJma3FfATXXj2egBlD34/PI4kBUQ8+Dle/jdu3iu7uWec39//0Wl377YfwAX3xRLxKvzkwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;changed app&apos; title=&apos;&apos; src=&apos;/static/4112b255a6f7b2997fa36421f57efabd/12f38/changed-app.png&apos; srcset=&apos;/static/4112b255a6f7b2997fa36421f57efabd/e7570/changed-app.png 170w,
/static/4112b255a6f7b2997fa36421f57efabd/f46e7/changed-app.png 340w,
/static/4112b255a6f7b2997fa36421f57efabd/12f38/changed-app.png 580w&apos; sizes=&apos;(max-width: 580px) 100vw, 580px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
구축한 파이프라인에 의해 변경 사항이 정상적으로 반영된 것을 확인할 수 있다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[소프트웨어마에스트로(SWM) 회고]]></title><description><![CDATA[4월부터 11월까지 소프트웨어마에스트로(이하 SWM) 활동이 끝났다.
늦었지만 기억과 각오가 더 휘발되기 전에…]]></description><link>https://choiwonyu.github.io/소프트웨어마에스트로(SWM) 회고/</link><guid isPermaLink="false">https://choiwonyu.github.io/소프트웨어마에스트로(SWM) 회고/</guid><pubDate>Thu, 12 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/4d1b923d536a8ac89bcf4d3cfe3d312d/cf70d/swm.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 50%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAjklEQVR42s2SsQ6CMBCGeUAW3woeAB9DmNxcYSYkOsik8gL02qMF+W1hYcKQEuPwJU0u+dIvd4GUEnsS/FxI5CAImt9eQrIYlhgM460VevYQCvur0YqS4oUwq3FI7zjmDwyap9lmocs0ncKpeiI+l4guV2S3BprVavrX5J4FRk0TXslLqVtIaxF/eTZbhR8ZlAAsz59YbwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;swm&apos; title=&apos;&apos; src=&apos;/static/4d1b923d536a8ac89bcf4d3cfe3d312d/ca1dc/swm.png&apos; srcset=&apos;/static/4d1b923d536a8ac89bcf4d3cfe3d312d/e7570/swm.png 170w,
/static/4d1b923d536a8ac89bcf4d3cfe3d312d/f46e7/swm.png 340w,
/static/4d1b923d536a8ac89bcf4d3cfe3d312d/ca1dc/swm.png 680w,
/static/4d1b923d536a8ac89bcf4d3cfe3d312d/02d09/swm.png 1020w,
/static/4d1b923d536a8ac89bcf4d3cfe3d312d/9d567/swm.png 1360w,
/static/4d1b923d536a8ac89bcf4d3cfe3d312d/cf70d/swm.png 6912w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
4월부터 11월까지 소프트웨어마에스트로(이하 SWM) 활동이 끝났다.
늦었지만 기억과 각오가 더 휘발되기 전에 8개월 간 경험한 것들을 기록으로 남기려고 한다.&lt;/p&gt;
&lt;p&gt;내가 경험한 모든 것들은 &lt;strong&gt;문제 해결 능력&lt;/strong&gt;에서 시작하고 끝난다.
다양한 측면에서 내가 경험한 것들을 추상화하고 구조화하면 문제 해결 능력으로 귀결된다.&lt;/p&gt;
&lt;p&gt;이번 SWM 기간 동안 문제를 정확히 인식하고, 해당 문제 상황에 대한 솔루션을 찾아서 논리적인 근거와 개인 혹은 팀의 핵심 가치에 기반한 최적의 결정을 할 수 있는 능력이 가장 중요하다는 것을 체감했다.&lt;/p&gt;
&lt;p&gt;내가 경험한 것들은 크게 서비스, 개발, 협업 측면으로 나눌 수 있다.&lt;/p&gt;
&lt;h2 id=&quot;서비스&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%84%9C%EB%B9%84%EC%8A%A4&quot; aria-label=&quot;서비스 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;서비스&lt;/h2&gt;
&lt;p&gt;내가 경험한 SWM 활동은 서비스의 0 to 1 과정이었다. &lt;/p&gt;
&lt;h3 id=&quot;서비스-시작&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%8B%9C%EC%9E%91&quot; aria-label=&quot;서비스 시작 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;서비스 시작&lt;/h3&gt;
&lt;p&gt;먼저 인스타그램과 노코드 툴을 활용해 최소한의 비용으로 우리가 생각한 pain point와 솔루션이 실제 사용자들에게 유효한지 확인했다. 다행히 반응이 좋은 아이디어를 발견할 수 있었고, 우린 이 서비스에 집중하기 시작했다.&lt;/p&gt;
&lt;h3 id=&quot;문제-해결-사이클&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0-%EC%82%AC%EC%9D%B4%ED%81%B4&quot; aria-label=&quot;문제 해결 사이클 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;문제 해결 사이클&lt;/h3&gt;
&lt;p&gt;이후엔 같은 사이클을 계속해서 반복했다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;사용자 데이터(인터뷰, GA 등)로 사용자 데이터 수집&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;데이터를 종합해 가설 수립&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;적절한 방법으로 검증&lt;/strong&gt;
처음 경험한 사이클이었기 때문에 경험치가 부족해 어려움을 겪었지만, 서비스에 대한 애정과 성취감이 이전 프로젝트들과 비교할 수 없이 크게 느껴졌다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;난 이전까지 개발을 위한 결과물을 만들었다. 하지만 이번엔 우리가 &lt;strong&gt;타겟한 사용자를 위한 실제로 쓰이는 결과물&lt;/strong&gt;을 만들었다. 꾸준히 사용자는 증가했고, 감사하게도 많은 분들이 서비스 잘 쓰고 있다는 말씀들을 해주셨다. 돌이켜보면 이를 통해 느꼈던 애정과 성취감이 가장 큰 원동력이 되었던 것 같다.&lt;/p&gt;
&lt;h3 id=&quot;아쉬웠던-점&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%95%84%EC%89%AC%EC%9B%A0%EB%8D%98-%EC%A0%90&quot; aria-label=&quot;아쉬웠던 점 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;아쉬웠던 점&lt;/h3&gt;
&lt;p&gt;팀원들 모두 위와 같은 과정이 처음이라 경험치가 부족했다. 특히 목표 KPI를 수립하는 것이 어려웠다. 현재 상황에서 어떤 목표가 적절한지에 대한 감을 잡기가 힘들었다. 목표 KPI 수립이 잘됐다면, 조금 더 뾰족한 문제 인식과 활발한 강점 활용으로 서비스를 더 성장시킬 수 있었을 것 같다는 아쉬움이 있다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;개발&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B0%9C%EB%B0%9C&quot; aria-label=&quot;개발 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;개발&lt;/h2&gt;
&lt;h3 id=&quot;개발은-가장-비싼-방법이다&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B0%9C%EB%B0%9C%EC%9D%80-%EA%B0%80%EC%9E%A5-%EB%B9%84%EC%8B%BC-%EB%B0%A9%EB%B2%95%EC%9D%B4%EB%8B%A4&quot; aria-label=&quot;개발은 가장 비싼 방법이다 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;개발은 가장 비싼 방법이다&lt;/h3&gt;
&lt;p&gt;수립한 가설들을 검증하는 방법 중 가장 비싼 방법이 개발이라는 것을 배웠고 이를 실제로 체감했다. &lt;strong&gt;서비스를 운영하는 입장에서 한번 한번의 의사결정은 굉장히 중요&lt;/strong&gt;하다. 한번의 잘못된 결정으로 시간과 돈이 크게 낭비될 수 있기 때문이다. 따라서 우리는 개발보다 주로 인스타그램이나 인터뷰 등 최대한 리소스를 적게 사용하는 방법으로 가설을 검증했다.&lt;/p&gt;
&lt;h3 id=&quot;수많은-의사결정의-연속&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%88%98%EB%A7%8E%EC%9D%80-%EC%9D%98%EC%82%AC%EA%B2%B0%EC%A0%95%EC%9D%98-%EC%97%B0%EC%86%8D&quot; aria-label=&quot;수많은 의사결정의 연속 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;수많은 의사결정의 연속&lt;/h3&gt;
&lt;p&gt;개발을 하다보면 크고 작은 수많은 의사결정들이 요구된다. 인프라 구축부터 컨벤션 등등 &lt;strong&gt;많은 솔루션 중 가장 타당하며 팀의 핵심 가치에 부합하는 솔루션을 선택&lt;/strong&gt;해야 했다. 팀원들 모두 서로 의견을 잘 들어주고 수용해준 덕분에 원활한 의사결정을 할 수 있었던 것 같다.&lt;/p&gt;
&lt;h3 id=&quot;MSA&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#MSA&quot; aria-label=&quot;MSA permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;MSA&lt;/h3&gt;
&lt;p&gt;백엔드 팀원과 기술 스택이 달라 효율적인 분업을 위해 컨텐츠 업로드 서버와 API 서버를 분리했고, 난 주로 API 서버를 담당해 전체적인 DB 스키마와 API 설계를 맡았다. 서버를 분리한 것이 처음이었는데 &lt;strong&gt;책임이 분리되어 책임이 분리되어 업무를 효율적으로 나눌 수 있었고, 작업 속도가 빨랐다.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;아쉬웠던-점-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%95%84%EC%89%AC%EC%9B%A0%EB%8D%98-%EC%A0%90-1&quot; aria-label=&quot;아쉬웠던 점 1 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;아쉬웠던 점&lt;/h3&gt;
&lt;p&gt;의사결정을 하는 과정에서 기본기가 부족하다는 것을 많이 체감했다. 때문에 선택할 수 있는 솔루션도 한정적이었고, 근거도 부족했던 것 같다.&lt;/p&gt;
&lt;p&gt;개발 외의 태스크도 많다보니 실제로 결정에 대한 근거가 기억이 나지 않았던 적이 몇번 있었다.
간단하게 팀 블로그를 만들어 중요한 의사결정만이라도 다른 어떤 솔루션이 있었고, 결정에 대한 근거가 무엇이었는지 기록으로 남겼다면 하는 아쉬움이 있다. &lt;/p&gt;
&lt;p&gt;MSA를 처음 경험해보는 것이다 보니 Gateway, 인증/인가 등 추가로 분리했어야 할 서버들에 대해 너무 늦게 알아버렸다. 이에 대한 추가적인 공부와 분리도 필요할 것 같다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;협업&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%98%91%EC%97%85&quot; aria-label=&quot;협업 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;협업&lt;/h2&gt;
&lt;h3 id=&quot;Jira&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Jira&quot; aria-label=&quot;Jira permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;Jira&lt;/h3&gt;
&lt;p&gt;Jira라는 협업 툴을 경험할 수 있었다. 다양한 플랫폼과 연동이 가능하고, Automation을 활용해 번거로운 작업 현황 변경 같은 반복적인 작업도 자동화할 수 있어 굉장히 편했다. 무엇보다 &lt;strong&gt;일을 시작하기 전 빠르게 리마인드와 분업이 가능하다는 점과 중간 중간 팀원들에게 따로 물어보지 않아도 작업 현황을 볼 수 있다는 점&lt;/strong&gt;이 가장 편했던 것 같다.&lt;/p&gt;
&lt;h3 id=&quot;애자일&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%95%A0%EC%9E%90%EC%9D%BC&quot; aria-label=&quot;애자일 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;애자일&lt;/h3&gt;
&lt;p&gt;애자일 방법론을 적용해 프로젝트를 진행했다. 위에서 언급한 &lt;strong&gt;문제 해결 사이클을 효율적으로 반복하기 위해 최적의 방법론&lt;/strong&gt;인 것 같다. 비교적 짧은 호흡으로 확실한 목표를 세우니 훨씬 몰입하기 좋았던 것 같다.&lt;/p&gt;
&lt;h3 id=&quot;아쉬웠던-점-2&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%95%84%EC%89%AC%EC%9B%A0%EB%8D%98-%EC%A0%90-2&quot; aria-label=&quot;아쉬웠던 점 2 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;아쉬웠던 점&lt;/h3&gt;
&lt;p&gt;Jira와 애자일 방법론 모두 처음 경험하는 것들이었기 때문에 미숙한 점들이 있었다. 특히 스토리 포인트 투표를 조금 더 적극적으로 도입해 작업 시간에 대해 예측하는 연습을 많이 했다면 하는 아쉬움이 있다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;느낀점&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%8A%90%EB%82%80%EC%A0%90&quot; aria-label=&quot;느낀점 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;느낀점&lt;/h2&gt;
&lt;p&gt;SWM 덕분에 값진 경험과 배움을 얻을 수 있었다. 위에서 기록한 내가 배운 모든 것들은 SWM에서만 얻을 수 있는 것이라고 생각한다. &lt;/p&gt;
&lt;p&gt;우리 팀이 결성될 수 있었던 이유는 같은 방향성을 가지고 있었기 때문이다. 다들 그동안 계속 했던 것이 아닌 SWM에서만 할 수 있는 것들을 해보고 싶어했다.
우리 팀의 방향성은 고급스럽고 완성도 높은 개발을 위한 결과물이 아닌 서툴더라도 우리가 애정할 수 있고, 사용자에게 쓰이는 서비스를 개발하는 것이었다.
좋은 팀원들과 멘토님들을 만난 덕분에 위 방향성에 맞는 알찬 기간을 보낼 수 있었다.&lt;/p&gt;
&lt;p&gt;내가 개발을 공부하기로 결심한 것은 즐기면서 일하고 싶다는 단순한 생각 때문이었다. 내가 애정하는 서비스를 위해 즐겁게 일하고 싶었다. 하지만 내 성장을 위해 프로젝트 여러 개를 병행하며 무엇 하나 애정하지 못하는 모순되는 날들을 보냈다. 이 사실도 SWM 덕분에 알 수 있었고, 개발을 더 큰 관점에서 볼 수 있게 되었다. &lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;계획&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B3%84%ED%9A%8D&quot; aria-label=&quot;계획 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;계획&lt;/h2&gt;
&lt;p&gt;다행히 팀원 모두 서비스를 지속하는 데 동의해 계속 운영하게 되었다. 아쉬웠던 점들을 팀원들과 공유하고 싱크를 맞추는 시간을 가져야할 것 같다. 또한 부족했던 CS 공부와 새로운 기술이나 접근 방식 등 제시할 수 있는 솔루션의 폭을 넓힐 수 있는 공부도 기록과 함께 지속적으로 할 계획이다.&lt;/p&gt;
&lt;p&gt;그리고 이번 SWM 기간동안 논리가 빈약하다는 것과 내 생각을 정리하고 구조화하는 능력이 부족하다는 것을 느꼈다. 때문에 그동안 시간이 없다는 핑계로 미뤘던 독서와 글쓰기도 꾸준히 할 계획이다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Spring Boot Application Image ECR에 push(CI)]]></title><description><![CDATA[이전 기록에서 Spring Boot Application을 Dockerfile을 활용해 docker iamge로 빌드했다. 이제 소스 코드가 push되면 해당 소스 코드를 image로 빌드하고, ECR에 push하는 과정을 github Actions…]]></description><link>https://choiwonyu.github.io/Spring Boot Application Image ECR에 push(CI)/</link><guid isPermaLink="false">https://choiwonyu.github.io/Spring Boot Application Image ECR에 push(CI)/</guid><pubDate>Sat, 07 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;이전 기록에서 Spring Boot Application을 Dockerfile을 활용해 docker iamge로 빌드했다.&lt;/p&gt;
&lt;p&gt;이제 &lt;strong&gt;소스 코드가 push되면 해당 소스 코드를 image로 빌드하고, ECR에 push하는 과정을 github Actions 스크립트를 통해 자동화&lt;/strong&gt;해보자.&lt;/p&gt;
&lt;h2 id=&quot;image-build--ECR-push-자동화&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#image-build--ECR-push-%EC%9E%90%EB%8F%99%ED%99%94&quot; aria-label=&quot;image build  ECR push 자동화 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;image build &amp;#x26; ECR push 자동화&lt;/h2&gt;
&lt;h3 id=&quot;ECR-repository-생성&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ECR-repository-%EC%83%9D%EC%84%B1&quot; aria-label=&quot;ECR repository 생성 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;ECR repository 생성&lt;/h3&gt;
&lt;p&gt;먼저 AWS 콘솔에 들어가 ECR Repository를 생성한다.&lt;/p&gt;
&lt;h3 id=&quot;생성한-repository-정보-github-secret에-등록&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%83%9D%EC%84%B1%ED%95%9C-repository-%EC%A0%95%EB%B3%B4-github-secret%EC%97%90-%EB%93%B1%EB%A1%9D&quot; aria-label=&quot;생성한 repository 정보 github secret에 등록 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;생성한 repository 정보 github secret에 등록&lt;/h3&gt;
&lt;p&gt;생성한 Repository에 Github Actions가 image를 push하기 위해선 해당 Repository의 정보를 알고 있어야 한다. 하지만 외부에 repository에 대한 정보가 공개되면 안되기 때문에 github secrets에 등록해보자.&lt;/p&gt;
&lt;p&gt;Github Repository의 &quot;Settings&quot;&gt;&quot;Secrets and variables&quot;&gt;&quot;Actions&quot;에서 repository secrets를 등록해주면, &lt;strong&gt;외부에 ECR repository 정보를 공개하지 않으면서 Github Actions가 그 값들을 사용할 수 있다.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;ECR-push-권한-부여&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ECR-push-%EA%B6%8C%ED%95%9C-%EB%B6%80%EC%97%AC&quot; aria-label=&quot;ECR push 권한 부여 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;ECR push 권한 부여&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;ECR에 image를 push하기 위해선 Github Actions에게 그에 대한 권한을 부여&lt;/strong&gt;해야 한다.
따라서 AWS 콘솔에서 IAM에 들어가 사용자를 생성하고, 해당 사용자의 ACCESS&lt;em&gt;ID와 ACCESS&lt;/em&gt;KEY도 github repository secrets에 등록해주자.&lt;/p&gt;
&lt;h3 id=&quot;Github-Actions-스크립트-생성&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Github-Actions-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%83%9D%EC%84%B1&quot; aria-label=&quot;Github Actions 스크립트 생성 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;Github Actions 스크립트 생성&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;workflow&quot;&gt;&lt;pre class=&quot;language-workflow&quot;&gt;&lt;code class=&quot;language-workflow&quot;&gt;name: CI/CD  
  
on:  
  push:  
    branches:  
      - master  
  
env:  
  ECR_REGISTRY: ${{ secrets.AWS_ECR_REGISTRY }}  
  ECR_REPOSITORY: ${{ secrets.AWS_PROD_ECR_REPOSITORY }}  
jobs:  
  build-and-push:  
    runs-on: ubuntu-latest  
  
    steps:  
      - name: Checkout repository  
        uses: actions/checkout@v3  
  
      - name: Configure AWS CLI  
        uses: aws-actions/configure-aws-credentials@v2  
        with:  
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}  
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}  
          aws-region: ap-northeast-2  
  
      - name: Log in to Amazon ECR  
        id: login-ecr  
        uses: aws-actions/amazon-ecr-login@v1  
  
      - name: Build and Push Docker Image  
        env:  
          IMAGE_TAG: ${{ github.sha }}-${{ github.run_number }}  
        run: |  
          docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .  
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;위 스크립트는 등록된 repository secrets를 이용해 image를 ECRd에 push하는 스크립트다.
위 과정을 도식화하면, 다음과 같다.
&lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; margin-bottom: 16px;&apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/526a6b187b7f6fe83169a82d4916b602/600f6/ecr-architecture.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 22.352941176470587%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAvUlEQVR42n2PUW7CMBBEc1aOwRF6Bg7EJ1CCE1LZOMKQGgQCIRob248QqQXx0Sftz+yMdjYjQZiMuYgZUtcs8pyyKKjrmvk32JNHK4kQAikl0+mMw64Bd6V1Duc93t+4hUBKiSydjlyGA86jD9bbhpVSqG62G0O5g7FOmMaiVwpjDKIosTLHG0FVST4XS5ZfEmv3OOfJ6Ai6Iu4berorv4QI5xbiU+qJviW6n8dzfav0ksmetvS3fDf9p79zBzKlMSHKSIArAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;ecr architecture&apos; title=&apos;&apos; src=&apos;/static/526a6b187b7f6fe83169a82d4916b602/ca1dc/ecr-architecture.png&apos; srcset=&apos;/static/526a6b187b7f6fe83169a82d4916b602/e7570/ecr-architecture.png 170w,
/static/526a6b187b7f6fe83169a82d4916b602/f46e7/ecr-architecture.png 340w,
/static/526a6b187b7f6fe83169a82d4916b602/ca1dc/ecr-architecture.png 680w,
/static/526a6b187b7f6fe83169a82d4916b602/02d09/ecr-architecture.png 1020w,
/static/526a6b187b7f6fe83169a82d4916b602/9d567/ecr-architecture.png 1360w,
/static/526a6b187b7f6fe83169a82d4916b602/600f6/ecr-architecture.png 1548w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
이제 소스코드를 master branch에 push하면, 생성된 ECR repository에 이미지가 정상적으로 push 되는 것을 확인할 수 있다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[인프라 구조 설계, 간단한 API 서버 이미지 빌드]]></title><description><![CDATA[인프라 구조 계획한 구조는 다음과 같다.
 code push Git 레포지토리에 애플리케이션 코드를 푸시하는 단계로 이는 CI/CD 파이프라인의 시작점이다. push image GitHub Actions이 애플리케이션 코드를 Docker…]]></description><link>https://choiwonyu.github.io/인프라 구조 설계, 간단한 API 서버 이미지 빌드/</link><guid isPermaLink="false">https://choiwonyu.github.io/인프라 구조 설계, 간단한 API 서버 이미지 빌드/</guid><pubDate>Fri, 06 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;인프라-구조&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9D%B8%ED%94%84%EB%9D%BC-%EA%B5%AC%EC%A1%B0&quot; aria-label=&quot;인프라 구조 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;인프라 구조&lt;/h2&gt;
&lt;p&gt;계획한 구조는 다음과 같다.
&lt;figure class=&apos;gatsby-resp-image-figure&apos; style=&apos;margin-bottom: 16px;&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; &apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/ee97b3a0cfa8f7f05cf094202683e0db/2573e/elastic-beanstalk-architecture.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 57.64705882352942%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAABr0lEQVR42o2TzU7CQBSFeSsXvoIL484n4AF8Bd25caVLIyuNRmPQGGOiMZGFIS40UUhUkDYgTGvboaUdOjPH6QwoCIqT3nT+eubMd29z+NGklCYEh1Chut9z2WBGy01OmY9k14HfrOGlboN0HDCWjKzLr32TglKoR+hBkiRwXdeEQ0ADH8RxQMMIjh/iww+mCnEhdWRLYw77/RSUKpFOGw3LAk9TPU+ebmBdbSJwXsGZC8EIZEq/EI05FNV7BNUH1CwbduMNDacHEgrtRHNUPXq9haCwAKREC/K4hTTxBiYE9ooeds9jhLESZEcFhDcX+OjF8NQ1O36CF9eczLlBUbl1UdpvjmE2xgRqtXcsLpexlK/DbvOM4e+ZS1MjeHlIsL36PsBnss0YQ6vVVKw9nJ62UDwj6MViIDhSFqNMBDcM6d0BvOKKdtRXhwTqboQQhGH4n7LBhGBQPkZjJ4+oXQUlNjz7EXEv0kiEqhDOpQ4pZwmqzUNR8nQLa30OnZM1tDfmwSOCjMhElv8SNInhGh3r+qDVEqLmM2ilBBZHEFP452b9SkPRLMTQ9eA9LaGfjQGcz9TPZc8AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;architecture&apos; title=&apos;&apos; src=&apos;/static/ee97b3a0cfa8f7f05cf094202683e0db/ca1dc/elastic-beanstalk-architecture.png&apos; srcset=&apos;/static/ee97b3a0cfa8f7f05cf094202683e0db/e7570/elastic-beanstalk-architecture.png 170w,
/static/ee97b3a0cfa8f7f05cf094202683e0db/f46e7/elastic-beanstalk-architecture.png 340w,
/static/ee97b3a0cfa8f7f05cf094202683e0db/ca1dc/elastic-beanstalk-architecture.png 680w,
/static/ee97b3a0cfa8f7f05cf094202683e0db/02d09/elastic-beanstalk-architecture.png 1020w,
/static/ee97b3a0cfa8f7f05cf094202683e0db/9d567/elastic-beanstalk-architecture.png 1360w,
/static/ee97b3a0cfa8f7f05cf094202683e0db/2573e/elastic-beanstalk-architecture.png 1380w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&apos;gatsby-resp-image-figcaption&apos;&gt;architecture&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h3 id=&quot;code-push&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#code-push&quot; aria-label=&quot;code push permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;code push&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Git 레포지토리&lt;/strong&gt;에 애플리케이션 코드를 푸시하는 단계로 이는 CI/CD 파이프라인의 시작점이다.&lt;/p&gt;
&lt;h3 id=&quot;push-image&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#push-image&quot; aria-label=&quot;push image permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;push image&lt;/h3&gt;
&lt;p&gt;GitHub Actions이 애플리케이션 코드를 Docker 이미지로 빌드하고, Amazon ECR(AWS Elastic Container Registry)에 이미지를 푸시하는 단계다.&lt;/p&gt;
&lt;h3 id=&quot;deploy&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#deploy&quot; aria-label=&quot;deploy permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;deploy&lt;/h3&gt;
&lt;p&gt;push된 새로운 버전의 이미지를 배포하는 단계다. 이때 업데이트는 롤링 업데이트 방식을 사용할 예정이다. 그 이유는 가장 무중단 배포 방식이기 때문이다.&lt;/p&gt;
&lt;p&gt;현재 팀에선 &lt;strong&gt;비용과 시간을 최대한 가볍게 가져가는 것이 중요&lt;/strong&gt;하기 때문에 위 CI/CD 단계는 최대한 간단하게 Github Actions를 이용할 예정이다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;간단한-API-서버-구축&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B0%84%EB%8B%A8%ED%95%9C-API-%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%B6%95&quot; aria-label=&quot;간단한 API 서버 구축 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;간단한 API 서버 구축&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Member.java&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Entity&lt;/span&gt;  
&lt;span class=&quot;token annotation punctuation&quot;&gt;@NoArgsConstructor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;access &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;lombok&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/span&gt;AccessLevel&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;PROTECTED&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  
&lt;span class=&quot;token annotation punctuation&quot;&gt;@Getter&lt;/span&gt;  
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Member&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
  
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Id&lt;/span&gt;  
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@GeneratedValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;strategy &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GenerationType&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;IDENTITY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  
    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Long&lt;/span&gt; id&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;MemberController.java&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@RestController&lt;/span&gt;  
&lt;span class=&quot;token annotation punctuation&quot;&gt;@RequiredArgsConstructor&lt;/span&gt;  
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MemberController&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
  
    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MemberRepository&lt;/span&gt; memberRepository&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
  
    &lt;span class=&quot;token annotation punctuation&quot;&gt;@GetMapping&lt;/span&gt;  
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;token generics&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;MemberDto&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; memberRepository&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;findAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  
                               &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stream&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  
                               &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;MemberDto&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toDto&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  
                               &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toList&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;  
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;MemberDto.java&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;record&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MemberDto&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
  
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MemberDto&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;toDto&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Member&lt;/span&gt; member&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MemberDto&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;member&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;  
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;MemberRepository.java&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;java&quot;&gt;&lt;pre class=&quot;language-java&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MemberRepository&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;JpaRepository&lt;/span&gt;&lt;span class=&quot;token generics&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Member&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Long&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;RDS 연결을 위해 다소 억지스러울 수 있는 API 서버를 구축했다.
요청을 보내면, DB에 저장된 member의 데이터를 반환하는 API를 제공한다.&lt;/p&gt;
&lt;p&gt;이제 API 서버를 image로 빌드할 dockerfile을 작성해보자.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;dockerfile&quot;&gt;&lt;pre class=&quot;language-dockerfile&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; gradle:7.6.1-jdk17 &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; build  &lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;WORKDIR&lt;/span&gt; /app  &lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;COPY&lt;/span&gt; build.gradle settings.gradle ./  &lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; gradle dependencies --no-daemon  &lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;COPY&lt;/span&gt; . /app  &lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; gradle clean build --no-daemon  &lt;/span&gt;
  
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; openjdk:17-slim  &lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;WORKDIR&lt;/span&gt; /app  &lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;COPY&lt;/span&gt; &lt;span class=&quot;token options&quot;&gt;&lt;span class=&quot;token property&quot;&gt;--from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;build&lt;/span&gt;&lt;/span&gt; /app/build/libs/*.jar /app/app.jar  &lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;EXPOSE&lt;/span&gt; 8080  &lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;ENTRYPOINT&lt;/span&gt; [&lt;span class=&quot;token string&quot;&gt;&quot;java&quot;&lt;/span&gt;]  &lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;CMD&lt;/span&gt; [&lt;span class=&quot;token string&quot;&gt;&quot;-jar&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;app.jar&quot;&lt;/span&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;위처럼 멀티 스테이지 빌드를 사용하면, docker image 크기를 줄임으로써 배포 환경에서 보다 가볍고 빠르게 서버가 구동될 수 있다.&lt;/p&gt;
&lt;p&gt;위 Dockerfile을 이용하면, 만든 spring boot application을 이미지로 빌드할 수 있다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Elastic Beanstalk이란 무엇일까]]></title><description><![CDATA[운영 중인 서비스를 Elastic Beanstalk으로 관리하게 되어 Elastic Beanstalk를 이용해 간단한Spring boot Application을 배포하고, CI/CD를 구축하는 과정을 기록하려고 한다. Elastic Beanstalk…]]></description><link>https://choiwonyu.github.io/Elastic Beanstalk이란 무엇일까/</link><guid isPermaLink="false">https://choiwonyu.github.io/Elastic Beanstalk이란 무엇일까/</guid><pubDate>Wed, 04 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;운영 중인 서비스를 Elastic Beanstalk으로 관리하게 되어 Elastic Beanstalk를 이용해 간단한Spring boot Application을 배포하고, CI/CD를 구축하는 과정을 기록하려고 한다.&lt;/p&gt;
&lt;h2 id=&quot;Elastic-Beanstalk이란&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Elastic-Beanstalk%EC%9D%B4%EB%9E%80&quot; aria-label=&quot;Elastic Beanstalk이란 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;Elastic Beanstalk이란?&lt;/h2&gt;
&lt;p&gt;Elastic Beanstalk은 AWS(Amazon Web Services)에서 제공하는 PaaS(Platform as a Service) 서비스다. 이를 통해 사용자는 웹 애플리케이션 및 서비스를 쉽게 배포, 관리, 그리고 확장할 수 있다. Elastic Beanstalk은 개발자가 애플리케이션 코드에 집중할 수 있도록 인프라 설정 및 관리를 자동화해준다.&lt;/p&gt;
&lt;h3 id=&quot;주요-특징&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A3%BC%EC%9A%94-%ED%8A%B9%EC%A7%95&quot; aria-label=&quot;주요 특징 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;주요 특징&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;자동화된 인프라 관리&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Elastic Beanstalk은 애플리케이션 실행에 필요한 리소스(EC2, S3, RDS 등)를 자동으로 생성, 설정, 그리고 연결한다.&lt;/li&gt;
&lt;li&gt;인프라 설정과 관리를 사용자가 직접 수행할 필요 없이 Beanstalk이 이를 처리한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;언어와 플랫폼 지원&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;다양한 언어와 플랫폼을 지원한다. (Java, .NET, PHP, Node.js, Python, Ruby, Go 등)&lt;/li&gt;
&lt;li&gt;Docker 컨테이너도 지원하여 더 많은 환경에서 활용 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;빠른 배포&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;애플리케이션 패키지(코드 및 설정)를 업로드하면 Elastic Beanstalk이 자동으로 애플리케이션을 실행할 환경을 구성한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;확장성&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;사용량에 따라 리소스를 자동으로 확장하거나 축소한다(예: EC2 Auto Scaling, Elastic Load Balancing).&lt;/li&gt;
&lt;li&gt;이를 통해 애플리케이션은 안정적으로 높은 트래픽을 처리할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;모니터링&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Amazon CloudWatch와 통합되어 애플리케이션 상태를 실시간으로 모니터링할 수 있다.&lt;/li&gt;
&lt;li&gt;대시보드에서 애플리케이션 성능, 상태, 그리고 문제를 쉽게 파악할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;사용자 제어&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Elastic Beanstalk은 완전 자동화된 서비스이지만, 필요 시 세부 설정을 사용자 지정할 수 있다.&lt;/li&gt;
&lt;li&gt;EC2 인스턴스의 유형, 데이터베이스 설정, 네트워킹 등을 직접 설정 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id=&quot;Elastic-Beanstalk의-구조&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Elastic-Beanstalk%EC%9D%98-%EA%B5%AC%EC%A1%B0&quot; aria-label=&quot;Elastic Beanstalk의 구조 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;Elastic Beanstalk의 구조&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;애플리케이션(Application)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;사용자가 배포하려는 전체 프로젝트다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;환경(Environment)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;애플리케이션이 실행되는 실행 환경이다.&lt;/li&gt;
&lt;li&gt;Load Balancer가 있는 프로덕션 환경 또는 단일 EC2 인스턴스 환경을 설정할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;애플리케이션 버전(Application Version)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Elastic Beanstalk에서 관리하는 특정 애플리케이션 배포 패키지다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;환경 구성(Environment Configuration)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Elastic Beanstalk 환경의 설정 세부사항이다(인스턴스 유형, 데이터베이스, 네트워킹 등).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id=&quot;사용-사례&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%82%AC%EC%9A%A9-%EC%82%AC%EB%A1%80&quot; aria-label=&quot;사용 사례 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;사용 사례&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;웹 애플리케이션 배포&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;블로그, 전자 상거래 웹사이트 등 다양한 웹 애플리케이션을 빠르게 배포 및 확장 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;백엔드 API&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;모바일 앱 또는 웹 애플리케이션의 백엔드 서비스로 사용.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;실험 및 프로토타이핑&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;새로운 기능을 빠르게 배포하고 테스트할 수 있는 환경 제공.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;자동 확장 요구가 있는 애플리케이션&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;애플리케이션의 트래픽 증가에 따라 동적으로 확장이 필요한 경우 적합.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id=&quot;장단점&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9E%A5%EB%8B%A8%EC%A0%90&quot; aria-label=&quot;장단점 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;장단점&lt;/h3&gt;
&lt;h4 id=&quot;장점&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9E%A5%EC%A0%90&quot; aria-label=&quot;장점 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;장점&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;간편성&lt;/strong&gt;: 코드만 업로드하면 실행 환경이 자동으로 구성.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;확장성&lt;/strong&gt;: Auto Scaling과 Load Balancing이 내장되어 트래픽 증가를 처리 가능.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;통합&lt;/strong&gt;: AWS 서비스(S3, RDS, CloudWatch 등)와 원활히 연동.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;유연성&lt;/strong&gt;: 자동화된 설정을 기본으로 하되, 필요 시 사용자 정의 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;단점&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%8B%A8%EC%A0%90&quot; aria-label=&quot;단점 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;단점&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;복잡한 커스터마이징에 비적합&lt;/strong&gt;: 자동화된 기능은 세부적인 사용자 설정에는 제한이 있을 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;학습 필요&lt;/strong&gt;: Elastic Beanstalk의 자동화 및 설정 방식을 이해해야 최적의 활용이 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Elastic Beanstalk는 사용하는 리소스 외 비용이 필요하지 않기 때문에 빠르게 애플리케이션을 배포하고 관리하고자 하는 사용자에게 특히 유용한 서비스다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[docker volume]]></title><description><![CDATA[배경 컨테이너는 기본적으로 상태가 없다. 이러한 특성 덕분에 쉽게 scale out…]]></description><link>https://choiwonyu.github.io/Docker Volume/</link><guid isPermaLink="false">https://choiwonyu.github.io/Docker Volume/</guid><pubDate>Sat, 30 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;배경&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B0%B0%EA%B2%BD&quot; aria-label=&quot;배경 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;배경&lt;/h2&gt;
&lt;p&gt;컨테이너는 기본적으로 상태가 없다. 이러한 특성 덕분에 쉽게 scale out이 가능하며, 다른 환경에서도 빠르게 배포할 수 있다.&lt;/p&gt;
&lt;p&gt;하지만 이 때문에 다음과 같은 문제가 생길 수 있다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;컨테이너의 휘발성&lt;/strong&gt;: 컨테이너가 삭제되면 내부 데이터도 함께 삭제된다. 이는 데이터 지속성이 필요한 애플리케이션에는 부적합하다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;데이터 관리의 필요성&lt;/strong&gt;: 데이터베이스나 로그 파일처럼 지속적인 데이터 저장이 필요한 경우가 있을 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Docker는 컨테이너가 &lt;strong&gt;호스트 머신에 파일을 저장하고 컨테이너가 중지된 후에도 파일이 유지될 수 있도록 스토리지 기능을 제공&lt;/strong&gt;한다.&lt;/p&gt;
&lt;h2 id=&quot;스토리지-기능&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-%EA%B8%B0%EB%8A%A5&quot; aria-label=&quot;스토리지 기능 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;스토리지 기능&lt;/h2&gt;
&lt;p&gt;Docker의 스토리지 기능은 3가지가 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;볼륨&lt;/li&gt;
&lt;li&gt;Bind Mount&lt;/li&gt;
&lt;li&gt;tmpfs 마운트
위 스토리지 기능들은 호스트에서 데이터의 위치에 따라 구분된다.
&lt;figure class=&apos;gatsby-resp-image-figure&apos; style=&apos;margin-bottom: 16px;&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 667px; &apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/b974f9dc683f76469cd29096684233d4/e31cc/storages.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 60%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAACK0lEQVR42oVTS47TQBDNPbgEh+AKHAQJiR0cgCVCYgdbZgN7FiyYEYRhBs0EiJOZ/BzH/9hux93u9u9R3fmQQUK09Nyyu/rVq1fl3vk0xetPS7w5XeHVRxsnfRduVmKZCCxiDW4wjwqD7bug8xIrivEyiYApxBuFMJfoPXt3g3uPTvHw5Xfcf/oZD55fous66LV9/n/t45io0Ht/6ePx2xE08ZOTEV58sM2hqmsEWUHgZg8ZJwiDaCMhZGXiWkretlvCjCv0fJJsshzJKesOizXHNFVwOXA1D3F2dYNvYwd23sIpgJGfo6yaO3dTTeimpXlp2s6IT0WNeSKxKRXWRUlqCLnALMzhJRtk9C0tJJ1JeHmFFZOYkKd6JQURen8pjIoKN2S+DtQJ9n6mZYM1KQipXFk3u1iyhZqx2Ilaa0Kf3SW0SZ0upWo6Y/aeMOa1QV5W5kwvJ1Pk3x+vYkp2IDSNqCpMSN3YiXA+sNC/tjDxE8SU2aU4Rgp9as5g4uAHwfJy5EId7huFenb2i0uFeSpxS6SWm9GFjPwUsAJOsymhlKIKBK6nLgZTxzTumNB4qEdgP0wFNUKTfB3O0P81w8V4iS+0n90mkLqjFFORf3pUtBN101Az24NdGac5jDfHJVOHoxwjJ4a1DDFc+BjaIex1QV61/x7sHSEjf3sBK03tAXm0SgUmAcNIl+sy/HRSDFcMY49hGnGDmd5D/StyU7JDFug+6F8vyiV+A3xpjqYtRl1gAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;docker storage&apos; title=&apos;&apos; src=&apos;/static/b974f9dc683f76469cd29096684233d4/e31cc/storages.png&apos; srcset=&apos;/static/b974f9dc683f76469cd29096684233d4/e7570/storages.png 170w,
/static/b974f9dc683f76469cd29096684233d4/f46e7/storages.png 340w,
/static/b974f9dc683f76469cd29096684233d4/e31cc/storages.png 667w&apos; sizes=&apos;(max-width: 667px) 100vw, 667px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&apos;gatsby-resp-image-figcaption&apos;&gt;docker storage&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/li&gt;
&lt;li&gt;볼륨은 Docker에서 관리하는 호스트 파일 시스템의 일부에 저장된다. 따라서 Docker가 아닌 프로세스는 이 부분을 수정하기 힘들다. &lt;/li&gt;
&lt;li&gt;바인드 마운트는 호스트 시스템의 어디에나 저장될 수 있다.&lt;/li&gt;
&lt;li&gt;tmpfs 마운트는 호스트 시스템의 메모리에만 저장된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이번 기록에선 Docker의 가장 일반적이고 많이 쓰이는 볼륨에 대해 다루고자 한다.&lt;/p&gt;
&lt;h2 id=&quot;Docker-volume이란&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Docker-volume%EC%9D%B4%EB%9E%80&quot; aria-label=&quot;Docker volume이란 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;Docker volume이란?&lt;/h2&gt;
&lt;p&gt;볼륨은 Docker에 의해 생성되고 관리된다. 볼륨을 생성하면 Docker 호스트의 디렉토리에 저장된다. 이 볼륨을 컨테이너와 연결하면, 컨테이너와 볼륨의 데이터가 연결된다.&lt;/p&gt;
&lt;p&gt;Docker Volume은 컨테이너의 데이터를 지속적으로 저장하기 위한 Docker에서 제공하는 스토리지 메커니즘이다. 컨테이너가 삭제되거나 재배포되더라도 데이터를 유지할 수 있도록 설계되었다.&lt;/p&gt;
&lt;h2 id=&quot;마운트&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%A7%88%EC%9A%B4%ED%8A%B8&quot; aria-label=&quot;마운트 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;마운트&lt;/h2&gt;
&lt;p&gt;Docker에서 마운트는 컨테이너가 &lt;strong&gt;외부의 파일 시스템(Volume 또는 Host 디렉토리)을 내부의 파일 시스템에 연결하여 사용할 수 있도록 설정하는 작업&lt;/strong&gt;을 말한다.&lt;/p&gt;
&lt;p&gt;위 과정을 통해 컨테이너가 중지된 이후에도 데이터를 지속적으로 제공할 수 있으며, 여러 컨테이너가 데이터를 공유할 수 있다.&lt;/p&gt;
&lt;h2 id=&quot;실습&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%8B%A4%EC%8A%B5&quot; aria-label=&quot;실습 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;실습&lt;/h2&gt;
&lt;p&gt;mySQL 컨테이너로 Docker Volume을 이용하면, 컨테이너가 중지된 이후에도 데이터가 유지될 수 있다는 것을 확인해보자.&lt;/p&gt;
&lt;h3 id=&quot;준비&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%A4%80%EB%B9%84&quot; aria-label=&quot;준비 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;준비&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;docker volume 생성&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; volume create my-volume&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;첫 번째 컨테이너 생성&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; run &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt; mysql-container-1 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;token parameter variable&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;rootpassword &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;token parameter variable&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;MYSQL_DATABASE&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;testdb &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; my-volume:/var/lib/mysql &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
mysql:latest&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;첫 번째 컨테이너에서 데이터 생성&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-it&lt;/span&gt; mysql-container-1 mysql &lt;span class=&quot;token parameter variable&quot;&gt;-uroot&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-prootpassword&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;생성된 첫 번째 mysql 컨테이너에 접속한다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;USE&lt;/span&gt; testdb&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;TABLE&lt;/span&gt; shared_users &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;id &lt;span class=&quot;token keyword&quot;&gt;INT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AUTO_INCREMENT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;PRIMARY&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;KEY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name &lt;span class=&quot;token keyword&quot;&gt;VARCHAR&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; age &lt;span class=&quot;token keyword&quot;&gt;INT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; shared_users &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; age&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Alice&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Bob&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;25&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; shared_users&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;shared_users 테이블을 생성하고, 데이터를 삽입한다.&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;
&lt;p&gt;첫 번째 컨테이너 삭제&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; mysql-container-1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;두 번째 컨테이너 실행&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; run &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt; mysql-container-2 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;token parameter variable&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;rootpassword &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;token parameter variable&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;MYSQL_DATABASE&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;testdb &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; my-volume:/var/lib/mysql &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
mysql:latest&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;두 번째 컨테이너에서 데이터 확인&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-it&lt;/span&gt; mysql-container-2 mysql &lt;span class=&quot;token parameter variable&quot;&gt;-uroot&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-prootpassword&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;두 번째 mysql 컨테이너에 접속한다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;USE&lt;/span&gt; testdb&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; shared_users&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;앞서 생성했던 shared_users의 데이터를 확인해보면 첫 번째 컨테이너는 삭제되었지만, 볼륨에 의해 정상적으로 데이터가 잘 남아 있는 것을 확인할 수 있다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[docker network]]></title><description><![CDATA[개요 도커의 가상 네트워크를 통해 내부 컨테이너의 IP를 정의하고, 컨테이너끼리의 통신과 외부에서 컨테이너로의 통신이 가능하다. 네트워크 종류 Driver Description bridge 기본 네트워크 드라이버 host 컨테이너와 Docker…]]></description><link>https://choiwonyu.github.io/Docker Network/</link><guid isPermaLink="false">https://choiwonyu.github.io/Docker Network/</guid><pubDate>Thu, 28 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;개요&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B0%9C%EC%9A%94&quot; aria-label=&quot;개요 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;개요&lt;/h2&gt;
&lt;p&gt;도커의 가상 네트워크를 통해 내부 컨테이너의 IP를 정의하고, 컨테이너끼리의 통신과 외부에서 컨테이너로의 통신이 가능하다.&lt;/p&gt;
&lt;h3 id=&quot;네트워크-종류&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%A2%85%EB%A5%98&quot; aria-label=&quot;네트워크 종류 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;네트워크 종류&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Driver&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;bridge&lt;/td&gt;
&lt;td&gt;기본 네트워크 드라이버&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;host&lt;/td&gt;
&lt;td&gt;컨테이너와 Docker 호스트 간의 네트워크 격리를 제거&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;컨테이너를 호스트 및 다른 컨테이너와 완전히 격리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;overlay&lt;/td&gt;
&lt;td&gt;여러 Docker 데몬을 연결하는 오버레이 네트워크를 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ipvlan&lt;/td&gt;
&lt;td&gt;IPv4 및 IPv6 주소 지정에 대해 완전한 제어를 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;macvlan&lt;/td&gt;
&lt;td&gt;컨테이너에 MAC 주소를 할당&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;기본 네트워크 드라이브인 bridge 네트워크를 위주로 살펴보자.&lt;/p&gt;
&lt;h3 id=&quot;구성-요소&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B5%AC%EC%84%B1-%EC%9A%94%EC%86%8C&quot; aria-label=&quot;구성 요소 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;구성 요소&lt;/h3&gt;
&lt;p&gt;도커에서 bridge 네트워크를 만들면, 다음과 같은 구성 요소가 생성된다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;가상 브릿지 (Bridge)&lt;/strong&gt;: &lt;code class=&quot;language-text&quot;&gt;docker0&lt;/code&gt;라는 가상 네트워크 인터페이스를 생성한다. 이 브릿지는 호스트 시스템의 네트워크와 컨테이너 네트워크를 연결해주는 가상 스위치 역할을 한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;서브넷과 IP 할당&lt;/strong&gt;: 기본 bridge 네트워크는 &lt;code class=&quot;language-text&quot;&gt;172.17.0.0/16&lt;/code&gt; 서브넷을 사용한다.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;iptables&lt;/strong&gt;: 포트 포워딩, NAT 등 외부 네트워크와의 통신을 관리한다.&lt;/p&gt;
&lt;h3 id=&quot;가상-브릿지&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B0%80%EC%83%81-%EB%B8%8C%EB%A6%BF%EC%A7%80&quot; aria-label=&quot;가상 브릿지 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;가상 브릿지&lt;/h3&gt;
&lt;p&gt;이 브릿지는 호스트 시스템에 존재하며, &lt;strong&gt;같은 브리지 네트워크에 속한 모든 컨테이너를 연결하는 가상 스위치 역할&lt;/strong&gt;을 한다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;따라서 같은 네트워크 내부 컨테이너들끼리 통신할 때 가상 브릿지(docker0)를 거치며, 이때 docker dns를 사용해 컨테이너 이름으로 통신이 가능하다. &lt;/p&gt;
&lt;h3 id=&quot;iptables&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#iptables&quot; aria-label=&quot;iptables permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;iptables&lt;/h3&gt;
&lt;p&gt;도커의 iptables에는 어떤 IP에 어떤 컨테이너가 매핑되는지 규칙이 있다.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;NAT&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Docker는 iptables에 포함된 &lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;nat&lt;/code&gt; 테이블의 &lt;code class=&quot;language-text&quot;&gt;POSTROUTING&lt;/code&gt; 체인&lt;/strong&gt;을 사용하여 &lt;strong&gt;컨테이너 내부 IP를 호스트의 외부 IP로 변환&lt;/strong&gt;합니다.&lt;/li&gt;
&lt;li&gt;이를 통해 &lt;strong&gt;컨테이너는 외부 네트워크와 통신&lt;/strong&gt;할 수 있지만, 외부에서는 컨테이너의 내부 IP를 알 수 없습니다.
&lt;em&gt;포트 포워딩&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;외부에서 특정 포트로 접근하면, Docker는 해당 요청을 &lt;code class=&quot;language-text&quot;&gt;iptables&lt;/code&gt; 규칙을 통해 &lt;strong&gt;지정된 컨테이너의 포트로 전달&lt;/strong&gt;합니다.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;nat&lt;/code&gt; 테이블의 &lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;PREROUTING&lt;/code&gt; 체인&lt;/strong&gt;에서 포트 포워딩 규칙이 추가됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;정리하면 컨테이너에서 외부로의 통신(아웃 바운드)은 iptables의 nat table을 통해 수행되고,
외부에서 내부로의 통신(인바운드)는 iptables에 지정된 규칙에 따라 특정 포트마다 지정된 특정 컨테이너로 전달되기 때문에 &lt;code class=&quot;language-text&quot;&gt;-p&lt;/code&gt; 옵션을 통해 포트가 지정되어야 가능하다.
docker 네트워크 내부 컨테이너끼리의 통신은 스위치 역할을 하는 docker0를 통해 이뤄진다.&lt;/p&gt;
&lt;h2 id=&quot;실습&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%8B%A4%EC%8A%B5&quot; aria-label=&quot;실습 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;실습&lt;/h2&gt;
&lt;p&gt;위 내용들을 실습을 통해 확인해보자.&lt;/p&gt;
&lt;h3 id=&quot;네트워크-생성&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%83%9D%EC%84%B1&quot; aria-label=&quot;네트워크 생성 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;네트워크 생성&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; network create my-network&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;my-network라는 네트워크를 생성했다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; network inspect my-network&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;inspect&lt;/code&gt;명령을 통해 상세 조회를 해보면, 서브넷과 게이트웨이 정보 등을 볼 수 있다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&quot;Config&quot;: [
                {
                    &quot;Subnet&quot;: &quot;172.20.0.0/16&quot;,
                    &quot;Gateway&quot;: &quot;172.20.0.1&quot;
                }
            ]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;이제 my-network에 컨테이너들을 실행시켜보자.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; run &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt; app1 &lt;span class=&quot;token parameter variable&quot;&gt;--network&lt;/span&gt; my-network nginx&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; run &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt; app2 &lt;span class=&quot;token parameter variable&quot;&gt;--network&lt;/span&gt; my-network alpine &lt;span class=&quot;token function&quot;&gt;sleep&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;nginx 컨테이너와 alpine 컨테이너를 my-network 내부에 실행시켰다. app2에서 app1으로 핑을 보내보자.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-it&lt;/span&gt; app2 &lt;span class=&quot;token function&quot;&gt;ping&lt;/span&gt; app1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;위에서 언급한 bridge dns 서버를 통해 app1이라는 이름으로 통신할 수 있는 것을 확인할 수 있다. &lt;/p&gt;
&lt;p&gt;그렇다면 이번엔 app3 컨테이너를 실행시켜보자.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-it&lt;/span&gt; app2 &lt;span class=&quot;token function&quot;&gt;ping&lt;/span&gt; app3&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;app3 컨테이너를 상세 조회해보면, 기본 bridge 네트워크에서 실행된다는 것을 알 수 있다. &lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-it&lt;/span&gt; app2 &lt;span class=&quot;token function&quot;&gt;ping&lt;/span&gt; app3&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;app2에서 app3에 핑을 보내면, &lt;code class=&quot;language-text&quot;&gt;ping: bad address &apos;app3&apos;&lt;/code&gt;이라는 메세지를 볼 수 있다. 이를 통해 app3와 app2가 서로 다른 네트워크에 위치해 있다는 것을 확인할 수 있다.&lt;/p&gt;
&lt;h3 id=&quot;인바운드-통신&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9D%B8%EB%B0%94%EC%9A%B4%EB%93%9C-%ED%86%B5%EC%8B%A0&quot; aria-label=&quot;인바운드 통신 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;인바운드 통신&lt;/h3&gt;
&lt;p&gt;외부에서 해당 네트워크로 접근하기 위해선 앞서 언급한대로 포트 포워딩을 이용해야 한다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; run &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;80&lt;/span&gt;:80 &lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt; app4 nginx&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;80포트로 접속했을 때 app4의 nginx 서버로 접근하도록 지정해준다. 이렇게 되면 해당 기기와 같은 사설망 내 다른 기기에서 app4의 nginx 서버에 접속할 수 있게 된다. &lt;/p&gt;
&lt;p&gt;다음과 같이 노트북과 같은 와이파이를 공유하는 스마트폰에서 app4 nginx 서버에 접근할 수 있는 것을 확인할 수 있다.
&lt;figure class=&apos;gatsby-resp-image-figure&apos; style=&apos;margin-bottom: 16px;&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 295px; &apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/3a29407e5392babd82ffcd48a297ae05/60cc9/phone.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 207.05882352941174%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAApCAYAAAA1bQl+AAAACXBIWXMAAAsTAAALEwEAmpwYAAACLUlEQVR42u2WSW/iQBCFDRmJLXjfsc0+7GE9zIXFEYgLIPj/P+ZNVxEjciACKYdE4vDUdLv76+oqm36SJEn4Zv02YCqVuqlvj/BO+OeB0WiE6XTKba/XQ7Va5f5gMEAul3s8Qt/3GVKv11Gr1VCpVNBoNNBsNuG6LjzPg2maSKfT9wGjKES/3xeQOoO63S7CMGSYbdsolUpQFOW+CCk3tCgMI17oOA7K5TK3+XyeQcXiK2S5CE3TkM1kvwam0ykEQRl/m1Nx3J4AudB1nUUbeJ4vjhuI8bIAK7eO/XmAckRHpFxSm/xWVVVEWRCFUYRUvLz8uS+HmUyGq5nNZlmFQuHe6j72Hp7fvWs9ALx+cR/4Qn7rn8MT+AQ+gU/gE/hTgXRFJqIr81rJVZro1rxknOZIrVYL7XYbm80G4/GYXRdpOBxiuVxiPp8jjmOsVissFgvun+eML/NonPwQOQyp0+kI29bF4XDAbDZj60Yi+G63w36/x/F4xOl04v56vcZEPJuMz7ZvMpliu93ibdBndyFZlgXLdtgQeR92LREZp7PEc9e/9H0/QCmqsteheeTM3KAC3TAhGZYDO2hAFc6KdiAZhvEhE7oqw6+PELT+QddUcSwNlhsh6MfQTEc4siKDwrcN7LAJSdfFQtO6uCwSwWRZZguXz4siFFUUZI37lHxZVmF5kQAZlzWm48OwbALqvOs1kKKkZFOh4vgd7/GKRcU5F28ERX6FcbUmif4/Agt4iXNMRCAAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;phone&apos; title=&apos;&apos; src=&apos;/static/3a29407e5392babd82ffcd48a297ae05/60cc9/phone.png&apos; srcset=&apos;/static/3a29407e5392babd82ffcd48a297ae05/e7570/phone.png 170w,
/static/3a29407e5392babd82ffcd48a297ae05/60cc9/phone.png 295w&apos; sizes=&apos;(max-width: 295px) 100vw, 295px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&apos;gatsby-resp-image-figcaption&apos;&gt;phone&lt;/figcaption&gt;
  &lt;/figure&gt;
스마트폰에서 app4까지의 통신 과정을 도식화 하면 아래와 같다.
&lt;figure class=&apos;gatsby-resp-image-figure&apos; style=&apos;margin-bottom: 16px;&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; &apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/ff31bbf353b6adc7554396d436305d07/3e3fe/architecture.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 75.88235294117648%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAAsTAAALEwEAmpwYAAABU0lEQVR42p2T2Y6CQBBF+/+/iY8w0QcfDE8CsiiLIquUOZVUgoaBmSEpG7qqTy23dfKPp+97eTweUpalDMPw4XN/AU3TpOvz+ZQsy+RyuSh8FWiH1p6maaSua8nz/GcgoC2Y+YHEcazQ1+u1DBzHUZ3fGZfmB6xt20W/AwLscDiI53my2+2k6zo9wIoxs/P5rHY8HlUQxJjH8M6e4+d2u+kGLTAfM/Yw3qmsKAqpqkoLMJAZZ1HdEUjQmiAkvV6v4vu+QmmZSvf7vZxOJ01KEgVCp8IthWk7CAKNxZIk0SQoTXW8c5UcdD62gHQSRZHc7/ePWFut8k2g7RHHRaYiukKYuZ99/L8Gzv8dYRgqgBsyBzIGnSEfW0CUJjHGDKlwfqkRBJ9eG1MZpb4NPysVMiMqtCpNIOaKj8L0YpMNA4wxYJx2gFbTNFUQwgAzYw8fcXTxBobXkQ5Yb5uWAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;architecture&apos; title=&apos;&apos; src=&apos;/static/ff31bbf353b6adc7554396d436305d07/ca1dc/architecture.png&apos; srcset=&apos;/static/ff31bbf353b6adc7554396d436305d07/e7570/architecture.png 170w,
/static/ff31bbf353b6adc7554396d436305d07/f46e7/architecture.png 340w,
/static/ff31bbf353b6adc7554396d436305d07/ca1dc/architecture.png 680w,
/static/ff31bbf353b6adc7554396d436305d07/3e3fe/architecture.png 860w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&apos;gatsby-resp-image-figcaption&apos;&gt;architecture&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[docker image]]></title><description><![CDATA[이전 글에서 봤던 이미지에 대해서 좀 더 자세하게 살펴보자. 이미지는 왜 필요할까? 소프트웨어를 실행하기 위해선 크게 하드웨어와 소프트웨어가 필요하다.
소프트웨어는 크게 3가지 구성 요소로 나뉜다. OS…]]></description><link>https://choiwonyu.github.io/Docker Image/</link><guid isPermaLink="false">https://choiwonyu.github.io/Docker Image/</guid><pubDate>Thu, 07 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;이전 글에서 봤던 이미지에 대해서 좀 더 자세하게 살펴보자.&lt;/p&gt;
&lt;h2 id=&quot;이미지는-왜-필요할까&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9D%B4%EB%AF%B8%EC%A7%80%EB%8A%94-%EC%99%9C-%ED%95%84%EC%9A%94%ED%95%A0%EA%B9%8C&quot; aria-label=&quot;이미지는 왜 필요할까 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;이미지는 왜 필요할까?&lt;/h2&gt;
&lt;p&gt;소프트웨어를 실행하기 위해선 크게 하드웨어와 소프트웨어가 필요하다.
소프트웨어는 크게 3가지 구성 요소로 나뉜다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;OS: 하드웨어의 리소스를 사용할 수 있도록 해준다.&lt;/li&gt;
&lt;li&gt;Config: 소프트웨어의 실행에 필요한 패키지, 라이브러리 그리고 런타임 언어 등&lt;/li&gt;
&lt;li&gt;실행시킬 소프트웨어
Docker는 어떻게 위 소프트웨어의 3가지 구성 요소를 모두 가질까?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;위 3가지 구성 요소를 모두 포함하는 것이 이미지이다.
이미지에는 이전에 말했듯 모든 파일, 바이너리, 라이브러리 및 구성이 포함된다.&lt;/p&gt;
&lt;p&gt;하지만 여기서 든 의문이 있다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;분명 Docker는 Host OS를 공유한다고 했는데 이미지에 왜 OS가 포함되는가?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Docker의 이미지는 Host OS와 관계 없이 동일하게 동작해야 한다. 따라서 &lt;strong&gt;이미지에는 OS의 모든 구성 요소가 아닌 해당 소프트웨어를 실행시키는 데 필수적인 라이브러리와 유틸리티만을 OS로 포함&lt;/strong&gt;하는 것이다. 특히 Host 커널을 공유하기 때문에 컨테이너 마다 추가적인 커널이 필요 없어 가벼운 용량과 빠른 실행을 유지할 수 있다.&lt;/p&gt;
&lt;h2 id=&quot;이미지-레이어&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%A0%88%EC%9D%B4%EC%96%B4&quot; aria-label=&quot;이미지 레이어 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;이미지 레이어&lt;/h2&gt;
&lt;p&gt;이미지는 컨테이너를 실행시키기 위한 읽기 전용 파일이다.
이를 좀 더 공간 효율적으로 사용하기 위해 이미지는 &lt;strong&gt;Layered File System&lt;/strong&gt;으로 관리된다.&lt;/p&gt;
&lt;h3 id=&quot;왜-레이어드-구조를-사용하는가&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%99%9C-%EB%A0%88%EC%9D%B4%EC%96%B4%EB%93%9C-%EA%B5%AC%EC%A1%B0%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%EA%B0%80&quot; aria-label=&quot;왜 레이어드 구조를 사용하는가 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;왜 레이어드 구조를 사용하는가?&lt;/h3&gt;
&lt;p&gt;레이어드 구조를 사용하는 핵심적인 이유는 &lt;strong&gt;재사용성&lt;/strong&gt;이다.
아래 ImageA와 ImageB를 살펴보자.
&lt;figure class=&apos;gatsby-resp-image-figure&apos; style=&apos;margin-bottom: 16px;&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; &apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/472818dcd0c470de469703486e3f66a1/7e08f/docker-image-ex.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 74.11764705882352%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAABYlAAAWJQFJUiTwAAABlklEQVR42p2U6W6CUBCFff/36b8+gjGxsWmi0SAugLKDctnu6ZyruJXY2kmuQZz5OGdmcABG20JrjS60fH8trrUDftS2jWI0QjmZoBgOUYzHkqN76k73tIrR+J9AtkYbL1DN3+RecgWiaQBVoHRdqNkMKIrnSuoDmuALyv1AZb1De0PoRp2AtFpWFaIkQRDHiPIccZahruu7NnTRSjuSNIPnx3A8H2GcIleNyTfAQtTYYjkTiL1cYr/bwXEcLOW6L9I0xXa7QeD7mE6n8Pd7qfGwdbZXy41YZmIQBJezl8REVFeivixLc9rzsDzPw2azMTWxuOJvd0PpguCuiCAqWCwWCMMQu7Nyuomi6JL/2JbBdYD6DrxarYxCAn2xR+B8PjfXhDLnse6Hwsc4HA5GDZXRJu0dj8enG9kL5FOVUmZQVOTKOrFnhPIhtz37E5B21uu1gdEmlRFmWZYZFuEvAbvoVBLOvnE4VPiy5dsecoU4EAJzWfpulf4FJIiHljmYTm1xfjX73qTBb/8jVENVhFFxH+QW+A00pZCg5+np7gAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;docker image&apos; title=&apos;&apos; src=&apos;/static/472818dcd0c470de469703486e3f66a1/ca1dc/docker-image-ex.png&apos; srcset=&apos;/static/472818dcd0c470de469703486e3f66a1/e7570/docker-image-ex.png 170w,
/static/472818dcd0c470de469703486e3f66a1/f46e7/docker-image-ex.png 340w,
/static/472818dcd0c470de469703486e3f66a1/ca1dc/docker-image-ex.png 680w,
/static/472818dcd0c470de469703486e3f66a1/02d09/docker-image-ex.png 1020w,
/static/472818dcd0c470de469703486e3f66a1/7e08f/docker-image-ex.png 1186w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&apos;gatsby-resp-image-figcaption&apos;&gt;docker image&lt;/figcaption&gt;
  &lt;/figure&gt;
Nginx Config까지는 같지만, 그 다음 단계에서 각각 다른 파일을 추가했다.
만약, ImageA와 ImageB를 각각 하나의 큰 덩어리로 저장했다면 중복이 생겨 비효율적일 것이다.&lt;/p&gt;
&lt;p&gt;따라서 &lt;strong&gt;같은 변경이 일어난 레이어를 재사용하기 위해 레이어드 구조로 파일을 관리&lt;/strong&gt;한다.
덕분에 위 구조처럼 ImageA와 ImageB는 Nginx Config까지 같은 레이어를 공유하고 이후 단계부터 다른 이미지를 사용하는 것이다.
&lt;code class=&quot;language-text&quot;&gt;docker [image] history&lt;/code&gt; 명령을 통해 해당 이미지가 어떤 레이어로 구성되었는지 알 수 있다.&lt;/p&gt;
&lt;p&gt;다만 &lt;strong&gt;이미지 레이어는 순차적으로 쌓이기 때문에&lt;/strong&gt; 같은 파일로 구성된 이미지들이라도 순서가 다르면 다른 이미지 레이어를 사용한다는 것을 주의해야 한다.&lt;/p&gt;
&lt;h3 id=&quot;COPY-ON-WRITE-전략&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#COPY-ON-WRITE-%EC%A0%84%EB%9E%B5&quot; aria-label=&quot;COPY ON WRITE 전략 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;COPY ON WRITE 전략&lt;/h3&gt;
&lt;p&gt;다음 레이어가 이전 레이어를 수정하게 될 때는 해당 파일을 복사(COPY)하고 수정(WRITE)하는 식으로 동작한다.&lt;/p&gt;
&lt;h3 id=&quot;불변성&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B6%88%EB%B3%80%EC%84%B1&quot; aria-label=&quot;불변성 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;불변성&lt;/h3&gt;
&lt;p&gt;위 COPY ON WRITE 전략 덕분에 레이어가 쌓여도 &lt;strong&gt;이전 레이어에는 영향을 주지 않기 때문에&lt;/strong&gt; 각 이미지 레이어는 불변성을 유지함으로써 안전하게 공유될 수 있다.&lt;/p&gt;
&lt;h3 id=&quot;캐싱&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%BA%90%EC%8B%B1&quot; aria-label=&quot;캐싱 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;캐싱&lt;/h3&gt;
&lt;p&gt;또한 이미지를 빌드할 때, 이전 이미지 레이어들을 캐싱해 새롭게 추가된 부분들만 빌드하고 이전 단계의 레이어는 캐싱된 레이어를 사용함으로써 &lt;strong&gt;빌드 시간을 단축&lt;/strong&gt;할 수 있다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[docker image 저장]]></title><description><![CDATA[이미지 저장 방식엔 두 가지가 있다. 커밋 방식 빌드 방식 커밋 방식 커밋 방식은 다음과 같은 순서로 이루어진다. 이미지를 컨테이너로 실행 컨테이너에서의 수정 Commit…]]></description><link>https://choiwonyu.github.io/Docker Image 저장/</link><guid isPermaLink="false">https://choiwonyu.github.io/Docker Image 저장/</guid><pubDate>Thu, 07 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;이미지 저장 방식엔 두 가지가 있다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;커밋 방식&lt;/li&gt;
&lt;li&gt;빌드 방식&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;커밋-방식&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%BB%A4%EB%B0%8B-%EB%B0%A9%EC%8B%9D&quot; aria-label=&quot;커밋 방식 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;커밋 방식&lt;/h2&gt;
&lt;p&gt;커밋 방식은 다음과 같은 순서로 이루어진다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;이미지를 컨테이너로 실행&lt;/li&gt;
&lt;li&gt;컨테이너에서의 수정&lt;/li&gt;
&lt;li&gt;Commit으로 새로운 레이어 추가&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;문제점&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%AC%B8%EC%A0%9C%EC%A0%90&quot; aria-label=&quot;문제점 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;문제점&lt;/h3&gt;
&lt;p&gt;위 커밋 방식으로 했을 때의 문제점은 다음과 같다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이미지를 만들 때마다, &lt;strong&gt;레이어를 추가할 때마다 컨테이너를 실행&lt;/strong&gt;해야 한다.&lt;/li&gt;
&lt;li&gt;사용자가 직접 레이어를 추가해줘야 한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;여러 레이어를 추가하기 위해선 여러 번의 커밋이 필요&lt;/strong&gt;하다.
위와 같은 문제로 커밋 방식을 사용하게 되면 비효율적이고, 휴먼 에러의 위험이 커진다.
위 문제점을 해결하는 이미지 저장 방식이 빌드 방식이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;빌드-방식&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B9%8C%EB%93%9C-%EB%B0%A9%EC%8B%9D&quot; aria-label=&quot;빌드 방식 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;빌드 방식&lt;/h2&gt;
&lt;p&gt;빌드 방식은 컨테이너를 생성하고 커밋하는 작업을 도커가 대신 수행해준다. 이때 도커가 수행할 수 있도록 하는 파일이 바로 &lt;a href=&quot;https://docs.docker.com/build/concepts/dockerfile/&quot;&gt;Dockerfile&lt;/a&gt;이다.&lt;/p&gt;
&lt;p&gt;도커는 Dockerfile에 따라 임시로 컨테이너를 생성하고, 사용자가 정의한 작업을 수행한 후 커밋을 실행한다. 따라서 여러 개의 레이어도 쉽고 빠르게 추가할 수 있다.&lt;/p&gt;
&lt;h3 id=&quot;dockerfile&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#dockerfile&quot; aria-label=&quot;dockerfile permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;dockerfile&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;지시어&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Instruction&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;FROM &lt;Image&gt;&lt;/td&gt;
&lt;td&gt;베이스 이미지 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RUN &lt;Command&gt;&lt;/td&gt;
&lt;td&gt;이미지 빌드 과정에서 실행하고, 결과를 새로운 레이어로 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WORKDIR &lt;directory&gt;&lt;/td&gt;
&lt;td&gt;이후 RUN, CMD, ENTRYPOINT, COPY, ADD 명령에 대한 작업 폴더를 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;COPY &lt;src&gt; &lt;dest&gt;&lt;/td&gt;
&lt;td&gt;원하는 파일을 레이어에 복사&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CMD &lt;command&gt;&lt;/td&gt;
&lt;td&gt;컨테이너 실행 시 실행할 명령어 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;여기서 &lt;em&gt;CMD와 RUN의 차이&lt;/em&gt;는 뭘까?
CMD는 컨테이너 실행 때만 사용되기 때문에 별도의 레이어를 추가하지 않는다. 반면 RUN은 이미지 빌드 과정에서 실행하고, 결과를 새로운 레이어로 추가한다.
따라서 RUN은 주로 &lt;strong&gt;환경을 설정&lt;/strong&gt;하고 &lt;strong&gt;필수 파일과 패키지를 설치&lt;/strong&gt;하는 데 사용되고, CMD는 &lt;strong&gt;애플리케이션을 동작&lt;/strong&gt;시키는 등의 명령을 한다.&lt;/p&gt;
&lt;p&gt;빌드 방식의 이미지 저장은 IaC 개념으로 dockerfile이라는 코드로 이미지를 관리하는 방식이다.
지시어를 이용해 레이어 추가 과정을 명시하고, &lt;strong&gt;컨테이너 생성과 수정된 변경 사항 커밋을 dockerd에게 맡기는 것&lt;/strong&gt;이다.&lt;/p&gt;
&lt;h3 id=&quot;빌드-컨텍스트&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%B9%8C%EB%93%9C-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8&quot; aria-label=&quot;빌드 컨텍스트 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;빌드 컨텍스트&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.docker.com/build/concepts/context/&quot;&gt;빌드 컨텍스트&lt;/a&gt;는 &lt;strong&gt;빌드에서 접근할 수 있는 파일의 집합&lt;/strong&gt;을 의미한다.
이미지 빌드 방식은 dockerd가 임시 컨테이너를 실행하고 레이어를 하나씩 추가하기 때문에 &lt;strong&gt;dockerfile과 빌드 컨텍스트가 반드시 제공&lt;/strong&gt;되어야 한다. 그래야 어떤 파일들을 어떻게 수정할지 알 수 있기 때문이다.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ docker build [OPTIONS] PATH | URL | -&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;멀티-스테이징-빌드&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%A9%80%ED%8B%B0-%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%A7%95-%EB%B9%8C%EB%93%9C&quot; aria-label=&quot;멀티 스테이징 빌드 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;멀티 스테이징 빌드&lt;/h3&gt;
&lt;p&gt;멀티 스테이징 빌드 방식은 두 개의 base image를 활용하는 방식이다.&lt;/p&gt;
&lt;p&gt;보통 애플리케이션 소스 코드를 빌드하는 과정에서 굉장히 많은 파일들이 생성된다. 하지만 이 중 대부분의 파일이 실제 애플리케이션 실행에 사용되지 않는다. 멀티 스테이징 빌드 방식을 활용하면 위 &lt;strong&gt;빌드와 실행 이미지&lt;/strong&gt;를 분리함으로써 애플리케이션 실행 이미지 크기를 줄일 수 있다.&lt;/p&gt;
&lt;p&gt;많이 쓰이는 Spring Boot Application에 대해 생각해보자. 애플리케이션을 &lt;strong&gt;실행하는데 필요한 것은 jar 파일과 java runtime&lt;/strong&gt;이지만, 소스 코드와 gradle과 같은 빌드 도구 그리고 빌드 결과물까지 너무 많은 파일들이 생성된다. 여기서 빌드 이미지와 실행 이미지를 구분하면 실행에 필요한 이미지 크기를 많이 줄일 수 있을 것이다.
&lt;figure class=&apos;gatsby-resp-image-figure&apos; style=&apos;margin-bottom: 16px;&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; &apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/467ccd4b25de9129a1130f2ea37599a9/b49e7/spring-boot-multi-stage-build.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 67.64705882352942%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAABh0lEQVR42o2T6a6CQAyFef83wz8SExU3VNw3cAVEsOZrUqJeo7dJ02GWM+ecDo68RZqmstvtZLFYyHw+r3K5XEoURXI8HuVbODa43+9awzCUzWYj3W5XhsOhDAYD6XQ60mg05HA4yHa7rfZa/QhI3G43ZcbB1WqlzKbTqcxmM72IORgWRSF5nktZlt8B2YQsC8Zkq9WSdrstvu9Lv9+XZrOptoxGIwV/AYS23QQz0uJ8Pst+v1dQ5qlxHKslrKEAC57lO88fyE2SpALk8Hq9Vqm9Xk9Z4idAgCJ/PB4rU1PmsBgEgW6iAVmWVYDcjjQ2I5V1GmVsScAmk4l6rICYzs14Aegzw+v1qiyQTQJ0Op20so85zr9IZmDGvktGLrJh4LquNqNWq2lz8NDqHw8tjIl1nEcOIw5Zg8jL5aLJ+s9nA0t84yCGYwP+IA0ALDCgnw+bDXQPowGo1+vieZ7KRDINYR52PwFtEc/oOhXzrbswo+v80/8CtOCRI4nnY9WSrpOffjkDfADe0jMDPtM78wAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;spring boot multi-stage build&apos; title=&apos;&apos; src=&apos;/static/467ccd4b25de9129a1130f2ea37599a9/ca1dc/spring-boot-multi-stage-build.png&apos; srcset=&apos;/static/467ccd4b25de9129a1130f2ea37599a9/e7570/spring-boot-multi-stage-build.png 170w,
/static/467ccd4b25de9129a1130f2ea37599a9/f46e7/spring-boot-multi-stage-build.png 340w,
/static/467ccd4b25de9129a1130f2ea37599a9/ca1dc/spring-boot-multi-stage-build.png 680w,
/static/467ccd4b25de9129a1130f2ea37599a9/02d09/spring-boot-multi-stage-build.png 1020w,
/static/467ccd4b25de9129a1130f2ea37599a9/b49e7/spring-boot-multi-stage-build.png 1314w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&apos;gatsby-resp-image-figcaption&apos;&gt;spring boot multi-stage build&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;실제 dockerfile을 살펴보자.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;dockerfile&quot;&gt;&lt;pre class=&quot;language-dockerfile&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; gradle:7.6.1-jdk11 &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; build&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;WORKDIR&lt;/span&gt; /app&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;COPY&lt;/span&gt; build.gradle settings.gradle ./&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; gradle dependencies --no-daemon&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;COPY&lt;/span&gt; . /app&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; gradle clean build --no-daemon&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; openjdk:11-jre-slim&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;WORKDIR&lt;/span&gt; /app&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;COPY&lt;/span&gt; &lt;span class=&quot;token options&quot;&gt;&lt;span class=&quot;token property&quot;&gt;--from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;build&lt;/span&gt;&lt;/span&gt; /app/build/libs/*.jar /app/app.jar&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;EXPOSE&lt;/span&gt; 8080&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;ENTRYPOINT&lt;/span&gt; [&lt;span class=&quot;token string&quot;&gt;&quot;java&quot;&lt;/span&gt;]&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;CMD&lt;/span&gt; [&lt;span class=&quot;token string&quot;&gt;&quot;-jar&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;app.jar&quot;&lt;/span&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;위에서 &lt;code class=&quot;language-text&quot;&gt;build&lt;/code&gt;스테이지에서 gradle을 이용해 소스 코드를 빌드하고, 해당 결과물인 jar파일을 실행하는 이미지를 만들었다. 따라서 소스코드, 빌드 도구, 실행에 필요없는 파일들이 없어져 이미지의 크기를 줄일 수 있게 됐다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Docker란 무엇일까]]></title><description><![CDATA[Docker…]]></description><link>https://choiwonyu.github.io/Docker란 무엇일까/</link><guid isPermaLink="false">https://choiwonyu.github.io/Docker란 무엇일까/</guid><pubDate>Tue, 05 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Docker는 이전 글에서 봤던 컨테이너 가상화 기술을 사용자가 손쉽게 사용할 수 있도록 해준다.
이와 같은 소프트웨어를 컨테이너 플랫폼이라고 한다.&lt;/p&gt;
&lt;h2 id=&quot;아키텍처&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98&quot; aria-label=&quot;아키텍처 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;아키텍처&lt;/h2&gt;
&lt;p&gt;도커는 클라이언트 - 서버 구조로 실행된다.
여기서 클라이언트는 사용자고, 서버는 도커 데몬(dockerd)이다.&lt;/p&gt;
&lt;h3 id=&quot;도커-데몬&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%8F%84%EC%BB%A4-%EB%8D%B0%EB%AA%AC&quot; aria-label=&quot;도커 데몬 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;도커 데몬&lt;/h3&gt;
&lt;p&gt;dockerd는 docker api 요청을 수신해 이미지, 컨테이너, 볼륨 등의 docker 객체를 관리한다.
하지만 사용자가 매번 docker api에 맞춰 요청을 보내는 것은 번거롭기 때문에 Docker CLI가 제공된다.&lt;/p&gt;
&lt;h3 id=&quot;docker-cli&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#docker-cli&quot; aria-label=&quot;docker cli permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;docker cli&lt;/h3&gt;
&lt;p&gt;Docker CLI는 클라이언트의 명령어에 맞게 API를 만들어 dockerd에게 전달하고, 응답으로 받은 JSON을 테이블로 변환해 클라이언트에게 보여준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&apos;gatsby-resp-image-figure&apos; style=&apos;margin-bottom: 16px;&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-wrapper&apos; style=&apos;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 680px; &apos;&gt;
      &lt;a class=&apos;gatsby-resp-image-link&apos; href=&apos;/static/826230a97b5e9d780eeb462d9a1c815d/698bb/docker-architecture.png&apos; style=&apos;display: block&apos; target=&apos;_blank&apos; rel=&apos;noopener&apos;&gt;
    &lt;span class=&apos;gatsby-resp-image-background-image&apos; style=&quot;padding-bottom: 20%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAk0lEQVR42q2Pyw6EIBRD+f8vdIVGxMQQX6gQeXXSm8xm1nM3hTacchX+POp9XzzPgxACruuCcw7btuG+b1HvPc7zxLqu2Pcdx3FIxjvfpZSQcwY5VEXIPM8C0lrDWou+7zGOo+iyLOJ3XYdhGMQj1BgjBSxjKc9kqVorWmsopWCaJgF9f0OfOTNuQFCMUXwOs9+VP3FjNNHiMXc6AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&apos;gatsby-resp-image-image&apos; alt=&apos;docker architecture&apos; title=&apos;&apos; src=&apos;/static/826230a97b5e9d780eeb462d9a1c815d/ca1dc/docker-architecture.png&apos; srcset=&apos;/static/826230a97b5e9d780eeb462d9a1c815d/e7570/docker-architecture.png 170w,
/static/826230a97b5e9d780eeb462d9a1c815d/f46e7/docker-architecture.png 340w,
/static/826230a97b5e9d780eeb462d9a1c815d/ca1dc/docker-architecture.png 680w,
/static/826230a97b5e9d780eeb462d9a1c815d/02d09/docker-architecture.png 1020w,
/static/826230a97b5e9d780eeb462d9a1c815d/9d567/docker-architecture.png 1360w,
/static/826230a97b5e9d780eeb462d9a1c815d/698bb/docker-architecture.png 2068w&apos; sizes=&apos;(max-width: 680px) 100vw, 680px&apos; style=&apos;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&apos; loading=&apos;lazy&apos; decoding=&apos;async&apos;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&apos;gatsby-resp-image-figcaption&apos;&gt;docker architecture&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;구성-요소&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B5%AC%EC%84%B1-%EC%9A%94%EC%86%8C&quot; aria-label=&quot;구성 요소 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;구성 요소&lt;/h2&gt;
&lt;h3 id=&quot;이미지&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9D%B4%EB%AF%B8%EC%A7%80&quot; aria-label=&quot;이미지 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;이미지&lt;/h3&gt;
&lt;p&gt;이미지는 특정 시점의 파일 시스템을 저장한 압축 파일이다. 여기엔 모든 파일, 바이너리, 라이브러리 및 구성이 포함되며, 백업이나 스냅샷과 개념적으로 비슷하지만 크기가 훨씬 작아 인터넷으로 저장하고, 공유하기 좋다.&lt;/p&gt;
&lt;h3 id=&quot;컨테이너&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88&quot; aria-label=&quot;컨테이너 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;컨테이너&lt;/h3&gt;
&lt;p&gt;컨테이너는 실행 상태의 이미지를 말한다.&lt;/p&gt;
&lt;h3 id=&quot;이미지와-컨테이너&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%9D%B4%EB%AF%B8%EC%A7%80%EC%99%80-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88&quot; aria-label=&quot;이미지와 컨테이너 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;이미지와 컨테이너&lt;/h3&gt;
&lt;p&gt;둘의 관계는 프로그램과 프로세스와 관계와 매우 유사하다.&lt;/p&gt;
&lt;p&gt;프로그램을 설치하면 디스크에 공간에 저장된다. 이를 실행하면 프로세스가 되고, 한 프로그램을 여러 개 실행할 수 있다. 이때 각 프로세스는 리소스를 사용한다.&lt;/p&gt;
&lt;p&gt;이미지 또한 하나의 이미지에 대해 여러 컨테이너를 실행할 수 있고, 각 컨테이너는 리소스를 사용한다. 여기서 가장 큰 차이점은 &lt;strong&gt;격리 여부&lt;/strong&gt;다. docker는 컨테이너 가상화를 사용하므로 각 컨테이너는 격리된 환경에서 실행된다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[가상화 기술]]></title><description><![CDATA[…]]></description><link>https://choiwonyu.github.io/가상화 기술/</link><guid isPermaLink="false">https://choiwonyu.github.io/가상화 기술/</guid><pubDate>Mon, 04 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;가상화-기술이란&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B0%80%EC%83%81%ED%99%94-%EA%B8%B0%EC%88%A0%EC%9D%B4%EB%9E%80&quot; aria-label=&quot;가상화 기술이란 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;가상화 기술이란?&lt;/h2&gt;
&lt;p&gt;가상화 기술이란 물리적인 컴퓨터 내부에서 &lt;strong&gt;논리적인 여러 컴퓨팅 환경&lt;/strong&gt;을 띄우는 것을 말한다.&lt;/p&gt;
&lt;h3 id=&quot;왜-사용할까&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%99%9C-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C&quot; aria-label=&quot;왜 사용할까 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;왜 사용할까?&lt;/h3&gt;
&lt;p&gt;가상화 기술을 사용하는 이유를 알기 위해 가상화 기술을 사용하지 않았을 때 발생하는 문제에 대해 살펴보자.&lt;/p&gt;
&lt;p&gt;하나의 물리적인 컴퓨터에서 여러 프로그램을 구동한다고 하면, 이 프로세스들은 &lt;strong&gt;호스트 머신의 리소스를 공유&lt;/strong&gt;하게 된다. 따라서 한 프로세스의 &lt;em&gt;에러가 전이&lt;/em&gt;될 수도 있고, 한 프로세스의 &lt;em&gt;사용량 급증으로 인해 리소스를 더 많이 사용&lt;/em&gt;해 다른 프로세스들이 정상적으로 작동하지 않을 수도 있다.&lt;/p&gt;
&lt;h3 id=&quot;문제점&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EB%AC%B8%EC%A0%9C%EC%A0%90&quot; aria-label=&quot;문제점 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;문제점&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;에러 전이&lt;/li&gt;
&lt;li&gt;사용량 급증&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;위와 같은 문제를 해결하기 위해 가상화 기술을 사용하는 것이다.
위 문제가 발생하는 이유는 &lt;strong&gt;여러 프로세스가 호스트 머신의 리소스를 공유&lt;/strong&gt;하기 때문이다.
따라서 &lt;strong&gt;프로세스 별로 사용할 수 있는 리소스를 제한&lt;/strong&gt;해 환경을 논리적으로 구분하면 위 문제를 근본적으로 해결할 수 있다.&lt;/p&gt;
&lt;h3 id=&quot;해결&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%95%B4%EA%B2%B0&quot; aria-label=&quot;해결 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;해결&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;에러 전이: 격리를 통해 하나의 프로세스 에러가 다른 프로세스에 영향을 주지 못하게 한다.&lt;/li&gt;
&lt;li&gt;사용량 급증: 각 환경의 리소스를 제한시킴으로써 다른 환경에 영향을 주지 못하게 한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;추가로 가상화 기술은 필요에 따라 가상 환경의 크기를 조정하거나 새로운 인스턴스를 추가하는 등 효율적인 인프라 관리를 가능하게 한다.&lt;/p&gt;
&lt;h2 id=&quot;가상화-방식&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EA%B0%80%EC%83%81%ED%99%94-%EB%B0%A9%EC%8B%9D&quot; aria-label=&quot;가상화 방식 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;가상화 방식&lt;/h2&gt;
&lt;h3 id=&quot;하이퍼-바이저&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%ED%95%98%EC%9D%B4%ED%8D%BC-%EB%B0%94%EC%9D%B4%EC%A0%80&quot; aria-label=&quot;하이퍼 바이저 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;하이퍼 바이저&lt;/h3&gt;
&lt;p&gt;전통적인 가상화 방식으로 호스트 OS 위에 가상 머신을 띄워 게스트 OS를 설치하고, 해당 가상 머신에서 프로세스를 실행하는 방식이다. 이때 &lt;strong&gt;가상 머신은 호스트 OS와 별개의 OS를 사용&lt;/strong&gt;한다는 것이 중요하다.&lt;/p&gt;
&lt;p&gt;프로세스가 리소스를 사용할 때 OS의 커널에 요청을 보낸다. 이때 System Call이라는 표준을 이용하는데 OS 마다 다른 System Call을 사용한다.
그렇다면 가상 머신의 게스트 OS가 어떻게 호스트 머신의 리소스를 사용할 수 있을까? 바로 하이퍼 바이저가 이 역할을 수행한다.&lt;/p&gt;
&lt;p&gt;하이퍼 바이저는 &lt;strong&gt;게스트 OS의 System Call이 정상적으로 수행될 수 있도록 가상 머신과 실제 하드웨어 사이에서 중재자 역할&lt;/strong&gt;을 해준다.&lt;/p&gt;
&lt;h3 id=&quot;컨테이너&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88&quot; aria-label=&quot;컨테이너 permalink&quot; class=&quot;heading-anchor before&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M6.188 8.719c.439-.439.926-.801 1.444-1.087 2.887-1.591 6.589-.745 8.445 2.069l-2.246 2.245c-.644-1.469-2.243-2.305-3.834-1.949-.599.134-1.168.433-1.633.898l-4.304 4.306c-1.307 1.307-1.307 3.433 0 4.74 1.307 1.307 3.433 1.307 4.74 0l1.327-1.327c1.207.479 2.501.67 3.779.575l-2.929 2.929c-2.511 2.511-6.582 2.511-9.093 0s-2.511-6.582 0-9.093l4.304-4.306zm6.836-6.836l-2.929 2.929c1.277-.096 2.572.096 3.779.574l1.326-1.326c1.307-1.307 3.433-1.307 4.74 0 1.307 1.307 1.307 3.433 0 4.74l-4.305 4.305c-1.311 1.311-3.44 1.3-4.74 0-.303-.303-.564-.68-.727-1.051l-2.246 2.245c.236.358.481.667.796.982.812.812 1.846 1.417 3.036 1.704 1.542.371 3.194.166 4.613-.617.518-.286 1.005-.648 1.444-1.087l4.304-4.305c2.512-2.511 2.512-6.582.001-9.093-2.511-2.51-6.581-2.51-9.092 0z&quot;/&gt;&lt;/svg&gt;&lt;/a&gt;컨테이너&lt;/h3&gt;
&lt;p&gt;컨테이너 가상화는 하이퍼 바이저 방식과 다르게 &lt;strong&gt;호스트 OS를 공유&lt;/strong&gt;한다.
하이퍼 바이저 방식처럼 소프트웨어가 공간을 격리 시키는 것이 아닌 리눅스의 격리 기술을 이용해 &lt;strong&gt;커널이 직접 공간을 격리시킨다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;별도의 게스트 OS 설치, 부팅이 필요 없기 때문에 컨테이너 가상화는 &lt;strong&gt;빠르고 가볍다&lt;/strong&gt;는 강력한 장점을 가진다. 따라서 현대 애플리케이션 운영 환경에서 더 선호된다.&lt;/p&gt;
&lt;p&gt;하지만 호스트 OS의 커널을 공유하기 때문에 비교적 보안에 취약하다는 단점이 있다.&lt;/p&gt;</content:encoded></item></channel></rss>