<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Hello IT World!</title>
    <link>https://letitkang.tistory.com/</link>
    <description>Letitkang의 IT 세상~</description>
    <language>ko</language>
    <pubDate>Sun, 28 Jun 2026 03:06:11 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>letitkang</managingEditor>
    <image>
      <title>Hello IT World!</title>
      <url>https://tistory1.daumcdn.net/tistory/2640077/attach/671d25af70bc48a9a3b67e15e97a2ace</url>
      <link>https://letitkang.tistory.com</link>
    </image>
    <item>
      <title>[일반] 백포트란?</title>
      <link>https://letitkang.tistory.com/entry/%EC%9D%BC%EB%B0%98-%EB%B0%B1%ED%8F%AC%ED%8A%B8%EB%9E%80</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 백포트(Backport)란 무엇인가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백포트(Backport)는 최신 버전의 소프트웨어에서 수정된 기능이나 버그 패치를 이전 버전의 소프트웨어에 적용하는 작업을 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 소프트웨어는 지속적으로 새로운 버전이 출시되지만, 운영 환경에서는 안정성 때문에 최신 버전으로 즉시 업그레이드하지 못하는 경우가 많습니다. 이때 최신 버전에서 발견된 보안 취약점 수정이나 버그 수정 내용을 현재 사용 중인 구버전에 적용하는 것이 바로 백포트입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 운영 서버 : 버전 1.0&lt;/li&gt;
&lt;li&gt;최신 개발 버전 : 버전 3.0&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버전 3.0에서 보안 취약점이 수정되었다면, 해당 수정 사항만 버전 1.0에 적용하는 작업을 백포트라고 합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 백포트가 필요한 이유&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 금융, 통신, 공공기관과 같은 환경에서는 안정성이 매우 중요하므로 기존 버전을 유지하면서 필요한 수정 사항만 반영하는 경우가 많습니다.&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;p data-ke-size=&quot;size16&quot;&gt;이 경우 보안 관련 수정 내용만 백포트하여 위험을 최소화할 수 있습니다.&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;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;3. 백포트의 동작 과정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백포트는 일반적으로 다음과 같은 절차로 진행됩니다.&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;최신 버전에서 어떤 버그나 보안 문제가 해결되었는지 분석합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2단계 : 소스 코드 추출&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정된 커밋(Commit) 또는 패치(Patch)를 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;git log
git show &amp;lt;commit-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3단계 : 이전 버전에 적용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최신 버전의 수정 내용을 구버전 코드에 수동 또는 자동으로 적용합니다.&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;git cherry-pick &amp;lt;commit-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4단계 : 테스트 수행&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백포트 적용 후 컴파일 및 기능 테스트를 수행하여 문제 여부를 확인합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5단계 : 운영 반영&lt;/h3&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;4. 백포트 활용 사례&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;-Linux 커널&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linux 커널은 새로운 기능이 지속적으로 추가되지만, 장기 지원(LTS) 버전에서는 안정성을 유지하기 위해 필요한 버그 수정과 보안 패치만 백포트합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 Linux Kernel 6.x에서 수정된 보안 취약점이 있다면, LTS 버전인 5.x에도 해당 패치만 적용될 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;-RHEL(Red Hat Enterprise Linux)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RHEL은 백포트를 적극적으로 사용하는 대표적인 운영체제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 OpenSSL 최신 버전에서 보안 문제가 수정되었다면, RHEL은 패치만 백포트하여 기존 버전 번호를 유지하면서 보안 문제를 해결합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;-Java 오픈소스 프로젝트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Framework, Apache Tomcat, OpenJDK 등의 프로젝트도 유지보수 버전에 버그 수정 사항을 백포트하여 안정성을 제공합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 백포트의 장점과 단점&lt;/h2&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;/li&gt;
&lt;li&gt;보안 취약점 신속 대응&lt;/li&gt;
&lt;li&gt;전체 업그레이드 비용 절감&lt;/li&gt;
&lt;li&gt;장기 지원(LTS) 정책에 적합&lt;/li&gt;
&lt;li&gt;서비스 중단 위험 감소&lt;/li&gt;
&lt;/ul&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;/li&gt;
&lt;li&gt;수동 작업이 많아 개발자 부담 증가&lt;/li&gt;
&lt;li&gt;최신 기능은 사용할 수 없음&lt;/li&gt;
&lt;li&gt;패치 충돌(Conflict)이 발생할 수 있음&lt;/li&gt;
&lt;li&gt;테스트 비용이 추가로 발생함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근에 보안 취약점 관련 작업을 하다가 백포트란 개념을 알게되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안 취약점 프로그램의 경우 오로지 버전만 확인하여 검출하기 때문에 백포트로 패치 후 근거자료를 제시하면됩니다.&lt;/p&gt;</description>
      <category>컴퓨터/일반</category>
      <category>backport</category>
      <category>백포트</category>
      <author>letitkang</author>
      <guid isPermaLink="true">https://letitkang.tistory.com/396</guid>
      <comments>https://letitkang.tistory.com/entry/%EC%9D%BC%EB%B0%98-%EB%B0%B1%ED%8F%AC%ED%8A%B8%EB%9E%80#entry396comment</comments>
      <pubDate>Thu, 25 Jun 2026 17:39:40 +0900</pubDate>
    </item>
    <item>
      <title>[통신] RPC(Remote Procedure Call)란?</title>
      <link>https://letitkang.tistory.com/entry/%ED%86%B5%EC%8B%A0-RPCRemote-Procedure-Call%EB%9E%80</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. RPC란 무엇인가?&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;RPC의 정의&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RPC(Remote Procedure Call)는 네트워크로 연결된 다른 컴퓨터의 함수를 마치 로컬 함수처럼 호출할 수 있도록 하는 기술입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;abnf&quot;&gt;&lt;code&gt;userService.getUserInfo(&quot;admin&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로는 다른 서버에 있는 함수가 실행되지만 개발자는 로컬 메서드를 호출하는 것처럼 사용할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;RPC가 등장한 이유&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 네트워크 통신 방식&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Client
  &amp;darr;
Socket 통신
  &amp;darr;
Server
&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;Socket 생성&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 data-ke-size=&quot;size16&quot;&gt;를 구현해야 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RPC는 이러한 복잡성을 숨겨줍니다.&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;/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 data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. RPC의 동작 원리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;RPC 처리 과정&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Client
   │
   │ 함수 호출
   ▼
Client Stub
   │
   │ 직렬화(Marshalling)
   ▼
Network
   │
   ▼
Server Stub
   │
   │ 역직렬화(Unmarshalling)
   ▼
Server Function
   │
   ▼
Response
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단계별 설명&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;① 클라이언트 호출&lt;/h4&gt;
&lt;pre class=&quot;abnf&quot;&gt;&lt;code&gt;userService.getUser(100);
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;② 데이터 직렬화&lt;/h4&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;method&quot;:&quot;getUser&quot;,
  &quot;id&quot;:100
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;③ 서버 전달&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TCP/HTTP 기반으로 전송&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;④ 서버 실행&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;public User getUser(int id)
{
    return userDao.select(id);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;⑤ 결과 반환&lt;/h4&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;id&quot;:100,
  &quot;name&quot;:&quot;Kim&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개발자가 느끼는 모습&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;User user = userService.getUser(100);
&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;3. RPC의 장점과 단점&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;장점&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 개발 생산성 향상&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 코드를 직접 작성할 필요가 없습니다.&lt;/p&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;service.insert();
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만 호출하면 됩니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) 코드 단순화&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Socket 처리 제거&lt;/li&gt;
&lt;li&gt;패킷 생성 제거&lt;/li&gt;
&lt;li&gt;프로토콜 처리 단순화&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) 언어 독립성 지원&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 RPC 프레임워크는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Java&lt;/li&gt;
&lt;li&gt;C&lt;/li&gt;
&lt;li&gt;C++&lt;/li&gt;
&lt;li&gt;Go&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간 통신을 지원합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4) 고성능&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바이너리 프로토콜 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;gRPC&lt;/li&gt;
&lt;li&gt;Thrift&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단점&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1)&lt;span&gt;&amp;nbsp;&lt;/span&gt;네트워크 지연 발생&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 함수보다 느립니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2)&lt;span&gt;&amp;nbsp;&lt;/span&gt;장애 발생 가능&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 다운 시 호출 실패&lt;/p&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;Timeout Exception
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;3)&lt;span&gt;&amp;nbsp;&lt;/span&gt;디버깅 문제&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 구간 문제 분석 필요&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;4)&lt;span&gt;&amp;nbsp;&lt;/span&gt;버전 관리 필요&lt;/h4&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;4. 대표적인 RPC 기술 비교&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;XML-RPC&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 RPC 기술&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;XML + HTTP
&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;/li&gt;
&lt;/ul&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;/li&gt;
&lt;li&gt;XML 크기 큼&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;JSON-RPC&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;jsonrpc&quot;:&quot;2.0&quot;,
  &quot;method&quot;:&quot;getUser&quot;
}
&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;/li&gt;
&lt;li&gt;REST와 유사&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;gRPC&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gRPC는 현재 가장 많이 사용되는 RPC 프레임워크 중 하나입니다.&lt;/p&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;HTTP/2 사용&lt;/li&gt;
&lt;li&gt;Protocol Buffers 사용&lt;/li&gt;
&lt;li&gt;양방향 스트리밍 지원&lt;/li&gt;
&lt;li&gt;고성능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시&lt;/p&gt;
&lt;pre class=&quot;protobuf&quot;&gt;&lt;code&gt;service UserService {
  rpc GetUser(UserRequest)
      returns (UserResponse);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Apache Thrift&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Apache Thrift는 다양한 언어를 지원하는 RPC 프레임워크입니다.&lt;/p&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;Java&lt;/li&gt;
&lt;li&gt;C++&lt;/li&gt;
&lt;li&gt;Go&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;PHP&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;비교표&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;476&quot; data-origin-height=&quot;219&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgkGDx/dJMcaaFK5VL/eb28RGL8BmhX3zTuymnxo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgkGDx/dJMcaaFK5VL/eb28RGL8BmhX3zTuymnxo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgkGDx/dJMcaaFK5VL/eb28RGL8BmhX3zTuymnxo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgkGDx%2FdJMcaaFK5VL%2Feb28RGL8BmhX3zTuymnxo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;476&quot; height=&quot;219&quot; data-origin-width=&quot;476&quot; data-origin-height=&quot;219&quot;/&gt;&lt;/span&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;5. RPC 활용 사례 및 REST와의 차이점&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;마이크로서비스(MSA)&lt;/h3&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;회원 서비스
    &amp;darr; RPC
주문 서비스
    &amp;darr; RPC
결제 서비스
&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;h3 data-ke-size=&quot;size23&quot;&gt;클라우드 환경&lt;/h3&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;Google&lt;/li&gt;
&lt;li&gt;Netflix&lt;/li&gt;
&lt;li&gt;Uber&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대규모 서비스에서 gRPC를 사용합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;REST와 RPC 차이&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;REST&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;GET /users/100
&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;h4 data-ke-size=&quot;size20&quot;&gt;RPC&lt;/h4&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;getUser(100)
&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;h3 data-ke-size=&quot;size23&quot;&gt;언제 RPC를 선택해야 할까?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RPC가 적합한 경우&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MSA 내부 통신&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 data-ke-size=&quot;size16&quot;&gt;REST가 적합한 경우&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;외부 API 제공&lt;/li&gt;
&lt;li&gt;브라우저 연동&lt;/li&gt;
&lt;li&gt;공개 서비스&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 포스팅은 여기까지입니다.&lt;/p&gt;</description>
      <category>네트워크/통신</category>
      <category>RPC</category>
      <author>letitkang</author>
      <guid isPermaLink="true">https://letitkang.tistory.com/395</guid>
      <comments>https://letitkang.tistory.com/entry/%ED%86%B5%EC%8B%A0-RPCRemote-Procedure-Call%EB%9E%80#entry395comment</comments>
      <pubDate>Thu, 18 Jun 2026 17:45:33 +0900</pubDate>
    </item>
    <item>
      <title>[일반] 온프레미스란?</title>
      <link>https://letitkang.tistory.com/entry/%EC%9D%BC%EB%B0%98-%EC%98%A8%ED%94%84%EB%A0%88%EB%AF%B8%EC%8A%A4%EB%9E%80</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 온프레미스(On-Premise)란? 쉽게 이해하는 개념 정리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;온프레미스 뜻과 정의&lt;/li&gt;
&lt;li&gt;클라우드와 무엇이 다른가?&lt;/li&gt;
&lt;li&gt;기업 내부 서버 운영 방식 이해하기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &amp;ldquo;온프레미스는 회사 내부에 직접 서버를 구축하고 운영하는 방식입니다.&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 왜 아직도 온프레미스를 사용할까? 핵심 특징 5가지&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기업 내부 데이터 직접 관리&lt;/li&gt;
&lt;li&gt;높은 보안성과 통제권&lt;/li&gt;
&lt;li&gt;폐쇄망 환경 운영 가능&lt;/li&gt;
&lt;li&gt;맞춤형 시스템 설계&lt;/li&gt;
&lt;li&gt;안정적인 네트워크 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &amp;ldquo;클라우드 시대인데도 금융권과 공공기관은 왜 온프레미스를 선호할까요?&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 온프레미스의 장점과 단점, 현실적으로 비교해보기&lt;/h2&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;/li&gt;
&lt;li&gt;커스터마이징 자유도 높음&lt;/li&gt;
&lt;li&gt;장기 운영 시 비용 절감 가능&lt;/li&gt;
&lt;/ul&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;/li&gt;
&lt;li&gt;서버/네트워크 직접 관리 필요&lt;/li&gt;
&lt;li&gt;장애 대응과 유지보수 부담&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &amp;ldquo;보안이 중요한 시스템일수록 온프레미스가 유리하지만, 운영 인력 부담은 커질 수 있습니다.&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 온프레미스 vs 클라우드, 무엇이 더 좋을까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Amazon Web Services, Microsoft Azure, Google Cloud 와 비교하며 이해하기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m1wXu/dJMcacQWHgc/rZGkxBNVviykLNZHCNhKw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m1wXu/dJMcacQWHgc/rZGkxBNVviykLNZHCNhKw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m1wXu/dJMcacQWHgc/rZGkxBNVviykLNZHCNhKw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm1wXu%2FdJMcacQWHgc%2FrZGkxBNVviykLNZHCNhKw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;515&quot; height=&quot;186&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &amp;ldquo;보안과 통제는 온프레미스, 빠른 확장성과 편의성은 클라우드가 강점입니다.&amp;rdquo;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 어떤 기업이 온프레미스를 선택할까? 실제 사례로 알아보기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;금융권: 개인정보 보호 및 규제 대응&lt;/li&gt;
&lt;li&gt;공공기관: 망분리 환경 운영&lt;/li&gt;
&lt;li&gt;제조업: 공장 내부 시스템&lt;/li&gt;
&lt;li&gt;방송/미디어: 대용량 영상 처리&lt;/li&gt;
&lt;li&gt;국방/재난망: 폐쇄망 기반 서비스&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &amp;ldquo;클라우드가 대세인 시대에도, 보안과 안정성이 중요한 곳에서는 온프레미스는 여전히 강력한 선택지입니다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 포스팅은 여기까지입니다&lt;/p&gt;</description>
      <category>컴퓨터/일반</category>
      <category>on-premiss</category>
      <category>온프레미스</category>
      <author>letitkang</author>
      <guid isPermaLink="true">https://letitkang.tistory.com/394</guid>
      <comments>https://letitkang.tistory.com/entry/%EC%9D%BC%EB%B0%98-%EC%98%A8%ED%94%84%EB%A0%88%EB%AF%B8%EC%8A%A4%EB%9E%80#entry394comment</comments>
      <pubDate>Fri, 12 Jun 2026 14:37:35 +0900</pubDate>
    </item>
    <item>
      <title>[Database] Redis Cache란?</title>
      <link>https://letitkang.tistory.com/entry/Database-Redis-Cache%EB%9E%80</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Redis Cache란 무엇인가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Redis Cache는 &lt;b&gt;자주 조회되는 데이터를 메모리에 저장해 빠르게 응답하는 기술&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Redis는 대표적인 &lt;b&gt;인메모리(In-Memory) 기반 NoSQL 데이터 저장소&lt;/b&gt;로, 데이터를 디스크가 아닌 &lt;b&gt;RAM(메모리)&lt;/b&gt; 에 저장하여 매우 빠른 읽기/쓰기 성능을 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 DB(MySQL, MariaDB 등)에 직접 반복 조회하면 성능 부담이 발생할 수 있는데, Redis Cache를 사용하면 DB 조회 횟수를 줄여 응답 속도를 개선할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;사용자 요청
   &amp;darr;
Redis Cache 확인
   &amp;darr;
데이터 존재 &amp;rarr; Redis 반환 (빠름)
데이터 없음 &amp;rarr; DB 조회 후 Redis 저장
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Redis Cache 동작 방식 (Cache Hit / Miss)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Redis Cache는 보통 다음 흐름으로 동작합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Cache Hit&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Redis에 데이터가 존재&lt;/li&gt;
&lt;li&gt;DB 조회 없이 즉시 반환&lt;/li&gt;
&lt;li&gt;응답 속도 매우 빠름&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Cache Miss&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Redis에 데이터가 없음&lt;/li&gt;
&lt;li&gt;DB 조회&lt;/li&gt;
&lt;li&gt;조회 결과를 Redis에 저장&lt;/li&gt;
&lt;li&gt;다음 요청부터 Redis 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시 흐름:&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;Client Request
      &amp;darr;
 Redis Cache 조회
   &amp;darr;        &amp;darr;
 Hit       Miss
 &amp;darr;           &amp;darr;
즉시 응답    DB 조회
              &amp;darr;
          Redis 저장
              &amp;darr;
            응답
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cache Hit 비율이 높을수록 시스템 성능이 좋아집니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Redis Cache의 주요 특징&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Redis Cache가 많이 사용되는 이유는 다음과 같습니다.&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;/li&gt;
&lt;li&gt;일반 DB보다 훨씬 빠른 응답&lt;/li&gt;
&lt;/ul&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;String&lt;/li&gt;
&lt;li&gt;List&lt;/li&gt;
&lt;li&gt;Hash&lt;/li&gt;
&lt;li&gt;Set&lt;/li&gt;
&lt;li&gt;Sorted Set&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;SET user:1001 &quot;Kim&quot;
GET user:1001
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;③ TTL(Time To Live) 지원&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;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;SET session:user01 login
EXPIRE session:user01 3600
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 1시간 후 자동 삭제&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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Redis Cache 사용 사례&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서는 다양한 영역에서 Redis Cache를 사용합니다.&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;h3 data-ke-size=&quot;size23&quot;&gt;API 응답 캐싱&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자주 호출되는 API 결과 저장&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;h3 data-ke-size=&quot;size23&quot;&gt;실시간 랭킹&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sorted Set 기반 랭킹 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&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;5. Redis Cache 적용 시 장점&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;427&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GdEil/dJMcadh1WFv/E6W5o9sTsHN1nRbuAS6hK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GdEil/dJMcadh1WFv/E6W5o9sTsHN1nRbuAS6hK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GdEil/dJMcadh1WFv/E6W5o9sTsHN1nRbuAS6hK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGdEil%2FdJMcadh1WFv%2FE6W5o9sTsHN1nRbuAS6hK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;427&quot; height=&quot;197&quot; data-origin-width=&quot;427&quot; data-origin-height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Before:
Client &amp;rarr; DB

After:
Client &amp;rarr; Redis &amp;rarr; DB
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분 요청이 Redis에서 처리되므로 시스템 성능이 크게 향상됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. Redis Cache 사용 시 주의사항&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;메모리 사용량 관리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Redis는 메모리 기반이므로 저장량 관리가 중요합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;TTL 설정 필요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무한 저장 시 메모리 부족 가능성이 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터 정합성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB 데이터 변경 시 Redis Cache 갱신 전략이 필요합니다.&lt;/p&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;Cache Aside Pattern&lt;/li&gt;
&lt;li&gt;Write Through&lt;/li&gt;
&lt;li&gt;Write Back&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서는 &lt;b&gt;Cache Aside Pattern&lt;/b&gt;을 가장 많이 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 포스팅은 여기까지하겠습니다.&lt;/p&gt;</description>
      <category>Database</category>
      <category>redis</category>
      <category>Redis Cache</category>
      <category>레디스 캐시</category>
      <author>letitkang</author>
      <guid isPermaLink="true">https://letitkang.tistory.com/393</guid>
      <comments>https://letitkang.tistory.com/entry/Database-Redis-Cache%EB%9E%80#entry393comment</comments>
      <pubDate>Tue, 9 Jun 2026 14:09:16 +0900</pubDate>
    </item>
    <item>
      <title>[기술] Bare Metal(베어메탈)이란?</title>
      <link>https://letitkang.tistory.com/entry/%EA%B8%B0%EC%88%A0-Bare-Metal%EB%B2%A0%EC%96%B4%EB%A9%94%ED%83%88%EC%9D%B4%EB%9E%80</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Bare Metal이란?&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/38yvA/dJMcadWwTf6/ew2auKjLdJb02fk70K3TSK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/38yvA/dJMcadWwTf6/ew2auKjLdJb02fk70K3TSK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/38yvA/dJMcadWwTf6/ew2auKjLdJb02fk70K3TSK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F38yvA%2FdJMcadWwTf6%2Few2auKjLdJb02fk70K3TSK%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;720&quot; height=&quot;410&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Bare Metal = 물리 서버에 OS를 직접 설치해서 사용하는 방식&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말하면:&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;중간에 가상화(VM) 없이 서버를 그대로 쓰는 것&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;[Application]
      &amp;darr;
     OS
      &amp;darr;
Physical Server
(CPU / RAM / Disk / NIC)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;&amp;ldquo;진짜 서버를 그대로 쓰는 방식&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Bare Metal vs VM 차이&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1DUmQ/dJMcaiQ4CSL/8uioMViNPJxx1bQa6t1rf0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1DUmQ/dJMcaiQ4CSL/8uioMViNPJxx1bQa6t1rf0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1DUmQ/dJMcaiQ4CSL/8uioMViNPJxx1bQa6t1rf0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1DUmQ%2FdJMcaiQ4CSL%2F8uioMViNPJxx1bQa6t1rf0%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;1280&quot; height=&quot;712&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Bare Metal 구조&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;APP
 &amp;darr;
OS
 &amp;darr;
Server
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;VM 구조&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;APP
 &amp;darr;
Guest OS
 &amp;darr;
Hypervisor
 &amp;darr;
Server
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설명:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bare Metal &amp;rarr; 빠름&lt;/li&gt;
&lt;li&gt;VM &amp;rarr; 관리 편함&lt;/li&gt;
&lt;li&gt;Container &amp;rarr; 배포 빠름&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Bare Metal 의 특징&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;605&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bteIcO/dJMcada6DNc/8o6KCcnlLGHTrZkFq3EEJk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bteIcO/dJMcada6DNc/8o6KCcnlLGHTrZkFq3EEJk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bteIcO/dJMcada6DNc/8o6KCcnlLGHTrZkFq3EEJk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbteIcO%2FdJMcada6DNc%2F8o6KCcnlLGHTrZkFq3EEJk%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;1280&quot; height=&quot;605&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;605&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;장점&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 성능 빠름&lt;br /&gt;- 지연시간(Latency) 낮음&lt;br /&gt;- 하드웨어 직접 사용 가능&lt;br /&gt;- 안정적&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;영상 스트리밍 서버&lt;/li&gt;
&lt;li&gt;통신 서버&lt;/li&gt;
&lt;li&gt;게임 서버&lt;/li&gt;
&lt;li&gt;DB 서버&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 어디에 사용할까?&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사용 사례&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;실시간 스트리밍 서버&lt;/li&gt;
&lt;li&gt;통신사 서버&lt;/li&gt;
&lt;li&gt;대용량 DB&lt;/li&gt;
&lt;li&gt;AI/GPU 서버&lt;/li&gt;
&lt;li&gt;금융 시스템&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당신처럼 네트워크/스트리밍 개발자라면:&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;실시간 패킷 처리와 저지연이 중요할 때 사용&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&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;5. Bare Metal은 누가 쓰나?&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;br /&gt;- 네트워크 속도 중요&lt;br /&gt;- VM 오버헤드 싫음&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;비추천&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버를 빠르게 많이 띄워야 함&lt;br /&gt;- 운영 자동화가 중요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;성능이 가장 중요하다면 아직도 Bare Metal은 강력한 선택이다.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상입니다.&lt;/p&gt;</description>
      <category>컴퓨터/기술</category>
      <category>가상화</category>
      <category>베어메탈</category>
      <author>letitkang</author>
      <guid isPermaLink="true">https://letitkang.tistory.com/392</guid>
      <comments>https://letitkang.tistory.com/entry/%EA%B8%B0%EC%88%A0-Bare-Metal%EB%B2%A0%EC%96%B4%EB%A9%94%ED%83%88%EC%9D%B4%EB%9E%80#entry392comment</comments>
      <pubDate>Thu, 4 Jun 2026 13:26:15 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스] eBPF란?</title>
      <link>https://letitkang.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-eBPF%EB%9E%80</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. eBPF란 무엇인가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;eBPF 는 &lt;b&gt;리눅스 커널 내부에서 안전하게 실행되는 가상 머신(VM) 기반 프로그램 기술&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말하면,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;커널 코드를 수정하거나 재부팅하지 않고도 커널 내부 동작을 관찰하거나 제어할 수 있는 기술&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이라고 이해하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에는 네트워크 패킷 처리나 시스템 추적을 하려면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;커널 모듈(Kernel Module) 개발&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 data-ke-size=&quot;size16&quot;&gt;같은 복잡한 과정이 필요했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 eBPF는 &lt;b&gt;유저 공간(User Space)에서 프로그램을 로드하여 커널 안에서 실행&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;커널 확장 기능을 안전하게 동적으로 붙이는 기술&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이라고 볼 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. eBPF의 동작 원리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;eBPF는 커널 내부에서 &lt;b&gt;이벤트 기반(Event Driven)&lt;/b&gt; 으로 동작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적인 Hook 지점은 다음과 같습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) 네트워크 패킷 처리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;패킷 수신&lt;/li&gt;
&lt;li&gt;패킷 필터링&lt;/li&gt;
&lt;li&gt;트래픽 분석&lt;/li&gt;
&lt;li&gt;로드 밸런싱&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 시스템 콜 추적&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&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;connect()&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) 프로세스 모니터링&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU 사용량&lt;/li&gt;
&lt;li&gt;메모리 사용량&lt;/li&gt;
&lt;li&gt;스케줄링 추적&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;동작 흐름&lt;/h3&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;User Program
      &amp;darr;
eBPF Program 작성 (C)
      &amp;darr;
LLVM/Clang 컴파일
      &amp;darr;
BPF Bytecode 생성
      &amp;darr;
Kernel Verifier 검사
      &amp;darr;
JIT Compiler 최적화
      &amp;darr;
Kernel 내부 실행
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 &lt;b&gt;Verifier&lt;/b&gt; 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커널 크래시를 막기 위해 다음을 검사합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;무한 루프 금지&lt;/li&gt;
&lt;li&gt;메모리 접근 검증&lt;/li&gt;
&lt;li&gt;권한 검사&lt;/li&gt;
&lt;li&gt;안전성 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커널 안에서 실행되지만 안전성이 검증된 코드만 실행된다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;는 점이 특징입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. eBPF 구조 이해하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;eBPF는 크게 3가지 요소로 구성됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;823&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UplRo/dJMb990QZdi/8e9x7PHSEorTaCDDo8lnD0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UplRo/dJMb990QZdi/8e9x7PHSEorTaCDDo8lnD0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UplRo/dJMb990QZdi/8e9x7PHSEorTaCDDo8lnD0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUplRo%2FdJMb990QZdi%2F8e9x7PHSEorTaCDDo8lnD0%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;653&quot; height=&quot;823&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;823&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) eBPF Program&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;C 언어&lt;/b&gt;로 작성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;SEC(&quot;xdp&quot;)
int xdp_drop(struct xdp_md *ctx)
{
    return XDP_DROP;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패킷을 Drop 하는 간단한 예제입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) BPF Map&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;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;고속 HashMap&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Session 정보 저장&lt;/li&gt;
&lt;li&gt;IP 차단 목록&lt;/li&gt;
&lt;li&gt;패킷 카운트&lt;/li&gt;
&lt;li&gt;통계 데이터&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제:&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;BPF_HASH(ip_count, u32, u64);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당신이 Redis Session Table 쓰는 개념과 유사하게 보면 이해가 쉽습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) Hook Point&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;eBPF 프로그램이 연결되는 지점입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1MQ49/dJMcacpI1I7/GM8QuW7E8bnK91mjBKz0Jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1MQ49/dJMcacpI1I7/GM8QuW7E8bnK91mjBKz0Jk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1MQ49/dJMcacpI1I7/GM8QuW7E8bnK91mjBKz0Jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1MQ49%2FdJMcacpI1I7%2FGM8QuW7E8bnK91mjBKz0Jk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;498&quot; height=&quot;270&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. eBPF의 장점&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) 매우 높은 성능&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;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;NIC
 &amp;darr;
Kernel
 &amp;darr;
eBPF 처리
 &amp;darr;
User Space 미진입
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저 공간 Context Switch가 줄어듭니다.&lt;/p&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;저지연(Low Latency)&lt;/li&gt;
&lt;li&gt;고성능(High Throughput)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구현이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 DDoS 방어, 패킷 필터링에서 강력합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 커널 수정 불필요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 방식:&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;Kernel Patch
&amp;rarr; Rebuild
&amp;rarr; Reboot
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;eBPF 방식:&lt;/p&gt;
&lt;pre class=&quot;coq&quot;&gt;&lt;code&gt;Program Load
&amp;rarr; 즉시 반영
&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;h3 data-ke-size=&quot;size23&quot;&gt;3) Observability 강화&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;bcc&lt;/li&gt;
&lt;li&gt;bpftrace&lt;/li&gt;
&lt;li&gt;perf&lt;/li&gt;
&lt;li&gt;bpftool&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU 사용량 분석&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;execsnoop
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TCP 연결 추적&lt;/p&gt;
&lt;pre class=&quot;autoit&quot;&gt;&lt;code&gt;tcpconnect
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. eBPF 활용 사례&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;853&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btKD7K/dJMcajoJVhy/hNJLUWAX1TDQIHVuJPpZWK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btKD7K/dJMcajoJVhy/hNJLUWAX1TDQIHVuJPpZWK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btKD7K/dJMcajoJVhy/hNJLUWAX1TDQIHVuJPpZWK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtKD7K%2FdJMcajoJVhy%2FhNJLUWAX1TDQIHVuJPpZWK%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;1280&quot; height=&quot;853&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;853&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;853&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F0mxw/dJMcad296fB/aE8AlCwFRxZ8zayT7bRvY1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F0mxw/dJMcad296fB/aE8AlCwFRxZ8zayT7bRvY1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F0mxw/dJMcad296fB/aE8AlCwFRxZ8zayT7bRvY1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF0mxw%2FdJMcad296fB%2FaE8AlCwFRxZ8zayT7bRvY1%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;1280&quot; height=&quot;853&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;853&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J0QH5/dJMcafUhTQE/VoxPAnkzwz6AAwY6nBBjtK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J0QH5/dJMcafUhTQE/VoxPAnkzwz6AAwY6nBBjtK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J0QH5/dJMcafUhTQE/VoxPAnkzwz6AAwY6nBBjtK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ0QH5%2FdJMcafUhTQE%2FVoxPAnkzwz6AAwY6nBBjtK%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;1280&quot; height=&quot;456&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;456&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;방화벽 대체 기술로 사용됩니다.&lt;/p&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;IP 차단&lt;/li&gt;
&lt;li&gt;ACL&lt;/li&gt;
&lt;li&gt;DPI 일부&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표 사례:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cilium, Kubernetes 환경에서 eBPF 기반 네트워크 구현.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 고성능 로드 밸런서&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;L4 Load Balancer&lt;/li&gt;
&lt;li&gt;NAT&lt;/li&gt;
&lt;li&gt;Fast Routing&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) 보안 모니터링&lt;/h3&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;/li&gt;
&lt;li&gt;권한 상승&lt;/li&gt;
&lt;li&gt;이상 프로세스&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) 성능 분석(APM)&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;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;biolatency
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스크 I/O 지연 측정&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. eBPF의 한계/실무&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점이 많지만 단점도 존재합니다.&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;필요 지식:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Linux Kernel&lt;/li&gt;
&lt;li&gt;Network Stack&lt;/li&gt;
&lt;li&gt;C 언어&lt;/li&gt;
&lt;li&gt;Kernel Memory&lt;/li&gt;
&lt;li&gt;LLVM&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초보자가 접근하기 쉽지 않습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) Debugging 어려움&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 프로그램처럼 디버깅이 쉽지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Verifier 오류가 자주 발생합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;invalid memory access
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) 커널 버전 의존성&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;XDP&lt;/li&gt;
&lt;li&gt;CO-RE&lt;/li&gt;
&lt;li&gt;BTF&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;eBPF는 단순한 패킷 필터 기술이 아닙니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;리눅스 커널을 프로그래밍 가능한 플랫폼으로 바꾸는 기술&quot;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;고성능 네트워크&lt;/li&gt;
&lt;li&gt;실시간 모니터링&lt;/li&gt;
&lt;li&gt;보안&lt;/li&gt;
&lt;li&gt;Cloud Native&lt;/li&gt;
&lt;li&gt;DDoS 방어&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 포스팅은 여기까지하겠습니다.&lt;/p&gt;</description>
      <category>운영체제/리눅스</category>
      <category>ebpf</category>
      <author>letitkang</author>
      <guid isPermaLink="true">https://letitkang.tistory.com/391</guid>
      <comments>https://letitkang.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-eBPF%EB%9E%80#entry391comment</comments>
      <pubDate>Tue, 26 May 2026 12:01:46 +0900</pubDate>
    </item>
    <item>
      <title>[WEB] 네트워크 쿠키란?</title>
      <link>https://letitkang.tistory.com/entry/WEB-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%BF%A0%ED%82%A4%EB%9E%80</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 쿠키(Cookie)란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠키(Cookie)는 웹 브라우저에 저장되는 &lt;b&gt;작은 데이터 파일&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 HTTP 는 &lt;b&gt;Stateless(무상태)&lt;/b&gt; 프로토콜이기 때문에 서버는 사용자의 이전 요청을 기억하지 못합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 사용자가 로그인한 후 다른 페이지로 이동하면 서버는 같은 사용자인지 알 수 없습니다. 이를 해결하기 위해 사용하는 기술이 &lt;b&gt;쿠키(Cookie)&lt;/b&gt; 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠키는 로그인 상태 유지, 장바구니 저장, 사용자 설정 저장 등에 사용됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;260&quot; data-origin-height=&quot;55&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8P9As/dJMcaarQWF7/z9ljRCdd3RK6hP4Cf2ttd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8P9As/dJMcaarQWF7/z9ljRCdd3RK6hP4Cf2ttd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8P9As/dJMcaarQWF7/z9ljRCdd3RK6hP4Cf2ttd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8P9As%2FdJMcaarQWF7%2Fz9ljRCdd3RK6hP4Cf2ttd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;260&quot; height=&quot;55&quot; data-origin-width=&quot;260&quot; data-origin-height=&quot;55&quot;/&gt;&lt;/span&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;2. 쿠키 동작 방식&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠키는 HTTP Header를 통해 전달됩니다.&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;routeros&quot;&gt;&lt;code&gt;Set-Cookie: SESSION_ID=ABC123
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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;ini&quot;&gt;&lt;code&gt;SESSION_ID=ABC123
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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;routeros&quot;&gt;&lt;code&gt;Cookie: SESSION_ID=ABC123
&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;3. 쿠키 종류&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;세션 쿠키(Session Cookie)&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로그인 세션 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;영구 쿠키(Persistent Cookie)&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자동 로그인&lt;/li&gt;
&lt;li&gt;다크모드 설정 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Set-Cookie: theme=dark; Max-Age=3600
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 쿠키 보안 설정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠키는 편리하지만 보안 위험이 존재합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Secure&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTPS에서만 전송&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;Secure
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;HttpOnly&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JavaScript 접근 차단&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;HttpOnly
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XSS 공격 방어에 유용합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SameSite&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSRF 공격 방지&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;SameSite=Lax
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근에는 Lax 또는 Strict 사용이 권장됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 쿠키 vs 세션 vs JWT&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서는 쿠키만 단독으로 사용하지 않습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OjDxC/dJMcabxtZz4/8bMjhYqf37g2azZbtOlew0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OjDxC/dJMcabxtZz4/8bMjhYqf37g2azZbtOlew0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OjDxC/dJMcabxtZz4/8bMjhYqf37g2azZbtOlew0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOjDxC%2FdJMcabxtZz4%2F8bMjhYqf37g2azZbtOlew0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;389&quot; height=&quot;144&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;144&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 로그인 시:&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;로그인
&amp;rarr; Session 생성
&amp;rarr; SessionID를 Cookie 저장
&amp;rarr; 이후 요청마다 자동 전달
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대규모 서비스에서는 세션을 메모리 대신 Redis에 저장하여 여러 서버에서 공유하기도 합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠키(Cookie)는 웹에서 &lt;b&gt;사용자 상태를 유지하기 위한 핵심 기술&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP의 Stateless 특징을 보완하며 로그인 유지, 사용자 설정 저장 등에 활용됩니다.&lt;/p&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;Secure&lt;/li&gt;
&lt;li&gt;HttpOnly&lt;/li&gt;
&lt;li&gt;SameSite&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 포스팅은 여기까지입니다.&lt;/p&gt;</description>
      <category>보안/Web</category>
      <category>Cookie</category>
      <category>쿠키</category>
      <author>letitkang</author>
      <guid isPermaLink="true">https://letitkang.tistory.com/390</guid>
      <comments>https://letitkang.tistory.com/entry/WEB-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%BF%A0%ED%82%A4%EB%9E%80#entry390comment</comments>
      <pubDate>Wed, 20 May 2026 15:47:31 +0900</pubDate>
    </item>
    <item>
      <title>[이론] Dynamic Jitter란?</title>
      <link>https://letitkang.tistory.com/entry/%EC%9D%B4%EB%A1%A0-Dynamic-Jitter%EB%9E%80</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;실시간 음성/영상 통신 시스템에서는 네트워크 품질이 매우 중요합니다.&lt;br /&gt;그중에서도 &lt;b&gt;Dynamic Jitter(다이나믹 지터)&lt;/b&gt; 는 VoIP, RTP, WebRTC, 스트리밍 서비스에서 반드시 고려해야 하는 핵심 요소입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Jitter란 무엇인가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Jitter(지터)는 패킷이 일정하지 않은 시간 간격으로 도착하는 현상을 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 음성 패킷이 원래 20ms 간격으로 도착해야 하지만:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떤 패킷은 10ms 만에 도착&lt;/li&gt;
&lt;li&gt;어떤 패킷은 40ms 후 도착&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처럼 시간 편차가 발생하면 이를 지터라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지터가 심해지면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;음성 끊김&lt;/li&gt;
&lt;li&gt;로봇음&lt;/li&gt;
&lt;li&gt;영상 깨짐&lt;/li&gt;
&lt;li&gt;지연 증가&lt;/li&gt;
&lt;/ul&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;2. Dynamic Jitter의 의미&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dynamic Jitter는 네트워크 상태 변화에 따라 지터 값이 실시간으로 계속 변하는 현상입니다.&lt;/p&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;/li&gt;
&lt;li&gt;LTE/5G 무선 품질 변화&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 data-ke-size=&quot;size16&quot;&gt;특히 무선망 환경에서는 지터가 지속적으로 변하기 때문에 &amp;ldquo;Dynamic&amp;rdquo;이라는 표현을 사용합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. RTP와 Dynamic Jitter&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RTP(Real-time Transport Protocol)에서는 지터 계산이 매우 중요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RFC3550에서는 다음과 같은 방식으로 지터를 계산합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;149&quot; data-origin-height=&quot;49&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Fqmaf/dJMcad20W78/LkzwTmoJPncpbrb0XIKzrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Fqmaf/dJMcad20W78/LkzwTmoJPncpbrb0XIKzrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Fqmaf/dJMcad20W78/LkzwTmoJPncpbrb0XIKzrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFqmaf%2FdJMcad20W78%2FLkzwTmoJPncpbrb0XIKzrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;149&quot; height=&quot;49&quot; data-origin-width=&quot;149&quot; data-origin-height=&quot;49&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 계산값은 RTCP 통계를 통해 품질 분석에 활용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 VoIP 및 영상통화 시스템에서는 이 값을 기준으로 네트워크 상태를 판단합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Dynamic Jitter Buffer란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지터를 완화하기 위해 사용하는 기술이 &lt;b&gt;Dynamic Jitter Buffer&lt;/b&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;특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네트워크 안정 시 &amp;rarr; 버퍼 축소&lt;/li&gt;
&lt;li&gt;네트워크 불안정 시 &amp;rarr; 버퍼 확대&lt;/li&gt;
&lt;/ul&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;5. Dynamic Jitter 측정 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서는 다음과 같은 도구로 지터를 측정합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ping&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;ping 192.168.0.10
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RTT 편차 확인 가능&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;iperf3&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;iperf3 -u -c 192.168.0.10
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UDP 기반 지터 측정 가능&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Wireshark&lt;/h3&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;Telephony &amp;rarr; RTP &amp;rarr; RTP Streams
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RTP 지터 및 패킷 손실 분석 가능&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dynamic Jitter는 실시간 통신에서 발생하는 패킷 지연 편차이며, 현대의 음성&amp;middot;영상 서비스 품질에 직접적인 영향을 미칩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;VoIP&lt;/li&gt;
&lt;li&gt;WebRTC&lt;/li&gt;
&lt;li&gt;MCPTT&lt;/li&gt;
&lt;li&gt;재난안전통신망&lt;/li&gt;
&lt;li&gt;RTP 스트리밍&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 시스템에서는 Adaptive Jitter Buffer와 RTP 지터 분석 기술이 매우 중요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서는 지터를 완전히 제거하기보다 사용자가 체감하지 못하도록 최소화하는 것이 핵심 목표입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 포스팅은 여기까지하겠습니다&lt;/p&gt;</description>
      <category>네트워크/이론</category>
      <category>dynamic jitter</category>
      <category>jitter</category>
      <author>letitkang</author>
      <guid isPermaLink="true">https://letitkang.tistory.com/389</guid>
      <comments>https://letitkang.tistory.com/entry/%EC%9D%B4%EB%A1%A0-Dynamic-Jitter%EB%9E%80#entry389comment</comments>
      <pubDate>Wed, 13 May 2026 12:25:55 +0900</pubDate>
    </item>
    <item>
      <title>[Database] ORM(Object-Relational Mapping)이란?</title>
      <link>https://letitkang.tistory.com/entry/Database-ORMObject-Relational-Mapping%EC%9D%B4%EB%9E%80</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. ORM이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ORM(Object-Relational Mapping)은 &lt;b&gt;객체(Object)와 관계형 데이터베이스(Relational Database)의 데이터를 자동으로 매핑해주는 기술&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말하면,&lt;br /&gt;SQL을 직접 작성하지 않고 &lt;b&gt;객체를 통해 데이터베이스를 다루는 방식&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;// SQL 방식
SELECT * FROM user WHERE id = 1;

// ORM 방식 (JPA)
User user = userRepository.findById(1);
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 왜 ORM을 사용할까?&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) 생산성 향상&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SQL을 직접 작성하지 않아도 됨&lt;/li&gt;
&lt;li&gt;CRUD 자동 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 유지보수 용이&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테이블 &amp;rarr; 객체로 관리&lt;/li&gt;
&lt;li&gt;코드 중심 개발 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) DB 독립성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MySQL &amp;rarr; MariaDB &amp;rarr; PostgreSQL 변경 시 영향 최소화&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. ORM의 동작 구조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ORM은 내부적으로 다음과 같이 동작합니다:&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;[Java 객체]  &amp;lt;-&amp;gt;  [ORM Framework]  &amp;lt;-&amp;gt;  [SQL]  &amp;lt;-&amp;gt;  [DB]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자는 객체만 다루고,&lt;br /&gt;ORM이 SQL을 자동 생성해서 DB에 전달합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 대표적인 ORM 기술&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Java&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JPA (Java Persistence API)&lt;/li&gt;
&lt;li&gt;Hibernate&lt;/li&gt;
&lt;li&gt;MyBatis (엄밀히는 SQL Mapper)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Python&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SQLAlchemy&lt;/li&gt;
&lt;li&gt;Django ORM&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Node.js&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TypeORM&lt;/li&gt;
&lt;li&gt;Sequelize&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. JPA 기준 핵심 개념&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) Entity&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB 테이블과 매핑되는 클래스&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;@Entity
public class User {
    @Id
    private Long id;
    private String name;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) Repository&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 접근 계층&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;public interface UserRepository extends JpaRepository&amp;lt;User, Long&amp;gt; {
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) 영속성 컨텍스트 (Persistence Context)&lt;/h3&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;1차 캐시 역할 수행&lt;/li&gt;
&lt;/ul&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;/li&gt;
&lt;li&gt;변경 감지 (Dirty Checking)&lt;/li&gt;
&lt;li&gt;쓰기 지연 (Write-behind)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) Dirty Checking (변경 감지)&lt;/h3&gt;
&lt;pre class=&quot;pf&quot;&gt;&lt;code&gt;user.setName(&quot;newName&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 별도 update SQL 없이 자동 반영됨&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. ORM의 장점&lt;/h2&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;반복적인 SQL 제거&lt;/li&gt;
&lt;/ul&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;/li&gt;
&lt;/ul&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;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. ORM의 단점&lt;/h2&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;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;-SQL 튜닝 어려움&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자동 생성 SQL 제어 어려움&lt;/li&gt;
&lt;/ul&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;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. N+1 문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;List&amp;lt;User&amp;gt; users = userRepository.findAll();
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 각 user마다 추가 쿼리 발생&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;Fetch Join&lt;/li&gt;
&lt;li&gt;EntityGraph&lt;/li&gt;
&lt;li&gt;Batch Size 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. Lazy Loading vs Eager Loading&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Lazy (지연 로딩)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 사용할 때 조회&lt;/li&gt;
&lt;li&gt;성능 최적화에 유리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Eager (즉시 로딩)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;처음부터 같이 조회&lt;/li&gt;
&lt;li&gt;단순하지만 비효율 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10. ORM vs SQL 직접 사용&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctjdcE/dJMcagyB0Js/b1kKmROiZfjtifWjynnXx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctjdcE/dJMcagyB0Js/b1kKmROiZfjtifWjynnXx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctjdcE/dJMcagyB0Js/b1kKmROiZfjtifWjynnXx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctjdcE%2FdJMcagyB0Js%2Fb1kKmROiZfjtifWjynnXx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;492&quot; height=&quot;187&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;187&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;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;기본 CRUD &amp;rarr; ORM&lt;/li&gt;
&lt;li&gt;복잡 쿼리 &amp;rarr; SQL&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;11. 실무 사용 전략 (중요)&lt;/h2&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;CRUD &amp;rarr; JPA&lt;/li&gt;
&lt;li&gt;복잡 조회 &amp;rarr; MyBatis or Native Query&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;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;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;12. ORM 사용 시 주의사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;무조건 ORM 쓰지 말 것&lt;/li&gt;
&lt;li&gt;SQL 실행 로그 반드시 확인&lt;/li&gt;
&lt;li&gt;인덱스 전략 고려&lt;/li&gt;
&lt;li&gt;트랜잭션 범위 명확히 설정&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Database</category>
      <category>ORM</category>
      <author>letitkang</author>
      <guid isPermaLink="true">https://letitkang.tistory.com/388</guid>
      <comments>https://letitkang.tistory.com/entry/Database-ORMObject-Relational-Mapping%EC%9D%B4%EB%9E%80#entry388comment</comments>
      <pubDate>Wed, 6 May 2026 10:16:59 +0900</pubDate>
    </item>
    <item>
      <title>[Mysql] Mroonga란?</title>
      <link>https://letitkang.tistory.com/entry/Mysql-Mroonga%EB%9E%80</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;데이터가 많아질수록 MariaDB에서 문자열 검색 속도는 점점 느려집니다. 특히 아래와 같은 SQL은 운영 환경에서 병목이 자주 발생합니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT * FROM users WHERE name LIKE '%홍길동%';
SELECT * FROM logs WHERE message LIKE '%timeout%';
SELECT * FROM calls WHERE memo LIKE '%긴급%';
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 &lt;b&gt;앞뒤 와일드카드(%keyword%) 검색&lt;/b&gt;은 일반 인덱스를 거의 활용하지 못하기 때문에 대량 데이터에서는 매우 느려질 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제를 해결하는 대표적인 선택지 중 하나가 바로 &lt;b&gt;Mroonga&lt;/b&gt; 입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 style=&quot;font-size: 30px; margin-top: 45px;&quot;&gt;1. Mroonga란?&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mroonga는 MariaDB / MySQL에서 사용할 수 있는 &lt;b&gt;고속 전문검색(Full Text Search) 엔진&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #666666; letter-spacing: 0px; font-family: 'Noto Serif KR', serif; text-align: center;&quot;&gt;&quot;MariaDB 내부에서 빠른 문자열 검색 기능을 제공하는 검색 특화 엔진입니다.&quot;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 RDBMS는 숫자, 날짜, 정확 일치 검색에는 강하지만 문자열 포함 검색에는 약합니다. Mroonga는 이 부분을 크게 개선해 줍니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 style=&quot;font-size: 30px; margin-top: 45px;&quot;&gt;2. 왜 필요한가?&lt;/h1&gt;
&lt;h2 style=&quot;font-size: 26px; margin-top: 28px;&quot; data-ke-size=&quot;size26&quot;&gt;일반 인덱스의 한계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 SQL은 인덱스를 사용할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;WHERE name LIKE 'kim%'
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 아래 SQL은 인덱스를 거의 활용하지 못합니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;WHERE name LIKE '%kim%'
&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;/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 data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 style=&quot;font-size: 30px; margin-top: 45px;&quot;&gt;3. Mroonga의 핵심 장점&lt;/h1&gt;
&lt;h2 style=&quot;font-size: 24px; margin-top: 28px;&quot; data-ke-size=&quot;size26&quot;&gt;1) 매우 빠른 문자열 검색&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대량 데이터에서 LIKE 검색 대비 큰 성능 향상을 기대할 수 있습니다.&lt;/p&gt;
&lt;h2 style=&quot;font-size: 24px; margin-top: 28px;&quot; data-ke-size=&quot;size26&quot;&gt;2) 한글 검색에 유리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한국어, 일본어, 중국어 등 CJK 언어 처리에 강점이 있습니다.&lt;/p&gt;
&lt;h2 style=&quot;font-size: 24px; margin-top: 28px;&quot; data-ke-size=&quot;size26&quot;&gt;3) 전문검색 가능&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시판, 문서, 로그, 메모 검색에 적합합니다.&lt;/p&gt;
&lt;h2 style=&quot;font-size: 24px; margin-top: 28px;&quot; data-ke-size=&quot;size26&quot;&gt;4) DB 내부에서 사용 가능&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;별도 검색 서버 없이 DB 내부에서 처리 가능합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 style=&quot;font-size: 30px; margin-top: 45px;&quot;&gt;4. 어떤 시스템에 적합할까?&lt;/h1&gt;
&lt;h2 style=&quot;font-size: 24px; margin-top: 28px;&quot; data-ke-size=&quot;size26&quot;&gt;*회원 검색 시스템&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이름, 이메일, 주소, 메모 검색&lt;/p&gt;
&lt;h2 style=&quot;font-size: 24px; margin-top: 28px;&quot; data-ke-size=&quot;size26&quot;&gt;*로그 검색 시스템&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;timeout, error, fail 등의 메시지 검색&lt;/p&gt;
&lt;h2 style=&quot;font-size: 24px; margin-top: 28px;&quot; data-ke-size=&quot;size26&quot;&gt;*통신/콜 이력 검색&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상담 메모, 이벤트 로그, 통화 기록 검색&lt;/p&gt;
&lt;h2 style=&quot;font-size: 24px; margin-top: 28px;&quot; data-ke-size=&quot;size26&quot;&gt;*게시판 검색&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제목 + 본문 검색&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 style=&quot;font-size: 30px; margin-top: 45px;&quot;&gt;5. 설치 예시&lt;/h1&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;yum install mariadb-mroonga
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MariaDB 버전에 따라 별도 저장소 설정이 필요할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 style=&quot;font-size: 30px; margin-top: 45px;&quot;&gt;6. 테이블 생성 예시&lt;/h1&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CREATE TABLE articles (
  id INT AUTO_INCREMENT PRIMARY KEY,
  title TEXT,
  body TEXT
) ENGINE=Mroonga;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 style=&quot;font-size: 30px; margin-top: 45px;&quot;&gt;7. 검색 예시&lt;/h1&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT * FROM articles
WHERE MATCH(title, body)
AGAINST('재난 통신');
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 LIKE 검색보다 훨씬 효율적인 전문검색이 가능합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 style=&quot;font-size: 30px; margin-top: 45px;&quot;&gt;8. InnoDB와 비교&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반 업무 처리 / 트랜잭션 : InnoDB 강점&lt;/li&gt;
&lt;li&gt;문자열 검색 / 전문검색 : Mroonga 강점&lt;/li&gt;
&lt;li&gt;실무에서는 혼합 사용 추천&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 style=&quot;font-size: 30px; margin-top: 45px;&quot;&gt;9. 추천 구조&lt;/h1&gt;
&lt;h2 style=&quot;font-size: 24px; margin-top: 28px;&quot; data-ke-size=&quot;size26&quot;&gt;업무 데이터&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;회원&lt;/li&gt;
&lt;li&gt;주문&lt;/li&gt;
&lt;li&gt;결제&lt;/li&gt;
&lt;li&gt;세션&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-&amp;gt;InnoDB 사용&lt;/b&gt;&lt;/p&gt;
&lt;h2 style=&quot;font-size: 24px; margin-top: 28px;&quot; data-ke-size=&quot;size26&quot;&gt;검색 전용 데이터&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;게시글 검색&lt;/li&gt;
&lt;li&gt;로그 검색&lt;/li&gt;
&lt;li&gt;메모 검색&lt;/li&gt;
&lt;li&gt;이력 검색&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-&amp;gt;Mroonga 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 포스팅은 여기까지입니다.&lt;/p&gt;</description>
      <category>Database/Mysql</category>
      <category>Mroonga</category>
      <author>letitkang</author>
      <guid isPermaLink="true">https://letitkang.tistory.com/387</guid>
      <comments>https://letitkang.tistory.com/entry/Mysql-Mroonga%EB%9E%80#entry387comment</comments>
      <pubDate>Tue, 28 Apr 2026 15:44:20 +0900</pubDate>
    </item>
  </channel>
</rss>