<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>도슐랭스타</title>
    <link>https://dodo5517.tistory.com/</link>
    <description>안녕하세요. 공부를 음미하는 도식가이어요. 우리 공부를 해보아요. 아자자</description>
    <language>ko</language>
    <pubDate>Sun, 5 Apr 2026 13:16:00 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>도도.__.</managingEditor>
    <image>
      <title>도슐랭스타</title>
      <url>https://tistory1.daumcdn.net/tistory/6343822/attach/6f3c781bf4b64a4283fcbc71268d817a</url>
      <link>https://dodo5517.tistory.com</link>
    </image>
    <item>
      <title>Vue(Composition API) - ref()와 일반 변수의 차이</title>
      <link>https://dodo5517.tistory.com/186</link>
      <description>&lt;h1&gt;ref()와 일반 변수의 차이&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ref()란&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반응형 데이터를 만들기 위한 래퍼 함수다. &lt;code&gt;ref()&lt;/code&gt;로 감싼 값은 Vue가 변경을 감지해서 화면을 자동으로 업데이트한다.&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;const message = ref(&quot;안녕하세요 Vue!&quot;);    // 반응형
const nomalMessage = &quot;일반 메시지 입니다.&quot;; // 일반 변수&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+ &lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;단순 값을 Vue가 추적할 수 있는 객체로 포장해주는 역할이라 래퍼(wrapper, 포장지) 함수라고 부름.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;내부에서 값을 바꿀 때 차이&lt;/h2&gt;
&lt;pre class=&quot;arcade&quot;&gt;&lt;code&gt;setTimeout(() =&amp;gt; {
  nomalMessage = &quot;3초 후 변경&quot;;   // 값은 바뀌지만 화면 안 바뀜
  message.value = &quot;3초 후 변경&quot;;  // 화면 자동 업데이트
}, 3000);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;ref()&lt;/code&gt;로 감싸지 않으면 값이 바뀌어도 Vue가 감지하지 못해서 화면이 그대로다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ref()는 객체다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;ref()&lt;/code&gt;로 만든 변수는 객체라서 내부 값에 접근할 때 &lt;code&gt;.value&lt;/code&gt;를 사용한다.&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;const currentTime = ref(&quot;10:00:00&quot;);

currentTime = ref(&quot;11:00:00&quot;)   // 불가 (const 재할당)
currentTime.value = &quot;11:00:00&quot;  // 가능 (객체 내부 값 변경)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;const&lt;/code&gt;는 변수가 가리키는 대상(주솟값)을 바꾸지 못하는 것이지, 객체 내부 값까지 막는 게 아니다.&lt;/p&gt;
&lt;pre class=&quot;sqf&quot;&gt;&lt;code&gt;const obj = { name: &quot;철수&quot; }
obj = { name: &quot;영희&quot; }   // 불가
obj.name = &quot;영희&quot;         // 가능&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;ref()&lt;/code&gt;도 마찬가지다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;템플릿에서는 .value 생략&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;setup()&lt;/code&gt;에서 &lt;code&gt;return&lt;/code&gt;으로 넘긴 ref 데이터는 템플릿(HTML 영역)에서 &lt;code&gt;.value&lt;/code&gt; 없이 바로 사용한다.&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;return {
  message,      // ref
  currentTime,  // ref
  nomalMessage, // 일반 변수
};&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;&amp;lt;h2&amp;gt;{{ message }}&amp;lt;/h2&amp;gt;      &amp;lt;!-- .value 안 써도 됨! --&amp;gt;
&amp;lt;h2&amp;gt;{{ currentTime }}&amp;lt;/h2&amp;gt;
&amp;lt;h2&amp;gt;{{ nomalMessage }}&amp;lt;/h2&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 변수는 초기값을 템플릿에 전달하는 용도로는 쓸 수 있지만, 이후 값이 바뀌어도 화면이 따라오지 않는다. 화면과 데이터를 동기화하려면 &lt;code&gt;ref()&lt;/code&gt;로 감싸야 한다.&lt;/p&gt;</description>
      <category>Vue</category>
      <author>도도.__.</author>
      <guid isPermaLink="true">https://dodo5517.tistory.com/186</guid>
      <comments>https://dodo5517.tistory.com/186#entry186comment</comments>
      <pubDate>Sat, 28 Mar 2026 08:32:15 +0900</pubDate>
    </item>
    <item>
      <title>Vue(Options API) - 반응형 데이터와 일반 변수의 차이</title>
      <link>https://dodo5517.tistory.com/185</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Vue에서 &quot;조작하기 어렵다&quot;는 말의 의미&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;일반 변수 vs 반응형 데이터&lt;/h2&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;let nomalMessage = &quot;일반 메시지 입니다.&quot;;

var vm = createApp({  
  data() {
    return {
      nomalMessage: nomalMessage,  // 값만 복사해서 반응형으로 등록
    };
  },
  created() {
    // this는 Vue 인스턴스
    this.nomalMessage = &quot;일반 메시지 입니다.&quot;;
  },
}).mount(&quot;#app&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;data()&lt;/code&gt;가 실행되는 순간 &lt;code&gt;nomalMessage&lt;/code&gt;의 값만 복사해서 가져온다.&lt;br /&gt;이후 &lt;code&gt;this.nomalMessage&lt;/code&gt;는 바깥의 &lt;code&gt;let nomalMessage&lt;/code&gt;와 완전히 별개가 된다.&lt;/p&gt;
&lt;pre class=&quot;haskell&quot;&gt;&lt;code&gt;let nomalMessage   &amp;rarr;   &quot;일반 메시지 입니다.&quot;   (원본)
                              &amp;darr; 복사 후 연결 끊김
data.nomalMessage  &amp;rarr;   &quot;일반 메시지 입니다.&quot;   (Vue 반응형, 독립적)&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;연결이 끊긴 이후&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;원본 변수를 수정해도 화면이 바뀌지 않는다. &amp;darr; 원본 변수 수정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2Goua/dJMcaaLo4FY/FYJJt1VBILtzFYB4UaPENk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2Goua/dJMcaaLo4FY/FYJJt1VBILtzFYB4UaPENk/img.png&quot; data-origin-width=&quot;240&quot; data-origin-height=&quot;56&quot; data-is-animation=&quot;false&quot; style=&quot;width: 39.8895%; margin-right: 10px;&quot; data-widthpercent=&quot;40.36&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2Goua/dJMcaaLo4FY/FYJJt1VBILtzFYB4UaPENk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2Goua%2FdJMcaaLo4FY%2FFYJJt1VBILtzFYB4UaPENk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;240&quot; height=&quot;56&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdPARz/dJMcaiP9Erz/B3LqKWyfSKvefrTVIAyBz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdPARz/dJMcaiP9Erz/B3LqKWyfSKvefrTVIAyBz1/img.png&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;57&quot; data-is-animation=&quot;false&quot; style=&quot;width: 58.9478%;&quot; data-widthpercent=&quot;59.64&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdPARz/dJMcaiP9Erz/B3LqKWyfSKvefrTVIAyBz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdPARz%2FdJMcaiP9Erz%2FB3LqKWyfSKvefrTVIAyBz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;361&quot; height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Vue 반응형 데이터를 직접 수정해야 화면이 바뀐다. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;darr;&lt;span&gt; 반응형 데이터로 수정&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cm03mF/dJMcaio8LUq/y5TYXAVQ2LcLSwuJKnbAjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cm03mF/dJMcaio8LUq/y5TYXAVQ2LcLSwuJKnbAjK/img.png&quot; data-origin-width=&quot;345&quot; data-origin-height=&quot;45&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;46.15&quot; style=&quot;width: 45.6117%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cm03mF/dJMcaio8LUq/y5TYXAVQ2LcLSwuJKnbAjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcm03mF%2FdJMcaio8LUq%2Fy5TYXAVQ2LcLSwuJKnbAjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;345&quot; height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8QEzL/dJMcagSosF9/IY2EA9SrQrmOmiVxCwKc8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8QEzL/dJMcagSosF9/IY2EA9SrQrmOmiVxCwKc8K/img.png&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;56&quot; data-is-animation=&quot;false&quot; style=&quot;width: 53.2255%;&quot; data-widthpercent=&quot;53.85&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8QEzL/dJMcagSosF9/IY2EA9SrQrmOmiVxCwKc8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8QEzL%2FdJMcagSosF9%2FIY2EA9SrQrmOmiVxCwKc8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;501&quot; height=&quot;56&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;콘솔에서 접근 가능 여부&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&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;code&gt;nomalMessage = &quot;수정&quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;vm.nomalMessage = &quot;수정&quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;window.nomalMessage&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;window.vm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;let&lt;/code&gt;으로 선언한 변수는 콘솔에서 이름으로 접근은 되지만 &lt;code&gt;window&lt;/code&gt;에는 등록되지 않는다.&lt;br /&gt;&lt;code&gt;var&lt;/code&gt;로 선언한 변수는 &lt;code&gt;window&lt;/code&gt;에 등록된다.&lt;br /&gt;&amp;rarr; ES6에서 나온 let, const는 &lt;b&gt;전역 스코프에는 존재하지만 window에는 붙지 않도록&lt;/b&gt; 설계됨. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;ES6 이전 문법인 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;var는 window에 바로 붙도록 설계 되었지만 문제가 많았음..&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&amp;rarr; 콘솔에서 전역 스코프(let, const)에 접근 가능한 이유는 솔이 스크립트 스코프까지 탐색하기 때문임.&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 변수는 &lt;code&gt;data()&lt;/code&gt;에 초기값을 전달하는 용도일 뿐, 이후 Vue와의 연결은 끊긴다.&lt;br /&gt;화면을 업데이트하려면 반드시 Vue 반응형 데이터(&lt;code&gt;vm.nomalMessage&lt;/code&gt;)를 통해 수정해야 한다.&lt;/p&gt;</description>
      <category>Vue</category>
      <author>도도.__.</author>
      <guid isPermaLink="true">https://dodo5517.tistory.com/185</guid>
      <comments>https://dodo5517.tistory.com/185#entry185comment</comments>
      <pubDate>Fri, 27 Mar 2026 09:40:28 +0900</pubDate>
    </item>
    <item>
      <title>Vue - &amp;quot; v-model &amp;quot; 정리</title>
      <link>https://dodo5517.tistory.com/184</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;v-model이란&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폼 입력 요소와 Vue 데이터를 양방향으로 바인딩해주는 디렉티브다.&lt;/p&gt;
&lt;pre class=&quot;fsharp&quot;&gt;&lt;code&gt;&amp;lt;input type=&quot;text&quot; v-model=&quot;name&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부적으로는 이렇게 동작한다.&lt;/p&gt;
&lt;pre class=&quot;julia&quot;&gt;&lt;code&gt;&amp;lt;input type=&quot;text&quot; @input=&quot;name = $event.target.value&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 이벤트 핸들러 함수를 따로 만들 필요가 없다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;여러 input이 있을 때&lt;/h2&gt;
&lt;pre class=&quot;fsharp&quot;&gt;&lt;code&gt;&amp;lt;input type=&quot;text&quot; v-model=&quot;num1&quot; /&amp;gt;
&amp;lt;input type=&quot;text&quot; v-model=&quot;num2&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 input은 자기 데이터에만 연결되어 있다. &lt;code&gt;num1&lt;/code&gt; input에서 이벤트가 발생하면 &lt;code&gt;num1&lt;/code&gt;만 바뀌고 &lt;code&gt;num2&lt;/code&gt;는 그대로다. 이벤트 핸들러를 따로 만들 필요 없다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;v-model 수식어&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;.lazy&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 &lt;code&gt;v-model&lt;/code&gt;은 input 이벤트(타이핑할 때마다)로 데이터를 업데이트한다. &lt;code&gt;.lazy&lt;/code&gt;를 붙이면 change 이벤트(포커스를 잃었을 때)에만 업데이트한다.&lt;/p&gt;
&lt;pre class=&quot;fsharp&quot;&gt;&lt;code&gt;&amp;lt;input type=&quot;text&quot; v-model.lazy=&quot;num&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;.number&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력값을 숫자로 형변환한다. 형변환이 불가능하면 원래 값을 유지한다.&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;&amp;lt;input type=&quot;text&quot; v-model.number=&quot;num&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;.trim&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력값의 앞뒤 공백을 제거한다. 단어 사이 공백은 제거하지 않는다.&lt;/p&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;&amp;lt;input type=&quot;text&quot; v-model.trim=&quot;name&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;&quot;  홍 길 동  &quot;  &amp;rarr;  &quot;홍 길 동&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주의사항&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;setup()&lt;/code&gt;에서 선언한 데이터는 반드시 &lt;code&gt;return&lt;/code&gt;해야 템플릿에서 사용할 수 있다. &lt;code&gt;return&lt;/code&gt;에 없으면 &lt;code&gt;v-model&lt;/code&gt;로 연결해도 동작하지 않는다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;setup() {
  const num1 = ref(0);
  const num2 = ref(0);

  return {
    num1,
    num2,  // return 안 하면 템플릿에서 접근 불가
  };
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Vue</category>
      <author>도도.__.</author>
      <guid isPermaLink="true">https://dodo5517.tistory.com/184</guid>
      <comments>https://dodo5517.tistory.com/184#entry184comment</comments>
      <pubDate>Mon, 23 Mar 2026 08:39:24 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript 동작 원리 - 버퍼, 스레드, 콜스택, 이벤트 루프</title>
      <link>https://dodo5517.tistory.com/183</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 버퍼 (Buffer)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;버퍼란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터를 &lt;b&gt;임시로 저장해두는 공간&lt;/b&gt;이다.&lt;br /&gt;데이터를 보내는 쪽과 받는 쪽의 &lt;b&gt;속도 차이&lt;/b&gt;가 있을 때, 중간에서 데이터를 모아두었다가 한꺼번에 전달하는 역할을 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;동작 원리&lt;/h3&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;[데이터] &amp;rarr; (조금씩 꺼내서 버퍼로 보냄) &amp;rarr; [버퍼] &amp;rarr; (버퍼가 채워지면 전송) &amp;rarr; [데이터 처리]&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;버퍼의 위치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버퍼는 &lt;b&gt;보내는 쪽과 받는 쪽 모두&lt;/b&gt;에 있을 수 있다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&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;/td&gt;
&lt;td&gt;데이터를 모아서 한꺼번에 전송&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;유튜브 영상 미리 받아두기&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;&lt;b&gt;버퍼의 목적은 속도 차이 해결&lt;/b&gt;이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;속도가 다른 두 지점 사이 어디든 필요하면 버퍼가 생긴다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;유튜브&lt;/b&gt;: 서버에서 영상 데이터를 미리 받아 버퍼에 저장 &amp;rarr; 끊김 없이 재생 (재생 바보다 빨간 바가 앞서가는 이유)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프린터&lt;/b&gt;: 문서를 버퍼에 저장 후 프린터 속도에 맞춰 전송&lt;/li&gt;
&lt;li&gt;&lt;b&gt;음악 스트리밍&lt;/b&gt;: 네트워크가 불안정해도 끊기지 않게 미리 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 프로세스 &amp;amp; 스레드&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프로세스 (Process)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 중인 &lt;b&gt;프로그램 하나&lt;/b&gt;. (예: 크롬 브라우저, 카카오톡)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;스레드 (Thread)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스 &lt;b&gt;안에서 실제로 일을 처리하는 단위&lt;/b&gt;.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;컴퓨터
└── 프로세스 (실행 중인 프로그램)
    ├── 스레드 1
    ├── 스레드 2
    └── 스레드 3&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;싱글 스레드 vs 멀티 스레드&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&amp;nbsp;&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;/td&gt;
&lt;td&gt;1개&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;복잡함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&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;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;동시에 같은 데이터 접근 시 충돌 가능 (동시성 문제)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;싱글 스레드 &amp;ne; 싱글 프로세스&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;싱글 스레드는 &quot;프로세스 &lt;b&gt;하나당&lt;/b&gt; 스레드가 하나&quot;라는 의미이지, 프로세스 자체가 하나라는 뜻은 아니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;프로세스 A └── 스레드 1개
프로세스 B └── 스레드 1개
프로세스 C └── 스레드 1개&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 싱글 스레드 프로세스를 &lt;b&gt;여러 개&lt;/b&gt; 띄울 수 있다. (ex. Node.js)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;멀티 스레드 + 멀티 프로세스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스 여러 개를 띄우고, 각 프로세스가 멀티 스레드면 수십 개의 스레드가 동시에 존재할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;프로세스 A ├── 스레드 1 ├── 스레드 2 └── 스레드 3
프로세스 B ├── 스레드 1 ├── 스레드 2 └── 스레드 3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;단, 프로세스끼리는 독립적이라 서로의 데이터를 직접 공유할 수 없다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ex. 크롬 브라우저&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크롬은 &lt;b&gt;탭마다 별도의 프로세스&lt;/b&gt;를 띄우고, 각 프로세스 안에 여러 스레드가 있다.&lt;br /&gt;&amp;rarr; 탭 하나가 뻗어도 다른 탭이 멀쩡한 이유!&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 콜스택 &amp;amp; 이벤트 루프 (JavaScript)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;콜스택 (Call Stack)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트 코드가 실행되면서 생성되는 &lt;b&gt;실행 컨텍스트를 저장하는 스택 구조&lt;/b&gt;.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수 호출 시 &amp;rarr; 스택에 &lt;b&gt;추가(push)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;함수 실행 완료 시 &amp;rarr; 스택에서 &lt;b&gt;제거(pop)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이벤트 루프 (Event Loop)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;콜스택과 콜백 큐(태스크 큐)를 모니터링&lt;/b&gt;하면서 비동기 작업을 관리한다.&lt;br /&gt;콜스택이 비어있을 때 콜백 큐의 작업을 콜스택으로 이동시킨다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;setTimeout은 정확하지 않다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;setTimeout(fn, 1000)&lt;/code&gt;의 실제 의미는&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;&lt;s&gt;&quot;1초 후에 실행해줘&quot;&lt;/s&gt;&lt;br /&gt;&lt;/span&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;콜스택이 비었을 때, 1초는 지났으면 실행해줘&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콜스택이 바쁘면 콜백 큐는 그냥 &lt;b&gt;밀려서 늦게 실행&lt;/b&gt;된다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;setTimeout(() =&amp;gt; console.log(&quot;타임아웃!&quot;), 1000);

// 3초 걸리는 무거운 작업
for (let i = 0; i &amp;lt; 10000000000; i++) {}

console.log(&quot;반복문 끝&quot;);

// 실행 결과:
// 1초 지남 &amp;rarr; 콜백 큐에서 대기 중...
// 3초 지남 &amp;rarr; &quot;반복문 끝&quot; 출력 (콜스택 비워짐)
//           &amp;rarr; 그제서야 &quot;타임아웃!&quot; 출력 &amp;larr; 1초가 아닌 3초 후!&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;결론&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;setTimeout&lt;/code&gt;은 &lt;b&gt;&quot;최소 N초&quot;를 보장&lt;/b&gt;할 뿐, 정확한 시간을 보장하지 않는다.&lt;/li&gt;
&lt;li&gt;이것은 자바스크립트가 &lt;b&gt;싱글 스레드&lt;/b&gt;이기 때문에 생기는 근본적인 한계다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>JavaScript</category>
      <author>도도.__.</author>
      <guid isPermaLink="true">https://dodo5517.tistory.com/183</guid>
      <comments>https://dodo5517.tistory.com/183#entry183comment</comments>
      <pubDate>Sat, 14 Mar 2026 17:00:25 +0900</pubDate>
    </item>
    <item>
      <title>HTTP Keep Alive와 TCP Keep Alive</title>
      <link>https://dodo5517.tistory.com/182</link>
      <description>&lt;h1&gt;Keep Alive&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP를 보다가 Keep Alive가 궁금해졌다. 연결을 유지시킨다는 것만 알고 있어서 찾아봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Keep Alive는 &lt;b&gt;HTTP Keep Alive&lt;/b&gt;와 &lt;b&gt;TCP Keep Alive&lt;/b&gt; 두 가지가 존재한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;왜 두 가지가 존재하나&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TCP는 전송 계층(L4), HTTP는 애플리케이션 계층(L7)으로 서로 다른 계층에 속한다. &lt;br /&gt;계층표가 궁금하다면 아래 글로&lt;/p&gt;
&lt;figure id=&quot;og_1772758771790&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;TCP&quot; data-og-description=&quot;TCP는 4계층에 속한다. OSI 계층 TCP/IP 계층 7 Application Application Application 6 Presentation FTP Telnet HTTP DNS RTSP etc.. 5 Session 4 Transport Transport TCP UDP ICMP, IGMP 3 Network Network (Internet) IPv4 / IPv6 2 Data Link Network Interf&quot; data-og-host=&quot;dodo5517.tistory.com&quot; data-og-source-url=&quot;https://dodo5517.tistory.com/81&quot; data-og-url=&quot;https://dodo5517.tistory.com/81&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/mdfMT/dJMb87f4hrf/MUaADcPVxMb6XEbt3NvaS0/img.png?width=795&amp;amp;height=525&amp;amp;face=0_0_795_525,https://scrap.kakaocdn.net/dn/jnE8S/dJMb9c9vIaG/OLMqfLLs90RNgKS0fDW0G1/img.png?width=795&amp;amp;height=525&amp;amp;face=0_0_795_525,https://scrap.kakaocdn.net/dn/dvFKF6/dJMb87NUe9C/xm6wCSQ9FGbKM5jDUMh5Xk/img.jpg?width=1080&amp;amp;height=1080&amp;amp;face=0_0_1080_1080&quot;&gt;&lt;a href=&quot;https://dodo5517.tistory.com/81&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dodo5517.tistory.com/81&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/mdfMT/dJMb87f4hrf/MUaADcPVxMb6XEbt3NvaS0/img.png?width=795&amp;amp;height=525&amp;amp;face=0_0_795_525,https://scrap.kakaocdn.net/dn/jnE8S/dJMb9c9vIaG/OLMqfLLs90RNgKS0fDW0G1/img.png?width=795&amp;amp;height=525&amp;amp;face=0_0_795_525,https://scrap.kakaocdn.net/dn/dvFKF6/dJMb87NUe9C/xm6wCSQ9FGbKM5jDUMh5Xk/img.jpg?width=1080&amp;amp;height=1080&amp;amp;face=0_0_1080_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;TCP&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;TCP는 4계층에 속한다. OSI 계층 TCP/IP 계층 7 Application Application Application 6 Presentation FTP Telnet HTTP DNS RTSP etc.. 5 Session 4 Transport Transport TCP UDP ICMP, IGMP 3 Network Network (Internet) IPv4 / IPv6 2 Data Link Network Interf&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dodo5517.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;HTTP Keep-Alive   &amp;larr; 애플리케이션 정책
----------------
TCP Keep-Alive    &amp;larr; OS 커널 기능
----------------
IP&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘은 목적도, 동작 주체도 다르기 때문에 따로 존재하고, 동시에 사용하는 것도 가능하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;HTTP Keep-Alive&lt;/b&gt; = 연결 재사용 정책: 이 TCP 연결 써도 되나?&lt;/li&gt;
&lt;li&gt;&lt;b&gt;TCP Keep-Alive&lt;/b&gt; = 연결 생존 감지 메커니즘: 연결 자체가 살아있나?&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;HTTP Keep-Alive&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래 HTTP/1.0은 요청 하나 보내고 &amp;rarr; 응답 받으면 &amp;rarr; TCP 연결을 끊었다. 그래서 요청마다 TCP 3-way handshake를 새로 해야 했고, 이게 오버헤드였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP Keep-Alive를 쓰면 응답 후에도 TCP 연결을 유지해서 다음 요청에 재사용한다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Connection: keep-alive
Keep-Alive: timeout=5, max=100&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;timeout&lt;/code&gt;: 몇 초 동안 요청이 없으면 끊을지&lt;/li&gt;
&lt;li&gt;&lt;code&gt;max&lt;/code&gt;: 최대 몇 번까지 재사용할지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP/1.1부터는 Keep-Alive가 &lt;b&gt;기본값&lt;/b&gt;이라 명시하지 않아도 유지된다. 끊고 싶을 때 &lt;code&gt;Connection: close&lt;/code&gt;를 쓴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, HTTP/1.1에서는 하나의 TCP 연결에서 요청을 &lt;b&gt;순차적으로&lt;/b&gt; 처리하기 때문에 이전 요청/응답이 완료되기 전까지 같은 연결로 새 요청을 보낼 수 없다(HOL Blocking). HTTP/2부터는 멀티플렉싱으로 이 문제가 해결되어 하나의 TCP 연결에서 여러 요청을 동시에 처리할 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TCP Keep-Alive&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OS 커널이 &lt;b&gt;데이터 전송이 없는 유휴 연결&lt;/b&gt;에 대해 일정 시간이 지나면 빈 ACK 패킷(probe)을 보내서 상대방이 살아있는지 확인한다. 응답이 없으면 몇 번 더 재시도하고, 그래도 없으면 연결을 끊는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linux 기본값 기준:&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&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;code&gt;tcp_keepalive_time&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;7200초 (2시간)&lt;/td&gt;
&lt;td&gt;유휴 상태가 이 시간 지나면 probe 시작&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tcp_keepalive_intvl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;75초&lt;/td&gt;
&lt;td&gt;probe 재시도 간격&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tcp_keepalive_probes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;9회&lt;/td&gt;
&lt;td&gt;이 횟수만큼 재시도 후 연결 종료&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 필요한 이유는 중간에 NAT 장비나 방화벽이 &lt;b&gt;일정 시간 동안 패킷이 없으면 해당 세션을 테이블에서 지워버리기&lt;/b&gt; 때문이다. TCP Keep-Alive probe가 이걸 방지한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;새 요청을 보낼 때 판단 흐름&lt;/h2&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;새 HTTP 요청을 보내려 할 때
         │
         ▼
   TCP 연결이 살아있나? ──No──&amp;rarr; 새 TCP 연결 수립 (3-way handshake)
         │ Yes
         ▼
  HTTP에서 재사용 가능한가? ──No──&amp;rarr; 새 TCP 연결 수립
  (keep-alive이고, timeout/max 안 넘었나?)
         │ Yes
         ▼
    기존 연결 재사용 ✓&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정리&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&amp;nbsp;&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;애플리케이션 (L7)&lt;/td&gt;
&lt;td&gt;전송 (L4), OS 커널&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;목적&lt;/td&gt;
&lt;td&gt;TCP 연결 &lt;b&gt;재사용&lt;/b&gt; (handshake 비용 절감)&lt;/td&gt;
&lt;td&gt;연결 &lt;b&gt;생존 여부 감지&lt;/b&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;OS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;제어&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Connection&lt;/code&gt;, &lt;code&gt;Keep-Alive&lt;/code&gt; 헤더&lt;/td&gt;
&lt;td&gt;&lt;code&gt;setsockopt()&lt;/code&gt; 또는 커널 파라미터&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>네트워크</category>
      <author>도도.__.</author>
      <guid isPermaLink="true">https://dodo5517.tistory.com/182</guid>
      <comments>https://dodo5517.tistory.com/182#entry182comment</comments>
      <pubDate>Fri, 6 Mar 2026 10:00:20 +0900</pubDate>
    </item>
    <item>
      <title>[KB] IT's Your Life 7기 전공자 합격 후기</title>
      <link>https://dodo5517.tistory.com/181</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요.&lt;br /&gt;오늘은 KB IT's Your Life 7기 전공자 합격 후기를 풀어볼게요.&lt;br /&gt;취업 준비를 하던 중 KB의 국비 사업이 뜬 것을 확인했습니다.&lt;br /&gt;주변에 있는 아무나 갈 수 있는 국비는 정말 가고 싶지 않아서 신청을 해보았습니다.&lt;br /&gt;모집 절차는 서류(지원서) &amp;rarr; SW 적성진단(전공자는 코테) &amp;rarr; 면접 &amp;rarr; 합격 순서로 진행되었습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 서류&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서류는 이력서에 넣듯이 학교, 자격증 같은 것들과 2가지의 질문이 있었습니다. (전공자 기준)&lt;br /&gt;1. IT's Your Life에 지원하신 동기와 과정 수료 후, 이루고 싶은 취업계획&lt;br /&gt;2. SW 관련 경험 중 어려웠던 과제와 해결 방안에 대해 작성하고, IT's Your Life 과정을 통해 향후 어떤 개발자로 성장하고 싶은지 작성&lt;br /&gt;솔직하게 스스로에게 부족한 점과 그 부분이 문제 해결 경험에서도 나타나도록 연결하여 작성하였습니다. 또, 금융권 쪽에 관심이 있다는 점도 포함하여 작성하였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;725&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WtwtJ/dJMcad1Z8CH/j94yPimDq0pYFTOFL92Eo1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WtwtJ/dJMcad1Z8CH/j94yPimDq0pYFTOFL92Eo1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WtwtJ/dJMcad1Z8CH/j94yPimDq0pYFTOFL92Eo1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWtwtJ%2FdJMcad1Z8CH%2Fj94yPimDq0pYFTOFL92Eo1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1169&quot; height=&quot;725&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;725&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지원서 제출을 완료하면 확인 문자가 옵니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;1829&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Fmx8P/dJMcaibeWQc/FymaaZCHgyUWkEqBblavK0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Fmx8P/dJMcaibeWQc/FymaaZCHgyUWkEqBblavK0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Fmx8P/dJMcaibeWQc/FymaaZCHgyUWkEqBblavK0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFmx8P%2FdJMcaibeWQc%2FFymaaZCHgyUWkEqBblavK0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;1829&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;1829&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운 좋게 합격을 했습니다.&lt;br /&gt;근데 SW적성진단(코테) 참여 체크하는 구글폼의 제출 마감 시간이 4시간 뒤..!! 라서 빠르게 제출을 했습니다.&lt;br /&gt;다들 확인 빨리 하셔야 해요!!&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;SW적성진단(코테)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;698&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C3aO9/dJMcagR1t7N/S8NmjeUo2cz4qO2rUJqvE1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C3aO9/dJMcagR1t7N/S8NmjeUo2cz4qO2rUJqvE1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C3aO9/dJMcagR1t7N/S8NmjeUo2cz4qO2rUJqvE1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC3aO9%2FdJMcagR1t7N%2FS8NmjeUo2cz4qO2rUJqvE1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1169&quot; height=&quot;698&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;698&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서류를 합격하면 메일로 코테에 대한 안내가 옵니다.&lt;br /&gt;근데 말이죠... 코테를 봐야하는데요... 저는 코테 연습을 전혀 안 하고 살았습니다....&lt;br /&gt;그래서 자신이 너무 없었고 벼락치기로 프로그래머스에서 몇 개 풀기는 했지만, 너무나 큰 벼락치기로 실제 풀 때는 전혀 기억이 안 났습니다...&lt;br /&gt;자포자기하고 있는데 짝꿍이 미리 포기한 것만 같은 저에게 일침을 날렸습니다. 붙고 싶기는 한 거냐며,,ㅠ&lt;br /&gt;덕분에 조금 더 공부했습니다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시험 당일 날 메일로 안내받은 링크에 접속하여 시험을 봤습니다.&lt;br /&gt;시험 시간은 2시간이 주어졌고 이 시간 동안 최선을 다해서 보자는 마음으로 임했습니다.&lt;br /&gt;총 2개의 문제가 나왔으며 각 문제가 5단계로 나누어져 순서대로 풀어야 했습니다. 2개의 문제는 옮겨가며 풀어도 되지만 각 문제의 단계는 순서대로 풀어야 하는 겁니다.&lt;br /&gt;최선은 다했지만 망했다 생각했습니다...ㅎㅎ...&lt;br /&gt;한 문제는 3단계까지 풀고, 한 문제는 하나도 풀지 못했습니다...ㅠ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;1222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vkmyp/dJMcagR1t7O/VmiGDN3hkWq7tiiow4DHv0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vkmyp/dJMcagR1t7O/VmiGDN3hkWq7tiiow4DHv0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vkmyp/dJMcagR1t7O/VmiGDN3hkWq7tiiow4DHv0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvkmyp%2FdJMcagR1t7O%2FVmiGDN3hkWq7tiiow4DHv0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1169&quot; height=&quot;1222&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;1222&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 이게 무슨 일인지 또 붙었습니다..?&lt;br /&gt;서류에서 코테에 대한 부족함도 언급하기는 했는데 그게 참작된 걸까요..? 진짜 모르겠음..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;738&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CHvW0/dJMcaiPMami/vKTslSpJ3vGOyAVg20qw8k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CHvW0/dJMcaiPMami/vKTslSpJ3vGOyAVg20qw8k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CHvW0/dJMcaiPMami/vKTslSpJ3vGOyAVg20qw8k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCHvW0%2FdJMcaiPMami%2FvKTslSpJ3vGOyAVg20qw8k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;738&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;738&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에도 합격 후에 다음 단계에 대한 안내 메일이 옵니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 면접&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;면접 준비는 회사 면접을 보러 가는 것처럼 준비해 갔습니다. 다른 점은 저의 부족함을 솔직하게 고백할 수 있다는 것 정도.&lt;br /&gt;자기소개, 프로젝트 경험, 팀플 경험, 지원동기 같은 것들을 준비해갔습니다. 회사 면접과 똑같죠?&lt;br /&gt;면접장에 도착하니 사람이 정말 많더군요.. 긴장하는 바람에 1시간이나 일찍 도착했습니다.&lt;br /&gt;도착하면 신분증과 내일배움카드를 보여드리고 명찰을 받습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;1020&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WXhfI/dJMcahi61Kb/brbMEEnu3qPwk4RTf1eYY0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WXhfI/dJMcahi61Kb/brbMEEnu3qPwk4RTf1eYY0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WXhfI/dJMcahi61Kb/brbMEEnu3qPwk4RTf1eYY0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWXhfI%2FdJMcahi61Kb%2FbrbMEEnu3qPwk4RTf1eYY0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1240&quot; height=&quot;1020&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;1020&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아니? 캐주얼 정장으로 입고 오라고 하여 저는 정장은 아니고 단정하게 입었습니다. 근데 남성분들은 전부 정장 입으시고 여성분들도 저 포함 몇몇 빼고 다 정장을 입으셨어요..&lt;br /&gt;&lt;br /&gt;면접은 다대다로 진행되었습니다.&lt;br /&gt;전 긴장을 너무 많이 해서 단 1개의 질문을 빼고는 확신의 망했다! 를 느꼈습니다.ㅋㅋㅋ...&lt;br /&gt;다른 블로그에서 팁이라며 IT's Your Life를 &amp;lsquo;잇츠&amp;rsquo;가 아닌 &amp;lsquo;아이티&amp;rsquo; 라 읽으라고 했었습니다.&lt;br /&gt;저는 후반부 답변에서 말할 대목을 넣어뒀습니다.&lt;br /&gt;근데?! 다른 모든 지원자분들이 첫 답변부터 말씀하시더군요... 어쩌다 보니 저는 눈치껏 급하게 끼워 넣은 지원자가 되었습니다.....ㅠㅠㅠㅠ&lt;br /&gt;면접관 중 한 분이 저를 &amp;lsquo;다른 지원자가 하는 거 보고 끼워 넣었나?&amp;rsquo; 싶은 듯한 눈빛을....ㅋㅋㅋㅋㅠㅜㅠㅠㅠㅠ&lt;br /&gt;&lt;br /&gt;추가로 면접장에서 정말 좋았던 점은 다른 지원자의 면접 답변을 들을 수 있었다는 겁니다.&lt;br /&gt;저는 지금까지 지원자 한 명씩 보는 면접만 봐왔기에 다른 분들의 이야기를 듣는 것이 매우 흥미롭고 즐거웠습니다.&lt;br /&gt;그래서 지원자면서 다른 분들이 답변할 때 저도 모르게 끄덕거린다거나 긴장하시면 응원하게 됐습니다ㅋㅋㅋㅋ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1429&quot; data-origin-height=&quot;834&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LPCxh/dJMcaibeXBT/CLsuAh5hcdWGxjwkW3zni0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LPCxh/dJMcaibeXBT/CLsuAh5hcdWGxjwkW3zni0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LPCxh/dJMcaibeXBT/CLsuAh5hcdWGxjwkW3zni0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLPCxh%2FdJMcaibeXBT%2FCLsuAh5hcdWGxjwkW3zni0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1429&quot; height=&quot;834&quot; data-origin-width=&quot;1429&quot; data-origin-height=&quot;834&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 후기에서처럼 쿠키를 나눠주셨습니다.&lt;br /&gt;면접 망했다는 생각에 과자라도 맛있게 먹자며 집에 도착하자마자 다 먹어버렸습니다.ㅋㅋㅋㅋㅋ&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 결과&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;860&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JZixD/dJMcaaYyiOO/lSkPNhETapjrCwoeKkapQ1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JZixD/dJMcaaYyiOO/lSkPNhETapjrCwoeKkapQ1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JZixD/dJMcaaYyiOO/lSkPNhETapjrCwoeKkapQ1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJZixD%2FdJMcaaYyiOO%2FlSkPNhETapjrCwoeKkapQ1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;860&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;860&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엥? 근데 합격했습니다. &lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;s&gt;&lt;i&gt;사실 글을 쓰는 지금도 좀 의아합니다. 뭘까요...?&lt;/i&gt;&lt;/s&gt;&lt;/span&gt;&lt;br /&gt;그 후에는 메일로 친절하게 모든 절차를 안내해 주십니다.&lt;br /&gt;근데!!! 절차를 완료해야 하는 기간이 매우!! 짧기 때문에 메일 확인은 정말 필수입니다.&lt;br /&gt;이틀? 정도밖에 안 줍니다.&lt;br /&gt;합격했으니 또 열심히 살아보겠습니다.&lt;br /&gt;&lt;br /&gt;같은 전공의 다른 사람들을 만날 수 있다니 조금 설렙니다. 몇 달 해보고 또 후기 올려보겠습니다.&lt;/p&gt;</description>
      <author>도도.__.</author>
      <guid isPermaLink="true">https://dodo5517.tistory.com/181</guid>
      <comments>https://dodo5517.tistory.com/181#entry181comment</comments>
      <pubDate>Thu, 19 Feb 2026 17:27:24 +0900</pubDate>
    </item>
    <item>
      <title>Google Drive에 자동 백업</title>
      <link>https://dodo5517.tistory.com/180</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;서버에 있는 sqlite의 db를 Google Drive에 자동 백업되도록 하려고 합니다. rclone과 cron을 사용합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;rclone&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라우드 저장소와 파일을 주고받는 도구&lt;/li&gt;
&lt;li&gt;CLI에서 Google Drive, Dropbox, OneDrive 같은 클라우드에 파일을 업로드/다운로드할 수 있게 해주는 프로그램&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Cron&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리눅스에서 작업을 예약 실행해주는 스케줄러&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rclone&amp;nbsp;설치&lt;/p&gt;
&lt;pre id=&quot;code_1766989208977&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# rclone 설치
curl https://rclone.org/install.sh | sudo bash&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 확인&lt;/p&gt;
&lt;pre id=&quot;code_1766989405763&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rclone version&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;로컬 PC에 rclone 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에는 브라우저가 없기에 윈도우에서 토큰을 발급받아줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Windows&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://rclone.org/downloads/&quot;&gt;https://rclone.org/downloads/&lt;/a&gt; 접속하여 Windows용 zip 파일 다운로드&lt;/li&gt;
&lt;li&gt;압축 해제 후 폴더 안에서 PowerShell 또는 CMD 열기&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토큰 발급 명령어 실행&lt;/p&gt;
&lt;pre id=&quot;code_1766989631311&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.\rclone.exe authorize drive&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;{ 부터 } 까지 전체를 복사해야함!!&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;서버에서 rclone 설정&lt;/h3&gt;
&lt;pre id=&quot;code_1766990737378&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rclone config

No remotes found, make a new one?
&amp;gt; n

name&amp;gt; (원하는 이름으로 입력)

Type of storage to configure.
Storage&amp;gt; drive

client_id&amp;gt;
&amp;rarr; 그냥 Enter (비워두기)

client_secret&amp;gt;
&amp;rarr; 그냥 Enter (비워두기)

scope&amp;gt; 1 (전체 액세스 권한)

root_folder_id&amp;gt;
&amp;rarr; 그냥 Enter (비워두기)

service_account_file&amp;gt;
&amp;rarr; 그냥 Enter (비워두기)

Edit advanced config?
&amp;gt; n

Use auto config?
&amp;gt; n (헤드리스 환경이므로)

config_token&amp;gt;
&amp;rarr; 복사한 토큰을 붙여넣기 (중괄호까지 붙여넣기)

Configure this as a Shared Drive (Team Drive)?
&amp;gt; n (개인 드라이브 사용)

--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
&amp;gt; y

q) Quit config
&amp;gt; q&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결 테스트&lt;/p&gt;
&lt;pre id=&quot;code_1767058048804&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rclone lsd gdrive:&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&amp;nbsp;본인 drive의 폴더들이 나와야 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트 파일 업로드&lt;/p&gt;
&lt;pre id=&quot;code_1767058140959&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 테스트 파일 생성
echo &quot;test&quot; &amp;gt; /tmp/test.txt

# Google Drive에 업로드
rclone copy /tmp/test.txt gdrive:

# 업로드 확인
rclone ls gdrive: | grep test&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 본인 drive에 test.txt가 나와야 함.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;스크립트 파일 생성&lt;/h3&gt;
&lt;pre id=&quot;code_1767058156816&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo nano /usr/local/bin/gdrive_backup.sh&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1767058816806&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/bin/bash
# ===================== 설정 영역 =====================
DB_PATH=&quot;&quot; # SQLite DB 파일 경로
GDRIVE_REMOTE=&quot;&quot; # rclone remote 이름
GDRIVE_FOLDER=&quot;&quot; # Google Drive 백업 폴더명
MAX_BACKUPS=  # 유지할 최대 백업 개수
DB_NAME=&quot;&quot; # 백업 파일 prefix
# ================================================================

LOG_FILE=&quot;&quot;  # 로그 파일 경로
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
BACKUP_DATE=$(date '+%Y%m%d')

log() {
    echo &quot;[$TIMESTAMP] $1&quot; | tee -a &quot;$LOG_FILE&quot;
}

error_exit() {
    log &quot;ERROR: $1&quot;
    exit 1
}

log &quot;========== 백업 시작 ==========&quot;

# DB 파일 존재 확인
if [ ! -f &quot;$DB_PATH&quot; ]; then
    error_exit &quot;DB 파일을 찾을 수 없습니다: $DB_PATH&quot;
fi

# 임시 백업 파일 생성
TEMP_BACKUP=&quot;/tmp/${DB_NAME}_${BACKUP_DATE}.db&quot;
log &quot;SQLite 백업 생성 중: $TEMP_BACKUP&quot;

sqlite3 &quot;$DB_PATH&quot; &quot;.backup '$TEMP_BACKUP'&quot; || error_exit &quot;SQLite 백업 실패&quot;

# Google Drive에 업로드
GDRIVE_PATH=&quot;${GDRIVE_REMOTE}:${GDRIVE_FOLDER}/&quot;
REMOTE_FILE=&quot;${DB_NAME}_${BACKUP_DATE}.db&quot;

log &quot;Google Drive 업로드 중: $REMOTE_FILE&quot;
rclone copy &quot;$TEMP_BACKUP&quot; &quot;$GDRIVE_PATH&quot; || error_exit &quot;업로드 실패&quot;

log &quot;업로드 완료: $REMOTE_FILE&quot;

# 임시 파일 삭제
rm -f &quot;$TEMP_BACKUP&quot;

# 오래된 백업 삭제
log &quot;백업 버전 관리 중... (최대 ${MAX_BACKUPS}개 유지)&quot;

BACKUP_LIST=$(rclone lsf &quot;$GDRIVE_PATH&quot; --files-only | grep &quot;^${DB_NAME}_&quot; | sort)
BACKUP_COUNT=$(echo &quot;$BACKUP_LIST&quot; | grep -c &quot;^${DB_NAME}_&quot; || echo &quot;0&quot;)

log &quot;현재 백업 개수: $BACKUP_COUNT&quot;

if [ &quot;$BACKUP_COUNT&quot; -gt &quot;$MAX_BACKUPS&quot; ]; then
    DELETE_COUNT=$((BACKUP_COUNT - MAX_BACKUPS))
    log &quot;초과 백업 ${DELETE_COUNT}개 삭제 예정&quot;
    
    echo &quot;$BACKUP_LIST&quot; | head -n &quot;$DELETE_COUNT&quot; | while read -r OLD_FILE; do
        if [ -n &quot;$OLD_FILE&quot; ]; then
            log &quot;삭제 중: $OLD_FILE&quot;
            rclone delete &quot;${GDRIVE_PATH}${OLD_FILE}&quot;
        fi
    done
fi

log &quot;========== 백업 완료 ==========&quot;
exit 0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 권한 부여&lt;/p&gt;
&lt;pre id=&quot;code_1767058892689&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo chmod +x /usr/local/bin/gdrive_backup.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그 파일 생성&lt;/p&gt;
&lt;pre id=&quot;code_1767058952575&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo touch /var/log/backup.log
sudo chmod 666 /var/log/backup.log&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크립트 테스트&lt;/p&gt;
&lt;pre id=&quot;code_1767058978357&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#수동 실행
/usr/local/bin/gdrive_backup.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확인&lt;/p&gt;
&lt;pre id=&quot;code_1767061874792&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rclone ls gdrive:backup/&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1767061885069&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat /var/log/backup.log&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Cron으로 자동화 설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;crontab 편집&lt;/p&gt;
&lt;pre id=&quot;code_1767061905206&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;crontab -e&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1767061953272&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 매주 월요일 새벽 4시에 백업
0 4 * * 1 /usr/local/bin/gdrive_backup.sh&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;분 시 일 월 요일 순서임. (일요일부터 0임)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확인&lt;/p&gt;
&lt;pre id=&quot;code_1767061991170&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;crontab -l&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확인이 잘 되었다면 자동 백업 설정 끝~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>라즈베리파이</category>
      <author>도도.__.</author>
      <guid isPermaLink="true">https://dodo5517.tistory.com/180</guid>
      <comments>https://dodo5517.tistory.com/180#entry180comment</comments>
      <pubDate>Tue, 30 Dec 2025 13:23:45 +0900</pubDate>
    </item>
    <item>
      <title>Port was already in use. netstat에 없음.</title>
      <link>https://dodo5517.tistory.com/176</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;가끔이러는데 매번 찾아보기 귀찮아서 적어둠.&lt;/p&gt;
&lt;pre id=&quot;code_1765358675385&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;netstat -ano&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;위의 명령어 치고 확인했는데 그 포트를 점유하고 있는 프로그램이 없다면&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Windows가 예약(excluded) 해놓은 포트 범위에 포함되어 있어서 문제가 생길 수 있음.&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;확인 명령어&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1765358299493&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;netsh interface ipv4 show excludedportrange protocol=tcp&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N9x2y/dJMcabiqfM4/HxpLedilVMF2ADsVpT8140/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N9x2y/dJMcabiqfM4/HxpLedilVMF2ADsVpT8140/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N9x2y/dJMcabiqfM4/HxpLedilVMF2ADsVpT8140/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN9x2y%2FdJMcabiqfM4%2FHxpLedilVMF2ADsVpT8140%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;251&quot; height=&quot;227&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;227&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;시작 포트와 점유하고 있는 수 넣어서 명령어 적어주면 됨.&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1765358266581&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;net stop winnat
netsh int ipv4 delete excludedportrange protocol=tcp startport=8002 numberofports=100
net start winnat&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>도도.__.</author>
      <guid isPermaLink="true">https://dodo5517.tistory.com/176</guid>
      <comments>https://dodo5517.tistory.com/176#entry176comment</comments>
      <pubDate>Wed, 10 Dec 2025 18:23:18 +0900</pubDate>
    </item>
    <item>
      <title>Readory 아이폰 단축어</title>
      <link>https://dodo5517.tistory.com/173</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cjfYWy/dJMcagRKp3Q/iL12FAXrhUNfVCYgMIR71K/Readory.shortcut?attach=1&amp;amp;knm=tfile.shortcut&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Readory.shortcut&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.02MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;Readory&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot; &quot; data-og-host=&quot;www.icloud.com&quot; data-og-source-url=&quot;https://www.icloud.com/shortcuts/2672b86805f043c9b57981f42b62db5d&quot; data-og-image=&quot;https://blog.kakaocdn.net/dna/RwFvV/hyZRiMz8Df/AAAAAAAAAAAAAAAAAAAAALZdtG3Kyoi9Lf5lQH2y-BfVfeNM-NJSxKRlUCYs1gHC/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1769871599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=76cDZ8BJkMkAjh5gKLNK4o4enkM%3D&quot; data-og-url=&quot;https://www.icloud.com/shortcuts/2672b86805f043c9b57981f42b62db5d&quot;&gt;&lt;a href=&quot;https://www.icloud.com/shortcuts/2672b86805f043c9b57981f42b62db5d&quot; target=&quot;_blank&quot; data-source-url=&quot;https://www.icloud.com/shortcuts/2672b86805f043c9b57981f42b62db5d&quot;&gt;&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://blog.kakaocdn.net/dna/RwFvV/hyZRiMz8Df/AAAAAAAAAAAAAAAAAAAAALZdtG3Kyoi9Lf5lQH2y-BfVfeNM-NJSxKRlUCYs1gHC/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1769871599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=76cDZ8BJkMkAjh5gKLNK4o4enkM%3D')&quot;&gt; &lt;/div&gt;&lt;div class=&quot;og-text&quot;&gt;&lt;p class=&quot;og-title&quot;&gt;Readory&lt;/p&gt;&lt;p class=&quot;og-desc&quot;&gt; &lt;/p&gt;&lt;p class=&quot;og-host&quot;&gt;www.icloud.com&lt;/p&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;Readory 사용법 | Notion&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;사이트 링크: https://www.kimdohyeon.dev/&quot; data-og-host=&quot;hill-snarl-f10.notion.site&quot; data-og-source-url=&quot;https://hill-snarl-f10.notion.site/Readory-2b7276b3090780a298f5c3c3f8d3a3d0&quot; data-og-image=&quot;https://blog.kakaocdn.net/dna/byUrGY/hyZOzVv96g/AAAAAAAAAAAAAAAAAAAAAKoGMrsNK_KKqlW11WpMCSHuJ3LXhjwTAQ3hn7NWQLXq/img.jpg?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1769871599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=CNT15N%2BFItcwFmddFsO1KbDt8fg%3D&quot; data-og-url=&quot;https://hill-snarl-f10.notion.site/Readory-2b7276b3090780a298f5c3c3f8d3a3d0&quot;&gt;&lt;a href=&quot;https://hill-snarl-f10.notion.site/Readory-2b7276b3090780a298f5c3c3f8d3a3d0&quot; target=&quot;_blank&quot; data-source-url=&quot;https://hill-snarl-f10.notion.site/Readory-2b7276b3090780a298f5c3c3f8d3a3d0&quot;&gt;&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://blog.kakaocdn.net/dna/byUrGY/hyZOzVv96g/AAAAAAAAAAAAAAAAAAAAAKoGMrsNK_KKqlW11WpMCSHuJ3LXhjwTAQ3hn7NWQLXq/img.jpg?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1769871599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=CNT15N%2BFItcwFmddFsO1KbDt8fg%3D')&quot;&gt; &lt;/div&gt;&lt;div class=&quot;og-text&quot;&gt;&lt;p class=&quot;og-title&quot;&gt;Readory 사용법 | Notion&lt;/p&gt;&lt;p class=&quot;og-desc&quot;&gt;사이트 링크: https://www.kimdohyeon.dev/&lt;/p&gt;&lt;p class=&quot;og-host&quot;&gt;hill-snarl-f10.notion.site&lt;/p&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>도도.__.</author>
      <guid isPermaLink="true">https://dodo5517.tistory.com/173</guid>
      <comments>https://dodo5517.tistory.com/173#entry173comment</comments>
      <pubDate>Wed, 29 Oct 2025 13:41:30 +0900</pubDate>
    </item>
    <item>
      <title>정보처리산업기사 실기 후기/합격</title>
      <link>https://dodo5517.tistory.com/170</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;안녕하세요.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;2025년 정기 기사 2회에&lt;/span&gt; 실기 시험을 보고 왔어요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;219&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c08s1j/btsQAuP2Hfr/q3sZN3ZBbEATzxx8plmjd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c08s1j/btsQAuP2Hfr/q3sZN3ZBbEATzxx8plmjd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c08s1j/btsQAuP2Hfr/q3sZN3ZBbEATzxx8plmjd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc08s1j%2FbtsQAuP2Hfr%2Fq3sZN3ZBbEATzxx8plmjd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1086&quot; height=&quot;219&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;219&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: center;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;7월 19일에 시험을 봤는데 결과가 9월 12일에 나왔어요.&lt;br /&gt;확실히 실기는 결과가 나오기까지 오래 걸리는 것 같습니다..&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공부기간은 일주일? 정도 되는 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;시험 공부는 시나공 정처산기 실기 책을 구매했습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;a style=&quot;color: #006dd7;&quot; href=&quot;https://product.kyobobook.co.kr/detail/S000215623881&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://product.kyobobook.co.kr/detail/S000215623881&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1757921148169&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;2025 시나공 정보처리산업기사 실기 기본서 | 길벗알앤디 - 교보문고&quot; data-og-description=&quot;2025 시나공 정보처리산업기사 실기 기본서 | A-Z까지 기본탄탄, 〈2025 시나공 정보처리산업기사 실기 기본서〉2025 시나공 정보처리산업기사 실기 기본서는 기출문제를 면밀히 분석함으로써 출제&quot; data-og-host=&quot;product.kyobobook.co.kr&quot; data-og-source-url=&quot;https://product.kyobobook.co.kr/detail/S000215623881&quot; data-og-url=&quot;https://product.kyobobook.co.kr/detail/S000215623881&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fslI0/hyZITncEoC/TmFop21LThpgcgDeh5Vkqk/img.jpg?width=458&amp;amp;height=591&amp;amp;face=0_0_458_591,https://scrap.kakaocdn.net/dn/bGLi69/hyZJi6KjsJ/vj8q14eMoQClXHFdXfZK61/img.jpg?width=458&amp;amp;height=591&amp;amp;face=0_0_458_591&quot;&gt;&lt;a href=&quot;https://product.kyobobook.co.kr/detail/S000215623881&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://product.kyobobook.co.kr/detail/S000215623881&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fslI0/hyZITncEoC/TmFop21LThpgcgDeh5Vkqk/img.jpg?width=458&amp;amp;height=591&amp;amp;face=0_0_458_591,https://scrap.kakaocdn.net/dn/bGLi69/hyZJi6KjsJ/vj8q14eMoQClXHFdXfZK61/img.jpg?width=458&amp;amp;height=591&amp;amp;face=0_0_458_591');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;2025 시나공 정보처리산업기사 실기 기본서 | 길벗알앤디 - 교보문고&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2025 시나공 정보처리산업기사 실기 기본서 | A-Z까지 기본탄탄, 〈2025 시나공 정보처리산업기사 실기 기본서〉2025 시나공 정보처리산업기사 실기 기본서는 기출문제를 면밀히 분석함으로써 출제&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;product.kyobobook.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이 책!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;책 전부를 풀지는 않았어요.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;사실 책은 &lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;프로그래밍 언어 활용과&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;[기출문제집]을 위해서 구매한 게 컸어요.&lt;br /&gt;기출 문제집은 전부 풀고 오답을 했습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;필기 시험을 보게 되면 TCP/IP 4계층과 OSI 7계층은 기본적으로 다 외우게 되잖아요?&lt;br /&gt;그리고 프로토콜과 정규화도 익숙해지고요?&lt;br /&gt;그래서 복습만 조금씩 하고 기출 풀면 대충 어느 파트에서 문제가 나올지 예상이 되실 거에오.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;전 이게 저 언어인가 이 언어인가 좀 뒤섞여 있어서 그거 구분하고 문제 유형 익숙해지는데 집중했어요.&lt;br /&gt;많이 불안하시면 위의 책 전부 다 풀어보시면 무조건 합격하실 것 같아요.&lt;br /&gt;근데 저는 다른 파트도 다 풀어보는 건 좀 비효율적이라 느껴지긴합니다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;시험 당일&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;준비물로는 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;신분증(필수!!! 없으면 시험 못 봐요!!)&lt;/span&gt;&lt;/b&gt;, 수험표(없어도 보여주시니 안 챙겨도 되긴해요.), 검은펜이 필요합니다.&lt;br /&gt;당근 모바일 신분증도 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시험 시작 시간이 되면 주의사항을 안내해주십니다.&lt;br /&gt;총 시험 시간은 2시간 반이고,&lt;br /&gt;시험 시작 후 &lt;b&gt;1시간 반 이후부터&lt;/b&gt; 퇴실이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 대부분 시간이 매우 많이 남습니다.&lt;br /&gt;1시간쯤부터? 공허한 눈으로 시계를 보며 퇴실 시간을 기다리는 분들이 많더군요ㅋㅋㅋㅋㅋㅋㅋㅋㅋ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다들 시험 화이팅 하셔요!!&lt;/p&gt;</description>
      <category>자격증</category>
      <author>도도.__.</author>
      <guid isPermaLink="true">https://dodo5517.tistory.com/170</guid>
      <comments>https://dodo5517.tistory.com/170#entry170comment</comments>
      <pubDate>Tue, 16 Sep 2025 13:45:41 +0900</pubDate>
    </item>
  </channel>
</rss>