{"componentChunkName":"component---src-templates-blog-post-js","path":"/springboot/마이크로서비스-아키텍처-완전정복-실전-구축-가이드/","result":{"data":{"site":{"siteMetadata":{"title":"Bottlehs Tech Blog","description":"웹·앱·AI 개발자 전병훈(bottlehs)의 기술 블로그. AI·LLM, JavaScript·Vue, Spring Boot, 알고리즘, 블록체인 실무 가이드를 다룹니다","siteUrl":"https://www.bottlehs.dev","author":{"name":"Jeon Byung Hun","summary":"개발을 즐기는 bottlehs - Engineer, MS, AI, FE, BE, OS, IOT, Blockchain, 설계, 테스트"},"social":{"github":"bottlehs","codepen":"bottlehs"}}},"markdownRemark":{"id":"e208e3dc-7ac4-58c8-9120-56a4e833b7ef","excerpt":"마이크로서비스 아키텍처 완전정복 - 실전 구축 가이드 마이크로서비스 아키텍처는 대규모 애플리케이션을 독립적으로 배포 가능한 작은 서비스들로 분해하는 아키텍처 패턴이다. 각 서비스는 자체 데이터베이스를 가지며, API…","html":"<h1 id=\"마이크로서비스-아키텍처-완전정복---실전-구축-가이드\" style=\"position:relative;\"><a href=\"#%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5---%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C\" aria-label=\"마이크로서비스 아키텍처 완전정복   실전 구축 가이드 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>마이크로서비스 아키텍처 완전정복 - 실전 구축 가이드</h1>\n<p>마이크로서비스 아키텍처는 대규모 애플리케이션을 독립적으로 배포 가능한 작은 서비스들로 분해하는 아키텍처 패턴이다. 각 서비스는 자체 데이터베이스를 가지며, API를 통해 통신한다. 이 글은 마이크로서비스 아키텍처를 설계하고 구축하는 실전 가이드를 제공한다.</p>\n<h2 id=\"1-마이크로서비스-아키텍처-개요\" style=\"position:relative;\"><a href=\"#1-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EA%B0%9C%EC%9A%94\" aria-label=\"1 마이크로서비스 아키텍처 개요 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. 마이크로서비스 아키텍처 개요</h2>\n<h3 id=\"1-1-마이크로서비스란\" style=\"position:relative;\"><a href=\"#1-1-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4%EB%9E%80\" aria-label=\"1 1 마이크로서비스란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1-1. 마이크로서비스란?</h3>\n<p>마이크로서비스는 다음과 같은 특징을 가진다:</p>\n<ul>\n<li><strong>독립적 배포</strong>: 각 서비스를 독립적으로 배포하고 스케일링 가능</li>\n<li><strong>기술 다양성</strong>: 서비스마다 다른 기술 스택 사용 가능</li>\n<li><strong>장애 격리</strong>: 한 서비스의 장애가 전체 시스템에 영향을 주지 않음</li>\n<li><strong>팀 독립성</strong>: 각 팀이 서비스를 독립적으로 개발 및 운영</li>\n</ul>\n<h3 id=\"1-2-모놀리식-vs-마이크로서비스\" style=\"position:relative;\"><a href=\"#1-2-%EB%AA%A8%EB%86%80%EB%A6%AC%EC%8B%9D-vs-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4\" aria-label=\"1 2 모놀리식 vs 마이크로서비스 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1-2. 모놀리식 vs 마이크로서비스</h3>\n<table>\n<thead>\n<tr>\n<th>구분</th>\n<th>모놀리식</th>\n<th>마이크로서비스</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>배포</strong></td>\n<td>전체 애플리케이션 배포</td>\n<td>서비스별 독립 배포</td>\n</tr>\n<tr>\n<td><strong>스케일링</strong></td>\n<td>전체 스케일링</td>\n<td>서비스별 스케일링</td>\n</tr>\n<tr>\n<td><strong>기술 스택</strong></td>\n<td>단일 기술 스택</td>\n<td>다양한 기술 스택</td>\n</tr>\n<tr>\n<td><strong>복잡도</strong></td>\n<td>낮음</td>\n<td>높음</td>\n</tr>\n<tr>\n<td><strong>장애 격리</strong></td>\n<td>어려움</td>\n<td>쉬움</td>\n</tr>\n<tr>\n<td><strong>개발 속도</strong></td>\n<td>초기 빠름</td>\n<td>장기적으로 빠름</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"1-3-마이크로서비스-도입-시기\" style=\"position:relative;\"><a href=\"#1-3-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EB%8F%84%EC%9E%85-%EC%8B%9C%EA%B8%B0\" aria-label=\"1 3 마이크로서비스 도입 시기 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1-3. 마이크로서비스 도입 시기</h3>\n<p>마이크로서비스를 도입해야 하는 경우:</p>\n<ul>\n<li>✅ 팀이 여러 개이고 독립적으로 개발하고 싶을 때</li>\n<li>✅ 서비스별로 다른 스케일링 요구사항이 있을 때</li>\n<li>✅ 기술 다양성이 필요할 때</li>\n<li>✅ 장애 격리가 중요할 때</li>\n</ul>\n<p>도입을 피해야 하는 경우:</p>\n<ul>\n<li>❌ 작은 팀이나 프로젝트</li>\n<li>❌ 명확한 도메인 경계가 없을 때</li>\n<li>❌ 운영 인프라가 부족할 때</li>\n</ul>\n<h2 id=\"2-마이크로서비스-설계-원칙\" style=\"position:relative;\"><a href=\"#2-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%84%A4%EA%B3%84-%EC%9B%90%EC%B9%99\" aria-label=\"2 마이크로서비스 설계 원칙 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. 마이크로서비스 설계 원칙</h2>\n<h3 id=\"2-1-도메인-주도-설계-ddd\" style=\"position:relative;\"><a href=\"#2-1-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%A3%BC%EB%8F%84-%EC%84%A4%EA%B3%84-ddd\" aria-label=\"2 1 도메인 주도 설계 ddd permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2-1. 도메인 주도 설계 (DDD)</h3>\n<p>서비스를 비즈니스 도메인에 따라 분리한다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">전자상거래 시스템 예시:\n\n- User Service (사용자 관리)\n- Product Service (상품 관리)\n- Order Service (주문 처리)\n- Payment Service (결제 처리)\n- Inventory Service (재고 관리)\n- Notification Service (알림)</code></pre></div>\n<h3 id=\"2-2-데이터베이스-per-서비스\" style=\"position:relative;\"><a href=\"#2-2-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-per-%EC%84%9C%EB%B9%84%EC%8A%A4\" aria-label=\"2 2 데이터베이스 per 서비스 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2-2. 데이터베이스 per 서비스</h3>\n<p>각 서비스는 자체 데이터베이스를 가진다.</p>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token comment\"># 서비스별 데이터베이스</span>\n<span class=\"token key atrule\">User Service</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">Database</span><span class=\"token punctuation\">:</span> PostgreSQL (사용자 정보)\n\n<span class=\"token key atrule\">Product Service</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">Database</span><span class=\"token punctuation\">:</span> MongoDB (상품 카탈로그)\n\n<span class=\"token key atrule\">Order Service</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">Database</span><span class=\"token punctuation\">:</span> PostgreSQL (주문 정보)\n\n<span class=\"token key atrule\">Analytics Service</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">Database</span><span class=\"token punctuation\">:</span> ClickHouse (분석 데이터)</code></pre></div>\n<h3 id=\"2-3-api-first-설계\" style=\"position:relative;\"><a href=\"#2-3-api-first-%EC%84%A4%EA%B3%84\" aria-label=\"2 3 api first 설계 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2-3. API First 설계</h3>\n<p>서비스를 설계할 때 먼저 API를 정의한다.</p>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token comment\"># OpenAPI 스펙 예시</span>\n<span class=\"token key atrule\">openapi</span><span class=\"token punctuation\">:</span> 3.0.0\n<span class=\"token key atrule\">info</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">title</span><span class=\"token punctuation\">:</span> User Service API\n  <span class=\"token key atrule\">version</span><span class=\"token punctuation\">:</span> 1.0.0\n\n<span class=\"token key atrule\">paths</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">/users</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">get</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">summary</span><span class=\"token punctuation\">:</span> Get all users\n      <span class=\"token key atrule\">responses</span><span class=\"token punctuation\">:</span>\n        <span class=\"token key atrule\">'200'</span><span class=\"token punctuation\">:</span>\n          <span class=\"token key atrule\">description</span><span class=\"token punctuation\">:</span> List of users\n    <span class=\"token key atrule\">post</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">summary</span><span class=\"token punctuation\">:</span> Create user\n      <span class=\"token key atrule\">requestBody</span><span class=\"token punctuation\">:</span>\n        <span class=\"token key atrule\">required</span><span class=\"token punctuation\">:</span> <span class=\"token boolean important\">true</span>\n        <span class=\"token key atrule\">content</span><span class=\"token punctuation\">:</span>\n          <span class=\"token key atrule\">application/json</span><span class=\"token punctuation\">:</span>\n            <span class=\"token key atrule\">schema</span><span class=\"token punctuation\">:</span>\n              <span class=\"token key atrule\">$ref</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'#/components/schemas/User'</span>\n      <span class=\"token key atrule\">responses</span><span class=\"token punctuation\">:</span>\n        <span class=\"token key atrule\">'201'</span><span class=\"token punctuation\">:</span>\n          <span class=\"token key atrule\">description</span><span class=\"token punctuation\">:</span> User created</code></pre></div>\n<h2 id=\"3-서비스-간-통신\" style=\"position:relative;\"><a href=\"#3-%EC%84%9C%EB%B9%84%EC%8A%A4-%EA%B0%84-%ED%86%B5%EC%8B%A0\" aria-label=\"3 서비스 간 통신 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. 서비스 간 통신</h2>\n<h3 id=\"3-1-동기-통신-restgrpc\" style=\"position:relative;\"><a href=\"#3-1-%EB%8F%99%EA%B8%B0-%ED%86%B5%EC%8B%A0-restgrpc\" aria-label=\"3 1 동기 통신 restgrpc permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-1. 동기 통신 (REST/gRPC)</h3>\n<h4 id=\"rest-api\" style=\"position:relative;\"><a href=\"#rest-api\" aria-label=\"rest api permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>REST API</h4>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token comment\">// User Service</span>\n<span class=\"token annotation punctuation\">@RestController</span>\n<span class=\"token annotation punctuation\">@RequestMapping</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/api/users\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">UserController</span> <span class=\"token punctuation\">{</span>\n    \n    <span class=\"token annotation punctuation\">@GetMapping</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/{userId}\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">ResponseEntity</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">User</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">getUser</span><span class=\"token punctuation\">(</span><span class=\"token annotation punctuation\">@PathVariable</span> <span class=\"token class-name\">Long</span> userId<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">User</span> user <span class=\"token operator\">=</span> userService<span class=\"token punctuation\">.</span><span class=\"token function\">getUser</span><span class=\"token punctuation\">(</span>userId<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">return</span> <span class=\"token class-name\">ResponseEntity</span><span class=\"token punctuation\">.</span><span class=\"token function\">ok</span><span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Order Service에서 User Service 호출</span>\n<span class=\"token annotation punctuation\">@Service</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">OrderService</span> <span class=\"token punctuation\">{</span>\n    \n    <span class=\"token annotation punctuation\">@Autowired</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">RestTemplate</span> restTemplate<span class=\"token punctuation\">;</span>\n    \n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">final</span> <span class=\"token class-name\">String</span> <span class=\"token constant\">USER_SERVICE_URL</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"http://user-service/api/users\"</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">User</span> <span class=\"token function\">getUser</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Long</span> userId<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> restTemplate<span class=\"token punctuation\">.</span><span class=\"token function\">getForObject</span><span class=\"token punctuation\">(</span>\n            <span class=\"token constant\">USER_SERVICE_URL</span> <span class=\"token operator\">+</span> <span class=\"token string\">\"/\"</span> <span class=\"token operator\">+</span> userId<span class=\"token punctuation\">,</span>\n            <span class=\"token class-name\">User</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span>\n        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h4 id=\"grpc\" style=\"position:relative;\"><a href=\"#grpc\" aria-label=\"grpc permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>gRPC</h4>\n<div class=\"gatsby-highlight\" data-language=\"protobuf\"><pre class=\"language-protobuf\"><code class=\"language-protobuf\"><span class=\"token comment\">// user.proto</span>\n<span class=\"token keyword\">syntax</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"proto3\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">package</span> user<span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">service</span> <span class=\"token class-name\">UserService</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">rpc</span> <span class=\"token function\">GetUser</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">GetUserRequest</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">returns</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">UserResponse</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">rpc</span> <span class=\"token function\">CreateUser</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">CreateUserRequest</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">returns</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">UserResponse</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">message</span> <span class=\"token class-name\">GetUserRequest</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token builtin\">int64</span> user_id <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">message</span> <span class=\"token class-name\">UserResponse</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token builtin\">int64</span> id <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n  <span class=\"token builtin\">string</span> name <span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span>\n  <span class=\"token builtin\">string</span> email <span class=\"token operator\">=</span> <span class=\"token number\">3</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token comment\">// gRPC 클라이언트</span>\n<span class=\"token annotation punctuation\">@Service</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">OrderService</span> <span class=\"token punctuation\">{</span>\n    \n    <span class=\"token annotation punctuation\">@Autowired</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">UserServiceGrpc<span class=\"token punctuation\">.</span>UserServiceBlockingStub</span> userServiceStub<span class=\"token punctuation\">;</span>\n    \n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">User</span> <span class=\"token function\">getUser</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Long</span> userId<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">GetUserRequest</span> request <span class=\"token operator\">=</span> <span class=\"token class-name\">GetUserRequest</span><span class=\"token punctuation\">.</span><span class=\"token function\">newBuilder</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">setUserId</span><span class=\"token punctuation\">(</span>userId<span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        \n        <span class=\"token class-name\">UserResponse</span> response <span class=\"token operator\">=</span> userServiceStub<span class=\"token punctuation\">.</span><span class=\"token function\">getUser</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">return</span> <span class=\"token function\">convertToUser</span><span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"3-2-비동기-통신-메시징\" style=\"position:relative;\"><a href=\"#3-2-%EB%B9%84%EB%8F%99%EA%B8%B0-%ED%86%B5%EC%8B%A0-%EB%A9%94%EC%8B%9C%EC%A7%95\" aria-label=\"3 2 비동기 통신 메시징 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-2. 비동기 통신 (메시징)</h3>\n<h4 id=\"kafka를-활용한-이벤트-기반-아키텍처\" style=\"position:relative;\"><a href=\"#kafka%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%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\" aria-label=\"kafka를 활용한 이벤트 기반 아키텍처 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Kafka를 활용한 이벤트 기반 아키텍처</h4>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token comment\">// Order Service - 이벤트 발행</span>\n<span class=\"token annotation punctuation\">@Service</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">OrderService</span> <span class=\"token punctuation\">{</span>\n    \n    <span class=\"token annotation punctuation\">@Autowired</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">KafkaTemplate</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">Object</span><span class=\"token punctuation\">></span></span> kafkaTemplate<span class=\"token punctuation\">;</span>\n    \n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">createOrder</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Order</span> order<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// 주문 생성</span>\n        orderRepository<span class=\"token punctuation\">.</span><span class=\"token function\">save</span><span class=\"token punctuation\">(</span>order<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        \n        <span class=\"token comment\">// 이벤트 발행</span>\n        <span class=\"token class-name\">OrderCreatedEvent</span> event <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">OrderCreatedEvent</span><span class=\"token punctuation\">(</span>\n            order<span class=\"token punctuation\">.</span><span class=\"token function\">getId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n            order<span class=\"token punctuation\">.</span><span class=\"token function\">getUserId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n            order<span class=\"token punctuation\">.</span><span class=\"token function\">getTotalAmount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        \n        kafkaTemplate<span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"order-created\"</span><span class=\"token punctuation\">,</span> event<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Payment Service - 이벤트 구독</span>\n<span class=\"token annotation punctuation\">@Component</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">PaymentEventListener</span> <span class=\"token punctuation\">{</span>\n    \n    <span class=\"token annotation punctuation\">@KafkaListener</span><span class=\"token punctuation\">(</span>topics <span class=\"token operator\">=</span> <span class=\"token string\">\"order-created\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">handleOrderCreated</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">OrderCreatedEvent</span> event<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// 결제 처리</span>\n        <span class=\"token function\">processPayment</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span><span class=\"token function\">getOrderId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> event<span class=\"token punctuation\">.</span><span class=\"token function\">getAmount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Inventory Service - 이벤트 구독</span>\n<span class=\"token annotation punctuation\">@Component</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">InventoryEventListener</span> <span class=\"token punctuation\">{</span>\n    \n    <span class=\"token annotation punctuation\">@KafkaListener</span><span class=\"token punctuation\">(</span>topics <span class=\"token operator\">=</span> <span class=\"token string\">\"order-created\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">handleOrderCreated</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">OrderCreatedEvent</span> event<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// 재고 차감</span>\n        <span class=\"token function\">decreaseInventory</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span><span class=\"token function\">getOrderId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"4-api-gateway\" style=\"position:relative;\"><a href=\"#4-api-gateway\" aria-label=\"4 api gateway permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4. API Gateway</h2>\n<h3 id=\"4-1-api-gateway의-역할\" style=\"position:relative;\"><a href=\"#4-1-api-gateway%EC%9D%98-%EC%97%AD%ED%95%A0\" aria-label=\"4 1 api gateway의 역할 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4-1. API Gateway의 역할</h3>\n<ul>\n<li><strong>라우팅</strong>: 요청을 적절한 서비스로 라우팅</li>\n<li><strong>인증/인가</strong>: 중앙화된 인증 처리</li>\n<li><strong>로드 밸런싱</strong>: 트래픽 분산</li>\n<li><strong>레이트 리미팅</strong>: API 호출 제한</li>\n<li><strong>로깅 및 모니터링</strong>: 요청 추적</li>\n</ul>\n<h3 id=\"4-2-kong-api-gateway-설정\" style=\"position:relative;\"><a href=\"#4-2-kong-api-gateway-%EC%84%A4%EC%A0%95\" aria-label=\"4 2 kong api gateway 설정 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4-2. Kong API Gateway 설정</h3>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token comment\"># kong.yml</span>\n<span class=\"token key atrule\">_format_version</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"3.0\"</span>\n\n<span class=\"token key atrule\">services</span><span class=\"token punctuation\">:</span>\n  <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> user<span class=\"token punctuation\">-</span>service\n    <span class=\"token key atrule\">url</span><span class=\"token punctuation\">:</span> http<span class=\"token punctuation\">:</span>//user<span class=\"token punctuation\">-</span>service<span class=\"token punctuation\">:</span><span class=\"token number\">8080</span>\n    <span class=\"token key atrule\">routes</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> user<span class=\"token punctuation\">-</span>route\n        <span class=\"token key atrule\">paths</span><span class=\"token punctuation\">:</span>\n          <span class=\"token punctuation\">-</span> /api/users\n        <span class=\"token key atrule\">methods</span><span class=\"token punctuation\">:</span>\n          <span class=\"token punctuation\">-</span> GET\n          <span class=\"token punctuation\">-</span> POST\n          <span class=\"token punctuation\">-</span> PUT\n          <span class=\"token punctuation\">-</span> DELETE\n\n  <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> product<span class=\"token punctuation\">-</span>service\n    <span class=\"token key atrule\">url</span><span class=\"token punctuation\">:</span> http<span class=\"token punctuation\">:</span>//product<span class=\"token punctuation\">-</span>service<span class=\"token punctuation\">:</span><span class=\"token number\">8080</span>\n    <span class=\"token key atrule\">routes</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> product<span class=\"token punctuation\">-</span>route\n        <span class=\"token key atrule\">paths</span><span class=\"token punctuation\">:</span>\n          <span class=\"token punctuation\">-</span> /api/products\n\n<span class=\"token key atrule\">plugins</span><span class=\"token punctuation\">:</span>\n  <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> rate<span class=\"token punctuation\">-</span>limiting\n    <span class=\"token key atrule\">config</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">minute</span><span class=\"token punctuation\">:</span> <span class=\"token number\">100</span>\n      <span class=\"token key atrule\">hour</span><span class=\"token punctuation\">:</span> <span class=\"token number\">1000</span>\n  \n  <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> cors\n    <span class=\"token key atrule\">config</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">origins</span><span class=\"token punctuation\">:</span>\n        <span class=\"token punctuation\">-</span> <span class=\"token string\">\"*\"</span>\n      <span class=\"token key atrule\">methods</span><span class=\"token punctuation\">:</span>\n        <span class=\"token punctuation\">-</span> GET\n        <span class=\"token punctuation\">-</span> POST\n        <span class=\"token punctuation\">-</span> PUT\n        <span class=\"token punctuation\">-</span> DELETE</code></pre></div>\n<h3 id=\"4-3-spring-cloud-gateway\" style=\"position:relative;\"><a href=\"#4-3-spring-cloud-gateway\" aria-label=\"4 3 spring cloud gateway permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4-3. Spring Cloud Gateway</h3>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Configuration</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">GatewayConfig</span> <span class=\"token punctuation\">{</span>\n    \n    <span class=\"token annotation punctuation\">@Bean</span>\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">RouteLocator</span> <span class=\"token function\">customRouteLocator</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">RouteLocatorBuilder</span> builder<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> builder<span class=\"token punctuation\">.</span><span class=\"token function\">routes</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">route</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"user-service\"</span><span class=\"token punctuation\">,</span> r <span class=\"token operator\">-></span> r\n                <span class=\"token punctuation\">.</span><span class=\"token function\">path</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/api/users/**\"</span><span class=\"token punctuation\">)</span>\n                <span class=\"token punctuation\">.</span><span class=\"token function\">uri</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"lb://user-service\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">route</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"product-service\"</span><span class=\"token punctuation\">,</span> r <span class=\"token operator\">-></span> r\n                <span class=\"token punctuation\">.</span><span class=\"token function\">path</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/api/products/**\"</span><span class=\"token punctuation\">)</span>\n                <span class=\"token punctuation\">.</span><span class=\"token function\">uri</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"lb://product-service\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">route</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"order-service\"</span><span class=\"token punctuation\">,</span> r <span class=\"token operator\">-></span> r\n                <span class=\"token punctuation\">.</span><span class=\"token function\">path</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/api/orders/**\"</span><span class=\"token punctuation\">)</span>\n                <span class=\"token punctuation\">.</span><span class=\"token function\">filters</span><span class=\"token punctuation\">(</span>f <span class=\"token operator\">-></span> f\n                    <span class=\"token punctuation\">.</span><span class=\"token function\">addRequestHeader</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"X-Request-Id\"</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">UUID</span><span class=\"token punctuation\">.</span><span class=\"token function\">randomUUID</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n                    <span class=\"token punctuation\">.</span><span class=\"token function\">circuitBreaker</span><span class=\"token punctuation\">(</span>c <span class=\"token operator\">-></span> c\n                        <span class=\"token punctuation\">.</span><span class=\"token function\">setName</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"orderCircuitBreaker\"</span><span class=\"token punctuation\">)</span>\n                        <span class=\"token punctuation\">.</span><span class=\"token function\">setFallbackUri</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"forward:/fallback\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n                <span class=\"token punctuation\">.</span><span class=\"token function\">uri</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"lb://order-service\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    \n    <span class=\"token annotation punctuation\">@Bean</span>\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">GlobalFilter</span> <span class=\"token function\">customGlobalFilter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>exchange<span class=\"token punctuation\">,</span> chain<span class=\"token punctuation\">)</span> <span class=\"token operator\">-></span> <span class=\"token punctuation\">{</span>\n            <span class=\"token class-name\">ServerHttpRequest</span> request <span class=\"token operator\">=</span> exchange<span class=\"token punctuation\">.</span><span class=\"token function\">getRequest</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token comment\">// 로깅, 인증 등 전역 처리</span>\n            <span class=\"token keyword\">return</span> chain<span class=\"token punctuation\">.</span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span>exchange<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"5-service-mesh-istio\" style=\"position:relative;\"><a href=\"#5-service-mesh-istio\" aria-label=\"5 service mesh istio permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5. Service Mesh (Istio)</h2>\n<h3 id=\"5-1-istio-개요\" style=\"position:relative;\"><a href=\"#5-1-istio-%EA%B0%9C%EC%9A%94\" aria-label=\"5 1 istio 개요 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5-1. Istio 개요</h3>\n<p>Service Mesh는 서비스 간 통신을 관리하는 인프라 레이어다.</p>\n<p><strong>주요 기능:</strong></p>\n<ul>\n<li>트래픽 관리 (로드 밸런싱, 라우팅)</li>\n<li>보안 (mTLS, 인증)</li>\n<li>관찰 가능성 (메트릭, 로깅, 트레이싱)</li>\n<li>정책 적용</li>\n</ul>\n<h3 id=\"5-2-virtualservice와-destinationrule\" style=\"position:relative;\"><a href=\"#5-2-virtualservice%EC%99%80-destinationrule\" aria-label=\"5 2 virtualservice와 destinationrule permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5-2. VirtualService와 DestinationRule</h3>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token comment\"># VirtualService - 트래픽 라우팅</span>\n<span class=\"token key atrule\">apiVersion</span><span class=\"token punctuation\">:</span> networking.istio.io/v1beta1\n<span class=\"token key atrule\">kind</span><span class=\"token punctuation\">:</span> VirtualService\n<span class=\"token key atrule\">metadata</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> user<span class=\"token punctuation\">-</span>service\n<span class=\"token key atrule\">spec</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">hosts</span><span class=\"token punctuation\">:</span>\n    <span class=\"token punctuation\">-</span> user<span class=\"token punctuation\">-</span>service\n  <span class=\"token key atrule\">http</span><span class=\"token punctuation\">:</span>\n    <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">match</span><span class=\"token punctuation\">:</span>\n        <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">headers</span><span class=\"token punctuation\">:</span>\n            <span class=\"token key atrule\">version</span><span class=\"token punctuation\">:</span>\n              <span class=\"token key atrule\">exact</span><span class=\"token punctuation\">:</span> v2\n      <span class=\"token key atrule\">route</span><span class=\"token punctuation\">:</span>\n        <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">destination</span><span class=\"token punctuation\">:</span>\n            <span class=\"token key atrule\">host</span><span class=\"token punctuation\">:</span> user<span class=\"token punctuation\">-</span>service\n            <span class=\"token key atrule\">subset</span><span class=\"token punctuation\">:</span> v2\n          <span class=\"token key atrule\">weight</span><span class=\"token punctuation\">:</span> <span class=\"token number\">100</span>\n    <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">route</span><span class=\"token punctuation\">:</span>\n        <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">destination</span><span class=\"token punctuation\">:</span>\n            <span class=\"token key atrule\">host</span><span class=\"token punctuation\">:</span> user<span class=\"token punctuation\">-</span>service\n            <span class=\"token key atrule\">subset</span><span class=\"token punctuation\">:</span> v1\n          <span class=\"token key atrule\">weight</span><span class=\"token punctuation\">:</span> <span class=\"token number\">90</span>\n        <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">destination</span><span class=\"token punctuation\">:</span>\n            <span class=\"token key atrule\">host</span><span class=\"token punctuation\">:</span> user<span class=\"token punctuation\">-</span>service\n            <span class=\"token key atrule\">subset</span><span class=\"token punctuation\">:</span> v2\n          <span class=\"token key atrule\">weight</span><span class=\"token punctuation\">:</span> <span class=\"token number\">10</span>\n\n<span class=\"token punctuation\">---</span>\n<span class=\"token comment\"># DestinationRule - 서비스 버전 정의</span>\n<span class=\"token key atrule\">apiVersion</span><span class=\"token punctuation\">:</span> networking.istio.io/v1beta1\n<span class=\"token key atrule\">kind</span><span class=\"token punctuation\">:</span> DestinationRule\n<span class=\"token key atrule\">metadata</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> user<span class=\"token punctuation\">-</span>service\n<span class=\"token key atrule\">spec</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">host</span><span class=\"token punctuation\">:</span> user<span class=\"token punctuation\">-</span>service\n  <span class=\"token key atrule\">subsets</span><span class=\"token punctuation\">:</span>\n    <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> v1\n      <span class=\"token key atrule\">labels</span><span class=\"token punctuation\">:</span>\n        <span class=\"token key atrule\">version</span><span class=\"token punctuation\">:</span> v1\n    <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> v2\n      <span class=\"token key atrule\">labels</span><span class=\"token punctuation\">:</span>\n        <span class=\"token key atrule\">version</span><span class=\"token punctuation\">:</span> v2\n  <span class=\"token key atrule\">trafficPolicy</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">loadBalancer</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">simple</span><span class=\"token punctuation\">:</span> ROUND_ROBIN\n    <span class=\"token key atrule\">connectionPool</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">tcp</span><span class=\"token punctuation\">:</span>\n        <span class=\"token key atrule\">maxConnections</span><span class=\"token punctuation\">:</span> <span class=\"token number\">100</span>\n      <span class=\"token key atrule\">http</span><span class=\"token punctuation\">:</span>\n        <span class=\"token key atrule\">http1MaxPendingRequests</span><span class=\"token punctuation\">:</span> <span class=\"token number\">10</span>\n        <span class=\"token key atrule\">http2MaxRequests</span><span class=\"token punctuation\">:</span> <span class=\"token number\">10</span>\n        <span class=\"token key atrule\">maxRequestsPerConnection</span><span class=\"token punctuation\">:</span> <span class=\"token number\">2</span></code></pre></div>\n<h3 id=\"5-3-circuit-breaker\" style=\"position:relative;\"><a href=\"#5-3-circuit-breaker\" aria-label=\"5 3 circuit breaker permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5-3. Circuit Breaker</h3>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token key atrule\">apiVersion</span><span class=\"token punctuation\">:</span> networking.istio.io/v1beta1\n<span class=\"token key atrule\">kind</span><span class=\"token punctuation\">:</span> DestinationRule\n<span class=\"token key atrule\">metadata</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> order<span class=\"token punctuation\">-</span>service\n<span class=\"token key atrule\">spec</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">host</span><span class=\"token punctuation\">:</span> order<span class=\"token punctuation\">-</span>service\n  <span class=\"token key atrule\">trafficPolicy</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">connectionPool</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">tcp</span><span class=\"token punctuation\">:</span>\n        <span class=\"token key atrule\">maxConnections</span><span class=\"token punctuation\">:</span> <span class=\"token number\">100</span>\n      <span class=\"token key atrule\">http</span><span class=\"token punctuation\">:</span>\n        <span class=\"token key atrule\">http1MaxPendingRequests</span><span class=\"token punctuation\">:</span> <span class=\"token number\">10</span>\n        <span class=\"token key atrule\">maxRequestsPerConnection</span><span class=\"token punctuation\">:</span> <span class=\"token number\">2</span>\n    <span class=\"token key atrule\">outlierDetection</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">consecutiveErrors</span><span class=\"token punctuation\">:</span> <span class=\"token number\">3</span>\n      <span class=\"token key atrule\">interval</span><span class=\"token punctuation\">:</span> 30s\n      <span class=\"token key atrule\">baseEjectionTime</span><span class=\"token punctuation\">:</span> 30s\n      <span class=\"token key atrule\">maxEjectionPercent</span><span class=\"token punctuation\">:</span> <span class=\"token number\">50</span></code></pre></div>\n<h2 id=\"6-서비스-디스커버리\" style=\"position:relative;\"><a href=\"#6-%EC%84%9C%EB%B9%84%EC%8A%A4-%EB%94%94%EC%8A%A4%EC%BB%A4%EB%B2%84%EB%A6%AC\" aria-label=\"6 서비스 디스커버리 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6. 서비스 디스커버리</h2>\n<h3 id=\"6-1-eureka-netflix-oss\" style=\"position:relative;\"><a href=\"#6-1-eureka-netflix-oss\" aria-label=\"6 1 eureka netflix oss permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6-1. Eureka (Netflix OSS)</h3>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token comment\">// Eureka Server</span>\n<span class=\"token annotation punctuation\">@SpringBootApplication</span>\n<span class=\"token annotation punctuation\">@EnableEurekaServer</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">EurekaServerApplication</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">void</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> args<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">SpringApplication</span><span class=\"token punctuation\">.</span><span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">EurekaServerApplication</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// application.yml</span>\nserver<span class=\"token operator\">:</span>\n  port<span class=\"token operator\">:</span> <span class=\"token number\">8761</span>\n\neureka<span class=\"token operator\">:</span>\n  instance<span class=\"token operator\">:</span>\n    hostname<span class=\"token operator\">:</span> localhost\n  client<span class=\"token operator\">:</span>\n    registerWithEureka<span class=\"token operator\">:</span> <span class=\"token boolean\">false</span>\n    fetchRegistry<span class=\"token operator\">:</span> <span class=\"token boolean\">false</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token comment\">// Eureka Client (서비스)</span>\n<span class=\"token annotation punctuation\">@SpringBootApplication</span>\n<span class=\"token annotation punctuation\">@EnableEurekaClient</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">UserServiceApplication</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">void</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> args<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">SpringApplication</span><span class=\"token punctuation\">.</span><span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">UserServiceApplication</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// application.yml</span>\nspring<span class=\"token operator\">:</span>\n  application<span class=\"token operator\">:</span>\n    name<span class=\"token operator\">:</span> user<span class=\"token operator\">-</span>service\n\neureka<span class=\"token operator\">:</span>\n  client<span class=\"token operator\">:</span>\n    serviceUrl<span class=\"token operator\">:</span>\n      defaultZone<span class=\"token operator\">:</span> http<span class=\"token operator\">:</span><span class=\"token operator\">/</span><span class=\"token operator\">/</span>localhost<span class=\"token operator\">:</span><span class=\"token number\">8761</span><span class=\"token operator\">/</span>eureka<span class=\"token operator\">/</span>\n  instance<span class=\"token operator\">:</span>\n    preferIpAddress<span class=\"token operator\">:</span> <span class=\"token boolean\">true</span></code></pre></div>\n<h3 id=\"6-2-consul\" style=\"position:relative;\"><a href=\"#6-2-consul\" aria-label=\"6 2 consul permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6-2. Consul</h3>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token comment\"># consul-config.yml</span>\n<span class=\"token key atrule\">services</span><span class=\"token punctuation\">:</span>\n  <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> user<span class=\"token punctuation\">-</span>service\n    <span class=\"token key atrule\">id</span><span class=\"token punctuation\">:</span> user<span class=\"token punctuation\">-</span>service<span class=\"token punctuation\">-</span><span class=\"token number\">1</span>\n    <span class=\"token key atrule\">address</span><span class=\"token punctuation\">:</span> user<span class=\"token punctuation\">-</span>service\n    <span class=\"token key atrule\">port</span><span class=\"token punctuation\">:</span> <span class=\"token number\">8080</span>\n    <span class=\"token key atrule\">check</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">http</span><span class=\"token punctuation\">:</span> http<span class=\"token punctuation\">:</span>//user<span class=\"token punctuation\">-</span>service<span class=\"token punctuation\">:</span>8080/health\n      <span class=\"token key atrule\">interval</span><span class=\"token punctuation\">:</span> 10s\n      <span class=\"token key atrule\">timeout</span><span class=\"token punctuation\">:</span> 1s</code></pre></div>\n<h2 id=\"7-분산-트레이싱\" style=\"position:relative;\"><a href=\"#7-%EB%B6%84%EC%82%B0-%ED%8A%B8%EB%A0%88%EC%9D%B4%EC%8B%B1\" aria-label=\"7 분산 트레이싱 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>7. 분산 트레이싱</h2>\n<h3 id=\"7-1-jaeger를-활용한-분산-트레이싱\" style=\"position:relative;\"><a href=\"#7-1-jaeger%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EB%B6%84%EC%82%B0-%ED%8A%B8%EB%A0%88%EC%9D%B4%EC%8B%B1\" aria-label=\"7 1 jaeger를 활용한 분산 트레이싱 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>7-1. Jaeger를 활용한 분산 트레이싱</h3>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token comment\">// Spring Cloud Sleuth + Zipkin/Jaeger</span>\n<span class=\"token annotation punctuation\">@Configuration</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">TracingConfig</span> <span class=\"token punctuation\">{</span>\n    \n    <span class=\"token annotation punctuation\">@Bean</span>\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">Sampler</span> <span class=\"token function\">sampler</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token class-name\">Sampler</span><span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token number\">0.1f</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 10% 샘플링</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// application.yml</span>\nspring<span class=\"token operator\">:</span>\n  sleuth<span class=\"token operator\">:</span>\n    sampler<span class=\"token operator\">:</span>\n      probability<span class=\"token operator\">:</span> <span class=\"token number\">0.1</span>\n    zipkin<span class=\"token operator\">:</span>\n      base<span class=\"token operator\">-</span>url<span class=\"token operator\">:</span> http<span class=\"token operator\">:</span><span class=\"token operator\">/</span><span class=\"token operator\">/</span>jaeger<span class=\"token operator\">:</span><span class=\"token number\">9411</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token comment\">// 수동 트레이싱</span>\n<span class=\"token annotation punctuation\">@Service</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">OrderService</span> <span class=\"token punctuation\">{</span>\n    \n    <span class=\"token annotation punctuation\">@Autowired</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">Tracer</span> tracer<span class=\"token punctuation\">;</span>\n    \n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">createOrder</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Order</span> order<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">Span</span> span <span class=\"token operator\">=</span> tracer<span class=\"token punctuation\">.</span><span class=\"token function\">nextSpan</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">name</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"create-order\"</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">tag</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"order.id\"</span><span class=\"token punctuation\">,</span> order<span class=\"token punctuation\">.</span><span class=\"token function\">getId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">start</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        \n        <span class=\"token keyword\">try</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">Tracer<span class=\"token punctuation\">.</span>SpanInScope</span> ws <span class=\"token operator\">=</span> tracer<span class=\"token punctuation\">.</span><span class=\"token function\">withSpanInScope</span><span class=\"token punctuation\">(</span>span<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token comment\">// 주문 생성 로직</span>\n            <span class=\"token function\">processOrder</span><span class=\"token punctuation\">(</span>order<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">finally</span> <span class=\"token punctuation\">{</span>\n            span<span class=\"token punctuation\">.</span><span class=\"token function\">end</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"7-2-opentelemetry\" style=\"position:relative;\"><a href=\"#7-2-opentelemetry\" aria-label=\"7 2 opentelemetry permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>7-2. OpenTelemetry</h3>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Configuration</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">OpenTelemetryConfig</span> <span class=\"token punctuation\">{</span>\n    \n    <span class=\"token annotation punctuation\">@Bean</span>\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">OpenTelemetry</span> <span class=\"token function\">openTelemetry</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token class-name\">OpenTelemetrySdk</span><span class=\"token punctuation\">.</span><span class=\"token function\">builder</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">setTracerProvider</span><span class=\"token punctuation\">(</span>\n                <span class=\"token class-name\">SdkTracerProvider</span><span class=\"token punctuation\">.</span><span class=\"token function\">builder</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n                    <span class=\"token punctuation\">.</span><span class=\"token function\">addSpanProcessor</span><span class=\"token punctuation\">(</span>\n                        <span class=\"token class-name\">BatchSpanProcessor</span><span class=\"token punctuation\">.</span><span class=\"token function\">builder</span><span class=\"token punctuation\">(</span>\n                            <span class=\"token class-name\">OtlpGrpcSpanExporter</span><span class=\"token punctuation\">.</span><span class=\"token function\">builder</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n                                <span class=\"token punctuation\">.</span><span class=\"token function\">setEndpoint</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"http://jaeger:4317\"</span><span class=\"token punctuation\">)</span>\n                                <span class=\"token punctuation\">.</span><span class=\"token function\">build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n                        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n                    <span class=\"token punctuation\">)</span>\n                    <span class=\"token punctuation\">.</span><span class=\"token function\">setResource</span><span class=\"token punctuation\">(</span>\n                        <span class=\"token class-name\">Resource</span><span class=\"token punctuation\">.</span><span class=\"token function\">getDefault</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n                            <span class=\"token punctuation\">.</span><span class=\"token function\">merge</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Resource</span><span class=\"token punctuation\">.</span><span class=\"token function\">builder</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n                                <span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">ResourceAttributes</span><span class=\"token punctuation\">.</span><span class=\"token constant\">SERVICE_NAME</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"order-service\"</span><span class=\"token punctuation\">)</span>\n                                <span class=\"token punctuation\">.</span><span class=\"token function\">build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n                    <span class=\"token punctuation\">)</span>\n                    <span class=\"token punctuation\">.</span><span class=\"token function\">build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"8-데이터-일관성\" style=\"position:relative;\"><a href=\"#8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%9D%BC%EA%B4%80%EC%84%B1\" aria-label=\"8 데이터 일관성 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>8. 데이터 일관성</h2>\n<h3 id=\"8-1-saga-패턴\" style=\"position:relative;\"><a href=\"#8-1-saga-%ED%8C%A8%ED%84%B4\" aria-label=\"8 1 saga 패턴 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>8-1. Saga 패턴</h3>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token comment\">// Saga 오케스트레이터</span>\n<span class=\"token annotation punctuation\">@Component</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">OrderSagaOrchestrator</span> <span class=\"token punctuation\">{</span>\n    \n    <span class=\"token annotation punctuation\">@Autowired</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">OrderService</span> orderService<span class=\"token punctuation\">;</span>\n    \n    <span class=\"token annotation punctuation\">@Autowired</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">PaymentService</span> paymentService<span class=\"token punctuation\">;</span>\n    \n    <span class=\"token annotation punctuation\">@Autowired</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">InventoryService</span> inventoryService<span class=\"token punctuation\">;</span>\n    \n    <span class=\"token annotation punctuation\">@SagaOrchestrationStart</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">createOrderSaga</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">CreateOrderCommand</span> command<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">Order</span> order <span class=\"token operator\">=</span> orderService<span class=\"token punctuation\">.</span><span class=\"token function\">createOrder</span><span class=\"token punctuation\">(</span>command<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        \n        <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token comment\">// 1. 재고 확인 및 차감</span>\n            inventoryService<span class=\"token punctuation\">.</span><span class=\"token function\">reserveInventory</span><span class=\"token punctuation\">(</span>order<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            \n            <span class=\"token comment\">// 2. 결제 처리</span>\n            paymentService<span class=\"token punctuation\">.</span><span class=\"token function\">processPayment</span><span class=\"token punctuation\">(</span>order<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            \n            <span class=\"token comment\">// 3. 주문 확정</span>\n            orderService<span class=\"token punctuation\">.</span><span class=\"token function\">confirmOrder</span><span class=\"token punctuation\">(</span>order<span class=\"token punctuation\">.</span><span class=\"token function\">getId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            \n        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">Exception</span> e<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token comment\">// 보상 트랜잭션</span>\n            <span class=\"token function\">compensate</span><span class=\"token punctuation\">(</span>order<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n    \n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">void</span> <span class=\"token function\">compensate</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Order</span> order<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>order<span class=\"token punctuation\">.</span><span class=\"token function\">getStatus</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token class-name\">OrderStatus</span><span class=\"token punctuation\">.</span><span class=\"token constant\">PAYMENT_PROCESSED</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                paymentService<span class=\"token punctuation\">.</span><span class=\"token function\">refund</span><span class=\"token punctuation\">(</span>order<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span>\n            <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>order<span class=\"token punctuation\">.</span><span class=\"token function\">getStatus</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token class-name\">OrderStatus</span><span class=\"token punctuation\">.</span><span class=\"token constant\">INVENTORY_RESERVED</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                inventoryService<span class=\"token punctuation\">.</span><span class=\"token function\">releaseInventory</span><span class=\"token punctuation\">(</span>order<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span>\n            orderService<span class=\"token punctuation\">.</span><span class=\"token function\">cancelOrder</span><span class=\"token punctuation\">(</span>order<span class=\"token punctuation\">.</span><span class=\"token function\">getId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">Exception</span> e<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token comment\">// 보상 실패 로깅 및 알림</span>\n            log<span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Compensation failed for order: {}\"</span><span class=\"token punctuation\">,</span> order<span class=\"token punctuation\">.</span><span class=\"token function\">getId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> e<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"8-2-이벤트-소싱과-cqrs\" style=\"position:relative;\"><a href=\"#8-2-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%86%8C%EC%8B%B1%EA%B3%BC-cqrs\" aria-label=\"8 2 이벤트 소싱과 cqrs permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>8-2. 이벤트 소싱과 CQRS</h3>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token comment\">// 이벤트 저장소</span>\n<span class=\"token annotation punctuation\">@Entity</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">EventStore</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token annotation punctuation\">@Id</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> id<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> aggregateId<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> eventType<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> eventData<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">LocalDateTime</span> timestamp<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 이벤트 발행</span>\n<span class=\"token annotation punctuation\">@Service</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">OrderService</span> <span class=\"token punctuation\">{</span>\n    \n    <span class=\"token annotation punctuation\">@Autowired</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">EventStoreRepository</span> eventStoreRepository<span class=\"token punctuation\">;</span>\n    \n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">createOrder</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Order</span> order<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// 이벤트 저장</span>\n        <span class=\"token class-name\">OrderCreatedEvent</span> event <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">OrderCreatedEvent</span><span class=\"token punctuation\">(</span>\n            order<span class=\"token punctuation\">.</span><span class=\"token function\">getId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n            order<span class=\"token punctuation\">.</span><span class=\"token function\">getUserId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n            order<span class=\"token punctuation\">.</span><span class=\"token function\">getItems</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        \n        eventStoreRepository<span class=\"token punctuation\">.</span><span class=\"token function\">save</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">EventStore</span><span class=\"token punctuation\">.</span><span class=\"token function\">builder</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">id</span><span class=\"token punctuation\">(</span><span class=\"token constant\">UUID</span><span class=\"token punctuation\">.</span><span class=\"token function\">randomUUID</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">aggregateId</span><span class=\"token punctuation\">(</span>order<span class=\"token punctuation\">.</span><span class=\"token function\">getId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">eventType</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"OrderCreated\"</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">eventData</span><span class=\"token punctuation\">(</span><span class=\"token function\">serialize</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">timestamp</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">LocalDateTime</span><span class=\"token punctuation\">.</span><span class=\"token function\">now</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        \n        <span class=\"token comment\">// 이벤트 발행</span>\n        eventPublisher<span class=\"token punctuation\">.</span><span class=\"token function\">publish</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// CQRS - 읽기 모델 업데이트</span>\n<span class=\"token annotation punctuation\">@Component</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">OrderReadModelUpdater</span> <span class=\"token punctuation\">{</span>\n    \n    <span class=\"token annotation punctuation\">@EventListener</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">handle</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">OrderCreatedEvent</span> event<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// 읽기 모델 업데이트</span>\n        orderReadRepository<span class=\"token punctuation\">.</span><span class=\"token function\">save</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">OrderReadModel</span><span class=\"token punctuation\">.</span><span class=\"token function\">builder</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">id</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span><span class=\"token function\">getOrderId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">userId</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span><span class=\"token function\">getUserId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">status</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"CREATED\"</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"9-모니터링과-관찰-가능성\" style=\"position:relative;\"><a href=\"#9-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81%EA%B3%BC-%EA%B4%80%EC%B0%B0-%EA%B0%80%EB%8A%A5%EC%84%B1\" aria-label=\"9 모니터링과 관찰 가능성 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>9. 모니터링과 관찰 가능성</h2>\n<h3 id=\"9-1-prometheus와-grafana\" style=\"position:relative;\"><a href=\"#9-1-prometheus%EC%99%80-grafana\" aria-label=\"9 1 prometheus와 grafana permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>9-1. Prometheus와 Grafana</h3>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token comment\">// 메트릭 수집</span>\n<span class=\"token annotation punctuation\">@Service</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">OrderService</span> <span class=\"token punctuation\">{</span>\n    \n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">final</span> <span class=\"token class-name\">Counter</span> orderCounter<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">final</span> <span class=\"token class-name\">Timer</span> orderProcessingTime<span class=\"token punctuation\">;</span>\n    \n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">OrderService</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">MeterRegistry</span> meterRegistry<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>orderCounter <span class=\"token operator\">=</span> <span class=\"token class-name\">Counter</span><span class=\"token punctuation\">.</span><span class=\"token function\">builder</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"orders.total\"</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">description</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Total number of orders\"</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">register</span><span class=\"token punctuation\">(</span>meterRegistry<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        \n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>orderProcessingTime <span class=\"token operator\">=</span> <span class=\"token class-name\">Timer</span><span class=\"token punctuation\">.</span><span class=\"token function\">builder</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"orders.processing.time\"</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">description</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Order processing time\"</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">register</span><span class=\"token punctuation\">(</span>meterRegistry<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    \n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">createOrder</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Order</span> order<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">Timer<span class=\"token punctuation\">.</span>Sample</span> sample <span class=\"token operator\">=</span> <span class=\"token class-name\">Timer</span><span class=\"token punctuation\">.</span><span class=\"token function\">start</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token comment\">// 주문 처리</span>\n            <span class=\"token function\">processOrder</span><span class=\"token punctuation\">(</span>order<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            orderCounter<span class=\"token punctuation\">.</span><span class=\"token function\">increment</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">finally</span> <span class=\"token punctuation\">{</span>\n            sample<span class=\"token punctuation\">.</span><span class=\"token function\">stop</span><span class=\"token punctuation\">(</span>orderProcessingTime<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"9-2-분산-로깅-elk-stack\" style=\"position:relative;\"><a href=\"#9-2-%EB%B6%84%EC%82%B0-%EB%A1%9C%EA%B9%85-elk-stack\" aria-label=\"9 2 분산 로깅 elk stack permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>9-2. 분산 로깅 (ELK Stack)</h3>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token comment\">// 로깅 설정</span>\n<span class=\"token annotation punctuation\">@Configuration</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">LoggingConfig</span> <span class=\"token punctuation\">{</span>\n    \n    <span class=\"token annotation punctuation\">@Bean</span>\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">CorrelationIdFilter</span> <span class=\"token function\">correlationIdFilter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">CorrelationIdFilter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token annotation punctuation\">@Component</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">CorrelationIdFilter</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">Filter</span> <span class=\"token punctuation\">{</span>\n    \n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">doFilter</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">ServletRequest</span> request<span class=\"token punctuation\">,</span> <span class=\"token class-name\">ServletResponse</span> response<span class=\"token punctuation\">,</span> \n                        <span class=\"token class-name\">FilterChain</span> chain<span class=\"token punctuation\">)</span> <span class=\"token keyword\">throws</span> <span class=\"token class-name\">IOException</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">ServletException</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">String</span> correlationId <span class=\"token operator\">=</span> <span class=\"token constant\">UUID</span><span class=\"token punctuation\">.</span><span class=\"token function\">randomUUID</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token constant\">MDC</span><span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"correlationId\"</span><span class=\"token punctuation\">,</span> correlationId<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        \n        <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n            chain<span class=\"token punctuation\">.</span><span class=\"token function\">doFilter</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">,</span> response<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">finally</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token constant\">MDC</span><span class=\"token punctuation\">.</span><span class=\"token function\">clear</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 로깅</span>\n<span class=\"token annotation punctuation\">@Slf4j</span>\n<span class=\"token annotation punctuation\">@Service</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">OrderService</span> <span class=\"token punctuation\">{</span>\n    \n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">createOrder</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Order</span> order<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        log<span class=\"token punctuation\">.</span><span class=\"token function\">info</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Creating order: {}\"</span><span class=\"token punctuation\">,</span> order<span class=\"token punctuation\">.</span><span class=\"token function\">getId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> \n                 <span class=\"token function\">kv</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"userId\"</span><span class=\"token punctuation\">,</span> order<span class=\"token punctuation\">.</span><span class=\"token function\">getUserId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n                 <span class=\"token function\">kv</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"amount\"</span><span class=\"token punctuation\">,</span> order<span class=\"token punctuation\">.</span><span class=\"token function\">getTotalAmount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        \n        <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token function\">processOrder</span><span class=\"token punctuation\">(</span>order<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            log<span class=\"token punctuation\">.</span><span class=\"token function\">info</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Order created successfully: {}\"</span><span class=\"token punctuation\">,</span> order<span class=\"token punctuation\">.</span><span class=\"token function\">getId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">Exception</span> e<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            log<span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Failed to create order: {}\"</span><span class=\"token punctuation\">,</span> order<span class=\"token punctuation\">.</span><span class=\"token function\">getId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> e<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token keyword\">throw</span> e<span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"10-보안\" style=\"position:relative;\"><a href=\"#10-%EB%B3%B4%EC%95%88\" aria-label=\"10 보안 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>10. 보안</h2>\n<h3 id=\"10-1-mtls-mutual-tls\" style=\"position:relative;\"><a href=\"#10-1-mtls-mutual-tls\" aria-label=\"10 1 mtls mutual tls permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>10-1. mTLS (Mutual TLS)</h3>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token comment\"># Istio PeerAuthentication</span>\n<span class=\"token key atrule\">apiVersion</span><span class=\"token punctuation\">:</span> security.istio.io/v1beta1\n<span class=\"token key atrule\">kind</span><span class=\"token punctuation\">:</span> PeerAuthentication\n<span class=\"token key atrule\">metadata</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> default\n<span class=\"token key atrule\">spec</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">mtls</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">mode</span><span class=\"token punctuation\">:</span> STRICT\n\n<span class=\"token punctuation\">---</span>\n<span class=\"token comment\"># Istio AuthorizationPolicy</span>\n<span class=\"token key atrule\">apiVersion</span><span class=\"token punctuation\">:</span> security.istio.io/v1beta1\n<span class=\"token key atrule\">kind</span><span class=\"token punctuation\">:</span> AuthorizationPolicy\n<span class=\"token key atrule\">metadata</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> user<span class=\"token punctuation\">-</span>service<span class=\"token punctuation\">-</span>policy\n<span class=\"token key atrule\">spec</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">selector</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">matchLabels</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">app</span><span class=\"token punctuation\">:</span> user<span class=\"token punctuation\">-</span>service\n  <span class=\"token key atrule\">rules</span><span class=\"token punctuation\">:</span>\n    <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">from</span><span class=\"token punctuation\">:</span>\n        <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">source</span><span class=\"token punctuation\">:</span>\n            <span class=\"token key atrule\">principals</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"cluster.local/ns/default/sa/order-service\"</span><span class=\"token punctuation\">]</span>\n      <span class=\"token key atrule\">to</span><span class=\"token punctuation\">:</span>\n        <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">operation</span><span class=\"token punctuation\">:</span>\n            <span class=\"token key atrule\">methods</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"GET\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"POST\"</span><span class=\"token punctuation\">]</span></code></pre></div>\n<h3 id=\"10-2-jwt-인증\" style=\"position:relative;\"><a href=\"#10-2-jwt-%EC%9D%B8%EC%A6%9D\" aria-label=\"10 2 jwt 인증 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>10-2. JWT 인증</h3>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token comment\">// API Gateway에서 JWT 검증</span>\n<span class=\"token annotation punctuation\">@Component</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">JwtAuthenticationFilter</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">GatewayFilter</span> <span class=\"token punctuation\">{</span>\n    \n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">Mono</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Void</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">filter</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">ServerWebExchange</span> exchange<span class=\"token punctuation\">,</span> <span class=\"token class-name\">GatewayFilterChain</span> chain<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">ServerHttpRequest</span> request <span class=\"token operator\">=</span> exchange<span class=\"token punctuation\">.</span><span class=\"token function\">getRequest</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token class-name\">String</span> token <span class=\"token operator\">=</span> <span class=\"token function\">extractToken</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        \n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>token <span class=\"token operator\">!=</span> <span class=\"token keyword\">null</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token function\">validateToken</span><span class=\"token punctuation\">(</span>token<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> chain<span class=\"token punctuation\">.</span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span>exchange<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        \n        <span class=\"token class-name\">ServerHttpResponse</span> response <span class=\"token operator\">=</span> exchange<span class=\"token punctuation\">.</span><span class=\"token function\">getResponse</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        response<span class=\"token punctuation\">.</span><span class=\"token function\">setStatusCode</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">HttpStatus</span><span class=\"token punctuation\">.</span><span class=\"token constant\">UNAUTHORIZED</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">return</span> response<span class=\"token punctuation\">.</span><span class=\"token function\">setComplete</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    \n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">boolean</span> <span class=\"token function\">validateToken</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> token<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token class-name\">Jwts</span><span class=\"token punctuation\">.</span><span class=\"token function\">parser</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n                <span class=\"token punctuation\">.</span><span class=\"token function\">setSigningKey</span><span class=\"token punctuation\">(</span>secretKey<span class=\"token punctuation\">)</span>\n                <span class=\"token punctuation\">.</span><span class=\"token function\">parseClaimsJws</span><span class=\"token punctuation\">(</span>token<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">JwtException</span> e<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"11-실전-배포-전략\" style=\"position:relative;\"><a href=\"#11-%EC%8B%A4%EC%A0%84-%EB%B0%B0%ED%8F%AC-%EC%A0%84%EB%9E%B5\" aria-label=\"11 실전 배포 전략 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>11. 실전 배포 전략</h2>\n<h3 id=\"11-1-blue-green-배포\" style=\"position:relative;\"><a href=\"#11-1-blue-green-%EB%B0%B0%ED%8F%AC\" aria-label=\"11 1 blue green 배포 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>11-1. Blue-Green 배포</h3>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token comment\"># Kubernetes Deployment</span>\n<span class=\"token key atrule\">apiVersion</span><span class=\"token punctuation\">:</span> apps/v1\n<span class=\"token key atrule\">kind</span><span class=\"token punctuation\">:</span> Deployment\n<span class=\"token key atrule\">metadata</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> user<span class=\"token punctuation\">-</span>service<span class=\"token punctuation\">-</span>blue\n<span class=\"token key atrule\">spec</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">replicas</span><span class=\"token punctuation\">:</span> <span class=\"token number\">3</span>\n  <span class=\"token key atrule\">selector</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">matchLabels</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">app</span><span class=\"token punctuation\">:</span> user<span class=\"token punctuation\">-</span>service\n      <span class=\"token key atrule\">version</span><span class=\"token punctuation\">:</span> blue\n  <span class=\"token key atrule\">template</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">metadata</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">labels</span><span class=\"token punctuation\">:</span>\n        <span class=\"token key atrule\">app</span><span class=\"token punctuation\">:</span> user<span class=\"token punctuation\">-</span>service\n        <span class=\"token key atrule\">version</span><span class=\"token punctuation\">:</span> blue\n    <span class=\"token key atrule\">spec</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">containers</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> user<span class=\"token punctuation\">-</span>service\n        <span class=\"token key atrule\">image</span><span class=\"token punctuation\">:</span> user<span class=\"token punctuation\">-</span>service<span class=\"token punctuation\">:</span>v1.0.0\n        <span class=\"token key atrule\">ports</span><span class=\"token punctuation\">:</span>\n        <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">containerPort</span><span class=\"token punctuation\">:</span> <span class=\"token number\">8080</span>\n\n<span class=\"token punctuation\">---</span>\n<span class=\"token key atrule\">apiVersion</span><span class=\"token punctuation\">:</span> v1\n<span class=\"token key atrule\">kind</span><span class=\"token punctuation\">:</span> Service\n<span class=\"token key atrule\">metadata</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> user<span class=\"token punctuation\">-</span>service\n<span class=\"token key atrule\">spec</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">selector</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">app</span><span class=\"token punctuation\">:</span> user<span class=\"token punctuation\">-</span>service\n    <span class=\"token key atrule\">version</span><span class=\"token punctuation\">:</span> blue  <span class=\"token comment\"># blue에서 green으로 전환</span>\n  <span class=\"token key atrule\">ports</span><span class=\"token punctuation\">:</span>\n  <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">port</span><span class=\"token punctuation\">:</span> <span class=\"token number\">80</span>\n    <span class=\"token key atrule\">targetPort</span><span class=\"token punctuation\">:</span> <span class=\"token number\">8080</span></code></pre></div>\n<h3 id=\"11-2-카나리-배포\" style=\"position:relative;\"><a href=\"#11-2-%EC%B9%B4%EB%82%98%EB%A6%AC-%EB%B0%B0%ED%8F%AC\" aria-label=\"11 2 카나리 배포 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>11-2. 카나리 배포</h3>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token comment\"># Istio VirtualService - 카나리 배포</span>\n<span class=\"token key atrule\">apiVersion</span><span class=\"token punctuation\">:</span> networking.istio.io/v1beta1\n<span class=\"token key atrule\">kind</span><span class=\"token punctuation\">:</span> VirtualService\n<span class=\"token key atrule\">metadata</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> user<span class=\"token punctuation\">-</span>service\n<span class=\"token key atrule\">spec</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">hosts</span><span class=\"token punctuation\">:</span>\n    <span class=\"token punctuation\">-</span> user<span class=\"token punctuation\">-</span>service\n  <span class=\"token key atrule\">http</span><span class=\"token punctuation\">:</span>\n    <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">match</span><span class=\"token punctuation\">:</span>\n        <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">headers</span><span class=\"token punctuation\">:</span>\n            <span class=\"token key atrule\">canary</span><span class=\"token punctuation\">:</span>\n              <span class=\"token key atrule\">exact</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"true\"</span>\n      <span class=\"token key atrule\">route</span><span class=\"token punctuation\">:</span>\n        <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">destination</span><span class=\"token punctuation\">:</span>\n            <span class=\"token key atrule\">host</span><span class=\"token punctuation\">:</span> user<span class=\"token punctuation\">-</span>service\n            <span class=\"token key atrule\">subset</span><span class=\"token punctuation\">:</span> v2\n          <span class=\"token key atrule\">weight</span><span class=\"token punctuation\">:</span> <span class=\"token number\">100</span>\n    <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">route</span><span class=\"token punctuation\">:</span>\n        <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">destination</span><span class=\"token punctuation\">:</span>\n            <span class=\"token key atrule\">host</span><span class=\"token punctuation\">:</span> user<span class=\"token punctuation\">-</span>service\n            <span class=\"token key atrule\">subset</span><span class=\"token punctuation\">:</span> v1\n          <span class=\"token key atrule\">weight</span><span class=\"token punctuation\">:</span> <span class=\"token number\">90</span>\n        <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">destination</span><span class=\"token punctuation\">:</span>\n            <span class=\"token key atrule\">host</span><span class=\"token punctuation\">:</span> user<span class=\"token punctuation\">-</span>service\n            <span class=\"token key atrule\">subset</span><span class=\"token punctuation\">:</span> v2\n          <span class=\"token key atrule\">weight</span><span class=\"token punctuation\">:</span> <span class=\"token number\">10</span></code></pre></div>\n<h2 id=\"12-결론\" style=\"position:relative;\"><a href=\"#12-%EA%B2%B0%EB%A1%A0\" aria-label=\"12 결론 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>12. 결론</h2>\n<p>마이크로서비스 아키텍처는 복잡하지만 강력한 아키텍처 패턴이다. 이 글에서 다룬 내용:</p>\n<ol>\n<li><strong>설계 원칙</strong>: DDD, 데이터베이스 per 서비스, API First</li>\n<li><strong>서비스 통신</strong>: REST, gRPC, 메시징 (Kafka)</li>\n<li><strong>API Gateway</strong>: Kong, Spring Cloud Gateway</li>\n<li><strong>Service Mesh</strong>: Istio를 활용한 트래픽 관리</li>\n<li><strong>서비스 디스커버리</strong>: Eureka, Consul</li>\n<li><strong>분산 트레이싱</strong>: Jaeger, OpenTelemetry</li>\n<li><strong>데이터 일관성</strong>: Saga 패턴, 이벤트 소싱</li>\n<li><strong>모니터링</strong>: Prometheus, Grafana, ELK</li>\n<li><strong>보안</strong>: mTLS, JWT</li>\n<li><strong>배포 전략</strong>: Blue-Green, 카나리</li>\n</ol>\n<p>이러한 기술들을 조합하면 확장 가능하고 견고한 마이크로서비스 시스템을 구축할 수 있다.</p>\n<h2 id=\"참고-자료\" style=\"position:relative;\"><a href=\"#%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C\" aria-label=\"참고 자료 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>참고 자료</h2>\n<ul>\n<li><a href=\"https://microservices.io/patterns/\">마이크로서비스 패턴 (책)</a></li>\n<li><a href=\"https://istio.io/\">Istio 공식 문서</a></li>\n<li><a href=\"https://docs.konghq.com/\">Kong 문서</a></li>\n<li><a href=\"https://spring.io/projects/spring-cloud\">Spring Cloud 문서</a></li>\n</ul>","tableOfContents":"<ul>\n<li>\n<p><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5---%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C\">마이크로서비스 아키텍처 완전정복 - 실전 구축 가이드</a></p>\n<ul>\n<li>\n<p><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#1-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EA%B0%9C%EC%9A%94\">1. 마이크로서비스 아키텍처 개요</a></p>\n<ul>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#1-1-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4%EB%9E%80\">1-1. 마이크로서비스란?</a></li>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#1-2-%EB%AA%A8%EB%86%80%EB%A6%AC%EC%8B%9D-vs-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4\">1-2. 모놀리식 vs 마이크로서비스</a></li>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#1-3-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EB%8F%84%EC%9E%85-%EC%8B%9C%EA%B8%B0\">1-3. 마이크로서비스 도입 시기</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#2-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%84%A4%EA%B3%84-%EC%9B%90%EC%B9%99\">2. 마이크로서비스 설계 원칙</a></p>\n<ul>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#2-1-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%A3%BC%EB%8F%84-%EC%84%A4%EA%B3%84-ddd\">2-1. 도메인 주도 설계 (DDD)</a></li>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#2-2-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-per-%EC%84%9C%EB%B9%84%EC%8A%A4\">2-2. 데이터베이스 per 서비스</a></li>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#2-3-api-first-%EC%84%A4%EA%B3%84\">2-3. API First 설계</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#3-%EC%84%9C%EB%B9%84%EC%8A%A4-%EA%B0%84-%ED%86%B5%EC%8B%A0\">3. 서비스 간 통신</a></p>\n<ul>\n<li>\n<p><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#3-1-%EB%8F%99%EA%B8%B0-%ED%86%B5%EC%8B%A0-restgrpc\">3-1. 동기 통신 (REST/gRPC)</a></p>\n<ul>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#rest-api\">REST API</a></li>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#grpc\">gRPC</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#3-2-%EB%B9%84%EB%8F%99%EA%B8%B0-%ED%86%B5%EC%8B%A0-%EB%A9%94%EC%8B%9C%EC%A7%95\">3-2. 비동기 통신 (메시징)</a></p>\n<ul>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#kafka%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%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\">Kafka를 활용한 이벤트 기반 아키텍처</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li>\n<p><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#4-api-gateway\">4. API Gateway</a></p>\n<ul>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#4-1-api-gateway%EC%9D%98-%EC%97%AD%ED%95%A0\">4-1. API Gateway의 역할</a></li>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#4-2-kong-api-gateway-%EC%84%A4%EC%A0%95\">4-2. Kong API Gateway 설정</a></li>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#4-3-spring-cloud-gateway\">4-3. Spring Cloud Gateway</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#5-service-mesh-istio\">5. Service Mesh (Istio)</a></p>\n<ul>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#5-1-istio-%EA%B0%9C%EC%9A%94\">5-1. Istio 개요</a></li>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#5-2-virtualservice%EC%99%80-destinationrule\">5-2. VirtualService와 DestinationRule</a></li>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#5-3-circuit-breaker\">5-3. Circuit Breaker</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#6-%EC%84%9C%EB%B9%84%EC%8A%A4-%EB%94%94%EC%8A%A4%EC%BB%A4%EB%B2%84%EB%A6%AC\">6. 서비스 디스커버리</a></p>\n<ul>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#6-1-eureka-netflix-oss\">6-1. Eureka (Netflix OSS)</a></li>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#6-2-consul\">6-2. Consul</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#7-%EB%B6%84%EC%82%B0-%ED%8A%B8%EB%A0%88%EC%9D%B4%EC%8B%B1\">7. 분산 트레이싱</a></p>\n<ul>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#7-1-jaeger%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EB%B6%84%EC%82%B0-%ED%8A%B8%EB%A0%88%EC%9D%B4%EC%8B%B1\">7-1. Jaeger를 활용한 분산 트레이싱</a></li>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#7-2-opentelemetry\">7-2. OpenTelemetry</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%9D%BC%EA%B4%80%EC%84%B1\">8. 데이터 일관성</a></p>\n<ul>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#8-1-saga-%ED%8C%A8%ED%84%B4\">8-1. Saga 패턴</a></li>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#8-2-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%86%8C%EC%8B%B1%EA%B3%BC-cqrs\">8-2. 이벤트 소싱과 CQRS</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#9-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81%EA%B3%BC-%EA%B4%80%EC%B0%B0-%EA%B0%80%EB%8A%A5%EC%84%B1\">9. 모니터링과 관찰 가능성</a></p>\n<ul>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#9-1-prometheus%EC%99%80-grafana\">9-1. Prometheus와 Grafana</a></li>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#9-2-%EB%B6%84%EC%82%B0-%EB%A1%9C%EA%B9%85-elk-stack\">9-2. 분산 로깅 (ELK Stack)</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#10-%EB%B3%B4%EC%95%88\">10. 보안</a></p>\n<ul>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#10-1-mtls-mutual-tls\">10-1. mTLS (Mutual TLS)</a></li>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#10-2-jwt-%EC%9D%B8%EC%A6%9D\">10-2. JWT 인증</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#11-%EC%8B%A4%EC%A0%84-%EB%B0%B0%ED%8F%AC-%EC%A0%84%EB%9E%B5\">11. 실전 배포 전략</a></p>\n<ul>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#11-1-blue-green-%EB%B0%B0%ED%8F%AC\">11-1. Blue-Green 배포</a></li>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#11-2-%EC%B9%B4%EB%82%98%EB%A6%AC-%EB%B0%B0%ED%8F%AC\">11-2. 카나리 배포</a></li>\n</ul>\n</li>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#12-%EA%B2%B0%EB%A1%A0\">12. 결론</a></li>\n<li><a href=\"/springboot/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95-%EA%B0%80%EC%9D%B4%EB%93%9C/#%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C\">참고 자료</a></li>\n</ul>\n</li>\n</ul>","wordCount":{"words":408},"fields":{"slug":"/springboot/마이크로서비스-아키텍처-완전정복-실전-구축-가이드/","image":null,"faq":[]},"frontmatter":{"title":"마이크로서비스 아키텍처 완전정복 - 실전 구축 가이드","date":"2025년 11월 15일","dateISO":"2025-11-15T00:00:00.000Z","updatedISO":null,"category":"springboot","description":"마이크로서비스 아키텍처의 설계 원칙부터 실전 구현까지. Service Mesh(Istio), API Gateway(Kong), 분산 트레이싱(Jaeger), 서비스 디스커버리, 이벤트 기반 아키텍처, 데이터 일관성, 모니터링까지 엔터프라이즈급 마이크로서비스 시스템 구축의 모든 것을 다룹니다.","tags":["마이크로서비스","Microservices","Service Mesh","API Gateway","분산 시스템","Istio","Kong","Jaeger","Kubernetes","이벤트 기반 아키텍처","Spring Cloud"]}}},"pageContext":{"slug":"/springboot/마이크로서비스-아키텍처-완전정복-실전-구축-가이드/","previous":{"fields":{"slug":"/ai/Responsible-AI-Operations-Part-2-위험-모니터링과-자동화-파이프라인/"},"frontmatter":{"title":"Responsible AI Operations Part 2 위험 모니터링과 자동화 파이프라인","tags":["Responsible AI","위험 모니터링","Observability","AI 레드팀","Alert Automation","Error Budget"]}},"next":{"fields":{"slug":"/python/FastAPI-완전정복-고성능-비동기-웹-API-개발-가이드/"},"frontmatter":{"title":"FastAPI 완전정복 - 고성능 비동기 웹 API 개발 실전 가이드","tags":["FastAPI","Python","비동기 프로그래밍","웹 API","REST API","asyncio","Pydantic","WebSocket","데이터베이스","백엔드 개발"]}}}},"staticQueryHashes":["213619243","3262363727"]}