<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Advanced Beginner</title><link>https://advanced-beginner.github.io/ko/</link><description>Recent content on Advanced Beginner</description><generator>Hugo</generator><language>ko-KR</language><managingEditor>d8lzz1gpw@mozmail.com (kimbenji)</managingEditor><webMaster>d8lzz1gpw@mozmail.com (kimbenji)</webMaster><atom:link href="https://advanced-beginner.github.io/ko/index.xml" rel="self" type="application/rss+xml"/><item><title>전략적 설계</title><link>https://advanced-beginner.github.io/ko/docs/ddd/concepts/strategic-design/</link><pubDate>Mon, 16 Feb 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/ddd/concepts/strategic-design/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: DDD의 큰 그림을 이해하고 싶은 아키텍트 및 시니어 개발자
&lt;strong&gt;선수 지식&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/ddd/quick-start/"&gt;Quick Start&lt;/a&gt;를 읽었거나 DDD 기본 개념에 대한 이해
&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 30분
&lt;strong&gt;핵심 질문&lt;/strong&gt;: &amp;ldquo;시스템을 어떻게 나누고, 각 부분이 어떻게 협력해야 하는가?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;요약&lt;/strong&gt;&lt;br&gt;전략적 설계의 4가지 핵심 개념: &lt;strong&gt;Subdomain&lt;/strong&gt;(비즈니스 영역 분류) → &lt;strong&gt;Ubiquitous Language&lt;/strong&gt;(공통 언어 정의) → &lt;strong&gt;Bounded Context&lt;/strong&gt;(모델 경계 설정) → &lt;strong&gt;Context Mapping&lt;/strong&gt;(경계 간 협력 방식 정의)
&lt;/blockquote&gt;

&lt;p&gt;복잡한 도메인을 어떻게 나누고 통합할지 결정하는 고수준 설계가 바로 전략적 설계입니다. 이는 DDD의 출발점이자 전체 시스템 아키텍처를 결정하는 핵심 활동입니다.&lt;/p&gt;</description></item><item><title>Implicit/Given 디버깅</title><link>https://advanced-beginner.github.io/ko/docs/scala/howto/implicit-debugging/</link><pubDate>Fri, 16 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/howto/implicit-debugging/</guid><description>&lt;p&gt;컴파일러가 암시적 값을 찾지 못할 때 원인을 진단하고 해결하는 방법을 안내합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 10-15분&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Scala 2&lt;/strong&gt;: &lt;code&gt;-Xlog-implicits&lt;/code&gt; 플래그로 검색 과정 확인&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scala 3&lt;/strong&gt;: 컴파일러 메시지가 더 명확하며, &lt;code&gt;import&lt;/code&gt; 제안도 제공&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;공통&lt;/strong&gt;: 스코프에 암시적 값이 있는지, 타입이 정확히 일치하는지 확인&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;hr&gt;
&lt;h2 id="이-가이드가-해결하는-문제"&gt;이 가이드가 해결하는 문제&lt;a class="anchor" href="#%ec%9d%b4-%ea%b0%80%ec%9d%b4%eb%93%9c%ea%b0%80-%ed%95%b4%ea%b2%b0%ed%95%98%eb%8a%94-%eb%ac%b8%ec%a0%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음과 같은 컴파일 에러가 발생할 때 이 가이드를 사용하세요:&lt;/p&gt;
&lt;div class="book-tabs"&gt;
&lt;input type="radio" class="toggle" name="tabs-1" id="tabs-1-0" checked="checked" /&gt;&lt;label for="tabs-1-0"&gt;Scala 2&lt;/label&gt;&lt;div class="book-tabs-content markdown-inner"&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;could not find implicit value for parameter ord: Ordering[MyClass]&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;또는&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ambiguous implicit values&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;input type="radio" class="toggle" name="tabs-1" id="tabs-1-1" /&gt;&lt;label for="tabs-1-1"&gt;Scala 3&lt;/label&gt;&lt;div class="book-tabs-content markdown-inner"&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;No given instance of type Ordering[MyClass] was found&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;또는&lt;/p&gt;</description></item><item><title>OutOfMemoryError 해결하기</title><link>https://advanced-beginner.github.io/ko/docs/spark/howto/oom-troubleshooting/</link><pubDate>Fri, 16 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/spark/howto/oom-troubleshooting/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;예상 소요 시간&lt;/strong&gt;: 약 15분
&lt;/blockquote&gt;

&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Driver OOM&lt;/strong&gt;: &lt;code&gt;collect()&lt;/code&gt; 결과 크기 줄이기, &lt;code&gt;spark.driver.memory&lt;/code&gt; 증가&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Executor OOM&lt;/strong&gt;: 파티션 수 증가 (&lt;code&gt;repartition&lt;/code&gt;), &lt;code&gt;spark.executor.memory&lt;/code&gt; 증가&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;진단 우선&lt;/strong&gt;: Spark UI에서 어디서 OOM이 발생하는지 먼저 확인&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h2 id="문제-정의"&gt;문제 정의&lt;a class="anchor" href="#%eb%ac%b8%ec%a0%9c-%ec%a0%95%ec%9d%98"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Spark 애플리케이션 실행 중 다음과 같은 오류가 발생합니다:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;java.lang.OutOfMemoryError: Java heap space&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;또는:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Container killed by YARN for exceeding memory limits&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;이 가이드에서는 OOM 오류의 원인을 진단하고 해결하는 방법을 단계별로 설명합니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="전제-조건"&gt;전제 조건&lt;a class="anchor" href="#%ec%a0%84%ec%a0%9c-%ec%a1%b0%ea%b1%b4"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;항목&lt;/th&gt;
 &lt;th&gt;요구 사항&lt;/th&gt;
 &lt;th&gt;확인 방법&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Spark 버전&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;2.4 이상 (3.x 권장)&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;spark-submit --version&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Java 버전&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;8, 11, 또는 17&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;java -version&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Spark UI&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;접근 가능&lt;/td&gt;
 &lt;td&gt;브라우저에서 &lt;code&gt;http://localhost:4040&lt;/code&gt; 열기&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;권한&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Spark 설정 변경 가능&lt;/td&gt;
 &lt;td&gt;spark-submit 실행 권한 확인&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;지원 환경&lt;/strong&gt;: Linux, macOS, Windows (WSL2 권장)&lt;/p&gt;</description></item><item><title>Pod 트러블슈팅</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/howto/pod-troubleshooting/</link><pubDate>Fri, 16 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/howto/pod-troubleshooting/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;목표&lt;/strong&gt;: Pod가 정상적으로 시작되지 않거나 비정상 종료될 때 원인을 파악하고 해결합니다
&lt;strong&gt;예상 시간&lt;/strong&gt;: 30분&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;이 가이드의 범위&lt;/strong&gt;&lt;br&gt;&lt;p&gt;&lt;strong&gt;다루는 내용&lt;/strong&gt;: Pod 시작 실패, CrashLoopBackOff, ImagePullBackOff, Readiness 실패&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;다루지 않는 내용&lt;/strong&gt;: 네트워크 연결 문제(&lt;a href="network-troubleshooting/"&gt;네트워크 트러블슈팅&lt;/a&gt; 참조), 리소스 부족으로 인한 성능 저하(&lt;a href="resource-optimization/"&gt;리소스 최적화&lt;/a&gt; 참조)&lt;/p&gt;

&lt;/blockquote&gt;

&lt;h2 id="시작하기-전에"&gt;시작하기 전에&lt;a class="anchor" href="#%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-%ec%a0%84%ec%97%90"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음 조건을 확인하세요.&lt;/p&gt;
&lt;h3 id="1-kubectl-설치-및-버전-확인"&gt;1. kubectl 설치 및 버전 확인&lt;a class="anchor" href="#1-kubectl-%ec%84%a4%ec%b9%98-%eb%b0%8f-%eb%b2%84%ec%a0%84-%ed%99%95%ec%9d%b8"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl version --client&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;성공 시 출력:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Client Version: v1.28.0&lt;/code&gt;&lt;/pre&gt;&lt;blockquote class="book-hint warning"&gt;&lt;strong&gt;버전 호환성&lt;/strong&gt;&lt;br&gt;kubectl 버전은 클러스터 버전과 ±1 마이너 버전 이내여야 합니다.
예: 클러스터 1.27 → kubectl 1.26~1.28 사용 가능
&lt;/blockquote&gt;

&lt;h3 id="2-클러스터-접근-확인"&gt;2. 클러스터 접근 확인&lt;a class="anchor" href="#2-%ed%81%b4%eb%9f%ac%ec%8a%a4%ed%84%b0-%ec%a0%91%ea%b7%bc-%ed%99%95%ec%9d%b8"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl cluster-info&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;성공 시 출력:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>느린 쿼리 최적화</title><link>https://advanced-beginner.github.io/ko/docs/elasticsearch/howto/slow-query-optimization/</link><pubDate>Fri, 16 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/elasticsearch/howto/slow-query-optimization/</guid><description>&lt;p&gt;검색 응답 시간이 느릴 때 원인을 진단하고 개선하는 방법을 안내합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 15-30분&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;이 가이드의 범위&lt;/strong&gt;&lt;br&gt;&lt;p&gt;&lt;strong&gt;다루는 내용&lt;/strong&gt;: 쿼리 수준의 성능 최적화, Profile API 분석, 캐시 활용&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;다루지 않는 내용&lt;/strong&gt;: 클러스터 수준 튜닝(노드 추가, 하드웨어 업그레이드)은 &lt;a href="../concepts/performance-tuning/"&gt;성능 튜닝&lt;/a&gt;을 참조하세요.&lt;/p&gt;

&lt;/blockquote&gt;

&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Profile API&lt;/strong&gt;로 쿼리 실행 계획 분석&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;불필요한 필드 제거&lt;/strong&gt;: &lt;code&gt;_source&lt;/code&gt; 필터링, stored fields 활용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;쿼리 유형 최적화&lt;/strong&gt;: &lt;code&gt;match&lt;/code&gt; 대신 &lt;code&gt;term&lt;/code&gt;, 와일드카드 앞자리 피하기&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;캐시 활용&lt;/strong&gt;: filter context 사용, request cache 활성화&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;hr&gt;
&lt;h2 id="시작하기-전에"&gt;시작하기 전에&lt;a class="anchor" href="#%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-%ec%a0%84%ec%97%90"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음 조건을 확인하세요:&lt;/p&gt;</description></item><item><title>Latency (지연시간)</title><link>https://advanced-beginner.github.io/ko/docs/observability/concepts/golden-signals/latency/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/concepts/golden-signals/latency/</guid><description>&lt;h2 id="전체-비유-응급실-대기-시간"&gt;전체 비유: 응급실 대기 시간&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ec%9d%91%ea%b8%89%ec%8b%a4-%eb%8c%80%ea%b8%b0-%ec%8b%9c%ea%b0%84"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Latency를 &lt;strong&gt;응급실 대기 시간&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;응급실 비유&lt;/th&gt;
 &lt;th&gt;Latency 개념&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;P50 (중앙값)&lt;/td&gt;
 &lt;td&gt;일반적인 경험&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;대부분 환자 대기 시간&lt;/td&gt;
 &lt;td&gt;P95&lt;/td&gt;
 &lt;td&gt;거의 모든 환자 경험&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;최악 대기 시간&lt;/td&gt;
 &lt;td&gt;P99&lt;/td&gt;
 &lt;td&gt;SLA 기준, 1%의 경험&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;응급 vs 일반 환자&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;SLA/SLO&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&gt;이처럼 응급실 대기 시간에서 평균보다 &amp;ldquo;최악의 대기 시간&amp;quot;이 중요하듯, 서비스에서도 P99가 사용자 경험을 좌우합니다.&lt;/p&gt;</description></item><item><title>계층형 아키텍처</title><link>https://advanced-beginner.github.io/ko/docs/ddd/concepts/architecture/layered-architecture/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/ddd/concepts/architecture/layered-architecture/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: 아키텍처 패턴을 처음 배우는 개발자
&lt;strong&gt;선수 지식&lt;/strong&gt;: 기본적인 Spring Boot MVC 패턴 이해
&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 15분&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;가장 기본적이고 널리 사용되는 아키텍처 패턴입니다. &lt;strong&gt;처음 아키텍처를 배운다면 여기서 시작하세요.&lt;/strong&gt; 계층형 아키텍처는 소프트웨어를 수평으로 나누어 각 계층이 명확한 역할을 가지도록 구성합니다. 각 계층은 위에서 아래로만 호출할 수 있다는 단순하지만 강력한 규칙을 따릅니다.&lt;/p&gt;
&lt;h4 id="한-줄-요약"&gt;한 줄 요약&lt;a class="anchor" href="#%ed%95%9c-%ec%a4%84-%ec%9a%94%ec%95%bd"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;코드를 4개 층으로 나누고, 위에서 아래로만 호출한다는 원칙을 기본으로 합니다. 이렇게 하면 각 층이 자신의 책임에 집중할 수 있고, 코드의 구조를 이해하기 쉬워집니다.&lt;/p&gt;</description></item><item><title>관측성 3요소</title><link>https://advanced-beginner.github.io/ko/docs/observability/concepts/three-pillars/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/concepts/three-pillars/</guid><description>&lt;h2 id="전체-비유-의사의-진단-과정"&gt;전체 비유: 의사의 진단 과정&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ec%9d%98%ec%82%ac%ec%9d%98-%ec%a7%84%eb%8b%a8-%ea%b3%bc%ec%a0%95"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;관측성 3요소를 &lt;strong&gt;의사의 환자 진단 과정&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;의사의 진단 비유&lt;/th&gt;
 &lt;th&gt;관측성 3요소&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;Metrics&lt;/td&gt;
 &lt;td&gt;수치로 상태 파악&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;문진과 증상 기록&lt;/td&gt;
 &lt;td&gt;Logs&lt;/td&gt;
 &lt;td&gt;상세한 이벤트 기록&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CT/X-ray 촬영&lt;/td&gt;
 &lt;td&gt;Traces&lt;/td&gt;
 &lt;td&gt;문제 위치 시각화&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;38.5도, 혈압 120/80&lt;/td&gt;
 &lt;td&gt;측정값&lt;/td&gt;
 &lt;td&gt;정량적 데이터&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;3일 전부터 시작, 식후 악화&amp;rdquo;&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;Span&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;Prometheus, Loki, Jaeger&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;종합 진단&lt;/td&gt;
 &lt;td&gt;통합 분석&lt;/td&gt;
 &lt;td&gt;3요소 상호 연결&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 의사가 환자를 진단할 때 여러 방법을 조합하듯, 시스템 관측도 3요소를 함께 사용해야 정확한 분석이 가능합니다.&lt;/p&gt;</description></item><item><title>기본 문법</title><link>https://advanced-beginner.github.io/ko/docs/observability/concepts/promql/syntax-basics/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/concepts/promql/syntax-basics/</guid><description>&lt;h2 id="전체-비유-환자-기록-검색"&gt;전체 비유: 환자 기록 검색&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ed%99%98%ec%9e%90-%ea%b8%b0%eb%a1%9d-%ea%b2%80%ec%83%89"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;PromQL 기본 문법을 &lt;strong&gt;병원 EMR 검색 시스템&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;EMR 검색 비유&lt;/th&gt;
 &lt;th&gt;PromQL 문법&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;Instant Vector&lt;/td&gt;
 &lt;td&gt;특정 시점 데이터&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;기간별 기록 조회&lt;/td&gt;
 &lt;td&gt;Range Vector&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;tr&gt;
 &lt;td&gt;이전 기록 조회&lt;/td&gt;
 &lt;td&gt;offset&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&gt;이처럼 EMR에서 조건을 조합하여 환자 기록을 검색하듯, PromQL로 메트릭을 필터링하고 조회합니다.&lt;/p&gt;</description></item><item><title>기본 문법</title><link>https://advanced-beginner.github.io/ko/docs/scala/concepts/basics/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/concepts/basics/</guid><description>&lt;h2 id="전체-비유-건축-자재-선택"&gt;전체 비유: 건축 자재 선택&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ea%b1%b4%ec%b6%95-%ec%9e%90%ec%9e%ac-%ec%84%a0%ed%83%9d"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Scala의 기본 문법을 &lt;strong&gt;건축 자재 선택&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;건축 비유&lt;/th&gt;
 &lt;th&gt;Scala 개념&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;val (불변)&lt;/td&gt;
 &lt;td&gt;한 번 정하면 변경 불가&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;이동식 파티션&lt;/td&gt;
 &lt;td&gt;var (가변)&lt;/td&gt;
 &lt;td&gt;필요시 재배치 가능&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;조립식 자재&lt;/td&gt;
 &lt;td&gt;lazy val&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;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&gt;이처럼 좋은 건물이 적절한 자재 선택에서 시작하듯, 좋은 Scala 코드는 올바른 변수 선언과 타입 활용에서 시작합니다.&lt;/p&gt;</description></item><item><title>아키텍처</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/architecture/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/architecture/</guid><description>&lt;h2 id="전체-비유-아파트-단지-운영-본부"&gt;전체 비유: 아파트 단지 운영 본부&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ec%95%84%ed%8c%8c%ed%8a%b8-%eb%8b%a8%ec%a7%80-%ec%9a%b4%ec%98%81-%eb%b3%b8%eb%b6%80"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Kubernetes 아키텍처를 &lt;strong&gt;아파트 단지 운영 본부&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;아파트 단지 비유&lt;/th&gt;
 &lt;th&gt;Kubernetes&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;Control Plane&lt;/td&gt;
 &lt;td&gt;단지 전체 운영 결정 및 지휘&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;관리소장&lt;/td&gt;
 &lt;td&gt;API Server&lt;/td&gt;
 &lt;td&gt;모든 요청의 창구, 인증/인가 담당&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;입주민 대장&lt;/td&gt;
 &lt;td&gt;etcd&lt;/td&gt;
 &lt;td&gt;모든 세대 정보 기록 및 보관&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;입주 배정 담당자&lt;/td&gt;
 &lt;td&gt;Scheduler&lt;/td&gt;
 &lt;td&gt;새 입주자를 어느 동에 배치할지 결정&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;시설 관리팀&lt;/td&gt;
 &lt;td&gt;Controller Manager&lt;/td&gt;
 &lt;td&gt;세대 수 유지, 시설 상태 점검&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;각 동 건물&lt;/td&gt;
 &lt;td&gt;Worker Node&lt;/td&gt;
 &lt;td&gt;실제 세대가 있는 공간&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;동 관리인&lt;/td&gt;
 &lt;td&gt;Kubelet&lt;/td&gt;
 &lt;td&gt;해당 동의 세대 관리, 상태 보고&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;동 안내 데스크&lt;/td&gt;
 &lt;td&gt;Kube-proxy&lt;/td&gt;
 &lt;td&gt;방문자를 올바른 세대로 안내&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;이삿짐 업체&lt;/td&gt;
 &lt;td&gt;Container Runtime&lt;/td&gt;
 &lt;td&gt;실제 이사(컨테이너 실행) 담당&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 Control Plane은 &amp;ldquo;관리사무소에서 단지 전체를 운영&amp;quot;하고, Worker Node는 &amp;ldquo;각 동에서 실제 입주민을 수용&amp;quot;합니다.&lt;/p&gt;</description></item><item><title>아키텍처</title><link>https://advanced-beginner.github.io/ko/docs/spark/concepts/architecture/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/spark/concepts/architecture/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;Spark는 Driver(조율자) + Executor(작업자) + Cluster Manager(리소스 관리)로 구성&lt;/li&gt;
&lt;li&gt;모든 Transformation은 DAG로 표현되고, Action 호출 시 Job → Stage → Task로 분할되어 실행&lt;/li&gt;
&lt;li&gt;메모리는 Execution(연산)과 Storage(캐시)가 동적으로 공유하는 Unified Memory 모델 사용&lt;/li&gt;
&lt;li&gt;Java/Spring 개발자에게 SparkSession은 Spring Container, Executor는 Thread Pool Worker와 유사&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Java/Spring 기반 백엔드 개발 경험이 있는 개발자&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Java 기본 문법 및 JVM 메모리 구조 이해&lt;/li&gt;
&lt;li&gt;멀티스레딩 기초 개념 (Thread, ExecutorService)&lt;/li&gt;
&lt;li&gt;분산 시스템의 기본 개념 (선택 사항)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;</description></item><item><title>용어 사전</title><link>https://advanced-beginner.github.io/ko/docs/ddd/appendix/glossary/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/ddd/appendix/glossary/</guid><description>&lt;h1 id="ddd-용어-사전"&gt;DDD 용어 사전&lt;a class="anchor" href="#ddd-%ec%9a%a9%ec%96%b4-%ec%82%ac%ec%a0%84"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Domain-Driven Design의 핵심 용어를 정리합니다. 상세 설명은 &lt;a href="https://advanced-beginner.github.io/ko/docs/ddd/concepts/"&gt;개념 이해&lt;/a&gt; 섹션을 참고하세요.&lt;/p&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;전략적 설계&lt;/strong&gt;: Bounded Context, Context Mapping, Ubiquitous Language로 도메인 경계와 언어 정의&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;전술적 설계&lt;/strong&gt;: Entity, Value Object, Aggregate, Repository, Domain Event로 도메인 모델 구현&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;아키텍처 패턴&lt;/strong&gt;: Layered, Hexagonal, CQRS, Event Sourcing으로 시스템 구조화&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;&lt;h2 id="전략적-설계-strategic-design"&gt;전략적 설계 (Strategic Design)&lt;a class="anchor" href="#%ec%a0%84%eb%9e%b5%ec%a0%81-%ec%84%a4%ea%b3%84-strategic-design"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;📖 자세한 내용: &lt;a href="https://advanced-beginner.github.io/ko/docs/ddd/concepts/strategic-design/"&gt;전략적 설계&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;h3 id="bounded-context-경계된-컨텍스트"&gt;Bounded Context (경계된 컨텍스트)&lt;a class="anchor" href="#bounded-context-%ea%b2%bd%ea%b3%84%eb%90%9c-%ec%bb%a8%ed%85%8d%ec%8a%a4%ed%8a%b8"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;정의:&lt;/strong&gt; 특정 도메인 모델이 적용되고 일관성을 유지하는 명시적 경계&lt;/p&gt;</description></item><item><title>용어 사전</title><link>https://advanced-beginner.github.io/ko/docs/elasticsearch/appendix/glossary/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/elasticsearch/appendix/glossary/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Index/Document/Field&lt;/strong&gt;: RDB의 Table/Row/Column에 대응&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shard/Replica&lt;/strong&gt;: 데이터 분산과 복제의 기본 단위&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Analyzer/Tokenizer&lt;/strong&gt;: 텍스트를 검색 가능한 토큰으로 분해&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Query/Filter Context&lt;/strong&gt;: 점수 계산 여부에 따른 검색 방식 구분&lt;/li&gt;
&lt;li&gt;알파벳순으로 정렬, 각 용어에서 관련 개념 문서로 링크&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;빠른 이동&lt;/strong&gt;: &lt;a href="#a-e"&gt;A&lt;/a&gt; | &lt;a href="#a-e"&gt;B&lt;/a&gt; | &lt;a href="#a-e"&gt;C&lt;/a&gt; | &lt;a href="#a-e"&gt;D&lt;/a&gt; | &lt;a href="#a-e"&gt;E&lt;/a&gt; | &lt;a href="#f-m"&gt;F&lt;/a&gt; | &lt;a href="#f-m"&gt;G&lt;/a&gt; | &lt;a href="#f-m"&gt;H&lt;/a&gt; | &lt;a href="#f-m"&gt;I&lt;/a&gt; | &lt;a href="#f-m"&gt;J&lt;/a&gt; | &lt;a href="#f-m"&gt;K&lt;/a&gt; | &lt;a href="#f-m"&gt;L&lt;/a&gt; | &lt;a href="#f-m"&gt;M&lt;/a&gt; | &lt;a href="#n-r"&gt;N&lt;/a&gt; | &lt;a href="#n-r"&gt;O&lt;/a&gt; | &lt;a href="#n-r"&gt;P&lt;/a&gt; | &lt;a href="#n-r"&gt;Q&lt;/a&gt; | &lt;a href="#n-r"&gt;R&lt;/a&gt; | &lt;a href="#s-z"&gt;S&lt;/a&gt; | &lt;a href="#s-z"&gt;T&lt;/a&gt; | &lt;a href="#s-z"&gt;U&lt;/a&gt; | &lt;a href="#s-z"&gt;V&lt;/a&gt; | &lt;a href="#s-z"&gt;W&lt;/a&gt; | &lt;a href="#s-z"&gt;Z&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;Elasticsearch 핵심 용어를 빠르게 찾아볼 수 있습니다. 상세 설명은 &lt;a href="https://advanced-beginner.github.io/ko/docs/elasticsearch/concepts/"&gt;개념 이해&lt;/a&gt; 섹션을 참고하세요.&lt;/p&gt;</description></item><item><title>용어 사전</title><link>https://advanced-beginner.github.io/ko/docs/kafka/appendix/glossary/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kafka/appendix/glossary/</guid><description>&lt;p&gt;Kafka 관련 주요 용어를 정리합니다. 각 용어의 상세한 설명은 개념 이해 섹션을 참고하세요. 용어들은 알파벳 순서로 정렬되어 있으며, 관련 용어들은 상호 참조로 연결되어 있습니다.&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;핵심 구성요소&lt;/strong&gt;: Topic(논리적 채널), Partition(병렬 처리 단위), Broker(서버), Producer(발행자), Consumer(수신자)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;신뢰성&lt;/strong&gt;: ACK(전송 확인), ISR(동기화 복제본), Replication Factor(복제 수)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consumer 관리&lt;/strong&gt;: Consumer Group(병렬 처리), Offset(위치), Commit(저장), Rebalancing(재분배)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spring Kafka&lt;/strong&gt;: KafkaTemplate(Producer), @KafkaListener(Consumer)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;메타데이터 관리&lt;/strong&gt;: KRaft(신규 권장), Zookeeper(레거시)&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h4 id="a"&gt;A&lt;a class="anchor" href="#a"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;ACK (Acknowledgment)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Producer가 메시지 전송 성공을 확인받는 방식입니다. acks=0은 확인 없이 전송하여 처리량이 가장 높지만 메시지 유실 가능성이 있습니다. acks=1은 Leader만 확인하는 중간 수준의 설정입니다. acks=all은 ISR(In-Sync Replicas) 전체가 확인해야 하므로 가장 안전하지만 지연 시간이 증가합니다. 프로덕션 환경에서는 데이터 중요도에 따라 적절한 값을 선택해야 합니다. 자세한 내용은 심화 개념 문서의 acks 섹션을 참고하세요.&lt;/p&gt;</description></item><item><title>용어 사전</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/appendix/glossary/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/appendix/glossary/</guid><description>&lt;p&gt;Kubernetes 학습과 운영에 필요한 핵심 용어를 정리합니다.&lt;/p&gt;
&lt;h2 id="a-c"&gt;A-C&lt;a class="anchor" href="#a-c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="access-modes"&gt;Access Modes&lt;a class="anchor" href="#access-modes"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;PersistentVolume의 접근 방식입니다. RWO(ReadWriteOnce: 단일 노드 읽기/쓰기), ROX(ReadOnlyMany: 여러 노드 읽기), RWX(ReadWriteMany: 여러 노드 읽기/쓰기)가 있습니다.&lt;/p&gt;
&lt;h3 id="api-server-kube-apiserver"&gt;API Server (kube-apiserver)&lt;a class="anchor" href="#api-server-kube-apiserver"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Kubernetes의 프론트엔드입니다. 모든 kubectl 명령, 대시보드, CI/CD 도구가 API Server를 통해 클러스터와 통신합니다. 인증, 권한 검사, 요청 검증을 수행하고 etcd와 통신합니다.&lt;/p&gt;
&lt;h3 id="cluster"&gt;Cluster&lt;a class="anchor" href="#cluster"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;여러 노드(머신)로 구성된 Kubernetes 환경 전체를 의미합니다. 하나의 Control Plane과 여러 Worker Node로 구성됩니다.&lt;/p&gt;
&lt;h3 id="clusterip"&gt;ClusterIP&lt;a class="anchor" href="#clusterip"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Service의 기본 유형입니다. 클러스터 내부에서만 접근 가능한 가상 IP를 할당받습니다. 마이크로서비스 간 내부 통신에 사용됩니다.&lt;/p&gt;</description></item><item><title>용어 사전</title><link>https://advanced-beginner.github.io/ko/docs/observability/appendix/glossary/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/appendix/glossary/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;빠른 이동&lt;/strong&gt;: &lt;a href="#a"&gt;A&lt;/a&gt; | &lt;a href="#b"&gt;B&lt;/a&gt; | &lt;a href="#c"&gt;C&lt;/a&gt; | &lt;a href="#d"&gt;D&lt;/a&gt; | &lt;a href="#e"&gt;E&lt;/a&gt; | &lt;a href="#f"&gt;F&lt;/a&gt; | &lt;a href="#g"&gt;G&lt;/a&gt; | &lt;a href="#h"&gt;H&lt;/a&gt; | &lt;a href="#i"&gt;I&lt;/a&gt; | &lt;a href="#j"&gt;J&lt;/a&gt; | &lt;a href="#k"&gt;K&lt;/a&gt; | &lt;a href="#l"&gt;L&lt;/a&gt; | &lt;a href="#m"&gt;M&lt;/a&gt; | &lt;a href="#n"&gt;N&lt;/a&gt; | &lt;a href="#o"&gt;O&lt;/a&gt; | &lt;a href="#p"&gt;P&lt;/a&gt; | &lt;a href="#r"&gt;R&lt;/a&gt; | &lt;a href="#s"&gt;S&lt;/a&gt; | &lt;a href="#t"&gt;T&lt;/a&gt; | &lt;a href="#u"&gt;U&lt;/a&gt; | &lt;a href="#v"&gt;V&lt;/a&gt; | &lt;a href="#w"&gt;W&lt;/a&gt; | &lt;a href="#z"&gt;Z&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;hr&gt;
&lt;h2 id="a"&gt;A&lt;a class="anchor" href="#a"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="alerting-rules"&gt;Alerting Rules&lt;a class="anchor" href="#alerting-rules"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Prometheus에서 조건 기반 알림을 정의하는 규칙. 조건 만족 시 Alertmanager로 알림 전송.&lt;/p&gt;
&lt;h3 id="alertmanager"&gt;Alertmanager&lt;a class="anchor" href="#alertmanager"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Prometheus의 알림을 수신하여 그룹화, 억제, 라우팅하는 컴포넌트.&lt;/p&gt;
&lt;h3 id="annotation"&gt;Annotation&lt;a class="anchor" href="#annotation"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;알림 규칙에서 알림 메시지, 설명, 런북 URL 등을 정의하는 메타데이터.&lt;/p&gt;
&lt;h2 id="b"&gt;B&lt;a class="anchor" href="#b"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="bucket"&gt;Bucket&lt;a class="anchor" href="#bucket"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Histogram에서 값의 분포를 측정하는 구간. &lt;code&gt;le&lt;/code&gt; (less than or equal) 라벨로 구분. 예: &lt;code&gt;le=&amp;quot;0.5&amp;quot;&lt;/code&gt;는 0.5초 이하.&lt;/p&gt;</description></item><item><title>용어 사전</title><link>https://advanced-beginner.github.io/ko/docs/scala/appendix/glossary/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/appendix/glossary/</guid><description>&lt;p&gt;Scala 핵심 용어를 알파벳 순으로 정리합니다. 상세 설명은 &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/"&gt;개념 이해&lt;/a&gt; 섹션을 참고하세요. 각 용어는 정의와 함께 관련 문서 링크를 제공합니다.&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR - 핵심 용어 5선&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Case Class&lt;/strong&gt;: 불변 데이터 클래스, &lt;code&gt;equals&lt;/code&gt;/&lt;code&gt;copy&lt;/code&gt; 자동 생성&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Option[A]&lt;/strong&gt;: null 대체, &lt;code&gt;Some(값)&lt;/code&gt; 또는 &lt;code&gt;None&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pattern Matching&lt;/strong&gt;: 구조 분석 및 데이터 추출 (&lt;code&gt;match&lt;/code&gt; 표현식)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trait&lt;/strong&gt;: 구현 포함 가능한 인터페이스, 믹스인 상속 지원&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;given/using&lt;/strong&gt; (Scala 3): 암시적 값/매개변수의 새로운 문법&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h4 id="a"&gt;A&lt;a class="anchor" href="#a"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;ADT (Algebraic Data Type)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;대수적 데이터 타입. &lt;code&gt;sealed trait&lt;/code&gt;과 &lt;a href="#case-class"&gt;Case Class&lt;/a&gt;로 정의되는 합 타입과 곱 타입의 조합. Scala 3에서는 &lt;code&gt;enum&lt;/code&gt;으로 더 간단히 정의 가능. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/pattern-matching/"&gt;패턴 매칭&lt;/a&gt;과 함께 사용&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Applicative&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;독립적인 효과를 결합하는 &lt;a href="#type-class"&gt;타입 클래스&lt;/a&gt;. &lt;code&gt;pure&lt;/code&gt;와 &lt;code&gt;ap&lt;/code&gt; 연산을 제공. &lt;a href="#functor"&gt;Functor&lt;/a&gt;보다 강력하고 &lt;a href="#monad"&gt;Monad&lt;/a&gt;보다 약함. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/functional-patterns/"&gt;함수형 패턴&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;apply 메서드&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;객체를 함수처럼 호출할 수 있게 하는 특별한 메서드. &lt;code&gt;obj(args)&lt;/code&gt;는 &lt;code&gt;obj.apply(args)&lt;/code&gt;로 해석됨. &lt;a href="#companion-object"&gt;Companion Object&lt;/a&gt;에서 팩토리 메서드로 자주 사용.&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Abstract Class (추상 클래스)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;인스턴스화할 수 없으며 하위 클래스에서 구현해야 하는 추상 멤버를 정의하는 클래스. &lt;a href="#trait"&gt;Trait&lt;/a&gt;와 달리 생성자 매개변수를 가질 수 있음. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/classes-objects/"&gt;클래스와 객체&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Await&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;a href="#futuret"&gt;Future&lt;/a&gt;의 결과를 동기적으로 기다리는 함수. &lt;code&gt;Await.result(future, duration)&lt;/code&gt; 형태로 사용. 테스트에서만 사용하고 프로덕션에서는 피해야 함. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/concurrency/"&gt;동시성&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;h4 id="c"&gt;C&lt;a class="anchor" href="#c"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;Cats Effect&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;순수 함수형 비동기 프로그래밍을 지원하는 라이브러리. IO 타입으로 참조 투명성을 보장하며, &lt;a href="#futuret"&gt;Future&lt;/a&gt;보다 더 강력한 효과 시스템 제공. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/functional-patterns/"&gt;함수형 패턴&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Case Class&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;불변 데이터를 위한 특별한 클래스. &lt;code&gt;equals&lt;/code&gt;, &lt;code&gt;hashCode&lt;/code&gt;, &lt;code&gt;copy&lt;/code&gt;, &lt;code&gt;unapply&lt;/code&gt; 등이 자동 생성됨. &lt;a href="#pattern-matching"&gt;Pattern Matching&lt;/a&gt;과 함께 사용. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/case-classes/"&gt;Case Classes 상세&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Companion Object&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;클래스와 같은 이름을 가진 싱글톤 객체. 클래스의 &lt;code&gt;private&lt;/code&gt; 멤버에 접근 가능. &lt;a href="#apply-%eb%a9%94%ec%84%9c%eb%93%9c"&gt;apply 메서드&lt;/a&gt;로 팩토리 패턴 구현. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/classes-objects/"&gt;클래스와 객체&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Context Bound&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;code&gt;def f[A: Ordering]&lt;/code&gt;처럼 &lt;a href="#type-class"&gt;타입 클래스&lt;/a&gt; 인스턴스 존재를 요구하는 문법. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/implicits/"&gt;암시적 변환&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Currying (커링)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;여러 인자를 받는 함수를 단일 인자 함수의 체인으로 변환하는 기법. &lt;a href="#higher-order-function"&gt;Higher-Order Function&lt;/a&gt;과 함께 사용. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/functions-methods/"&gt;함수와 메서드&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;A-C 핵심 포인트&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ADT&lt;/strong&gt;: &lt;code&gt;sealed trait&lt;/code&gt; + &lt;code&gt;case class&lt;/code&gt;로 타입 안전한 데이터 모델링&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Case Class&lt;/strong&gt;: 불변 데이터에 최적, 패턴 매칭과 함께 사용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Companion Object&lt;/strong&gt;: 팩토리 메서드(&lt;code&gt;apply&lt;/code&gt;)와 유틸리티 함수 배치&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h4 id="e"&gt;E&lt;a class="anchor" href="#e"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;Either[L, R]&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;두 가지 타입 중 하나의 값을 담는 타입. 보통 &lt;code&gt;Left&lt;/code&gt;는 실패, &lt;code&gt;Right&lt;/code&gt;는 성공. &lt;a href="#optiona"&gt;Option&lt;/a&gt;과 유사하나 실패 사유를 담을 수 있음. &lt;a href="#flatmap"&gt;flatMap&lt;/a&gt;으로 체이닝 가능.&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Extension Method&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;기존 타입에 새 메서드를 추가하는 기법. Scala 3에서는 &lt;code&gt;extension&lt;/code&gt; 키워드 사용. &lt;a href="#type-class"&gt;Type Class&lt;/a&gt; 구현에 활용. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/appendix/version-comparison/"&gt;Scala 3 기능 비교&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Enum (Scala 3)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;Scala 3에서 열거형을 정의하는 키워드. 단순 열거형부터 ADT 스타일까지 지원. Scala 2에서는 &lt;code&gt;sealed trait&lt;/code&gt; + &lt;code&gt;case object&lt;/code&gt; 조합으로 구현. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/classes-objects/"&gt;클래스와 객체&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;ExecutionContext&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;a href="#futuret"&gt;Future&lt;/a&gt; 실행을 위한 스레드 풀을 제공하는 컨텍스트. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/concurrency/"&gt;동시성&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;h4 id="f"&gt;F&lt;a class="anchor" href="#f"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;fold&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;초기값과 함께 컬렉션의 모든 요소를 하나의 값으로 축소하는 연산. &lt;code&gt;foldLeft&lt;/code&gt;는 왼쪽에서 오른쪽으로, &lt;code&gt;foldRight&lt;/code&gt;는 오른쪽에서 왼쪽으로 축소. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/collections/"&gt;컬렉션&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Function Composition (함수 합성)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;작은 함수들을 결합하여 더 큰 함수를 만드는 기법. &lt;code&gt;andThen&lt;/code&gt;은 왼쪽에서 오른쪽으로, &lt;code&gt;compose&lt;/code&gt;는 오른쪽에서 왼쪽으로 연결. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/functional-patterns/"&gt;함수형 패턴&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;flatMap&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;컨테이너 내의 값을 변환하고 결과를 평탄화하는 연산. &lt;a href="#monad"&gt;Monad&lt;/a&gt;의 핵심 연산. &lt;a href="#for-comprehension"&gt;For Comprehension&lt;/a&gt;으로 우아하게 표현 가능.&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;For Comprehension&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;a href="#flatmap"&gt;flatMap&lt;/a&gt;, &lt;code&gt;map&lt;/code&gt;, &lt;code&gt;withFilter&lt;/code&gt;의 조합을 우아하게 표현하는 문법적 설탕. &lt;a href="#optiona"&gt;Option&lt;/a&gt;, &lt;a href="#futuret"&gt;Future&lt;/a&gt;, &lt;a href="#eitherl-r"&gt;Either&lt;/a&gt; 등에 사용. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/for-comprehensions/"&gt;For Comprehension 상세&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Functor&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;code&gt;map&lt;/code&gt; 연산을 가진 &lt;a href="#type-class"&gt;타입 클래스&lt;/a&gt;. 컨테이너 내의 값을 변환. &lt;a href="#applicative"&gt;Applicative&lt;/a&gt;와 &lt;a href="#monad"&gt;Monad&lt;/a&gt;의 기반. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/functional-patterns/"&gt;함수형 패턴&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Future[T]&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;아직 완료되지 않은 비동기 계산을 나타내는 타입. &lt;a href="#executioncontext"&gt;ExecutionContext&lt;/a&gt; 필요. &lt;a href="#for-comprehension"&gt;For Comprehension&lt;/a&gt;으로 순차 실행 가능. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/concurrency/"&gt;동시성&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;h4 id="g"&gt;G&lt;a class="anchor" href="#g"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;Given (Scala 3)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;a href="#type-class"&gt;타입 클래스&lt;/a&gt; 인스턴스를 정의하는 키워드. Scala 2의 &lt;a href="#implicit-scala-2"&gt;implicit&lt;/a&gt; &lt;code&gt;val&lt;/code&gt;을 대체. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/examples/scala2-vs-scala3/"&gt;Scala 2 vs 3 비교&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;h4 id="h"&gt;H&lt;a class="anchor" href="#h"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;Higher-Order Function&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;함수를 인자로 받거나 함수를 반환하는 함수. &lt;a href="#flatmap"&gt;map&lt;/a&gt;, &lt;code&gt;filter&lt;/code&gt;, &lt;code&gt;fold&lt;/code&gt; 등. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/higher-order-functions/"&gt;고차 함수 상세&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Higher-Kinded Type&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;타입 생성자를 인자로 받는 타입. &lt;code&gt;F[_]&lt;/code&gt; 형태. &lt;a href="#functor"&gt;Functor&lt;/a&gt;, &lt;a href="#monad"&gt;Monad&lt;/a&gt; 정의에 필수. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/type-system-advanced/"&gt;고급 타입 시스템&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;h4 id="i"&gt;I&lt;a class="anchor" href="#i"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;Immutable (불변)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;생성 후 상태를 변경할 수 없는 것. Scala는 불변성을 권장. &lt;a href="#case-class"&gt;Case Class&lt;/a&gt;, &lt;a href="#val"&gt;val&lt;/a&gt;, 불변 &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/collections/"&gt;컬렉션&lt;/a&gt; 사용.&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Implicit (Scala 2)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;암시적 값, 매개변수, 변환을 정의하는 키워드. Scala 3에서는 &lt;a href="#given-scala-3"&gt;given&lt;/a&gt;/&lt;a href="#using-scala-3"&gt;using&lt;/a&gt;으로 대체. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/implicits/"&gt;암시적 변환 상세&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;inline (Scala 3)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;컴파일 타임에 코드를 인라인하여 런타임 오버헤드를 제거하는 키워드. &lt;code&gt;inline def&lt;/code&gt;, &lt;code&gt;inline val&lt;/code&gt;, &lt;code&gt;inline if&lt;/code&gt; 등으로 사용. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/macros-metaprogramming/"&gt;매크로와 메타프로그래밍&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Intersection Type (&amp;amp;)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;여러 타입을 모두 만족하는 타입. &lt;code&gt;A &amp;amp; B&lt;/code&gt;. &lt;a href="#union-type-"&gt;Union Type&lt;/a&gt;과 반대. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/type-system-advanced/"&gt;고급 타입 시스템&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;E-I 핵심 포인트&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Either/Option&lt;/strong&gt;: null 대신 사용, 에러 처리의 함수형 방식&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;flatMap&lt;/strong&gt;: Monad의 핵심, for comprehension으로 우아하게 표현&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;given/using&lt;/strong&gt; (Scala 3): &lt;code&gt;implicit&lt;/code&gt;을 대체하는 명확한 문법&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h4 id="l"&gt;L&lt;a class="anchor" href="#l"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;Lazy val&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;처음 접근할 때까지 초기화가 지연되는 값. 비용이 큰 초기화에 유용. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/basics/"&gt;기초 문법&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Linearization (선형화)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;다중 트레이트 상속 시 메서드 호출 순서를 결정하는 알고리즘. 오른쪽에서 왼쪽으로 트레이트가 적용됨. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/classes-objects/"&gt;클래스와 객체&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;List&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;불변 연결 리스트. 앞에서 추가/삭제가 O(1)로 빠르지만 인덱스 접근은 O(n). &lt;code&gt;::&lt;/code&gt; 연산자로 요소 추가, &lt;code&gt;:::&lt;/code&gt; 또는 &lt;code&gt;++&lt;/code&gt;로 리스트 연결. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/collections/"&gt;컬렉션&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Lower Bound (하한 경계)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;타입 매개변수가 특정 타입의 상위 타입이어야 함을 지정. &lt;code&gt;A &amp;gt;: B&lt;/code&gt; 형태. 공변 타입에서 메서드 매개변수를 다룰 때 사용. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/generics/"&gt;제네릭&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;h4 id="m"&gt;M&lt;a class="anchor" href="#m"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;Macro (매크로)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;컴파일 타임에 코드를 생성하는 기능. Scala 3에서는 &lt;code&gt;${ }&lt;/code&gt; 스플라이스와 &lt;code&gt;'{ }&lt;/code&gt; 인용, &lt;code&gt;scala.quoted&lt;/code&gt; API 사용. 보일러플레이트 코드 생성에 유용. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/macros-metaprogramming/"&gt;매크로와 메타프로그래밍&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Match Type (Scala 3)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;타입 수준에서 패턴 매칭을 수행하는 기능. 입력 타입에 따라 다른 결과 타입을 계산. 재귀적 Match Types로 복잡한 타입 변환 가능. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/type-system-advanced/"&gt;고급 타입 시스템&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Mixin&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;여러 &lt;a href="#trait"&gt;Trait&lt;/a&gt;를 조합하여 클래스를 구성하는 방식. &lt;code&gt;with&lt;/code&gt; 키워드로 트레이트를 믹스인. 코드 재사용과 관심사 분리에 유용. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/classes-objects/"&gt;클래스와 객체&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Match Expression&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;값의 패턴에 따라 분기하는 표현식. &lt;code&gt;switch&lt;/code&gt;의 강력한 버전. &lt;a href="#case-class"&gt;Case Class&lt;/a&gt;와 &lt;a href="#sealed"&gt;Sealed&lt;/a&gt; 트레이트에 최적화. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/pattern-matching/"&gt;패턴 매칭 상세&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Monad&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;a href="#flatmap"&gt;flatMap&lt;/a&gt;과 &lt;code&gt;pure&lt;/code&gt; 연산을 가진 &lt;a href="#type-class"&gt;타입 클래스&lt;/a&gt;. 순차적 효과 조합. &lt;a href="#optiona"&gt;Option&lt;/a&gt;, &lt;a href="#eitherl-r"&gt;Either&lt;/a&gt;, &lt;a href="#futuret"&gt;Future&lt;/a&gt; 등이 Monad. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/functional-patterns/"&gt;함수형 패턴&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;h4 id="o"&gt;O&lt;a class="anchor" href="#o"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;Object&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;싱글톤 인스턴스를 정의하는 키워드. &lt;a href="#companion-object"&gt;Companion Object&lt;/a&gt; 참고. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/classes-objects/"&gt;클래스와 객체&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Opaque Type (Scala 3)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;외부에서는 다른 타입으로 보이지만 내부에서는 기반 타입과 동일한 타입. 런타임 오버헤드 없는 타입 안전성. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/appendix/version-comparison/"&gt;Scala 3 기능 비교&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Option[A]&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;값이 있거나(&lt;code&gt;Some&lt;/code&gt;) 없음(&lt;code&gt;None&lt;/code&gt;)을 나타내는 타입. &lt;code&gt;null&lt;/code&gt; 대체. &lt;a href="#flatmap"&gt;flatMap&lt;/a&gt;과 &lt;a href="#for-comprehension"&gt;For Comprehension&lt;/a&gt;으로 안전하게 처리. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/basics/"&gt;기초 문법&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;L-O 핵심 포인트&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;lazy val&lt;/strong&gt;: 비용이 큰 초기화를 첫 사용 시점까지 지연&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monad&lt;/strong&gt;: &lt;code&gt;flatMap&lt;/code&gt; + &lt;code&gt;pure&lt;/code&gt;, 순차적 효과 조합의 핵심 추상화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Option&lt;/strong&gt;: null 대신 &lt;code&gt;Some&lt;/code&gt;/&lt;code&gt;None&lt;/code&gt;으로 타입 안전한 처리&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h4 id="p"&gt;P&lt;a class="anchor" href="#p"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;Partial Function&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;일부 입력에 대해서만 정의된 함수. &lt;a href="#pattern-matching"&gt;Pattern Matching&lt;/a&gt;의 케이스와 같은 형태. &lt;code&gt;collect&lt;/code&gt; 메서드에 활용. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/functions-methods/"&gt;함수와 메서드&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Pattern Matching&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;값의 구조를 분석하고 데이터를 추출하는 기법. &lt;a href="#case-class"&gt;Case Class&lt;/a&gt;, &lt;a href="#sealed"&gt;Sealed&lt;/a&gt; 트레이트와 함께 사용. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/pattern-matching/"&gt;패턴 매칭 상세&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Promise[T]&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;a href="#futuret"&gt;Future&lt;/a&gt;를 직접 완료할 수 있게 해주는 타입. 콜백 기반 API 래핑에 사용. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/concurrency/"&gt;동시성&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Pure Function (순수 함수)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;동일한 입력에 대해 항상 동일한 출력을 반환하고 부수 효과가 없는 함수. &lt;a href="#referential-transparency"&gt;참조 투명성&lt;/a&gt; 보장. 함수형 프로그래밍의 핵심. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/functional-patterns/"&gt;함수형 패턴&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;h4 id="r"&gt;R&lt;a class="anchor" href="#r"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;Range&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;숫자 범위를 나타내는 특수 시퀀스. &lt;code&gt;1 to 10&lt;/code&gt;, &lt;code&gt;1 until 10&lt;/code&gt;, &lt;code&gt;1 to 10 by 2&lt;/code&gt; 형태로 생성. 메모리에 모든 요소를 저장하지 않고 필요 시 계산. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/collections/"&gt;컬렉션&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;reduce&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;컬렉션의 요소들을 하나의 값으로 축소하는 연산. &lt;a href="#fold"&gt;fold&lt;/a&gt;와 달리 초기값 없이 첫 요소부터 시작. 빈 컬렉션에 사용 시 예외 발생. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/collections/"&gt;컬렉션&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Referential Transparency&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;표현식을 그 결과값으로 대체해도 프로그램 의미가 변하지 않는 속성. 순수 함수의 핵심 특성. &lt;a href="#immutable-%eb%b6%88%eb%b3%80"&gt;Immutable&lt;/a&gt; 데이터와 관련. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/functional-patterns/"&gt;함수형 패턴&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;h4 id="s"&gt;S&lt;a class="anchor" href="#s"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;Sealed&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;같은 파일에서만 상속 가능하게 제한하는 수식어. &lt;a href="#pattern-matching"&gt;Pattern Matching&lt;/a&gt; 완전성 검사에 사용. &lt;a href="#adt-algebraic-data-type"&gt;ADT&lt;/a&gt; 정의에 필수. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/pattern-matching/"&gt;패턴 매칭&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Set&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;중복이 없는 불변 컬렉션. 요소 포함 여부를 빠르게 확인 가능. &lt;code&gt;union&lt;/code&gt;, &lt;code&gt;intersect&lt;/code&gt;, &lt;code&gt;diff&lt;/code&gt; 등 집합 연산 지원. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/collections/"&gt;컬렉션&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Side Effect (부수 효과)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;함수가 값을 반환하는 것 외에 외부 상태를 변경하거나 관찰 가능한 동작을 수행하는 것. 콘솔 출력, 파일 I/O, 전역 변수 변경 등. 함수형 프로그래밍에서는 최소화 권장. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/functional-patterns/"&gt;함수형 패턴&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Singleton Object&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;a href="#object"&gt;Object&lt;/a&gt; 키워드로 정의된 유일한 인스턴스. &lt;a href="#companion-object"&gt;Companion Object&lt;/a&gt; 참고.&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;String Interpolation (문자열 보간)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;문자열 내에 변수나 표현식을 삽입하는 기능. &lt;code&gt;s&amp;quot;Hello, $name&amp;quot;&lt;/code&gt;, &lt;code&gt;f&amp;quot;$pi%.2f&amp;quot;&lt;/code&gt;, &lt;code&gt;raw&amp;quot;\d+&amp;quot;&lt;/code&gt; 형태. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/basics/"&gt;기초 문법&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;summon (Scala 3)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;주어진 타입의 암시적 인스턴스를 가져오는 함수. &lt;a href="#implicit-scala-2"&gt;implicit&lt;/a&gt; &lt;code&gt;implicitly&lt;/code&gt;를 대체. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/type-classes/"&gt;타입 클래스&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;h4 id="t"&gt;T&lt;a class="anchor" href="#t"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;Tail Recursion&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;함수의 마지막 연산이 자기 자신 호출인 재귀. 스택 오버플로우 없이 최적화 가능. &lt;code&gt;@tailrec&lt;/code&gt; 어노테이션으로 검증. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/functions-methods/"&gt;함수와 메서드&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Trait&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;Java의 인터페이스와 유사하지만 구현을 포함할 수 있는 타입. 믹스인 상속 지원. &lt;a href="#sealed"&gt;Sealed&lt;/a&gt;와 함께 &lt;a href="#adt-algebraic-data-type"&gt;ADT&lt;/a&gt; 구성. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/classes-objects/"&gt;클래스와 객체&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Try[T]&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;예외를 던질 수 있는 계산의 결과를 담는 타입. &lt;code&gt;Success&lt;/code&gt; 또는 &lt;code&gt;Failure&lt;/code&gt;. &lt;a href="#eitherl-r"&gt;Either&lt;/a&gt;, &lt;a href="#optiona"&gt;Option&lt;/a&gt;과 유사한 에러 처리 패턴. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/basics/"&gt;기초 문법&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Type Class&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;기존 타입에 기능을 추가하는 패턴. Ad-hoc 다형성 구현. &lt;a href="#functor"&gt;Functor&lt;/a&gt;, &lt;a href="#monad"&gt;Monad&lt;/a&gt; 등이 대표적. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/type-classes/"&gt;타입 클래스 상세&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Type Inference&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;컴파일러가 타입을 자동으로 추론하는 기능. Scala의 강력한 타입 추론으로 보일러플레이트 감소. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/basics/"&gt;기초 문법&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Type Lambda (Scala 3)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;타입 생성자를 타입 매개변수로 전달할 수 있게 하는 기능. &lt;code&gt;[X] =&amp;gt;&amp;gt; F[X]&lt;/code&gt; 형태. 고차 타입을 다룰 때 타입 매개변수 부분 적용에 유용. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/type-system-advanced/"&gt;고급 타입 시스템&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;transparent inline (Scala 3)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;반환 타입을 더 정밀하게 추론하는 &lt;a href="#inline-scala-3"&gt;inline&lt;/a&gt;. 각 호출 지점에서 정확한 타입이 추론됨. 타입별 최적화에 사용. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/macros-metaprogramming/"&gt;매크로와 메타프로그래밍&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;P-T 핵심 포인트&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pattern Matching&lt;/strong&gt;: &lt;code&gt;match&lt;/code&gt; 표현식으로 데이터 구조 분해 및 분기&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sealed&lt;/strong&gt;: 상속을 같은 파일로 제한, 패턴 매칭 완전성 검사&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type Class&lt;/strong&gt;: 기존 타입에 기능 추가, Ad-hoc 다형성 구현&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h4 id="u"&gt;U&lt;a class="anchor" href="#u"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;Union Type (|)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;여러 타입 중 하나를 나타내는 타입. &lt;code&gt;Int | String&lt;/code&gt;. &lt;a href="#intersection-type-"&gt;Intersection Type&lt;/a&gt;과 반대. Scala 3 전용. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/type-system-advanced/"&gt;고급 타입 시스템&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;unapply&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;패턴 매칭에서 객체를 분해하여 필드를 추출하는 메서드. &lt;a href="#case-class"&gt;Case Class&lt;/a&gt;에서 자동 생성. 커스텀 추출자(Extractor) 정의에 사용. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/pattern-matching/"&gt;패턴 매칭&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Upper Bound (상한 경계)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;타입 매개변수가 특정 타입의 하위 타입이어야 함을 지정. &lt;code&gt;A &amp;lt;: B&lt;/code&gt; 형태. 타입 매개변수가 특정 메서드를 가짐을 보장. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/generics/"&gt;제네릭&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Using (Scala 3)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;암시적 매개변수를 선언하는 키워드. &lt;a href="#implicit-scala-2"&gt;Implicit&lt;/a&gt;을 대체. &lt;a href="#given-scala-3"&gt;Given&lt;/a&gt;과 짝을 이룸. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/examples/scala2-vs-scala3/"&gt;Scala 2 vs 3 비교&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;h4 id="v"&gt;V&lt;a class="anchor" href="#v"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;Vector&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;랜덤 접근이 빠른 불변 시퀀스. 32진 트리 구조로 대부분의 연산이 사실상 상수 시간. &lt;a href="#list"&gt;List&lt;/a&gt;보다 인덱스 접근이 필요한 경우에 적합. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/collections/"&gt;컬렉션&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;val&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;a href="#immutable-%eb%b6%88%eb%b3%80"&gt;Immutable&lt;/a&gt; 값을 선언하는 키워드. &lt;a href="#var"&gt;var&lt;/a&gt;와 비교. Scala에서 기본 선택.&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;var&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;가변 변수를 선언하는 키워드. &lt;a href="#val"&gt;val&lt;/a&gt;보다 권장되지 않음. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/basics/"&gt;기초 문법&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Variance (변성)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;타입 매개변수의 서브타이핑 관계. 공변(&lt;code&gt;+A&lt;/code&gt;), 반공변(&lt;code&gt;-A&lt;/code&gt;), 무공변. 컬렉션 설계에 중요. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/variance/"&gt;변성 상세&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;h4 id="y"&gt;Y&lt;a class="anchor" href="#y"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;yield&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;a href="#for-comprehension"&gt;For Comprehension&lt;/a&gt;에서 값을 생성하는 키워드. &lt;code&gt;map&lt;/code&gt; 호출로 변환됨. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/for-comprehensions/"&gt;For Comprehension 상세&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;U-Y 핵심 포인트&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Union Type&lt;/strong&gt; (&lt;code&gt;|&lt;/code&gt;): Scala 3 전용, &lt;code&gt;Either&lt;/code&gt; 대신 간결한 타입 표현&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;val/var&lt;/strong&gt;: &lt;code&gt;val&lt;/code&gt;(불변) 우선, &lt;code&gt;var&lt;/code&gt;(가변)는 최소화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Variance&lt;/strong&gt;: 공변(&lt;code&gt;+A&lt;/code&gt;), 반공변(&lt;code&gt;-A&lt;/code&gt;)으로 타입 관계 정의&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h4 id="z"&gt;Z&lt;a class="anchor" href="#z"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;ZIO&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;효과 시스템과 의존성 주입을 통합한 라이브러리. &lt;code&gt;ZIO[R, E, A]&lt;/code&gt; 타입으로 환경, 에러, 결과를 명시. &lt;a href="#cats-effect"&gt;Cats Effect&lt;/a&gt;와 함께 &lt;a href="#futuret"&gt;Future&lt;/a&gt;의 대안으로 사용. → &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/functional-patterns/"&gt;함수형 패턴&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;hr&gt;
&lt;h4 id="다음-단계"&gt;다음 단계&lt;a class="anchor" href="#%eb%8b%a4%ec%9d%8c-%eb%8b%a8%ea%b3%84"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/"&gt;개념 이해&lt;/a&gt; - Scala 핵심 개념&lt;/li&gt;
&lt;li&gt;&lt;a href="https://advanced-beginner.github.io/ko/docs/scala/examples/"&gt;실습 예제&lt;/a&gt; - 코드로 배우기&lt;/li&gt;
&lt;li&gt;&lt;a href="https://advanced-beginner.github.io/ko/docs/scala/examples/spark-integration/"&gt;Spark 통합&lt;/a&gt; - 빅데이터 처리&lt;/li&gt;
&lt;li&gt;&lt;a href="https://advanced-beginner.github.io/ko/docs/scala/appendix/references/"&gt;참고 자료&lt;/a&gt; - 도서, 강좌, 커뮤니티&lt;/li&gt;
&lt;li&gt;&lt;a href="https://advanced-beginner.github.io/ko/docs/scala/appendix/faq/"&gt;FAQ&lt;/a&gt; - 자주 묻는 질문&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>용어 사전</title><link>https://advanced-beginner.github.io/ko/docs/spark/appendix/glossary/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/spark/appendix/glossary/</guid><description>&lt;p&gt;Spark에서 사용되는 주요 용어와 개념을 정리합니다. 각 용어에서 관련 문서로 이동할 수 있습니다.&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;핵심 추상화&lt;/strong&gt;: SparkSession(진입점) → Application → Job → Stage → Task&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;데이터 구조&lt;/strong&gt;: RDD(저수준) &amp;lt; DataFrame(스키마, Row) &amp;lt; Dataset(타입 안전)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;실행 모델&lt;/strong&gt;: Transformation(지연 평가) + Action(실제 실행) = DAG 기반 실행&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;성능 핵심&lt;/strong&gt;: Partition(분할 단위), Shuffle(데이터 재분배), Cache/Persist(재사용)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;최적화 도구&lt;/strong&gt;: Catalyst Optimizer(쿼리 최적화), Tungsten(실행 엔진), AQE(런타임 최적화)&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h2 id="핵심-개념"&gt;핵심 개념&lt;a class="anchor" href="#%ed%95%b5%ec%8b%ac-%ea%b0%9c%eb%85%90"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Action&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;RDD/DataFrame의 실제 계산을 트리거하고 결과를 반환하는 연산. &lt;code&gt;count()&lt;/code&gt;, &lt;code&gt;collect()&lt;/code&gt;, &lt;code&gt;show()&lt;/code&gt;, &lt;code&gt;write()&lt;/code&gt; 등이 있다.
→ &lt;a href="https://advanced-beginner.github.io/ko/docs/spark/concepts/transformations-actions/"&gt;Transformation과 Action&lt;/a&gt;&lt;/p&gt;</description></item><item><title>핵심 구성요소</title><link>https://advanced-beginner.github.io/ko/docs/elasticsearch/concepts/core-components/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/elasticsearch/concepts/core-components/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cluster&lt;/strong&gt;: 여러 노드를 묶어 고가용성과 분산 처리를 제공하는 서버 그룹&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Node&lt;/strong&gt;: 클러스터를 구성하는 단일 Elasticsearch 서버 (Master, Data, Coordinating 역할)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Index&lt;/strong&gt;: 문서들의 논리적 모음 (RDB의 테이블과 유사)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Document&lt;/strong&gt;: JSON 형태의 데이터 단위 (RDB의 Row와 유사)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shard&lt;/strong&gt;: 인덱스를 수평 분할한 조각 (Primary/Replica로 구성)&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Elasticsearch를 처음 접하는 개발자
&lt;strong&gt;선수 지식&lt;/strong&gt;: JSON 기본 문법, REST API 개념&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;
&lt;p&gt;Elasticsearch의 핵심 구성요소인 Cluster, Node, Index, Document, Shard의 역할과 관계를 이해합니다.&lt;/p&gt;</description></item><item><title>핵심 구성요소</title><link>https://advanced-beginner.github.io/ko/docs/kafka/concepts/core-components/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kafka/concepts/core-components/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Producer&lt;/strong&gt;: 메시지를 발행하고 Partition을 선택하여 Broker로 전송&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consumer&lt;/strong&gt;: Consumer Group 단위로 Partition에서 메시지를 읽고 Offset 관리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Broker&lt;/strong&gt;: 메시지를 저장하고 복제하며 Leader/Follower 구조로 고가용성 제공&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Topic&lt;/strong&gt;: 메시지를 논리적으로 분류하는 채널&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Partition&lt;/strong&gt;: Topic을 물리적으로 분할하여 병렬 처리 가능하게 하는 단위&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Kafka를 처음 접하는 개발자 또는 분산 메시지 시스템의 기본 개념을 학습하려는 분&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;: 기본적인 네트워크 통신 개념, REST API 사용 경험, Spring Boot 기초&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Kafka는 다섯 가지 핵심 구성요소로 이루어져 있습니다. Producer는 메시지를 발행하고, Consumer는 메시지를 소비하며, Broker는 메시지를 저장하고 전달합니다. Topic은 메시지를 논리적으로 분류하는 채널이고, Partition은 Topic을 물리적으로 분할하여 병렬 처리를 가능하게 합니다. 이 다섯 가지 구성요소가 어떻게 상호작용하는지 이해하면 Kafka 기반 시스템을 설계하고 운영하는 데 필요한 기초를 갖추게 됩니다.&lt;/p&gt;</description></item><item><title>높은 지연시간 진단</title><link>https://advanced-beginner.github.io/ko/docs/observability/howto/debug-high-latency/</link><pubDate>Mon, 12 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/howto/debug-high-latency/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;대상 상황&lt;/strong&gt;: P99 응답시간이 SLA(500ms)를 초과
&lt;strong&gt;목표&lt;/strong&gt;: 병목 구간을 찾아 해결
&lt;strong&gt;소요 시간&lt;/strong&gt;: 15~30분 (문제 복잡도에 따라 상이)
&lt;strong&gt;성공 기준&lt;/strong&gt;: P99 응답시간이 SLA 임계값(500ms) 이하로 복구됨&lt;/p&gt;
&lt;/blockquote&gt;&lt;h2 id="문제-상황"&gt;문제 상황&lt;a class="anchor" href="#%eb%ac%b8%ec%a0%9c-%ec%83%81%ed%99%a9"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Alert: HighP99Latency
Service: order-service
P99: 2.5s (Threshold: 500ms)
Duration: 10 minutes&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="진단-워크플로우"&gt;진단 워크플로우&lt;a class="anchor" href="#%ec%a7%84%eb%8b%a8-%ec%9b%8c%ed%81%ac%ed%94%8c%eb%a1%9c%ec%9a%b0"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class="mermaid"&gt;graph TD
 A[&amp;#34;1. 범위 파악&amp;lt;br&amp;gt;어떤 서비스? 언제부터?&amp;#34;]
 B[&amp;#34;2. 구간 분석&amp;lt;br&amp;gt;어디서 느린가?&amp;#34;]
 C[&amp;#34;3. 리소스 점검&amp;lt;br&amp;gt;CPU/메모리/DB?&amp;#34;]
 D[&amp;#34;4. 근본 원인&amp;lt;br&amp;gt;코드? 쿼리? 외부?&amp;#34;]
 E[&amp;#34;5. 해결&amp;#34;]

 A --&amp;gt; B --&amp;gt; C --&amp;gt; D --&amp;gt; E&lt;/pre&gt;&lt;h2 id="step-1-범위-파악"&gt;Step 1: 범위 파악&lt;a class="anchor" href="#step-1-%eb%b2%94%ec%9c%84-%ed%8c%8c%ec%95%85"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="영향-범위-확인"&gt;영향 범위 확인&lt;a class="anchor" href="#%ec%98%81%ed%96%a5-%eb%b2%94%ec%9c%84-%ed%99%95%ec%9d%b8"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-promql" data-lang="promql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 어떤 서비스가 느린가?&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;topk&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;histogram_quantile&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;service&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;le&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;rate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;http_request_duration_seconds_bucket&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;5m&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 언제부터 느려졌나?&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;histogram_quantile&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;le&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;rate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;http_request_duration_seconds_bucket&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;#34;&lt;/span&gt;&lt;span class="s"&gt;order-service&lt;/span&gt;&lt;span class="p"&gt;&amp;#34;}[&lt;/span&gt;&lt;span class="s"&gt;5m&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# → Time range: Last 1 hour&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="특정-엔드포인트-확인"&gt;특정 엔드포인트 확인&lt;a class="anchor" href="#%ed%8a%b9%ec%a0%95-%ec%97%94%eb%93%9c%ed%8f%ac%ec%9d%b8%ed%8a%b8-%ed%99%95%ec%9d%b8"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-promql" data-lang="promql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 엔드포인트별 P99&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;histogram_quantile&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;le&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;rate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;http_request_duration_seconds_bucket&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;#34;&lt;/span&gt;&lt;span class="s"&gt;order-service&lt;/span&gt;&lt;span class="p"&gt;&amp;#34;}[&lt;/span&gt;&lt;span class="s"&gt;5m&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;결과&lt;/strong&gt;: &lt;code&gt;/orders&lt;/code&gt; POST 엔드포인트가 느림&lt;/p&gt;</description></item><item><title>환경 구성</title><link>https://advanced-beginner.github.io/ko/docs/observability/examples/setup/</link><pubDate>Mon, 12 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/examples/setup/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 15분
&lt;strong&gt;선수 지식&lt;/strong&gt;: Docker, Docker Compose 기본
&lt;strong&gt;이 문서를 읽으면&lt;/strong&gt;: 로컬에 완전한 Observability 스택을 구축할 수 있습니다&lt;/p&gt;
&lt;/blockquote&gt;&lt;h2 id="전체-아키텍처"&gt;전체 아키텍처&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%ec%95%84%ed%82%a4%ed%85%8d%ec%b2%98"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class="mermaid"&gt;graph TB
 APP[&amp;#34;Spring Boot App&amp;#34;] --&amp;gt; |&amp;#34;metrics&amp;#34;| PROM[&amp;#34;Prometheus&amp;#34;]
 APP --&amp;gt; |&amp;#34;logs&amp;#34;| LOKI[&amp;#34;Loki&amp;#34;]
 APP --&amp;gt; |&amp;#34;traces&amp;#34;| TEMPO[&amp;#34;Tempo&amp;#34;]

 PROM --&amp;gt; GF[&amp;#34;Grafana&amp;#34;]
 LOKI --&amp;gt; GF
 TEMPO --&amp;gt; GF

 PROM --&amp;gt; AM[&amp;#34;Alertmanager&amp;#34;]&lt;/pre&gt;&lt;h2 id="step-1-디렉토리-구조-생성"&gt;Step 1: 디렉토리 구조 생성&lt;a class="anchor" href="#step-1-%eb%94%94%eb%a0%89%ed%86%a0%eb%a6%ac-%ea%b5%ac%ec%a1%b0-%ec%83%9d%ec%84%b1"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p observability-stack/&lt;span class="o"&gt;{&lt;/span&gt;prometheus/rules,grafana/&lt;span class="o"&gt;{&lt;/span&gt;provisioning/datasources,provisioning/dashboards,dashboards&lt;span class="o"&gt;}&lt;/span&gt;,loki,promtail&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; observability-stack&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-2-docker-compose-작성"&gt;Step 2: Docker Compose 작성&lt;a class="anchor" href="#step-2-docker-compose-%ec%9e%91%ec%84%b1"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# docker-compose.yml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 메트릭 수집&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;prometheus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;prom/prometheus:v2.50.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;prometheus&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;9090:9090&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./prometheus/rules:/etc/prometheus/rules&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;prometheus-data:/prometheus&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;--config.file=/etc/prometheus/prometheus.yml&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;--storage.tsdb.path=/prometheus&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;--web.enable-lifecycle&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;--web.enable-remote-write-receiver&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 알림 관리&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;alertmanager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;prom/alertmanager:v0.26.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;alertmanager&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;9093:9093&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 시각화&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;grafana&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;grafana/grafana:10.3.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;grafana&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;3000:3000&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;GF_SECURITY_ADMIN_PASSWORD=admin&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;GF_AUTH_ANONYMOUS_ENABLED=true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;GF_AUTH_ANONYMOUS_ORG_ROLE=Viewer&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./grafana/provisioning:/etc/grafana/provisioning&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./grafana/dashboards:/var/lib/grafana/dashboards&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;grafana-data:/var/lib/grafana&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 로그 수집&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;loki&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;grafana/loki:2.9.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;loki&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;3100:3100&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./loki/loki.yml:/etc/loki/local-config.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;loki-data:/loki&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="l"&gt;config.file=/etc/loki/local-config.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 로그 에이전트&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;promtail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;grafana/promtail:2.9.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;promtail&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./promtail/promtail.yml:/etc/promtail/config.yml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;/var/log:/var/log:ro&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;/var/lib/docker/containers:/var/lib/docker/containers:ro&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="l"&gt;config.file=/etc/promtail/config.yml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 분산 추적&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tempo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;grafana/tempo:2.3.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;tempo&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;4317:4317&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# OTLP gRPC&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;4318:4318&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# OTLP HTTP&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;3200:3200&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Tempo API&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./tempo/tempo.yml:/etc/tempo/config.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;tempo-data:/var/tempo&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="l"&gt;config.file=/etc/tempo/config.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;prometheus-data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;grafana-data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;loki-data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;tempo-data:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-3-prometheus-설정"&gt;Step 3: Prometheus 설정&lt;a class="anchor" href="#step-3-prometheus-%ec%84%a4%ec%a0%95"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# prometheus/prometheus.yml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;global&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;scrape_interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;15s&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;evaluation_interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;15s&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;alerting&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;alertmanagers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;static_configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;targets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;alertmanager:9093&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;rule_files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;/etc/prometheus/rules/*.yml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;scrape_configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;job_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;prometheus&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;static_configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;targets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;localhost:9090&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;job_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;spring-app&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;metrics_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/actuator/prometheus&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;static_configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;targets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;host.docker.internal:8080&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-4-loki-설정"&gt;Step 4: Loki 설정&lt;a class="anchor" href="#step-4-loki-%ec%84%a4%ec%a0%95"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# loki/loki.yml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;auth_enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;http_listen_port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;common&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path_prefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/loki&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;filesystem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;chunks_directory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/loki/chunks&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;rules_directory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/loki/rules&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;replication_factor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ring&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;instance_addr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;127.0.0.1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;kvstore&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;store&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;inmemory&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;schema_config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ld"&gt;2020-10-24&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;store&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;boltdb-shipper&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;object_store&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;filesystem&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v11&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;index_&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;period&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;24h&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;limits_config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;retention_period&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;168h&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-5-promtail-설정"&gt;Step 5: Promtail 설정&lt;a class="anchor" href="#step-5-promtail-%ec%84%a4%ec%a0%95"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# promtail/promtail.yml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;http_listen_port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;9080&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;positions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/tmp/positions.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;clients&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;http://loki:3100/loki/api/v1/push&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;scrape_configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;job_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;containers&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;static_configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;targets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;localhost&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;job&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;containerlogs&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;__path__&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/var/lib/docker/containers/*/*log&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;pipeline_stages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;json&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;expressions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;log&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;stream&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;attrs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;json&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;expressions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;attrs&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;regex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;expression&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;(?P&amp;lt;container_name&amp;gt;(?:[^|]*[^|]))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;tag&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;stream:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-6-tempo-설정"&gt;Step 6: Tempo 설정&lt;a class="anchor" href="#step-6-tempo-%ec%84%a4%ec%a0%95"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# tempo/tempo.yml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;http_listen_port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3200&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;distributor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;receivers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;otlp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;protocols&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;grpc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0.0.0.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;4317&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0.0.0.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;4318&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;backend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;local&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;local&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/var/tempo/traces&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;wal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/var/tempo/wal&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metrics_generator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;external_labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;tempo&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/var/tempo/generator/wal&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;remote_write&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;http://prometheus:9090/api/v1/write&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;send_exemplars&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-7-grafana-데이터소스-설정"&gt;Step 7: Grafana 데이터소스 설정&lt;a class="anchor" href="#step-7-grafana-%eb%8d%b0%ec%9d%b4%ed%84%b0%ec%86%8c%ec%8a%a4-%ec%84%a4%ec%a0%95"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# grafana/provisioning/datasources/datasources.yml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;datasources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Prometheus&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;prometheus&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;proxy&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;http://prometheus:9090&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;isDefault&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Loki&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;loki&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;proxy&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;http://loki:3100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Tempo&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;tempo&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;proxy&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;http://tempo:3200&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;jsonData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tracesToLogsV2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;datasourceUid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;loki&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;filterByTraceID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tracesToMetrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;datasourceUid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;prometheus&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;serviceMap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;datasourceUid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;prometheus&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-8-alertmanager-설정"&gt;Step 8: Alertmanager 설정&lt;a class="anchor" href="#step-8-alertmanager-%ec%84%a4%ec%a0%95"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p alertmanager&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# alertmanager/alertmanager.yml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;global&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;resolve_timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;5m&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;route&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;receiver&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;default&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;group_by&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;alertname&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;job&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;group_wait&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;30s&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;group_interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;5m&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;repeat_interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;4h&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;receivers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;default&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;webhook_configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;http://localhost:5001/&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;send_resolved&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-9-스택-실행"&gt;Step 9: 스택 실행&lt;a class="anchor" href="#step-9-%ec%8a%a4%ed%83%9d-%ec%8b%a4%ed%96%89"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose up -d&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;예상 출력:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>환경 설정</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/examples/setup/</link><pubDate>Sun, 11 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/examples/setup/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: 로컬에서 Kubernetes를 실습하고 싶은 개발자
&lt;strong&gt;선수 지식&lt;/strong&gt;: Docker 기본
&lt;strong&gt;이 문서를 읽으면&lt;/strong&gt;: Minikube 또는 Kind로 로컬 Kubernetes 환경을 구성할 수 있습니다&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;Minikube: 단일 노드, 초보자에게 권장, 다양한 애드온 지원&lt;/li&gt;
&lt;li&gt;Kind: 다중 노드 가능, CI/CD에 적합, 빠른 클러스터 생성&lt;/li&gt;
&lt;li&gt;Docker Desktop: macOS/Windows에서 가장 간단한 설정&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h2 id="로컬-kubernetes-옵션-비교"&gt;로컬 Kubernetes 옵션 비교&lt;a class="anchor" href="#%eb%a1%9c%ec%bb%ac-kubernetes-%ec%98%b5%ec%85%98-%eb%b9%84%ea%b5%90"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;도구&lt;/th&gt;
 &lt;th&gt;장점&lt;/th&gt;
 &lt;th&gt;단점&lt;/th&gt;
 &lt;th&gt;적합한 경우&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Minikube&lt;/td&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;Kind&lt;/td&gt;
 &lt;td&gt;빠름, 다중 노드, CI 친화&lt;/td&gt;
 &lt;td&gt;애드온 적음&lt;/td&gt;
 &lt;td&gt;CI/CD, 테스트&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Docker Desktop&lt;/td&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;k3d&lt;/td&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;h2 id="minikube-설치"&gt;Minikube 설치&lt;a class="anchor" href="#minikube-%ec%84%a4%ec%b9%98"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="설치"&gt;설치&lt;a class="anchor" href="#%ec%84%a4%ec%b9%98"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="book-tabs"&gt;
&lt;input type="radio" class="toggle" name="tabs-1" id="tabs-1-0" checked="checked" /&gt;&lt;label for="tabs-1-0"&gt;macOS&lt;/label&gt;&lt;div class="book-tabs-content markdown-inner"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Homebrew로 설치&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install minikube
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 버전 확인&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;minikube version&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;input type="radio" class="toggle" name="tabs-1" id="tabs-1-1" /&gt;&lt;label for="tabs-1-1"&gt;Linux&lt;/label&gt;&lt;div class="book-tabs-content markdown-inner"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 바이너리 다운로드&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 설치&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo install minikube-linux-amd64 /usr/local/bin/minikube
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 버전 확인&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;minikube version&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;input type="radio" class="toggle" name="tabs-1" id="tabs-1-2" /&gt;&lt;label for="tabs-1-2"&gt;Windows&lt;/label&gt;&lt;div class="book-tabs-content markdown-inner"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Chocolatey로 설치&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;choco&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;minikube&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 또는 수동 설치&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# https://minikube.sigs.k8s.io/docs/start/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="클러스터-시작"&gt;클러스터 시작&lt;a class="anchor" href="#%ed%81%b4%eb%9f%ac%ec%8a%a4%ed%84%b0-%ec%8b%9c%ec%9e%91"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 기본 설정으로 시작&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;minikube start
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 리소스 지정&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;minikube start --cpus&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt; --memory&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;8192&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 특정 Kubernetes 버전 사용&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;minikube start --kubernetes-version&lt;span class="o"&gt;=&lt;/span&gt;v1.29.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 드라이버 지정&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;minikube start --driver&lt;span class="o"&gt;=&lt;/span&gt;docker&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;사용 가능한 드라이버는 다음과 같습니다.&lt;/p&gt;</description></item><item><title>Aggregate 경계 정하기</title><link>https://advanced-beginner.github.io/ko/docs/ddd/howto/aggregate-boundaries/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/ddd/howto/aggregate-boundaries/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;해결하는 문제&lt;/strong&gt;: Aggregate를 너무 크게 만들어 성능 이슈가 발생하거나, 너무 작게 만들어 일관성이 깨지는 상황
&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 30분
&lt;strong&gt;전제 조건&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/ddd/concepts/aggregate/"&gt;Aggregate 심화&lt;/a&gt; 문서를 읽었다고 가정&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote class="book-hint warning"&gt;&lt;strong&gt;성공 기준&lt;/strong&gt;&lt;br&gt;&lt;p&gt;이 가이드를 완료하면 다음을 할 수 있습니다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;불변식을 식별하여 Aggregate 경계를 결정&lt;/li&gt;
&lt;li&gt;4가지 판단 질문으로 Entity 포함 여부를 결정&lt;/li&gt;
&lt;li&gt;경계가 잘못되었을 때의 신호를 인식&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2 id="1-핵심-불변식-식별하기"&gt;1. 핵심 불변식 식별하기&lt;a class="anchor" href="#1-%ed%95%b5%ec%8b%ac-%eb%b6%88%eb%b3%80%ec%8b%9d-%ec%8b%9d%eb%b3%84%ed%95%98%ea%b8%b0"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;불변식(Invariant)&lt;/strong&gt;은 항상 참이어야 하는 비즈니스 규칙입니다. Aggregate 경계를 정하는 가장 중요한 기준입니다.&lt;/p&gt;
&lt;h3 id="11-비즈니스-규칙-나열하기"&gt;1.1 비즈니스 규칙 나열하기&lt;a class="anchor" href="#11-%eb%b9%84%ec%a6%88%eb%8b%88%ec%8a%a4-%ea%b7%9c%ec%b9%99-%eb%82%98%ec%97%b4%ed%95%98%ea%b8%b0"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;대상 도메인의 비즈니스 규칙을 모두 나열하라:&lt;/p&gt;</description></item><item><title>Consumer Lag 진단 및 해결</title><link>https://advanced-beginner.github.io/ko/docs/kafka/howto/consumer-lag-troubleshooting/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kafka/howto/consumer-lag-troubleshooting/</guid><description>&lt;p&gt;Consumer Lag가 발생했을 때 원인을 진단하고 해결하는 방법을 단계별로 안내합니다.&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Consumer Lag&lt;/strong&gt;: Consumer가 읽지 못한 메시지 수 (Producer 속도 &amp;gt; Consumer 처리 속도)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;진단&lt;/strong&gt;: &lt;code&gt;kafka-consumer-groups.sh&lt;/code&gt;로 Lag 확인, 모니터링 도구로 추이 분석&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;해결&lt;/strong&gt;: Consumer 수 증가, 처리 로직 최적화, Partition 수 조정, 배치 설정 튜닝&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h2 id="consumer-lag란"&gt;Consumer Lag란?&lt;a class="anchor" href="#consumer-lag%eb%9e%80"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Consumer Lag는 Producer가 발행한 메시지 중 Consumer가 아직 읽지 못한 메시지의 수입니다. Lag가 지속적으로 증가하면 메시지 처리 지연이 발생하고, 최악의 경우 메시지가 보관 기간을 초과하여 삭제될 수 있습니다.&lt;/p&gt;</description></item><item><title>프로젝트 설정</title><link>https://advanced-beginner.github.io/ko/docs/ddd/examples/setup/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/ddd/examples/setup/</guid><description>&lt;h1 id="프로젝트-설정"&gt;프로젝트 설정&lt;a class="anchor" href="#%ed%94%84%eb%a1%9c%ec%a0%9d%ed%8a%b8-%ec%84%a4%ec%a0%95"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;DDD 계층형 아키텍처(Domain, Application, Infrastructure, Interfaces)로 패키지 구성&lt;/li&gt;
&lt;li&gt;Spring Boot 3.2.x + Spring Kafka + JPA 기반 의존성 설정&lt;/li&gt;
&lt;li&gt;AggregateRoot, DomainEvent, Entity 기반 클래스 구현&lt;/li&gt;
&lt;li&gt;Docker Compose로 Kafka + PostgreSQL 개발 환경 구축&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h2 id="대상-독자-및-선수-지식"&gt;대상 독자 및 선수 지식&lt;a class="anchor" href="#%eb%8c%80%ec%83%81-%eb%8f%85%ec%9e%90-%eb%b0%8f-%ec%84%a0%ec%88%98-%ec%a7%80%ec%8b%9d"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;항목&lt;/th&gt;
 &lt;th&gt;요구 수준&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;DDD 패턴을 Spring Boot에 적용하려는 백엔드 개발자&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Java&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Java 17+ 문법, Record, Stream API&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Spring Boot&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Spring Boot 기본 구조, DI, @Service, @Repository&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Gradle&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Kotlin DSL 기본 문법&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Docker&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;docker-compose up/down 실행 경험&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;DDD 예제 프로젝트의 구조와 의존성을 설정합니다.&lt;/p&gt;</description></item><item><title>환경 구성</title><link>https://advanced-beginner.github.io/ko/docs/kafka/examples/setup/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kafka/examples/setup/</guid><description>&lt;p&gt;Spring Boot에서 Kafka를 사용하기 위한 환경 설정 레퍼런스입니다.&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kafka 실행&lt;/strong&gt;: Docker Compose로 KRaft 모드 Kafka 3.6.1 실행&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;의존성&lt;/strong&gt;: &lt;code&gt;spring-kafka&lt;/code&gt;, &lt;code&gt;spring-boot-starter-web&lt;/code&gt; 추가&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;기본 설정&lt;/strong&gt;: &lt;code&gt;bootstrap-servers&lt;/code&gt;, Serializer/Deserializer, &lt;code&gt;group-id&lt;/code&gt; 설정&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;프로덕션&lt;/strong&gt;: &lt;code&gt;acks: all&lt;/code&gt;, &lt;code&gt;enable.idempotence: true&lt;/code&gt;로 안정성 확보&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h4 id="대상-독자-및-선수-지식"&gt;대상 독자 및 선수 지식&lt;a class="anchor" href="#%eb%8c%80%ec%83%81-%eb%8f%85%ec%9e%90-%eb%b0%8f-%ec%84%a0%ec%88%98-%ec%a7%80%ec%8b%9d"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;항목&lt;/th&gt;
 &lt;th&gt;설명&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Spring Boot 프로젝트에서 Kafka 환경을 구성하려는 개발자&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Docker 기본 사용법, Gradle 또는 Maven 빌드 도구, Spring Boot 설정 파일(application.yml)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;필수 도구&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Docker Desktop 또는 Docker Engine, JDK 17+, IDE (IntelliJ IDEA 권장)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;예상 소요 시간&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;약 15분&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Quick Start를 완료했다면 이미 기본 환경을 구성한 것입니다. 이 문서는 설정 상세 내용과 프로덕션 환경 구성을 위한 참조 문서입니다.&lt;/p&gt;</description></item><item><title>환경 설정</title><link>https://advanced-beginner.github.io/ko/docs/elasticsearch/examples/setup/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/elasticsearch/examples/setup/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Docker Compose&lt;/strong&gt;로 Elasticsearch 8.11 + Kibana 환경을 빠르게 구성합니다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spring Boot 3.2&lt;/strong&gt; + Spring Data Elasticsearch로 연동 설정을 완료합니다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nori 분석기&lt;/strong&gt;를 설치하여 한글 검색을 준비합니다&lt;/li&gt;
&lt;li&gt;전체 소요 시간: 약 15분&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;버전 정보&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Elasticsearch / Kibana&lt;/strong&gt;: 8.11.0&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spring Boot&lt;/strong&gt;: 3.2.0&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spring Data Elasticsearch&lt;/strong&gt;: 5.2.x (Spring Boot 3.2에 포함)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Java&lt;/strong&gt;: 17+&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;Docker로 Elasticsearch + Kibana를 구성하고, Spring Boot 프로젝트를 설정합니다.&lt;/p&gt;
&lt;h2 id="docker-환경-구성"&gt;Docker 환경 구성&lt;a class="anchor" href="#docker-%ed%99%98%ea%b2%bd-%ea%b5%ac%ec%84%b1"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="docker-composeyml"&gt;docker-compose.yml&lt;a class="anchor" href="#docker-composeyml"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;docker/elasticsearch/docker-compose.yml&lt;/code&gt; 파일:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3.8&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;elasticsearch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;docker.elastic.co/elasticsearch/elasticsearch:8.11.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;elasticsearch&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;discovery.type=single-node&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;xpack.security.enabled=false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;xpack.security.enrollment.enabled=false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;ES_JAVA_OPTS=-Xms512m -Xmx512m&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;9200:9200&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;9300:9300&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;elasticsearch-data:/usr/share/elasticsearch/data&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;healthcheck&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CMD-SHELL&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;curl -s http://localhost:9200/_cluster/health | grep -q &amp;#39;\&amp;#34;status\&amp;#34;:\&amp;#34;green\&amp;#34;\\|\&amp;#34;status\&amp;#34;:\&amp;#34;yellow\&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;10s&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;10s&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;retries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;elastic&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;kibana&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;docker.elastic.co/kibana/kibana:8.11.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kibana&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;ELASTICSEARCH_HOSTS=http://elasticsearch:9200&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;5601:5601&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;depends_on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;elasticsearch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;service_healthy&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;elastic&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;elasticsearch-data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;local&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;elastic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;bridge&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="설정-설명"&gt;설정 설명&lt;a class="anchor" href="#%ec%84%a4%ec%a0%95-%ec%84%a4%eb%aa%85"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;설정&lt;/th&gt;
 &lt;th&gt;값&lt;/th&gt;
 &lt;th&gt;설명&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;discovery.type&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;single-node&lt;/td&gt;
 &lt;td&gt;단일 노드 모드 (개발용)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;xpack.security.enabled&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;false&lt;/td&gt;
 &lt;td&gt;보안 비활성화 (개발용)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ES_JAVA_OPTS&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;-Xms512m -Xmx512m&lt;/td&gt;
 &lt;td&gt;JVM 힙 메모리 (최소=최대)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;9200&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;HTTP API 포트&lt;/td&gt;
 &lt;td&gt;REST API 통신용&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;9300&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Transport 포트&lt;/td&gt;
 &lt;td&gt;노드 간 통신용&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;프로덕션 환경에서는&lt;/strong&gt; 반드시 보안을 활성화하고, 적절한 메모리를 할당하세요.&lt;/p&gt;</description></item><item><title>환경 설정</title><link>https://advanced-beginner.github.io/ko/docs/scala/examples/setup/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/examples/setup/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Coursier&lt;/strong&gt;로 JDK, sbt, Scala CLI를 한 번에 설치&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sbt&lt;/strong&gt;는 Scala의 표준 빌드 도구로 컴파일, 테스트, 의존성 관리 담당&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IntelliJ IDEA&lt;/strong&gt; 또는 &lt;strong&gt;VS Code + Metals&lt;/strong&gt;로 IDE 설정&lt;/li&gt;
&lt;li&gt;프로젝트 구조: &lt;code&gt;build.sbt&lt;/code&gt; (설정) + &lt;code&gt;src/main/scala/&lt;/code&gt; (소스) + &lt;code&gt;src/test/scala/&lt;/code&gt; (테스트)&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Scala 프로그래밍을 처음 시작하는 개발자&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;기본적인 터미널/명령줄 사용법&lt;/li&gt;
&lt;li&gt;Java 또는 다른 JVM 언어 경험 (권장)&lt;/li&gt;
&lt;li&gt;IDE 사용 경험&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;Scala 개발 환경을 설정하는 방법을 상세히 설명합니다. Scala 프로그래밍을 시작하려면 JDK, sbt(Scala Build Tool), 그리고 IDE가 필요합니다. 이 문서에서는 각 도구의 설치 방법과 설정 과정을 단계별로 안내합니다.&lt;/p&gt;</description></item><item><title>환경 설정</title><link>https://advanced-beginner.github.io/ko/docs/spark/examples/setup/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/spark/examples/setup/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gradle 의존성&lt;/strong&gt;: &lt;code&gt;spark-core_2.13:3.5.1&lt;/code&gt;, &lt;code&gt;spark-sql_2.13:3.5.1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;로깅 충돌 방지&lt;/strong&gt;: &lt;code&gt;exclude group: 'org.slf4j'&lt;/code&gt; 필수&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SparkSession&lt;/strong&gt;: &lt;code&gt;getOrCreate()&lt;/code&gt;로 싱글톤 관리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows&lt;/strong&gt;: winutils 설정 필요&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h2 id="대상-독자-및-선수-지식"&gt;대상 독자 및 선수 지식&lt;a class="anchor" href="#%eb%8c%80%ec%83%81-%eb%8f%85%ec%9e%90-%eb%b0%8f-%ec%84%a0%ec%88%98-%ec%a7%80%ec%8b%9d"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;구분&lt;/th&gt;
 &lt;th&gt;내용&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Java/Spring Boot 프로젝트에 Spark를 도입하려는 개발자&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Java 17, Gradle 기본, Spring Boot 경험 (선택)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;학습 목표&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;로컬 환경에서 Spark 애플리케이션을 실행할 수 있다&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;예상 소요 시간&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;약 15분&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;p&gt;Java/Spring Boot 프로젝트에서 Spark를 사용하기 위한 환경을 구성합니다.&lt;/p&gt;
&lt;h2 id="순수-java-프로젝트"&gt;순수 Java 프로젝트&lt;a class="anchor" href="#%ec%88%9c%ec%88%98-java-%ed%94%84%eb%a1%9c%ec%a0%9d%ed%8a%b8"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;가장 간단한 구성입니다.&lt;/p&gt;</description></item><item><title>전술적 설계</title><link>https://advanced-beginner.github.io/ko/docs/ddd/concepts/tactical-design/</link><pubDate>Tue, 17 Feb 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/ddd/concepts/tactical-design/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: DDD 빌딩 블록을 코드로 구현하고 싶은 백엔드 개발자
&lt;strong&gt;선수 지식&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/ddd/concepts/strategic-design/"&gt;전략적 설계&lt;/a&gt;를 읽었거나 Bounded Context 개념에 대한 이해
&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 40분
&lt;strong&gt;핵심 질문&lt;/strong&gt;: &amp;ldquo;도메인 모델을 어떤 패턴으로 구현해야 하는가?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;요약&lt;/strong&gt;&lt;br&gt;전술적 설계 빌딩 블록: &lt;strong&gt;Entity&lt;/strong&gt;(식별자로 구분) + &lt;strong&gt;Value Object&lt;/strong&gt;(값으로 구분) → &lt;strong&gt;Aggregate&lt;/strong&gt;(일관성 경계) + &lt;strong&gt;Repository&lt;/strong&gt;(영속화) + &lt;strong&gt;Domain Service&lt;/strong&gt;(도메인 로직) + &lt;strong&gt;Domain Event&lt;/strong&gt;(이벤트 통신)
&lt;/blockquote&gt;

&lt;p&gt;도메인 모델을 구체적으로 구현하기 위한 패턴들이 바로 전술적 설계입니다. 전략적 설계가 &amp;ldquo;큰 그림&amp;quot;을 그리는 것이라면, 전술적 설계는 &amp;ldquo;구체적인 구현 방법&amp;quot;을 제시합니다.&lt;/p&gt;</description></item><item><title>Bounded Context 식별하기</title><link>https://advanced-beginner.github.io/ko/docs/ddd/howto/bounded-context-identification/</link><pubDate>Fri, 16 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/ddd/howto/bounded-context-identification/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;해결하는 문제&lt;/strong&gt;: 시스템을 어떻게 나눠야 할지 모르거나, Context 경계를 잘못 정해서 팀 간 의존성이 높아진 상황
&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25분
&lt;strong&gt;전제 조건&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/ddd/concepts/strategic-design/"&gt;전략적 설계&lt;/a&gt; 문서를 읽었다고 가정&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote class="book-hint warning"&gt;&lt;strong&gt;성공 기준&lt;/strong&gt;&lt;br&gt;&lt;p&gt;이 가이드를 완료하면 다음을 할 수 있습니다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3가지 신호로 Context 경계를 식별&lt;/li&gt;
&lt;li&gt;도메인 전문가 인터뷰로 경계 검증&lt;/li&gt;
&lt;li&gt;잘못된 경계의 증상을 인식하고 수정&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2 id="1-context-경계가-필요한-신호-감지하기"&gt;1. Context 경계가 필요한 신호 감지하기&lt;a class="anchor" href="#1-context-%ea%b2%bd%ea%b3%84%ea%b0%80-%ed%95%84%ec%9a%94%ed%95%9c-%ec%8b%a0%ed%98%b8-%ea%b0%90%ec%a7%80%ed%95%98%ea%b8%b0"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음 3가지 신호를 확인하여 Bounded Context 분리가 필요한지 판단하세요.&lt;/p&gt;
&lt;h3 id="11-신호-1-같은-용어-다른-의미"&gt;1.1 신호 1: 같은 용어, 다른 의미&lt;a class="anchor" href="#11-%ec%8b%a0%ed%98%b8-1-%ea%b0%99%ec%9d%80-%ec%9a%a9%ec%96%b4-%eb%8b%a4%eb%a5%b8-%ec%9d%98%eb%af%b8"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;도메인 전문가와 대화할 때 &amp;ldquo;그 X 말고 다른 X요&amp;quot;라는 말이 나오면 Context 분리 신호입니다. 이 신호를 포착하세요.&lt;/p&gt;</description></item><item><title>Future 에러 처리</title><link>https://advanced-beginner.github.io/ko/docs/scala/howto/future-error-handling/</link><pubDate>Fri, 16 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/howto/future-error-handling/</guid><description>&lt;p&gt;비동기 코드에서 예외를 안전하게 처리하고 디버깅하는 방법을 안내합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 15-20분&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;recover&lt;/code&gt;/&lt;code&gt;recoverWith&lt;/code&gt;: 특정 예외를 처리하고 대체값 반환&lt;/li&gt;
&lt;li&gt;&lt;code&gt;transform&lt;/code&gt;: 성공/실패 모두 변환&lt;/li&gt;
&lt;li&gt;&lt;code&gt;onComplete&lt;/code&gt;: 부수 효과 (로깅 등)에만 사용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;절대 하지 말 것&lt;/strong&gt;: &lt;code&gt;Await.result&lt;/code&gt;로 예외를 동기적으로 던지기&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;hr&gt;
&lt;h2 id="이-가이드가-해결하는-문제"&gt;이 가이드가 해결하는 문제&lt;a class="anchor" href="#%ec%9d%b4-%ea%b0%80%ec%9d%b4%eb%93%9c%ea%b0%80-%ed%95%b4%ea%b2%b0%ed%95%98%eb%8a%94-%eb%ac%b8%ec%a0%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음 상황에서 이 가이드를 사용하세요:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Future에서 발생한 예외가 조용히 사라지는 경우&lt;/li&gt;
&lt;li&gt;비동기 코드의 에러를 어떻게 처리해야 할지 모를 때&lt;/li&gt;
&lt;li&gt;&lt;code&gt;recover&lt;/code&gt;, &lt;code&gt;recoverWith&lt;/code&gt;, &lt;code&gt;transform&lt;/code&gt; 중 어떤 것을 사용해야 할지 결정이 필요할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="증상"&gt;증상&lt;a class="anchor" href="#%ec%a6%9d%ec%83%81"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;scala.concurrent.Future&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;scala.concurrent.ExecutionContext.Implicits.global&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="n"&gt;future&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Future&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RuntimeException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Something went wrong&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;프로그램은&lt;/span&gt; &lt;span class="n"&gt;정상&lt;/span&gt; &lt;span class="n"&gt;종료되지만&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;예외는&lt;/span&gt; &lt;span class="n"&gt;어디로&lt;/span&gt; &lt;span class="n"&gt;갔을까&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="이-가이드가-다루지-않는-것"&gt;이 가이드가 다루지 않는 것&lt;a class="anchor" href="#%ec%9d%b4-%ea%b0%80%ec%9d%b4%eb%93%9c%ea%b0%80-%eb%8b%a4%eb%a3%a8%ec%a7%80-%ec%95%8a%eb%8a%94-%ea%b2%83"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Future의 기본 개념&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/concurrency/"&gt;동시성 개념 문서&lt;/a&gt;를 참조하세요&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cats Effect IO / ZIO의 에러 처리&lt;/strong&gt;: 해당 라이브러리 문서를 참조하세요&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;액터 시스템(Akka)의 에러 처리&lt;/strong&gt;: Akka 문서를 참조하세요&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="시작하기-전에"&gt;시작하기 전에&lt;a class="anchor" href="#%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-%ec%a0%84%ec%97%90"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음 환경이 준비되어 있는지 확인하세요:&lt;/p&gt;</description></item><item><title>데이터 스큐 해결하기</title><link>https://advanced-beginner.github.io/ko/docs/spark/howto/data-skew/</link><pubDate>Fri, 16 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/spark/howto/data-skew/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;예상 소요 시간&lt;/strong&gt;: 약 20분
&lt;/blockquote&gt;

&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;진단&lt;/strong&gt;: Spark UI Stages 탭에서 Task Duration Min/Max 비교 (10배 이상 차이 = 스큐)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AQE 활성화&lt;/strong&gt;: &lt;code&gt;spark.sql.adaptive.skewJoin.enabled=true&lt;/code&gt; (Spark 3.0+)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;수동 해결&lt;/strong&gt;: Salting 기법으로 핫 키 분산&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h2 id="문제-정의"&gt;문제 정의&lt;a class="anchor" href="#%eb%ac%b8%ec%a0%9c-%ec%a0%95%ec%9d%98"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Spark 작업이 대부분 빠르게 완료되지만 &lt;strong&gt;일부 Task만 오래 걸리는&lt;/strong&gt; 현상이 발생합니다:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Stage 3: 199/200 tasks completed... (마지막 1개가 수십 분째 실행 중)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;이는 &lt;strong&gt;데이터 스큐(Data Skew)&lt;/strong&gt; - 특정 키에 데이터가 집중되어 해당 파티션만 과부하 상태가 됩니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="전제-조건"&gt;전제 조건&lt;a class="anchor" href="#%ec%a0%84%ec%a0%9c-%ec%a1%b0%ea%b1%b4"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;항목&lt;/th&gt;
 &lt;th&gt;요구 사항&lt;/th&gt;
 &lt;th&gt;확인 방법&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Spark 버전&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;2.4+ (AQE는 3.0+)&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;spark-submit --version&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Spark UI&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;접근 가능&lt;/td&gt;
 &lt;td&gt;브라우저에서 &lt;code&gt;http://localhost:4040&lt;/code&gt; 열기&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;데이터&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;조인/그룹화에 사용되는 키 컬럼 존재&lt;/td&gt;
 &lt;td&gt;스키마에서 키 컬럼 확인&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;지원 환경&lt;/strong&gt;: Linux, macOS, Windows (WSL2 권장)&lt;/p&gt;</description></item><item><title>리소스 최적화</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/howto/resource-optimization/</link><pubDate>Fri, 16 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/howto/resource-optimization/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;목표&lt;/strong&gt;: 적절한 CPU/메모리 설정을 찾아 리소스 효율성을 높입니다
&lt;strong&gt;예상 시간&lt;/strong&gt;: 45분&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;이 가이드의 범위&lt;/strong&gt;&lt;br&gt;&lt;p&gt;&lt;strong&gt;다루는 내용&lt;/strong&gt;: 리소스 사용량 측정, requests/limits 적정값 산정, 스로틀링/OOM 해결&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;다루지 않는 내용&lt;/strong&gt;: 자동 스케일링(&lt;a href="../concepts/scaling/"&gt;스케일링&lt;/a&gt; 참조), Pod 시작 문제(&lt;a href="pod-troubleshooting/"&gt;Pod 트러블슈팅&lt;/a&gt; 참조)&lt;/p&gt;

&lt;/blockquote&gt;

&lt;h2 id="시작하기-전에"&gt;시작하기 전에&lt;a class="anchor" href="#%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-%ec%a0%84%ec%97%90"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음 조건을 확인하세요.&lt;/p&gt;
&lt;h3 id="1-kubectl-설치-및-버전-확인"&gt;1. kubectl 설치 및 버전 확인&lt;a class="anchor" href="#1-kubectl-%ec%84%a4%ec%b9%98-%eb%b0%8f-%eb%b2%84%ec%a0%84-%ed%99%95%ec%9d%b8"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl version --client&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;성공 시 출력:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Client Version: v1.28.0&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="2-metrics-server-설치-확인"&gt;2. Metrics Server 설치 확인&lt;a class="anchor" href="#2-metrics-server-%ec%84%a4%ec%b9%98-%ed%99%95%ec%9d%b8"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl top nodes&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;성공 시 출력:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
node-1 250m 12% 1024Mi 50%&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;오류가 발생하면 Metrics Server를 설치하세요.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>메모리 문제 해결</title><link>https://advanced-beginner.github.io/ko/docs/elasticsearch/howto/memory-troubleshooting/</link><pubDate>Fri, 16 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/elasticsearch/howto/memory-troubleshooting/</guid><description>&lt;p&gt;OutOfMemoryError나 GC 문제가 발생할 때 원인을 진단하고 해결하는 방법을 안내합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 20-40분 (GC 로그 분석 시 추가 10분)&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;이 가이드의 범위&lt;/strong&gt;&lt;br&gt;&lt;p&gt;&lt;strong&gt;다루는 내용&lt;/strong&gt;: 힙 메모리 설정, Circuit Breaker, Field Data 최적화, GC 튜닝&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;다루지 않는 내용&lt;/strong&gt;: 노드 추가, 하드웨어 업그레이드는 &lt;a href="../concepts/cluster-management/"&gt;클러스터 관리&lt;/a&gt;를 참조하세요.&lt;/p&gt;

&lt;/blockquote&gt;

&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;힙 메모리&lt;/strong&gt;: 전체 메모리의 50% 이하, 최대 31GB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Circuit Breaker&lt;/strong&gt;: 메모리 과사용 방지 설정 확인&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;필드 데이터&lt;/strong&gt;: text 필드 집계 피하기, doc_values 활용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GC 튜닝&lt;/strong&gt;: G1GC 사용, 로그 분석으로 문제 파악&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;hr&gt;
&lt;h2 id="시작하기-전에"&gt;시작하기 전에&lt;a class="anchor" href="#%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-%ec%a0%84%ec%97%90"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음 조건을 확인하세요:&lt;/p&gt;</description></item><item><title>Pod</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/pod/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/pod/</guid><description>&lt;h2 id="전체-비유-아파트-한-세대"&gt;전체 비유: 아파트 한 세대&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ec%95%84%ed%8c%8c%ed%8a%b8-%ed%95%9c-%ec%84%b8%eb%8c%80"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pod를 &lt;strong&gt;아파트 한 세대&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;아파트 세대 비유&lt;/th&gt;
 &lt;th&gt;Kubernetes Pod&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;Pod&lt;/td&gt;
 &lt;td&gt;최소 거주/배포 단위&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;세대 내 거주자들&lt;/td&gt;
 &lt;td&gt;Containers&lt;/td&gt;
 &lt;td&gt;함께 살며 자원 공유&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;세대 현관문&lt;/td&gt;
 &lt;td&gt;Pod IP&lt;/td&gt;
 &lt;td&gt;외부에서 접근하는 주소&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;거실/주방 공유&lt;/td&gt;
 &lt;td&gt;Network 공유&lt;/td&gt;
 &lt;td&gt;같은 Pod 내 localhost 통신&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;공용 창고&lt;/td&gt;
 &lt;td&gt;Volume&lt;/td&gt;
 &lt;td&gt;거주자들이 함께 사용하는 저장 공간&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;각자 방&lt;/td&gt;
 &lt;td&gt;Container 격리&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;Pod 삭제 시 모든 컨테이너 종료&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;원룸 vs 투룸&lt;/td&gt;
 &lt;td&gt;단일/멀티 컨테이너&lt;/td&gt;
 &lt;td&gt;대부분 원룸(1 컨테이너) 권장&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 Pod는 &amp;ldquo;한 세대에 여러 사람이 함께 살면서 주방과 거실을 공유&amp;quot;하는 것과 같습니다.&lt;/p&gt;</description></item><item><title>RDD 기초</title><link>https://advanced-beginner.github.io/ko/docs/spark/concepts/rdd/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/spark/concepts/rdd/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;RDD(Resilient Distributed Dataset)는 분산 불변 데이터 컬렉션으로 Spark의 기본 데이터 추상화&lt;/li&gt;
&lt;li&gt;Transformation(지연 평가)과 Action(즉시 실행)으로 데이터 처리&lt;/li&gt;
&lt;li&gt;Lineage를 통해 장애 발생 시 자동 복구 가능&lt;/li&gt;
&lt;li&gt;현재는 DataFrame/Dataset을 권장하지만, 저수준 제어가 필요할 때 RDD 사용&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Java/Spring 개발자, Spark 기본 개념을 학습하려는 초급자&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Java 컬렉션 API (List, Map 등)&lt;/li&gt;
&lt;li&gt;람다 표현식 및 함수형 프로그래밍 기초&lt;/li&gt;
&lt;li&gt;&lt;a href="https://advanced-beginner.github.io/ko/docs/spark/concepts/architecture/"&gt;아키텍처&lt;/a&gt; 문서 이해&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;RDD는 Spark의 가장 기본적인 데이터 추상화입니다. DataFrame과 Dataset의 기반이 되는 저수준 API로, Spark의 동작 원리를 이해하는 데 필수적입니다.&lt;/p&gt;</description></item><item><title>Traffic (트래픽)</title><link>https://advanced-beginner.github.io/ko/docs/observability/concepts/golden-signals/traffic/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/concepts/golden-signals/traffic/</guid><description>&lt;h2 id="전체-비유-병원-외래-환자-수"&gt;전체 비유: 병원 외래 환자 수&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%eb%b3%91%ec%9b%90-%ec%99%b8%eb%9e%98-%ed%99%98%ec%9e%90-%ec%88%98"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Traffic을 &lt;strong&gt;병원 외래 환자 방문량&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;병원 외래 비유&lt;/th&gt;
 &lt;th&gt;Traffic 개념&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;RPS (초당 요청)&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;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;p&gt;이처럼 병원이 환자 방문 패턴을 분석하여 의료진을 배치하듯, 트래픽 분석으로 시스템 용량을 계획합니다.&lt;/p&gt;</description></item><item><title>데이터 모델링</title><link>https://advanced-beginner.github.io/ko/docs/elasticsearch/concepts/data-modeling/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/elasticsearch/concepts/data-modeling/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mapping&lt;/strong&gt;: 문서 구조를 정의하는 스키마 (RDB의 테이블 정의와 유사)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;text&lt;/strong&gt;: 풀텍스트 검색용, Analyzer로 토큰화됨&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;keyword&lt;/strong&gt;: 정확한 값 매칭, 정렬/집계용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Analyzer&lt;/strong&gt;: 텍스트를 검색 가능한 토큰으로 변환 (한글은 Nori 사용)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;비정규화&lt;/strong&gt;: JOIN 없으므로 관련 데이터를 한 문서에 포함&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Elasticsearch 검색 기능을 사용하려는 개발자
&lt;strong&gt;선수 지식&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/elasticsearch/concepts/core-components/"&gt;핵심 구성요소&lt;/a&gt;, JSON 기본 문법&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;
&lt;h2 id="전체-비유-도서관의-도서-분류-시스템"&gt;전체 비유: 도서관의 도서 분류 시스템&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%eb%8f%84%ec%84%9c%ea%b4%80%ec%9d%98-%eb%8f%84%ec%84%9c-%eb%b6%84%eb%a5%98-%ec%8b%9c%ec%8a%a4%ed%85%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;데이터 모델링을 &lt;strong&gt;도서관의 도서 분류 체계&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;도서관 비유&lt;/th&gt;
 &lt;th&gt;Elasticsearch&lt;/th&gt;
 &lt;th&gt;역할&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;도서 분류 규칙 (DDC, KDC)&lt;/td&gt;
 &lt;td&gt;Mapping&lt;/td&gt;
 &lt;td&gt;책을 어떻게 분류하고 정리할지 정의&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;책 내용으로 검색&lt;/td&gt;
 &lt;td&gt;text 타입&lt;/td&gt;
 &lt;td&gt;&amp;ldquo;인공지능&amp;quot;을 검색하면 관련 내용 포함 도서 반환&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;청구기호로 정확히 찾기&lt;/td&gt;
 &lt;td&gt;keyword 타입&lt;/td&gt;
 &lt;td&gt;&amp;ldquo;005.133-P99&amp;rdquo; 정확히 일치하는 책 찾기&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;색인 담당 사서&lt;/td&gt;
 &lt;td&gt;Analyzer&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;Object (저자 정보)&lt;/td&gt;
 &lt;td&gt;단순 중첩&lt;/td&gt;
 &lt;td&gt;저자명, 생년 등 관련 정보 묶음&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Nested (시리즈 정보)&lt;/td&gt;
 &lt;td&gt;관계 유지&lt;/td&gt;
 &lt;td&gt;1권-2024년, 2권-2025년 각각 독립적 관계 유지&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 Mapping은 도서관에서 &amp;ldquo;어떤 기준으로 책을 분류하고 색인할 것인가&amp;quot;를 정하는 것과 같습니다.&lt;/p&gt;</description></item><item><title>메시지 흐름</title><link>https://advanced-beginner.github.io/ko/docs/kafka/concepts/message-flow/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kafka/concepts/message-flow/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;Producer가 메시지를 직렬화하고 Partitioner가 대상 Partition을 결정&lt;/li&gt;
&lt;li&gt;Key가 있으면 같은 Key는 같은 Partition으로 전송되어 순서 보장&lt;/li&gt;
&lt;li&gt;Broker는 메시지를 Partition에 저장하고 ISR에 복제 후 ACK 반환&lt;/li&gt;
&lt;li&gt;Consumer는 Pull 방식으로 메시지를 가져와 처리 후 Offset 커밋&lt;/li&gt;
&lt;li&gt;At-Most-Once, At-Least-Once, Exactly-Once 세 가지 전달 보장 수준 제공&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Kafka의 기본 구성요소를 이해한 개발자, 메시지 전달 과정의 상세 동작을 학습하려는 분&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/kafka/concepts/core-components/"&gt;핵심 구성요소&lt;/a&gt;의 Producer, Consumer, Broker, Topic, Partition 개념&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 20분&lt;/p&gt;</description></item><item><title>메트릭 기초</title><link>https://advanced-beginner.github.io/ko/docs/observability/concepts/metrics-fundamentals/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/concepts/metrics-fundamentals/</guid><description>&lt;h2 id="전체-비유-병원-의료-장비"&gt;전체 비유: 병원 의료 장비&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%eb%b3%91%ec%9b%90-%ec%9d%98%eb%a3%8c-%ec%9e%a5%eb%b9%84"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;메트릭 타입을 &lt;strong&gt;병원의 의료 장비&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;병원 장비 비유&lt;/th&gt;
 &lt;th&gt;메트릭 타입&lt;/th&gt;
 &lt;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;Gauge&lt;/td&gt;
 &lt;td&gt;현재 값 측정 (오르내림 가능)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;만보기&lt;/td&gt;
 &lt;td&gt;Counter&lt;/td&gt;
 &lt;td&gt;누적 카운트 (증가만 가능)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;혈압 분포 차트&lt;/td&gt;
 &lt;td&gt;Histogram&lt;/td&gt;
 &lt;td&gt;값의 분포 측정&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;체온 37.2도&lt;/td&gt;
 &lt;td&gt;Gauge 값&lt;/td&gt;
 &lt;td&gt;현재 상태&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;오늘 총 5000보&lt;/td&gt;
 &lt;td&gt;Counter 값&lt;/td&gt;
 &lt;td&gt;누적 합계&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;환자 80%가 혈압 120 이하&lt;/td&gt;
 &lt;td&gt;Percentile&lt;/td&gt;
 &lt;td&gt;분포의 백분위&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;일일 환자 수 변화&lt;/td&gt;
 &lt;td&gt;rate()&lt;/td&gt;
 &lt;td&gt;시간당 변화율&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;환자 평균 대기시간&lt;/td&gt;
 &lt;td&gt;avg()&lt;/td&gt;
 &lt;td&gt;집계 연산&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 체온계는 &amp;ldquo;현재 온도&amp;quot;를, 만보기는 &amp;ldquo;누적 걸음수&amp;quot;를 측정하듯, 메트릭 타입은 데이터의 본질에 맞게 선택해야 합니다.&lt;/p&gt;</description></item><item><title>제어 구조</title><link>https://advanced-beginner.github.io/ko/docs/scala/concepts/control-structures/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/concepts/control-structures/</guid><description>&lt;h2 id="전체-비유-교통-시스템"&gt;전체 비유: 교통 시스템&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ea%b5%90%ed%86%b5-%ec%8b%9c%ec%8a%a4%ed%85%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Scala의 제어 구조를 &lt;strong&gt;교통 시스템&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;교통 시스템 비유&lt;/th&gt;
 &lt;th&gt;Scala 개념&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;if 표현식&lt;/td&gt;
 &lt;td&gt;조건에 따라 경로 선택&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;순환버스 (정해진 경로 순회)&lt;/td&gt;
 &lt;td&gt;for 표현식&lt;/td&gt;
 &lt;td&gt;컬렉션 순회 및 변환&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;환승 연계 (A→B→C 연결)&lt;/td&gt;
 &lt;td&gt;for comprehension&lt;/td&gt;
 &lt;td&gt;다중 컬렉션 조합&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;정류장 안내 (목적지별 분류)&lt;/td&gt;
 &lt;td&gt;match 표현식&lt;/td&gt;
 &lt;td&gt;값/타입에 따른 분기&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;무한 루프선 (조건 만족까지)&lt;/td&gt;
 &lt;td&gt;while 루프&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&gt;이처럼 교통 시스템이 승객을 목적지로 안내하듯, 제어 구조는 데이터를 원하는 결과로 흐르게 합니다.&lt;/p&gt;</description></item><item><title>집계 연산자</title><link>https://advanced-beginner.github.io/ko/docs/observability/concepts/promql/aggregation-operators/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/concepts/promql/aggregation-operators/</guid><description>&lt;h2 id="전체-비유-병원-통계-분석"&gt;전체 비유: 병원 통계 분석&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%eb%b3%91%ec%9b%90-%ed%86%b5%ea%b3%84-%eb%b6%84%ec%84%9d"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;PromQL 집계 연산자를 &lt;strong&gt;병원 통계 분석&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;병원 통계 비유&lt;/th&gt;
 &lt;th&gt;집계 연산자&lt;/th&gt;
 &lt;th&gt;역할&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;전체 환자 수 합계&lt;/td&gt;
 &lt;td&gt;sum&lt;/td&gt;
 &lt;td&gt;모든 값 더하기&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;평균 진료 시간&lt;/td&gt;
 &lt;td&gt;avg&lt;/td&gt;
 &lt;td&gt;평균값 계산&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;병동별 환자 수&lt;/td&gt;
 &lt;td&gt;count&lt;/td&gt;
 &lt;td&gt;개수 세기&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;최고/최저 혈압&lt;/td&gt;
 &lt;td&gt;max/min&lt;/td&gt;
 &lt;td&gt;극값 찾기&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;진료 건수 상위 5개 과&lt;/td&gt;
 &lt;td&gt;topk&lt;/td&gt;
 &lt;td&gt;상위 N개 추출&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;진료과별 통계&lt;/td&gt;
 &lt;td&gt;by&lt;/td&gt;
 &lt;td&gt;그룹별 집계&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;개인정보 제외 통계&lt;/td&gt;
 &lt;td&gt;without&lt;/td&gt;
 &lt;td&gt;특정 라벨 제외 집계&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;환자 연령 분포&lt;/td&gt;
 &lt;td&gt;quantile&lt;/td&gt;
 &lt;td&gt;분위수 계산&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 병원에서 진료과별, 병동별로 통계를 집계하듯, PromQL 집계 연산자로 메트릭을 요약합니다.&lt;/p&gt;</description></item><item><title>헥사고날 아키텍처</title><link>https://advanced-beginner.github.io/ko/docs/ddd/concepts/architecture/hexagonal-architecture/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/ddd/concepts/architecture/hexagonal-architecture/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: 테스트 용이성과 외부 의존성 교체를 고려하는 개발자
&lt;strong&gt;선수 지식&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/ddd/concepts/architecture/layered-architecture/"&gt;계층형 아키텍처&lt;/a&gt;의 한계 이해
&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 20분&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;Ports and Adapters&lt;/strong&gt; 패턴이라고도 불립니다. 애플리케이션의 핵심을 외부 세계로부터 완전히 격리시키는 아키텍처입니다. 헥사고날 아키텍처의 핵심 아이디어는 비즈니스 로직을 중심에 두고, 외부와의 모든 상호작용을 Port와 Adapter를 통해 처리한다는 것입니다. 이렇게 하면 외부 기술이 바뀌어도 핵심 비즈니스 로직은 영향을 받지 않습니다.&lt;/p&gt;
&lt;h4 id="한-줄-요약"&gt;한 줄 요약&lt;a class="anchor" href="#%ed%95%9c-%ec%a4%84-%ec%9a%94%ec%95%bd"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;애플리케이션은 육각형 안에 있고, 외부와의 모든 연결은 Port와 Adapter로 처리합니다. 이를 통해 비즈니스 로직과 기술적 세부사항을 완벽하게 분리할 수 있습니다.&lt;/p&gt;</description></item><item><title>FAQ</title><link>https://advanced-beginner.github.io/ko/docs/observability/appendix/faq/</link><pubDate>Mon, 12 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/appendix/faq/</guid><description>&lt;h2 id="일반"&gt;일반&lt;a class="anchor" href="#%ec%9d%bc%eb%b0%98"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="q-monitoring과-observability의-차이는"&gt;Q: Monitoring과 Observability의 차이는?&lt;a class="anchor" href="#q-monitoring%ea%b3%bc-observability%ec%9d%98-%ec%b0%a8%ec%9d%b4%eb%8a%94"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Monitoring&lt;/strong&gt;: 사전에 정의한 지표를 감시 (&amp;ldquo;이 값이 임계치를 넘었는가?&amp;rdquo;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Observability&lt;/strong&gt;: 시스템 내부 상태를 외부에서 파악할 수 있는 능력 (&amp;ldquo;왜 이 문제가 발생했는가?&amp;rdquo;)&lt;/p&gt;
&lt;p&gt;Monitoring은 Observability의 일부입니다. Observability는 예상치 못한 문제도 분석할 수 있는 능력을 포함합니다.&lt;/p&gt;
&lt;h3 id="q-3요소metrics-logs-traces-중-뭘-먼저-도입해야-하나"&gt;Q: 3요소(Metrics, Logs, Traces) 중 뭘 먼저 도입해야 하나?&lt;a class="anchor" href="#q-3%ec%9a%94%ec%86%8cmetrics-logs-traces-%ec%a4%91-%eb%ad%98-%eb%a8%bc%ec%a0%80-%eb%8f%84%ec%9e%85%ed%95%b4%ec%95%bc-%ed%95%98%eb%82%98"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;권장 순서&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Metrics&lt;/strong&gt; - 시스템 상태 파악, 알림 설정&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Logs&lt;/strong&gt; - 에러 원인 분석&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Traces&lt;/strong&gt; - 분산 시스템 흐름 분석&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;단일 서비스라면 Metrics + Logs로 충분할 수 있습니다. 마이크로서비스라면 Traces가 필수입니다.&lt;/p&gt;</description></item><item><title>Spring Boot 메트릭</title><link>https://advanced-beginner.github.io/ko/docs/observability/examples/spring-boot-metrics/</link><pubDate>Mon, 12 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/examples/spring-boot-metrics/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 20분
&lt;strong&gt;선수 지식&lt;/strong&gt;: Spring Boot, &lt;a href="https://advanced-beginner.github.io/ko/docs/observability/examples/setup/"&gt;환경 구성&lt;/a&gt;
&lt;strong&gt;이 문서를 읽으면&lt;/strong&gt;: Spring Boot 애플리케이션에 Observability를 적용할 수 있습니다&lt;/p&gt;
&lt;/blockquote&gt;&lt;hr&gt;
&lt;h2 id="step-18-의존성-추가-2분"&gt;Step 1/8: 의존성 추가 (2분)&lt;a class="anchor" href="#step-18-%ec%9d%98%ec%a1%b4%ec%84%b1-%ec%b6%94%ea%b0%80-2%eb%b6%84"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// build.gradle.kts
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Actuator + Prometheus
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;org.springframework.boot:spring-boot-starter-actuator&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;io.micrometer:micrometer-registry-prometheus&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Tracing
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;io.micrometer:micrometer-tracing-bridge-otel&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;io.opentelemetry:opentelemetry-exporter-otlp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Logging (Loki)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;com.github.loki4j:loki-logback-appender:1.4.2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-28-applicationyml-설정-3분"&gt;Step 2/8: application.yml 설정 (3분)&lt;a class="anchor" href="#step-28-applicationyml-%ec%84%a4%ec%a0%95-3%eb%b6%84"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spring&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;application&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;order-service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;management&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;endpoints&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;web&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;exposure&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;include&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;health,info,prometheus,metrics&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;health&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;show-details&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;application&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${spring.application.name}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;distribution&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;percentiles-histogram&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;http.server.requests&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;slo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;http.server.requests&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;50ms, 100ms, 200ms, 500ms, 1s&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tracing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;sampling&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;probability&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;otlp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tracing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;http://localhost:4318/v1/traces&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;level&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;%5p [${spring.application.name:},%X{traceId:-},%X{spanId:-}]&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-38-loki-로그-설정-3분"&gt;Step 3/8: Loki 로그 설정 (3분)&lt;a class="anchor" href="#step-38-loki-%eb%a1%9c%ea%b7%b8-%ec%84%a4%ec%a0%95-3%eb%b6%84"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- src/main/resources/logback-spring.xml --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;include&lt;/span&gt; &lt;span class="na"&gt;resource=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;org/springframework/boot/logging/logback/defaults.xml&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;springProperty&lt;/span&gt; &lt;span class="na"&gt;scope=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;context&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;appName&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;source=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;spring.application.name&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- Console Appender --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;appender&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;CONSOLE&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ch.qos.logback.core.ConsoleAppender&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;encoder&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;pattern&amp;gt;&lt;/span&gt;%d{ISO8601} %5p [${appName},%X{traceId:-},%X{spanId:-}] --- [%t] %-40.40logger{39} : %m%n&lt;span class="nt"&gt;&amp;lt;/pattern&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/encoder&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/appender&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- Loki Appender --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;appender&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;LOKI&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;com.github.loki4j.logback.Loki4jAppender&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;http&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;http://localhost:3100/loki/api/v1/push&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/http&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;format&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;label&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;pattern&amp;gt;&lt;/span&gt;app=${appName},host=${HOSTNAME},level=%level&lt;span class="nt"&gt;&amp;lt;/pattern&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;message&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;pattern&amp;gt;&lt;/span&gt;{&amp;#34;timestamp&amp;#34;:&amp;#34;%d{ISO8601}&amp;#34;,&amp;#34;level&amp;#34;:&amp;#34;%level&amp;#34;,&amp;#34;logger&amp;#34;:&amp;#34;%logger&amp;#34;,&amp;#34;message&amp;#34;:&amp;#34;%msg&amp;#34;,&amp;#34;traceId&amp;#34;:&amp;#34;%X{traceId:-}&amp;#34;,&amp;#34;spanId&amp;#34;:&amp;#34;%X{spanId:-}&amp;#34;}&lt;span class="nt"&gt;&amp;lt;/pattern&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/message&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/format&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/appender&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;root&lt;/span&gt; &lt;span class="na"&gt;level=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;INFO&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;appender-ref&lt;/span&gt; &lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;CONSOLE&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;appender-ref&lt;/span&gt; &lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;LOKI&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/root&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="중간-확인-step-13-완료"&gt;중간 확인 (Step 1~3 완료)&lt;a class="anchor" href="#%ec%a4%91%ea%b0%84-%ed%99%95%ec%9d%b8-step-13-%ec%99%84%eb%a3%8c"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;code&gt;build.gradle.kts&lt;/code&gt;에 의존성 추가됨&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;code&gt;application.yml&lt;/code&gt;에 management 설정 완료&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;code&gt;logback-spring.xml&lt;/code&gt; 파일 생성됨&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;code&gt;./gradlew bootRun&lt;/code&gt; 실행 후 http://localhost:8080/actuator/prometheus 접속 시 메트릭 표시&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="step-48-커스텀-메트릭-추가-5분"&gt;Step 4/8: 커스텀 메트릭 추가 (5분)&lt;a class="anchor" href="#step-48-%ec%bb%a4%ec%8a%a4%ed%85%80-%eb%a9%94%ed%8a%b8%eb%a6%ad-%ec%b6%94%ea%b0%80-5%eb%b6%84"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@RestController&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@RequiredArgsConstructor&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@RequestMapping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/orders&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderController&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MeterRegistry&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;meterRegistry&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OrderService&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;orderService&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Counter: 주문 수&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Counter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;orderCounter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;orders_total&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Total number of orders&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;meterRegistry&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Gauge: 처리 중인 주문&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AtomicInteger&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ordersInProgress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AtomicInteger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@PostConstruct&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;registerGauge&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Gauge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;orders_in_progress&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ordersInProgress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AtomicInteger&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Orders currently being processed&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;meterRegistry&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@PostMapping&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;createOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@RequestBody&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OrderRequest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ordersInProgress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;incrementAndGet&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Timer로 처리 시간 측정&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Timer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;order_processing_duration_seconds&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getType&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;publishPercentileHistogram&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;meterRegistry&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;record&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;orderService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;orderCounter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;success&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ResponseEntity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;orderCounter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;failed&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;throw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ordersInProgress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;decrementAndGet&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-58-수동-트레이싱-3분"&gt;Step 5/8: 수동 트레이싱 (3분)&lt;a class="anchor" href="#step-58-%ec%88%98%eb%8f%99-%ed%8a%b8%eb%a0%88%ec%9d%b4%ec%8b%b1-3%eb%b6%84"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@RequiredArgsConstructor&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Slf4j&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderService&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Tracer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tracer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PaymentClient&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;paymentClient&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;InventoryClient&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;inventoryClient&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderRequest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 현재 Span에 태그 추가&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Span&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;currentSpan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tracer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentSpan&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;currentSpan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;currentSpan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;order.type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getType&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;currentSpan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;order.items&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;valueOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getItems&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 새 Span 생성&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Span&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;inventorySpan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tracer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nextSpan&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;checkInventory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Tracer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SpanInScope&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tracer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withSpan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inventorySpan&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;inventoryClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getItems&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;inventorySpan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Inventory checked&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;inventorySpan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;end&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 결제 처리&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Span&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;paymentSpan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tracer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nextSpan&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;processPayment&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Tracer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SpanInScope&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tracer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withSpan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;paymentSpan&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;paymentClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getPayment&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;paymentSpan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Payment processed&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;paymentSpan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;end&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Order created: {}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getId&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="중간-확인-step-45-완료"&gt;중간 확인 (Step 4~5 완료)&lt;a class="anchor" href="#%ec%a4%91%ea%b0%84-%ed%99%95%ec%9d%b8-step-45-%ec%99%84%eb%a3%8c"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;code&gt;OrderController&lt;/code&gt;에 Counter, Gauge, Timer 메트릭 추가됨&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;code&gt;OrderService&lt;/code&gt;에 수동 Span 생성 코드 추가됨&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 컴파일 오류 없이 빌드 성공: &lt;code&gt;./gradlew build&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="step-68-메트릭-확인-2분"&gt;Step 6/8: 메트릭 확인 (2분)&lt;a class="anchor" href="#step-68-%eb%a9%94%ed%8a%b8%eb%a6%ad-%ed%99%95%ec%9d%b8-2%eb%b6%84"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="prometheus-엔드포인트"&gt;Prometheus 엔드포인트&lt;a class="anchor" href="#prometheus-%ec%97%94%eb%93%9c%ed%8f%ac%ec%9d%b8%ed%8a%b8"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl http://localhost:8080/actuator/prometheus&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;예상 출력:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>메트릭 카디널리티 최적화</title><link>https://advanced-beginner.github.io/ko/docs/observability/howto/reduce-cardinality/</link><pubDate>Mon, 12 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/howto/reduce-cardinality/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;대상 상황&lt;/strong&gt;: Prometheus 메모리/스토리지 급증, 쿼리 느림
&lt;strong&gt;목표&lt;/strong&gt;: 불필요한 시계열을 줄여 비용 최적화
&lt;strong&gt;소요 시간&lt;/strong&gt;: 30분~1시간 (분석 및 수정 복잡도에 따라 상이)
&lt;strong&gt;성공 기준&lt;/strong&gt;: 시계열 수가 목표치 이하로 감소하고 메모리 사용량이 안정화됨&lt;/p&gt;
&lt;/blockquote&gt;&lt;h2 id="문제-상황"&gt;문제 상황&lt;a class="anchor" href="#%eb%ac%b8%ec%a0%9c-%ec%83%81%ed%99%a9"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Alert: PrometheusHighCardinality
Active Series: 2,500,000 (Threshold: 1,000,000)
Memory Usage: 32GB&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="카디널리티란"&gt;카디널리티란?&lt;a class="anchor" href="#%ec%b9%b4%eb%94%94%eb%84%90%eb%a6%ac%ed%8b%b0%eb%9e%80"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;카디널리티 = 고유한 시계열 수&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;http_requests_total{method=&amp;#34;GET&amp;#34;, status=&amp;#34;200&amp;#34;, path=&amp;#34;/api/users&amp;#34;} # 1개
http_requests_total{method=&amp;#34;GET&amp;#34;, status=&amp;#34;200&amp;#34;, path=&amp;#34;/api/users/123&amp;#34;} # 또 1개!
http_requests_total{method=&amp;#34;GET&amp;#34;, status=&amp;#34;200&amp;#34;, path=&amp;#34;/api/users/456&amp;#34;} # 또 1개!&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;문제&lt;/strong&gt;: path에 user_id가 들어가면 사용자 수만큼 시계열 생성&lt;/p&gt;</description></item><item><title>FAQ</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/appendix/faq/</link><pubDate>Sun, 11 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/appendix/faq/</guid><description>&lt;p&gt;Kubernetes 학습과 운영에서 자주 묻는 질문과 답변을 정리합니다.&lt;/p&gt;
&lt;h2 id="시작하기-전에"&gt;시작하기 전에&lt;a class="anchor" href="#%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-%ec%a0%84%ec%97%90"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="q-kubernetes를-배우기-전에-알아야-할-것은"&gt;Q: Kubernetes를 배우기 전에 알아야 할 것은?&lt;a class="anchor" href="#q-kubernetes%eb%a5%bc-%eb%b0%b0%ec%9a%b0%ea%b8%b0-%ec%a0%84%ec%97%90-%ec%95%8c%ec%95%84%ec%95%bc-%ed%95%a0-%ea%b2%83%ec%9d%80"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; 다음 지식이 있으면 학습이 수월합니다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;필수&lt;/strong&gt;: Docker 기본 (이미지 빌드, 컨테이너 실행)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;필수&lt;/strong&gt;: Linux 기본 명령어 (cd, ls, cat, grep)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;권장&lt;/strong&gt;: YAML 문법, 네트워크 기초 (IP, 포트, DNS)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="q-로컬에서-kubernetes를-어떻게-실습하나요"&gt;Q: 로컬에서 Kubernetes를 어떻게 실습하나요?&lt;a class="anchor" href="#q-%eb%a1%9c%ec%bb%ac%ec%97%90%ec%84%9c-kubernetes%eb%a5%bc-%ec%96%b4%eb%96%bb%ea%b2%8c-%ec%8b%a4%ec%8a%b5%ed%95%98%eb%82%98%ec%9a%94"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; 세 가지 방법이 있습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;도구&lt;/th&gt;
 &lt;th&gt;특징&lt;/th&gt;
 &lt;th&gt;권장 대상&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Minikube&lt;/td&gt;
 &lt;td&gt;가장 쉬움, 문서 많음&lt;/td&gt;
 &lt;td&gt;초보자&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Kind&lt;/td&gt;
 &lt;td&gt;빠른 시작, 다중 노드&lt;/td&gt;
 &lt;td&gt;CI/CD&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Docker Desktop&lt;/td&gt;
 &lt;td&gt;설치 간편&lt;/td&gt;
 &lt;td&gt;macOS/Windows&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;초보자라면 Minikube로 시작하세요: &lt;code&gt;minikube start&lt;/code&gt;&lt;/p&gt;</description></item><item><title>기본 예제</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/examples/basic/</link><pubDate>Sun, 11 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/examples/basic/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Kubernetes 핵심 리소스를 실습하고 싶은 개발자
&lt;strong&gt;선수 지식&lt;/strong&gt;: Pod, Deployment, Service 개념
&lt;strong&gt;이 문서를 읽으면&lt;/strong&gt;: Pod, Deployment, Service, ConfigMap을 직접 생성하고 관리할 수 있습니다&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;Nginx Deployment를 생성하고 Service로 노출합니다&lt;/li&gt;
&lt;li&gt;ConfigMap으로 설정을 주입합니다&lt;/li&gt;
&lt;li&gt;롤링 업데이트와 롤백을 실습합니다&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h2 id="사전-준비"&gt;사전 준비&lt;a class="anchor" href="#%ec%82%ac%ec%a0%84-%ec%a4%80%eb%b9%84"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음이 필요합니다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;로컬 Kubernetes 클러스터 (Minikube 또는 Kind)&lt;/li&gt;
&lt;li&gt;kubectl&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 클러스터 상태 확인&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl cluster-info&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="실습-1-deployment와-service"&gt;실습 1: Deployment와 Service&lt;a class="anchor" href="#%ec%8b%a4%ec%8a%b5-1-deployment%ec%99%80-service"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="deployment-생성"&gt;Deployment 생성&lt;a class="anchor" href="#deployment-%ec%83%9d%ec%84%b1"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;웹 서버를 배포합니다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# nginx-deployment.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;apps/v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Deployment&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;replicas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;matchLabels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx:1.25&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;containerPort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;64Mi&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;100m&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;limits&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;128Mi&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;200m&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Deployment 생성&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl apply -f nginx-deployment.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 상태 확인&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get deployment nginx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get pods -l &lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;nginx&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;예상 출력:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>FAQ</title><link>https://advanced-beginner.github.io/ko/docs/elasticsearch/appendix/faq/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/elasticsearch/appendix/faq/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ES vs RDB&lt;/strong&gt;: 풀텍스트 검색/로그 분석은 ES, 트랜잭션/JOIN은 RDB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;text vs keyword&lt;/strong&gt;: text는 검색용(분석됨), keyword는 필터/정렬용(분석 안 됨)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;성능 문제&lt;/strong&gt;: Filter Context 사용, 필요한 필드만 반환, &lt;code&gt;search_after&lt;/code&gt; 페이지네이션&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;한글 검색&lt;/strong&gt;: Nori 분석기 설치 필수&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;흔한 에러&lt;/strong&gt;: 대부분 디스크 부족, 메모리 부족, 타입 불일치가 원인&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;자주 묻는 질문과 답변을 정리했습니다.&lt;/p&gt;
&lt;h2 id="기본-개념"&gt;기본 개념&lt;a class="anchor" href="#%ea%b8%b0%eb%b3%b8-%ea%b0%9c%eb%85%90"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="elasticsearch-vs-rdb-언제-무엇을-써야-하나요"&gt;Elasticsearch vs RDB, 언제 무엇을 써야 하나요?&lt;a class="anchor" href="#elasticsearch-vs-rdb-%ec%96%b8%ec%a0%9c-%eb%ac%b4%ec%97%87%ec%9d%84-%ec%8d%a8%ec%95%bc-%ed%95%98%eb%82%98%ec%9a%94"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;상황&lt;/th&gt;
 &lt;th&gt;권장&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;풀텍스트 검색&lt;/td&gt;
 &lt;td&gt;Elasticsearch&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;트랜잭션 무결성 필요&lt;/td&gt;
 &lt;td&gt;RDB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;복잡한 JOIN&lt;/td&gt;
 &lt;td&gt;RDB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;실시간 집계/분석&lt;/td&gt;
 &lt;td&gt;Elasticsearch&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;일반 CRUD&lt;/td&gt;
 &lt;td&gt;RDB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;대용량 로그 저장&lt;/td&gt;
 &lt;td&gt;Elasticsearch&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;일반적인 패턴:&lt;/strong&gt; RDB를 메인 저장소로, Elasticsearch를 검색용 보조 저장소로 사용.&lt;/p&gt;</description></item><item><title>FAQ</title><link>https://advanced-beginner.github.io/ko/docs/spark/appendix/faq/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/spark/appendix/faq/</guid><description>&lt;p&gt;자주 묻는 질문과 흔히 발생하는 문제의 해결 방법을 제공합니다.&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Java 버전&lt;/strong&gt;: Spark 3.5는 Java 8, 11, 17 지원 (21은 미지원)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DataFrame vs RDD&lt;/strong&gt;: DataFrame 권장 (자동 최적화, 간결한 API)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;흔한 오류&lt;/strong&gt;: OutOfMemoryError(메모리 증가), NotSerializableException(직렬화 가능 객체만 사용)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;성능 튜닝&lt;/strong&gt;: 셔플 최소화, 적절한 파티션 수(코어 x 2~4), 브로드캐스트 조인 활용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;디버깅&lt;/strong&gt;: Spark UI의 Stages 탭에서 Task 분포와 스큐 확인&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h2 id="일반-질문"&gt;일반 질문&lt;a class="anchor" href="#%ec%9d%bc%eb%b0%98-%ec%a7%88%eb%ac%b8"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Spark는 어떤 Java 버전을 지원하나요?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Spark 3.5는 Java 8, 11, 17을 지원합니다. Java 21은 아직 공식 지원되지 않습니다.&lt;/p&gt;</description></item><item><title>Producer 성능 최적화</title><link>https://advanced-beginner.github.io/ko/docs/kafka/howto/producer-performance-tuning/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kafka/howto/producer-performance-tuning/</guid><description>&lt;p&gt;Producer의 처리량을 높이고 지연 시간을 줄이는 방법을 단계별로 안내합니다.&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;처리량 우선&lt;/strong&gt;: &lt;code&gt;batch.size&lt;/code&gt; 증가, &lt;code&gt;linger.ms&lt;/code&gt; 설정, 압축 활성화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;지연 우선&lt;/strong&gt;: &lt;code&gt;linger.ms=0&lt;/code&gt;, &lt;code&gt;acks=1&lt;/code&gt;, 작은 배치 크기&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;안정성 우선&lt;/strong&gt;: &lt;code&gt;acks=all&lt;/code&gt;, &lt;code&gt;enable.idempotence=true&lt;/code&gt;, 재시도 설정&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;트레이드오프&lt;/strong&gt;: 처리량 ↔ 지연 시간 ↔ 안정성은 상충 관계&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h2 id="성능-최적화의-세-가지-축"&gt;성능 최적화의 세 가지 축&lt;a class="anchor" href="#%ec%84%b1%eb%8a%a5-%ec%b5%9c%ec%a0%81%ed%99%94%ec%9d%98-%ec%84%b8-%ea%b0%80%ec%a7%80-%ec%b6%95"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Producer 성능 최적화는 세 가지 요소의 균형을 맞추는 작업입니다:&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TB
 T[처리량&amp;lt;br&amp;gt;Throughput] &amp;lt;--&amp;gt; L[지연 시간&amp;lt;br&amp;gt;Latency]
 L &amp;lt;--&amp;gt; D[안정성&amp;lt;br&amp;gt;Durability]
 D &amp;lt;--&amp;gt; T&lt;/pre&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;요소&lt;/th&gt;
 &lt;th&gt;설명&lt;/th&gt;
 &lt;th&gt;최적화 방향&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;처리량&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;초당 전송 메시지 수&lt;/td&gt;
 &lt;td&gt;배치 크기 증가, 압축 활성화&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;지연 시간&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;메시지 전송~확인까지 시간&lt;/td&gt;
 &lt;td&gt;배치 대기 시간 감소&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;안정성&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;메시지 유실 방지&lt;/td&gt;
 &lt;td&gt;acks=all, 복제 대기&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="1단계-현재-성능-측정하기"&gt;1단계: 현재 성능 측정하기&lt;a class="anchor" href="#1%eb%8b%a8%ea%b3%84-%ed%98%84%ec%9e%ac-%ec%84%b1%eb%8a%a5-%ec%b8%a1%ec%a0%95%ed%95%98%ea%b8%b0"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;최적화 전에 현재 성능을 측정하세요. 기준선 없이는 개선 효과를 알 수 없습니다.&lt;/p&gt;</description></item><item><title>Scala 2 vs Scala 3 버전 비교</title><link>https://advanced-beginner.github.io/ko/docs/scala/appendix/version-comparison/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/appendix/version-comparison/</guid><description>&lt;p&gt;Scala 2와 Scala 3의 주요 차이점을 한눈에 정리합니다. Scala 3는 2020년에 출시되어 더 간결한 문법, 강력한 타입 시스템, 개선된 암시적 기능을 제공합니다.&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;새 프로젝트&lt;/strong&gt;: Scala 3 권장 (더 간결한 문법, 개선된 타입 시스템)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spark 사용&lt;/strong&gt;: Scala 2.12/2.13 유지 (Spark가 아직 Scala 3 미지원)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;핵심 변경&lt;/strong&gt;: &lt;code&gt;implicit&lt;/code&gt; → &lt;code&gt;given&lt;/code&gt;/&lt;code&gt;using&lt;/code&gt;, 들여쓰기 기반 문법, &lt;code&gt;enum&lt;/code&gt; 추가&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;호환성&lt;/strong&gt;: Scala 3에서 Scala 2.13 라이브러리 사용 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;마이그레이션&lt;/strong&gt;: &lt;code&gt;-source:3.0-migration&lt;/code&gt; 옵션으로 점진적 전환&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h4 id="새로운-기능-scala-3"&gt;새로운 기능 (Scala 3)&lt;a class="anchor" href="#%ec%83%88%eb%a1%9c%ec%9a%b4-%ea%b8%b0%eb%8a%a5-scala-3"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Scala 3에서 추가된 주요 기능들을 카테고리별로 살펴봅니다.&lt;/p&gt;</description></item><item><title>Spring Kafka로 Producer/Consumer 구현하기</title><link>https://advanced-beginner.github.io/ko/docs/kafka/examples/basic/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kafka/examples/basic/</guid><description>&lt;p&gt;이 문서에서는 Spring Kafka를 사용하여 메시지를 송수신하는 방법을 단계별로 실습합니다.&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Producer&lt;/strong&gt;: &lt;code&gt;KafkaTemplate&lt;/code&gt;으로 동기/비동기 메시지 전송, Key 사용으로 Partition 지정&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consumer&lt;/strong&gt;: &lt;code&gt;@KafkaListener&lt;/code&gt;로 메시지 수신, 배치 처리 및 패턴 구독 지원&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;수동 커밋&lt;/strong&gt;: &lt;code&gt;Acknowledgment&lt;/code&gt;로 처리 완료 후 명시적 커밋&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;에러 처리&lt;/strong&gt;: &lt;code&gt;@RetryableTopic&lt;/code&gt;으로 재시도 및 Dead Letter Topic 설정&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h2 id="시작하기-전에"&gt;시작하기 전에&lt;a class="anchor" href="#%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-%ec%a0%84%ec%97%90"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;항목&lt;/th&gt;
 &lt;th&gt;요구사항&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Spring Boot 애플리케이션에서 Kafka를 사용하려는 백엔드 개발자&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Java 기본 문법, Spring Boot 기초, Kafka 기본 개념&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;사전 완료&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://advanced-beginner.github.io/ko/docs/kafka/quick-start/"&gt;Quick Start&lt;/a&gt; 예제 완료, &lt;a href="https://advanced-beginner.github.io/ko/docs/kafka/examples/setup/"&gt;환경 구성&lt;/a&gt; 설정 완료&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;예상 소요 시간&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;약 30분&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote class="book-hint warning"&gt;&lt;strong&gt;환경별 주의사항&lt;/strong&gt;&lt;br&gt;&lt;p&gt;&lt;strong&gt;Windows 사용자&lt;/strong&gt;: 명령어에서 &lt;code&gt;./gradlew&lt;/code&gt; 대신 &lt;code&gt;gradlew.bat&lt;/code&gt;을 사용하세요.&lt;/p&gt;</description></item><item><title>기본 예제</title><link>https://advanced-beginner.github.io/ko/docs/elasticsearch/examples/basic/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/elasticsearch/examples/basic/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Spring Data Elasticsearch&lt;/strong&gt;로 Document CRUD 및 기본 검색을 구현합니다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repository 패턴&lt;/strong&gt;으로 간단한 쿼리, &lt;strong&gt;ElasticsearchOperations&lt;/strong&gt;로 복합 쿼리를 처리합니다&lt;/li&gt;
&lt;li&gt;필드 타입은 용도에 맞게 선택: &lt;code&gt;Text&lt;/code&gt;(검색용), &lt;code&gt;Keyword&lt;/code&gt;(필터용), &lt;code&gt;Integer&lt;/code&gt;(범위 검색)&lt;/li&gt;
&lt;li&gt;전체 소요 시간: 약 20분&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;Spring Data Elasticsearch를 사용하여 Document CRUD와 기본 검색을 구현합니다.&lt;/p&gt;
&lt;h2 id="프로젝트-구조"&gt;프로젝트 구조&lt;a class="anchor" href="#%ed%94%84%eb%a1%9c%ec%a0%9d%ed%8a%b8-%ea%b5%ac%ec%a1%b0"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;src/main/java/com/example/
├── ElasticsearchApplication.java
├── config/
│ └── ElasticsearchConfig.java
├── domain/
│ └── Product.java
├── repository/
│ └── ProductRepository.java
├── service/
│ └── ProductService.java
└── controller/
 └── ProductController.java&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="도메인-클래스"&gt;도메인 클래스&lt;a class="anchor" href="#%eb%8f%84%eb%a9%94%ec%9d%b8-%ed%81%b4%eb%9e%98%ec%8a%a4"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="productjava"&gt;Product.java&lt;a class="anchor" href="#productjava"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;com.example.domain&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;org.springframework.data.annotation.Id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;org.springframework.data.elasticsearch.annotations.Document&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;org.springframework.data.elasticsearch.annotations.Field&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;org.springframework.data.elasticsearch.annotations.FieldType&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;org.springframework.data.elasticsearch.annotations.Setting&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Document&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;indexName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;products&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Setting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settingPath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;elasticsearch/settings.json&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 선택사항&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FieldType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;analyzer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;standard&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FieldType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Keyword&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FieldType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FieldType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FieldType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Boolean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;inStock&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 기본 생성자&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Product&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 전체 필드 생성자&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Product&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Boolean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;inStock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;category&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;inStock&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;inStock&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Getter/Setter&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getId&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;setId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;setName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getCategory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;setCategory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;category&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getPrice&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;setPrice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getDescription&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;setDescription&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Boolean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getInStock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;inStock&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;setInStock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Boolean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;inStock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;inStock&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;inStock&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="어노테이션-설명"&gt;어노테이션 설명&lt;a class="anchor" href="#%ec%96%b4%eb%85%b8%ed%85%8c%ec%9d%b4%ec%85%98-%ec%84%a4%eb%aa%85"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;어노테이션&lt;/th&gt;
 &lt;th&gt;설명&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;@Document&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Elasticsearch 인덱스 매핑&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;@Id&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;문서 고유 ID 필드&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;@Field&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;필드 타입 및 분석기 설정&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;@Setting&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;인덱스 설정 파일 경로&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="왜-이렇게-설계했나"&gt;왜 이렇게 설계했나?&lt;a class="anchor" href="#%ec%99%9c-%ec%9d%b4%eb%a0%87%ea%b2%8c-%ec%84%a4%ea%b3%84%ed%96%88%eb%82%98"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;필드 타입 선택 이유:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>기본 예제</title><link>https://advanced-beginner.github.io/ko/docs/scala/examples/basic/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/examples/basic/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;케이스 클래스&lt;/strong&gt;로 불변 데이터 모델링, 자동 생성되는 &lt;code&gt;equals&lt;/code&gt;, &lt;code&gt;copy&lt;/code&gt; 활용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Option&lt;/strong&gt;으로 null 안전성, &lt;strong&gt;Either&lt;/strong&gt;로 상세한 에러 처리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;패턴 매칭&lt;/strong&gt;으로 타입에 따른 분기 처리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;컬렉션 API&lt;/strong&gt; (&lt;code&gt;map&lt;/code&gt;, &lt;code&gt;filter&lt;/code&gt;, &lt;code&gt;groupBy&lt;/code&gt;)로 선언적 데이터 처리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;타입 클래스&lt;/strong&gt;로 확장 가능한 기능 구현&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Scala 환경 설정을 마친 개발자, 실제 코드로 Scala를 학습하려는 분&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scala 개발 환경 설정 완료 (&lt;a href="https://advanced-beginner.github.io/ko/docs/scala/examples/setup/"&gt;환경 설정&lt;/a&gt; 참조)&lt;/li&gt;
&lt;li&gt;객체지향 프로그래밍 기본 개념&lt;/li&gt;
&lt;li&gt;함수형 프로그래밍 기초 (권장)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;Scala의 핵심 개념을 활용한 종합 예제입니다. 이 문서에서는 케이스 클래스, 패턴 매칭, 컬렉션 처리, Option, Either, 타입 클래스 등 실무에서 자주 사용하는 기능들을 예제 코드와 함께 설명합니다.&lt;/p&gt;</description></item><item><title>기본 예제</title><link>https://advanced-beginner.github.io/ko/docs/spark/examples/basic/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/spark/examples/basic/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CSV, JSON, Parquet, JDBC&lt;/strong&gt; 등 다양한 데이터 소스 읽기/쓰기&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DataFrame API&lt;/strong&gt;로 필터, 변환, 집계, 조인 수행&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SQL 쿼리&lt;/strong&gt;와 DataFrame API 혼용 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;실무 예제&lt;/strong&gt;: NYC 택시 데이터, Kaggle 데이터셋 분석&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h2 id="대상-독자-및-선수-지식"&gt;대상 독자 및 선수 지식&lt;a class="anchor" href="#%eb%8c%80%ec%83%81-%eb%8f%85%ec%9e%90-%eb%b0%8f-%ec%84%a0%ec%88%98-%ec%a7%80%ec%8b%9d"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;구분&lt;/th&gt;
 &lt;th&gt;내용&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Spark DataFrame API를 처음 사용하는 Java 개발자&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Java 기본 문법, SQL 기초, &lt;a href="https://advanced-beginner.github.io/ko/docs/spark/examples/setup/"&gt;환경 설정&lt;/a&gt; 완료&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;학습 목표&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;데이터 로딩, 변환, 집계, 조인, 저장을 수행할 수 있다&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;예상 소요 시간&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;약 30분&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;p&gt;Spark의 핵심 기능을 활용하는 예제 코드입니다.&lt;/p&gt;</description></item><item><title>주문 도메인</title><link>https://advanced-beginner.github.io/ko/docs/ddd/examples/order-domain/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/ddd/examples/order-domain/</guid><description>&lt;h1 id="주문-도메인-구현"&gt;주문 도메인 구현&lt;a class="anchor" href="#%ec%a3%bc%eb%ac%b8-%eb%8f%84%eb%a9%94%ec%9d%b8-%ea%b5%ac%ed%98%84"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Order&lt;/strong&gt;: Aggregate Root. 주문의 일관성 경계를 관리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OrderLine&lt;/strong&gt;: 내부 Entity. Order를 통해서만 생성/변경 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Money, ShippingAddress, OrderId&lt;/strong&gt;: Value Object. 불변이며 값으로 비교&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;불변식&lt;/strong&gt;: 주문 항목 1개 이상, 최대 금액 1억원, 수량 1~999&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;도메인 이벤트&lt;/strong&gt;: OrderCreatedEvent, OrderConfirmedEvent 등 상태 변경 시 발행&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h2 id="대상-독자-및-선수-지식"&gt;대상 독자 및 선수 지식&lt;a class="anchor" href="#%eb%8c%80%ec%83%81-%eb%8f%85%ec%9e%90-%eb%b0%8f-%ec%84%a0%ec%88%98-%ec%a7%80%ec%8b%9d"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;항목&lt;/th&gt;
 &lt;th&gt;요구 수준&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;DDD 전술적 패턴을 코드로 구현하려는 개발자&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;DDD 기초&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Aggregate, Entity, Value Object, Domain Event 개념 이해&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Java&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Record, Optional, Stream API 사용 경험&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;선수 문서&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://advanced-beginner.github.io/ko/docs/ddd/examples/setup/"&gt;프로젝트 설정&lt;/a&gt; 완료&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;DDD 패턴을 적용하여 주문 도메인을 구현합니다.&lt;/p&gt;</description></item><item><title>참고 자료</title><link>https://advanced-beginner.github.io/ko/docs/ddd/appendix/references/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/ddd/appendix/references/</guid><description>&lt;h1 id="참고-자료"&gt;참고 자료&lt;a class="anchor" href="#%ec%b0%b8%ea%b3%a0-%ec%9e%90%eb%a3%8c"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;DDD 학습을 위한 도서, 아티클, 발표 자료를 정리합니다.&lt;/p&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;필독서&lt;/strong&gt;: Blue Book(원전), Red Book(구현), DDD Distilled(입문)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;학습 순서&lt;/strong&gt;: 입문 → 기본 → 심화 → 실전 순으로 점진적 학습&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;한국어 자료&lt;/strong&gt;: DDD START(최범균), 우아한객체지향(조영호) 추천&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;실습&lt;/strong&gt;: 기존 프로젝트 리팩터링 또는 EventStorming으로 시작&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;&lt;h2 id="필독서"&gt;필독서&lt;a class="anchor" href="#%ed%95%84%eb%8f%85%ec%84%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="domain-driven-design-blue-book"&gt;Domain-Driven Design (Blue Book)&lt;a class="anchor" href="#domain-driven-design-blue-book"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;저자:&lt;/strong&gt; Eric Evans&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;원서:&lt;/strong&gt; Domain-Driven Design: Tackling Complexity in the Heart of Software (2003)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;한국어판:&lt;/strong&gt; 도메인 주도 설계&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DDD의 원전입니다. 전략적/전술적 설계 패턴의 원리와 철학을 담고 있습니다.&lt;/p&gt;</description></item><item><title>참고 자료</title><link>https://advanced-beginner.github.io/ko/docs/kafka/appendix/references/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kafka/appendix/references/</guid><description>&lt;p&gt;Kafka 학습을 위한 추가 자료들을 정리했습니다. 공식 문서부터 서적, 온라인 강의, 커뮤니티, 도구까지 체계적으로 학습할 수 있는 자료들을 모았습니다.&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;공식 문서&lt;/strong&gt;: Apache Kafka, Spring Kafka, Confluent 문서 필수&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;입문 서적&lt;/strong&gt;: &amp;ldquo;Kafka: The Definitive Guide&amp;rdquo;, &amp;ldquo;Kafka in Action&amp;rdquo; 추천&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;온라인 강의&lt;/strong&gt;: Confluent Developer(무료), Udemy, 인프런&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;커뮤니티&lt;/strong&gt;: Stack Overflow, Confluent Forum, OKKY&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;도구&lt;/strong&gt;: Kafka UI(관리), Prometheus+Grafana(모니터링)&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h4 id="공식-문서"&gt;공식 문서&lt;a class="anchor" href="#%ea%b3%b5%ec%8b%9d-%eb%ac%b8%ec%84%9c"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Apache Kafka&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Apache Kafka 공식 문서는 가장 정확하고 최신 정보를 제공합니다. Apache Kafka Documentation은 Kafka의 전체 아키텍처, 설정, API를 다루는 공식 문서입니다. Kafka Quickstart는 처음 시작하는 사람을 위한 공식 Quick Start 가이드로, 설치부터 기본 메시지 송수신까지 안내합니다. Kafka APIs는 Producer API, Consumer API, Streams API, Admin API 등 각 API의 상세 레퍼런스를 제공합니다. Kafka Configuration은 Broker, Producer, Consumer, Topic 등 모든 설정 옵션의 전체 목록과 설명을 포함합니다.&lt;/p&gt;</description></item><item><title>매핑 마이그레이션</title><link>https://advanced-beginner.github.io/ko/docs/elasticsearch/howto/mapping-migration/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/elasticsearch/howto/mapping-migration/</guid><description>&lt;p&gt;다운타임 없이 인덱스 매핑(필드 타입, 분석기 등)을 변경하는 방법을 안내합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 20-40분 (데이터 크기에 따라 추가 소요)&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;이 가이드의 범위&lt;/strong&gt;&lt;br&gt;&lt;p&gt;&lt;strong&gt;다루는 내용&lt;/strong&gt;: Reindex API를 활용한 무중단 매핑 변경, Alias 전환 전략, 검증 방법&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;다루지 않는 내용&lt;/strong&gt;: 대규모 인덱스 재구축은 &lt;a href="index-rebuild/"&gt;인덱스 재구축&lt;/a&gt;을, 클러스터 수준 변경은 &lt;a href="cluster-scaling/"&gt;클러스터 확장&lt;/a&gt;을 참조하세요.&lt;/p&gt;

&lt;/blockquote&gt;

&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Alias 기반 운영&lt;/strong&gt;: 애플리케이션은 Alias를 통해 인덱스에 접근&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;새 인덱스 생성&lt;/strong&gt;: 변경된 매핑으로 새 인덱스를 만들고 Reindex&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alias 전환&lt;/strong&gt;: 검증 완료 후 Alias를 새 인덱스로 전환&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;롤백 가능&lt;/strong&gt;: 이전 인덱스를 삭제하지 않으면 즉시 롤백 가능&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;hr&gt;
&lt;h2 id="시작하기-전에"&gt;시작하기 전에&lt;a class="anchor" href="#%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-%ec%a0%84%ec%97%90"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음 조건을 확인하세요:&lt;/p&gt;</description></item><item><title>타입 에러 디버깅</title><link>https://advanced-beginner.github.io/ko/docs/scala/howto/type-error-debugging/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/howto/type-error-debugging/</guid><description>&lt;p&gt;복잡한 타입 에러 메시지를 해독하고 해결하는 방법을 안내합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 15-20분&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Type Mismatch&lt;/strong&gt;: 기대 타입과 실제 타입을 비교하여 어디서 불일치가 발생했는지 확인&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bounds 위반&lt;/strong&gt;: 타입 파라미터의 상한/하한 제약 조건 확인&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Variance 문제&lt;/strong&gt;: 공변/반공변 위치에 올바른 타입이 있는지 확인&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;splain 플러그인&lt;/strong&gt;: 복잡한 타입 에러를 읽기 쉬운 형태로 변환&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;hr&gt;
&lt;h2 id="이-가이드가-해결하는-문제"&gt;이 가이드가 해결하는 문제&lt;a class="anchor" href="#%ec%9d%b4-%ea%b0%80%ec%9d%b4%eb%93%9c%ea%b0%80-%ed%95%b4%ea%b2%b0%ed%95%98%eb%8a%94-%eb%ac%b8%ec%a0%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음과 같은 컴파일 에러가 발생할 때 이 가이드를 사용하세요:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;type mismatch;
 found : List[String]
 required: List[Int]&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;type arguments [Dog] do not conform to method process&amp;#39;s
type parameter bounds [A &amp;lt;: Animal with Serializable]&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;covariant type A occurs in contravariant position in type A =&amp;gt; Unit&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="이-가이드가-다루지-않는-것"&gt;이 가이드가 다루지 않는 것&lt;a class="anchor" href="#%ec%9d%b4-%ea%b0%80%ec%9d%b4%eb%93%9c%ea%b0%80-%eb%8b%a4%eb%a3%a8%ec%a7%80-%ec%95%8a%eb%8a%94-%ea%b2%83"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;타입 시스템의 기초 개념&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/concepts/type-system-advanced/"&gt;타입 시스템 개념 문서&lt;/a&gt;를 참조하세요&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;암시적 값 관련 에러&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/scala/howto/implicit-debugging/"&gt;Implicit/Given 디버깅&lt;/a&gt;을 참조하세요&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;매크로/리플렉션 관련 에러&lt;/strong&gt;: 해당 라이브러리 문서를 참조하세요&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="시작하기-전에"&gt;시작하기 전에&lt;a class="anchor" href="#%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-%ec%a0%84%ec%97%90"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음 환경이 준비되어 있는지 확인하세요:&lt;/p&gt;</description></item><item><title>Value Object 설계하기</title><link>https://advanced-beginner.github.io/ko/docs/ddd/howto/value-object-design/</link><pubDate>Fri, 16 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/ddd/howto/value-object-design/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;해결하는 문제&lt;/strong&gt;: 모든 것을 Entity로 만들어 복잡도가 높아지거나, Primitive Obsession으로 타입 안정성이 낮은 상황
&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 20분
&lt;strong&gt;전제 조건&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/ddd/concepts/tactical-design/"&gt;전술적 설계&lt;/a&gt; 문서를 읽었다고 가정&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote class="book-hint warning"&gt;&lt;strong&gt;성공 기준&lt;/strong&gt;&lt;br&gt;&lt;p&gt;이 가이드를 완료하면 다음을 할 수 있습니다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3가지 질문으로 Entity와 Value Object 구분&lt;/li&gt;
&lt;li&gt;Java Record를 활용한 Value Object 구현&lt;/li&gt;
&lt;li&gt;Primitive Obsession을 Value Object로 리팩토링&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2 id="1-entity-vs-value-object-구분하기"&gt;1. Entity vs Value Object 구분하기&lt;a class="anchor" href="#1-entity-vs-value-object-%ea%b5%ac%eb%b6%84%ed%95%98%ea%b8%b0"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="11-3가지-판단-질문"&gt;1.1 3가지 판단 질문&lt;a class="anchor" href="#11-3%ea%b0%80%ec%a7%80-%ed%8c%90%eb%8b%a8-%ec%a7%88%eb%ac%b8"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;다음 질문을 순서대로 적용하세요:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;질문 1: &amp;ldquo;이것은 고유한 식별자가 필요한가?&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>네트워크 트러블슈팅</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/howto/network-troubleshooting/</link><pubDate>Fri, 16 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/howto/network-troubleshooting/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;목표&lt;/strong&gt;: Service나 Ingress가 연결되지 않을 때 원인을 파악하고 해결합니다
&lt;strong&gt;예상 시간&lt;/strong&gt;: 30분&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;이 가이드의 범위&lt;/strong&gt;&lt;br&gt;&lt;p&gt;&lt;strong&gt;다루는 내용&lt;/strong&gt;: Service 연결 문제, DNS 문제, Ingress 라우팅 문제&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;다루지 않는 내용&lt;/strong&gt;: Pod 시작 문제(&lt;a href="pod-troubleshooting/"&gt;Pod 트러블슈팅&lt;/a&gt; 참조), 외부 네트워크 방화벽 설정&lt;/p&gt;

&lt;/blockquote&gt;

&lt;h2 id="시작하기-전에"&gt;시작하기 전에&lt;a class="anchor" href="#%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-%ec%a0%84%ec%97%90"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음 조건을 확인하세요.&lt;/p&gt;
&lt;h3 id="1-kubectl-설치-및-클러스터-접근-확인"&gt;1. kubectl 설치 및 클러스터 접근 확인&lt;a class="anchor" href="#1-kubectl-%ec%84%a4%ec%b9%98-%eb%b0%8f-%ed%81%b4%eb%9f%ac%ec%8a%a4%ed%84%b0-%ec%a0%91%ea%b7%bc-%ed%99%95%ec%9d%b8"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl cluster-info&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;성공 시 출력:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Kubernetes control plane is running at https://xxx.xxx.xxx.xxx
CoreDNS is running at https://xxx.xxx.xxx.xxx/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="2-pod-상태-확인"&gt;2. Pod 상태 확인&lt;a class="anchor" href="#2-pod-%ec%83%81%ed%83%9c-%ed%99%95%ec%9d%b8"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;연결하려는 대상 Pod가 Running 상태인지 확인하세요.&lt;/p&gt;</description></item><item><title>메시지 손실 방지 가이드</title><link>https://advanced-beginner.github.io/ko/docs/kafka/howto/message-loss-prevention/</link><pubDate>Fri, 16 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kafka/howto/message-loss-prevention/</guid><description>&lt;p&gt;Kafka에서 메시지 손실을 방지하고 안정적인 메시징을 보장하는 방법을 단계별로 안내합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 30분 (설정 적용 기준)&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Producer 측&lt;/strong&gt;: &lt;code&gt;acks=all&lt;/code&gt;, &lt;code&gt;enable.idempotence=true&lt;/code&gt;, 적절한 재시도 설정&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Broker 측&lt;/strong&gt;: &lt;code&gt;min.insync.replicas=2&lt;/code&gt;, &lt;code&gt;unclean.leader.election.enable=false&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consumer 측&lt;/strong&gt;: 수동 커밋, 처리 후 커밋, 재시도 메커니즘 구현&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;End-to-End&lt;/strong&gt;: 메시지 추적 ID 활용, 모니터링 및 알림 설정&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;hr&gt;
&lt;h2 id="시작하기-전에"&gt;시작하기 전에&lt;a class="anchor" href="#%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-%ec%a0%84%ec%97%90"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;이 가이드를 따라하기 위해 다음 환경이 필요합니다.&lt;/p&gt;
&lt;h3 id="필수-요구사항"&gt;필수 요구사항&lt;a class="anchor" href="#%ed%95%84%ec%88%98-%ec%9a%94%ea%b5%ac%ec%82%ac%ed%95%ad"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;항목&lt;/th&gt;
 &lt;th&gt;최소 버전&lt;/th&gt;
 &lt;th&gt;확인 명령어&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Apache Kafka&lt;/td&gt;
 &lt;td&gt;2.8+&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;kafka-topics.sh --version&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Java&lt;/td&gt;
 &lt;td&gt;17+&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;java -version&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Spring Boot&lt;/td&gt;
 &lt;td&gt;3.0+&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;./gradlew dependencies | grep spring-boot&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Spring Kafka&lt;/td&gt;
 &lt;td&gt;3.0+&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;./gradlew dependencies | grep spring-kafka&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="환경-확인"&gt;환경 확인&lt;a class="anchor" href="#%ed%99%98%ea%b2%bd-%ed%99%95%ec%9d%b8"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Kafka 클러스터에 접근 가능한지 확인하세요:&lt;/p&gt;</description></item><item><title>셔플 최적화하기</title><link>https://advanced-beginner.github.io/ko/docs/spark/howto/shuffle-optimization/</link><pubDate>Fri, 16 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/spark/howto/shuffle-optimization/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;예상 소요 시간&lt;/strong&gt;: 약 20분
&lt;/blockquote&gt;

&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;셔플 확인&lt;/strong&gt;: &lt;code&gt;df.explain()&lt;/code&gt;에서 &lt;code&gt;Exchange&lt;/code&gt; 노드 = 셔플 발생&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;불필요한 셔플 제거&lt;/strong&gt;: 같은 그룹에서 여러 집계 한 번에 수행&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;브로드캐스트 조인&lt;/strong&gt;: 작은 테이블(수십 MB)은 &lt;code&gt;broadcast()&lt;/code&gt; 사용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;셔플 파티션 수&lt;/strong&gt;: &lt;code&gt;spark.sql.shuffle.partitions&lt;/code&gt; 조정 (기본 200)&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h2 id="문제-정의"&gt;문제 정의&lt;a class="anchor" href="#%eb%ac%b8%ec%a0%9c-%ec%a0%95%ec%9d%98"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음과 같은 증상이 나타나면 셔플 최적화가 필요합니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;증상&lt;/th&gt;
 &lt;th&gt;확인 위치&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Stage 간 전환이 10초 이상 걸림&lt;/td&gt;
 &lt;td&gt;Spark UI → Jobs 탭&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Shuffle Read/Write가 수십 GB 이상&lt;/td&gt;
 &lt;td&gt;Spark UI → Stages 탭&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;네트워크 I/O로 인한 타임아웃&lt;/td&gt;
 &lt;td&gt;애플리케이션 로그&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;explain()&lt;/code&gt;에서 &lt;code&gt;Exchange&lt;/code&gt; 노드 다수&lt;/td&gt;
 &lt;td&gt;실행 계획 출력&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;셔플은 Spark에서 가장 비용이 큰 연산입니다. 아래 연산은 셔플을 발생시킵니다:&lt;/p&gt;</description></item><item><title>알림 피로도 관리</title><link>https://advanced-beginner.github.io/ko/docs/observability/howto/manage-alert-fatigue/</link><pubDate>Fri, 16 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/howto/manage-alert-fatigue/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;대상 상황&lt;/strong&gt;: 하루에 수십&lt;del&gt;수백 건의 알림이 발생하여 중요한 알림을 놓침
&lt;strong&gt;목표&lt;/strong&gt;: 실질적으로 대응이 필요한 알림만 수신
&lt;strong&gt;소요 시간&lt;/strong&gt;: 1&lt;/del&gt;2시간 (알림 규칙 분석 및 수정)
&lt;strong&gt;성공 기준&lt;/strong&gt;: 일일 알림 수가 대응 가능한 수준(예: 10건 이하)으로 감소&lt;/p&gt;
&lt;/blockquote&gt;&lt;h2 id="시작하기-전에"&gt;시작하기 전에&lt;a class="anchor" href="#%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-%ec%a0%84%ec%97%90"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="필요-환경"&gt;필요 환경&lt;a class="anchor" href="#%ed%95%84%ec%9a%94-%ed%99%98%ea%b2%bd"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;구성요소&lt;/th&gt;
 &lt;th&gt;버전&lt;/th&gt;
 &lt;th&gt;확인 방법&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Prometheus&lt;/td&gt;
 &lt;td&gt;2.40+&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;prometheus --version&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Alertmanager&lt;/td&gt;
 &lt;td&gt;0.25+&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;alertmanager --version&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;amtool&lt;/td&gt;
 &lt;td&gt;0.25+&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;amtool --version&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="필요-권한"&gt;필요 권한&lt;a class="anchor" href="#%ed%95%84%ec%9a%94-%ea%b6%8c%ed%95%9c"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Prometheus 설정 파일(&lt;code&gt;prometheus.yml&lt;/code&gt;) 수정 권한&lt;/li&gt;
&lt;li&gt;Alertmanager 설정 파일(&lt;code&gt;alertmanager.yml&lt;/code&gt;) 수정 권한&lt;/li&gt;
&lt;li&gt;Prometheus/Alertmanager 재시작 권한&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="환경-확인"&gt;환경 확인&lt;a class="anchor" href="#%ed%99%98%ea%b2%bd-%ed%99%95%ec%9d%b8"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Prometheus 상태 확인&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s http://localhost:9090/-/healthy &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Prometheus OK&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Alertmanager 상태 확인&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s http://localhost:9093/-/healthy &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Alertmanager OK&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# amtool 설정 확인&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;amtool config show --alertmanager.url&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:9093&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="문제-상황"&gt;문제 상황&lt;a class="anchor" href="#%eb%ac%b8%ec%a0%9c-%ec%83%81%ed%99%a9"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# 어제 발생한 알림 요약
Critical: 15건 (HighCPU 8건, HighMemory 7건)
Warning: 87건 (SlowResponse 45건, HighLatency 32건, PodRestart 10건)
총: 102건

# 실제 장애: 1건
# 놓친 알림: 1건 (HighCPU 알림에 묻힘)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;알림 피로도(Alert Fatigue)가 발생하면:&lt;/p&gt;</description></item><item><title>Aggregate 심화</title><link>https://advanced-beginner.github.io/ko/docs/ddd/concepts/aggregate/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/ddd/concepts/aggregate/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Aggregate 기본 개념을 알고 있으며 설계 심화 학습이 필요한 개발자
&lt;strong&gt;선수 지식&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/ddd/concepts/tactical-design/"&gt;전술적 설계&lt;/a&gt;의 Entity, Value Object 개념
&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25분
&lt;strong&gt;핵심 질문&lt;/strong&gt;: &amp;ldquo;Aggregate 경계를 어떻게 정하고, 크기는 어느 정도가 적당한가?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;요약&lt;/strong&gt;&lt;br&gt;Aggregate 설계 핵심: &lt;strong&gt;불변식 기반 경계 설정&lt;/strong&gt; → &lt;strong&gt;작게 유지&lt;/strong&gt; → &lt;strong&gt;ID로 참조&lt;/strong&gt; → &lt;strong&gt;결과적 일관성 활용&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;h1 id="aggregate-심화"&gt;Aggregate 심화&lt;a class="anchor" href="#aggregate-%ec%8b%ac%ed%99%94"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Aggregate의 설계 원칙, 트랜잭션 경계, 실전 패턴을 깊이 있게 다룹니다.&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;비유: 가족과 이웃&lt;/strong&gt;&lt;br&gt;&lt;p&gt;Aggregate를 이해하는 가장 쉬운 비유는 &lt;strong&gt;가족 단위&lt;/strong&gt;입니다.&lt;/p&gt;</description></item><item><title>Consumer Group &amp; Offset</title><link>https://advanced-beginner.github.io/ko/docs/kafka/concepts/consumer-group/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kafka/concepts/consumer-group/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;Consumer Group은 동일 목적의 Consumer들을 묶어 병렬 처리하는 논리적 그룹&lt;/li&gt;
&lt;li&gt;핵심 규칙: 하나의 Partition은 Group 내에서 하나의 Consumer만 읽을 수 있음&lt;/li&gt;
&lt;li&gt;Offset은 Partition 내 메시지 위치 번호로, __consumer_offsets 토픽에 저장&lt;/li&gt;
&lt;li&gt;자동 커밋은 간편하지만 데이터 유실 위험, 수동 커밋은 정확한 제어 가능&lt;/li&gt;
&lt;li&gt;Consumer 장애 시 리밸런싱으로 Partition이 자동 재분배됨&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Kafka Consumer를 개발하거나 운영하는 개발자, 병렬 처리와 상태 관리를 학습하려는 분&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/kafka/concepts/message-flow/"&gt;메시지 흐름&lt;/a&gt;의 Topic과 Partition 개념, &lt;a href="https://advanced-beginner.github.io/ko/docs/kafka/concepts/replication/"&gt;Replication&lt;/a&gt;의 Leader/Follower 개념&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;</description></item><item><title>DataFrame과 Dataset</title><link>https://advanced-beginner.github.io/ko/docs/spark/concepts/dataframe-dataset/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/spark/concepts/dataframe-dataset/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;DataFrame은 스키마가 있는 분산 테이블, Dataset은 타입 안전한 분산 컬렉션&lt;/li&gt;
&lt;li&gt;Java에서 DataFrame = &lt;code&gt;Dataset&amp;lt;Row&amp;gt;&lt;/code&gt;, 타입 Dataset = &lt;code&gt;Dataset&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Catalyst Optimizer를 통한 자동 최적화로 RDD보다 성능 우수&lt;/li&gt;
&lt;li&gt;SQL 스타일 작업은 DataFrame, 복잡한 비즈니스 로직은 Dataset 권장&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Java/Spring 개발자, Spark 데이터 처리를 시작하는 중급자&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Java Generics 및 함수형 인터페이스 (Function, Consumer 등)&lt;/li&gt;
&lt;li&gt;SQL 기본 문법 (SELECT, WHERE, GROUP BY)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://advanced-beginner.github.io/ko/docs/spark/concepts/rdd/"&gt;RDD 기초&lt;/a&gt; 문서 이해 권장&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;</description></item><item><title>Deployment</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/deployment/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/deployment/</guid><description>&lt;h2 id="전체-비유-입주민-관리-시스템"&gt;전체 비유: 입주민 관리 시스템&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ec%9e%85%ec%a3%bc%eb%af%bc-%ea%b4%80%eb%a6%ac-%ec%8b%9c%ec%8a%a4%ed%85%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Deployment를 &lt;strong&gt;아파트 입주민 관리 시스템&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;아파트 관리 비유&lt;/th&gt;
 &lt;th&gt;Kubernetes Deployment&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;Deployment&lt;/td&gt;
 &lt;td&gt;세대(Pod) 배치와 업데이트 총괄&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;항상 3세대 유지&amp;rdquo; 규칙&lt;/td&gt;
 &lt;td&gt;replicas: 3&lt;/td&gt;
 &lt;td&gt;원하는 세대 수 선언&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;세대 목록 관리대장&lt;/td&gt;
 &lt;td&gt;ReplicaSet&lt;/td&gt;
 &lt;td&gt;실제 세대 수 유지 담당&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;순차적 이사&lt;/td&gt;
 &lt;td&gt;Rolling Update&lt;/td&gt;
 &lt;td&gt;한 세대씩 새 버전으로 교체&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;이전 주소로 복귀&lt;/td&gt;
 &lt;td&gt;Rollback&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;Pod 장애 시 자동 재생성&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;입주 규격 템플릿&lt;/td&gt;
 &lt;td&gt;Pod Template&lt;/td&gt;
 &lt;td&gt;생성할 세대의 표준 사양&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;과거 입주 기록 보관&lt;/td&gt;
 &lt;td&gt;revisionHistory&lt;/td&gt;
 &lt;td&gt;롤백용 이전 버전 유지&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 Deployment는 &amp;ldquo;관리사무소가 항상 일정 수의 세대를 유지하고, 리모델링 시 순차적으로 진행&amp;quot;하는 것과 같습니다.&lt;/p&gt;</description></item><item><title>Errors (에러)</title><link>https://advanced-beginner.github.io/ko/docs/observability/concepts/golden-signals/errors/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/concepts/golden-signals/errors/</guid><description>&lt;h2 id="전체-비유-응급실-분류-체계"&gt;전체 비유: 응급실 분류 체계&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ec%9d%91%ea%b8%89%ec%8b%a4-%eb%b6%84%eb%a5%98-%ec%b2%b4%ea%b3%84"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Errors를 &lt;strong&gt;응급실 환자 분류(Triage) 시스템&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;응급실 분류 비유&lt;/th&gt;
 &lt;th&gt;Errors 개념&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;5xx vs 4xx, 심각도 구분&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;감기 환자 (경미)&lt;/td&gt;
 &lt;td&gt;404 Not Found&lt;/td&gt;
 &lt;td&gt;흔하고 대부분 정상&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;예방 조치 (거부)&lt;/td&gt;
 &lt;td&gt;429 Rate Limit&lt;/td&gt;
 &lt;td&gt;의도적 보호 기제&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;응급 환자 (심각)&lt;/td&gt;
 &lt;td&gt;500 에러&lt;/td&gt;
 &lt;td&gt;즉각 조치 필요&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;중환자실 만석&lt;/td&gt;
 &lt;td&gt;503 에러&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;SLO&lt;/td&gt;
 &lt;td&gt;목표 가용성&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 응급실에서 환자를 분류하듯, 에러도 유형별로 분류하여 적절한 대응 우선순위를 정합니다.&lt;/p&gt;</description></item><item><title>Prometheus 아키텍처</title><link>https://advanced-beginner.github.io/ko/docs/observability/concepts/prometheus-architecture/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/concepts/prometheus-architecture/</guid><description>&lt;h2 id="전체-비유-정기-건강검진-시스템"&gt;전체 비유: 정기 건강검진 시스템&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ec%a0%95%ea%b8%b0-%ea%b1%b4%ea%b0%95%ea%b2%80%ec%a7%84-%ec%8b%9c%ec%8a%a4%ed%85%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Prometheus 아키텍처를 &lt;strong&gt;병원의 정기 건강검진 시스템&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;건강검진 비유&lt;/th&gt;
 &lt;th&gt;Prometheus 구성요소&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;Pull 모델&lt;/td&gt;
 &lt;td&gt;정해진 주기로 상태 확인&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;건강검진 센터&lt;/td&gt;
 &lt;td&gt;Prometheus Server&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;검진 결과 DB&lt;/td&gt;
 &lt;td&gt;TSDB (시계열 DB)&lt;/td&gt;
 &lt;td&gt;시간별 데이터 저장&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;직원 건강검진 (회사 방문)&lt;/td&gt;
 &lt;td&gt;Scrape&lt;/td&gt;
 &lt;td&gt;타겟에서 메트릭 수집&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;외래 환자 접수&lt;/td&gt;
 &lt;td&gt;Pushgateway&lt;/td&gt;
 &lt;td&gt;짧은 작업의 메트릭 저장&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;이상 수치 알림&lt;/td&gt;
 &lt;td&gt;Alertmanager&lt;/td&gt;
 &lt;td&gt;문제 발생 시 알림&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;검진 결과 분류/정리&lt;/td&gt;
 &lt;td&gt;Relabeling&lt;/td&gt;
 &lt;td&gt;라벨 변환 및 필터링&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 정기 건강검진에서 의사가 환자를 찾아가듯, Prometheus는 타겟을 주기적으로 방문하여 상태를 확인합니다.&lt;/p&gt;</description></item><item><title>Query DSL</title><link>https://advanced-beginner.github.io/ko/docs/elasticsearch/concepts/query-dsl/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/elasticsearch/concepts/query-dsl/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Query Context&lt;/strong&gt;: 관련성 점수(score)를 계산하는 풀텍스트 검색&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filter Context&lt;/strong&gt;: 점수 없이 조건만 확인, 캐싱되어 빠름&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;match/match_phrase&lt;/strong&gt;: 풀텍스트 검색에 사용 (text 필드)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;term/terms/range&lt;/strong&gt;: 정확한 값 검색에 사용 (keyword 필드)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;bool&lt;/strong&gt;: must/should/must_not/filter로 쿼리 조합&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Elasticsearch 기본 개념을 이해한 개발자
&lt;strong&gt;선수 지식&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/elasticsearch/concepts/core-components/"&gt;핵심 구성요소&lt;/a&gt;, JSON 기본 문법&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;
&lt;h2 id="전체-비유-도서관에서-책-찾기"&gt;전체 비유: 도서관에서 책 찾기&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%eb%8f%84%ec%84%9c%ea%b4%80%ec%97%90%ec%84%9c-%ec%b1%85-%ec%b0%be%ea%b8%b0"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Query DSL을 &lt;strong&gt;도서관에서 책을 찾는 방법&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;도서관 비유&lt;/th&gt;
 &lt;th&gt;Query DSL&lt;/th&gt;
 &lt;th&gt;역할&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;인공지능 관련 책 찾아주세요&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;Query Context (match)&lt;/td&gt;
 &lt;td&gt;내용 관련성으로 추천, 관련도 순 정렬&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;005.133 분류 책만 보여주세요&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;Filter Context (term)&lt;/td&gt;
 &lt;td&gt;조건 일치 여부만 확인, 빠름&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;머신러닝 입문&amp;rdquo; 내용 검색&lt;/td&gt;
 &lt;td&gt;match&lt;/td&gt;
 &lt;td&gt;단어 포함 여부로 검색 (순서 무관)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;머신러닝 입문&amp;rdquo; 정확히&lt;/td&gt;
 &lt;td&gt;match_phrase&lt;/td&gt;
 &lt;td&gt;정확한 문구 순서로 검색&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;청구기호 &amp;ldquo;005.133&amp;rdquo; 정확히&lt;/td&gt;
 &lt;td&gt;term&lt;/td&gt;
 &lt;td&gt;값이 정확히 일치하는 것만&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;2020~2024년 출판 도서&lt;/td&gt;
 &lt;td&gt;range&lt;/td&gt;
 &lt;td&gt;범위 내 값 검색&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;컴퓨터 분야 AND 2024년 출판&lt;/td&gt;
 &lt;td&gt;bool (must)&lt;/td&gt;
 &lt;td&gt;모든 조건 만족&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;프로그래밍 OR 데이터분석&lt;/td&gt;
 &lt;td&gt;bool (should)&lt;/td&gt;
 &lt;td&gt;하나 이상 만족&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;번역서 제외&lt;/td&gt;
 &lt;td&gt;bool (must_not)&lt;/td&gt;
 &lt;td&gt;해당 조건 제외&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 Query DSL은 도서관 사서에게 &amp;ldquo;어떤 조건으로 책을 찾아달라&amp;quot;고 요청하는 것과 같습니다.&lt;/p&gt;</description></item><item><title>rate와 increase</title><link>https://advanced-beginner.github.io/ko/docs/observability/concepts/promql/rate-and-increase/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/concepts/promql/rate-and-increase/</guid><description>&lt;h2 id="전체-비유-누적-진료-기록-분석"&gt;전체 비유: 누적 진료 기록 분석&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%eb%88%84%ec%a0%81-%ec%a7%84%eb%a3%8c-%ea%b8%b0%eb%a1%9d-%eb%b6%84%ec%84%9d"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;rate와 increase를 &lt;strong&gt;누적 진료 기록 분석&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;진료 기록 비유&lt;/th&gt;
 &lt;th&gt;PromQL 함수&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;Counter 원시값&lt;/td&gt;
 &lt;td&gt;서버 시작 후 누적 (의미 제한적)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;시간당 진료 건수&lt;/td&gt;
 &lt;td&gt;rate()&lt;/td&gt;
 &lt;td&gt;초당 평균 증가율 (핵심)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;오늘 하루 진료 건수&lt;/td&gt;
 &lt;td&gt;increase()&lt;/td&gt;
 &lt;td&gt;기간 내 총 증가량&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;방금 전 진료 속도&lt;/td&gt;
 &lt;td&gt;irate()&lt;/td&gt;
 &lt;td&gt;마지막 구간 순간 증가율&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;야간 진료 재시작&lt;/td&gt;
 &lt;td&gt;Counter 리셋&lt;/td&gt;
 &lt;td&gt;자동으로 처리됨&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;대시보드 현황판&lt;/td&gt;
 &lt;td&gt;rate 활용&lt;/td&gt;
 &lt;td&gt;실시간 모니터링&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;월간 리포트&lt;/td&gt;
 &lt;td&gt;increase 활용&lt;/td&gt;
 &lt;td&gt;기간별 합계&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 누적 진료 기록에서 &amp;ldquo;시간당 진료 건수&amp;quot;를 계산하듯, rate()로 Counter를 변화율로 변환합니다.&lt;/p&gt;</description></item><item><title>클린 아키텍처</title><link>https://advanced-beginner.github.io/ko/docs/ddd/concepts/architecture/clean-architecture/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/ddd/concepts/architecture/clean-architecture/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: 엄격한 의존성 관리가 필요한 대규모 프로젝트 개발자
&lt;strong&gt;선수 지식&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/ddd/concepts/architecture/hexagonal-architecture/"&gt;헥사고날 아키텍처&lt;/a&gt;의 Port/Adapter 개념
&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25분&lt;/p&gt;
&lt;/blockquote&gt;&lt;h1 id="클린-아키텍처-clean-architecture"&gt;클린 아키텍처 (Clean Architecture)&lt;a class="anchor" href="#%ed%81%b4%eb%a6%b0-%ec%95%84%ed%82%a4%ed%85%8d%ec%b2%98-clean-architecture"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Uncle Bob(Robert C. Martin)이 2012년에 제안한 아키텍처입니다. &lt;strong&gt;의존성 규칙&lt;/strong&gt;을 엄격하게 지키는 것이 핵심입니다.&lt;/p&gt;
&lt;p&gt;클린 아키텍처가 등장한 배경에는 소프트웨어 개발의 고질적인 문제가 있습니다. 비즈니스 로직이 프레임워크나 데이터베이스에 강하게 결합되면, 기술 스택을 변경하거나 테스트를 작성하는 것이 매우 어려워집니다. 예를 들어, JPA 어노테이션이 도메인 객체에 직접 붙어 있으면, 해당 도메인 로직을 테스트하려면 반드시 데이터베이스 연결이 필요하게 됩니다. 클린 아키텍처는 이런 문제를 해결하기 위해 &lt;strong&gt;비즈니스 규칙을 기술적 세부사항으로부터 완전히 격리&lt;/strong&gt;하는 것을 목표로 합니다.&lt;/p&gt;</description></item><item><title>함수와 메서드</title><link>https://advanced-beginner.github.io/ko/docs/scala/concepts/functions-methods/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/concepts/functions-methods/</guid><description>&lt;h2 id="전체-비유-요리사와-레시피"&gt;전체 비유: 요리사와 레시피&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ec%9a%94%eb%a6%ac%ec%82%ac%ec%99%80-%eb%a0%88%ec%8b%9c%ed%94%bc"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Scala의 함수와 메서드를 &lt;strong&gt;요리사와 레시피&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;요리 비유&lt;/th&gt;
 &lt;th&gt;Scala 개념&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;메서드 (def)&lt;/td&gt;
 &lt;td&gt;클래스에 소속된 동작 정의&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;레시피 카드 (전달 가능)&lt;/td&gt;
 &lt;td&gt;함수 값 (val)&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;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&gt;이처럼 요리사가 레시피를 조합하여 새로운 요리를 만들듯, Scala에서는 함수를 조합하여 복잡한 로직을 구성합니다.&lt;/p&gt;</description></item><item><title>Kafka 모니터링</title><link>https://advanced-beginner.github.io/ko/docs/observability/examples/kafka-monitoring/</link><pubDate>Mon, 12 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/examples/kafka-monitoring/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 20분
&lt;strong&gt;선수 지식&lt;/strong&gt;: Kafka 기초, &lt;a href="https://advanced-beginner.github.io/ko/docs/observability/examples/setup/"&gt;환경 구성&lt;/a&gt;
&lt;strong&gt;이 문서를 읽으면&lt;/strong&gt;: Kafka 클러스터와 Consumer Lag을 모니터링할 수 있습니다&lt;/p&gt;
&lt;/blockquote&gt;&lt;h2 id="kafka-모니터링-핵심-지표"&gt;Kafka 모니터링 핵심 지표&lt;a class="anchor" href="#kafka-%eb%aa%a8%eb%8b%88%ed%84%b0%eb%a7%81-%ed%95%b5%ec%8b%ac-%ec%a7%80%ed%91%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;카테고리&lt;/th&gt;
 &lt;th&gt;지표&lt;/th&gt;
 &lt;th&gt;의미&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Consumer&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Lag&lt;/td&gt;
 &lt;td&gt;처리 지연 (가장 중요)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Broker&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Under-replicated Partitions&lt;/td&gt;
 &lt;td&gt;복제 문제&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Producer&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Record Error Rate&lt;/td&gt;
 &lt;td&gt;전송 실패율&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Broker&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Disk Usage&lt;/td&gt;
 &lt;td&gt;저장 공간&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="step-1-kafka--jmx-exporter-설정"&gt;Step 1: Kafka + JMX Exporter 설정&lt;a class="anchor" href="#step-1-kafka--jmx-exporter-%ec%84%a4%ec%a0%95"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# docker-compose.yml에 추가&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;kafka&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;confluentinc/cp-kafka:7.5.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kafka&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;9092:9092&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;9101:9101&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# JMX&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;KAFKA_NODE_ID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;KAFKA_LISTENER_SECURITY_PROTOCOL_MAP&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;KAFKA_ADVERTISED_LISTENERS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;PLAINTEXT://localhost:9092&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;KAFKA_PROCESS_ROLES&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;broker,controller&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;KAFKA_CONTROLLER_QUORUM_VOTERS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;@&lt;span class="l"&gt;kafka:29093&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;KAFKA_LISTENERS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:29093&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;KAFKA_CONTROLLER_LISTENER_NAMES&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;CONTROLLER&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;CLUSTER_ID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;MkU3OEVBNTcwNTJENDM2Qk&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;KAFKA_JMX_PORT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;9101&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;KAFKA_JMX_HOSTNAME&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;localhost&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;KAFKA_OPTS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="l"&gt;javaagent:/opt/jmx-exporter/jmx_prometheus_javaagent.jar=7071:/opt/jmx-exporter/kafka.yml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./jmx-exporter:/opt/jmx-exporter&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;kafka-exporter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;danielqsj/kafka-exporter:latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kafka-exporter&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;9308:9308&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;kafka.server=kafka:9092&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;topic.filter=.*&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;group.filter=.*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-2-jmx-exporter-설정"&gt;Step 2: JMX Exporter 설정&lt;a class="anchor" href="#step-2-jmx-exporter-%ec%84%a4%ec%a0%95"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p jmx-exporter
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -L https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.19.0/jmx_prometheus_javaagent-0.19.0.jar -o jmx-exporter/jmx_prometheus_javaagent.jar&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# jmx-exporter/kafka.yml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;lowercaseOutputName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Broker 메트릭&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kafka.server&amp;lt;type=(.+), name=(.+), clientId=(.+), topic=(.+), partition=(.*)&amp;gt;&amp;lt;&amp;gt;Value&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kafka_server_$1_$2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;GAUGE&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;clientId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;$3&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;$4&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;partition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;$5&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kafka.server&amp;lt;type=(.+), name=(.+)&amp;gt;&amp;lt;&amp;gt;Value&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kafka_server_$1_$2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;GAUGE&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Under-replicated Partitions&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kafka.server&amp;lt;type=ReplicaManager, name=UnderReplicatedPartitions&amp;gt;&amp;lt;&amp;gt;Value&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kafka_server_replicamanager_underreplicatedpartitions&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;GAUGE&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Messages In Per Sec&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kafka.server&amp;lt;type=BrokerTopicMetrics, name=MessagesInPerSec, topic=(.+)&amp;gt;&amp;lt;&amp;gt;OneMinuteRate&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kafka_server_brokertopicmetrics_messagesin_total&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;GAUGE&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;$1&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Bytes In Per Sec&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kafka.server&amp;lt;type=BrokerTopicMetrics, name=BytesInPerSec, topic=(.+)&amp;gt;&amp;lt;&amp;gt;OneMinuteRate&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kafka_server_brokertopicmetrics_bytesin_total&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;GAUGE&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;$1&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-3-prometheus-설정-추가"&gt;Step 3: Prometheus 설정 추가&lt;a class="anchor" href="#step-3-prometheus-%ec%84%a4%ec%a0%95-%ec%b6%94%ea%b0%80"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# prometheus/prometheus.yml에 추가&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;scrape_configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;job_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;kafka&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;static_configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;targets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;kafka:7071&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;job_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;kafka-exporter&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;static_configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;targets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;kafka-exporter:9308&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-4-핵심-promql-쿼리"&gt;Step 4: 핵심 PromQL 쿼리&lt;a class="anchor" href="#step-4-%ed%95%b5%ec%8b%ac-promql-%ec%bf%bc%eb%a6%ac"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="consumer-lag"&gt;Consumer Lag&lt;a class="anchor" href="#consumer-lag"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-promql" data-lang="promql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 컨슈머 그룹별 Lag&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;consumergroup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;topic&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kafka_consumergroup_lag&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Lag이 10000 이상인 그룹&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;consumergroup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;topic&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kafka_consumergroup_lag&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Lag 추이&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kafka_consumergroup_lag&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;consumergroup&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="broker-상태"&gt;Broker 상태&lt;a class="anchor" href="#broker-%ec%83%81%ed%83%9c"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-promql" data-lang="promql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Under-replicated Partitions&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;kafka_server_replicamanager_underreplicatedpartitions&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ISR (In-Sync Replicas) 축소&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;kafka_server_replicamanager_isrshrinks_total&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="트래픽"&gt;트래픽&lt;a class="anchor" href="#%ed%8a%b8%eb%9e%98%ed%94%bd"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-promql" data-lang="promql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 토픽별 초당 메시지 수&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;topic&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;rate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kafka_server_brokertopicmetrics_messagesin_total&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;5m&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 토픽별 초당 바이트&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;topic&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;rate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kafka_server_brokertopicmetrics_bytesin_total&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;5m&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-5-알림-규칙"&gt;Step 5: 알림 규칙&lt;a class="anchor" href="#step-5-%ec%95%8c%eb%a6%bc-%ea%b7%9c%ec%b9%99"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# prometheus/rules/kafka-alerts.yml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kafka&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;KafkaConsumerLagHigh&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;sum by (consumergroup, topic) (kafka_consumergroup_lag) &amp;gt; 10000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;for&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;10m&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;severity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;warning&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;annotations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;High consumer lag: {{ $labels.consumergroup }}&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Lag is {{ $value }} on topic {{ $labels.topic }}&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;KafkaUnderReplicatedPartitions&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kafka_server_replicamanager_underreplicatedpartitions &amp;gt; 0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;for&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;5m&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;severity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;critical&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;annotations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Kafka under-replicated partitions&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;{{ $value }} partitions are under-replicated&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;KafkaBrokerDown&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;count(kafka_server_kafkaserver_brokerstate) &amp;lt; 3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;for&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;5m&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;severity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;critical&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;annotations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Kafka broker down&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-6-recording-rules"&gt;Step 6: Recording Rules&lt;a class="anchor" href="#step-6-recording-rules"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# prometheus/rules/kafka-recording.yml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kafka_recording&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;record&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;topic:kafka_messages:rate5m&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;sum by (topic) (rate(kafka_server_brokertopicmetrics_messagesin_total[5m]))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;record&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;consumergroup:kafka_lag:sum&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;sum by (consumergroup) (kafka_consumergroup_lag)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;record&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="l"&gt;kafka_underreplicated:sum&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;sum(kafka_server_replicamanager_underreplicatedpartitions)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-7-grafana-대시보드"&gt;Step 7: Grafana 대시보드&lt;a class="anchor" href="#step-7-grafana-%eb%8c%80%ec%8b%9c%eb%b3%b4%eb%93%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="row-1-overview"&gt;Row 1: Overview&lt;a class="anchor" href="#row-1-overview"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;패널&lt;/th&gt;
 &lt;th&gt;쿼리&lt;/th&gt;
 &lt;th&gt;타입&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Total Lag&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;sum(kafka_consumergroup_lag)&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Stat&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Messages/sec&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;sum(rate(kafka_server_brokertopicmetrics_messagesin_total[5m]))&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Stat&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Under-replicated&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;sum(kafka_server_replicamanager_underreplicatedpartitions)&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Stat&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="row-2-consumer-lag"&gt;Row 2: Consumer Lag&lt;a class="anchor" href="#row-2-consumer-lag"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-promql" data-lang="promql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Time Series: Lag 추이&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;consumergroup&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kafka_consumergroup_lag&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Table: 상세&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;consumergroup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;partition&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kafka_consumergroup_lag&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="row-3-traffic"&gt;Row 3: Traffic&lt;a class="anchor" href="#row-3-traffic"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-promql" data-lang="promql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 토픽별 메시지/초&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;topic&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;rate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kafka_server_brokertopicmetrics_messagesin_total&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;5m&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="spring-kafka-메트릭"&gt;Spring Kafka 메트릭&lt;a class="anchor" href="#spring-kafka-%eb%a9%94%ed%8a%b8%eb%a6%ad"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# application.yml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;management&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;kafka&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-promql" data-lang="promql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Producer 메트릭&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;kafka_producer_record_send_total&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;kafka_producer_record_error_total&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Consumer 메트릭&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;kafka_consumer_records_consumed_total&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;kafka_consumer_fetch_manager_records_lag&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="확인-체크리스트"&gt;확인 체크리스트&lt;a class="anchor" href="#%ed%99%95%ec%9d%b8-%ec%b2%b4%ed%81%ac%eb%a6%ac%ec%8a%a4%ed%8a%b8"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; kafka-exporter 메트릭 노출 확인&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Consumer Lag 쿼리 동작 확인&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Grafana 대시보드 구성&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 알림 규칙 테스트&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="다음-단계"&gt;다음 단계&lt;a class="anchor" href="#%eb%8b%a4%ec%9d%8c-%eb%8b%a8%ea%b3%84"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;추천 순서&lt;/th&gt;
 &lt;th&gt;문서&lt;/th&gt;
 &lt;th&gt;배우는 것&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://advanced-beginner.github.io/ko/docs/observability/examples/full-stack/"&gt;풀스택 예제&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;통합 예제&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;2&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://advanced-beginner.github.io/ko/docs/observability/concepts/golden-signals/by-service-type/"&gt;서비스 유형별 적용&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Kafka 황금 신호&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>알림 후 액션 가이드</title><link>https://advanced-beginner.github.io/ko/docs/observability/appendix/alerting-actions/</link><pubDate>Mon, 12 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/appendix/alerting-actions/</guid><description>&lt;p&gt;알림을 받은 후 어떻게 대응해야 하는지 상황별 가이드입니다.&lt;/p&gt;
&lt;h2 id="알림--액션-워크플로우"&gt;알림 → 액션 워크플로우&lt;a class="anchor" href="#%ec%95%8c%eb%a6%bc--%ec%95%a1%ec%85%98-%ec%9b%8c%ed%81%ac%ed%94%8c%eb%a1%9c%ec%9a%b0"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class="mermaid"&gt;graph LR
 A[&amp;#34;알림 수신&amp;#34;] --&amp;gt; B[&amp;#34;상황 파악&amp;#34;]
 B --&amp;gt; C[&amp;#34;영향도 평가&amp;#34;]
 C --&amp;gt; D[&amp;#34;즉시 조치&amp;#34;]
 D --&amp;gt; E[&amp;#34;근본 원인 분석&amp;#34;]
 E --&amp;gt; F[&amp;#34;영구 해결&amp;#34;]
 F --&amp;gt; G[&amp;#34;사후 검토&amp;#34;]&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="상황별-대응"&gt;상황별 대응&lt;a class="anchor" href="#%ec%83%81%ed%99%a9%eb%b3%84-%eb%8c%80%ec%9d%91"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-서비스-다운-targetdown"&gt;1. 서비스 다운 (TargetDown)&lt;a class="anchor" href="#1-%ec%84%9c%eb%b9%84%ec%8a%a4-%eb%8b%a4%ec%9a%b4-targetdown"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;알림&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;TargetDown&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;up == 0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;즉시 조치&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 서비스 상태 확인&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get pods -l &lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;order-service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker ps -f &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;order-service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. 로그 확인&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl logs -l &lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;order-service --tail&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker logs order-service --tail&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. 재시작 시도&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl rollout restart deployment/order-service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker restart order-service&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;근본 원인 분석&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Spring Boot 배포</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/examples/spring-boot/</link><pubDate>Sun, 11 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/examples/spring-boot/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Spring Boot 애플리케이션을 Kubernetes에 배포하고 싶은 백엔드 개발자
&lt;strong&gt;선수 지식&lt;/strong&gt;: Deployment, Service, ConfigMap, Docker
&lt;strong&gt;이 문서를 읽으면&lt;/strong&gt;: Spring Boot 앱을 컨테이너화하고 Kubernetes에 배포할 수 있습니다&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;Dockerfile 작성 → 이미지 빌드 → Kubernetes 배포&lt;/li&gt;
&lt;li&gt;ConfigMap/Secret으로 환경별 설정 분리&lt;/li&gt;
&lt;li&gt;Actuator 엔드포인트로 헬스 체크 구성&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h2 id="전체-흐름"&gt;전체 흐름&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%ed%9d%90%eb%a6%84"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 A[Spring Boot App] --&amp;gt; B[Dockerfile]
 B --&amp;gt; C[Docker Build]
 C --&amp;gt; D[이미지 Push]
 D --&amp;gt; E[K8s Deployment]
 E --&amp;gt; F[Service]
 F --&amp;gt; G[Ingress]&lt;/pre&gt;&lt;h2 id="1-spring-boot-애플리케이션-준비"&gt;1. Spring Boot 애플리케이션 준비&lt;a class="anchor" href="#1-spring-boot-%ec%95%a0%ed%94%8c%eb%a6%ac%ec%bc%80%ec%9d%b4%ec%85%98-%ec%a4%80%eb%b9%84"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="예제-애플리케이션-구조"&gt;예제 애플리케이션 구조&lt;a class="anchor" href="#%ec%98%88%ec%a0%9c-%ec%95%a0%ed%94%8c%eb%a6%ac%ec%bc%80%ec%9d%b4%ec%85%98-%ea%b5%ac%ec%a1%b0"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;my-app/
├── src/main/
│ ├── java/com/example/
│ │ └── MyAppApplication.java
│ └── resources/
│ └── application.yml
├── Dockerfile
├── build.gradle.kts
└── kubernetes/
 ├── deployment.yaml
 ├── service.yaml
 ├── configmap.yaml
 └── secret.yaml&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="applicationyml"&gt;application.yml&lt;a class="anchor" href="#applicationyml"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spring&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;application&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;my-app&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;datasource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${DATABASE_URL:jdbc:postgresql://localhost:5432/mydb}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${DATABASE_USERNAME:postgres}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${DATABASE_PASSWORD:postgres}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;management&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;endpoints&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;web&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;exposure&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;include&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;health,info,prometheus&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;health&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;probes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;health&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;livenessState&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;readinessState&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="간단한-컨트롤러"&gt;간단한 컨트롤러&lt;a class="anchor" href="#%ea%b0%84%eb%8b%a8%ed%95%9c-%ec%bb%a8%ed%8a%b8%eb%a1%a4%eb%9f%ac"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@RestController&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HelloController&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@GetMapping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Hello from Kubernetes!&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@GetMapping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/hostname&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Pod: &amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;InetAddress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getLocalHost&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getHostName&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;UnknownHostException&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Unknown&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2-docker-이미지-빌드"&gt;2. Docker 이미지 빌드&lt;a class="anchor" href="#2-docker-%ec%9d%b4%eb%af%b8%ec%a7%80-%eb%b9%8c%eb%93%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="dockerfile-멀티스테이지-빌드"&gt;Dockerfile (멀티스테이지 빌드)&lt;a class="anchor" href="#dockerfile-%eb%a9%80%ed%8b%b0%ec%8a%a4%ed%85%8c%ec%9d%b4%ec%a7%80-%eb%b9%8c%eb%93%9c"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 빌드 스테이지&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;eclipse-temurin:17-jdk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;build&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; gradle gradle&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; build.gradle.kts settings.gradle.kts gradlew ./&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; src src&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; ./gradlew bootJar --no-daemon&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 실행 스테이지&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;eclipse-temurin:17-jre&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 보안: non-root 사용자&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; addgroup --system appgroup &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; adduser --system appuser --ingroup appgroup&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;appuser&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; --from&lt;span class="o"&gt;=&lt;/span&gt;build /app/build/libs/*.jar app.jar&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;8080&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;java&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;-jar&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;app.jar&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="이미지-빌드"&gt;이미지 빌드&lt;a class="anchor" href="#%ec%9d%b4%eb%af%b8%ec%a7%80-%eb%b9%8c%eb%93%9c"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Docker 이미지 빌드&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker build -t my-app:1.0 .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 로컬 테스트&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -p 8080:8080 my-app:1.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Minikube 환경에서 로컬 이미지 사용&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;minikube docker-env&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker build -t my-app:1.0 .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Kind 환경에서 로컬 이미지 사용&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kind load docker-image my-app:1.0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="3-kubernetes-리소스-작성"&gt;3. Kubernetes 리소스 작성&lt;a class="anchor" href="#3-kubernetes-%eb%a6%ac%ec%86%8c%ec%8a%a4-%ec%9e%91%ec%84%b1"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="configmap-환경-설정"&gt;ConfigMap (환경 설정)&lt;a class="anchor" href="#configmap-%ed%99%98%ea%b2%bd-%ec%84%a4%ec%a0%95"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# kubernetes/configmap.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ConfigMap&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;my-app-config&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;SPRING_PROFILES_ACTIVE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;kubernetes&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;jdbc:postgresql://postgres-service:5432/mydb&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;JAVA_OPTS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-Xms256m -Xmx512m&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="secret-민감-정보"&gt;Secret (민감 정보)&lt;a class="anchor" href="#secret-%eb%af%bc%ea%b0%90-%ec%a0%95%eb%b3%b4"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Secret 생성 (명령어)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl create secret generic my-app-secret &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --from-literal&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;DATABASE_USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;myuser &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --from-literal&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;DATABASE_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mypassword&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;또는 YAML로:&lt;/p&gt;</description></item><item><title>참고 자료</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/appendix/references/</link><pubDate>Sun, 11 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/appendix/references/</guid><description>&lt;p&gt;Kubernetes 학습과 운영에 도움이 되는 공식 문서와 추가 학습 자료를 정리합니다.&lt;/p&gt;
&lt;h2 id="학습-단계별-추천-자료"&gt;학습 단계별 추천 자료&lt;a class="anchor" href="#%ed%95%99%ec%8a%b5-%eb%8b%a8%ea%b3%84%eb%b3%84-%ec%b6%94%ec%b2%9c-%ec%9e%90%eb%a3%8c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;어디서부터 시작해야 할지 모르겠다면 아래 로드맵을 참고하세요.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 START[시작] --&amp;gt; L1[1단계: 입문]
 L1 --&amp;gt; L2[2단계: 기초]
 L2 --&amp;gt; L3[3단계: 심화]
 L3 --&amp;gt; L4[4단계: 전문가]

 L1 -.-&amp;gt;|추천| R1[Kubernetes Basics 튜토리얼]
 L2 -.-&amp;gt;|추천| R2[kubectl Cheat Sheet + 이 가이드]
 L3 -.-&amp;gt;|추천| R3[Kubernetes in Action 도서]
 L4 -.-&amp;gt;|추천| R4[CKA/CKAD 자격증]&lt;/pre&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;단계&lt;/th&gt;
 &lt;th&gt;목표&lt;/th&gt;
 &lt;th&gt;추천 자료&lt;/th&gt;
 &lt;th&gt;예상 기간&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;1. 입문&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;첫 배포 성공&lt;/td&gt;
 &lt;td&gt;Kubernetes Basics, Play with K8s&lt;/td&gt;
 &lt;td&gt;1주&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;2. 기초&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;핵심 개념 이해&lt;/td&gt;
 &lt;td&gt;이 가이드, kubectl Cheat Sheet&lt;/td&gt;
 &lt;td&gt;2-4주&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;3. 심화&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;운영 역량 확보&lt;/td&gt;
 &lt;td&gt;Kubernetes in Action, Prometheus&lt;/td&gt;
 &lt;td&gt;1-3개월&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;4. 전문가&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;자격증/아키텍처&lt;/td&gt;
 &lt;td&gt;CKA/CKAD, Kubernetes Patterns&lt;/td&gt;
 &lt;td&gt;3-6개월&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="공식-문서"&gt;공식 문서&lt;a class="anchor" href="#%ea%b3%b5%ec%8b%9d-%eb%ac%b8%ec%84%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="kubernetes-공식"&gt;Kubernetes 공식&lt;a class="anchor" href="#kubernetes-%ea%b3%b5%ec%8b%9d"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;자료&lt;/th&gt;
 &lt;th&gt;설명&lt;/th&gt;
 &lt;th&gt;링크&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Kubernetes Documentation&lt;/td&gt;
 &lt;td&gt;공식 문서 (한글 지원)&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://kubernetes.io/docs/"&gt;kubernetes.io/docs&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Kubernetes Blog&lt;/td&gt;
 &lt;td&gt;새로운 기능, 릴리스 소식&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://kubernetes.io/blog/"&gt;kubernetes.io/blog&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Kubernetes GitHub&lt;/td&gt;
 &lt;td&gt;소스 코드, 이슈&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://github.com/kubernetes/kubernetes"&gt;github.com/kubernetes&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="kubectl-참조"&gt;kubectl 참조&lt;a class="anchor" href="#kubectl-%ec%b0%b8%ec%a1%b0"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;자료&lt;/th&gt;
 &lt;th&gt;설명&lt;/th&gt;
 &lt;th&gt;링크&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;kubectl Cheat Sheet&lt;/td&gt;
 &lt;td&gt;자주 쓰는 명령어 모음&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://kubernetes.io/docs/reference/kubectl/cheatsheet/"&gt;kubectl cheatsheet&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;kubectl Reference&lt;/td&gt;
 &lt;td&gt;전체 명령어 참조&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://kubernetes.io/docs/reference/kubectl/"&gt;kubectl reference&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="api-참조"&gt;API 참조&lt;a class="anchor" href="#api-%ec%b0%b8%ec%a1%b0"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;자료&lt;/th&gt;
 &lt;th&gt;설명&lt;/th&gt;
 &lt;th&gt;링크&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;API Reference&lt;/td&gt;
 &lt;td&gt;Kubernetes API 문서&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://kubernetes.io/docs/reference/kubernetes-api/"&gt;API Reference&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="학습-자료"&gt;학습 자료&lt;a class="anchor" href="#%ed%95%99%ec%8a%b5-%ec%9e%90%eb%a3%8c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="인터랙티브-튜토리얼"&gt;인터랙티브 튜토리얼&lt;a class="anchor" href="#%ec%9d%b8%ed%84%b0%eb%9e%99%ed%8b%b0%eb%b8%8c-%ed%8a%9c%ed%86%a0%eb%a6%ac%ec%96%bc"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;자료&lt;/th&gt;
 &lt;th&gt;설명&lt;/th&gt;
 &lt;th&gt;링크&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Kubernetes Basics&lt;/td&gt;
 &lt;td&gt;공식 인터랙티브 튜토리얼&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://kubernetes.io/docs/tutorials/kubernetes-basics/"&gt;Learn Kubernetes Basics&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Katacoda (Killercoda)&lt;/td&gt;
 &lt;td&gt;브라우저 기반 실습 환경&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://killercoda.com/"&gt;killercoda.com&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Play with Kubernetes&lt;/td&gt;
 &lt;td&gt;무료 온라인 실습 환경&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://labs.play-with-k8s.com/"&gt;labs.play-with-k8s.com&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="도서"&gt;도서&lt;a class="anchor" href="#%eb%8f%84%ec%84%9c"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;도서&lt;/th&gt;
 &lt;th&gt;저자&lt;/th&gt;
 &lt;th&gt;특징&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Kubernetes in Action&lt;/td&gt;
 &lt;td&gt;Marko Lukša&lt;/td&gt;
 &lt;td&gt;실무 중심, 상세한 설명&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Kubernetes Patterns&lt;/td&gt;
 &lt;td&gt;Bilgin Ibryam&lt;/td&gt;
 &lt;td&gt;디자인 패턴 중심&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Cloud Native DevOps with Kubernetes&lt;/td&gt;
 &lt;td&gt;John Arundel&lt;/td&gt;
 &lt;td&gt;DevOps 관점&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="자격증"&gt;자격증&lt;a class="anchor" href="#%ec%9e%90%ea%b2%a9%ec%a6%9d"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;자격증&lt;/th&gt;
 &lt;th&gt;대상&lt;/th&gt;
 &lt;th&gt;설명&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;CKA&lt;/td&gt;
 &lt;td&gt;관리자&lt;/td&gt;
 &lt;td&gt;Kubernetes 클러스터 관리 능력 검증&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CKAD&lt;/td&gt;
 &lt;td&gt;개발자&lt;/td&gt;
 &lt;td&gt;Kubernetes 애플리케이션 개발 능력 검증&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CKS&lt;/td&gt;
 &lt;td&gt;보안 전문가&lt;/td&gt;
 &lt;td&gt;Kubernetes 보안 능력 검증&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="도구"&gt;도구&lt;a class="anchor" href="#%eb%8f%84%ea%b5%ac"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="로컬-개발"&gt;로컬 개발&lt;a class="anchor" href="#%eb%a1%9c%ec%bb%ac-%ea%b0%9c%eb%b0%9c"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;도구&lt;/th&gt;
 &lt;th&gt;설명&lt;/th&gt;
 &lt;th&gt;링크&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Minikube&lt;/td&gt;
 &lt;td&gt;로컬 Kubernetes 클러스터&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://minikube.sigs.k8s.io/"&gt;minikube.sigs.k8s.io&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Kind&lt;/td&gt;
 &lt;td&gt;Docker 기반 로컬 클러스터&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://kind.sigs.k8s.io/"&gt;kind.sigs.k8s.io&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;k3d&lt;/td&gt;
 &lt;td&gt;경량 Kubernetes (k3s)&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://k3d.io/"&gt;k3d.io&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="패키지-관리"&gt;패키지 관리&lt;a class="anchor" href="#%ed%8c%a8%ed%82%a4%ec%a7%80-%ea%b4%80%eb%a6%ac"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;도구&lt;/th&gt;
 &lt;th&gt;설명&lt;/th&gt;
 &lt;th&gt;링크&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Helm&lt;/td&gt;
 &lt;td&gt;Kubernetes 패키지 관리자&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://helm.sh/"&gt;helm.sh&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Kustomize&lt;/td&gt;
 &lt;td&gt;설정 커스터마이징&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://kustomize.io/"&gt;kustomize.io&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="모니터링"&gt;모니터링&lt;a class="anchor" href="#%eb%aa%a8%eb%8b%88%ed%84%b0%eb%a7%81"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;도구&lt;/th&gt;
 &lt;th&gt;설명&lt;/th&gt;
 &lt;th&gt;링크&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Prometheus&lt;/td&gt;
 &lt;td&gt;메트릭 수집&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://prometheus.io/"&gt;prometheus.io&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Grafana&lt;/td&gt;
 &lt;td&gt;시각화 대시보드&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://grafana.com/"&gt;grafana.com&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Lens&lt;/td&gt;
 &lt;td&gt;Kubernetes IDE&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://k8slens.dev/"&gt;k8slens.dev&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="cli-도구"&gt;CLI 도구&lt;a class="anchor" href="#cli-%eb%8f%84%ea%b5%ac"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;도구&lt;/th&gt;
 &lt;th&gt;설명&lt;/th&gt;
 &lt;th&gt;링크&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;kubectx/kubens&lt;/td&gt;
 &lt;td&gt;컨텍스트/네임스페이스 전환&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://github.com/ahmetb/kubectx"&gt;github.com/ahmetb/kubectx&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;k9s&lt;/td&gt;
 &lt;td&gt;터미널 UI&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://k9scli.io/"&gt;k9scli.io&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;stern&lt;/td&gt;
 &lt;td&gt;멀티 Pod 로그&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://github.com/stern/stern"&gt;github.com/stern/stern&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="관리형-kubernetes"&gt;관리형 Kubernetes&lt;a class="anchor" href="#%ea%b4%80%eb%a6%ac%ed%98%95-kubernetes"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;서비스&lt;/th&gt;
 &lt;th&gt;클라우드&lt;/th&gt;
 &lt;th&gt;링크&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Amazon EKS&lt;/td&gt;
 &lt;td&gt;AWS&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://aws.amazon.com/eks/"&gt;aws.amazon.com/eks&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Google GKE&lt;/td&gt;
 &lt;td&gt;GCP&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://cloud.google.com/kubernetes-engine"&gt;cloud.google.com/kubernetes-engine&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Azure AKS&lt;/td&gt;
 &lt;td&gt;Azure&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://azure.microsoft.com/services/kubernetes-service/"&gt;azure.microsoft.com/services/kubernetes-service&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="커뮤니티"&gt;커뮤니티&lt;a class="anchor" href="#%ec%bb%a4%eb%ae%a4%eb%8b%88%ed%8b%b0"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;채널&lt;/th&gt;
 &lt;th&gt;설명&lt;/th&gt;
 &lt;th&gt;링크&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Kubernetes Slack&lt;/td&gt;
 &lt;td&gt;공식 커뮤니티&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://slack.kubernetes.io/"&gt;slack.kubernetes.io&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CNCF&lt;/td&gt;
 &lt;td&gt;Cloud Native 재단&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://www.cncf.io/"&gt;cncf.io&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Stack Overflow&lt;/td&gt;
 &lt;td&gt;Q&amp;amp;A&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://stackoverflow.com/questions/tagged/kubernetes"&gt;stackoverflow.com/questions/tagged/kubernetes&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="버전-및-릴리스"&gt;버전 및 릴리스&lt;a class="anchor" href="#%eb%b2%84%ec%a0%84-%eb%b0%8f-%eb%a6%b4%eb%a6%ac%ec%8a%a4"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;자료&lt;/th&gt;
 &lt;th&gt;설명&lt;/th&gt;
 &lt;th&gt;링크&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Release Notes&lt;/td&gt;
 &lt;td&gt;버전별 변경사항&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://kubernetes.io/releases/"&gt;kubernetes.io/releases&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Deprecation Policy&lt;/td&gt;
 &lt;td&gt;지원 중단 정책&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://kubernetes.io/docs/reference/using-api/deprecation-policy/"&gt;Deprecation Policy&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Version Skew Policy&lt;/td&gt;
 &lt;td&gt;버전 호환성&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://kubernetes.io/releases/version-skew-policy/"&gt;Version Skew&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>FAQ</title><link>https://advanced-beginner.github.io/ko/docs/scala/appendix/faq/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/appendix/faq/</guid><description>&lt;p&gt;Scala에 대해 자주 묻는 질문과 답변입니다. 질문을 카테고리별로 분류하여 빠르게 원하는 정보를 찾을 수 있도록 했습니다.&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;버전 선택&lt;/strong&gt;: 새 프로젝트는 Scala 3, Spark 사용 시 Scala 2.12/2.13&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;val vs var&lt;/strong&gt;: 항상 &lt;code&gt;val&lt;/code&gt;(불변) 우선 사용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;null 대신 Option&lt;/strong&gt;: &lt;code&gt;Option&lt;/code&gt;, &lt;code&gt;Some&lt;/code&gt;, &lt;code&gt;None&lt;/code&gt;으로 안전한 null 처리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IDE&lt;/strong&gt;: IntelliJ IDEA + Scala 플러그인 (가장 완성도 높음)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;성능&lt;/strong&gt;: Java와 동등, 컬렉션 체이닝과 람다 사용 시 주의&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h4 id="일반"&gt;일반&lt;a class="anchor" href="#%ec%9d%bc%eb%b0%98"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Scala 학습과 관련된 일반적인 질문들입니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scala를 배워야 할까요?&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Scala 2 vs Scala 3 비교</title><link>https://advanced-beginner.github.io/ko/docs/scala/examples/scala2-vs-scala3/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/examples/scala2-vs-scala3/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;문법 간소화&lt;/strong&gt;: Scala 3는 들여쓰기 기반 구문, &lt;code&gt;then&lt;/code&gt; 키워드 도입&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;enum 지원&lt;/strong&gt;: &lt;code&gt;sealed trait&lt;/code&gt; + &lt;code&gt;case object&lt;/code&gt; 대신 네이티브 &lt;code&gt;enum&lt;/code&gt; 사용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;암시적 재설계&lt;/strong&gt;: &lt;code&gt;implicit&lt;/code&gt; → &lt;code&gt;given&lt;/code&gt;/&lt;code&gt;using&lt;/code&gt;/&lt;code&gt;extension&lt;/code&gt;으로 역할 분리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;새 타입 기능&lt;/strong&gt;: Union Type (&lt;code&gt;|&lt;/code&gt;), Opaque Type 추가&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;하위 호환&lt;/strong&gt;: Scala 3는 대부분의 Scala 2 문법 지원, 점진적 마이그레이션 가능&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Scala 2 경험자 또는 두 버전 모두 이해하고 싶은 개발자&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scala 기본 문법 이해&lt;/li&gt;
&lt;li&gt;함수형 프로그래밍 기초 개념&lt;/li&gt;
&lt;li&gt;(선택) Scala 2 코드베이스 경험&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;동일한 로직을 Scala 2와 Scala 3로 구현하여 차이점을 비교합니다. 두 버전 간의 문법 변화를 이해하면 코드를 마이그레이션하거나 양쪽 버전 모두에서 작업할 때 도움이 됩니다. 이 문서에서는 주요 변경 사항들을 실제 코드 예제로 보여줍니다.&lt;/p&gt;</description></item><item><title>상품 검색 시스템</title><link>https://advanced-beginner.github.io/ko/docs/elasticsearch/examples/product-search/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/elasticsearch/examples/product-search/</guid><description>&lt;blockquote class="book-hint warning"&gt;&lt;strong&gt;완전한 예제 프로젝트&lt;/strong&gt;&lt;br&gt;&lt;p&gt;이 문서의 코드를 바로 실행해보고 싶다면, &lt;strong&gt;완전한 Spring Boot 프로젝트&lt;/strong&gt;를 사용하세요:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;📁 &lt;a href="https://github.com/advanced-beginner/advanced-beginner.github.io/tree/main/examples/elasticsearch/product-search"&gt;examples/elasticsearch/product-search/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;docker-compose로 Elasticsearch(Nori 포함) 즉시 실행 가능&lt;/li&gt;
&lt;li&gt;샘플 데이터 자동 초기화&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nori 분석기&lt;/strong&gt;로 한글 형태소 분석을 적용하여 &amp;ldquo;삼성전자&amp;rdquo; → &amp;ldquo;삼성&amp;rdquo;, &amp;ldquo;전자&amp;rdquo; 검색을 구현합니다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Edge N-gram&lt;/strong&gt;으로 자동완성 기능을 구현합니다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bool Query + Aggregation&lt;/strong&gt;으로 필터링과 패싯(facet)을 제공합니다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;하이라이팅&lt;/strong&gt;으로 검색어를 강조 표시합니다&lt;/li&gt;
&lt;li&gt;전체 소요 시간: 약 30분&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;한글 형태소 분석, 자동완성, 필터링을 포함한 실제 서비스 수준의 상품 검색 시스템을 구현합니다.&lt;/p&gt;</description></item><item><title>애플리케이션 계층</title><link>https://advanced-beginner.github.io/ko/docs/ddd/examples/application-layer/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/ddd/examples/application-layer/</guid><description>&lt;h1 id="애플리케이션-계층-구현"&gt;애플리케이션 계층 구현&lt;a class="anchor" href="#%ec%95%a0%ed%94%8c%eb%a6%ac%ec%bc%80%ec%9d%b4%ec%85%98-%ea%b3%84%ec%b8%b5-%ea%b5%ac%ed%98%84"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OrderService&lt;/strong&gt;: Use Case 조율. 도메인 로직 호출, 트랜잭션 관리, 이벤트 발행&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Command 객체&lt;/strong&gt;: CreateOrderCommand 등 요청을 불변 객체로 캡슐화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DTO&lt;/strong&gt;: OrderResponse 등 응답을 도메인과 분리하여 표현&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JPA Repository&lt;/strong&gt;: Domain Repository 인터페이스의 구현체. Mapper로 Entity 변환&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;이벤트 핸들러&lt;/strong&gt;: @TransactionalEventListener로 커밋 후 Kafka 발행&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h2 id="대상-독자-및-선수-지식"&gt;대상 독자 및 선수 지식&lt;a class="anchor" href="#%eb%8c%80%ec%83%81-%eb%8f%85%ec%9e%90-%eb%b0%8f-%ec%84%a0%ec%88%98-%ec%a7%80%ec%8b%9d"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;항목&lt;/th&gt;
 &lt;th&gt;요구 수준&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Application Service와 Infrastructure 계층 구현을 배우려는 개발자&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Spring&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;@Service, @Transactional, @Repository 애노테이션 사용 경험&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;JPA&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Entity, @Embedded, CascadeType 이해&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;선수 문서&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://advanced-beginner.github.io/ko/docs/ddd/examples/setup/"&gt;프로젝트 설정&lt;/a&gt;, &lt;a href="https://advanced-beginner.github.io/ko/docs/ddd/examples/order-domain/"&gt;주문 도메인&lt;/a&gt; 완료&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Use Case를 조율하는 Application Service와 인프라 계층을 구현합니다.&lt;/p&gt;</description></item><item><title>자주 묻는 질문</title><link>https://advanced-beginner.github.io/ko/docs/ddd/appendix/faq/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/ddd/appendix/faq/</guid><description>&lt;h1 id="ddd-자주-묻는-질문-faq"&gt;DDD 자주 묻는 질문 (FAQ)&lt;a class="anchor" href="#ddd-%ec%9e%90%ec%a3%bc-%eb%ac%bb%eb%8a%94-%ec%a7%88%eb%ac%b8-faq"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;DDD를 적용할 때 자주 받는 질문과 답변입니다.&lt;/p&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DDD는 &lt;strong&gt;아키텍처가 아닌 방법론&lt;/strong&gt;이며, 복잡한 비즈니스 로직이 있을 때 가치가 있습니다&lt;/li&gt;
&lt;li&gt;Entity는 ID로, Value Object는 속성 값으로 동등성을 판단합니다&lt;/li&gt;
&lt;li&gt;Aggregate는 &amp;ldquo;진정한 불변식을 보호하는 최소 단위&amp;quot;로 설계합니다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;유비쿼터스 언어&lt;/strong&gt;가 DDD 적용 시 가장 중요한 요소입니다&lt;/li&gt;
&lt;li&gt;레거시 시스템에도 ACL(Anti-Corruption Layer)을 통해 점진적으로 적용 가능합니다&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;&lt;h2 id="기본-개념"&gt;기본 개념&lt;a class="anchor" href="#%ea%b8%b0%eb%b3%b8-%ea%b0%9c%eb%85%90"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="q-ddd는-아키텍처인가요"&gt;Q: DDD는 아키텍처인가요?&lt;a class="anchor" href="#q-ddd%eb%8a%94-%ec%95%84%ed%82%a4%ed%85%8d%ec%b2%98%ec%9d%b8%ea%b0%80%ec%9a%94"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; 아닙니다. DDD는 &lt;strong&gt;복잡한 도메인을 다루는 방법론&lt;/strong&gt;입니다.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;DDD가 아닌 것:
- 아키텍처 패턴 (Clean, Hexagonal 등과 같이 쓰일 뿐)
- 기술 스택
- 프레임워크

DDD인 것:
- 도메인 중심 사고방식
- 전략적/전술적 패턴 모음
- 비즈니스와 기술의 협업 방법&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="q-ddd는-모든-프로젝트에-필요한가요"&gt;Q: DDD는 모든 프로젝트에 필요한가요?&lt;a class="anchor" href="#q-ddd%eb%8a%94-%eb%aa%a8%eb%93%a0-%ed%94%84%eb%a1%9c%ec%a0%9d%ed%8a%b8%ec%97%90-%ed%95%84%ec%9a%94%ed%95%9c%ea%b0%80%ec%9a%94"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; 아닙니다. &lt;strong&gt;복잡한 비즈니스 로직이 있을 때&lt;/strong&gt; 가치가 있습니다.&lt;/p&gt;</description></item><item><title>주문 시스템</title><link>https://advanced-beginner.github.io/ko/docs/kafka/examples/order-system/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kafka/examples/order-system/</guid><description>&lt;p&gt;실무에 가까운 이벤트 기반 주문 시스템을 구현합니다. 이 예제에서는 주문 생성부터 배송 완료까지의 전체 흐름을 Kafka 이벤트로 처리하며, Message Key를 활용한 순서 보장과 여러 Consumer Group을 활용한 확장 패턴을 학습합니다.&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;이벤트 기반 아키텍처&lt;/strong&gt;: REST API 요청을 Kafka 이벤트로 변환하여 비동기 처리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Message Key&lt;/strong&gt;: orderId를 Key로 사용하여 같은 주문 이벤트의 순서 보장&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;상태 머신&lt;/strong&gt;: CREATED -&amp;gt; PAID -&amp;gt; SHIPPED -&amp;gt; DELIVERED 순서로 상태 전이&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;확장 패턴&lt;/strong&gt;: 여러 Consumer Group이 동일 Topic 독립적으로 구독&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h4 id="대상-독자-및-선수-지식"&gt;대상 독자 및 선수 지식&lt;a class="anchor" href="#%eb%8c%80%ec%83%81-%eb%8f%85%ec%9e%90-%eb%b0%8f-%ec%84%a0%ec%88%98-%ec%a7%80%ec%8b%9d"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;항목&lt;/th&gt;
 &lt;th&gt;설명&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;이벤트 기반 시스템을 구축하려는 백엔드 개발자&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Spring Boot 기초, Kafka 기본 개념, &lt;a href="https://advanced-beginner.github.io/ko/docs/kafka/examples/basic/"&gt;기본 예제&lt;/a&gt; 완료&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;필수 환경&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Docker로 Kafka 실행 중, JDK 17+, Gradle&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;예상 소요 시간&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;약 45분&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이 페이지의 모든 코드 예제에서는 다음 import가 공통으로 사용됩니다. Spring Kafka의 KafkaTemplate과 @KafkaListener를 중심으로 구현하며, Jackson ObjectMapper를 통해 JSON 직렬화를 처리합니다.&lt;/p&gt;</description></item><item><title>참고 자료</title><link>https://advanced-beginner.github.io/ko/docs/elasticsearch/appendix/references/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/elasticsearch/appendix/references/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;공식 문서&lt;/strong&gt;: Elastic 공식 가이드, Spring Data Elasticsearch 문서&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;한글 자료&lt;/strong&gt;: 우아한형제들, 카카오, 네이버 D2 기술 블로그의 실무 사례&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;클라우드 서비스&lt;/strong&gt;: Elastic Cloud(공식), Amazon OpenSearch(AWS 통합), Self-Managed(완전 통제)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;학습 경로&lt;/strong&gt;: 공식 무료 교육 → 한글 블로그 → Elastic 인증&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;공식 문서, 추천 도서, 커뮤니티 리소스 링크입니다.&lt;/p&gt;
&lt;h2 id="공식-문서"&gt;공식 문서&lt;a class="anchor" href="#%ea%b3%b5%ec%8b%9d-%eb%ac%b8%ec%84%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="elasticsearch"&gt;Elasticsearch&lt;a class="anchor" href="#elasticsearch"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html"&gt;Elasticsearch 공식 가이드&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.elastic.co/guide/en/elasticsearch/client/index.html"&gt;Elasticsearch 클라이언트 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html"&gt;REST API 레퍼런스&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html"&gt;Query DSL 레퍼런스&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="kibana"&gt;Kibana&lt;a class="anchor" href="#kibana"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.elastic.co/guide/en/kibana/current/index.html"&gt;Kibana 공식 가이드&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.elastic.co/guide/en/kibana/current/console-kibana.html"&gt;Dev Tools 사용법&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="spring-data-elasticsearch"&gt;Spring Data Elasticsearch&lt;a class="anchor" href="#spring-data-elasticsearch"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.spring.io/spring-data/elasticsearch/reference/"&gt;Spring Data Elasticsearch 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/spring-projects/spring-data-elasticsearch"&gt;Spring Data Elasticsearch GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="추천-도서"&gt;추천 도서&lt;a class="anchor" href="#%ec%b6%94%ec%b2%9c-%eb%8f%84%ec%84%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="입문서"&gt;입문서&lt;a class="anchor" href="#%ec%9e%85%eb%ac%b8%ec%84%9c"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;도서&lt;/th&gt;
 &lt;th&gt;저자&lt;/th&gt;
 &lt;th&gt;특징&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Elasticsearch in Action (2nd Ed)&lt;/td&gt;
 &lt;td&gt;Madhusudhan Konda&lt;/td&gt;
 &lt;td&gt;실전 예제 중심&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Learning Elastic Stack 8.0&lt;/td&gt;
 &lt;td&gt;Pranav Shukla&lt;/td&gt;
 &lt;td&gt;ELK 스택 전체 학습&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="심화서"&gt;심화서&lt;a class="anchor" href="#%ec%8b%ac%ed%99%94%ec%84%9c"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;도서&lt;/th&gt;
 &lt;th&gt;저자&lt;/th&gt;
 &lt;th&gt;특징&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Elasticsearch: The Definitive Guide&lt;/td&gt;
 &lt;td&gt;Clinton Gormley&lt;/td&gt;
 &lt;td&gt;원리 이해 (구버전이지만 개념 학습에 유용)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Relevant Search&lt;/td&gt;
 &lt;td&gt;Doug Turnbull&lt;/td&gt;
 &lt;td&gt;검색 관련성 최적화&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="온라인-강의"&gt;온라인 강의&lt;a class="anchor" href="#%ec%98%a8%eb%9d%bc%ec%9d%b8-%ea%b0%95%ec%9d%98"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="무료"&gt;무료&lt;a class="anchor" href="#%eb%ac%b4%eb%a3%8c"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.elastic.co/training/free"&gt;Elastic 공식 교육&lt;/a&gt; - 기초 과정 무료&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/c/Aborla"&gt;YouTube: Elastic 공식 채널&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="유료"&gt;유료&lt;a class="anchor" href="#%ec%9c%a0%eb%a3%8c"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.elastic.co/training/certification"&gt;Elastic 인증 과정&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Udemy, Coursera 등의 Elasticsearch 강의&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="커뮤니티"&gt;커뮤니티&lt;a class="anchor" href="#%ec%bb%a4%eb%ae%a4%eb%8b%88%ed%8b%b0"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="포럼--qa"&gt;포럼 &amp;amp; Q&amp;amp;A&lt;a class="anchor" href="#%ed%8f%ac%eb%9f%bc--qa"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discuss.elastic.co/"&gt;Elastic Discuss&lt;/a&gt; - 공식 포럼&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/tagged/elasticsearch"&gt;Stack Overflow elasticsearch 태그&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="한국-커뮤니티"&gt;한국 커뮤니티&lt;a class="anchor" href="#%ed%95%9c%ea%b5%ad-%ec%bb%a4%eb%ae%a4%eb%8b%88%ed%8b%b0"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.facebook.com/groups/elasticsearch.kr/"&gt;Elastic 한국 사용자 그룹&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.meetup.com/ko-KR/elasticsearch-korea/"&gt;한국 Elasticsearch 밋업&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="한글-학습-자료"&gt;한글 학습 자료&lt;a class="anchor" href="#%ed%95%9c%ea%b8%80-%ed%95%99%ec%8a%b5-%ec%9e%90%eb%a3%8c"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="블로그--아티클"&gt;블로그 &amp;amp; 아티클&lt;a class="anchor" href="#%eb%b8%94%eb%a1%9c%ea%b7%b8--%ec%95%84%ed%8b%b0%ed%81%b4"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;주제&lt;/th&gt;
 &lt;th&gt;링크&lt;/th&gt;
 &lt;th&gt;특징&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;ES 기초&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://techblog.woowahan.com/"&gt;우아한형제들 기술블로그&lt;/a&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;a href="https://tech.kakao.com/"&gt;카카오 기술블로그&lt;/a&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;a href="https://d2.naver.com/"&gt;네이버 D2&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;ELK 스택 운영&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;인프라&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://medium.com/daangn"&gt;당근마켓 기술블로그&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;스타트업 ES 도입기&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="추천-한글-글"&gt;추천 한글 글&lt;a class="anchor" href="#%ec%b6%94%ec%b2%9c-%ed%95%9c%ea%b8%80-%ea%b8%80"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;Elasticsearch 검색 품질 개선기&amp;rdquo; - 검색 관련성 튜닝 실전&lt;/li&gt;
&lt;li&gt;&amp;ldquo;1억 건 데이터 ES 마이그레이션&amp;rdquo; - 대용량 인덱싱 최적화&lt;/li&gt;
&lt;li&gt;&amp;ldquo;ES 클러스터 무중단 업그레이드&amp;rdquo; - 운영 중 버전 업그레이드&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Nori 분석기 커스터마이징&amp;rdquo; - 한글 검색 품질 개선&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="국내-도서"&gt;국내 도서&lt;a class="anchor" href="#%ea%b5%ad%eb%82%b4-%eb%8f%84%ec%84%9c"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;도서&lt;/th&gt;
 &lt;th&gt;특징&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;엘라스틱서치 실무 가이드&lt;/td&gt;
 &lt;td&gt;한글, 실무 중심&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;기초부터 다지는 ElasticSearch&lt;/td&gt;
 &lt;td&gt;입문자 친화적&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;팁&lt;/strong&gt;: 영문 공식 문서와 한글 블로그를 병행하면 이해가 빠릅니다.&lt;/p&gt;</description></item><item><title>참고 자료</title><link>https://advanced-beginner.github.io/ko/docs/spark/appendix/references/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/spark/appendix/references/</guid><description>&lt;p&gt;Apache Spark 학습을 위한 공식 문서와 추가 자료를 안내합니다.&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;공식 문서&lt;/strong&gt;: &lt;a href="https://spark.apache.org/docs/latest/"&gt;spark.apache.org/docs/latest&lt;/a&gt; - 가장 정확한 최신 정보&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Java API&lt;/strong&gt;: &lt;a href="https://spark.apache.org/docs/latest/api/java/"&gt;Javadoc&lt;/a&gt; - Dataset, SparkSession, functions 클래스 참조&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;학습 추천&lt;/strong&gt;: Databricks Academy(공식), Baeldung(Java 개발자용)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;입문서 추천&lt;/strong&gt;: &amp;ldquo;Learning Spark, 2nd Edition&amp;rdquo;, &amp;ldquo;Spark: The Definitive Guide&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;커뮤니티&lt;/strong&gt;: Stack Overflow &lt;code&gt;apache-spark&lt;/code&gt; 태그, GitHub Issues&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h2 id="공식-문서"&gt;공식 문서&lt;a class="anchor" href="#%ea%b3%b5%ec%8b%9d-%eb%ac%b8%ec%84%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Apache Spark 공식 사이트&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://spark.apache.org/"&gt;Spark 공식 사이트&lt;/a&gt;&lt;/strong&gt; — 다운로드, 뉴스, 릴리즈 정보&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://spark.apache.org/docs/3.5.7/"&gt;Spark 3.5 문서&lt;/a&gt;&lt;/strong&gt; — 현재 안정 버전 문서&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://spark.apache.org/docs/latest/"&gt;Spark 최신 문서&lt;/a&gt;&lt;/strong&gt; — 최신 버전 문서&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;프로그래밍 가이드&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>sbt 의존성 충돌 해결</title><link>https://advanced-beginner.github.io/ko/docs/scala/howto/sbt-dependency-conflicts/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/howto/sbt-dependency-conflicts/</guid><description>&lt;p&gt;라이브러리 버전 충돌을 진단하고 해결하는 방법을 안내합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 15-20분&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;증상&lt;/strong&gt;: 컴파일은 성공하지만 런타임에 &lt;code&gt;NoSuchMethodError&lt;/code&gt;, &lt;code&gt;ClassNotFoundException&lt;/code&gt; 발생&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;진단&lt;/strong&gt;: &lt;code&gt;sbt dependencyTree&lt;/code&gt;로 충돌 라이브러리 확인&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;해결&lt;/strong&gt;: &lt;code&gt;exclude&lt;/code&gt;, &lt;code&gt;dependencyOverrides&lt;/code&gt;, &lt;code&gt;force()&lt;/code&gt; 활용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;예방&lt;/strong&gt;: eviction 경고를 무시하지 말 것&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;hr&gt;
&lt;h2 id="이-가이드가-해결하는-문제"&gt;이 가이드가 해결하는 문제&lt;a class="anchor" href="#%ec%9d%b4-%ea%b0%80%ec%9d%b4%eb%93%9c%ea%b0%80-%ed%95%b4%ea%b2%b0%ed%95%98%eb%8a%94-%eb%ac%b8%ec%a0%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음 상황에서 이 가이드를 사용하세요:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;컴파일은 성공하지만 런타임에 &lt;code&gt;NoSuchMethodError&lt;/code&gt;가 발생하는 경우&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ClassNotFoundException&lt;/code&gt;이 발생하지만 라이브러리가 분명히 있는 경우&lt;/li&gt;
&lt;li&gt;sbt 빌드 시 eviction 경고가 출력되는 경우&lt;/li&gt;
&lt;li&gt;여러 라이브러리가 같은 의존성의 다른 버전을 요구하는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="증상"&gt;증상&lt;a class="anchor" href="#%ec%a6%9d%ec%83%81"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 컴파일은 성공하지만 실행 시 에러&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sbt run
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;java.lang.NoSuchMethodError: &lt;span class="s1"&gt;&amp;#39;void com.google.common.collect.ImmutableMap.forEach()&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 또는 클래스를 찾지 못함&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sbt run
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;java.lang.ClassNotFoundException: org.apache.commons.lang3.StringUtils&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="이-가이드가-다루지-않는-것"&gt;이 가이드가 다루지 않는 것&lt;a class="anchor" href="#%ec%9d%b4-%ea%b0%80%ec%9d%b4%eb%93%9c%ea%b0%80-%eb%8b%a4%eb%a3%a8%ec%a7%80-%ec%95%8a%eb%8a%94-%ea%b2%83"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;sbt 기본 사용법&lt;/strong&gt;: sbt 공식 문서를 참조하세요&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maven/Gradle 의존성 관리&lt;/strong&gt;: 해당 빌드 도구 문서를 참조하세요&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scala 바이너리 호환성&lt;/strong&gt;: Scala 버전 간 호환성 문제는 별도 주제입니다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="시작하기-전에"&gt;시작하기 전에&lt;a class="anchor" href="#%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-%ec%a0%84%ec%97%90"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음 환경이 준비되어 있는지 확인하세요:&lt;/p&gt;</description></item><item><title>StatefulSet 실습</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/examples/statefulset/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/examples/statefulset/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: 상태를 유지해야 하는 애플리케이션을 Kubernetes에 배포하고 싶은 개발자
&lt;strong&gt;선수 지식&lt;/strong&gt;: Deployment, Service, PersistentVolume 개념
&lt;strong&gt;이 문서를 읽으면&lt;/strong&gt;: StatefulSet으로 MySQL을 배포하고 데이터 영속성을 검증할 수 있습니다&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;StatefulSet으로 MySQL을 배포합니다&lt;/li&gt;
&lt;li&gt;Headless Service로 개별 Pod에 접근합니다&lt;/li&gt;
&lt;li&gt;PersistentVolumeClaim 템플릿으로 데이터를 영속화합니다&lt;/li&gt;
&lt;li&gt;스케일 업/다운 시 데이터 보존을 확인합니다&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h2 id="전체-흐름"&gt;전체 흐름&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%ed%9d%90%eb%a6%84"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 A[Headless Service] --&amp;gt; B[StatefulSet]
 B --&amp;gt; C[mysql-0]
 B --&amp;gt; D[mysql-1]
 B --&amp;gt; E[mysql-2]
 C --&amp;gt; F[PVC-0]
 D --&amp;gt; G[PVC-1]
 E --&amp;gt; H[PVC-2]&lt;/pre&gt;&lt;h2 id="사전-준비"&gt;사전 준비&lt;a class="anchor" href="#%ec%82%ac%ec%a0%84-%ec%a4%80%eb%b9%84"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음이 필요합니다:&lt;/p&gt;</description></item><item><title>인덱스 재구축</title><link>https://advanced-beginner.github.io/ko/docs/elasticsearch/howto/index-rebuild/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/elasticsearch/howto/index-rebuild/</guid><description>&lt;p&gt;대용량 인덱스를 효율적으로 재구축하는 방법을 안내합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 30-60분 (데이터 크기에 따라 수 시간 소요 가능)&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;이 가이드의 범위&lt;/strong&gt;&lt;br&gt;&lt;p&gt;&lt;strong&gt;다루는 내용&lt;/strong&gt;: _reindex API, Snapshot/Restore, Logstash 비교, 대용량 처리 전략, 성능 최적화&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;다루지 않는 내용&lt;/strong&gt;: 단순 매핑 변경은 &lt;a href="mapping-migration/"&gt;매핑 마이그레이션&lt;/a&gt;을, 클러스터 확장은 &lt;a href="cluster-scaling/"&gt;클러스터 확장&lt;/a&gt;을 참조하세요.&lt;/p&gt;

&lt;/blockquote&gt;

&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;_reindex API&lt;/strong&gt;: 가장 간단, 같은 클러스터 내 재구축에 적합&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Snapshot/Restore&lt;/strong&gt;: 클러스터 간 이동, 대용량 데이터에 적합&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Logstash&lt;/strong&gt;: 변환이 복잡하거나 외부 소스와 연동할 때 적합&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;성능 최적화&lt;/strong&gt;: &lt;code&gt;refresh_interval: -1&lt;/code&gt;, replica 0, sliced scroll 활용&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;hr&gt;
&lt;h2 id="시작하기-전에"&gt;시작하기 전에&lt;a class="anchor" href="#%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-%ec%a0%84%ec%97%90"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음 조건을 확인하세요:&lt;/p&gt;</description></item><item><title>DDD 토론: 긍정파 vs 부정파</title><link>https://advanced-beginner.github.io/ko/docs/ddd/appendix/ddd-debate/</link><pubDate>Fri, 16 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/ddd/appendix/ddd-debate/</guid><description>&lt;h1 id="ddd-토론-긍정파-vs-부정파"&gt;DDD 토론: 긍정파 vs 부정파&lt;a class="anchor" href="#ddd-%ed%86%a0%eb%a1%a0-%ea%b8%8d%ec%a0%95%ed%8c%8c-vs-%eb%b6%80%ec%a0%95%ed%8c%8c"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;두 시니어 개발자가 Domain-Driven Design(DDD)에 대해 토론합니다.&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;이 문서에 대하여&lt;/strong&gt;&lt;br&gt;이 문서는 DDD에 대한 서로 다른 관점을 가진 두 시니어 개발자의 토론을 기록한 것입니다. 정답을 제시하기보다는 &lt;strong&gt;다양한 관점을 통해 DDD에 대한 균형 잡힌 시각&lt;/strong&gt;을 갖도록 돕는 것이 목적입니다.
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;참여자:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;긍정파 (Pro-DDD)&lt;/strong&gt;: DDD를 지지하는 시니어 개발자&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;부정파 (Anti-DDD)&lt;/strong&gt;: DDD에 회의적인 시니어 개발자&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;일시:&lt;/strong&gt; 2026-01-17&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="토론-시작"&gt;토론 시작&lt;a class="anchor" href="#%ed%86%a0%eb%a1%a0-%ec%8b%9c%ec%9e%91"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="부정파-오프닝"&gt;부정파 오프닝&lt;a class="anchor" href="#%eb%b6%80%ec%a0%95%ed%8c%8c-%ec%98%a4%ed%94%84%eb%8b%9d"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;솔직히 말씀드리면, 저는 DDD를 찬양하는 분들을 볼 때마다 걱정이 앞섭니다. 이론은 참 좋죠. &amp;lsquo;비즈니스 로직을 중심으로 설계한다&amp;rsquo;, &amp;lsquo;도메인 전문가와 언어를 통일한다&amp;rsquo;—누가 반대하겠습니까?&lt;/p&gt;</description></item><item><title>도메인 이벤트 설계하기</title><link>https://advanced-beginner.github.io/ko/docs/ddd/howto/domain-event-design/</link><pubDate>Fri, 16 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/ddd/howto/domain-event-design/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;해결하는 문제&lt;/strong&gt;: Aggregate 간 강한 결합으로 트랜잭션이 복잡해지거나, 변경 전파가 어려운 상황
&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25분
&lt;strong&gt;전제 조건&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/ddd/concepts/aggregate/"&gt;Aggregate 심화&lt;/a&gt; 문서를 읽었다고 가정&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote class="book-hint warning"&gt;&lt;strong&gt;성공 기준&lt;/strong&gt;&lt;br&gt;&lt;p&gt;이 가이드를 완료하면 다음을 할 수 있습니다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;도메인 이벤트가 필요한 상황 식별&lt;/li&gt;
&lt;li&gt;이벤트 명명 규칙과 페이로드 설계&lt;/li&gt;
&lt;li&gt;Spring의 이벤트 발행/구독 패턴 구현&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2 id="1-도메인-이벤트가-필요한-상황-식별하기"&gt;1. 도메인 이벤트가 필요한 상황 식별하기&lt;a class="anchor" href="#1-%eb%8f%84%eb%a9%94%ec%9d%b8-%ec%9d%b4%eb%b2%a4%ed%8a%b8%ea%b0%80-%ed%95%84%ec%9a%94%ed%95%9c-%ec%83%81%ed%99%a9-%ec%8b%9d%eb%b3%84%ed%95%98%ea%b8%b0"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="11-이벤트가-필요한-3가지-신호"&gt;1.1 이벤트가 필요한 3가지 신호&lt;a class="anchor" href="#11-%ec%9d%b4%eb%b2%a4%ed%8a%b8%ea%b0%80-%ed%95%84%ec%9a%94%ed%95%9c-3%ea%b0%80%ec%a7%80-%ec%8b%a0%ed%98%b8"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;다음 3가지 신호를 확인하여 도메인 이벤트가 필요한지 판단하세요.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;신호 1: &amp;ldquo;~하면 ~해야 한다&amp;rdquo; 패턴&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>로그 수집 및 분석</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/howto/logging-guide/</link><pubDate>Fri, 16 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/howto/logging-guide/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;목표&lt;/strong&gt;: 효과적으로 로그를 수집하고 분석하여 문제를 진단합니다
&lt;strong&gt;예상 시간&lt;/strong&gt;: 25분&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;이 가이드의 범위&lt;/strong&gt;&lt;br&gt;&lt;p&gt;&lt;strong&gt;다루는 내용&lt;/strong&gt;: kubectl logs 활용, 멀티 컨테이너 로그, 로그 필터링, stern 도구&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;다루지 않는 내용&lt;/strong&gt;: 중앙 로깅 시스템(ELK, Loki) 설정, 장기 로그 보관&lt;/p&gt;

&lt;/blockquote&gt;

&lt;h2 id="시작하기-전에"&gt;시작하기 전에&lt;a class="anchor" href="#%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-%ec%a0%84%ec%97%90"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음 조건을 확인하세요.&lt;/p&gt;
&lt;h3 id="1-kubectl-설치-및-클러스터-접근-확인"&gt;1. kubectl 설치 및 클러스터 접근 확인&lt;a class="anchor" href="#1-kubectl-%ec%84%a4%ec%b9%98-%eb%b0%8f-%ed%81%b4%eb%9f%ac%ec%8a%a4%ed%84%b0-%ec%a0%91%ea%b7%bc-%ed%99%95%ec%9d%b8"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl cluster-info&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;성공 시 출력:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Kubernetes control plane is running at https://xxx.xxx.xxx.xxx&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="2-로그-접근-권한-확인"&gt;2. 로그 접근 권한 확인&lt;a class="anchor" href="#2-%eb%a1%9c%ea%b7%b8-%ec%a0%91%ea%b7%bc-%ea%b6%8c%ed%95%9c-%ed%99%95%ec%9d%b8"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl auth can-i get pods/log&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;성공 시 출력:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>토픽 설계 및 파티션 결정 가이드</title><link>https://advanced-beginner.github.io/ko/docs/kafka/howto/topic-design/</link><pubDate>Fri, 16 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kafka/howto/topic-design/</guid><description>&lt;p&gt;새로운 Kafka 토픽을 생성할 때 적절한 파티션 수, 복제 팩터, 보관 정책을 결정하는 방법을 안내합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 15분&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;파티션 수&lt;/strong&gt;: 예상 처리량 / Consumer당 처리량, 최소 6개 권장&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;복제 팩터&lt;/strong&gt;: 프로덕션은 3, 개발은 1&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;보관 기간&lt;/strong&gt;: 비즈니스 요구사항 + 재처리 여유 시간&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;네이밍&lt;/strong&gt;: &lt;code&gt;{domain}.{entity}.{event-type}&lt;/code&gt; 패턴 사용&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;hr&gt;
&lt;h2 id="시작하기-전에"&gt;시작하기 전에&lt;a class="anchor" href="#%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-%ec%a0%84%ec%97%90"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="필수-요구사항"&gt;필수 요구사항&lt;a class="anchor" href="#%ed%95%84%ec%88%98-%ec%9a%94%ea%b5%ac%ec%82%ac%ed%95%ad"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;항목&lt;/th&gt;
 &lt;th&gt;요구사항&lt;/th&gt;
 &lt;th&gt;확인 명령어&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Kafka CLI&lt;/td&gt;
 &lt;td&gt;설치 및 PATH 등록&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;kafka-topics.sh --version&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Broker 접근&lt;/td&gt;
 &lt;td&gt;관리자 권한&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;kafka-acls.sh --list&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;클러스터 정보&lt;/td&gt;
 &lt;td&gt;Broker 수 파악&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;kafka-broker-api-versions.sh&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="환경-확인"&gt;환경 확인&lt;a class="anchor" href="#%ed%99%98%ea%b2%bd-%ed%99%95%ec%9d%b8"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;토픽 생성 권한과 클러스터 상태를 확인하세요:&lt;/p&gt;</description></item><item><title>Aggregate 실전 패턴</title><link>https://advanced-beginner.github.io/ko/docs/ddd/concepts/aggregate-patterns/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/ddd/concepts/aggregate-patterns/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Aggregate 기본 개념을 익히고 실전 패턴을 학습하려는 개발자
&lt;strong&gt;선수 지식&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/ddd/concepts/aggregate/"&gt;Aggregate 심화&lt;/a&gt;에서 핵심 개념 이해
&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 30분
&lt;strong&gt;핵심 질문&lt;/strong&gt;: &amp;ldquo;Aggregate 구현 시 어떤 패턴을 적용해야 하는가?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;요약&lt;/strong&gt;&lt;br&gt;실전 패턴: &lt;strong&gt;Factory Method&lt;/strong&gt;(생성) + &lt;strong&gt;Domain Event 발행&lt;/strong&gt; + &lt;strong&gt;Optimistic Locking&lt;/strong&gt;(동시성) + &lt;strong&gt;Soft Delete&lt;/strong&gt;(삭제)
&lt;/blockquote&gt;

&lt;h1 id="aggregate-실전-패턴"&gt;Aggregate 실전 패턴&lt;a class="anchor" href="#aggregate-%ec%8b%a4%ec%a0%84-%ed%8c%a8%ed%84%b4"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Aggregate 설계를 위한 구현 패턴과 의사결정 가이드입니다.&lt;/p&gt;
&lt;h2 id="왜-aggregate에-패턴이-필요한가"&gt;왜 Aggregate에 패턴이 필요한가?&lt;a class="anchor" href="#%ec%99%9c-aggregate%ec%97%90-%ed%8c%a8%ed%84%b4%ec%9d%b4-%ed%95%84%ec%9a%94%ed%95%9c%ea%b0%80"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Aggregate는 단순히 객체를 묶는 것이 아닙니다. &lt;strong&gt;일관성, 동시성, 생명주기&lt;/strong&gt;라는 세 가지 책임을 져야 합니다. 이 책임을 효과적으로 수행하기 위해 검증된 패턴들이 존재합니다.&lt;/p&gt;</description></item><item><title>Consumer 심화 운영</title><link>https://advanced-beginner.github.io/ko/docs/kafka/concepts/consumer-advanced/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kafka/concepts/consumer-advanced/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;session.timeout.ms는 장애 감지, max.poll.interval.ms는 처리 시간 제한 설정&lt;/li&gt;
&lt;li&gt;Cooperative Sticky Assignor로 리밸런싱 영향 최소화 (Kafka 2.4+)&lt;/li&gt;
&lt;li&gt;Static Group Membership으로 재시작 시 리밸런싱 방지 가능&lt;/li&gt;
&lt;li&gt;Consumer Lag이 가장 중요한 모니터링 지표, 추세 관찰이 핵심&lt;/li&gt;
&lt;li&gt;kafka-consumer-groups.sh로 Offset 수동 리셋 가능 (Consumer 중지 필요)&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Kafka Consumer를 프로덕션에서 운영하는 개발자 및 운영자&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/kafka/concepts/consumer-group/"&gt;Consumer Group &amp;amp; Offset&lt;/a&gt;의 기본 개념, &lt;a href="https://advanced-beginner.github.io/ko/docs/kafka/concepts/replication/"&gt;Replication&lt;/a&gt;의 ISR과 Leader 개념&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;리밸런싱 최적화, Consumer Lag 모니터링, 트러블슈팅을 다룹니다. 이 문서는 Kafka 3.6.x 기준으로 작성되었으며, Spring Boot 3.2.x와 Spring Kafka 3.1.x, Micrometer 1.12.x, Java 17 환경에서 코드 예제가 검증되었습니다.&lt;/p&gt;</description></item><item><title>histogram_quantile</title><link>https://advanced-beginner.github.io/ko/docs/observability/concepts/promql/histogram-quantile/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/concepts/promql/histogram-quantile/</guid><description>&lt;h2 id="전체-비유-진료-대기시간-분포-분석"&gt;전체 비유: 진료 대기시간 분포 분석&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ec%a7%84%eb%a3%8c-%eb%8c%80%ea%b8%b0%ec%8b%9c%ea%b0%84-%eb%b6%84%ed%8f%ac-%eb%b6%84%ec%84%9d"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;histogram_quantile을 &lt;strong&gt;진료 대기시간 분포 분석&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;대기시간 분석 비유&lt;/th&gt;
 &lt;th&gt;histogram_quantile&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;평균 (avg)&lt;/td&gt;
 &lt;td&gt;극단값에 왜곡됨&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;절반 환자 대기시간&lt;/td&gt;
 &lt;td&gt;P50 (중앙값)&lt;/td&gt;
 &lt;td&gt;일반적 경험&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;대부분 환자 대기시간&lt;/td&gt;
 &lt;td&gt;P95&lt;/td&gt;
 &lt;td&gt;95% 환자 경험&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;최악 대기시간&lt;/td&gt;
 &lt;td&gt;P99&lt;/td&gt;
 &lt;td&gt;SLA 기준&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;대기시간 구간 (0-10분, 10-30분)&lt;/td&gt;
 &lt;td&gt;Histogram 버킷&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;p&gt;이처럼 &amp;ldquo;평균 대기시간 10분&amp;quot;보다 &amp;ldquo;95% 환자가 30분 이내&amp;quot;가 더 정확한 정보인 것처럼, 백분위가 실제 경험을 반영합니다.&lt;/p&gt;</description></item><item><title>Replication</title><link>https://advanced-beginner.github.io/ko/docs/kafka/concepts/replication/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kafka/concepts/replication/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;Replication Factor(RF)는 Partition 복제본 수, 프로덕션에서 RF=3 권장&lt;/li&gt;
&lt;li&gt;Leader가 읽기/쓰기 처리, Follower는 복제만 담당하다가 장애 시 승격&lt;/li&gt;
&lt;li&gt;ISR(In-Sync Replicas)은 Leader와 동기화된 복제본 집합&lt;/li&gt;
&lt;li&gt;min.insync.replicas=2 + acks=all 조합으로 데이터 안전성 확보&lt;/li&gt;
&lt;li&gt;KRaft 모드(Kafka 3.3+)로 Zookeeper 없이 클러스터 운영 가능&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Kafka 클러스터를 운영하거나 고가용성 시스템을 설계하는 개발자 및 운영자&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/kafka/concepts/core-components/"&gt;핵심 구성요소&lt;/a&gt;의 Broker, Partition 개념&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 15분&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;데이터 복제는 Kafka의 고가용성과 내결함성의 핵심입니다. 이를 &lt;strong&gt;은행 금고 시스템&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;</description></item><item><title>Saturation (포화도)</title><link>https://advanced-beginner.github.io/ko/docs/observability/concepts/golden-signals/saturation/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/concepts/golden-signals/saturation/</guid><description>&lt;h2 id="전체-비유-병원-수용-능력"&gt;전체 비유: 병원 수용 능력&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%eb%b3%91%ec%9b%90-%ec%88%98%ec%9a%a9-%eb%8a%a5%eb%a0%a5"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Saturation을 **병원의 수용 능력(병상/장비/인력)**에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;병원 수용력 비유&lt;/th&gt;
 &lt;th&gt;Saturation 개념&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;CPU 포화도&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;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;헤드룸 (20%)&lt;/td&gt;
 &lt;td&gt;버퍼 공간 유지&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 병원이 병상 점유율을 모니터링하여 응급 상황에 대비하듯, 시스템도 리소스 포화도를 감시합니다.&lt;/p&gt;</description></item><item><title>Service</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/service/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/service/</guid><description>&lt;h2 id="전체-비유-아파트-인터폰안내-시스템"&gt;전체 비유: 아파트 인터폰/안내 시스템&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ec%95%84%ed%8c%8c%ed%8a%b8-%ec%9d%b8%ed%84%b0%ed%8f%b0%ec%95%88%eb%82%b4-%ec%8b%9c%ec%8a%a4%ed%85%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Service를 &lt;strong&gt;아파트 인터폰 시스템&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;아파트 인터폰 비유&lt;/th&gt;
 &lt;th&gt;Kubernetes Service&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;Service&lt;/td&gt;
 &lt;td&gt;고정된 접근점으로 세대 연결&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;인터폰 번호 (101동)&lt;/td&gt;
 &lt;td&gt;ClusterIP&lt;/td&gt;
 &lt;td&gt;변하지 않는 내부 주소&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;세대 호수 변경되어도 인터폰 동일&lt;/td&gt;
 &lt;td&gt;Pod IP 변경 무관&lt;/td&gt;
 &lt;td&gt;Service IP는 고정&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;같은 세대 여러 명에게 연결&lt;/td&gt;
 &lt;td&gt;Load Balancing&lt;/td&gt;
 &lt;td&gt;여러 Pod에 트래픽 분산&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;내부 인터폰&lt;/td&gt;
 &lt;td&gt;ClusterIP&lt;/td&gt;
 &lt;td&gt;단지 내부에서만 통화 가능&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;외부 전화 연결&lt;/td&gt;
 &lt;td&gt;NodePort&lt;/td&gt;
 &lt;td&gt;외부에서 특정 포트로 연결&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;대표 전화번호&lt;/td&gt;
 &lt;td&gt;LoadBalancer&lt;/td&gt;
 &lt;td&gt;외부 고정 IP로 연결&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;입주민 명부&lt;/td&gt;
 &lt;td&gt;Endpoints&lt;/td&gt;
 &lt;td&gt;Service가 관리하는 Pod IP 목록&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;101동 김철수네&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;DNS&lt;/td&gt;
 &lt;td&gt;이름으로 Service 접근&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 Service는 &amp;ldquo;세대 번호가 바뀌어도 인터폰 번호는 그대로여서 항상 연결 가능&amp;quot;한 것과 같습니다.&lt;/p&gt;</description></item><item><title>Spark SQL</title><link>https://advanced-beginner.github.io/ko/docs/spark/concepts/spark-sql/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/spark/concepts/spark-sql/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;Spark SQL은 SQL 문법으로 DataFrame을 쿼리할 수 있는 모듈&lt;/li&gt;
&lt;li&gt;Catalyst Optimizer가 4단계(Analysis → Optimization → Planning → CodeGen)로 쿼리 최적화&lt;/li&gt;
&lt;li&gt;AQE(Adaptive Query Execution)로 런타임 최적화 (Spark 3.0+)&lt;/li&gt;
&lt;li&gt;DataFrame API와 SQL은 동일한 실행 엔진 사용, 성능 차이 없음&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: SQL에 익숙한 데이터 엔지니어 및 분석가&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;표준 SQL 문법 (SELECT, JOIN, GROUP BY, Window 함수)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://advanced-beginner.github.io/ko/docs/spark/concepts/dataframe-dataset/"&gt;DataFrame과 Dataset&lt;/a&gt; 기본 이해&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Spark SQL은 구조화된 데이터 처리를 위한 Spark 모듈입니다. SQL 쿼리와 DataFrame API를 모두 지원하며, 동일한 실행 엔진(Catalyst Optimizer)을 사용합니다.&lt;/p&gt;</description></item><item><title>검색 관련성</title><link>https://advanced-beginner.github.io/ko/docs/elasticsearch/concepts/search-relevance/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/elasticsearch/concepts/search-relevance/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;선수 개념&lt;/strong&gt;&lt;br&gt;&lt;p&gt;이 문서를 읽기 전에 다음 개념을 먼저 이해하세요:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="query-dsl/"&gt;Query DSL&lt;/a&gt; - match, bool 쿼리 기본&lt;/li&gt;
&lt;li&gt;&lt;a href="data-modeling/"&gt;데이터 모델링&lt;/a&gt; - Analyzer 동작 원리&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;
&lt;h2 id="전체-비유-도서관-사서의-책-추천"&gt;전체 비유: 도서관 사서의 책 추천&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%eb%8f%84%ec%84%9c%ea%b4%80-%ec%82%ac%ec%84%9c%ec%9d%98-%ec%b1%85-%ec%b6%94%ec%b2%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;검색 관련성을 &lt;strong&gt;도서관 사서가 책을 추천하는 방식&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;도서관 비유&lt;/th&gt;
 &lt;th&gt;Elasticsearch&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;Score&lt;/td&gt;
 &lt;td&gt;얼마나 관련 있는지 수치화&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;이 책에서 해당 주제를 많이 다뤄요&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;TF (Term Frequency)&lt;/td&gt;
 &lt;td&gt;검색어가 문서에 많이 등장할수록 점수 상승&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;이 주제를 다루는 책이 드물어요&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;IDF (Inverse Doc Frequency)&lt;/td&gt;
 &lt;td&gt;희귀한 단어일수록 점수 상승&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;제목에서 바로 찾았어요&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;Field Length&lt;/td&gt;
 &lt;td&gt;짧은 필드에서 일치하면 점수 상승&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;제목 일치는 가산점&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;필드 부스팅&lt;/td&gt;
 &lt;td&gt;중요 필드에 가중치 부여 (name^3)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;신간이라 추천해요&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;Decay Function&lt;/td&gt;
 &lt;td&gt;시간/거리에 따라 점수 조정&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;베스트셀러는 우선 추천&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;Function Score&lt;/td&gt;
 &lt;td&gt;인기도, 평점 등 비즈니스 로직 반영&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;절판 도서는 후순위&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;Negative Boosting&lt;/td&gt;
 &lt;td&gt;특정 조건의 점수 감소&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 Score는 사서가 &amp;ldquo;이 책이 당신 질문에 가장 적합합니다&amp;quot;라고 판단하는 기준과 같습니다.&lt;/p&gt;</description></item><item><title>어니언 아키텍처</title><link>https://advanced-beginner.github.io/ko/docs/ddd/concepts/architecture/onion-architecture/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/ddd/concepts/architecture/onion-architecture/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: DDD와 잘 어울리는 아키텍처를 찾는 개발자
&lt;strong&gt;선수 지식&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/ddd/concepts/architecture/hexagonal-architecture/"&gt;헥사고날 아키텍처&lt;/a&gt;와 의존성 역전 원칙
&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 20분&lt;/p&gt;
&lt;/blockquote&gt;&lt;h1 id="어니언-아키텍처-onion-architecture"&gt;어니언 아키텍처 (Onion Architecture)&lt;a class="anchor" href="#%ec%96%b4%eb%8b%88%ec%96%b8-%ec%95%84%ed%82%a4%ed%85%8d%ec%b2%98-onion-architecture"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Jeffrey Palermo가 2008년에 제안한 아키텍처입니다. &lt;strong&gt;도메인 모델을 가장 중심&lt;/strong&gt;에 두고, 양파처럼 겹겹이 감싸는 구조입니다.&lt;/p&gt;
&lt;p&gt;어니언 아키텍처는 전통적인 계층형 아키텍처의 한계에서 출발합니다. 계층형 아키텍처에서는 상위 계층이 하위 계층에 의존하므로, 데이터베이스 계층의 변경이 서비스 계층에 연쇄적인 영향을 미칩니다. 반면 어니언 아키텍처에서는 &lt;strong&gt;도메인 모델이 어떤 것에도 의존하지 않고&lt;/strong&gt;, 인프라스트럭처가 도메인에 의존하는 방향으로 설계합니다. 이를 통해 도메인 로직은 데이터베이스, 프레임워크, 외부 서비스의 변화와 무관하게 순수한 비즈니스 규칙만을 표현할 수 있습니다. DDD(Domain-Driven Design)와 특히 잘 어울리는 이유도 여기에 있습니다.&lt;/p&gt;</description></item><item><title>클래스와 객체</title><link>https://advanced-beginner.github.io/ko/docs/scala/concepts/classes-objects/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/concepts/classes-objects/</guid><description>&lt;h2 id="전체-비유-회사-조직도"&gt;전체 비유: 회사 조직도&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ed%9a%8c%ec%82%ac-%ec%a1%b0%ec%a7%81%eb%8f%84"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Scala의 클래스, 객체, 트레이트를 &lt;strong&gt;회사 조직도&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;회사 조직 비유&lt;/th&gt;
 &lt;th&gt;Scala 개념&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;class&lt;/td&gt;
 &lt;td&gt;인스턴스를 여러 개 생성 가능&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CEO (한 명만)&lt;/td&gt;
 &lt;td&gt;object (싱글톤)&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;trait&lt;/td&gt;
 &lt;td&gt;여러 개 믹스인 가능&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;부서 템플릿&lt;/td&gt;
 &lt;td&gt;abstract class&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;extends로 확장&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;공개/비공개 정보&lt;/td&gt;
 &lt;td&gt;접근 제어자&lt;/td&gt;
 &lt;td&gt;private, protected&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 회사에서 다양한 역할이 조합되어 조직을 구성하듯, Scala에서는 클래스, 객체, 트레이트가 조합되어 프로그램을 구성합니다.&lt;/p&gt;</description></item><item><title>참고 자료</title><link>https://advanced-beginner.github.io/ko/docs/observability/appendix/references/</link><pubDate>Mon, 12 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/appendix/references/</guid><description>&lt;h2 id="공식-문서"&gt;공식 문서&lt;a class="anchor" href="#%ea%b3%b5%ec%8b%9d-%eb%ac%b8%ec%84%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="prometheus"&gt;Prometheus&lt;a class="anchor" href="#prometheus"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;자료&lt;/th&gt;
 &lt;th&gt;링크&lt;/th&gt;
 &lt;th&gt;설명&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Prometheus 공식 문서&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://prometheus.io/docs/"&gt;https://prometheus.io/docs/&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;설정, PromQL, 운영 가이드&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;PromQL 참조&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://prometheus.io/docs/prometheus/latest/querying/basics/"&gt;https://prometheus.io/docs/prometheus/latest/querying/basics/&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;쿼리 언어 상세&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Alerting Rules&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/"&gt;https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;알림 규칙 작성&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="grafana"&gt;Grafana&lt;a class="anchor" href="#grafana"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;자료&lt;/th&gt;
 &lt;th&gt;링크&lt;/th&gt;
 &lt;th&gt;설명&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Grafana 공식 문서&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://grafana.com/docs/grafana/latest/"&gt;https://grafana.com/docs/grafana/latest/&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;대시보드, 패널 설정&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Loki 문서&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://grafana.com/docs/loki/latest/"&gt;https://grafana.com/docs/loki/latest/&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;로그 수집/쿼리&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Tempo 문서&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://grafana.com/docs/tempo/latest/"&gt;https://grafana.com/docs/tempo/latest/&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;분산 추적&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="opentelemetry"&gt;OpenTelemetry&lt;a class="anchor" href="#opentelemetry"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;자료&lt;/th&gt;
 &lt;th&gt;링크&lt;/th&gt;
 &lt;th&gt;설명&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;OpenTelemetry 공식&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://opentelemetry.io/docs/"&gt;https://opentelemetry.io/docs/&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;개념, SDK, Collector&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Java 계측&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://opentelemetry.io/docs/languages/java/"&gt;https://opentelemetry.io/docs/languages/java/&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Java 자동/수동 계측&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Semantic Conventions&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://opentelemetry.io/docs/concepts/semantic-conventions/"&gt;https://opentelemetry.io/docs/concepts/semantic-conventions/&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;표준화된 속성 이름&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="도서"&gt;도서&lt;a class="anchor" href="#%eb%8f%84%ec%84%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="필수"&gt;필수&lt;a class="anchor" href="#%ed%95%84%ec%88%98"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;도서&lt;/th&gt;
 &lt;th&gt;저자&lt;/th&gt;
 &lt;th&gt;내용&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Site Reliability Engineering&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Google SRE Team&lt;/td&gt;
 &lt;td&gt;SRE 원칙, 황금 신호, SLO&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Observability Engineering&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Charity Majors, Liz Fong-Jones&lt;/td&gt;
 &lt;td&gt;현대적 관측성 개념&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;The SRE Workbook&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Google SRE Team&lt;/td&gt;
 &lt;td&gt;SRE 실전 적용&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="권장"&gt;권장&lt;a class="anchor" href="#%ea%b6%8c%ec%9e%a5"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;도서&lt;/th&gt;
 &lt;th&gt;저자&lt;/th&gt;
 &lt;th&gt;내용&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Prometheus: Up &amp;amp; Running&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Brian Brazil&lt;/td&gt;
 &lt;td&gt;Prometheus 상세 가이드&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Distributed Tracing in Practice&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Austin Parker 외&lt;/td&gt;
 &lt;td&gt;분산 추적 심화&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Database Reliability Engineering&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Laine Campbell, Charity Majors&lt;/td&gt;
 &lt;td&gt;DB 관측성&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="블로그--아티클"&gt;블로그 &amp;amp; 아티클&lt;a class="anchor" href="#%eb%b8%94%eb%a1%9c%ea%b7%b8--%ec%95%84%ed%8b%b0%ed%81%b4"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="prometheusgrafana"&gt;Prometheus/Grafana&lt;a class="anchor" href="#prometheusgrafana"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://prometheus.io/docs/practices/"&gt;Prometheus Best Practices&lt;/a&gt; - 공식 권장사항&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/blog/"&gt;Grafana Blog&lt;/a&gt; - 새 기능, 사례 연구&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.robustperception.io/blog/"&gt;Robust Perception Blog&lt;/a&gt; - Brian Brazil의 Prometheus 팁&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="sreobservability"&gt;SRE/Observability&lt;a class="anchor" href="#sreobservability"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sre.google/books/"&gt;Google SRE Books (무료)&lt;/a&gt; - 전체 내용 무료 공개&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.honeycomb.io/blog/"&gt;Honeycomb Blog&lt;/a&gt; - 관측성 심화&lt;/li&gt;
&lt;li&gt;&lt;a href="https://charity.wtf/"&gt;Charity Majors&amp;rsquo; Blog&lt;/a&gt; - 관측성 리더의 인사이트&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="영상"&gt;영상&lt;a class="anchor" href="#%ec%98%81%ec%83%81"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="컨퍼런스"&gt;컨퍼런스&lt;a class="anchor" href="#%ec%bb%a8%ed%8d%bc%eb%9f%b0%ec%8a%a4"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;영상&lt;/th&gt;
 &lt;th&gt;링크&lt;/th&gt;
 &lt;th&gt;내용&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;PromCon&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://www.youtube.com/@PrometheusIo"&gt;https://www.youtube.com/@PrometheusIo&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Prometheus 컨퍼런스&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;GrafanaCon&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://www.youtube.com/@Grafana"&gt;https://www.youtube.com/@Grafana&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Grafana 컨퍼런스&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;KubeCon&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://www.youtube.com/@caborgg"&gt;https://www.youtube.com/@caborgg&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Kubernetes, 관측성 세션&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="튜토리얼"&gt;튜토리얼&lt;a class="anchor" href="#%ed%8a%9c%ed%86%a0%eb%a6%ac%ec%96%bc"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=h4Sl21AKiDg"&gt;Prometheus Tutorial for Beginners&lt;/a&gt; - TechWorld with Nana&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/playlist?list=PLDGkOdUX1Ujrrse-cdj20RRah9hyHdxBu"&gt;Grafana Tutorials&lt;/a&gt; - Grafana 공식&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="온라인-코스"&gt;온라인 코스&lt;a class="anchor" href="#%ec%98%a8%eb%9d%bc%ec%9d%b8-%ec%bd%94%ec%8a%a4"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;코스&lt;/th&gt;
 &lt;th&gt;플랫폼&lt;/th&gt;
 &lt;th&gt;설명&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Prometheus &amp;amp; Grafana&lt;/td&gt;
 &lt;td&gt;Udemy&lt;/td&gt;
 &lt;td&gt;실습 중심&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Site Reliability Engineering&lt;/td&gt;
 &lt;td&gt;Coursera&lt;/td&gt;
 &lt;td&gt;Google의 SRE 코스&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Observability with OpenTelemetry&lt;/td&gt;
 &lt;td&gt;Linux Foundation&lt;/td&gt;
 &lt;td&gt;OTel 입문&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="커뮤니티"&gt;커뮤니티&lt;a class="anchor" href="#%ec%bb%a4%eb%ae%a4%eb%8b%88%ed%8b%b0"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="slack"&gt;Slack&lt;a class="anchor" href="#slack"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://prometheus-users.slack.com/"&gt;Prometheus Users&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.slack.com/"&gt;Grafana Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://slack.cncf.io/"&gt;CNCF Slack&lt;/a&gt; - #prometheus, #opentelemetry&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="github"&gt;GitHub&lt;a class="anchor" href="#github"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;프로젝트&lt;/th&gt;
 &lt;th&gt;링크&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Prometheus&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://github.com/prometheus/prometheus"&gt;https://github.com/prometheus/prometheus&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Grafana&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://github.com/grafana/grafana"&gt;https://github.com/grafana/grafana&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Loki&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://github.com/grafana/loki"&gt;https://github.com/grafana/loki&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Tempo&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://github.com/grafana/tempo"&gt;https://github.com/grafana/tempo&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;OpenTelemetry&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://github.com/open-telemetry"&gt;https://github.com/open-telemetry&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="대시보드--규칙"&gt;대시보드 &amp;amp; 규칙&lt;a class="anchor" href="#%eb%8c%80%ec%8b%9c%eb%b3%b4%eb%93%9c--%ea%b7%9c%ec%b9%99"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="grafana-대시보드"&gt;Grafana 대시보드&lt;a class="anchor" href="#grafana-%eb%8c%80%ec%8b%9c%eb%b3%b4%eb%93%9c"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;ID&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;1860&lt;/td&gt;
 &lt;td&gt;Node Exporter Full&lt;/td&gt;
 &lt;td&gt;서버 모니터링&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;3662&lt;/td&gt;
 &lt;td&gt;Prometheus Stats&lt;/td&gt;
 &lt;td&gt;Prometheus 자체 모니터링&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;4701&lt;/td&gt;
 &lt;td&gt;JVM Micrometer&lt;/td&gt;
 &lt;td&gt;Spring Boot JVM&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;7362&lt;/td&gt;
 &lt;td&gt;MySQL Overview&lt;/td&gt;
 &lt;td&gt;MySQL 모니터링&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;7587&lt;/td&gt;
 &lt;td&gt;PostgreSQL&lt;/td&gt;
 &lt;td&gt;PostgreSQL 모니터링&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;11074&lt;/td&gt;
 &lt;td&gt;Kafka Exporter&lt;/td&gt;
 &lt;td&gt;Kafka 모니터링&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;a href="https://grafana.com/grafana/dashboards/"&gt;https://grafana.com/grafana/dashboards/&lt;/a&gt; 에서 검색 가능&lt;/p&gt;</description></item><item><title>풀스택 Observability</title><link>https://advanced-beginner.github.io/ko/docs/observability/examples/full-stack/</link><pubDate>Mon, 12 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/examples/full-stack/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 30분
&lt;strong&gt;선수 지식&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/observability/examples/spring-boot-metrics/"&gt;Spring Boot 메트릭&lt;/a&gt;
&lt;strong&gt;이 문서를 읽으면&lt;/strong&gt;: 3요소(Metrics, Logs, Traces)를 연결하여 문제를 추적할 수 있습니다&lt;/p&gt;
&lt;/blockquote&gt;&lt;h2 id="목표"&gt;목표&lt;a class="anchor" href="#%eb%aa%a9%ed%91%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;ldquo;에러율 급증&amp;rdquo; → &amp;ldquo;로그에서 trace_id 확인&amp;rdquo; → &amp;ldquo;트레이스로 근본 원인 파악&amp;rdquo;&lt;/p&gt;
&lt;pre class="mermaid"&gt;graph LR
 A[&amp;#34;1. Metrics&amp;lt;br&amp;gt;에러율 5% 감지&amp;#34;]
 B[&amp;#34;2. Logs&amp;lt;br&amp;gt;trace_id 확인&amp;#34;]
 C[&amp;#34;3. Traces&amp;lt;br&amp;gt;병목 구간 발견&amp;#34;]
 D[&amp;#34;4. 해결&amp;lt;br&amp;gt;DB 쿼리 최적화&amp;#34;]

 A --&amp;gt; B --&amp;gt; C --&amp;gt; D&lt;/pre&gt;&lt;h2 id="시나리오-주문-서비스-장애-분석"&gt;시나리오: 주문 서비스 장애 분석&lt;a class="anchor" href="#%ec%8b%9c%eb%82%98%eb%a6%ac%ec%98%a4-%ec%a3%bc%eb%ac%b8-%ec%84%9c%eb%b9%84%ec%8a%a4-%ec%9e%a5%ec%95%a0-%eb%b6%84%ec%84%9d"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="시스템-구성"&gt;시스템 구성&lt;a class="anchor" href="#%ec%8b%9c%ec%8a%a4%ed%85%9c-%ea%b5%ac%ec%84%b1"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class="mermaid"&gt;graph LR
 USER[&amp;#34;User&amp;#34;] --&amp;gt; GW[&amp;#34;API Gateway&amp;#34;]
 GW --&amp;gt; ORDER[&amp;#34;Order Service&amp;#34;]
 ORDER --&amp;gt; PAYMENT[&amp;#34;Payment Service&amp;#34;]
 ORDER --&amp;gt; INVENTORY[&amp;#34;Inventory Service&amp;#34;]
 PAYMENT --&amp;gt; DB[&amp;#34;Payment DB&amp;#34;]&lt;/pre&gt;&lt;h2 id="step-1-장애-감지-metrics"&gt;Step 1: 장애 감지 (Metrics)&lt;a class="anchor" href="#step-1-%ec%9e%a5%ec%95%a0-%ea%b0%90%ec%a7%80-metrics"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="grafana-alert-발동"&gt;Grafana Alert 발동&lt;a class="anchor" href="#grafana-alert-%eb%b0%9c%eb%8f%99"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Alert: HighErrorRate
Service: order-service
Error Rate: 5.2%
Threshold: 1%&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="대시보드-확인"&gt;대시보드 확인&lt;a class="anchor" href="#%eb%8c%80%ec%8b%9c%eb%b3%b4%eb%93%9c-%ed%99%95%ec%9d%b8"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-promql" data-lang="promql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 에러율 급증 확인&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;rate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;http_server_requests_seconds_count&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;application&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;#34;&lt;/span&gt;&lt;span class="s"&gt;order-service&lt;/span&gt;&lt;span class="p"&gt;&amp;#34;,&lt;/span&gt;&lt;span class="nl"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=~&lt;/span&gt;&lt;span class="p"&gt;&amp;#34;&lt;/span&gt;&lt;span class="s"&gt;5..&lt;/span&gt;&lt;span class="p"&gt;&amp;#34;}[&lt;/span&gt;&lt;span class="s"&gt;5m&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;rate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;http_server_requests_seconds_count&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;application&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;#34;&lt;/span&gt;&lt;span class="s"&gt;order-service&lt;/span&gt;&lt;span class="p"&gt;&amp;#34;}[&lt;/span&gt;&lt;span class="s"&gt;5m&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 어떤 엔드포인트?&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;uri&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;rate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;http_server_requests_seconds_count&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;application&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;#34;&lt;/span&gt;&lt;span class="s"&gt;order-service&lt;/span&gt;&lt;span class="p"&gt;&amp;#34;,&lt;/span&gt;&lt;span class="nl"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=~&lt;/span&gt;&lt;span class="p"&gt;&amp;#34;&lt;/span&gt;&lt;span class="s"&gt;5..&lt;/span&gt;&lt;span class="p"&gt;&amp;#34;}[&lt;/span&gt;&lt;span class="s"&gt;5m&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;결과&lt;/strong&gt;: &lt;code&gt;/orders&lt;/code&gt; POST 엔드포인트에서 에러 발생&lt;/p&gt;</description></item><item><title>Event Sourcing 실습</title><link>https://advanced-beginner.github.io/ko/docs/ddd/examples/event-sourcing/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/ddd/examples/event-sourcing/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Event Sourcing&lt;/strong&gt;: 상태 대신 이벤트를 저장. 이벤트 재생으로 상태 복원&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Event Store&lt;/strong&gt;: 이벤트 영속화 저장소. 버전 기반 낙관적 동시성 제어&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Event-Sourced Aggregate&lt;/strong&gt;: apply/when 패턴으로 이벤트 적용 및 상태 변경&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Snapshot&lt;/strong&gt;: 성능 최적화를 위해 주기적으로 상태 스냅샷 저장&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;시점 복원&lt;/strong&gt;: 특정 버전까지의 이벤트만 재생하여 과거 상태 조회 가능&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h2 id="대상-독자-및-선수-지식"&gt;대상 독자 및 선수 지식&lt;a class="anchor" href="#%eb%8c%80%ec%83%81-%eb%8f%85%ec%9e%90-%eb%b0%8f-%ec%84%a0%ec%88%98-%ec%a7%80%ec%8b%9d"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;항목&lt;/th&gt;
 &lt;th&gt;요구 수준&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Event Sourcing 패턴을 실제로 구현해보려는 개발자&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;DDD&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Aggregate, Domain Event 개념 이해&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Java&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Switch Expression, Pattern Matching 문법&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;선수 문서&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://advanced-beginner.github.io/ko/docs/ddd/examples/order-domain/"&gt;주문 도메인&lt;/a&gt;, &lt;a href="https://advanced-beginner.github.io/ko/docs/ddd/examples/application-layer/"&gt;애플리케이션 계층&lt;/a&gt; 완료&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Event Sourcing 패턴을 실제 주문 도메인에 구현합니다. 상태 대신 이벤트를 저장하고, 이벤트를 재생하여 상태를 복원합니다.&lt;/p&gt;</description></item><item><title>Spark 연동</title><link>https://advanced-beginner.github.io/ko/docs/scala/examples/spark-integration/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/examples/spark-integration/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Scala는 Spark의 네이티브 언어&lt;/strong&gt;: 최신 기능 가장 먼저 지원, 가장 간결한 API&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DataFrame&lt;/strong&gt;: SQL 스타일 데이터 처리, &lt;code&gt;$&amp;quot;column&amp;quot;&lt;/code&gt; 문법으로 컬럼 참조&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dataset[T]&lt;/strong&gt;: Case Class로 타입 안전한 데이터 처리, 컴파일 타임 오류 검출&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;성능 최적화&lt;/strong&gt;: 브로드캐스트 조인, 캐싱, Predicate Pushdown 활용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;주의&lt;/strong&gt;: Spark 3.5는 Scala 2.12/2.13만 지원 (Scala 3 미지원)&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: 대규모 데이터 처리를 배우려는 Scala 개발자, Spark 입문자&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scala 기본 문법 및 함수형 프로그래밍 개념&lt;/li&gt;
&lt;li&gt;sbt 빌드 도구 사용법&lt;/li&gt;
&lt;li&gt;SQL 기초 (권장)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;Scala로 Apache Spark를 활용하는 방법을 배웁니다. Scala는 Spark의 네이티브 언어로, 가장 풍부한 API를 제공합니다. Spark 자체가 Scala로 작성되었기 때문에 새로운 기능이 가장 먼저 Scala API에 추가되며, 타입 안전성과 함수형 프로그래밍의 장점을 최대한 활용할 수 있습니다.&lt;/p&gt;</description></item><item><title>로그 분석 시스템</title><link>https://advanced-beginner.github.io/ko/docs/elasticsearch/examples/log-analysis/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/elasticsearch/examples/log-analysis/</guid><description>&lt;blockquote class="book-hint warning"&gt;&lt;strong&gt;완전한 예제 프로젝트&lt;/strong&gt;&lt;br&gt;&lt;p&gt;이 문서의 코드를 바로 실행해보고 싶다면, &lt;strong&gt;완전한 Spring Boot 프로젝트&lt;/strong&gt;를 사용하세요:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;📁 &lt;a href="https://github.com/advanced-beginner/advanced-beginner.github.io/tree/main/examples/elasticsearch/log-analysis"&gt;examples/elasticsearch/log-analysis/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;docker-compose로 Elasticsearch + Kibana 즉시 실행 가능&lt;/li&gt;
&lt;li&gt;샘플 로그 생성 API 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Logback Appender&lt;/strong&gt;로 애플리케이션 로그를 Elasticsearch에 직접 전송합니다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MDC&lt;/strong&gt;로 요청 ID, 사용자 ID를 로그에 자동 포함하여 추적성을 확보합니다&lt;/li&gt;
&lt;li&gt;**집계(Aggregation)**로 에러율, 응답시간 백분위수 등을 분석합니다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ILM&lt;/strong&gt;으로 로그 수명주기(Hot→Warm→Cold→Delete)를 자동 관리합니다&lt;/li&gt;
&lt;li&gt;전체 소요 시간: 약 40분&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;Elasticsearch를 사용하여 애플리케이션 로그를 수집, 저장, 분석하는 시스템을 구현합니다.&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;버전 정보&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Elasticsearch&lt;/strong&gt;: 8.11.x&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spring Boot&lt;/strong&gt;: 3.2.x&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Logback&lt;/strong&gt;: Spring Boot 기본 포함&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h2 id="구현-목표"&gt;구현 목표&lt;a class="anchor" href="#%ea%b5%ac%ed%98%84-%eb%aa%a9%ed%91%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 A[Spring Boot App] --&amp;gt;|Logback| B[Elasticsearch]
 B --&amp;gt; C[Kibana Dashboard]
 B --&amp;gt; D[알림/모니터링]&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;로그 수집&lt;/strong&gt;: 애플리케이션 로그를 Elasticsearch에 직접 저장&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;실시간 검색&lt;/strong&gt;: 에러 로그, 특정 사용자 요청 추적&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;대시보드&lt;/strong&gt;: 에러율, 응답시간 분포 시각화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;알림&lt;/strong&gt;: 에러 급증 시 알림&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="1-인덱스-설계"&gt;1. 인덱스 설계&lt;a class="anchor" href="#1-%ec%9d%b8%eb%8d%b1%ec%8a%a4-%ec%84%a4%ea%b3%84"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="로그-인덱스-매핑"&gt;로그 인덱스 매핑&lt;a class="anchor" href="#%eb%a1%9c%ea%b7%b8-%ec%9d%b8%eb%8d%b1%ec%8a%a4-%eb%a7%a4%ed%95%91"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;PUT&lt;/span&gt; &lt;span class="err"&gt;/_index_template/logs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;index_patterns&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;logs-*&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;template&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;settings&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;number_of_shards&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;number_of_replicas&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;refresh_interval&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;5s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;mappings&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;properties&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;@timestamp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;date&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;level&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;logger&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;thread&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;message&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;fields&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;ignore_above&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;exception&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;stack_trace&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;index&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;application&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;environment&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;host&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;request_id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;user_id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;duration_ms&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;long&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;http_method&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;http_path&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;keyword&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;http_status&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;integer&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="일별-인덱스-패턴"&gt;일별 인덱스 패턴&lt;a class="anchor" href="#%ec%9d%bc%eb%b3%84-%ec%9d%b8%eb%8d%b1%ec%8a%a4-%ed%8c%a8%ed%84%b4"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;logs-2024.01.15
logs-2024.01.16
logs-2024.01.17&lt;/code&gt;&lt;/pre&gt;&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;: 오래된 로그 삭제가 쉬움 (인덱스 단위 삭제)&lt;/p&gt;</description></item><item><title>마이크로서비스 연동</title><link>https://advanced-beginner.github.io/ko/docs/kafka/examples/microservices/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kafka/examples/microservices/</guid><description>&lt;p&gt;마이크로서비스 환경에서 Kafka를 활용한 이벤트 기반 통신을 구현합니다.&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;이벤트 체이닝&lt;/strong&gt;: 주문 -&amp;gt; 결제 -&amp;gt; 배송 -&amp;gt; 알림 순서로 이벤트 전파&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Correlation ID&lt;/strong&gt;: 분산 추적을 위한 상관 ID 전파&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Saga 패턴&lt;/strong&gt;: 보상 트랜잭션으로 분산 트랜잭션 처리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;멱등성&lt;/strong&gt;: 중복 메시지 안전하게 처리&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h4 id="대상-독자-및-선수-지식"&gt;대상 독자 및 선수 지식&lt;a class="anchor" href="#%eb%8c%80%ec%83%81-%eb%8f%85%ec%9e%90-%eb%b0%8f-%ec%84%a0%ec%88%98-%ec%a7%80%ec%8b%9d"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;항목&lt;/th&gt;
 &lt;th&gt;설명&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;마이크로서비스 아키텍처에서 이벤트 기반 통신을 구축하려는 개발자&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Kafka 기본, Spring Boot, &lt;a href="https://advanced-beginner.github.io/ko/docs/kafka/examples/order-system/"&gt;주문 시스템&lt;/a&gt; 예제 이해&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;필수 환경&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Docker, JDK 17+, 여러 서비스를 실행할 수 있는 환경&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;예상 소요 시간&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;약 60분&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="시나리오-주문-처리-시스템"&gt;시나리오: 주문 처리 시스템&lt;a class="anchor" href="#%ec%8b%9c%eb%82%98%eb%a6%ac%ec%98%a4-%ec%a3%bc%eb%ac%b8-%ec%b2%98%eb%a6%ac-%ec%8b%9c%ec%8a%a4%ed%85%9c"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;이 예제에서는 주문 서비스, 결제 서비스, 배송 서비스, 알림 서비스가 Kafka를 통해 이벤트를 주고받습니다. 주문 서비스가 주문을 생성하면 orders Topic에 이벤트를 발행합니다. 결제 서비스가 이를 수신하여 결제를 처리하고 payments Topic에 결과를 발행합니다. 배송 서비스는 결제 완료 이벤트를 수신하여 배송을 생성합니다. 알림 서비스는 모든 Topic을 구독하여 고객에게 알림을 발송합니다.&lt;/p&gt;</description></item><item><title>모니터링 설정</title><link>https://advanced-beginner.github.io/ko/docs/spark/examples/monitoring/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/spark/examples/monitoring/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Spark UI&lt;/strong&gt;: 실시간 작업 상태, 실행 계획, 메모리 사용량 확인 (:4040)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;History Server&lt;/strong&gt;: 종료된 애플리케이션 로그 분석 (:18080)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prometheus + Grafana&lt;/strong&gt;: 메트릭 수집 및 시각화, 알림 설정&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;커스텀 메트릭&lt;/strong&gt;: 비즈니스 KPI (처리량, 실패율, 처리 시간) 추적&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h2 id="대상-독자-및-선수-지식"&gt;대상 독자 및 선수 지식&lt;a class="anchor" href="#%eb%8c%80%ec%83%81-%eb%8f%85%ec%9e%90-%eb%b0%8f-%ec%84%a0%ec%88%98-%ec%a7%80%ec%8b%9d"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;구분&lt;/th&gt;
 &lt;th&gt;내용&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Spark 애플리케이션을 운영하는 DevOps/데이터 엔지니어&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Spark 기본 동작, &lt;a href="https://advanced-beginner.github.io/ko/docs/spark/examples/basic/"&gt;기본 예제&lt;/a&gt; 완료, Prometheus/Grafana 경험 (선택)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;학습 목표&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Spark 애플리케이션의 상태를 모니터링하고 문제를 진단할 수 있다&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;예상 소요 시간&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;약 35분&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;p&gt;프로덕션 환경에서 Spark 애플리케이션을 안정적으로 운영하기 위한 모니터링 설정 가이드입니다.&lt;/p&gt;</description></item><item><title>자주 묻는 질문</title><link>https://advanced-beginner.github.io/ko/docs/kafka/appendix/faq/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kafka/appendix/faq/</guid><description>&lt;p&gt;Kafka를 사용하면서 자주 받는 질문과 답변을 정리했습니다. 기본 개념부터 설정, 에러 처리, 성능 튜닝, 운영, Spring Kafka까지 주제별로 구성했습니다.&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;기본 개념&lt;/strong&gt;: Kafka는 메시지 큐가 아닌 분산 이벤트 스트리밍 플랫폼, Partition 단위 순서 보장&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;설정&lt;/strong&gt;: &lt;code&gt;acks=all&lt;/code&gt;로 안정성 확보, &lt;code&gt;auto.offset.reset=earliest&lt;/code&gt; 권장, 수동 커밋으로 메시지 유실 방지&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;에러 처리&lt;/strong&gt;: &lt;code&gt;@RetryableTopic&lt;/code&gt;으로 재시도 후 Dead Letter Topic으로 이동&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;성능&lt;/strong&gt;: Producer는 배치/압축, Consumer는 인스턴스 수 증가 및 fetch 설정 조정&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;운영&lt;/strong&gt;: &lt;code&gt;replication.factor=3&lt;/code&gt;, &lt;code&gt;min.insync.replicas=2&lt;/code&gt; 권장&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spring Kafka&lt;/strong&gt;: &lt;code&gt;KafkaTemplate&lt;/code&gt;과 &lt;code&gt;@KafkaListener&lt;/code&gt;로 간편하게 구현&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h4 id="기본-개념"&gt;기본 개념&lt;a class="anchor" href="#%ea%b8%b0%eb%b3%b8-%ea%b0%9c%eb%85%90"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Q: Kafka는 메시지 큐인가요?&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>참고 자료</title><link>https://advanced-beginner.github.io/ko/docs/scala/appendix/references/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/appendix/references/</guid><description>&lt;p&gt;Scala 학습에 도움이 되는 참고 자료를 정리합니다. 공식 문서부터 서적, 온라인 강의, 커뮤니티까지 다양한 리소스를 카테고리별로 분류했습니다.&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR - 핵심 추천&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;공식 문서&lt;/strong&gt;: &lt;a href="https://docs.scala-lang.org/scala3/book/introduction.html"&gt;Scala 3 Book&lt;/a&gt; - 단계별 학습서&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;입문서&lt;/strong&gt;: &amp;ldquo;Scala for the Impatient&amp;rdquo; - 빠른 학습에 최적&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;함수형 심화&lt;/strong&gt;: &amp;ldquo;Scala with Cats&amp;rdquo; (무료 온라인) - 타입 클래스 마스터&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;온라인 실습&lt;/strong&gt;: &lt;a href="https://scastie.scala-lang.org/"&gt;Scastie&lt;/a&gt; - 브라우저에서 즉시 실행&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;커뮤니티&lt;/strong&gt;: &lt;a href="https://discord.gg/scala"&gt;Scala Discord&lt;/a&gt; - 실시간 질의응답&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h4 id="공식-문서"&gt;공식 문서&lt;a class="anchor" href="#%ea%b3%b5%ec%8b%9d-%eb%ac%b8%ec%84%9c"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Scala 공식 사이트와 문서는 가장 정확하고 최신의 정보를 제공합니다.&lt;/p&gt;</description></item><item><title>RBAC 설정 실습</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/examples/rbac/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/examples/rbac/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Kubernetes 클러스터의 접근 제어를 설정하고 싶은 개발자/운영자
&lt;strong&gt;선수 지식&lt;/strong&gt;: Namespace, Pod, Deployment 개념
&lt;strong&gt;이 문서를 읽으면&lt;/strong&gt;: Role, RoleBinding, ServiceAccount를 활용한 네임스페이스별 접근 제어를 구성할 수 있습니다&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;개발팀용 제한된 권한 Role을 만듭니다&lt;/li&gt;
&lt;li&gt;ServiceAccount를 생성하고 Role에 바인딩합니다&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kubectl auth can-i&lt;/code&gt;로 권한을 테스트합니다&lt;/li&gt;
&lt;li&gt;네임스페이스별로 접근 권한을 분리합니다&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h2 id="rbac-구조"&gt;RBAC 구조&lt;a class="anchor" href="#rbac-%ea%b5%ac%ec%a1%b0"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 SA[ServiceAccount] --&amp;gt;|바인딩| RB[RoleBinding]
 R[Role] --&amp;gt;|참조| RB
 RB --&amp;gt;|권한 부여| NS[Namespace 리소스]

 SA2[ServiceAccount] --&amp;gt;|바인딩| CRB[ClusterRoleBinding]
 CR[ClusterRole] --&amp;gt;|참조| CRB
 CRB --&amp;gt;|권한 부여| CL[클러스터 전체 리소스]&lt;/pre&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;리소스&lt;/th&gt;
 &lt;th&gt;범위&lt;/th&gt;
 &lt;th&gt;설명&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Role&lt;/td&gt;
 &lt;td&gt;Namespace&lt;/td&gt;
 &lt;td&gt;특정 Namespace 내 리소스 권한&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ClusterRole&lt;/td&gt;
 &lt;td&gt;Cluster&lt;/td&gt;
 &lt;td&gt;클러스터 전체 리소스 권한&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;RoleBinding&lt;/td&gt;
 &lt;td&gt;Namespace&lt;/td&gt;
 &lt;td&gt;Role/ClusterRole을 주체에 바인딩&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ClusterRoleBinding&lt;/td&gt;
 &lt;td&gt;Cluster&lt;/td&gt;
 &lt;td&gt;ClusterRole을 주체에 바인딩&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="사전-준비"&gt;사전 준비&lt;a class="anchor" href="#%ec%82%ac%ec%a0%84-%ec%a4%80%eb%b9%84"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음이 필요합니다:&lt;/p&gt;</description></item><item><title>성능 프로파일링</title><link>https://advanced-beginner.github.io/ko/docs/scala/howto/performance-profiling/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/howto/performance-profiling/</guid><description>&lt;p&gt;Scala 애플리케이션의 성능 병목을 찾고 최적화하는 방법을 안내합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 20-25분&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CPU 프로파일링&lt;/strong&gt;: JFR(Java Flight Recorder)로 핫스팟 식별&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;메모리 분석&lt;/strong&gt;: 힙 덤프를 VisualVM 또는 MAT로 분석&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;컬렉션 선택&lt;/strong&gt;: 용도에 맞는 컬렉션을 사용하면 성능이 크게 달라짐&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;최적화 기법&lt;/strong&gt;: &lt;code&gt;@specialized&lt;/code&gt;, &lt;code&gt;@tailrec&lt;/code&gt;, 박싱 회피&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;hr&gt;
&lt;h2 id="이-가이드가-해결하는-문제"&gt;이 가이드가 해결하는 문제&lt;a class="anchor" href="#%ec%9d%b4-%ea%b0%80%ec%9d%b4%eb%93%9c%ea%b0%80-%ed%95%b4%ea%b2%b0%ed%95%98%eb%8a%94-%eb%ac%b8%ec%a0%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음 상황에서 이 가이드를 사용하세요:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;애플리케이션의 응답 시간이 갑자기 느려진 경우&lt;/li&gt;
&lt;li&gt;메모리 사용량이 지속적으로 증가하는 경우 (메모리 누수 의심)&lt;/li&gt;
&lt;li&gt;어떤 컬렉션을 사용해야 할지 성능 관점에서 결정이 필요한 경우&lt;/li&gt;
&lt;li&gt;GC 일시 정지가 빈번하게 발생하는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="이-가이드가-다루지-않는-것"&gt;이 가이드가 다루지 않는 것&lt;a class="anchor" href="#%ec%9d%b4-%ea%b0%80%ec%9d%b4%eb%93%9c%ea%b0%80-%eb%8b%a4%eb%a3%a8%ec%a7%80-%ec%95%8a%eb%8a%94-%ea%b2%83"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;JVM 튜닝 (GC 옵션 등)&lt;/strong&gt;: JVM 공식 문서를 참조하세요&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;분산 시스템 성능 최적화&lt;/strong&gt;: 별도 주제입니다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cats Effect / ZIO의 성능 최적화&lt;/strong&gt;: 해당 라이브러리 문서를 참조하세요&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="시작하기-전에"&gt;시작하기 전에&lt;a class="anchor" href="#%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-%ec%a0%84%ec%97%90"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음 환경이 준비되어 있는지 확인하세요:&lt;/p&gt;</description></item><item><title>클러스터 확장</title><link>https://advanced-beginner.github.io/ko/docs/elasticsearch/howto/cluster-scaling/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/elasticsearch/howto/cluster-scaling/</guid><description>&lt;p&gt;Elasticsearch 클러스터를 안전하게 확장하는 방법을 안내합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 30-60분 (노드 추가 및 샤드 재배치 시간 별도)&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;이 가이드의 범위&lt;/strong&gt;&lt;br&gt;&lt;p&gt;&lt;strong&gt;다루는 내용&lt;/strong&gt;: 데이터 노드 추가, 역할별 노드 분리, Hot-Warm-Cold 아키텍처, 확장 후 검증&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;다루지 않는 내용&lt;/strong&gt;: 쿼리 수준 성능 최적화는 &lt;a href="slow-query-optimization/"&gt;느린 쿼리 최적화&lt;/a&gt;를, 메모리 문제는 &lt;a href="memory-troubleshooting/"&gt;메모리 문제 해결&lt;/a&gt;을 참조하세요.&lt;/p&gt;

&lt;/blockquote&gt;

&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;수평 확장&lt;/strong&gt;: 데이터 노드를 추가하고 샤드를 재배치&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;역할 분리&lt;/strong&gt;: master, data, coordinating, ingest 노드를 분리하여 안정성 확보&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hot-Warm-Cold&lt;/strong&gt;: 데이터 사용 빈도에 따라 노드 계층을 구분하여 비용 최적화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;확장 후 검증&lt;/strong&gt;: 클러스터 상태, 샤드 분포, 성능 지표를 반드시 확인&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;hr&gt;
&lt;h2 id="시작하기-전에"&gt;시작하기 전에&lt;a class="anchor" href="#%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-%ec%a0%84%ec%97%90"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음 조건을 확인하세요:&lt;/p&gt;</description></item><item><title>ConfigMap과 Secret</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/configmap-secret/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/configmap-secret/</guid><description>&lt;h2 id="전체-비유-아파트-게시판과-우편함"&gt;전체 비유: 아파트 게시판과 우편함&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ec%95%84%ed%8c%8c%ed%8a%b8-%ea%b2%8c%ec%8b%9c%ed%8c%90%ea%b3%bc-%ec%9a%b0%ed%8e%b8%ed%95%a8"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ConfigMap과 Secret을 &lt;strong&gt;아파트 게시판과 우편함&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;아파트 비유&lt;/th&gt;
 &lt;th&gt;Kubernetes&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;ConfigMap&lt;/td&gt;
 &lt;td&gt;모든 입주민이 볼 수 있는 공지사항&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;개인 우편함 (비밀번호)&lt;/td&gt;
 &lt;td&gt;Secret&lt;/td&gt;
 &lt;td&gt;민감한 정보 보관&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;게시판 내용&lt;/td&gt;
 &lt;td&gt;data (평문)&lt;/td&gt;
 &lt;td&gt;일반 설정 값&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;우편함 내용&lt;/td&gt;
 &lt;td&gt;data (Base64)&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;설정을 Pod에 전달&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;ConfigMap 업데이트&lt;/td&gt;
 &lt;td&gt;설정 변경 (재시작 필요할 수도)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;DB 접속 정보&lt;/td&gt;
 &lt;td&gt;Secret&lt;/td&gt;
 &lt;td&gt;비밀번호, API 키 등&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Wi-Fi 비밀번호 공유&lt;/td&gt;
 &lt;td&gt;ConfigMap&lt;/td&gt;
 &lt;td&gt;공개해도 되는 설정&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 ConfigMap은 &amp;ldquo;게시판에 붙여 모두가 보는 공지&amp;quot;이고, Secret은 &amp;ldquo;개인 우편함에 넣어 본인만 확인하는 정보&amp;quot;입니다.&lt;/p&gt;</description></item><item><title>CQRS</title><link>https://advanced-beginner.github.io/ko/docs/ddd/concepts/architecture/cqrs/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/ddd/concepts/architecture/cqrs/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: 복잡한 조회 요구사항이나 성능 최적화가 필요한 시스템을 설계하는 개발자
&lt;strong&gt;선수 지식&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/ddd/concepts/architecture/event-driven/"&gt;이벤트 기반 아키텍처&lt;/a&gt; 또는 이벤트 기반 아키텍처 기본 개념
&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 35분
&lt;strong&gt;핵심 질문&lt;/strong&gt;: &amp;ldquo;언제 읽기와 쓰기 모델을 분리해야 하는가?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;요약&lt;/strong&gt;&lt;br&gt;CQRS 핵심: &lt;strong&gt;Command&lt;/strong&gt;(상태 변경, 도메인 모델 사용) ↔ &lt;strong&gt;Query&lt;/strong&gt;(조회, 최적화된 읽기 모델 사용) 분리로 각각의 요구사항에 맞게 최적화
&lt;/blockquote&gt;

&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;비유: 도서관&lt;/strong&gt;&lt;br&gt;&lt;p&gt;CQRS를 &lt;strong&gt;도서관 운영&lt;/strong&gt;에 비유할 수 있습니다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;기존 방식(단일 모델)&lt;/strong&gt;: 도서 관리자가 책 대출/반납도 처리하고, 도서 검색 요청도 처리합니다. 대출이 밀리면 검색도 느려지고, 검색이 많으면 대출도 느려집니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CQRS 방식&lt;/strong&gt;: 대출 담당자(Command)와 검색 사서(Query)를 분리합니다. 대출 담당자는 책의 상태를 변경하고, 검색 사서는 최적화된 색인(인덱스)을 활용하여 빠르게 응답합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;핵심&lt;/strong&gt;: 대출(쓰기)과 검색(읽기)의 요구사항이 다르므로 각각에 최적화된 방식으로 처리합니다. 대출은 정합성이 중요하고, 검색은 속도가 중요합니다.&lt;/p&gt;</description></item><item><title>Recording Rules</title><link>https://advanced-beginner.github.io/ko/docs/observability/concepts/promql/recording-rules/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/concepts/promql/recording-rules/</guid><description>&lt;h2 id="전체-비유-정기-통계-보고서"&gt;전체 비유: 정기 통계 보고서&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ec%a0%95%ea%b8%b0-%ed%86%b5%ea%b3%84-%eb%b3%b4%ea%b3%a0%ec%84%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Recording Rules를 &lt;strong&gt;병원의 정기 통계 보고서&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;정기 보고서 비유&lt;/th&gt;
 &lt;th&gt;Recording Rules&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;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;by 그룹화&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;p&gt;이처럼 병원에서 복잡한 통계를 매일 미리 계산해두듯, Recording Rules로 자주 쓰는 쿼리를 사전 계산합니다.&lt;/p&gt;</description></item><item><title>Transformation과 Action</title><link>https://advanced-beginner.github.io/ko/docs/spark/concepts/transformations-actions/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/spark/concepts/transformations-actions/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;Transformation은 지연 평가(Lazy)되어 DAG에 추가만 됨&lt;/li&gt;
&lt;li&gt;Action 호출 시 전체 DAG가 실행되어 Job 생성&lt;/li&gt;
&lt;li&gt;Narrow(셔플 없음) vs Wide(셔플 발생) Transformation 구분이 성능 핵심&lt;/li&gt;
&lt;li&gt;같은 DataFrame을 여러 번 사용하면 매번 재계산 → 캐싱 필요&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Spark 연산의 실행 시점을 이해하고자 하는 개발자&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://advanced-beginner.github.io/ko/docs/spark/concepts/architecture/"&gt;아키텍처&lt;/a&gt; 문서의 Job, Stage, Task 개념&lt;/li&gt;
&lt;li&gt;Java Stream API의 지연 평가 개념&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Spark의 모든 연산은 &lt;strong&gt;Transformation&lt;/strong&gt;과 &lt;strong&gt;Action&lt;/strong&gt; 두 가지로 분류됩니다. 이 구분을 이해하는 것이 Spark 프로그래밍의 핵심입니다.&lt;/p&gt;</description></item><item><title>서비스 유형별 적용</title><link>https://advanced-beginner.github.io/ko/docs/observability/concepts/golden-signals/by-service-type/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/concepts/golden-signals/by-service-type/</guid><description>&lt;h2 id="전체-비유-병원-부서별-핵심-지표"&gt;전체 비유: 병원 부서별 핵심 지표&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%eb%b3%91%ec%9b%90-%eb%b6%80%ec%84%9c%eb%b3%84-%ed%95%b5%ec%8b%ac-%ec%a7%80%ed%91%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;서비스 유형별 황금 신호를 &lt;strong&gt;병원 부서별 핵심 지표&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;병원 부서&lt;/th&gt;
 &lt;th&gt;서비스 유형&lt;/th&gt;
 &lt;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;웹 API&lt;/td&gt;
 &lt;td&gt;진료 대기시간 (Latency), 진료 오류율 (Errors)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;검사실 (혈액검사)&lt;/td&gt;
 &lt;td&gt;Kafka&lt;/td&gt;
 &lt;td&gt;검체 처리량 (Traffic), 대기 검체 수 (Lag)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;데이터베이스 (EMR)&lt;/td&gt;
 &lt;td&gt;데이터베이스&lt;/td&gt;
 &lt;td&gt;조회 속도 (Latency), 연결 포화도 (Saturation)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;약국&lt;/td&gt;
 &lt;td&gt;캐시 (Redis)&lt;/td&gt;
 &lt;td&gt;조제 시간 (Latency), 재고 현황 (Saturation)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;야간 정산&lt;/td&gt;
 &lt;td&gt;배치 작업&lt;/td&gt;
 &lt;td&gt;정산 오류율 (Errors), 처리 완료율 (Traffic)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;로비 안내 데스크&lt;/td&gt;
 &lt;td&gt;로드 밸런서&lt;/td&gt;
 &lt;td&gt;안내 건수 (Traffic), 연결 오류 (Errors)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 병원의 각 부서가 서로 다른 핵심 지표를 모니터링하듯, 서비스 유형에 따라 우선 모니터링할 황금 신호가 다릅니다.&lt;/p&gt;</description></item><item><title>심화 개념</title><link>https://advanced-beginner.github.io/ko/docs/kafka/concepts/advanced-concepts/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kafka/concepts/advanced-concepts/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;acks=0(빠름/유실 가능), acks=1(Leader만 확인), acks=all(ISR 전체 확인, 권장)&lt;/li&gt;
&lt;li&gt;acks=all + min.insync.replicas=2 조합으로 데이터 안전성 확보&lt;/li&gt;
&lt;li&gt;Message Key로 같은 Partition에 전송하여 순서 보장, Partition 수 변경 주의&lt;/li&gt;
&lt;li&gt;Retention: 시간 기반 삭제(기본 7일), 용량 기반 삭제, Log Compaction&lt;/li&gt;
&lt;li&gt;Idempotent Producer(Kafka 3.0+ 기본)로 네트워크 오류 시 중복 방지&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Kafka의 심화 개념을 이해하고 프로덕션 설정을 최적화하려는 개발자&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/kafka/concepts/message-flow/"&gt;메시지 흐름&lt;/a&gt;의 Topic, Partition, Broker 개념, &lt;a href="https://advanced-beginner.github.io/ko/docs/kafka/concepts/replication/"&gt;Replication&lt;/a&gt;의 ISR, Leader, Follower 개념&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;</description></item><item><title>집계</title><link>https://advanced-beginner.github.io/ko/docs/elasticsearch/concepts/aggregations/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/elasticsearch/concepts/aggregations/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;선수 개념&lt;/strong&gt;&lt;br&gt;&lt;p&gt;이 문서를 읽기 전에 다음 개념을 먼저 이해하세요:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="query-dsl/"&gt;Query DSL&lt;/a&gt; - 기본 쿼리 구조&lt;/li&gt;
&lt;li&gt;&lt;a href="data-modeling/"&gt;데이터 모델링&lt;/a&gt; - keyword vs text 타입&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;
&lt;h2 id="전체-비유-도서관-통계-분석"&gt;전체 비유: 도서관 통계 분석&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%eb%8f%84%ec%84%9c%ea%b4%80-%ed%86%b5%ea%b3%84-%eb%b6%84%ec%84%9d"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Aggregation을 &lt;strong&gt;도서관의 장서 통계 분석&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;도서관 비유&lt;/th&gt;
 &lt;th&gt;Elasticsearch&lt;/th&gt;
 &lt;th&gt;역할&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;분야별로 몇 권씩 있나요?&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;Bucket (terms)&lt;/td&gt;
 &lt;td&gt;값별로 그룹화&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;가격대별 도서 수는?&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;Bucket (range)&lt;/td&gt;
 &lt;td&gt;범위별로 그룹화&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;월별 대출 추이는?&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;Bucket (date_histogram)&lt;/td&gt;
 &lt;td&gt;시간별로 그룹화&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;평균 도서 가격은?&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;Metric (avg)&lt;/td&gt;
 &lt;td&gt;숫자 통계 계산&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;분야별 평균 가격은?&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;중첩 집계&lt;/td&gt;
 &lt;td&gt;그룹 내 통계&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;월별 대출 증감률은?&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;Pipeline&lt;/td&gt;
 &lt;td&gt;집계 결과 재가공&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;전체 장서 대비 검색 결과 비율?&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;Global&lt;/td&gt;
 &lt;td&gt;필터 무시한 전체 통계&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 Aggregation은 사서에게 &amp;ldquo;장서 현황 보고서를 만들어 주세요&amp;quot;라고 요청하는 것과 같습니다.&lt;/p&gt;</description></item><item><title>케이스 클래스</title><link>https://advanced-beginner.github.io/ko/docs/scala/concepts/case-classes/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/concepts/case-classes/</guid><description>&lt;h2 id="전체-비유-공식-서류-양식"&gt;전체 비유: 공식 서류 양식&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ea%b3%b5%ec%8b%9d-%ec%84%9c%eb%a5%98-%ec%96%91%ec%8b%9d"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;케이스 클래스를 &lt;strong&gt;공식 서류 양식&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;서류 양식 비유&lt;/th&gt;
 &lt;th&gt;Scala 개념&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;필드 (val)&lt;/td&gt;
 &lt;td&gt;자동으로 읽기 전용&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;양식 복사 (일부 수정)&lt;/td&gt;
 &lt;td&gt;copy 메서드&lt;/td&gt;
 &lt;td&gt;일부 필드만 변경한 복사본&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;동일 양식 비교&lt;/td&gt;
 &lt;td&gt;equals/hashCode&lt;/td&gt;
 &lt;td&gt;내용으로 동등성 비교&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;양식 번호 부여&lt;/td&gt;
 &lt;td&gt;apply&lt;/td&gt;
 &lt;td&gt;new 없이 생성&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;양식에서 정보 추출&lt;/td&gt;
 &lt;td&gt;unapply&lt;/td&gt;
 &lt;td&gt;패턴 매칭으로 분해&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;양식 인쇄&lt;/td&gt;
 &lt;td&gt;toString&lt;/td&gt;
 &lt;td&gt;읽기 좋은 문자열 표현&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;양식 종류 (신청서/계약서)&lt;/td&gt;
 &lt;td&gt;sealed + ADT&lt;/td&gt;
 &lt;td&gt;닫힌 타입 계층&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 공식 서류가 불변하고 복사/비교/추출이 용이하듯, 케이스 클래스는 불변 데이터 모델링에 최적화되어 있습니다.&lt;/p&gt;</description></item><item><title>Spring Boot 통합</title><link>https://advanced-beginner.github.io/ko/docs/spark/examples/spring-boot/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/spark/examples/spring-boot/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SparkSession Bean&lt;/strong&gt;: &lt;code&gt;@Configuration&lt;/code&gt;으로 싱글톤 관리, &lt;code&gt;@PreDestroy&lt;/code&gt;로 정리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;프로파일 분리&lt;/strong&gt;: local, production, test 환경별 Spark 설정&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;비동기 배치&lt;/strong&gt;: &lt;code&gt;@Async&lt;/code&gt; + &lt;code&gt;CompletableFuture&lt;/code&gt;로 대용량 처리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;REST API&lt;/strong&gt;: DataFrame 결과를 JSON 응답으로 변환&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h2 id="대상-독자-및-선수-지식"&gt;대상 독자 및 선수 지식&lt;a class="anchor" href="#%eb%8c%80%ec%83%81-%eb%8f%85%ec%9e%90-%eb%b0%8f-%ec%84%a0%ec%88%98-%ec%a7%80%ec%8b%9d"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;구분&lt;/th&gt;
 &lt;th&gt;내용&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Spring Boot 애플리케이션에 Spark를 통합하려는 백엔드 개발자&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Spring Boot 기초, &lt;a href="https://advanced-beginner.github.io/ko/docs/spark/examples/setup/"&gt;환경 설정&lt;/a&gt; 완료, Spark DataFrame API&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;학습 목표&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Spring Boot에서 Spark를 활용한 데이터 분석 API를 구현할 수 있다&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;예상 소요 시간&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;약 40분&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;p&gt;Java/Spring 개발자를 위한 Spark와 Spring Boot 통합 패턴입니다.&lt;/p&gt;</description></item><item><title>실무 프로젝트</title><link>https://advanced-beginner.github.io/ko/docs/scala/examples/practical-project/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/examples/practical-project/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;REST API 서버&lt;/strong&gt;: http4s + Circe + Cats Effect로 함수형 웹 서버 구축&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;데이터 파이프라인&lt;/strong&gt;: FS2로 메모리 효율적인 스트림 처리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLI 도구&lt;/strong&gt;: scopt로 타입 안전한 명령줄 파서 구현&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;에러 처리&lt;/strong&gt;: Cats Validated로 여러 검증 오류 동시 수집&lt;/li&gt;
&lt;li&gt;모든 예제는 불변성, 참조 투명성, 타입 안전성을 강조하는 함수형 스타일&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Scala로 실제 서비스를 구축하려는 개발자&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scala 기본 문법 및 함수형 프로그래밍 개념&lt;/li&gt;
&lt;li&gt;sbt 빌드 도구 사용법&lt;/li&gt;
&lt;li&gt;REST API 및 HTTP 기본 개념 (프로젝트 1)&lt;/li&gt;
&lt;li&gt;(선택) Cats Effect/IO 모나드 기초 지식&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;Scala로 실제 서비스를 구축하는 예제입니다. REST API 서버와 데이터 파이프라인을 구현합니다. 이 예제들은 Scala의 함수형 프로그래밍 특성을 활용하여 타입 안전하고 유지보수하기 쉬운 코드를 작성하는 방법을 보여줍니다.&lt;/p&gt;</description></item><item><title>CronJob 실습</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/examples/cronjob/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/examples/cronjob/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Kubernetes에서 주기적 작업을 스케줄링하고 싶은 개발자
&lt;strong&gt;선수 지식&lt;/strong&gt;: Pod, Job 개념
&lt;strong&gt;이 문서를 읽으면&lt;/strong&gt;: CronJob으로 주기적 백업 작업을 만들고, 실행 이력과 동시 실행 정책을 관리할 수 있습니다&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;CronJob으로 주기적 데이터 백업을 자동화합니다&lt;/li&gt;
&lt;li&gt;&lt;code&gt;successfulJobsHistoryLimit&lt;/code&gt;로 실행 이력을 관리합니다&lt;/li&gt;
&lt;li&gt;&lt;code&gt;concurrencyPolicy&lt;/code&gt;로 동시 실행을 제어합니다&lt;/li&gt;
&lt;li&gt;실패 시 알림을 설정합니다&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h2 id="cronjob-동작-흐름"&gt;CronJob 동작 흐름&lt;a class="anchor" href="#cronjob-%eb%8f%99%ec%9e%91-%ed%9d%90%eb%a6%84"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 CRON[CronJob Controller] --&amp;gt;|스케줄에 따라| JOB[Job 생성]
 JOB --&amp;gt; POD[Pod 실행]
 POD --&amp;gt;|성공| SUCCESS[완료 기록]
 POD --&amp;gt;|실패| RETRY{재시도?}
 RETRY --&amp;gt;|backoffLimit 이내| POD
 RETRY --&amp;gt;|초과| FAIL[실패 기록]

 SUCCESS --&amp;gt; HIST[이력 관리&amp;lt;br&amp;gt;successfulJobsHistoryLimit]
 FAIL --&amp;gt; HIST2[이력 관리&amp;lt;br&amp;gt;failedJobsHistoryLimit]&lt;/pre&gt;&lt;h2 id="사전-준비"&gt;사전 준비&lt;a class="anchor" href="#%ec%82%ac%ec%a0%84-%ec%a4%80%eb%b9%84"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음이 필요합니다:&lt;/p&gt;</description></item><item><title>도메인 모델 패턴</title><link>https://advanced-beginner.github.io/ko/docs/ddd/concepts/domain-model-patterns/</link><pubDate>Tue, 17 Feb 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/ddd/concepts/domain-model-patterns/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/ddd/concepts/tactical-design/"&gt;전술적 설계&lt;/a&gt; 빌딩 블록을 이해한 백엔드 개발자
&lt;strong&gt;선수 지식&lt;/strong&gt;: Entity, Value Object, Repository, Domain Service 개념 이해
&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분
&lt;strong&gt;핵심 질문&lt;/strong&gt;: &amp;ldquo;핵심 빌딩 블록만으로 표현하기 어려운 도메인 로직을 어떻게 구조화하는가?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;요약&lt;/strong&gt;&lt;br&gt;핵심 빌딩 블록(Entity, Value Object, Repository, Domain Service, Factory)은 도메인 모델의 뼈대입니다. 이 문서에서 다루는 패턴들은 그 뼈대 위에 &lt;strong&gt;비즈니스 규칙을 체계적으로 표현&lt;/strong&gt;하는 도구입니다: &lt;strong&gt;Specification&lt;/strong&gt;(조건 검사) + &lt;strong&gt;Policy&lt;/strong&gt;(계산/결정) + &lt;strong&gt;Module&lt;/strong&gt;(코드 조직) + &lt;strong&gt;Builder&lt;/strong&gt;(복잡한 생성) + &lt;strong&gt;Null Object&lt;/strong&gt;(null 안전성)
&lt;/blockquote&gt;

&lt;p&gt;전술적 설계의 핵심 빌딩 블록만으로도 도메인 모델을 구현할 수 있습니다. 하지만 실제 비즈니스는 더 복잡한 요구사항을 가집니다. &amp;ldquo;이 주문은 확정 가능한가?&amp;ldquo;라는 조건 검사, &amp;ldquo;VIP 고객에게는 몇 % 할인을 적용하는가?&amp;ldquo;라는 정책 결정, 그리고 여러 모듈에 걸친 코드 조직까지 — 이런 문제를 깔끔하게 해결하는 보조 패턴들을 알아보겠습니다.&lt;/p&gt;</description></item><item><title>Alerting Rules</title><link>https://advanced-beginner.github.io/ko/docs/observability/concepts/promql/alerting-rules/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/concepts/promql/alerting-rules/</guid><description>&lt;h2 id="전체-비유-환자-모니터-경보-시스템"&gt;전체 비유: 환자 모니터 경보 시스템&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ed%99%98%ec%9e%90-%eb%aa%a8%eb%8b%88%ed%84%b0-%ea%b2%bd%eb%b3%b4-%ec%8b%9c%ec%8a%a4%ed%85%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Alerting Rules를 &lt;strong&gt;중환자실 환자 모니터 경보 시스템&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;환자 모니터 비유&lt;/th&gt;
 &lt;th&gt;Alerting Rules&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;expr (조건)&lt;/td&gt;
 &lt;td&gt;알림 발동 조건 정의&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;5분간 지속 시 알림&lt;/td&gt;
 &lt;td&gt;for (지속 시간)&lt;/td&gt;
 &lt;td&gt;일시적 변동 무시&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;긴급/주의 분류&lt;/td&gt;
 &lt;td&gt;severity 라벨&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;annotations&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;inhibition&lt;/td&gt;
 &lt;td&gt;중복 알림 방지&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;대응 매뉴얼 링크&lt;/td&gt;
 &lt;td&gt;runbook_url&lt;/td&gt;
 &lt;td&gt;문제 해결 가이드&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 환자 모니터가 이상 징후를 감지하여 의료진에게 알리듯, Alerting Rules로 시스템 문제를 감지합니다.&lt;/p&gt;</description></item><item><title>Volume과 스토리지</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/storage/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/storage/</guid><description>&lt;h2 id="전체-비유-아파트-수납공간과-창고"&gt;전체 비유: 아파트 수납공간과 창고&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ec%95%84%ed%8c%8c%ed%8a%b8-%ec%88%98%eb%82%a9%ea%b3%b5%ea%b0%84%ea%b3%bc-%ec%b0%bd%ea%b3%a0"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Volume과 스토리지를 &lt;strong&gt;아파트 수납공간&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;아파트 수납 비유&lt;/th&gt;
 &lt;th&gt;Kubernetes&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;emptyDir&lt;/td&gt;
 &lt;td&gt;Pod와 함께 생성/삭제되는 임시 공간&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;단지 공용 창고&lt;/td&gt;
 &lt;td&gt;PersistentVolume (PV)&lt;/td&gt;
 &lt;td&gt;이사해도 유지되는 외부 저장소&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;창고 사용 신청서&lt;/td&gt;
 &lt;td&gt;PersistentVolumeClaim (PVC)&lt;/td&gt;
 &lt;td&gt;필요한 용량과 조건 요청&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;창고 자동 배정 시스템&lt;/td&gt;
 &lt;td&gt;StorageClass&lt;/td&gt;
 &lt;td&gt;요청 시 자동으로 창고 할당&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;세대 간 물건 공유&lt;/td&gt;
 &lt;td&gt;Volume Mount&lt;/td&gt;
 &lt;td&gt;컨테이너 간 데이터 공유&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;개인만 사용&lt;/td&gt;
 &lt;td&gt;ReadWriteOnce (RWO)&lt;/td&gt;
 &lt;td&gt;단일 노드에서만 읽기/쓰기&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;여러 세대가 읽기만&lt;/td&gt;
 &lt;td&gt;ReadOnlyMany (ROX)&lt;/td&gt;
 &lt;td&gt;여러 노드에서 읽기 전용&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;여러 세대가 함께 사용&lt;/td&gt;
 &lt;td&gt;ReadWriteMany (RWX)&lt;/td&gt;
 &lt;td&gt;여러 노드에서 읽기/쓰기&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;퇴거 시 창고 처리&lt;/td&gt;
 &lt;td&gt;Reclaim Policy&lt;/td&gt;
 &lt;td&gt;Retain(유지), Delete(삭제)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 emptyDir은 &amp;ldquo;이사하면 사라지는 붙박이장&amp;quot;이고, PV/PVC는 &amp;ldquo;이사해도 물건이 남아있는 별도 창고&amp;quot;입니다.&lt;/p&gt;</description></item><item><title>이벤트 기반 아키텍처</title><link>https://advanced-beginner.github.io/ko/docs/ddd/concepts/architecture/event-driven/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/ddd/concepts/architecture/event-driven/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: 도메인 모델링과 트랜잭션 개념을 이해한 개발자
&lt;strong&gt;선수 지식&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/ddd/concepts/architecture/onion-architecture/"&gt;어니언 아키텍처&lt;/a&gt; 또는 Aggregate 경계 개념에 대한 이해
&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 30분
&lt;strong&gt;핵심 질문&lt;/strong&gt;: &amp;ldquo;도메인 이벤트를 언제, 왜 사용해야 하는가?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;&lt;hr&gt;
&lt;h1 id="이벤트-기반-아키텍처-event-driven-architecture"&gt;이벤트 기반 아키텍처 (Event-Driven Architecture)&lt;a class="anchor" href="#%ec%9d%b4%eb%b2%a4%ed%8a%b8-%ea%b8%b0%eb%b0%98-%ec%95%84%ed%82%a4%ed%85%8d%ec%b2%98-event-driven-architecture"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;비유: 회사 공지 시스템&lt;/strong&gt;&lt;br&gt;&lt;p&gt;도메인 이벤트를 &lt;strong&gt;회사 공지 시스템&lt;/strong&gt;에 비유할 수 있습니다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;이벤트 발행&lt;/strong&gt;: 인사팀에서 &amp;ldquo;신입 사원 입사&amp;rdquo; 공지를 보냅니다. 인사팀은 누가 이 공지를 볼지 모르고, 알 필요도 없습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;이벤트 구독&lt;/strong&gt;: IT팀은 공지를 보고 계정을 생성하고, 총무팀은 명함을 주문하며, 교육팀은 신입 교육 일정을 잡습니다. 각 부서가 독립적으로 행동합니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;느슨한 결합&lt;/strong&gt;: 인사팀이 IT팀의 존재를 모르더라도 시스템은 작동합니다. 나중에 &amp;ldquo;환영 선물 담당 팀&amp;quot;이 추가되어도 인사팀은 수정할 필요가 없습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;핵심&lt;/strong&gt;: 발행자는 &amp;ldquo;무슨 일이 일어났다&amp;quot;만 알리고, 구독자들이 각자 필요한 일을 합니다.&lt;/p&gt;</description></item><item><title>인덱싱 전략</title><link>https://advanced-beginner.github.io/ko/docs/elasticsearch/concepts/indexing/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/elasticsearch/concepts/indexing/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;선수 개념&lt;/strong&gt;&lt;br&gt;&lt;p&gt;이 문서를 읽기 전에 다음 개념을 먼저 이해하세요:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="core-components/"&gt;핵심 구성요소&lt;/a&gt; - Shard, Segment 개념&lt;/li&gt;
&lt;li&gt;&lt;a href="data-modeling/"&gt;데이터 모델링&lt;/a&gt; - Mapping, Analyzer 기본&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;
&lt;h2 id="전체-비유-도서관의-신간-입고-프로세스"&gt;전체 비유: 도서관의 신간 입고 프로세스&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%eb%8f%84%ec%84%9c%ea%b4%80%ec%9d%98-%ec%8b%a0%ea%b0%84-%ec%9e%85%ea%b3%a0-%ed%94%84%eb%a1%9c%ec%84%b8%ec%8a%a4"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;인덱싱 전략을 &lt;strong&gt;도서관의 신간 입고 프로세스&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;도서관 비유&lt;/th&gt;
 &lt;th&gt;Elasticsearch&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;Bulk 인덱싱&lt;/td&gt;
 &lt;td&gt;훨씬 빠름 (10배 이상)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;입고 후 서가 배치&lt;/td&gt;
 &lt;td&gt;Refresh&lt;/td&gt;
 &lt;td&gt;검색 가능하게 만듦 (기본 1초)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;영구 장서 등록&lt;/td&gt;
 &lt;td&gt;Flush&lt;/td&gt;
 &lt;td&gt;디스크에 영구 저장&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;입고 일지&lt;/td&gt;
 &lt;td&gt;Translog&lt;/td&gt;
 &lt;td&gt;장애 시 복구용 기록&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;신간 분류 규칙 템플릿&lt;/td&gt;
 &lt;td&gt;Index Template&lt;/td&gt;
 &lt;td&gt;새 인덱스 자동 설정&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;오래된 책 → 창고 → 폐기&lt;/td&gt;
 &lt;td&gt;ILM (Index Lifecycle)&lt;/td&gt;
 &lt;td&gt;Hot → Warm → Cold → Delete&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;구판 → 신판 교체&lt;/td&gt;
 &lt;td&gt;Reindex&lt;/td&gt;
 &lt;td&gt;데이터 마이그레이션&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;도서 별칭 (시리즈명)&lt;/td&gt;
 &lt;td&gt;Alias&lt;/td&gt;
 &lt;td&gt;인덱스 별명으로 무중단 교체&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 인덱싱 전략은 &amp;ldquo;도서관에 새 책을 효율적으로 입고하고 관리&amp;quot;하는 프로세스와 같습니다.&lt;/p&gt;</description></item><item><title>트랜잭션과 Exactly-Once</title><link>https://advanced-beginner.github.io/ko/docs/kafka/concepts/transactions/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kafka/concepts/transactions/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;At-Most-Once: 유실 가능/중복 없음, At-Least-Once: 유실 없음/중복 가능&lt;/li&gt;
&lt;li&gt;Exactly-Once: Idempotent Producer + Transactional API + read_committed 필요&lt;/li&gt;
&lt;li&gt;Idempotent Producer는 Kafka 3.0+에서 기본 활성화, 단일 Partition 중복 방지&lt;/li&gt;
&lt;li&gt;Kafka 트랜잭션은 여러 Partition에 원자적 쓰기 보장&lt;/li&gt;
&lt;li&gt;DB + Kafka 원자적 처리가 필요하면 Outbox 패턴 사용&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: 메시지 전달 보장이 중요한 시스템을 개발하는 개발자&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/kafka/concepts/advanced-concepts/"&gt;심화 개념&lt;/a&gt;의 acks, Idempotent Producer 개념&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;메시지 전달 보장 수준과 Kafka 트랜잭션을 이해합니다. 이 문서는 Kafka 3.6.x 기준으로 작성되었으며, Spring Boot 3.2.x와 Spring Kafka 3.1.x, Java 17 환경에서 코드 예제가 검증되었습니다.&lt;/p&gt;</description></item><item><title>파티셔닝과 셔플</title><link>https://advanced-beginner.github.io/ko/docs/spark/concepts/partitioning/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/spark/concepts/partitioning/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;파티션은 데이터의 논리적 분할 단위, 각 파티션이 하나의 Task로 처리&lt;/li&gt;
&lt;li&gt;셔플은 파티션 간 데이터 재분배로 Spark에서 가장 비용이 높은 연산&lt;/li&gt;
&lt;li&gt;권장 파티션 크기: 100&lt;del&gt;200MB, 파티션 수 = 코어 수 x 2&lt;/del&gt;4&lt;/li&gt;
&lt;li&gt;AQE(Spark 3.0+)가 런타임에 파티션 수 자동 조정&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Spark 성능 튜닝을 시작하는 데이터 엔지니어&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://advanced-beginner.github.io/ko/docs/spark/concepts/architecture/"&gt;아키텍처&lt;/a&gt; 문서의 Stage, Task 개념&lt;/li&gt;
&lt;li&gt;&lt;a href="https://advanced-beginner.github.io/ko/docs/spark/concepts/transformations-actions/"&gt;Transformation과 Action&lt;/a&gt;의 Wide/Narrow 구분&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;파티셔닝은 Spark 성능의 핵심입니다. 데이터가 어떻게 분산되는지 이해하고 최적화하는 것이 대규모 데이터 처리의 관건입니다.&lt;/p&gt;</description></item><item><title>패턴 매칭</title><link>https://advanced-beginner.github.io/ko/docs/scala/concepts/pattern-matching/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/concepts/pattern-matching/</guid><description>&lt;h2 id="전체-비유-우편-분류-센터"&gt;전체 비유: 우편 분류 센터&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ec%9a%b0%ed%8e%b8-%eb%b6%84%eb%a5%98-%ec%84%bc%ed%84%b0"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;패턴 매칭을 &lt;strong&gt;우편 분류 센터&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;우편 분류 비유&lt;/th&gt;
 &lt;th&gt;Scala 개념&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;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;가드 (if)&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;tr&gt;
 &lt;td&gt;분류 규칙 정의&lt;/td&gt;
 &lt;td&gt;추출자 (unapply)&lt;/td&gt;
 &lt;td&gt;커스텀 패턴&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 우편물을 다양한 기준으로 분류하고 정보를 추출하듯, 패턴 매칭은 값을 분석하고 분기합니다.&lt;/p&gt;</description></item><item><title>Delta Lake 통합</title><link>https://advanced-beginner.github.io/ko/docs/spark/examples/delta-lake/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/spark/examples/delta-lake/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ACID 트랜잭션&lt;/strong&gt;: 동시 쓰기 시에도 데이터 일관성 보장&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;시간 여행&lt;/strong&gt;: 과거 버전 조회/복원으로 데이터 복구 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;스키마 진화&lt;/strong&gt;: &lt;code&gt;mergeSchema&lt;/code&gt; 옵션으로 컬럼 추가 안전하게 처리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;최적화&lt;/strong&gt;: OPTIMIZE(파일 병합), Z-ORDER(쿼리 최적화), VACUUM(정리)&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h2 id="대상-독자-및-선수-지식"&gt;대상 독자 및 선수 지식&lt;a class="anchor" href="#%eb%8c%80%ec%83%81-%eb%8f%85%ec%9e%90-%eb%b0%8f-%ec%84%a0%ec%88%98-%ec%a7%80%ec%8b%9d"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;구분&lt;/th&gt;
 &lt;th&gt;내용&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;데이터 레이크 아키텍처를 개선하려는 데이터 엔지니어&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Spark DataFrame API, Parquet 포맷 이해, &lt;a href="https://advanced-beginner.github.io/ko/docs/spark/examples/basic/"&gt;기본 예제&lt;/a&gt; 완료&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;학습 목표&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Delta Lake로 신뢰성 있는 데이터 레이크를 구축할 수 있다&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;예상 소요 시간&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;약 50분&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;p&gt;Delta Lake를 활용하여 데이터 레이크에 ACID 트랜잭션, 스키마 관리, 시간 여행 기능을 추가합니다.&lt;/p&gt;</description></item><item><title>ETL 파이프라인</title><link>https://advanced-beginner.github.io/ko/docs/spark/examples/etl-pipeline/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/spark/examples/etl-pipeline/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;템플릿 메서드 패턴&lt;/strong&gt;: Extract → Transform → Validate → Load 표준화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;데이터 정제 유틸리티&lt;/strong&gt;: 중복 제거, NULL 처리, 이상치 필터링&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;증분 ETL&lt;/strong&gt;: 워터마크 기반 변경 데이터만 처리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;재시도 로직&lt;/strong&gt;: 실패 시 자동 재시도 및 날짜 범위 처리&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;h2 id="대상-독자-및-선수-지식"&gt;대상 독자 및 선수 지식&lt;a class="anchor" href="#%eb%8c%80%ec%83%81-%eb%8f%85%ec%9e%90-%eb%b0%8f-%ec%84%a0%ec%88%98-%ec%a7%80%ec%8b%9d"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;구분&lt;/th&gt;
 &lt;th&gt;내용&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Spark로 데이터 파이프라인을 구축하려는 데이터 엔지니어&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://advanced-beginner.github.io/ko/docs/spark/examples/basic/"&gt;기본 예제&lt;/a&gt; 완료, Java/Spark DataFrame API&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;학습 목표&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;재사용 가능한 ETL 파이프라인을 설계하고 구현할 수 있다&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;예상 소요 시간&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;약 45분&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;p&gt;프로덕션 환경에서 사용 가능한 완전한 ETL(Extract-Transform-Load) 파이프라인 예제입니다.&lt;/p&gt;</description></item><item><title>Producer 튜닝</title><link>https://advanced-beginner.github.io/ko/docs/kafka/concepts/producer-tuning/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kafka/concepts/producer-tuning/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;batch.size와 linger.ms로 배치 효율 조절 (OR 조건으로 동작)&lt;/li&gt;
&lt;li&gt;linger.ms=5만으로도 처리량이 약 2.7배 증가 가능&lt;/li&gt;
&lt;li&gt;compression.type: snappy(일반), lz4(고성능), zstd(고압축) 권장&lt;/li&gt;
&lt;li&gt;Idempotent Producer(Kafka 3.0+ 기본)로 중복 방지 및 순서 보장&lt;/li&gt;
&lt;li&gt;buffer.memory 부족 시 BufferExhaustedException 발생&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Producer 성능을 최적화하려는 개발자, 대용량 메시지 처리가 필요한 운영자&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/kafka/concepts/advanced-concepts/"&gt;심화 개념&lt;/a&gt;의 acks, Idempotent Producer, &lt;a href="https://advanced-beginner.github.io/ko/docs/kafka/concepts/message-flow/"&gt;메시지 흐름&lt;/a&gt;의 Topic, Partition 개념&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Producer 성능을 최적화하는 핵심 설정들을 이해합니다. 이 문서는 Kafka 3.6.x 기준으로 작성되었으며, Spring Boot 3.2.x와 Spring Kafka 3.1.x, Java 17 환경에서 코드 예제가 검증되었습니다.&lt;/p&gt;</description></item><item><title>네트워킹</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/networking/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/networking/</guid><description>&lt;h2 id="전체-비유-아파트-단지-출입-시스템"&gt;전체 비유: 아파트 단지 출입 시스템&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ec%95%84%ed%8c%8c%ed%8a%b8-%eb%8b%a8%ec%a7%80-%ec%b6%9c%ec%9e%85-%ec%8b%9c%ec%8a%a4%ed%85%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Kubernetes 네트워킹을 &lt;strong&gt;아파트 단지 출입 시스템&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;아파트 출입 비유&lt;/th&gt;
 &lt;th&gt;Kubernetes&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;Pod-to-Pod 통신&lt;/td&gt;
 &lt;td&gt;같은 단지 내 자유로운 왕래&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;각 세대 고유 호수&lt;/td&gt;
 &lt;td&gt;Pod IP&lt;/td&gt;
 &lt;td&gt;고유한 네트워크 주소&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;동 현관 인터폰&lt;/td&gt;
 &lt;td&gt;Service&lt;/td&gt;
 &lt;td&gt;안정적인 접근점 제공&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;단지 정문/경비실&lt;/td&gt;
 &lt;td&gt;Ingress&lt;/td&gt;
 &lt;td&gt;외부 방문자 안내 및 통제&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;방문자 명부&lt;/td&gt;
 &lt;td&gt;Ingress Rules&lt;/td&gt;
 &lt;td&gt;도메인/경로별 라우팅 규칙&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;외부 전화 연결&lt;/td&gt;
 &lt;td&gt;NodePort&lt;/td&gt;
 &lt;td&gt;외부에서 특정 포트로 접근&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;대표 전화번호&lt;/td&gt;
 &lt;td&gt;LoadBalancer&lt;/td&gt;
 &lt;td&gt;외부 고정 IP 제공&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;출입 통제 규칙&lt;/td&gt;
 &lt;td&gt;NetworkPolicy&lt;/td&gt;
 &lt;td&gt;특정 세대 간 왕래 제한&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;VIP 전용 출입구&lt;/td&gt;
 &lt;td&gt;TLS Termination&lt;/td&gt;
 &lt;td&gt;HTTPS 암호화 처리&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 Ingress는 &amp;ldquo;단지 정문에서 방문자를 확인하고 올바른 동/호수로 안내&amp;quot;하는 것과 같습니다.&lt;/p&gt;</description></item><item><title>캐싱과 영속성</title><link>https://advanced-beginner.github.io/ko/docs/spark/concepts/caching/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/spark/concepts/caching/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;cache() = persist(MEMORY_ONLY), 여러 Action에서 재사용할 데이터 캐싱&lt;/li&gt;
&lt;li&gt;Storage Level: MEMORY_ONLY(빠름), MEMORY_AND_DISK(안정), *_SER(메모리 절약)&lt;/li&gt;
&lt;li&gt;캐시는 첫 Action 시 저장되고, unpersist()로 해제&lt;/li&gt;
&lt;li&gt;체크포인트는 Lineage를 끊어 장애 복구와 긴 계보 문제 해결&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: 반복 연산 최적화가 필요한 데이터 엔지니어&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://advanced-beginner.github.io/ko/docs/spark/concepts/transformations-actions/"&gt;Transformation과 Action&lt;/a&gt; 지연 평가 이해&lt;/li&gt;
&lt;li&gt;JVM 메모리 구조 기초&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Spark의 인메모리 컴퓨팅 능력을 활용하여 중간 결과를 캐시하고 재사용하는 방법을 알아봅니다.&lt;/p&gt;
&lt;h2 id="비유로-이해하는-캐싱"&gt;비유로 이해하는 캐싱&lt;a class="anchor" href="#%eb%b9%84%ec%9c%a0%eb%a1%9c-%ec%9d%b4%ed%95%b4%ed%95%98%eb%8a%94-%ec%ba%90%ec%8b%b1"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;개념&lt;/th&gt;
 &lt;th&gt;비유&lt;/th&gt;
 &lt;th&gt;핵심 아이디어&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;cache()&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;자주 쓰는 재료 냉장고 보관&lt;/td&gt;
 &lt;td&gt;매번 장 보러 가는 대신 냉장고에서 바로 꺼내 사용&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;persist()&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;보관 위치 선택&lt;/td&gt;
 &lt;td&gt;냉장고(메모리) vs 창고(디스크) vs 진공포장(직렬화)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;MEMORY_ONLY&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;냉장 보관&lt;/td&gt;
 &lt;td&gt;빠르게 꺼내 쓰지만 공간 많이 차지&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;MEMORY_AND_DISK&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;냉장고 + 창고&lt;/td&gt;
 &lt;td&gt;냉장고 가득 차면 창고로 이동&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;직렬화 (_SER)&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;진공 포장&lt;/td&gt;
 &lt;td&gt;부피는 줄지만 사용 시 포장 해체 시간 필요&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;checkpoint&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;요리 중간 상태 사진 촬영&lt;/td&gt;
 &lt;td&gt;실수해도 사진 시점부터 다시 시작 가능&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;unpersist()&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;냉장고 정리&lt;/td&gt;
 &lt;td&gt;안 쓰는 재료 치워서 공간 확보&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;핵심 원리&lt;/strong&gt;: 캐싱은 &amp;ldquo;계산 시간&amp;quot;과 &amp;ldquo;저장 공간&amp;quot;을 교환하는 것입니다. 자주 사용하는 데이터는 저장해두고, 한 번만 쓰는 데이터는 매번 계산하는 게 효율적입니다.&lt;/p&gt;</description></item><item><title>컬렉션</title><link>https://advanced-beginner.github.io/ko/docs/scala/concepts/collections/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/concepts/collections/</guid><description>&lt;h2 id="전체-비유-도서관-시스템"&gt;전체 비유: 도서관 시스템&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%eb%8f%84%ec%84%9c%ea%b4%80-%ec%8b%9c%ec%8a%a4%ed%85%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Scala 컬렉션을 &lt;strong&gt;도서관&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;도서관 비유&lt;/th&gt;
 &lt;th&gt;Scala 개념&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;Seq (시퀀스)&lt;/td&gt;
 &lt;td&gt;순서가 있는 컬렉션&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;책장별 책 나열&lt;/td&gt;
 &lt;td&gt;List (연결 리스트)&lt;/td&gt;
 &lt;td&gt;앞에서 빠른 추가/제거&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;도서 번호 색인&lt;/td&gt;
 &lt;td&gt;Vector (인덱스 시퀀스)&lt;/td&gt;
 &lt;td&gt;랜덤 접근 최적화&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;등록된 회원 명단&lt;/td&gt;
 &lt;td&gt;Set (집합)&lt;/td&gt;
 &lt;td&gt;중복 없는 고유 요소&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;도서 목록 카탈로그&lt;/td&gt;
 &lt;td&gt;Map (맵)&lt;/td&gt;
 &lt;td&gt;ISBN → 도서 정보 매핑&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;p&gt;도서관에서 책의 순서, 검색 방법, 보관 정책이 중요하듯이, 컬렉션에서도 데이터의 구조와 접근 방식이 프로그램 설계의 핵심입니다.&lt;/p&gt;</description></item><item><title>클러스터 관리</title><link>https://advanced-beginner.github.io/ko/docs/elasticsearch/concepts/cluster-management/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/elasticsearch/concepts/cluster-management/</guid><description>&lt;h2 id="전체-비유-도서관-체인-본사-운영"&gt;전체 비유: 도서관 체인 본사 운영&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%eb%8f%84%ec%84%9c%ea%b4%80-%ec%b2%b4%ec%9d%b8-%eb%b3%b8%ec%82%ac-%ec%9a%b4%ec%98%81"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;클러스터 관리를 &lt;strong&gt;도서관 체인의 본사 운영&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;도서관 비유&lt;/th&gt;
 &lt;th&gt;Elasticsearch&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;Master Node&lt;/td&gt;
 &lt;td&gt;클러스터 상태 관리, 인덱스 생성/삭제 결정&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;각 지점 창고&lt;/td&gt;
 &lt;td&gt;Data Node&lt;/td&gt;
 &lt;td&gt;실제 도서(데이터) 저장 및 대출(검색) 처리&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;안내 데스크&lt;/td&gt;
 &lt;td&gt;Coordinating Node&lt;/td&gt;
 &lt;td&gt;고객 요청을 적절한 지점으로 라우팅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;본사 회의 정족수 (3인)&lt;/td&gt;
 &lt;td&gt;Master 선출&lt;/td&gt;
 &lt;td&gt;과반수로 의사 결정 (3대 권장)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Green 상태&lt;/td&gt;
 &lt;td&gt;모든 지점 정상&lt;/td&gt;
 &lt;td&gt;모든 도서 대출 가능&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Yellow 상태&lt;/td&gt;
 &lt;td&gt;복본 부족&lt;/td&gt;
 &lt;td&gt;대출은 가능, 일부 백업 없음&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Red 상태&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&gt;이처럼 클러스터 관리는 &amp;ldquo;전국 도서관 체인의 본사에서 모든 지점을 관리&amp;quot;하는 것과 같습니다.&lt;/p&gt;</description></item><item><title>테스트 전략</title><link>https://advanced-beginner.github.io/ko/docs/ddd/concepts/testing/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/ddd/concepts/testing/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: DDD 기반 프로젝트에서 테스트 전략을 수립하려는 개발자
&lt;strong&gt;선수 지식&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/ddd/concepts/tactical-design/"&gt;전술적 설계&lt;/a&gt; 빌딩 블록, 기본적인 JUnit/Mockito 사용법
&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25분
&lt;strong&gt;핵심 질문&lt;/strong&gt;: &amp;ldquo;DDD 아키텍처에서 테스트를 어떻게 구성해야 하는가?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;요약&lt;/strong&gt;&lt;br&gt;테스트 전략 핵심: &lt;strong&gt;단위 테스트&lt;/strong&gt;(도메인 모델 중심, 가장 많이) → &lt;strong&gt;통합 테스트&lt;/strong&gt;(Repository, 외부 연동) → &lt;strong&gt;E2E 테스트&lt;/strong&gt;(핵심 시나리오만)
&lt;/blockquote&gt;

&lt;p&gt;도메인 주도 설계를 적용한 시스템은 일반적인 CRUD 애플리케이션과는 다른 테스트 전략이 필요합니다. 비즈니스 로직이 도메인 모델에 집중되어 있기 때문에, 테스트 역시 도메인 계층을 중심으로 설계해야 합니다. 이 문서에서는 DDD 아키텍처에 적합한 테스트 전략과 구체적인 구현 방법을 살펴봅니다.&lt;/p&gt;</description></item><item><title>Consumer 튜닝</title><link>https://advanced-beginner.github.io/ko/docs/kafka/concepts/consumer-tuning/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kafka/concepts/consumer-tuning/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;fetch.min.bytes/fetch.max.wait.ms로 배치 효율과 지연시간 균형 조절&lt;/li&gt;
&lt;li&gt;max.poll.records와 max.poll.interval.ms가 리밸런싱 방지의 핵심&lt;/li&gt;
&lt;li&gt;session.timeout.ms는 heartbeat.interval.ms의 3배 이상 권장&lt;/li&gt;
&lt;li&gt;처리량 최적화: fetch.min.size 증가, max.poll.records 증가&lt;/li&gt;
&lt;li&gt;지연시간 최적화: fetch.min.size 감소, fetch.max.wait 감소&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Consumer 성능을 최적화하려는 개발자, 운영 안정성을 높이려는 운영자&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/kafka/concepts/consumer-group/"&gt;Consumer Group &amp;amp; Offset&lt;/a&gt;의 Consumer 동작 원리&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 20분&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Consumer 성능 최적화와 안정적인 운영을 위한 설정을 이해합니다.&lt;/p&gt;
&lt;h4 id="전체-비유-택배-수거-및-배송"&gt;전체 비유: 택배 수거 및 배송&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ed%83%9d%eb%b0%b0-%ec%88%98%ea%b1%b0-%eb%b0%8f-%eb%b0%b0%ec%86%a1"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Consumer 튜닝을 &lt;strong&gt;택배 기사의 물품 수거&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;</description></item><item><title>Structured Streaming</title><link>https://advanced-beginner.github.io/ko/docs/spark/concepts/structured-streaming/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/spark/concepts/structured-streaming/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;Structured Streaming은 스트림을 무한히 추가되는 테이블로 처리&lt;/li&gt;
&lt;li&gt;배치와 동일한 DataFrame API 사용 (readStream/writeStream만 변경)&lt;/li&gt;
&lt;li&gt;Output Mode: append(새 행), complete(전체), update(변경분)&lt;/li&gt;
&lt;li&gt;Watermark로 늦게 도착하는 데이터(late data) 처리&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: 실시간 데이터 처리가 필요한 데이터 엔지니어&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://advanced-beginner.github.io/ko/docs/spark/concepts/dataframe-dataset/"&gt;DataFrame과 Dataset&lt;/a&gt; API&lt;/li&gt;
&lt;li&gt;Kafka 기본 개념 (선택 사항)&lt;/li&gt;
&lt;li&gt;이벤트 시간 vs 처리 시간 개념&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Structured Streaming은 Spark의 스트림 처리 엔진입니다. 배치 처리와 동일한 DataFrame/Dataset API를 사용하여 실시간 데이터를 처리합니다.&lt;/p&gt;</description></item><item><title>고차 함수</title><link>https://advanced-beginner.github.io/ko/docs/scala/concepts/higher-order-functions/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/concepts/higher-order-functions/</guid><description>&lt;h2 id="전체-비유-식품-가공-공장"&gt;전체 비유: 식품 가공 공장&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ec%8b%9d%ed%92%88-%ea%b0%80%ea%b3%b5-%ea%b3%b5%ec%9e%a5"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;고차 함수를 &lt;strong&gt;식품 가공 공장의 생산 라인&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;공장 비유&lt;/th&gt;
 &lt;th&gt;Scala 개념&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;code&gt;filter&lt;/code&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;code&gt;map&lt;/code&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;code&gt;flatMap&lt;/code&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;code&gt;fold&lt;/code&gt;/&lt;code&gt;reduce&lt;/code&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;code&gt;partition&lt;/code&gt;/&lt;code&gt;groupBy&lt;/code&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;code&gt;andThen&lt;/code&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;&amp;ldquo;어떻게&amp;rdquo; 처리할지 지정&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;공장에서 &lt;strong&gt;기계(함수)를 조립하여 생산 라인(파이프라인)을 구성&lt;/strong&gt;하듯이, 고차 함수는 작은 함수들을 조합하여 복잡한 데이터 처리를 수행합니다. 핵심은 &lt;strong&gt;&amp;ldquo;무엇을&amp;rdquo; 처리할지와 &amp;ldquo;어떻게&amp;rdquo; 처리할지를 분리&lt;/strong&gt;하는 것입니다.&lt;/p&gt;</description></item><item><title>리소스 관리</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/resources/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/resources/</guid><description>&lt;h2 id="전체-비유-아파트-전기수도-배정"&gt;전체 비유: 아파트 전기/수도 배정&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ec%95%84%ed%8c%8c%ed%8a%b8-%ec%a0%84%ea%b8%b0%ec%88%98%eb%8f%84-%eb%b0%b0%ec%a0%95"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;리소스 관리를 &lt;strong&gt;아파트 전기/수도 배정&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;아파트 공과금 비유&lt;/th&gt;
 &lt;th&gt;Kubernetes&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;requests&lt;/td&gt;
 &lt;td&gt;최소 보장 리소스&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;최대 전기 용량&lt;/td&gt;
 &lt;td&gt;limits&lt;/td&gt;
 &lt;td&gt;사용 가능한 최대치&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;전기 초과 시 차단기&lt;/td&gt;
 &lt;td&gt;CPU 스로틀링&lt;/td&gt;
 &lt;td&gt;한계 초과 시 성능 저하&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;수도 초과 시 단수&lt;/td&gt;
 &lt;td&gt;OOMKilled&lt;/td&gt;
 &lt;td&gt;메모리 초과 시 강제 종료&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;프리미엄 세대&lt;/td&gt;
 &lt;td&gt;Guaranteed QoS&lt;/td&gt;
 &lt;td&gt;가장 마지막에 퇴거 요청&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;일반 세대&lt;/td&gt;
 &lt;td&gt;Burstable QoS&lt;/td&gt;
 &lt;td&gt;중간 우선순위&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;관리비 미납 세대&lt;/td&gt;
 &lt;td&gt;BestEffort QoS&lt;/td&gt;
 &lt;td&gt;가장 먼저 퇴거 요청&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;단지 전체 전기 한도&lt;/td&gt;
 &lt;td&gt;ResourceQuota&lt;/td&gt;
 &lt;td&gt;네임스페이스 총량 제한&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;세대별 기본 배정량&lt;/td&gt;
 &lt;td&gt;LimitRange&lt;/td&gt;
 &lt;td&gt;기본 리소스 설정&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 requests는 &amp;ldquo;항상 보장받는 기본 전기량&amp;quot;이고, limits는 &amp;ldquo;절대 넘을 수 없는 최대 사용량&amp;quot;입니다.&lt;/p&gt;</description></item><item><title>성능 튜닝</title><link>https://advanced-beginner.github.io/ko/docs/elasticsearch/concepts/performance-tuning/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/elasticsearch/concepts/performance-tuning/</guid><description>&lt;h2 id="전체-비유-도서관-운영-효율화"&gt;전체 비유: 도서관 운영 효율화&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%eb%8f%84%ec%84%9c%ea%b4%80-%ec%9a%b4%ec%98%81-%ed%9a%a8%ec%9c%a8%ed%99%94"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;성능 튜닝을 &lt;strong&gt;도서관 운영 효율화&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;도서관 비유&lt;/th&gt;
 &lt;th&gt;Elasticsearch&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;tr&gt;
 &lt;td&gt;인기 도서 앞자리 배치&lt;/td&gt;
 &lt;td&gt;Filter 캐시&lt;/td&gt;
 &lt;td&gt;자주 조회되는 조건 캐싱&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;통계 보고서 캐싱&lt;/td&gt;
 &lt;td&gt;Request 캐시&lt;/td&gt;
 &lt;td&gt;집계 결과 재사용&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;소설, 컴퓨터&amp;quot;만 반환&lt;/td&gt;
 &lt;td&gt;_source 필터링&lt;/td&gt;
 &lt;td&gt;필요한 필드만 반환&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;끝없는 목록 대신 &amp;ldquo;다음 페이지&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;search_after&lt;/td&gt;
 &lt;td&gt;깊은 페이지네이션 최적화&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;*가 들어간 책&amp;rdquo; 요청 회피&lt;/td&gt;
 &lt;td&gt;Wildcard 쿼리 피하기&lt;/td&gt;
 &lt;td&gt;전체 스캔 방지&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;느린 대출 요청 분석&lt;/td&gt;
 &lt;td&gt;Slow Log&lt;/td&gt;
 &lt;td&gt;병목 쿼리 식별&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 성능 튜닝은 &amp;ldquo;도서관 운영을 최적화하여 대출 대기 시간을 줄이는 것&amp;quot;과 같습니다.&lt;/p&gt;</description></item><item><title>안티패턴과 함정</title><link>https://advanced-beginner.github.io/ko/docs/ddd/concepts/anti-patterns/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/ddd/concepts/anti-patterns/</guid><description>&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: DDD를 적용하고 있거나 도입을 고려 중인 개발자
&lt;strong&gt;선수 지식&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/ddd/quick-start/"&gt;Quick Start&lt;/a&gt;와 &lt;a href="https://advanced-beginner.github.io/ko/docs/ddd/concepts/tactical-design/"&gt;전술적 설계&lt;/a&gt; 기본 개념
&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 20분
&lt;strong&gt;핵심 질문&lt;/strong&gt;: &amp;ldquo;DDD 적용 시 흔히 저지르는 실수는 무엇이고, 어떻게 피할 수 있는가?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote class="book-hint warning"&gt;&lt;strong&gt;주의&lt;/strong&gt;&lt;br&gt;이 문서에서 소개하는 안티패턴은 실제 프로젝트에서 자주 발생합니다. 자신의 코드베이스에 해당 증상이 있는지 확인해보세요.
&lt;/blockquote&gt;

&lt;h2 id="안티패턴을-이해하는-비유"&gt;안티패턴을 이해하는 비유&lt;a class="anchor" href="#%ec%95%88%ed%8b%b0%ed%8c%a8%ed%84%b4%ec%9d%84-%ec%9d%b4%ed%95%b4%ed%95%98%eb%8a%94-%eb%b9%84%ec%9c%a0"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;비유: 건축과 안티패턴&lt;/strong&gt;&lt;br&gt;&lt;p&gt;DDD 안티패턴을 &lt;strong&gt;건축 설계 실수&lt;/strong&gt;에 비유할 수 있습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;안티패턴&lt;/th&gt;
 &lt;th&gt;건축 비유&lt;/th&gt;
 &lt;th&gt;결과&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Big Ball of Mud&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;칸막이 없는 원룸&lt;/td&gt;
 &lt;td&gt;부엌 냄새가 침실까지, 손님이 오면 모든 공간 정리 필요&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Anemic Domain Model&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;벽만 있고 가구 없는 집&lt;/td&gt;
 &lt;td&gt;살기 위해 매번 외부에서 가구를 빌려와야 함&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;God Aggregate&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;모든 방이 연결된 미로&lt;/td&gt;
 &lt;td&gt;한 방 고치려면 모든 방에 영향&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Primitive Obsession&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;문 없이 커튼만 있는 방&lt;/td&gt;
 &lt;td&gt;누구나 들어올 수 있어 보안 취약&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;중요&lt;/strong&gt;: 안티패턴이라고 해서 &lt;strong&gt;항상&lt;/strong&gt; 나쁜 것은 아닙니다. 빠른 프로토타입, 단순한 CRUD 앱, 1인 프로젝트에서는 &amp;ldquo;과도한 설계&amp;quot;가 오히려 해가 됩니다. 이 문서의 해결책은 &lt;strong&gt;복잡한 비즈니스 도메인&lt;/strong&gt;에 적합합니다.&lt;/p&gt;</description></item><item><title>MLlib</title><link>https://advanced-beginner.github.io/ko/docs/spark/concepts/mllib/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/spark/concepts/mllib/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;MLlib은 DataFrame 기반 분산 머신러닝 라이브러리 (spark.ml 패키지)&lt;/li&gt;
&lt;li&gt;Pipeline으로 전처리 → 학습 → 예측 단계를 연결&lt;/li&gt;
&lt;li&gt;Transformer(변환), Estimator(학습), Evaluator(평가) 패턴&lt;/li&gt;
&lt;li&gt;CrossValidator/TrainValidationSplit로 하이퍼파라미터 튜닝&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: 대규모 데이터에서 머신러닝을 수행하려는 ML 엔지니어&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://advanced-beginner.github.io/ko/docs/spark/concepts/dataframe-dataset/"&gt;DataFrame과 Dataset&lt;/a&gt; API&lt;/li&gt;
&lt;li&gt;머신러닝 기본 개념 (분류, 회귀, 클러스터링)&lt;/li&gt;
&lt;li&gt;특성 공학(Feature Engineering) 기초&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;MLlib은 Spark의 분산 머신러닝 라이브러리입니다. 대규모 데이터셋에서 머신러닝 모델을 학습하고 예측할 수 있습니다.&lt;/p&gt;
&lt;h2 id="비유로-이해하는-mllib"&gt;비유로 이해하는 MLlib&lt;a class="anchor" href="#%eb%b9%84%ec%9c%a0%eb%a1%9c-%ec%9d%b4%ed%95%b4%ed%95%98%eb%8a%94-mllib"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;개념&lt;/th&gt;
 &lt;th&gt;비유&lt;/th&gt;
 &lt;th&gt;핵심 아이디어&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Transformer&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;재료 손질사&lt;/td&gt;
 &lt;td&gt;원재료(데이터)를 조리 가능한 형태로 변환. 학습 없이 규칙대로 처리&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Estimator&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;요리사&lt;/td&gt;
 &lt;td&gt;레시피(알고리즘)로 연습(학습)하여 실력(모델)을 갖춤&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Model&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;숙련된 요리사&lt;/td&gt;
 &lt;td&gt;학습 완료된 상태. 새 재료가 와도 바로 요리(예측) 가능&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Pipeline&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;조리 라인&lt;/td&gt;
 &lt;td&gt;재료 손질 → 양념 → 조리 → 플레이팅을 하나로 연결&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Evaluator&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;음식 평론가&lt;/td&gt;
 &lt;td&gt;완성된 요리(모델)의 품질(정확도)을 평가&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;CrossValidator&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;맛 테스트 반복&lt;/td&gt;
 &lt;td&gt;여러 번 맛보고 가장 좋은 레시피(하이퍼파라미터) 선택&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Feature Vector&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;표준화된 재료 목록&lt;/td&gt;
 &lt;td&gt;모든 재료를 동일한 형식(벡터)으로 정리&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;핵심 원리&lt;/strong&gt;: MLlib은 &amp;ldquo;전처리 → 학습 → 예측 → 평가&amp;quot;의 반복 가능한 파이프라인을 구축하여, 대규모 데이터에서도 일관된 ML 워크플로우를 제공합니다.&lt;/p&gt;</description></item><item><title>고가용성</title><link>https://advanced-beginner.github.io/ko/docs/elasticsearch/concepts/high-availability/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/elasticsearch/concepts/high-availability/</guid><description>&lt;h2 id="전체-비유-도서관의-재난-대비-시스템"&gt;전체 비유: 도서관의 재난 대비 시스템&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%eb%8f%84%ec%84%9c%ea%b4%80%ec%9d%98-%ec%9e%ac%eb%82%9c-%eb%8c%80%eb%b9%84-%ec%8b%9c%ec%8a%a4%ed%85%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;고가용성을 &lt;strong&gt;도서관 체인의 재난 대비 시스템&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;도서관 비유&lt;/th&gt;
 &lt;th&gt;Elasticsearch&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;Replica Shard&lt;/td&gt;
 &lt;td&gt;데이터 복제로 장애 대비 + 대출 분산&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;장서 목록 사진 백업&lt;/td&gt;
 &lt;td&gt;Snapshot&lt;/td&gt;
 &lt;td&gt;특정 시점 데이터 백업&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;백업 사진 정기 촬영&lt;/td&gt;
 &lt;td&gt;SLM (Snapshot Lifecycle)&lt;/td&gt;
 &lt;td&gt;자동 백업 정책&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;타 지역 도서관에 복본 보관&lt;/td&gt;
 &lt;td&gt;CCR (Cross-Cluster Replication)&lt;/td&gt;
 &lt;td&gt;원격 클러스터로 실시간 복제&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;화재 시 백업 지점 운영&lt;/td&gt;
 &lt;td&gt;Active-Passive DR&lt;/td&gt;
 &lt;td&gt;장애 시 대체 클러스터 활성화&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;지점 폐쇄 → 타 지점 자동 대출&lt;/td&gt;
 &lt;td&gt;자동 Failover&lt;/td&gt;
 &lt;td&gt;노드 장애 시 Replica 승격&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;서울/부산 양방향 운영&lt;/td&gt;
 &lt;td&gt;Active-Active&lt;/td&gt;
 &lt;td&gt;각 리전에서 독립 운영&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 고가용성은 &amp;ldquo;지진이나 화재에도 도서관 서비스를 중단 없이 제공&amp;quot;하는 재난 대비 시스템과 같습니다.&lt;/p&gt;</description></item><item><title>스케일링</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/scaling/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/scaling/</guid><description>&lt;h2 id="전체-비유-아파트-세대-수-조절"&gt;전체 비유: 아파트 세대 수 조절&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ec%95%84%ed%8c%8c%ed%8a%b8-%ec%84%b8%eb%8c%80-%ec%88%98-%ec%a1%b0%ec%a0%88"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;스케일링을 &lt;strong&gt;아파트 세대 수 조절&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;아파트 관리 비유&lt;/th&gt;
 &lt;th&gt;Kubernetes&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;트래픽에 따른 Pod 수 조정&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;세대 수 늘리기&lt;/td&gt;
 &lt;td&gt;Horizontal Scaling (HPA)&lt;/td&gt;
 &lt;td&gt;Pod 개수 증가&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;세대 크기 늘리기&lt;/td&gt;
 &lt;td&gt;Vertical Scaling (VPA)&lt;/td&gt;
 &lt;td&gt;Pod 리소스 증가&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;입주율 50% 초과 시 증축&lt;/td&gt;
 &lt;td&gt;averageUtilization&lt;/td&gt;
 &lt;td&gt;스케일링 기준 메트릭&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;최소 3세대 유지&lt;/td&gt;
 &lt;td&gt;minReplicas&lt;/td&gt;
 &lt;td&gt;최소 Pod 수&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;최대 10세대까지&lt;/td&gt;
 &lt;td&gt;maxReplicas&lt;/td&gt;
 &lt;td&gt;최대 Pod 수&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;증축은 빠르게, 감축은 천천히&lt;/td&gt;
 &lt;td&gt;scaleUp/scaleDown 정책&lt;/td&gt;
 &lt;td&gt;급격한 변화 방지&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;전기 사용량 측정기&lt;/td&gt;
 &lt;td&gt;Metrics Server&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&gt;이처럼 HPA는 &amp;ldquo;입주 수요가 늘면 세대 수를 늘리고, 줄면 다시 줄이는&amp;rdquo; 자동 관리 시스템입니다.&lt;/p&gt;</description></item><item><title>에러 처리 심화</title><link>https://advanced-beginner.github.io/ko/docs/kafka/concepts/error-handling/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kafka/concepts/error-handling/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;에러 유형: 역직렬화 에러(건너뛰기), 일시적 에러(재시도), 영구적 에러(DLT)&lt;/li&gt;
&lt;li&gt;@RetryableTopic으로 선언적 재시도 및 DLT 처리 (Spring Kafka 2.7+)&lt;/li&gt;
&lt;li&gt;DefaultErrorHandler + DeadLetterPublishingRecoverer로 DLT 발행&lt;/li&gt;
&lt;li&gt;역직렬화 에러는 ErrorHandlingDeserializer로 처리&lt;/li&gt;
&lt;li&gt;DLT 메시지 도착 시 알림 설정으로 빠른 대응 필요&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Consumer 에러 처리 전략을 구현하려는 개발자&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/kafka/concepts/consumer-group/"&gt;Consumer Group &amp;amp; Offset&lt;/a&gt;의 Consumer 동작 원리, Spring Kafka 기초&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Kafka Consumer의 에러 처리 전략과 Dead Letter Topic 패턴을 이해합니다.&lt;/p&gt;
&lt;h4 id="전체-비유-우편물-처리"&gt;전체 비유: 우편물 처리&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ec%9a%b0%ed%8e%b8%eb%ac%bc-%ec%b2%98%eb%a6%ac"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Consumer 에러 처리를 &lt;strong&gt;우편물 배달&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;</description></item><item><title>제네릭</title><link>https://advanced-beginner.github.io/ko/docs/scala/concepts/generics/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/concepts/generics/</guid><description>&lt;h2 id="전체-비유-만능-수납함"&gt;전체 비유: 만능 수납함&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%eb%a7%8c%eb%8a%a5-%ec%88%98%eb%82%a9%ed%95%a8"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;제네릭을 &lt;strong&gt;만능 수납함 시스템&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;수납함 비유&lt;/th&gt;
 &lt;th&gt;Scala 개념&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;code&gt;Box[A]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;어떤 타입이든 담을 수 있는 컨테이너&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;책 전용&amp;rdquo; 라벨&lt;/td&gt;
 &lt;td&gt;타입 매개변수 &lt;code&gt;A&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;담을 내용물의 타입 지정&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;도서류 이하만&amp;rdquo; 규칙&lt;/td&gt;
 &lt;td&gt;상한 경계 &lt;code&gt;A &amp;lt;: Book&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;허용 타입 범위 제한&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;인쇄물 이상만&amp;rdquo; 규칙&lt;/td&gt;
 &lt;td&gt;하한 경계 &lt;code&gt;A &amp;gt;: Paper&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;최소 타입 요구사항&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;무게 측정 가능&amp;rdquo; 조건&lt;/td&gt;
 &lt;td&gt;컨텍스트 경계 &lt;code&gt;A : Weighable&lt;/code&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;code&gt;None&lt;/code&gt;, &lt;code&gt;List.empty[A]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;명시적 타입 필요&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;수납함에 라벨을 붙여 &lt;strong&gt;어떤 물건을 담을 수 있는지 명시&lt;/strong&gt;하듯이, 제네릭은 컴파일 시점에 타입을 검사하여 &lt;strong&gt;잘못된 타입의 데이터가 들어가는 것을 방지&lt;/strong&gt;합니다.&lt;/p&gt;</description></item><item><title>For Comprehension</title><link>https://advanced-beginner.github.io/ko/docs/scala/concepts/for-comprehensions/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/concepts/for-comprehensions/</guid><description>&lt;h2 id="전체-비유-조립-라인"&gt;전체 비유: 조립 라인&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ec%a1%b0%eb%a6%bd-%eb%9d%bc%ec%9d%b8"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For comprehension을 &lt;strong&gt;공장 조립 라인&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;조립 라인 비유&lt;/th&gt;
 &lt;th&gt;Scala 개념&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;code&gt;&amp;lt;-&lt;/code&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;code&gt;if&lt;/code&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;code&gt;=&lt;/code&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;code&gt;yield&lt;/code&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;None/Left&lt;/td&gt;
 &lt;td&gt;실패 시 즉시 중단&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;조립 라인에서 부품이 순차적으로 가공되듯이, for comprehension에서는 각 단계가 이전 단계의 결과에 의존합니다. &lt;strong&gt;불량품(None/Left)이 발견되면 전체 라인이 멈추는 것&lt;/strong&gt;이 핵심입니다.&lt;/p&gt;</description></item><item><title>Vector Search (kNN)</title><link>https://advanced-beginner.github.io/ko/docs/elasticsearch/concepts/vector-search/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/elasticsearch/concepts/vector-search/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vector Search&lt;/strong&gt;: 의미(Semantic) 기반 검색으로 키워드가 달라도 유사한 내용 검색 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dense_vector&lt;/strong&gt;: 벡터를 저장하는 필드 타입, similarity로 유사도 계산 방식 지정&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;kNN 쿼리&lt;/strong&gt;: k개의 가장 가까운 이웃 문서를 찾는 검색 방식&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;하이브리드 검색&lt;/strong&gt;: kNN + 키워드 검색을 결합하여 최상의 결과 제공&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;임베딩 모델&lt;/strong&gt;: 텍스트/이미지를 벡터로 변환 (한글은 다국어 모델 권장)&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: 시맨틱 검색이나 추천 시스템을 구현하려는 개발자
&lt;strong&gt;선수 지식&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/elasticsearch/concepts/core-components/"&gt;핵심 구성요소&lt;/a&gt;, &lt;a href="https://advanced-beginner.github.io/ko/docs/elasticsearch/concepts/query-dsl/"&gt;Query DSL&lt;/a&gt;, 기본적인 ML 개념&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;</description></item><item><title>모니터링 기초</title><link>https://advanced-beginner.github.io/ko/docs/kafka/concepts/monitoring/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kafka/concepts/monitoring/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;Consumer Lag이 가장 중요한 메트릭, 증가 추세 시 즉시 조치 필요&lt;/li&gt;
&lt;li&gt;Broker 핵심 메트릭: UnderReplicatedPartitions, ActiveControllerCount, OfflinePartitionsCount&lt;/li&gt;
&lt;li&gt;Producer 메트릭: record-send-rate, record-error-rate, request-latency-avg&lt;/li&gt;
&lt;li&gt;Prometheus + Grafana로 시각화 및 알림 설정 권장&lt;/li&gt;
&lt;li&gt;Lag 급증 시: Consumer 상태 → 처리 속도 → 리밸런싱 → 스케일 아웃 순서로 확인&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Kafka 클러스터를 운영하고 모니터링하려는 운영자 및 개발자&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/kafka/concepts/consumer-group/"&gt;Consumer Group &amp;amp; Offset&lt;/a&gt;의 Offset과 Lag 개념&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Kafka 클러스터와 애플리케이션의 핵심 메트릭을 이해합니다.&lt;/p&gt;</description></item><item><title>성능 튜닝</title><link>https://advanced-beginner.github.io/ko/docs/spark/concepts/tuning/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/spark/concepts/tuning/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;튜닝 순서: 코드 최적화 → 데이터 구조 → 리소스 설정 → 세부 설정&lt;/li&gt;
&lt;li&gt;핵심 전략: 셔플 최소화, 조기 필터링, Broadcast Join, 캐싱&lt;/li&gt;
&lt;li&gt;Executor 권장: 코어당 5GB, 4~5코어가 최적&lt;/li&gt;
&lt;li&gt;AQE + Kryo 직렬화 + 적절한 파티션 수가 기본 설정&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: 프로덕션 Spark 워크로드를 최적화하는 시니어 엔지니어&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://advanced-beginner.github.io/ko/docs/spark/concepts/partitioning/"&gt;파티셔닝과 셔플&lt;/a&gt; 이해&lt;/li&gt;
&lt;li&gt;&lt;a href="https://advanced-beginner.github.io/ko/docs/spark/concepts/caching/"&gt;캐싱과 영속성&lt;/a&gt; 이해&lt;/li&gt;
&lt;li&gt;Spark UI 기본 사용법&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Spark 애플리케이션의 성능을 최적화하는 전략과 구체적인 설정 방법을 알아봅니다.&lt;/p&gt;</description></item><item><title>헬스 체크</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/health-checks/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/health-checks/</guid><description>&lt;h2 id="전체-비유-아파트-안전-점검"&gt;전체 비유: 아파트 안전 점검&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ec%95%84%ed%8c%8c%ed%8a%b8-%ec%95%88%ec%a0%84-%ec%a0%90%ea%b2%80"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;헬스 체크를 &lt;strong&gt;아파트 안전 점검&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;아파트 점검 비유&lt;/th&gt;
 &lt;th&gt;Kubernetes&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;Health Check&lt;/td&gt;
 &lt;td&gt;애플리케이션 상태 확인&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;살아 계신가요?&amp;rdquo; 확인&lt;/td&gt;
 &lt;td&gt;Liveness Probe&lt;/td&gt;
 &lt;td&gt;컨테이너 생존 확인&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;손님 받을 준비 됐나요?&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;Readiness Probe&lt;/td&gt;
 &lt;td&gt;트래픽 수신 준비 확인&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;이사 완료됐나요?&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;Startup Probe&lt;/td&gt;
 &lt;td&gt;시작 완료 여부 확인&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;응답 없으면 119 호출&lt;/td&gt;
 &lt;td&gt;Liveness 실패 → 재시작&lt;/td&gt;
 &lt;td&gt;컨테이너 재시작&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;바쁘면 손님 안 받음&lt;/td&gt;
 &lt;td&gt;Readiness 실패 → 트래픽 제외&lt;/td&gt;
 &lt;td&gt;Service에서 제외&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;이사 중이면 기다림&lt;/td&gt;
 &lt;td&gt;Startup 진행 중&lt;/td&gt;
 &lt;td&gt;다른 Probe 비활성화&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;초인종 눌러서 확인&lt;/td&gt;
 &lt;td&gt;HTTP Probe&lt;/td&gt;
 &lt;td&gt;HTTP 엔드포인트 체크&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;전화해서 확인&lt;/td&gt;
 &lt;td&gt;TCP Probe&lt;/td&gt;
 &lt;td&gt;포트 연결 체크&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;가스 점검 (직접 확인)&lt;/td&gt;
 &lt;td&gt;Exec Probe&lt;/td&gt;
 &lt;td&gt;명령어 실행 체크&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 Probe는 &amp;ldquo;관리인이 주기적으로 세대를 방문하여 상태를 확인&amp;quot;하는 것과 같습니다.&lt;/p&gt;</description></item><item><title>Namespace</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/namespace/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/namespace/</guid><description>&lt;h2 id="전체-비유-아파트-단지의-동-구분"&gt;전체 비유: 아파트 단지의 동 구분&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ec%95%84%ed%8c%8c%ed%8a%b8-%eb%8b%a8%ec%a7%80%ec%9d%98-%eb%8f%99-%ea%b5%ac%eb%b6%84"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Namespace를 &lt;strong&gt;아파트 단지의 동 구분&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;아파트 단지 비유&lt;/th&gt;
 &lt;th&gt;Kubernetes Namespace&lt;/th&gt;
 &lt;th&gt;역할&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;101동, 102동 구분&lt;/td&gt;
 &lt;td&gt;Namespace&lt;/td&gt;
 &lt;td&gt;리소스를 논리적으로 분리&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;동별 관리비 예산&lt;/td&gt;
 &lt;td&gt;ResourceQuota&lt;/td&gt;
 &lt;td&gt;네임스페이스별 리소스 총량 제한&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;세대당 전기/수도 한도&lt;/td&gt;
 &lt;td&gt;LimitRange&lt;/td&gt;
 &lt;td&gt;개별 Pod/컨테이너 리소스 기본값&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;관리사무소 전용 구역&lt;/td&gt;
 &lt;td&gt;kube-system&lt;/td&gt;
 &lt;td&gt;시스템 구성요소 전용 공간&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;공용 게시판 구역&lt;/td&gt;
 &lt;td&gt;kube-public&lt;/td&gt;
 &lt;td&gt;모든 사용자 접근 가능 공간&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;동별 출입 카드&lt;/td&gt;
 &lt;td&gt;RBAC + Namespace&lt;/td&gt;
 &lt;td&gt;접근 권한 분리&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 Namespace는 &amp;ldquo;하나의 아파트 단지에서 동별로 관리 영역을 나누는 것&amp;quot;과 같습니다.&lt;/p&gt;</description></item><item><title>Implicit / Given</title><link>https://advanced-beginner.github.io/ko/docs/scala/concepts/implicits/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/concepts/implicits/</guid><description>&lt;h2 id="전체-비유-개인-비서"&gt;전체 비유: 개인 비서&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ea%b0%9c%ec%9d%b8-%eb%b9%84%ec%84%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;암시적 기능을 &lt;strong&gt;개인 비서 시스템&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;비서 비유&lt;/th&gt;
 &lt;th&gt;Scala 개념&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;code&gt;given&lt;/code&gt;/&lt;code&gt;implicit val&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;필요한 값을 자동 제공&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;비서에게 부탁해&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;using&lt;/code&gt;/&lt;code&gt;implicit&lt;/code&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;code&gt;extension&lt;/code&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;tr&gt;
 &lt;td&gt;비서 고용&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;import ... given&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;암시적 인스턴스 도입&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;비서가 &lt;strong&gt;당신이 말하지 않아도 필요한 것을 준비&lt;/strong&gt;하듯이, 암시적 기능은 컴파일러가 필요한 값을 자동으로 찾아서 전달합니다. 핵심은 **명확한 규칙(타입)**에 따라 적절한 값을 선택하는 것입니다.&lt;/p&gt;</description></item><item><title>로그 수집</title><link>https://advanced-beginner.github.io/ko/docs/observability/concepts/log-aggregation/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/concepts/log-aggregation/</guid><description>&lt;h2 id="전체-비유-병원-의무-기록-관리"&gt;전체 비유: 병원 의무 기록 관리&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%eb%b3%91%ec%9b%90-%ec%9d%98%eb%ac%b4-%ea%b8%b0%eb%a1%9d-%ea%b4%80%eb%a6%ac"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;로그 수집을 &lt;strong&gt;병원의 의무 기록 관리 시스템&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;병원 의무 기록 비유&lt;/th&gt;
 &lt;th&gt;로그 수집&lt;/th&gt;
 &lt;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;로그 수집 시스템 (Loki/ELK)&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;구조화 로그 (JSON)&lt;/td&gt;
 &lt;td&gt;표준화된 형식&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;진료일지, 처방전, 검사결과&lt;/td&gt;
 &lt;td&gt;로그 레벨 (INFO, ERROR)&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;Hot → Warm → Cold&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;환자 차트 번호&lt;/td&gt;
 &lt;td&gt;trace_id&lt;/td&gt;
 &lt;td&gt;관련 기록 연결&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;카드 검색 시스템 (색인)&lt;/td&gt;
 &lt;td&gt;Elasticsearch 인덱싱&lt;/td&gt;
 &lt;td&gt;빠른 전문 검색&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;라벨 기반 분류&lt;/td&gt;
 &lt;td&gt;Loki 라벨 인덱싱&lt;/td&gt;
 &lt;td&gt;경량 검색&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 병원이 환자 기록을 중앙에서 관리하듯, 로그 수집 시스템은 분산된 로그를 한 곳에서 검색할 수 있게 합니다.&lt;/p&gt;</description></item><item><title>배포와 클러스터 관리</title><link>https://advanced-beginner.github.io/ko/docs/spark/concepts/deployment/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/spark/concepts/deployment/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;클러스터 매니저: Local(개발), Standalone(소규모), YARN(Hadoop), K8s(클라우드)&lt;/li&gt;
&lt;li&gt;배포 모드: Client(디버깅), Cluster(프로덕션)&lt;/li&gt;
&lt;li&gt;동적 할당으로 워크로드에 따라 Executor 자동 조절&lt;/li&gt;
&lt;li&gt;Fat JAR로 의존성 포함하여 spark-submit 실행&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Spark 클러스터를 운영하는 DevOps/플랫폼 엔지니어&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://advanced-beginner.github.io/ko/docs/spark/concepts/architecture/"&gt;아키텍처&lt;/a&gt; 문서의 Driver/Executor 개념&lt;/li&gt;
&lt;li&gt;Docker/Kubernetes 기초 (K8s 배포 시)&lt;/li&gt;
&lt;li&gt;Hadoop YARN 기초 (YARN 배포 시)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Spark 애플리케이션을 다양한 클러스터 환경에 배포하고 관리하는 방법을 알아봅니다.&lt;/p&gt;
&lt;h2 id="비유로-이해하는-배포"&gt;비유로 이해하는 배포&lt;a class="anchor" href="#%eb%b9%84%ec%9c%a0%eb%a1%9c-%ec%9d%b4%ed%95%b4%ed%95%98%eb%8a%94-%eb%b0%b0%ed%8f%ac"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;개념&lt;/th&gt;
 &lt;th&gt;비유&lt;/th&gt;
 &lt;th&gt;핵심 아이디어&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Local 모드&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;1인 식당 운영&lt;/td&gt;
 &lt;td&gt;주방장(Driver)이 혼자 요리(Executor 역할)도 함. 빠른 테스트용&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Standalone&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;소규모 자체 주방&lt;/td&gt;
 &lt;td&gt;직접 관리하는 주방. 간단하지만 확장에 한계&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;YARN&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;대형 호텔 총괄 주방&lt;/td&gt;
 &lt;td&gt;호텔(Hadoop) 전체 리소스를 관리하는 주방장이 따로 있음&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Kubernetes&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;푸드코트 공유 주방&lt;/td&gt;
 &lt;td&gt;컨테이너 단위로 공간 임대. 유연하게 확장/축소 가능&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Client 모드&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;주방장이 손님 옆에서 조리&lt;/td&gt;
 &lt;td&gt;바로 피드백 가능하지만, 손님(클라이언트)이 떠나면 요리 중단&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Cluster 모드&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;주방장이 백주방에서 조리&lt;/td&gt;
 &lt;td&gt;손님이 떠나도 요리 계속. 완성되면 전달&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;동적 할당&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;바쁠 때만 알바생 추가&lt;/td&gt;
 &lt;td&gt;주문량(워크로드)에 따라 인력 자동 조절&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;핵심 원리&lt;/strong&gt;: 배포 환경 선택은 &amp;ldquo;기존 인프라&amp;rdquo;, &amp;ldquo;확장 요구&amp;rdquo;, &amp;ldquo;운영 복잡도&amp;quot;의 균형점을 찾는 것입니다.&lt;/p&gt;</description></item><item><title>보안</title><link>https://advanced-beginner.github.io/ko/docs/kafka/concepts/security/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kafka/concepts/security/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;Kafka 보안 3계층: SSL/TLS(암호화) → SASL(인증) → ACL(권한)&lt;/li&gt;
&lt;li&gt;SSL/TLS로 전송 중 데이터 암호화, 양방향 TLS로 클라이언트 인증&lt;/li&gt;
&lt;li&gt;SASL 메커니즘: SCRAM-SHA-256 권장 (프로덕션), PLAIN은 SSL과 함께만 사용&lt;/li&gt;
&lt;li&gt;ACL로 Principal별 Topic/Group 접근 권한 세분화&lt;/li&gt;
&lt;li&gt;allow.everyone.if.no.acl.found=false 설정으로 기본 거부 정책 적용&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Kafka 클러스터 보안을 구성하려는 운영자 및 보안 담당자&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/kafka/concepts/core-components/"&gt;핵심 구성요소&lt;/a&gt;의 Broker, Producer, Consumer 개념, 기본적인 보안 개념(암호화, 인증, 인가)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;프로덕션 환경에서 Kafka를 안전하게 운영하기 위한 암호화, 인증, 권한 관리를 이해합니다.&lt;/p&gt;</description></item><item><title>한글 검색 최적화</title><link>https://advanced-beginner.github.io/ko/docs/elasticsearch/concepts/korean-search/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/elasticsearch/concepts/korean-search/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;선수 개념&lt;/strong&gt;&lt;br&gt;&lt;p&gt;이 문서를 읽기 전에 다음 개념을 먼저 이해하세요:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="data-modeling/"&gt;데이터 모델링&lt;/a&gt; - Analyzer, text vs keyword 타입&lt;/li&gt;
&lt;li&gt;&lt;a href="query-dsl/"&gt;Query DSL&lt;/a&gt; - match, multi_match 쿼리&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;
&lt;h2 id="전체-비유-외국인을-위한-한글-도서-검색"&gt;전체 비유: 외국인을 위한 한글 도서 검색&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ec%99%b8%ea%b5%ad%ec%9d%b8%ec%9d%84-%ec%9c%84%ed%95%9c-%ed%95%9c%ea%b8%80-%eb%8f%84%ec%84%9c-%ea%b2%80%ec%83%89"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;한글 검색 최적화를 &lt;strong&gt;외국인 사서가 한글 도서를 색인하는 상황&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;한글 검색 비유&lt;/th&gt;
 &lt;th&gt;Elasticsearch&lt;/th&gt;
 &lt;th&gt;역할&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;영어 사서: &amp;ldquo;삼성전자가&amp;quot;를 통째로 기록&lt;/td&gt;
 &lt;td&gt;Standard Analyzer&lt;/td&gt;
 &lt;td&gt;조사 분리 못함&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;한국어 사서: &amp;ldquo;삼성전자+가&amp;quot;로 분리&lt;/td&gt;
 &lt;td&gt;Nori Analyzer&lt;/td&gt;
 &lt;td&gt;형태소 분석으로 조사 분리&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;삼성전자&amp;rdquo; → &amp;ldquo;삼성 + 전자&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;decompound_mode: mixed&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;&amp;ldquo;갤럭&amp;rdquo; 입력 시 &amp;ldquo;갤럭시&amp;rdquo; 추천&lt;/td&gt;
 &lt;td&gt;자동완성 (Edge N-gram)&lt;/td&gt;
 &lt;td&gt;접두어 매칭&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;ㄱㄹㅅ&amp;quot;로 &amp;ldquo;갤럭시&amp;rdquo; 찾기&lt;/td&gt;
 &lt;td&gt;초성 검색&lt;/td&gt;
 &lt;td&gt;자음 추출 후 매칭&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;노트북 = 랩탑&amp;rdquo; 등록&lt;/td&gt;
 &lt;td&gt;동의어 처리&lt;/td&gt;
 &lt;td&gt;유사어 확장 검색&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 한글 검색은 &amp;ldquo;한글의 특성을 이해하는 전문 사서를 배치&amp;quot;하는 것과 같습니다.&lt;/p&gt;</description></item><item><title>StatefulSet</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/statefulset/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/statefulset/</guid><description>&lt;h2 id="전체-비유-지정석이-있는-식당"&gt;전체 비유: 지정석이 있는 식당&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ec%a7%80%ec%a0%95%ec%84%9d%ec%9d%b4-%ec%9e%88%eb%8a%94-%ec%8b%9d%eb%8b%b9"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;StatefulSet을 &lt;strong&gt;지정석이 있는 식당&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;식당 비유&lt;/th&gt;
 &lt;th&gt;Kubernetes StatefulSet&lt;/th&gt;
 &lt;th&gt;역할&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;지정석 번호 (1번, 2번, 3번)&lt;/td&gt;
 &lt;td&gt;Pod 이름 (app-0, app-1, app-2)&lt;/td&gt;
 &lt;td&gt;안정적이고 고유한 식별자&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;손님 전용 사물함&lt;/td&gt;
 &lt;td&gt;PersistentVolumeClaim&lt;/td&gt;
 &lt;td&gt;Pod마다 전용 영구 스토리지&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;순서대로 착석/퇴석&lt;/td&gt;
 &lt;td&gt;순차적 생성/삭제&lt;/td&gt;
 &lt;td&gt;0번부터 생성, 역순으로 삭제&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;예약 명패&lt;/td&gt;
 &lt;td&gt;안정적 네트워크 ID&lt;/td&gt;
 &lt;td&gt;Pod 재시작 후에도 같은 호스트명 유지&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;자유석 식당&lt;/td&gt;
 &lt;td&gt;Deployment&lt;/td&gt;
 &lt;td&gt;아무 자리나 앉고, 바뀔 수 있음&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 StatefulSet은 &amp;ldquo;지정석과 전용 사물함이 있어서 항상 같은 자리, 같은 물건을 사용하는 것&amp;quot;과 같습니다.&lt;/p&gt;</description></item><item><title>Spark Connect</title><link>https://advanced-beginner.github.io/ko/docs/spark/concepts/spark-connect/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/spark/concepts/spark-connect/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;Spark Connect는 gRPC 기반 클라이언트-서버 분리 아키텍처 (Spark 3.4+)&lt;/li&gt;
&lt;li&gt;경량 클라이언트(~10MB)로 원격 Spark 클러스터 접근&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SparkSession.builder().remote(&amp;quot;sc://host:port&amp;quot;)&lt;/code&gt; 로 연결&lt;/li&gt;
&lt;li&gt;DataFrame API 완전 지원, RDD API/Streaming은 제한적&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: 마이크로서비스 환경에서 Spark를 사용하려는 개발자&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://advanced-beginner.github.io/ko/docs/spark/concepts/architecture/"&gt;아키텍처&lt;/a&gt; 문서의 Driver/Executor 개념&lt;/li&gt;
&lt;li&gt;gRPC 기본 개념 (선택 사항)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://advanced-beginner.github.io/ko/docs/spark/concepts/dataframe-dataset/"&gt;DataFrame과 Dataset&lt;/a&gt; API&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 25-30분&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Spark Connect는 Spark 3.4에서 도입된 새로운 클라이언트-서버 아키텍처입니다. 씬 클라이언트(Thin Client)로 원격 Spark 클러스터에 연결할 수 있습니다.&lt;/p&gt;
&lt;h2 id="비유로-이해하는-spark-connect"&gt;비유로 이해하는 Spark Connect&lt;a class="anchor" href="#%eb%b9%84%ec%9c%a0%eb%a1%9c-%ec%9d%b4%ed%95%b4%ed%95%98%eb%8a%94-spark-connect"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;개념&lt;/th&gt;
 &lt;th&gt;비유&lt;/th&gt;
 &lt;th&gt;핵심 아이디어&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;기존 방식&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;자가용 직접 운전&lt;/td&gt;
 &lt;td&gt;내 차(Driver)에 모든 장비 실어서 직접 운전. 차가 고장나면 여행 중단&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Spark Connect&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;택시 호출&lt;/td&gt;
 &lt;td&gt;스마트폰(Thin Client)으로 택시(서버) 호출. 기사(Driver)가 목적지까지 데려다줌&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;gRPC&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;무전기 통신&lt;/td&gt;
 &lt;td&gt;표준화된 통신 규약으로 어떤 택시든 같은 방식으로 호출&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Thin Client&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;가벼운 스마트폰 앱&lt;/td&gt;
 &lt;td&gt;목적지만 입력하면 됨. 내비게이션은 택시 기사가 알아서&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;서버 업그레이드&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;택시 회사 차량 교체&lt;/td&gt;
 &lt;td&gt;앱 업데이트 없이 새 차량(Spark 버전) 이용 가능&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;핵심 원리&lt;/strong&gt;: Spark Connect는 &amp;ldquo;무거운 연산 로직&amp;quot;을 클라이언트에서 서버로 분리합니다. 클라이언트는 &amp;ldquo;무엇을 원하는지&amp;quot;만 전달하고, 서버가 &amp;ldquo;어떻게 할지&amp;quot;를 결정합니다.&lt;/p&gt;</description></item><item><title>분산 추적</title><link>https://advanced-beginner.github.io/ko/docs/observability/concepts/distributed-tracing/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/concepts/distributed-tracing/</guid><description>&lt;h2 id="전체-비유-택배-추적-시스템"&gt;전체 비유: 택배 추적 시스템&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ed%83%9d%eb%b0%b0-%ec%b6%94%ec%a0%81-%ec%8b%9c%ec%8a%a4%ed%85%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;분산 추적을 &lt;strong&gt;택배 배송 추적&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;택배 추적 비유&lt;/th&gt;
 &lt;th&gt;분산 추적&lt;/th&gt;
 &lt;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;Trace ID&lt;/td&gt;
 &lt;td&gt;전체 요청의 고유 식별자&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;배송 구간별 스캔&lt;/td&gt;
 &lt;td&gt;Span&lt;/td&gt;
 &lt;td&gt;개별 작업 단위 기록&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;물류센터 → 허브&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;Parent-Child Span&lt;/td&gt;
 &lt;td&gt;구간 간 연결 관계&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;각 구간 소요 시간&lt;/td&gt;
 &lt;td&gt;Duration&lt;/td&gt;
 &lt;td&gt;작업 처리 시간&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;배송 상태 &amp;ldquo;집하/배송중/완료&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;Status&lt;/td&gt;
 &lt;td&gt;성공/실패 상태&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;물류 센터 간 운송장 전달&lt;/td&gt;
 &lt;td&gt;Context Propagation&lt;/td&gt;
 &lt;td&gt;서비스 간 추적 정보 전달&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;지연 구간 표시&lt;/td&gt;
 &lt;td&gt;Latency 분석&lt;/td&gt;
 &lt;td&gt;병목 구간 식별&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;배송 사고 이력&lt;/td&gt;
 &lt;td&gt;Error Span&lt;/td&gt;
 &lt;td&gt;실패 지점 추적&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 택배를 추적하듯, 분산 추적은 &amp;ldquo;요청이 어떤 서비스를 거쳐 어디서 지연됐는지&amp;quot;를 추적합니다.&lt;/p&gt;</description></item><item><title>생태계</title><link>https://advanced-beginner.github.io/ko/docs/kafka/concepts/ecosystem/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kafka/concepts/ecosystem/</guid><description>&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;Kafka Connect: 외부 시스템과 Kafka 간 데이터 이동, 코딩 없이 설정으로 파이프라인 구축&lt;/li&gt;
&lt;li&gt;Schema Registry: 메시지 스키마 중앙 관리, 호환성 검증으로 런타임 오류 방지&lt;/li&gt;
&lt;li&gt;Kafka Streams: 실시간 스트림 처리 라이브러리, 별도 클러스터 불필요&lt;/li&gt;
&lt;li&gt;Debezium: CDC(Change Data Capture)로 DB 변경사항을 Kafka로 스트리밍&lt;/li&gt;
&lt;li&gt;스키마 호환성: BACKWARD(기본), FORWARD, FULL, NONE 정책 지원&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: Kafka 생태계를 활용한 데이터 파이프라인을 구축하려는 개발자 및 데이터 엔지니어&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선수 지식&lt;/strong&gt;: &lt;a href="https://advanced-beginner.github.io/ko/docs/kafka/concepts/core-components/"&gt;핵심 구성요소&lt;/a&gt;의 Topic, Producer, Consumer 개념, &lt;a href="https://advanced-beginner.github.io/ko/docs/kafka/concepts/message-flow/"&gt;메시지 흐름&lt;/a&gt;의 전체 데이터 흐름&lt;/p&gt;</description></item><item><title>타입 클래스</title><link>https://advanced-beginner.github.io/ko/docs/scala/concepts/type-classes/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/concepts/type-classes/</guid><description>&lt;h2 id="전체-비유-만능-어댑터-시스템"&gt;전체 비유: 만능 어댑터 시스템&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%eb%a7%8c%eb%8a%a5-%ec%96%b4%eb%8c%91%ed%84%b0-%ec%8b%9c%ec%8a%a4%ed%85%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;타입 클래스를 &lt;strong&gt;전자기기 어댑터 시스템&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;어댑터 비유&lt;/th&gt;
 &lt;th&gt;Scala 개념&lt;/th&gt;
 &lt;th&gt;역할&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;어댑터 규격 (USB-C 등)&lt;/td&gt;
 &lt;td&gt;타입 클래스 (&lt;code&gt;trait Show[A]&lt;/code&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;code&gt;given Show[Int]&lt;/code&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;API (&lt;code&gt;def show[A: Show]&lt;/code&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;code&gt;extension&lt;/code&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;p&gt;기기 본체를 분해하지 않고 &lt;strong&gt;어댑터만 연결하면 새 기능을 사용&lt;/strong&gt;할 수 있듯이, 타입 클래스는 기존 타입을 수정하지 않고 새로운 기능을 추가합니다. 핵심은 &lt;strong&gt;&amp;ldquo;어떤 기능이 필요한지&amp;quot;와 &amp;ldquo;어떻게 구현할지&amp;quot;를 분리&lt;/strong&gt;하는 것입니다.&lt;/p&gt;</description></item><item><title>RBAC</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/rbac/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/rbac/</guid><description>&lt;h2 id="전체-비유-건물-출입-카드-시스템"&gt;전체 비유: 건물 출입 카드 시스템&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ea%b1%b4%eb%ac%bc-%ec%b6%9c%ec%9e%85-%ec%b9%b4%eb%93%9c-%ec%8b%9c%ec%8a%a4%ed%85%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;RBAC을 &lt;strong&gt;건물 출입 카드 시스템&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;건물 출입 비유&lt;/th&gt;
 &lt;th&gt;Kubernetes RBAC&lt;/th&gt;
 &lt;th&gt;역할&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;출입 권한 세트 (3층 서버실 접근 가능)&lt;/td&gt;
 &lt;td&gt;Role&lt;/td&gt;
 &lt;td&gt;특정 Namespace 내 허용 작업 정의&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;전 건물 마스터 권한&lt;/td&gt;
 &lt;td&gt;ClusterRole&lt;/td&gt;
 &lt;td&gt;클러스터 전체 허용 작업 정의&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;사원증에 권한 부여&lt;/td&gt;
 &lt;td&gt;RoleBinding&lt;/td&gt;
 &lt;td&gt;사용자에게 Role 할당&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;전 지점 출입 권한 부여&lt;/td&gt;
 &lt;td&gt;ClusterRoleBinding&lt;/td&gt;
 &lt;td&gt;사용자에게 ClusterRole 할당&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;사원증&lt;/td&gt;
 &lt;td&gt;ServiceAccount&lt;/td&gt;
 &lt;td&gt;Pod가 사용하는 인증 주체&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;꼭 필요한 구역만 출입&amp;rdquo; 원칙&lt;/td&gt;
 &lt;td&gt;최소 권한 원칙&lt;/td&gt;
 &lt;td&gt;필요한 권한만 부여&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 RBAC은 &amp;ldquo;누가 어디에서 무엇을 할 수 있는지&amp;quot;를 체계적으로 관리하는 것과 같습니다.&lt;/p&gt;</description></item><item><title>OpenTelemetry</title><link>https://advanced-beginner.github.io/ko/docs/observability/concepts/opentelemetry/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/concepts/opentelemetry/</guid><description>&lt;h2 id="전체-비유-국제-의료-기록-표준"&gt;전체 비유: 국제 의료 기록 표준&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ea%b5%ad%ec%a0%9c-%ec%9d%98%eb%a3%8c-%ea%b8%b0%eb%a1%9d-%ed%91%9c%ec%a4%80"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;OpenTelemetry를 **국제 의료 기록 표준(HL7/FHIR)**에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;의료 표준 비유&lt;/th&gt;
 &lt;th&gt;OpenTelemetry&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;벤더별 SDK&lt;/td&gt;
 &lt;td&gt;호환 안 되는 형식들&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;국제 의료 기록 표준&lt;/td&gt;
 &lt;td&gt;OpenTelemetry 표준&lt;/td&gt;
 &lt;td&gt;통일된 데이터 형식&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;표준 진료 기록 양식&lt;/td&gt;
 &lt;td&gt;Semantic Conventions&lt;/td&gt;
 &lt;td&gt;공통 속성 이름 규약&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;병원 내 기록 시스템&lt;/td&gt;
 &lt;td&gt;OTel SDK&lt;/td&gt;
 &lt;td&gt;데이터 수집&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;기록 전송 센터&lt;/td&gt;
 &lt;td&gt;OTel Collector&lt;/td&gt;
 &lt;td&gt;수집/변환/전송&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;다양한 EMR 시스템&lt;/td&gt;
 &lt;td&gt;다양한 백엔드&lt;/td&gt;
 &lt;td&gt;Jaeger, Prometheus 등&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;Auto-instrumentation&lt;/td&gt;
 &lt;td&gt;코드 변경 없이 계측&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 국제 표준이 있으면 어느 병원에서도 환자 기록을 읽을 수 있듯, OpenTelemetry는 어떤 백엔드로도 데이터를 보낼 수 있습니다.&lt;/p&gt;</description></item><item><title>공변성 / 반공변성</title><link>https://advanced-beginner.github.io/ko/docs/scala/concepts/variance/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/concepts/variance/</guid><description>&lt;h2 id="전체-비유-물류-창고-시스템"&gt;전체 비유: 물류 창고 시스템&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%eb%ac%bc%eb%a5%98-%ec%b0%bd%ea%b3%a0-%ec%8b%9c%ec%8a%a4%ed%85%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;변성을 &lt;strong&gt;물류 창고 시스템&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;물류 비유&lt;/th&gt;
 &lt;th&gt;Scala 개념&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;code&gt;+A&lt;/code&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;code&gt;-A&lt;/code&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;code&gt;A&lt;/code&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;code&gt;List[Dog] &amp;lt;: List[Animal]&lt;/code&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;code&gt;Handler[Animal] &amp;lt;: Handler[Dog]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;더 일반적인 것이 더 유용&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;물류에서 &lt;strong&gt;출고 전용 창고는 큰 카테고리로 물건을 보낼 수 있고&lt;/strong&gt;, &lt;strong&gt;입고 전용 창고는 작은 카테고리의 물건도 받을 수 있습니다&lt;/strong&gt;. 변성은 이런 물류 흐름의 타입 안전한 규칙입니다.&lt;/p&gt;</description></item><item><title>Job과 CronJob</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/jobs/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/jobs/</guid><description>&lt;h2 id="전체-비유-아르바이트와-정기-청소"&gt;전체 비유: 아르바이트와 정기 청소&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ec%95%84%eb%a5%b4%eb%b0%94%ec%9d%b4%ed%8a%b8%ec%99%80-%ec%a0%95%ea%b8%b0-%ec%b2%ad%ec%86%8c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Job과 CronJob을 &lt;strong&gt;아르바이트와 정기 청소&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;비유&lt;/th&gt;
 &lt;th&gt;Kubernetes&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;Job&lt;/td&gt;
 &lt;td&gt;한 번 실행하고 끝나는 작업&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;정기 청소 스케줄&lt;/td&gt;
 &lt;td&gt;CronJob&lt;/td&gt;
 &lt;td&gt;주기적으로 반복 실행되는 작업&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;아르바이트생 3명 고용&lt;/td&gt;
 &lt;td&gt;completions: 3&lt;/td&gt;
 &lt;td&gt;성공 완료해야 할 횟수&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;동시에 2명 투입&lt;/td&gt;
 &lt;td&gt;parallelism: 2&lt;/td&gt;
 &lt;td&gt;동시에 실행할 Pod 수&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;최대 재시도 횟수&lt;/td&gt;
 &lt;td&gt;backoffLimit&lt;/td&gt;
 &lt;td&gt;실패 시 재시도 상한&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;작업 마감 시한&lt;/td&gt;
 &lt;td&gt;activeDeadlineSeconds&lt;/td&gt;
 &lt;td&gt;전체 작업 제한 시간&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 Job은 &amp;ldquo;정해진 일을 완료하면 끝나는 작업&amp;quot;이고, CronJob은 &amp;ldquo;정해진 시간에 반복 실행되는 예약 작업&amp;quot;입니다.&lt;/p&gt;</description></item><item><title>고급 타입 시스템</title><link>https://advanced-beginner.github.io/ko/docs/scala/concepts/type-system-advanced/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/concepts/type-system-advanced/</guid><description>&lt;h2 id="전체-비유-건축-설계-시스템"&gt;전체 비유: 건축 설계 시스템&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ea%b1%b4%ec%b6%95-%ec%84%a4%ea%b3%84-%ec%8b%9c%ec%8a%a4%ed%85%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;고급 타입 시스템을 &lt;strong&gt;건축 설계 규칙&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;건축 설계 비유&lt;/th&gt;
 &lt;th&gt;Scala 개념&lt;/th&gt;
 &lt;th&gt;역할&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;거실 또는 침실&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;Union Type (&lt;code&gt;A | B&lt;/code&gt;)&lt;/td&gt;
 &lt;td&gt;여러 타입 중 하나&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;내진 설계 + 방음 설계&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;Intersection (&lt;code&gt;A &amp;amp; B&lt;/code&gt;)&lt;/td&gt;
 &lt;td&gt;여러 조건 동시 충족&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;비공개 내부 설계도&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;Opaque Type&lt;/td&gt;
 &lt;td&gt;외부에 구현 숨김&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;조건부 자재 선택&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;Match Type&lt;/td&gt;
 &lt;td&gt;타입 레벨 조건 분기&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;자재 변환 규칙&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;Type Lambda&lt;/td&gt;
 &lt;td&gt;타입 생성자 매핑&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;방 크기에 따른 자재&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;Dependent Type&lt;/td&gt;
 &lt;td&gt;값에 따른 타입 결정&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;건축에서 &lt;strong&gt;설계 규칙이 안전한 건물을 보장&lt;/strong&gt;하듯이, 고급 타입 시스템은 컴파일 타임에 더 정밀한 제약을 표현하여 &lt;strong&gt;런타임 오류를 사전에 방지&lt;/strong&gt;합니다.&lt;/p&gt;</description></item><item><title>대시보드 설계</title><link>https://advanced-beginner.github.io/ko/docs/observability/concepts/dashboard-design/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/observability/concepts/dashboard-design/</guid><description>&lt;h2 id="전체-비유-중환자실-모니터링-대시보드"&gt;전체 비유: 중환자실 모니터링 대시보드&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ec%a4%91%ed%99%98%ec%9e%90%ec%8b%a4-%eb%aa%a8%eb%8b%88%ed%84%b0%eb%a7%81-%eb%8c%80%ec%8b%9c%eb%b3%b4%eb%93%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;대시보드 설계를 &lt;strong&gt;중환자실(ICU) 모니터링 시스템&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;중환자실 모니터 비유&lt;/th&gt;
 &lt;th&gt;대시보드 설계&lt;/th&gt;
 &lt;th&gt;역할&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;병실 전체 현황판&lt;/td&gt;
 &lt;td&gt;Overview 대시보드&lt;/td&gt;
 &lt;td&gt;전체 상태 한눈에 파악&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;개별 환자 모니터&lt;/td&gt;
 &lt;td&gt;Service 대시보드&lt;/td&gt;
 &lt;td&gt;서비스별 상세 상태&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;상세 검사 결과지&lt;/td&gt;
 &lt;td&gt;Detail 대시보드&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;5초 내 이상 감지&lt;/td&gt;
 &lt;td&gt;5초 규칙&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;Threshold 설정&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&gt;이처럼 중환자실에서 환자 상태를 한눈에 파악하듯, 대시보드는 시스템 상태를 즉시 이해할 수 있게 합니다.&lt;/p&gt;</description></item><item><title>NetworkPolicy</title><link>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/network-policy/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kubernetes/concepts/network-policy/</guid><description>&lt;h2 id="전체-비유-아파트-단지-방화벽"&gt;전체 비유: 아파트 단지 방화벽&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%ec%95%84%ed%8c%8c%ed%8a%b8-%eb%8b%a8%ec%a7%80-%eb%b0%a9%ed%99%94%eb%b2%bd"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;NetworkPolicy를 &lt;strong&gt;아파트 단지의 출입 통제 시스템&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;아파트 단지 비유&lt;/th&gt;
 &lt;th&gt;Kubernetes NetworkPolicy&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;NetworkPolicy&lt;/td&gt;
 &lt;td&gt;Pod 간 트래픽 허용/차단 정의&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;101동 주민만 출입 허용&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;podSelector&lt;/td&gt;
 &lt;td&gt;정책 적용 대상 Pod 선택&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;배달원은 로비까지만&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;Ingress 규칙&lt;/td&gt;
 &lt;td&gt;들어오는 트래픽 제어&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;택배 발송은 경비실 경유&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;Egress 규칙&lt;/td&gt;
 &lt;td&gt;나가는 트래픽 제어&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;경비 시스템 (CCTV, 카드키)&lt;/td&gt;
 &lt;td&gt;CNI 플러그인&lt;/td&gt;
 &lt;td&gt;정책을 실제로 적용하는 네트워크 엔진&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;규칙 없으면 자유 출입&lt;/td&gt;
 &lt;td&gt;기본 Allow All&lt;/td&gt;
 &lt;td&gt;NetworkPolicy 미설정 시 모든 트래픽 허용&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이처럼 NetworkPolicy는 &amp;ldquo;어떤 Pod가 어떤 Pod와 통신할 수 있는지&amp;quot;를 제어하는 방화벽 규칙과 같습니다.&lt;/p&gt;</description></item><item><title>매크로와 메타프로그래밍</title><link>https://advanced-beginner.github.io/ko/docs/scala/concepts/macros-metaprogramming/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/concepts/macros-metaprogramming/</guid><description>&lt;h2 id="전체-비유-3d-프린터-공장"&gt;전체 비유: 3D 프린터 공장&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-3d-%ed%94%84%eb%a6%b0%ed%84%b0-%ea%b3%b5%ec%9e%a5"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;메타프로그래밍을 &lt;strong&gt;3D 프린터가 있는 공장&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;3D 프린터 비유&lt;/th&gt;
 &lt;th&gt;Scala 개념&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;code&gt;inline&lt;/code&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;code&gt;inline if/match&lt;/code&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;code&gt;error&lt;/code&gt;, &lt;code&gt;constValue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;컴파일 타임 검증&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;3D 프린터 (부품 생성)&lt;/td&gt;
 &lt;td&gt;매크로 (&lt;code&gt;${ }&lt;/code&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;code&gt;'{ }&lt;/code&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;code&gt;Expr[T]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;타입 안전한 코드 조각&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;3D 프린터가 &lt;strong&gt;설계도(인용)를 받아 실제 부품(코드)을 출력&lt;/strong&gt;하듯이, 매크로는 컴파일 타임에 코드를 분석하고 새로운 코드를 생성합니다. 핵심은 &lt;strong&gt;런타임 전에 모든 준비를 마치는 것&lt;/strong&gt;입니다.&lt;/p&gt;</description></item><item><title>동시성</title><link>https://advanced-beginner.github.io/ko/docs/scala/concepts/concurrency/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/concepts/concurrency/</guid><description>&lt;h2 id="전체-비유-레스토랑-주방"&gt;전체 비유: 레스토랑 주방&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%eb%a0%88%ec%8a%a4%ed%86%a0%eb%9e%91-%ec%a3%bc%eb%b0%a9"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Scala 동시성을 &lt;strong&gt;레스토랑 주방&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;레스토랑 비유&lt;/th&gt;
 &lt;th&gt;Scala 개념&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;Future&lt;/td&gt;
 &lt;td&gt;비동기 계산의 결과를 나타내는 약속&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;주방장들&lt;/td&gt;
 &lt;td&gt;ExecutionContext&lt;/td&gt;
 &lt;td&gt;작업을 실행하는 스레드 풀&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;요리 단계 연결&lt;/td&gt;
 &lt;td&gt;flatMap/map&lt;/td&gt;
 &lt;td&gt;순차적 비동기 작업 연결&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;여러 요리 동시 조리&lt;/td&gt;
 &lt;td&gt;병렬 Future&lt;/td&gt;
 &lt;td&gt;독립적 작업의 동시 실행&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;요리 완료 알림벨&lt;/td&gt;
 &lt;td&gt;Promise&lt;/td&gt;
 &lt;td&gt;외부에서 결과를 설정&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;첫 번째 완성 요리&lt;/td&gt;
 &lt;td&gt;firstCompletedOf&lt;/td&gt;
 &lt;td&gt;가장 먼저 완료되는 작업&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;모든 요리 완성 대기&lt;/td&gt;
 &lt;td&gt;sequence&lt;/td&gt;
 &lt;td&gt;모든 Future 완료 대기&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;레스토랑에서 여러 주방장이 동시에 요리하듯이, Future를 사용하면 여러 작업을 동시에 처리할 수 있습니다. 중요한 것은 &lt;strong&gt;작업 간의 의존성을 파악&lt;/strong&gt;하여 순차/병렬 실행을 올바르게 선택하는 것입니다.&lt;/p&gt;</description></item><item><title>함수형 프로그래밍 패턴</title><link>https://advanced-beginner.github.io/ko/docs/scala/concepts/functional-patterns/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/scala/concepts/functional-patterns/</guid><description>&lt;h2 id="전체-비유-레고-블록-조립"&gt;전체 비유: 레고 블록 조립&lt;a class="anchor" href="#%ec%a0%84%ec%b2%b4-%eb%b9%84%ec%9c%a0-%eb%a0%88%ea%b3%a0-%eb%b8%94%eb%a1%9d-%ec%a1%b0%eb%a6%bd"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;함수형 프로그래밍 패턴을 &lt;strong&gt;레고 블록 조립&lt;/strong&gt;에 비유하면 이해하기 쉽습니다:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;레고 비유&lt;/th&gt;
 &lt;th&gt;Scala 개념&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;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;Functor (map)&lt;/td&gt;
 &lt;td&gt;내용물만 변환, 구조 유지&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;블록 연결기&lt;/td&gt;
 &lt;td&gt;Monad (flatMap)&lt;/td&gt;
 &lt;td&gt;순차적 조립 연결&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;비어 있음&amp;rdquo; 표시 블록&lt;/td&gt;
 &lt;td&gt;Option&lt;/td&gt;
 &lt;td&gt;값의 유무 표현&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;오류 라벨&amp;rdquo; 블록&lt;/td&gt;
 &lt;td&gt;Either&lt;/td&gt;
 &lt;td&gt;성공/실패 정보 포함&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;블록 조립 설명서&lt;/td&gt;
 &lt;td&gt;for comprehension&lt;/td&gt;
 &lt;td&gt;조립 순서 기술&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;레고를 조립할 때 &lt;strong&gt;표준 연결부가 있어야 어떤 블록이든 연결&lt;/strong&gt;할 수 있듯이, 함수형 프로그래밍에서는 Functor, Monad 같은 추상화가 다양한 타입을 일관되게 조합할 수 있게 해줍니다.&lt;/p&gt;</description></item></channel></rss>